pax_global_header00006660000000000000000000000064141346304420014513gustar00rootroot0000000000000052 comment=5d25103eb1b95db8d06e62259ad8bcce32a50be0 starpu-1.3.9+dfsg/000077500000000000000000000000001413463044200137625ustar00rootroot00000000000000starpu-1.3.9+dfsg/AUTHORS000066400000000000000000000052541413463044200150400ustar00rootroot00000000000000Archipoff Simon, Université de Bordeaux, Augonnet Cédric, Université de Bordeaux, Aumage Olivier, Inria, Beauchamp Guillaume, Inria, Bramas Berenger, Inria, Buttari Alfredo, Enseeiht, Cassagne Adrien, Inria, Clet-Ortega Jérôme, Inria, Cojean Terry, Université de Bordeaux, Collin Nicolas, Inria, Danjean Vincent, University Grenoble Alpes, Denis Alexandre, Inria, Eyraud-Dubois Lionel, Inria, Furmento Nathalie, CNRS, Guilbaud Adrien, Inria, Henry Sylvain, Université de Bordeaux, Hugo Andra, Université de Bordeaux/Inria, Juhoor Mehdi, Université de Bordeaux, Juven Alexis, Inria, Keryell-Even Maël, Inria, Khorsi Yanis, Inria, Lambert Thibaut, Inria, Leria Erwan, Université de Bordeaux, Lizé Benoît, Airbus, Makni Mariem, Inria, Nakov Stojce, Inria, Namyst Raymond, Université de Bordeaux, Nesi Lucas Leandro, Federal University of Rio Grande do Sul (UFRGS), Pablo Joris, Inria, Pasqualinotto Damien, Université de Bordeaux, Pinto Vinicius Garcia, Pitoiset Samuel, Inria, Quôc-Dinh Nguyen, IT Sud-Paris, Roelandt Cyril, Inria, Sakka Chiheb, Inria, Salingue Corentin, Inria, Schnorr Lucas Mello, Federal University of Rio Grande do Sul (UFRGS), Sergent Marc, CEA/Inria, Simonet Anthony, Université de Bordeaux, Stanisic Luka, Inria, Bérangère Subervie, Inria, Tessier François, Université de Bordeaux, Thibault Samuel, Université de Bordeaux, Brice Videau, University Grenoble Alpes, Villeveygoux Leo, Université de Bordeaux, Wacrenier Pierre-André, Université de Bordeaux, starpu-1.3.9+dfsg/COPYING.LGPL000066400000000000000000000636371413463044200155710ustar00rootroot00000000000000 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.3.9+dfsg/ChangeLog000066400000000000000000001730371413463044200155470ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9 ==================================================================== Small changes: * Add missing interface macros for BCSR data interface StarPU 1.3.8 ==================================================================== Small features: * A codelet can now define a callback function pointer which will be automatically called when the task does not define itself a callback function, in that case, it can still be called from the task callback function. * New STARPU_WORKERS_COREID, STARPU_MAIN_THREAD_COREID and STARPU_MPI_THREAD_COREID environment variables to bind threads to cores instead of hyperthreads. * New STARPU_TASK_PROGRESS environment variable to show task progression. * Add STARPU_SIMGRID environment variable guard against native builds. * Add starpu_cuda_get_nvmldev function. * New configure option --with-check-cflags to define flags for C, CXX and Fortran compilers * Add starpu_sched_tree_deinitialize function. * Add STARPU_SCHED_SORTED_ABOVE and STARPU_SCHED_SORTED_BELOW environment variables. * Add STARPU_SCHED_SIMPLE_PRE_DECISION. * Add starpu_bcsr_filter_canonical_block_get_nchildren. * Add unregister_data_handle handle ops. StarPU 1.3.7 ==================================================================== Small changes: * Simgrid: bug fix for setting network/weight-S to 0.0 StarPU 1.3.6 (git revision fb9fbed81410d9f0ebbff5bdad1352df4705efe8) ==================================================================== Small features: * New STARPU_BACKOFF_MIN and STARPU_BACKOFF_MAX environment variables to the exponential backoff limits of the number of cycles to pause while drivers are spinning. * Add STARPU_DISPLAY_BINDINGS environment variable and starpu_display_bindings() function to display all bindings on the machine by calling hwloc-ps * New function starpu_get_pu_os_index() to convert logical index of a PU to its OS index. * New function starpu_get_hwloc_topology() to get the hwloc topology used by StarPU. StarPU 1.3.5 (git revision 5f7458799f548026fab357b18541bb462dde2b53) ==================================================================== Small features: * New environment variable STARPU_FXT_SUFFIX to set the filename in which to save the fxt trace * New option -d for starpu_fxt_tool to specify in which directory to generate files Small changes: * Move MPI cache functions into the public API * Add STARPU_MPI_NOBIND environment variable. StarPU 1.3.4 (git revision c37a5d024cd997596da41f765557c58099baf896) ==================================================================== Small features: * New environment variables STARPU_BUS_STATS_FILE and STARPU_WORKER_STATS_FILE to specify files in which to display statistics about data transfers and workers. * Add starpu_bcsr_filter_vertical_block filtering function. * Add starpu_interface_copy2d, 3d, and 4d to easily request data copies from data interfaces. * Move optimized cuda 2d copy from interfaces to new starpu_cuda_copy2d_async_sync and starpu_cuda_copy3d_async_sync, and use them from starpu_interface_copy2d and 3d. * New function starpu_task_watchdog_set_hook to specify a function to be called when the watchdog is raised * Add STARPU_LIMIT_CPU_NUMA_MEM environment variable. * Add STARPU_WORKERS_GETBIND environment variable. * Add STARPU_SCHED_SIMPLE_DECIDE_ALWAYS modular scheduler flag. * And STARPU_LIMIT_BANDWIDTH environment variable. * Add field starpu_conf::precedence_over_environment_variables to ignore environment variables when parameters are set directly in starpu_conf * Add starpu_data_get_coordinates_array * MPI: new functions starpu_mpi_interface_datatype_register() and starpu_mpi_interface_datatype_unregister() which take a enum starpu_data_interface_id instead of a starpu_data_handle_t * New script starpu_env to set up StarPU environment variables Small changes: * New configure option --disable-build-doc-pdf StarPU 1.3.3 (git revision 11afc5b007fe1ab1c729b55b47a5a98ef7f3cfad) ==================================================================== New features: * New semantic for starpu_task_insert() and alike parameters STARPU_CALLBACK_ARG, STARPU_PROLOGUE_CALLBACK_ARG, and STARPU_PROLOGUE_CALLBACK_POP_ARG which set respectively starpu_task::callback_arg_free, starpu_task::prologue_callback_arg_free and starpu_task::prologue_callback_pop_arg_free to 1 when used. New parameters STARPU_CALLBACK_ARG_NFREE, STARPU_CALLBACK_WITH_ARG_NFREE, STARPU_PROLOGUE_CALLBACK_ARG_NFREE, and STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE which set the corresponding fields of starpu_task to 0. * starpufft: Support 3D. * New modular-eager-prio scheduler. * Add 'ready' heuristic to modular schedulers. * New modular-heteroprio scheduler. * Add STARPU_TASK_SCHED_DATA * Add support for staging schedulers. * New modular-heteroprio-heft scheduler. * New dmdap "data-aware performance model (priority)" scheduler Changes: * Modification in the Native Fortran interface of the functions fstarpu_mpi_task_insert, fstarpu_mpi_task_build and fstarpu_mpi_task_post_build to only take 1 parameter being the MPI communicator, the codelet and the various parameters for the task. Small features: * New starpu_task_insert() and alike parameter STARPU_TASK_WORKERIDS allowing to set the fields starpu_task::workerids_len and starpu_task::workerids * New starpu_task_insert() and alike parameters STARPU_SEQUENTIAL_CONSISTENCY, STARPU_TASK_NO_SUBMITORDER and STARPU_TASK_PROFILING_INFO * New function starpu_create_callback_task() which creates and submits an empty task with the specified callback * Use the S4U interface of Simgrid instead of xbt and MSG. Small changes: * Default modular worker queues to 2 tasks unless it's an heft scheduler * Separate out STATUS_SLEEPING_SCHEDULING state from STATUS_SLEEPING state When running the scheduler while being idle, workers do not go in the STATUS_SCHEDULING state, so that that time is considered as idle time instead of overhead. StarPU 1.3.2 (git revision af22a20fc00a37addf3cc6506305f89feed940b0) ==================================================================== Small changes: * Improve OpenMP support to detect the environment is valid before launching OpenMP * Delete old code (drivers gordon, scc, starpu-top, and plugin gcc) and update authors file accordingly * Add Heteroprio documentation (including a simple example) * Add a progression hook, to be called when workers are idle, which is used in the NewMadeleine implementation of StarPU-MPI to ensure communications progress. StarPU 1.3.1 (git revision 01949488b4f8e6fe26d2c200293b8aae5876b038) ==================================================================== Small features: * Add starpu_filter_nparts_compute_chunk_size_and_offset helper. * Add starpu_bcsr_filter_canonical_block_child_ops. Small changes: * Improve detection of NVML availability. Do not only check the library is available, also check the compiled code can be run. StarPU 1.3.0 (git revision 24ca83c6dbb102e1cfc41db3bb21c49662067062) ==================================================================== New features: * New scheduler 'heteroprio' with heterogeneous priorities * Support priorities for data transfers. * Add support for multiple linear regression performance models - Bump performance model file format version to 45. * Add MPI Master-Slave support to use the cores of remote nodes. Use the --enable-mpi-master-slave option to activate it. * Add STARPU_CUDA_THREAD_PER_DEV environment variable to support driving all GPUs from only one thread when almost all kernels are asynchronous. * Add starpu_replay tool to replay tasks.rec files with Simgrid. * Add experimental support of NUMA nodes. Use STARPU_USE_NUMA to activate it. * Add a new set of functions to make Out-of-Core based on HDF5 Library. * Add a new implementation of StarPU-MPI on top of NewMadeleine * Add optional callbacks to notify an external resource manager about workers going to sleep and waking up * Add implicit support for asynchronous partition planning. This means one does not need to call starpu_data_partition_submit() etc. explicitly any more, StarPU will make the appropriate calls as needed. * Add starpu_task_notify_ready_soon_register() to be notified when it is determined when a task will be ready an estimated amount of time from now. * New StarPU-MPI initialization function (starpu_mpi_init_conf()) which allows StarPU-MPI to manage reserving a core for the MPI thread, or merging it with CPU driver 0. * Add possibility to delay the termination of a task with the functions starpu_task_end_dep_add() which specifies the number of calls to the function starpu_task_end_dep_release() needed to trigger the task termination, or with starpu_task_declare_end_deps_array() and starpu_task_declare_end_deps() to just declare termination dependencies between tasks. * Add possibility to define the sequential consistency at the task level for each handle used by the task. * Add STARPU_SPECIFIC_NODE_LOCAL, STARPU_SPECIFIC_NODE_CPU, and STARPU_SPECIFIC_NODE_SLOW as generic values for codelet specific memory nodes which can be used instead of exact node numbers. * Add starpu_get_next_bindid() and starpu_bind_thread_on() to allow binding an application-started thread on a free core. Use it in StarPU-MPI to automatically bind the MPI thread on an available core. * Add STARPU_RESERVE_NCPU environment variable and starpu_config::reserve_ncpus field to make StarPU use a few cores less. * Add STARPU_MAIN_THREAD_BIND environment variable to make StarPU reserve a core for the main thread. * New StarPU-RM resource management module to share processor cores and accelerator devices with other parallel runtime systems. Use --enable-starpurm option to activate it. * New schedulers modular-gemm, modular-pheft, modular-prandom and modular-prandom-prio * Add STARPU_MATRIX_SET_NX/NY/LD and STARPU_VECTOR_SET_NX to change a matrix tile or vector size without reallocating the buffer. * Application can change the allocation used by StarPU with starpu_malloc_set_hooks() * XML output for starpu_perfmodel_display and starpu_perfmodel_dump_xml() function Small features: * Scheduling contexts may now be associated a user data pointer at creation time, that can later be recalled through starpu_sched_ctx_get_user_data(). * New environment variables STARPU_SIMGRID_TASK_SUBMIT_COST and STARPU_SIMGRID_FETCHING_INPUT_COST to simulate the cost of task submission and data fetching in simgrid mode. This provides more accurate simgrid predictions, especially for the beginning of the execution and regarding data transfers. * New environment variable STARPU_SIMGRID_SCHED_COST to take into account the time to perform scheduling when running in SimGrid mode. * New configure option --enable-mpi-pedantic-isend (disabled by default) to acquire data in STARPU_RW (instead of STARPU_R) before performing MPI_Isend() call * New function starpu_worker_display_names() to display the names of all the workers of a specified type. * Arbiters now support concurrent read access. * Add a field starpu_task::where similar to starpu_codelet::where which allows to restrict where to execute a task. Also add STARPU_TASK_WHERE to be used when calling starpu_task_insert(). * Add SubmitOrder trace field. * Add workerids and workerids_len task fields. * Add priority management to StarPU-MPI. Can be disabled with the STARPU_MPI_PRIORITIES environment variable. * Add STARPU_MAIN_THREAD_CPUID and STARPU_MPI_THREAD_CPUID environment variables. * Add disk to disk copy functions and support asynchronous full read/write in disk backends. * New starpu_task_insert() parameter STARPU_CL_ARGS_NFREE which allows to set codelet parameters but without freeing them. * New starpu_task_insert() parameter STARPU_TASK_DEPS_ARRAY which allows to declare task dependencies similarly to starpu_task_declare_deps_array() * Add dependency backward information in debugging mode for gdb's starpu-print-task * Add sched_data field in starpu_task structure. * New starpu_fxt_tool option -label-deps to label dependencies on the output graph * New environment variable STARPU_GENERATE_TRACE_OPTIONS to specify fxt options (to be used with STARPU_GENERATE_TRACE) * New function starpu_task_set() similar as starpu_task_build() but with a task object given as the first parameter * New functions starpu_data_partition_submit_sequential_consistency() and starpu_data_unpartition_submit_sequential_consistency() * Add a new value STARPU_TASK_SYNCHRONOUS to be used in starpu_task_insert() to define if the task is (or not) synchronous * Add memory states events in the traces. * Add starpu_sched_component_estimated_end_min_add() to fix termination estimations in modular schedulers. * New function starpu_data_partition_not_automatic() to disable the automatic partitioning of a data handle for which a asynchronous plan has previously been submitted * Add starpu_task_declare_deps() * New function starpu_data_unpartition_submit_sequential_consistency_cb() to specify a callback for the task submitting the unpartitioning * New tool starpu_mpi_comm_trace.py to draw heatmap of MPI communications * Support for ARM performance libraries * Add functionality to disable signal catching either through field starpu_conf::catch_signals or through the environment variable STARPU_CATCH_SIGNALS * Support for OpenMP Taskloop directive * Optional data interface init function (used by the vector and matrix interfaces) Changes: * Vastly improve simgrid simulation time. * Switch default scheduler to lws. * Add "to" parameter to pull_task and can_push methods of components. * Deprecate starpu_data_interface_ops::handle_to_pointer interface operation in favor of new starpu_data_interface_ops::to_pointer operation. * Sort data access requests by priority. * Cluster support is disabled by default, unless the configure option --enable-cluster is specified * For unpack operations, move the memory deallocation from starpu_data_unpack() to the interface function starpu_data_interface_ops::unpack_data(). Pack and unpack functions of predefined interfaces use public API starpu_malloc_on_node_flags() and starpu_free_on_node_flags() to allocate and de-allocate memory Small changes: * Use asynchronous transfers for task data fetches with were not prefetched. * Allow to call starpu_sched_ctx_set_policy_data on the main scheduler context * Fonction starpu_is_initialized() is moved to the public API. * Fix code to allow to submit tasks to empty contexts * STARPU_COMM_STATS also displays the bandwidth * Update data interfaces implementations to only use public API StarPU 1.2.11 (git revision xxx) ==================================================================== Small features: * Add starpu_tag_notify_restart_from_apps(). StarPU 1.2.10 (git revision beb6ac9cc07dc9ae1c838a38d11ed2dae3775996) ==================================================================== Small features: * New script starpu_env to set up StarPU environment variables * New configure option --disable-build-doc-pdf StarPU 1.2.9 (git revision 3aca8da3138a99e93d7f93905d2543bd6f1ea1df) ==================================================================== Small changes: * Add STARPU_SIMGRID_TRANSFER_COST environment variable to easily disable data transfer costs. * New dmdap "data-aware performance model (priority)" scheduler * Modification in the Native Fortran interface of the functions fstarpu_mpi_task_insert, fstarpu_mpi_task_build and fstarpu_mpi_task_post_build to only take 1 parameter being the MPI communicator, the codelet and the various parameters for the task. StarPU 1.2.8 (git revision f66374c9ad39aefb7cf5dfc31f9ab3d756bcdc3c) ==================================================================== Small features: * Minor fixes StarPU 1.2.7 (git revision 07cb7533c22958a76351bec002955f0e2818c530) ==================================================================== Small features: * Add STARPU_HWLOC_INPUT environment variable to save initialization time. * Add starpu_data_set/get_ooc_flag. StarPU 1.2.6 (git revision 23049adea01837479f309a75c002dacd16eb34ad) ==================================================================== Small changes: * Fix crash for lws scheduler * Avoid making hwloc load PCI topology when CUDA is not enabled StarPU 1.2.5 (git revision 22f32916916d158e3420033aa160854d1dd341bd) ==================================================================== Small features: * Add a new value STARPU_TASK_COLOR to be used in starpu_task_insert() to pick up the color of a task in dag.dot * Add starpu_data_pointer_is_inside(). Changes: * Do not export -lcuda -lcudart -lOpenCL in *starpu*.pc. StarPU 1.2.4 (git revision 255cf98175ef462749780f30bfed21452b74b594) ==================================================================== Small features: * Catch of signals SIGINT and SIGSEGV to dump fxt trace files. * New configure option --disable-icc to disable the compilation of specific ICC examples * Add starpu_codelet_pack_arg_init, starpu_codelet_pack_arg, starpu_codelet_pack_arg_fini for more fine-grain packing capabilities. * Add starpu_task_insert_data_make_room, starpu_task_insert_data_process_arg, starpu_task_insert_data_process_array_arg, starpu_task_insert_data_process_mode_array_arg * Do not show internal tasks in fxt dag by default. Allow to hide acquisitions too. * Add a way to choose the dag.dot colors. StarPU 1.2.3 (git revision 586ba6452a8eef99f275c891ce08933ae542c6c2) ==================================================================== 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 (git revision a0b01437b7b91f33fb3ca36bdea35271cad34464) =================================================================== 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 (git revision 473acaec8a1fb4f4c73d8b868e4f044b736b41ea) ==================================================================== 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 (git revision 5a86e9b61cd01b7797e18956283cc6ea22adfe11) ==================================================================== 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 (git revision 20469c6f3e7ecd6c0568c8e4e4b5b652598308d8xxx) ======================================================================= 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 (git revision 2a3d30b28d6d099d271134a786335acdbb3931a3) ==================================================================== 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 (git revision 11afc5b007fe1ab1c729b55b47a5a98ef7f3cfad) ==================================================================== 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 (git revision d14c550798630bbc4f3da2b07d793c47e3018f02) ==================================================================== 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 (git revision dab2e51117fac5bef767f3a6b7677abb2147d2f2) ==================================================================== 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 (git revision 3c4bc72ccef30e767680cad3d749c4e9010d4476) ==================================================================== 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 (git revision 25f8b3a7b13050e99bf1725ca6f52cfd62e7a861) ==================================================================== 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 (git revision 6f95de279d6d796a39debe8d6c5493b3bdbe0c37) ==================================================================== 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 (git revision 97ea6e15a273e23e4ddabf491b0f9481373ca01a) ==================================================================== 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 (git revision d3ad9ca318ec9acfeaf8eb7d8a018b09e4722292) ==================================================================== 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 (git revision 12bba8528fc0d85367d885cddc383ba54efca464) ================================================================== 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 (git revision ad8d8be3619f211f228c141282d7d504646fc2a6) ================================================================== 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 (git revision 991f2abb772c17c3d45bbcf27f46197652e6a3ef) ================================================================================== 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 (git revision 73e989f0783e10815aff394f80242760c4ed098c) ==================================================================== 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 (git revision 911869a96b40c74eb92b30a43d3e08bf445d8078) ==================================================================== 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.3.9+dfsg/INSTALL000066400000000000000000000152431413463044200150200ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/Makefile.am000066400000000000000000000150361413463044200160230ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2017 Guillaume Beauchamp # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = if STARPU_USE_MIN_DGELS SUBDIRS += min-dgels endif SUBDIRS += src SUBDIRS += tools if STARPU_BUILD_TESTS SUBDIRS += tests endif SUBDIRS += doc if STARPU_USE_MPI SUBDIRS += mpi endif if STARPU_BUILD_EXAMPLES SUBDIRS += examples endif if STARPU_BUILD_SOCL SUBDIRS += socl endif if STARPU_BUILD_STARPUFFT SUBDIRS += starpufft endif if STARPU_BUILD_STARPURM SUBDIRS += starpurm 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 starpu-1.3.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu.h \ include/starpu_helper.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_dep.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_mpi_ms.h \ include/starpu_expert.h \ include/starpu_profiling.h \ include/starpu_bound.h \ include/starpu_scheduler.h \ include/schedulers/starpu_heteroprio.h \ include/starpu_sched_component.h \ include/starpu_sched_ctx.h \ include/starpu_sched_ctx_hypervisor.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 \ include/starpu_clusters.h nodist_versinclude_HEADERS = \ include/starpu_config.h noinst_HEADERS = \ include/pthread_win32/pthread.h \ include/pthread_win32/semaphore.h if STARPU_DEVEL all-local: @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 # we count the number of files which include unistd.h # we count the number of files which properly include unistd.h i.e by first detecting if it's available # and then we check both numbers are the same ...a @UNISTD_ALL_LINES=$(shell $(GREP) -B1 -rs "^#include " $(srcdir)/src/ $(srcdir)/include/ $(srcdir)/mpi/src $(srcdir)/mpi/include |$(GREP) -v dolib|$(GREP) -v -e "--" | tr '\012' '@' | $(SED) 's/unistd.h>@/unistd.h>\n/g' | wc -l) ;\ UNISTD_CORRECT_LINES=$(shell $(GREP) -B1 -rs "^#include " $(srcdir)/src/ $(srcdir)/include/ $(srcdir)/mpi/src $(srcdir)/mpi/include |$(GREP) -v dolib|$(GREP) -v -e "--" | tr '\012' '@' | $(SED) 's/unistd.h>@/unistd.h>\n/g' | $(GREP) '#ifdef .*HAVE_UNISTD_H.*:#include ' | wc -l) ;\ if test $$UNISTD_ALL_LINES -ne $$UNISTD_CORRECT_LINES ; \ then \ echo "Please do not unconditionally include unistd.h, it is not available on Windows, include config.h and test for HAVE_UNISTD_H" ; \ false ; \ fi 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 recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET showfailed: @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -s -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET showsuite: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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://gitlab.inria.fr/starpu/starpu/-/blob/master/%FILENAME%" # 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.3.9+dfsg/Makefile.in000066400000000000000000001367741413463044200160510ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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@ 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_MIN_DGELS_TRUE@am__append_1 = min-dgels @STARPU_BUILD_TESTS_TRUE@am__append_2 = tests @STARPU_USE_MPI_TRUE@am__append_3 = mpi @STARPU_BUILD_EXAMPLES_TRUE@am__append_4 = examples @STARPU_BUILD_SOCL_TRUE@am__append_5 = socl @STARPU_BUILD_STARPUFFT_TRUE@am__append_6 = starpufft @STARPU_BUILD_STARPURM_TRUE@am__append_7 = starpurm @STARPU_BUILD_SC_HYPERVISOR_TRUE@am__append_8 = sc_hypervisor subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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-1.3.pc tests/model-checking/starpu-mc.sh \ tools/msvc/starpu_var.bat min-dgels/Makefile 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)$(txtdir)" \ "$(DESTDIR)$(versincludedir)" "$(DESTDIR)$(versincludedir)" 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 distdir-am 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 = min-dgels src tools tests doc mpi examples socl \ starpufft starpurm sc_hypervisor am__DIST_COMMON = $(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-1.3.pc.in \ $(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)/include/starpu_config.h.in \ $(top_srcdir)/min-dgels/Makefile.in \ $(top_srcdir)/socl/vendors/install/socl.icd.in \ $(top_srcdir)/socl/vendors/socl.icd.in \ $(top_srcdir)/src/common/config-src-build.h.in \ $(top_srcdir)/src/common/config.h.in \ $(top_srcdir)/starpurm/include/starpurm_config.h.in \ $(top_srcdir)/tests/model-checking/starpu-mc.sh.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 # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi 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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2017 Guillaume Beauchamp # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(am__append_1) src tools $(am__append_2) doc \ $(am__append_3) $(am__append_4) $(am__append_5) \ $(am__append_6) $(am__append_7) $(am__append_8) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpu.pc starpu-1.0.pc starpu-1.1.pc starpu-1.2.pc starpu-1.3.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu.h \ include/starpu_helper.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_dep.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_mpi_ms.h \ include/starpu_expert.h \ include/starpu_profiling.h \ include/starpu_bound.h \ include/starpu_scheduler.h \ include/schedulers/starpu_heteroprio.h \ include/starpu_sched_component.h \ include/starpu_sched_ctx.h \ include/starpu_sched_ctx_hypervisor.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 \ include/starpu_clusters.h nodist_versinclude_HEADERS = \ include/starpu_config.h noinst_HEADERS = \ include/pthread_win32/pthread.h \ include/pthread_win32/semaphore.h @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 DISTCLEANFILES = STARPU-REVISION # Cyclomatic complexity reports. # The pmccabe tool, see . PMCCABE = pmccabe VC_URL = "https://gitlab.inria.fr/starpu/starpu/-/blob/master/%FILENAME%" all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(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 $@ src/common/config-src-build.h: src/common/stamp-h2 @test -f $@ || rm -f src/common/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/common/stamp-h2 src/common/stamp-h2: $(top_srcdir)/src/common/config-src-build.h.in $(top_builddir)/config.status @rm -f src/common/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status src/common/config-src-build.h include/starpu_config.h: include/stamp-h3 @test -f $@ || rm -f include/stamp-h3 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) include/stamp-h3 include/stamp-h3: $(top_srcdir)/include/starpu_config.h.in $(top_builddir)/config.status @rm -f include/stamp-h3 cd $(top_builddir) && $(SHELL) ./config.status include/starpu_config.h starpurm/include/starpurm_config.h: starpurm/include/stamp-h4 @test -f $@ || rm -f starpurm/include/stamp-h4 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) starpurm/include/stamp-h4 starpurm/include/stamp-h4: $(top_srcdir)/starpurm/include/starpurm_config.h.in $(top_builddir)/config.status @rm -f starpurm/include/stamp-h4 cd $(top_builddir) && $(SHELL) ./config.status starpurm/include/starpurm_config.h distclean-hdr: -rm -f src/common/config.h src/common/stamp-h1 src/common/config-src-build.h src/common/stamp-h2 include/starpu_config.h include/stamp-h3 starpurm/include/starpurm_config.h starpurm/include/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-1.3.pc: $(top_builddir)/config.status $(srcdir)/starpu-1.3.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/model-checking/starpu-mc.sh: $(top_builddir)/config.status $(top_srcdir)/tests/model-checking/starpu-mc.sh.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 $@ min-dgels/Makefile: $(top_builddir)/config.status $(top_srcdir)/min-dgels/Makefile.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-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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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) | eval GZIP= gzip $(GZIP_ENV) -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-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(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) | eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ 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) $(AM_DISTCHECK_DVI_TARGET) \ && $(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 @STARPU_DEVEL_FALSE@all-local: all-am: Makefile $(DATA) $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(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." clean: clean-recursive clean-am: clean-generic clean-libtool 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-nodist_versincludeHEADERS \ install-pkgconfigDATA install-txtDATA \ 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 $(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-nodist_versincludeHEADERS \ uninstall-pkgconfigDATA uninstall-txtDATA \ uninstall-versincludeHEADERS .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 cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip dist-zstd 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-html install-html-am \ install-info install-info-am install-man \ 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-nodist_versincludeHEADERS \ uninstall-pkgconfigDATA uninstall-txtDATA \ uninstall-versincludeHEADERS .PRECIOUS: Makefile @STARPU_DEVEL_TRUE@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 # we count the number of files which include unistd.h # we count the number of files which properly include unistd.h i.e by first detecting if it's available # and then we check both numbers are the same ...a @STARPU_DEVEL_TRUE@ @UNISTD_ALL_LINES=$(shell $(GREP) -B1 -rs "^#include " $(srcdir)/src/ $(srcdir)/include/ $(srcdir)/mpi/src $(srcdir)/mpi/include |$(GREP) -v dolib|$(GREP) -v -e "--" | tr '\012' '@' | $(SED) 's/unistd.h>@/unistd.h>\n/g' | wc -l) ;\ @STARPU_DEVEL_TRUE@ UNISTD_CORRECT_LINES=$(shell $(GREP) -B1 -rs "^#include " $(srcdir)/src/ $(srcdir)/include/ $(srcdir)/mpi/src $(srcdir)/mpi/include |$(GREP) -v dolib|$(GREP) -v -e "--" | tr '\012' '@' | $(SED) 's/unistd.h>@/unistd.h>\n/g' | $(GREP) '#ifdef .*HAVE_UNISTD_H.*:#include ' | wc -l) ;\ @STARPU_DEVEL_TRUE@ if test $$UNISTD_ALL_LINES -ne $$UNISTD_CORRECT_LINES ; \ @STARPU_DEVEL_TRUE@ then \ @STARPU_DEVEL_TRUE@ echo "Please do not unconditionally include unistd.h, it is not available on Windows, include config.h and test for HAVE_UNISTD_H" ; \ @STARPU_DEVEL_TRUE@ false ; \ @STARPU_DEVEL_TRUE@ fi recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET showfailed: @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -s -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET showsuite: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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.3.9+dfsg/README000066400000000000000000000142451413463044200146500ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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://gitlab.inria.fr/starpu/starpu The GIT repository access can be checked out with the following command. $ git clone git@gitlab.inria.fr:starpu/starpu.git ++=============================++ || 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@inria.fr. starpu-1.3.9+dfsg/README.dev000066400000000000000000000052071413463044200154230ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 - sc_hypervisor : The Scheduling Context Hypervisor - starpufft : The FFT support 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.3.9+dfsg/STARPU-REVISION000066400000000000000000000000511413463044200161530ustar00rootroot0000000000000094ef7b1e67860ad1441c4a7f0e6496bc940ee302 starpu-1.3.9+dfsg/STARPU-VERSION000066400000000000000000000057641413463044200160620ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. # 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.3 # 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=8 # increment upon ABI change LIBSTARPU_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPU_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSTARPUFFT_INTERFACE_CURRENT=2 # increment upon ABI change LIBSTARPUFFT_INTERFACE_REVISION=1 # increment upon implementation change LIBSTARPUFFT_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSTARPUMPI_INTERFACE_CURRENT=3 # increment upon ABI change LIBSTARPUMPI_INTERFACE_REVISION=2 # increment upon implementation change LIBSTARPUMPI_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSOCL_INTERFACE_CURRENT=0 # increment upon ABI change LIBSOCL_INTERFACE_REVISION=3 # increment upon implementation change LIBSOCL_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSTARPURM_INTERFACE_CURRENT=2 # increment upon ABI change LIBSTARPURM_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPURM_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface starpu-1.3.9+dfsg/TODO000066400000000000000000000020321413463044200144470ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # 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.3.9+dfsg/aclocal.m4000066400000000000000000001262731413463044200156350ustar00rootroot00000000000000# generated automatically by aclocal 1.16.3 -*- Autoconf -*- # Copyright (C) 1996-2020 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-2020 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.16' 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.16.3], [], [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.16.3])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-2020 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-2020 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-2020 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-2020 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-2020 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2020 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-2020 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-2020 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-2020 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 whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2020 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 MISSING="\${SHELL} '$am_aux_dir/missing'" 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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/ax_cxx_compile_stdcxx.m4]) m4_include([m4/ax_dlb_callback_arg.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.3.9+dfsg/autogen.sh000077500000000000000000000017111413463044200157630ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/build-aux/000077500000000000000000000000001413463044200156545ustar00rootroot00000000000000starpu-1.3.9+dfsg/build-aux/ar-lib000077500000000000000000000133631413463044200167560ustar00rootroot00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2019-07-04.01; # UTC # Copyright (C) 2010-2020 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* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin | msys) 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* | MSYS*) 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/* | msys/*) 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 | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: starpu-1.3.9+dfsg/build-aux/config.guess000077500000000000000000001263731413463044200202100ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # 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; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -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-2018 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' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; 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=`(uname -p 2>/dev/null || \ "/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 ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-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) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; 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 # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; 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/[-_].*//' | cut -d. -f1,2` ;; 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}${abi}" 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 ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$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 ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 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 ;; 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/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` 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:4.4BSD:*) 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) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys 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 ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-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 "[:upper:]" "[:lower:]"``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 ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-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 ;; k1om: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; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*: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 ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-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:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi 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.*:*) 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 configure 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 ;; SX-ACE:SUPER-UX:*:*) echo sxace-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 test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then 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 # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 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 ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-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 ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: starpu-1.3.9+dfsg/build-aux/config.sub000077500000000000000000001064501413463044200176450ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-22' # 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 to . # # 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: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # 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 or ALIAS Canonicalize a configuration name. Options: -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-2018 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* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ 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/'` ;; -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 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | 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 \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]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 \ | visium \ | wasm32 \ | 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 ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; 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-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | 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-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | 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-* \ | visium-* \ | wasm32-* \ | 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-pc 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 ;; asmjs) basic_machine=asmjs-unknown ;; 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*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; 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 ;; 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 ;; 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 ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; 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 ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; 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 ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-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) 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) 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 ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; x64) basic_machine=x86_64-pc ;; 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 ;; 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 ;; 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 ;; 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 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now 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* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -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* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # 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 | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -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 ;; -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 ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -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 ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-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 ;; *-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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: starpu-1.3.9+dfsg/build-aux/depcomp000077500000000000000000000560201413463044200172340ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2020 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: starpu-1.3.9+dfsg/build-aux/install-sh000077500000000000000000000357761413463044200177020ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # 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 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= 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 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. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -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 By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " 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;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -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=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi 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. 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 dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # 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 # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. 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 if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # 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=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_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 && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $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 # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # 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 "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: starpu-1.3.9+dfsg/build-aux/ltmain.sh000077500000000000000000011771671413463044200175230ustar00rootroot00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 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 this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.6 Debian-2.4.6-15" package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 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. # 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. # 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! 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 # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! 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 ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_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 # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_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 '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. 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. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # 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 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # 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" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_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 "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # 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. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # 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 "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_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 "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_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_append 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_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || 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_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd 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 -z "$func_relative_path_tlibdir"; 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 -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # 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 () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_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. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # 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). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet 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 () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet 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 () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" 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 () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2015-10-07.11; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 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. # 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd _G_rc_run_hooks=false case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do if eval $_G_hook '"$@"'; then # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift _G_rc_run_hooks=: fi done $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, you may remove/edit # any options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. In this case you also must return $EXIT_SUCCESS to let the # hook's caller know that it should pay attention to # '_result'. Returning $EXIT_FAILURE signalizes that # arguments are left untouched by the hook and therefore caller will ignore the # result variable. # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). There is # # no need to do the equivalent (but slower) action: # # func_quote_for_eval ${1+"$@"} # # my_options_prep_result=$func_quote_for_eval_result # false # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@", we could need that later # # if $args_changed is true. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # if $args_changed; then # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # fi # # $args_changed # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # false # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd _G_func_options_finish_exit=false if func_run_hooks func_options ${1+"$@"}; then func_options_finish_result=$func_run_hooks_result _G_func_options_finish_exit=: fi $_G_func_options_finish_exit } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_rc_options=false for my_func in options_prep parse_options validate_options options_finish do if eval func_$my_func '${1+"$@"}'; then eval _G_res_var='$'"func_${my_func}_result" eval set dummy "$_G_res_var" ; shift _G_rc_options=: fi done # Save modified positional parameters for caller. As a top-level # options-parser function we always need to set the 'func_options_result' # variable (regardless the $_G_rc_options value). if $_G_rc_options; then func_options_result=$_G_res_var else func_quote_for_eval ${1+"$@"} func_options_result=$func_quote_for_eval_result fi $_G_rc_options } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= _G_rc_options_prep=false if func_run_hooks func_options_prep ${1+"$@"}; then _G_rc_options_prep=: # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result fi $_G_rc_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= _G_rc_parse_options=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. if func_run_hooks func_parse_options ${1+"$@"}; then eval set dummy "$func_run_hooks_result"; shift _G_rc_parse_options=: fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_rc_parse_options=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_rc_parse_options=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac $_G_match_parse_options && _G_rc_parse_options=: done if $_G_rc_parse_options; then # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result fi $_G_rc_parse_options } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd _G_rc_validate_options=false # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" if func_run_hooks func_validate_options ${1+"$@"}; then # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result _G_rc_validate_options=: fi # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE $_G_rc_validate_options } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # 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. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --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 --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_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) version: $progname $scriptversion Debian-2.4.6-15 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "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 yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; 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 } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: # 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 ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result fi $_G_rc_lt_options_prep } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result fi $_G_rc_lt_parse_options } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # 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 test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. 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= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # 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 | func_generated_by_libtool_p } # 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 yes = "$lalib_p" } # 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 () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # 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 () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs 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 () { $debug_cmd 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 () { $debug_cmd 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 yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; 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 "$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 () { $debug_cmd # 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 () { $debug_cmd 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 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd $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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # 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 yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot 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 yes = "$build_old_libs"; 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 no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; 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 yes = "$need_locks"; 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 warn = "$need_locks"; 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 yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; 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 warn = "$need_locks" && 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 yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; 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 warn = "$need_locks" && 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 no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && 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 -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -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 () { $debug_cmd # 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 $opt_dry_run; then # 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 else 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 fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd 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_quiet && 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 finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # 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=false 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=: ;; -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-m = "X$prev" && 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=: if $isdir; 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 ;; os2*) 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 yes = "$build_old_libs"; 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=: 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'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; 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_quiet || { 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 install = "$opt_mode" && 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 () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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) $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 can'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 #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; 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 func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' 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[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi 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" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; 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" "${nlist}I"' # 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_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 () { $debug_cmd 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 () { $debug_cmd 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_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 () { $debug_cmd 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 case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) 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 } }'` ;; esac 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 () { $debug_cmd 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 () { $debug_cmd 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 that possess that section. Heuristic: eliminate # all those that 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_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 () { $debug_cmd 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 () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; 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 yes = "$lock_old_archive_extraction"; 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 () { $debug_cmd 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` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result 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 "$sed_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 where 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) $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/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that 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) $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 yes = "$fast_install"; 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 yes = "$shlibpath_overrides_runpath" && 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 #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* 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_platform || defined ... */ #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 #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 (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]; size_t 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 = (size_t) (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 (STREQ (str, pat)) *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 size_t 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) { size_t orig_value_len = strlen (orig_value); size_t 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 #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\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 () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd 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 # what 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 that 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= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false 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 yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && 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) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; 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 ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. 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 none = "$pic_object" && test none = "$non_pic_object"; 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 none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; 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 none != "$non_pic_object"; 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 none = "$pic_object"; 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 ;; os2dllname) os2dllname=$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 rpath = "$prev"; 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-export-symbols = "X$arg"; 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-lc = "X$arg" || test X-lm = "X$arg"; 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-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && 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-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm 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 ;; -os2dllname) prev=os2dllname 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 # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC # -static-* direct GCC to link specific libraries statically # -fcilkplus Cilk Plus language extension features for C/C++ -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*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus) 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 ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # 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 none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; 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 none = "$pic_object"; 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 dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; 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 yes = "$export_dynamic" && 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\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" 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 lib = "$linkmode"; 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=false 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 lib,link = "$linkmode,$pass"; 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 lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; 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 lib,dlpreopen = "$linkmode,$pass"; 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 dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; 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 .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; 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 conv = "$pass" && 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 conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; 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 link = "$pass"; 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 conv = "$pass"; 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=false 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=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else 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." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; 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=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # 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 lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; 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 prog != "$linkmode" && test lib != "$linkmode"; 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 yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; 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 dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" 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 yes = "$installed"; 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 yes = "$hardcode_automatic" && 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 dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; 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 lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: 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 $linkalldeplibs; 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 prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || 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 $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && 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 built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; 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 yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; 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 lib = "$linkmode" && test yes = "$hardcode_into_libs"; 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* | *os2*) 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 prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; 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 cannot # 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 no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; 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 yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; 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 prog = "$linkmode"; 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 yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; 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 prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; 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 no = "$link_static" && 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 no != "$link_all_deplibs"; 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 link = "$pass"; then if test prog = "$linkmode"; 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 dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # 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= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=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 # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # 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 prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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 no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; 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 pass_all != "$deplibs_check_method"; 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 no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; 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 # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|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" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; 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 0 -ne "$loop"; 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 0 -ne "$loop"; 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 ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. 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 no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; 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 -n "$precious_files_regex"; 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 yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; 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 yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 yes = "$build_libtool_libs"; 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 yes = "$build_libtool_need_lc"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 none = "$deplibs_check_method"; 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 yes = "$droppeddeps"; then if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || 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 relink = "$opt_mode" || 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 func_dll_def_p "$export_symbols" || { # 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 ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || 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 yes = "$try_normal_branch" \ && { 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 : != "$skipped_export"; 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 : != "$skipped_export" && 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 yes = "$compiler_needs_object" && 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 yes = "$thread_safe" && 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 relink = "$opt_mode"; 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 yes = "$module" && 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 : != "$skipped_export" && 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 : != "$skipped_export" && test yes = "$with_gnu_ld"; 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 : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; 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 -z "$objlist" || 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 1 -eq "$k"; 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 ${skipped_export-false} && { 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 } 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_quiet || { 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 relink = "$opt_mode"; 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 ${skipped_export-false} && { 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 } 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 yes = "$module" && 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=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { 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 relink = "$opt_mode"; 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 relink = "$opt_mode"; 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 yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags 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 yes = "$build_libtool_libs" || 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 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 test yes = "$build_libtool_libs" || { 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 } if test -n "$pic_flag" || test default != "$pic_mode"; 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" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && 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 CXX = "$tagname"; 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 yes = "$build_old_libs"; 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@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # 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 } 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 yes = "$no_install"; 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 case $hardcode_action,$fast_install in relink,*) # 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" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # 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 case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac 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 yes = "$build_libtool_libs"; 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 -z "$oldobjs"; 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 yes = "$build_old_libs" && 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 yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; 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 -n "$bindir"; 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) $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 cannot 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 no,yes = "$installed,$need_relink"; 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 } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false 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=: ;; -*) 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 . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; 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 $rmforce; 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" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || 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 none != "$pic_object"; 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 none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; 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 yes = "$fast_install" && 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 } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi 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 # where 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: starpu-1.3.9+dfsg/build-aux/missing000077500000000000000000000153361413463044200172630ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2020 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=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: starpu-1.3.9+dfsg/build-aux/svn2cl.xsl000066400000000000000000000373511413463044200176240ustar00rootroot00000000000000 / / [r ] * , . , [DEL] [CPY] [ADD] starpu-1.3.9+dfsg/build-aux/test-driver000077500000000000000000000111271413463044200200540ustar00rootroot00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2020 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: starpu-1.3.9+dfsg/configure000077500000000000000000050260031413463044200156770ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for StarPU 1.3.9. # # 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@inria.fr about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: 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.3.9' PACKAGE_STRING='StarPU 1.3.9' PACKAGE_BUGREPORT='starpu-devel@inria.fr' PACKAGE_URL='http://gitlab.inria.fr/starpu/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 STARPU_AVAILABLE_DOC_PDF_FALSE STARPU_AVAILABLE_DOC_PDF_TRUE STARPU_BUILD_DOC_PDF_FALSE STARPU_BUILD_DOC_PDF_TRUE STARPU_AVAILABLE_DOC_FALSE STARPU_AVAILABLE_DOC_TRUE STARPU_BUILD_DOC_FALSE STARPU_BUILD_DOC_TRUE epstopdfcommand pdflatexcommand doxygencommand STARPU_BUILD_STARPURM_EXAMPLES_FALSE STARPU_BUILD_STARPURM_EXAMPLES_TRUE STARPU_BUILD_STARPURM_FALSE STARPU_BUILD_STARPURM_TRUE STARPURM_HAVE_DLB_FALSE STARPURM_HAVE_DLB_TRUE DLB_LIBS DLB_CFLAGS 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 STARPU_BUILD_STARPUFFT_EXAMPLES_FALSE STARPU_BUILD_STARPUFFT_EXAMPLES_TRUE STARPU_BUILD_STARPUFFT_FALSE STARPU_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 STARPU_USE_MIN_DGELS_FALSE STARPU_USE_MIN_DGELS_TRUE DGELS_LIBS STARPU_LAPACK_LDFLAGS BLAS_LIB STARPU_NO_BLAS_LIB_FALSE STARPU_NO_BLAS_LIB_TRUE STARPU_SYSTEM_BLAS_LIB_FALSE STARPU_SYSTEM_BLAS_LIB_TRUE STARPU_MKL_BLAS_LIB_FALSE STARPU_MKL_BLAS_LIB_TRUE STARPU_GOTO_BLAS_LIB_FALSE STARPU_GOTO_BLAS_LIB_TRUE STARPU_ATLAS_BLAS_LIB_FALSE STARPU_ATLAS_BLAS_LIB_TRUE STARPU_HAVE_CBLAS_SGEMV_FALSE STARPU_HAVE_CBLAS_SGEMV_TRUE STARPU_HAVE_CBLAS_H_FALSE STARPU_HAVE_CBLAS_H_TRUE BLAS_LIBS BLAS_OPENBLAS_LIBS BLAS_OPENBLAS_CFLAGS STARPU_OPENBLAS STARPU_OPENBLAS_LDFLAGS OPENBLAS_LIBS OPENBLAS_CFLAGS ATLASDIR STARPU_BLAS_LDFLAGS GOTODIR STARPU_HAVE_X11_FALSE STARPU_HAVE_X11_TRUE X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF STARPU_HAVE_OPENGL_FALSE STARPU_HAVE_OPENGL_TRUE STARPU_OPENGL_RENDER STARPU_OPENGL_RENDER_LDFLAGS STARPU_BUILD_EXAMPLES_FALSE STARPU_BUILD_EXAMPLES_TRUE STARPU_BUILD_TESTS_FALSE STARPU_BUILD_TESTS_TRUE GDB SOCL_OCL_LIB_OPENCL_DIR STARPU_USE_SOCL_FALSE STARPU_USE_SOCL_TRUE STARPU_BUILD_SOCL_FALSE STARPU_BUILD_SOCL_TRUE STARPU_HAVE_OPENMP_FALSE STARPU_HAVE_OPENMP_TRUE STARPU_OPENMP_FALSE STARPU_OPENMP_TRUE STARPU_CLUSTER_FALSE STARPU_CLUSTER_TRUE OPENMP_CFLAGS 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 STARPU_EXPORT_DYNAMIC STARPU_USE_MP_FALSE STARPU_USE_MP_TRUE 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_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_COVERITY_FALSE STARPU_COVERITY_TRUE STARPU_COVERAGE_ENABLED_FALSE STARPU_COVERAGE_ENABLED_TRUE COVERAGE STARPU_SCIF_LDFLAGS STARPU_SCIF_CPPFLAGS STARPU_COI_LDFLAGS STARPU_COI_CPPFLAGS 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 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_HAVE_HDF5_FALSE STARPU_HAVE_HDF5_TRUE STARPU_HDF5_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 MPICC_LDFLAGS MPIEXEC_ARGS STARPU_USE_MPI_FALSE STARPU_USE_MPI_TRUE STARPU_USE_MPI_NMAD_FALSE STARPU_USE_MPI_NMAD_TRUE STARPU_USE_MPI_MPI_FALSE STARPU_USE_MPI_MPI_TRUE STARPU_MPI_CHECK_FALSE STARPU_MPI_CHECK_TRUE STARPU_USE_MPI_MASTER_SLAVE_FALSE STARPU_USE_MPI_MASTER_SLAVE_TRUE NMAD_LIBS NMAD_CFLAGS CC_OR_MPICC MPIEXEC mpiexec_path MPICXX mpicxx_path MPICC mpicc_path STARPU_CROSS_COMPILING_FALSE STARPU_CROSS_COMPILING_TRUE gitcommand REALBASH CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB NM ac_ct_DUMPBIN DUMPBIN LD FGREP LIBTOOL OBJDUMP DLLTOOL AS STARPU_HAVE_CXX11_FALSE STARPU_HAVE_CXX11_TRUE STARPU_HAVE_CXX11 HAVE_CXX11 STARPU_SIMGRID_FALSE STARPU_SIMGRID_TRUE STARPU_SIMGRID_MC_FALSE STARPU_SIMGRID_MC_TRUE SIMGRID_MC SIMGRID_LIBS SIMGRID_CFLAGS PKG_CONFIG PROG_FIND PROG_DATE PROG_STAT EGREP GREP 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__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 LIBSTARPURM_INTERFACE_AGE LIBSTARPURM_INTERFACE_REVISION LIBSTARPURM_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 runstatedir 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 am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_opencl_simulator with_simgrid_dir with_simgrid_include_dir with_simgrid_lib_dir enable_simgrid enable_simgrid_mc enable_blocking_drivers enable_worker_callbacks enable_shared enable_static with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock with_mpicc with_mpicxx with_smpirun with_mpiexec enable_mpi enable_nmad enable_mpi_master_slave with_mpi_master_slave_multiple_thread enable_maxmpidev enable_mpi_pedantic_isend enable_mpi_check with_mpiexec_args enable_mpi_verbose enable_mic enable_mic_rma enable_maxnumanodes enable_native_winthreads enable_default_drand48 enable_quick_check enable_long_check enable_new_check enable_valgrind enable_hdf5 with_hdf5_include_dir with_hdf5_lib_dir 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_asynchronous_mpi_master_slave_copy 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_debug enable_spinlock_check enable_fstack_protector_all enable_gdb enable_full_gdb_information enable_fast enable_verbose enable_coverage enable_coverity with_fxt enable_poti enable_fxt_lock enable_perf_debug enable_model_debug 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 enable_export_dynamic enable_maxmpkernels with_check_flags enable_fortran with_mpifort enable_cluster enable_openmp 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 with_armpl_cflags with_armpl_ldflags enable_mlr enable_mlr_system_blas enable_starpufft enable_starpufft_examples with_hwloc enable_icc enable_starpurm enable_starpurm_verbose enable_dlb with_dlb_include_dir with_dlb_lib_dir enable_starpurm_dlb_verbose enable_starpurm_examples enable_build_doc enable_build_doc_pdf ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP F77 FFLAGS FC FCFLAGS PKG_CONFIG SIMGRID_CFLAGS SIMGRID_LIBS LT_SYS_LIBRARY_PATH CXXCPP NMAD_CFLAGS NMAD_LIBS STARPU_MS_LIB MAGMA_CFLAGS MAGMA_LIBS NVCC NVCC_CC NVCCFLAGS FXT_CFLAGS FXT_LIBS FXT_LDFLAGS POTI_CFLAGS POTI_LIBS XMKMF OPENBLAS_CFLAGS OPENBLAS_LIBS BLAS_OPENBLAS_CFLAGS BLAS_OPENBLAS_LIBS BLAS_LIBS DGELS_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' runstatedir='${localstatedir}/run' 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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 runstatedir 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.3.9 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] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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.3.9:";; 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 --enable-opencl-simulator Enable the use of an OpenCL simulator --enable-simgrid Enable simulating execution in simgrid --enable-simgrid-mc Enable using Model Checker of simgrid --enable-blocking-drivers enable blocking drivers --enable-worker-callbacks enable worker callbacks --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) --disable-mpi Disable StarPU MPI library generation --enable-nmad Enable StarPU MPI library generation using the new madeleine backend --enable-mpi-master-slave Enable StarPU to run with the master-slave mode --enable-maxmpidev= maximum number of MPI master-slave devices --enable-mpi-pedantic-isend Prevent StarPU MPI from reading buffers while being sent over MPI --enable-mpi-check Enable execution of MPI testcases --enable-mpi-verbose display MPI verbose debug messages (--enable-mpi-verbose=extra increase the verbosity) --enable-mic use MIC device(s) --disable-mic-rma disable MIC RMA transfer --enable-maxnumanodes= maximum number of NUMA nodes --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-hdf5 disable HDF5 support --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 --disable-asynchronous-mpi-master-slave-copy disable asynchronous copy between MPI Master and MPI Slave devices --enable-maxmicdev= maximum number of MIC devices --enable-maxmicthreads= maximum number of MIC threads --enable-debug enable debug mode --enable-spinlock-check enable spinlock check --disable-fstack-protector-all disable GCC option -fstack-protector-all --disable-gdb disable gdb information --disable-full-gdb-information disable full gdb information --enable-fast do not enforce assertions --enable-verbose display verbose debug messages (--enable-verbose=extra increase the verbosity) --enable-coverage enable coverage checking --enable-coverity enable coverity mode --enable-poti Enable the use of the POTI library to generate Paje traces --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-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 memory nodes per MPI rank --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. --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 --disable-fortran disable build of fortran examples --enable-cluster build the cluster support --disable-openmp do not use OpenMP --enable-openmp build the OpenMP runtime support --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) --enable-mlr Enable multiple linear regression models --enable-mlr-system-blas Make the multiple linear regression models use the system BLAS instead of min-dgels --disable-starpufft Disable build of StarPU-FFT --enable-starpufft-examples enable build of StarPU FFT examples --enable-icc Enable the compilation of specific ICC examples --enable-starpurm enable resource management support --enable-starpurm-verbose display resource management verbose debug messages --enable-dlb enable DLB support --enable-starpurm-dlb-verbose display resource management verbose debug messages --enable-starpurm-examples enable build of StarPU Resource Manager examples --disable-build-doc disable building of documentation --enable-build-doc-pdf enable building of PDF documentation Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --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-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --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-mpicc= Name or path of the mpicc compiler --with-mpicxx= Name or path of the mpicxx/mpic++ compiler --with-smpirun= Name or path of the smpirun helper --with-mpiexec= Name or path of mpiexec --with-mpi-master-slave-multiple-thread --with-mpiexec-args= Arguments for mpiexec --with-hdf5-include-dir= specify where HDF5 headers are installed --with-hdf5-lib-dir= specify where HDF5 libraries are installed --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-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-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-check-flags Specify flags for C and Fortran compilers --with-mpifort= Name or 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 --with-armpl-cflags specify ARMPL compilation flags --with-armpl-ldflags specify ARMPL linking flags --without-hwloc Disable hwloc (enabled by default) --with-dlb-include-dir= specify where DLB headers are installed --with-dlb-lib-dir= specify where DLB libraries are installed 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 PKG_CONFIG path to pkg-config utility SIMGRID_CFLAGS C compiler flags for SIMGRID, overriding pkg-config SIMGRID_LIBS linker flags for SIMGRID, overriding pkg-config LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor NMAD_CFLAGS C compiler flags for NMAD, overriding pkg-config NMAD_LIBS linker flags for NMAD, overriding pkg-config STARPU_MS_LIB Path to Microsoft's Visual Studio `lib' tool 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 OPENBLAS_CFLAGS C compiler flags for OPENBLAS, overriding pkg-config OPENBLAS_LIBS linker flags for OPENBLAS, overriding pkg-config BLAS_OPENBLAS_CFLAGS C compiler flags for BLAS_OPENBLAS, overriding pkg-config BLAS_OPENBLAS_LIBS linker flags for BLAS_OPENBLAS, overriding pkg-config BLAS_LIBS linker flags for blas DGELS_LIBS linker flags for lapack dgels 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.3.9 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_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_c_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_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@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_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_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_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_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_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_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_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@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.3.9, 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.16' # 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 MISSING="\${SHELL} '$am_aux_dir/missing'" 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.3.9' 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # 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 { $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" 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 for ac_prog in find 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_PROG_FIND+:} false; then : $as_echo_n "(cached) " >&6 else case $PROG_FIND in [\\/]* | ?:[\\/]*) ac_cv_path_PROG_FIND="$PROG_FIND" # 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_PROG_FIND="$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 PROG_FIND=$ac_cv_path_PROG_FIND if test -n "$PROG_FIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_FIND" >&5 $as_echo "$PROG_FIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PROG_FIND" && break done 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 if test x$enable_perf_debug = xyes; then enable_shared=no fi default_enable_mpi_check=maybe default_enable_mpi=maybe ############################################################################### # # # 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 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIMGRID" >&5 $as_echo_n "checking for SIMGRID... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SIMGRID_CFLAGS"; then pkg_cv_SIMGRID_CFLAGS="$SIMGRID_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"simgrid\""; } >&5 ($PKG_CONFIG --exists --print-errors "simgrid") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SIMGRID_CFLAGS=`$PKG_CONFIG --cflags "simgrid" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SIMGRID_LIBS"; then pkg_cv_SIMGRID_LIBS="$SIMGRID_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"simgrid\""; } >&5 ($PKG_CONFIG --exists --print-errors "simgrid") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SIMGRID_LIBS=`$PKG_CONFIG --libs "simgrid" 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 SIMGRID_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "simgrid"` else SIMGRID_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "simgrid"` fi # Put the nasty error message in config.log where it belongs echo "$SIMGRID_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else SIMGRID_CFLAGS=$pkg_cv_SIMGRID_CFLAGS SIMGRID_LIBS=$pkg_cv_SIMGRID_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi if test "$simgrid_include_dir" != "no" ; then SIMGRID_CFLAGS="$SIMGRID_CFLAGS -I$simgrid_include_dir" fi if test "$simgrid_lib_dir" != "no" ; then SIMGRID_LIBS="$SIMGRID_LIBS -L$simgrid_lib_dir" fi if test "$simgrid_dir" != "no" ; then SIMGRID_CFLAGS="$SIMGRID_CFLAGS -I$simgrid_dir/include" SIMGRID_LIBS="$SIMGRID_LIBS -L$simgrid_dir/lib" fi 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 { $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 { $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 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 msg/msg.h do : ac_fn_c_check_header_mongrel "$LINENO" "msg/msg.h" "ac_cv_header_msg_msg_h" "$ac_includes_default" if test "x$ac_cv_header_msg_msg_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MSG_MSG_H 1 _ACEOF $as_echo "#define STARPU_HAVE_MSG_MSG_H 1" >>confdefs.h fi done for ac_header in simgrid/host.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/host.h" "ac_cv_header_simgrid_host_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_host_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_HOST_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_HOST_H 1" >>confdefs.h fi done for ac_header in xbt/base.h do : ac_fn_c_check_header_mongrel "$LINENO" "xbt/base.h" "ac_cv_header_xbt_base_h" "$ac_includes_default" if test "x$ac_cv_header_xbt_base_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XBT_BASE_H 1 _ACEOF $as_echo "#define STARPU_HAVE_XBT_BASE_H 1" >>confdefs.h fi done for ac_header in simgrid/version.h do : ac_fn_c_check_header_compile "$LINENO" "simgrid/version.h" "ac_cv_header_simgrid_version_h" " #ifdef STARPU_HAVE_XBT_BASE_H #include #endif " if test "x$ac_cv_header_simgrid_version_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_VERSION_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_VERSION_H 1" >>confdefs.h fi done for ac_header in simgrid/simdag.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/simdag.h" "ac_cv_header_simgrid_simdag_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_simdag_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_SIMDAG_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_SIMDAG_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_header in xbt/config.h do : ac_fn_c_check_header_mongrel "$LINENO" "xbt/config.h" "ac_cv_header_xbt_config_h" "$ac_includes_default" if test "x$ac_cv_header_xbt_config_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XBT_CONFIG_H 1 _ACEOF $as_echo "#define STARPU_HAVE_XBT_CONFIG_H 1" >>confdefs.h fi done for ac_header in simgrid/actor.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/actor.h" "ac_cv_header_simgrid_actor_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_actor_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_ACTOR_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_ACTOR_H 1" >>confdefs.h fi done for ac_header in simgrid/engine.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/engine.h" "ac_cv_header_simgrid_engine_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_engine_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_ENGINE_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_ENGINE_H 1" >>confdefs.h fi done for ac_header in simgrid/semaphore.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/semaphore.h" "ac_cv_header_simgrid_semaphore_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_semaphore_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_SEMAPHORE_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_SEMAPHORE_H 1" >>confdefs.h fi done for ac_header in simgrid/mutex.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/mutex.h" "ac_cv_header_simgrid_mutex_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_mutex_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_MUTEX_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_MUTEX_H 1" >>confdefs.h fi done for ac_header in simgrid/cond.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/cond.h" "ac_cv_header_simgrid_cond_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_cond_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_COND_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_COND_H 1" >>confdefs.h fi done for ac_header in simgrid/barrier.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/barrier.h" "ac_cv_header_simgrid_barrier_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_barrier_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_BARRIER_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_BARRIER_H 1" >>confdefs.h fi done for ac_header in simgrid/engine.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/engine.h" "ac_cv_header_simgrid_engine_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_engine_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_ENGINE_H 1 _ACEOF fi done for ac_header in simgrid/zone.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/zone.h" "ac_cv_header_simgrid_zone_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_zone_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_ZONE_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_ZONE_H 1" >>confdefs.h fi done ac_fn_c_check_type "$LINENO" "smx_actor_t" "ac_cv_type_smx_actor_t" "#include " if test "x$ac_cv_type_smx_actor_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SMX_ACTOR_T 1 _ACEOF $as_echo "#define STARPU_HAVE_SMX_ACTOR_T 1" >>confdefs.h fi # Latest functions for ac_func in MSG_process_attach sg_actor_attach sg_actor_init sg_actor_on_exit MSG_zone_get_hosts sg_zone_get_hosts MSG_process_self_name MSG_process_userdata_init sg_actor_get_data sg_actor_set_data sg_actor_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_mutex_try_acquire smpi_process_set_user_data SMPI_thread_create sg_zone_get_by_name sg_link_get_name sg_link_name sg_link_set_bandwidth sg_link_bandwidth_set sg_host_get_route sg_host_route sg_host_self sg_host_list sg_host_get_speed sg_host_speed simcall_process_create sg_config_continue_after_help 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 simgrid_set_maestro do : ac_fn_c_check_func "$LINENO" "simgrid_set_maestro" "ac_cv_func_simgrid_set_maestro" if test "x$ac_cv_func_simgrid_set_maestro" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_SET_MAESTRO 1 _ACEOF fi done for ac_func in simgrid_init do : ac_fn_c_check_func "$LINENO" "simgrid_init" "ac_cv_func_simgrid_init" if test "x$ac_cv_func_simgrid_init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_INIT 1 _ACEOF $as_echo "#define STARPU_SIMGRID_HAVE_SIMGRID_INIT 1" >>confdefs.h 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 for ac_func in sg_actor_sleep_for sg_actor_self sg_actor_ref sg_host_get_properties sg_host_send_to sg_host_sendto sg_cfg_set_int sg_actor_self_execute sg_actor_execute simgrid_get_clock 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 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 # Oldies for compatibility with older simgrid for ac_func in MSG_get_as_by_name MSG_zone_get_by_name MSG_environment_get_routing_root MSG_host_get_speed 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 $as_echo "#define STARPU_SIMGRID 1" >>confdefs.h # We won't bind or detect anything with_hwloc=no # disable mpi checks by default, they require static linking, we don't # want that by default default_enable_mpi_check=no # disable MPI support by default default_enable_mpi=no 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 x$enable_shared = xno ; then # When linking statically, libtool does not realize we need libstdc++ for simgrid_cpp.cpp SIMGRID_LIBS="$SIMGRID_LIBS -lstdc++" LIBS="$LIBS -lstdc++" fi # Simgrid 3.12 & 3.13 need -std=c++11 to be able to build anything in C++... case \ $CXXFLAGS\ in *\ -std=*\ *) ;; *) # Make sure our C++ compiler can compile simgrid headers SIMGRID_INCLUDES=" #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #include #elif defined(STARPU_HAVE_MSG_MSG_H) #include #endif #ifdef STARPU_HAVE_XBT_BASE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_VERSION_H #include #endif #ifdef STARPU_HAVE_SIMGRID_ZONE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_HOST_H #include #endif #include " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $SIMGRID_INCLUDES int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else CXXFLAGS="-std=c++11 $CXXFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; 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 # Check whether --enable-simgrid-mc was given. if test "${enable_simgrid_mc+set}" = set; then : enableval=$enable_simgrid_mc; enable_simgrid_mc=$enableval else enable_simgrid_mc=no fi if test x$enable_simgrid_mc = xyes ; then $as_echo "#define STARPU_SIMGRID_MC 1" >>confdefs.h # Extract the first word of "simgrid-mc", so it can be a program name with args. set dummy simgrid-mc; 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_SIMGRID_MC+:} false; then : $as_echo_n "(cached) " >&6 else case $SIMGRID_MC in [\\/]* | ?:[\\/]*) ac_cv_path_SIMGRID_MC="$SIMGRID_MC" # 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_SIMGRID_MC="$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_SIMGRID_MC" && ac_cv_path_SIMGRID_MC="no" ;; esac fi SIMGRID_MC=$ac_cv_path_SIMGRID_MC if test -n "$SIMGRID_MC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SIMGRID_MC" >&5 $as_echo "$SIMGRID_MC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi LDFLAGS="$LDFLAGS -Wl,-znorelro -Wl,-znoseparate-code" fi fi if test x$enable_simgrid_mc = xyes; then STARPU_SIMGRID_MC_TRUE= STARPU_SIMGRID_MC_FALSE='#' else STARPU_SIMGRID_MC_TRUE='#' STARPU_SIMGRID_MC_FALSE= 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 if test x$enable_blocking = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether worker callbacks should be enabled" >&5 $as_echo_n "checking whether worker callbacks should be enabled... " >&6; } # Check whether --enable-worker-callbacks was given. if test "${enable_worker_callbacks+set}" = set; then : enableval=$enable_worker_callbacks; enable_worker_cb=$enableval else enable_worker_cb=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_worker_cb" >&5 $as_echo "$enable_worker_cb" >&6; } else # worker sleep/wake-up callbacks only make sense if blocking drivers are enabled enable_worker_cb=no fi if test x$enable_worker_cb = xyes ; then $as_echo "#define STARPU_WORKER_CALLBACKS 1" >>confdefs.h fi ############################################################################### # # # LIBTOOLS # # # ############################################################################### #c++11 detection ax_cxx_compile_cxx11_required=false 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 ac_success=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual void f() {} }; struct Derived : public Base { virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x +std=c++11 "-h std=c++11"; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual void f() {} }; struct Derived : public Base { virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXX="$ac_save_CXX" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done 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 x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi fi if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi STARPU_HAVE_CXX11=$HAVE_CXX11 if test "$HAVE_CXX11" -eq 1; then STARPU_HAVE_CXX11_TRUE= STARPU_HAVE_CXX11_FALSE='#' else STARPU_HAVE_CXX11_TRUE='#' STARPU_HAVE_CXX11_FALSE= fi if test $HAVE_CXX11 -eq 1; then $as_echo "#define STARPU_HAVE_CXX11 1" >>confdefs.h 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.6' macro_revision='2.4.6' 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 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 no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) 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 no != "$lt_cv_path_NM"; 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 -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) 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; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # 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 17 != "$i" # 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"} 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 yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; 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 # that 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. if ( 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* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 ;; os2*) 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 one 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=cr} { $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 0 -eq "$ac_status"; 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 0 -ne "$ac_status"; 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 no = "$lt_cv_ar_at_file"; 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 bitrig* | 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 ia64 = "$host_cpu"; 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 if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # 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"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$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"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, # D for any global variable and I for any imported 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};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,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 $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && 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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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 yes = "$pipe_works"; 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 yes = "$GCC"; 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; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_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 dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode # options accordingly. 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 what ABI is being produced by ac_compile, and set linker # options accordingly. 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 yes = "$lt_cv_prog_gnu_ld"; 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* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. 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 emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. 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-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) 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-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) 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 yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. 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*|x86_64-*-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 yes != "$lt_cv_path_mainfest_tool"; 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 0 = "$_lt_result"; 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 cr libconftest.a conftest.o" >&5 $AR cr 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 0 = "$_lt_result" && $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[912]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } 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 # 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 shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # 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 set != "${COLLECT_NAMES+set}"; 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 func_cc_basename $compiler cc_basename=$func_cc_basename_result # 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 yes = "$GCC"; 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "$lt_cv_prog_compiler_rtti_exceptions"; 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 yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; 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' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; 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' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; 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' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' 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' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; 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 that 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "$lt_cv_prog_compiler_pic_works"; 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 yes = "$lt_cv_prog_compiler_static_works"; 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 no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; 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 no = "$hard_links"; 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" 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' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 tcc*) export_dynamic_flag_spec='-rdynamic' ;; 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 yes = "$supports_anon_versioning"; 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 cannot *** 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 no = "$ld_shlibs"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 set = "${lt_cv_aix_libpath+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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+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 yes = "$with_gnu_ld"; 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 archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 yes = "$lt_cv_prog_compiler__b"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 link_all_deplibs=no 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 ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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* | bitrig*) 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__`"; 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 archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$ld_shlibs" && 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 yes,yes = "$GCC,$enable_shared"; 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 yes = "$GCC"; 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` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac 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" elif test -n "$lt_multi_os_dir"; then 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $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 yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; 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 relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; 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 ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) 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 no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && 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 yes = "$cross_compiling"; 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 -fvisibility=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 yes = "$lt_cv_dlopen_self"; 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 yes = "$cross_compiling"; 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 -fvisibility=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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); 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 yes != "$_lt_caught_CXX_error"; 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 func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; 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 no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 yes = "$with_gnu_ld"; 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 ia64 = "$host_cpu"; 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive 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 if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+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 yes = "$with_gnu_ld"; 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 archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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 ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then if test no = "$with_gnu_ld"; 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 yes = "$supports_anon_versioning"; 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 ;; openbsd* | bitrig*) 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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 no = "$ld_shlibs_CXX" && 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 x-L = "$p" || test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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= ;; 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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; 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' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ia64 != "$host_cpu"; 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 that 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "$lt_cv_prog_compiler_pic_works_CXX"; 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 yes = "$lt_cv_prog_compiler_static_works_CXX"; 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 no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; 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 no = "$hard_links"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 no = "$ld_shlibs_CXX" && 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 yes,yes = "$GCC,$enable_shared"; 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $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 yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; 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 relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; 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 yes != "$_lt_caught_CXX_error" 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 no = "$F77"; 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 yes != "$_lt_disable_F77"; 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 func_cc_basename $compiler cc_basename=$func_cc_basename_result 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi lt_prog_compiler_pic_F77='-fPIC' ;; 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' case $host_os in os2*) lt_prog_compiler_static_F77='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; 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' case $host_os in os2*) lt_prog_compiler_static_F77='$wl-static' ;; esac ;; 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' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' 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' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; 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 that 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "$lt_cv_prog_compiler_pic_works_F77"; 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 yes = "$lt_cv_prog_compiler_static_works_F77"; 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 no = "$lt_cv_prog_compiler_c_o_F77" && test no != "$need_locks"; 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 no = "$hard_links"; 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported shrext_cmds=.dll archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" 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' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 tcc*) export_dynamic_flag_spec_F77='-rdynamic' ;; 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 yes = "$supports_anon_versioning"; 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 cannot *** 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 no = "$ld_shlibs_F77"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_F77=no hardcode_direct_absolute_F77=no ;; esac if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 set = "${lt_cv_aix_libpath+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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+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 yes = "$with_gnu_ld"; 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 archive_expsym_cmds_F77='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 link_all_deplibs_F77=no 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 ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs_F77=yes archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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* | bitrig*) 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__`"; 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 archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' 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 shrext_cmds=.dll archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_F77=yes ;; osf3*) if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$ld_shlibs_F77" && 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 yes,yes = "$GCC,$enable_shared"; 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_F77='-L$libdir' ;; # 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $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 yes = "$hardcode_automatic_F77"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_F77" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" && test no != "$hardcode_minus_L_F77"; 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 relink = "$hardcode_action_F77" || test yes = "$inherit_rpath_F77"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; 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 yes != "$_lt_disable_F77" 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 no = "$FC"; 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 yes != "$_lt_disable_FC"; 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 func_cc_basename $compiler cc_basename=$func_cc_basename_result 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 x-L = "$p" || test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' fi lt_prog_compiler_pic_FC='-fPIC' ;; 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' case $host_os in os2*) lt_prog_compiler_static_FC='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_FC='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; esac ;; 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' case $host_os in os2*) lt_prog_compiler_static_FC='$wl-static' ;; esac ;; 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' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' 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' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; 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 that 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "$lt_cv_prog_compiler_pic_works_FC"; 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 yes = "$lt_cv_prog_compiler_static_works_FC"; 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 no = "$lt_cv_prog_compiler_c_o_FC" && test no != "$need_locks"; 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 no = "$hard_links"; 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_FC='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 ;; os2*) hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes allow_undefined_flag_FC=unsupported shrext_cmds=.dll archive_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" 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' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 tcc*) export_dynamic_flag_spec_FC='-rdynamic' ;; 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 yes = "$supports_anon_versioning"; 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 cannot *** 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 no = "$ld_shlibs_FC"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_FC='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_FC=no hardcode_direct_absolute_FC=no ;; esac if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 set = "${lt_cv_aix_libpath+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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+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 yes = "$with_gnu_ld"; 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 archive_expsym_cmds_FC='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_FC='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 link_all_deplibs_FC=no 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 ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs_FC=yes archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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* | bitrig*) 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__`"; 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 archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' 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 shrext_cmds=.dll archive_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_FC=yes ;; osf3*) if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$ld_shlibs_FC" && 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 yes,yes = "$GCC,$enable_shared"; 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_FC='-L$libdir' ;; # 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $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 yes = "$hardcode_automatic_FC"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_FC" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" && test no != "$hardcode_minus_L_FC"; 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 relink = "$hardcode_action_FC" || test yes = "$inherit_rpath_FC"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; 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 yes != "$_lt_disable_FC" 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 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 # Extract the first word of "bash", so it can be a program name with args. set dummy bash; 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_REALBASH+:} false; then : $as_echo_n "(cached) " >&6 else case $REALBASH in [\\/]* | ?:[\\/]*) ac_cv_path_REALBASH="$REALBASH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="/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_REALBASH="$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 REALBASH=$ac_cv_path_REALBASH if test -n "$REALBASH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REALBASH" >&5 $as_echo "$REALBASH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Record git version # Extract the first word of "git", so it can be a program name with args. set dummy git; 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_gitcommand+:} false; then : $as_echo_n "(cached) " >&6 else case $gitcommand in [\\/]* | ?:[\\/]*) ac_cv_path_gitcommand="$gitcommand" # 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_gitcommand="$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 gitcommand=$ac_cv_path_gitcommand if test -n "$gitcommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gitcommand" >&5 $as_echo "$gitcommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$gitcommand" = "" ; then if test -f $srcdir/STARPU-REVISION ; then cp $srcdir/STARPU-REVISION . else echo "unknown" > ./STARPU-REVISION fi else git log -n 1 --pretty="%H" $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 ############################################################################### # # # MPI compilers # # # ############################################################################### #Check MPICC if test x$enable_simgrid = xyes ; then DEFAULT_MPICC=smpicc else DEFAULT_MPICC=mpicc fi # Check whether --with-mpicc was given. if test "${with_mpicc+set}" = set; then : withval=$with_mpicc; DEFAULT_MPICC=$withval fi case $DEFAULT_MPICC in /*) mpicc_path="$DEFAULT_MPICC" ;; *) # 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 ;; esac # We test if the MPICC compiler exists if test ! -x $mpicc_path; then { $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; } mpicc_path=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpicc is available" >&5 $as_echo_n "checking whether mpicc is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicc_path" >&5 $as_echo "$mpicc_path" >&6; } MPICC=$mpicc_path if test x$mpicc_path != xno ; then MPIPATH=$(dirname $mpicc_path):$PATH else MPIPATH=$PATH fi #Check MPICXX/MPIC++ if test x$enable_simgrid = xyes ; then DEFAULT_MPICXX=smpicxx else DEFAULT_MPICXX=mpicxx fi # Check whether --with-mpicxx was given. if test "${with_mpicxx+set}" = set; then : withval=$with_mpicxx; DEFAULT_MPICXX=$withval fi case $DEFAULT_MPICXX in /*) mpicxx_path="$DEFAULT_MPICXX" ;; *) # Extract the first word of "$DEFAULT_MPICXX", so it can be a program name with args. set dummy $DEFAULT_MPICXX; 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_mpicxx_path+:} false; then : $as_echo_n "(cached) " >&6 else case $mpicxx_path in [\\/]* | ?:[\\/]*) ac_cv_path_mpicxx_path="$mpicxx_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $MPIPATH 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_mpicxx_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_mpicxx_path" && ac_cv_path_mpicxx_path="no" ;; esac fi mpicxx_path=$ac_cv_path_mpicxx_path if test -n "$mpicxx_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicxx_path" >&5 $as_echo "$mpicxx_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; esac # try with mpic++ if mpicxx was not found if test x$mpicxx_path = xno ; then DEFAULT_MPICXX=mpic++ # Extract the first word of "$DEFAULT_MPICXX", so it can be a program name with args. set dummy $DEFAULT_MPICXX; 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_mpicxx_path+:} false; then : $as_echo_n "(cached) " >&6 else case $mpicxx_path in [\\/]* | ?:[\\/]*) ac_cv_path_mpicxx_path="$mpicxx_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $MPIPATH 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_mpicxx_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_mpicxx_path" && ac_cv_path_mpicxx_path="no" ;; esac fi mpicxx_path=$ac_cv_path_mpicxx_path if test -n "$mpicxx_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicxx_path" >&5 $as_echo "$mpicxx_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # We test if the MPICXX/MPIC++ compiler exists if test ! -x $mpicxx_path; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpicxx compiler '$mpicxx_path' does not have the execute permission" >&5 $as_echo "The mpicxx compiler '$mpicxx_path' does not have the execute permission" >&6; } mpicxx_path=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpicxx is available" >&5 $as_echo_n "checking whether mpicxx is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicxx_path" >&5 $as_echo "$mpicxx_path" >&6; } MPICXX=$mpicxx_path # Check if mpiexec is available if test x$enable_simgrid = xyes ; then DEFAULT_MPIEXEC=smpirun # Check whether --with-smpirun was given. if test "${with_smpirun+set}" = set; then : withval=$with_smpirun; DEFAULT_MPIEXEC=$withval fi else DEFAULT_MPIEXEC=mpiexec # Check whether --with-mpiexec was given. if test "${with_mpiexec+set}" = set; then : withval=$with_mpiexec; DEFAULT_MPIEXEC=$withval fi fi case $DEFAULT_MPIEXEC in /*) mpiexec_path="$DEFAULT_MPIEXEC" ;; *) # Extract the first word of "$DEFAULT_MPIEXEC", so it can be a program name with args. set dummy $DEFAULT_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 for as_dir in $MPIPATH 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 esac { $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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpiexec script '$mpiexec_path' is not valid" >&5 $as_echo "The mpiexec script '$mpiexec_path' is not valid" >&6; } default_enable_mpi_check=no mpiexec_path="" fi MPIEXEC=$mpiexec_path ############################################################################### # # # MPI # # # ############################################################################### # Check whether --enable-mpi was given. if test "${enable_mpi+set}" = set; then : enableval=$enable_mpi; enable_mpi=$enableval else enable_mpi=$default_enable_mpi fi if test x$enable_mpi = xmaybe ; then if test -x "$mpicc_path"; then enable_mpi=yes else enable_mpi=no fi fi # in case MPI was explicitely required, but mpicc is not available, this is an error if test x$enable_mpi = xyes -a ! -x "$mpicc_path"; then as_fn_error $? "Compiler MPI '$mpicc_path' not valid" "$LINENO" 5 fi build_mpi_lib=$enable_mpi ############################################################################### # # # NEW MADELEINE # # # ############################################################################### # Check whether --enable-nmad was given. if test "${enable_nmad+set}" = set; then : enableval=$enable_nmad; enable_nmad=$enableval else enable_nmad=no fi build_nmad_lib=no CC_OR_MPICC=$cc_or_mpicc #We can only build StarPU MPI Library if User wants it and MPI is available if test x$enable_mpi = xyes -a x$enable_nmad = xyes ; then build_nmad_lib=yes build_mpi_lib=no pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NMAD" >&5 $as_echo_n "checking for NMAD... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$NMAD_CFLAGS"; then pkg_cv_NMAD_CFLAGS="$NMAD_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nmad\""; } >&5 ($PKG_CONFIG --exists --print-errors "nmad") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NMAD_CFLAGS=`$PKG_CONFIG --cflags "nmad" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$NMAD_LIBS"; then pkg_cv_NMAD_LIBS="$NMAD_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nmad\""; } >&5 ($PKG_CONFIG --exists --print-errors "nmad") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NMAD_LIBS=`$PKG_CONFIG --libs "nmad" 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 NMAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "nmad"` else NMAD_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "nmad"` fi # Put the nasty error message in config.log where it belongs echo "$NMAD_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (nmad) were not met: $NMAD_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 NMAD_CFLAGS and NMAD_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 NMAD_CFLAGS and NMAD_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 NMAD_CFLAGS=$pkg_cv_NMAD_CFLAGS NMAD_LIBS=$pkg_cv_NMAD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi ac_fn_c_check_decl "$LINENO" "piom_ltask_set_bound_thread_os_indexes" "ac_cv_have_decl_piom_ltask_set_bound_thread_os_indexes" "#include " if test "x$ac_cv_have_decl_piom_ltask_set_bound_thread_os_indexes" = xyes; then : have_piom_ltask_set_bound_thread_os_indexes=yes else have_piom_ltask_set_bound_thread_os_indexes=no fi if test x$have_piom_ltask_set_bound_thread_os_indexes = xyes; then $as_echo "#define HAVE_PIOM_LTASK_SET_BOUND_THREAD_OS_INDEXES 1" >>confdefs.h fi else build_nmad_lib=no fi ############################################################################### # # # MPI Master Slave # # # ############################################################################### # Check whether --enable-mpi-master-slave was given. if test "${enable_mpi_master_slave+set}" = set; then : enableval=$enable_mpi_master_slave; use_mpi_master_slave=$enableval else use_mpi_master_slave=no fi #We can only build MPI Master Slave if User wants it and MPI compiler are available if test x$use_mpi_master_slave = xyes -a x$mpicc_path != xno -a x${mpicxx_path} != xno ; then build_mpi_master_slave=yes else build_mpi_master_slave=no fi #users cannot use both at the same time if test x$build_mpi_master_slave = xyes -a x$enable_mpi = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: StarPU-MPI and MPI Master-Slave cannot be used at the same time ! Disabling StarPU-MPI..." >&5 $as_echo "$as_me: WARNING: StarPU-MPI and MPI Master-Slave cannot be used at the same time ! Disabling StarPU-MPI..." >&2;} build_mpi_lib=no build_nmad_lib=no enable_mpi=no fi if test x$build_mpi_master_slave = xyes; then $as_echo "#define STARPU_USE_MPI_MASTER_SLAVE 1" >>confdefs.h CC=$mpicc_path CCLD=$mpicc_path CXX=$mpicxx_path CXXLD=mpicxx_path fi # Check whether --with-mpi-master-slave-multiple-thread was given. if test "${with_mpi_master_slave_multiple_thread+set}" = set; then : withval=$with_mpi_master_slave_multiple_thread; $as_echo "#define STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the master-slave mode should be enabled" >&5 $as_echo_n "checking whether the master-slave mode should be enabled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_mpi_master_slave" >&5 $as_echo "$build_mpi_master_slave" >&6; } if test x$build_mpi_master_slave = xyes; then STARPU_USE_MPI_MASTER_SLAVE_TRUE= STARPU_USE_MPI_MASTER_SLAVE_FALSE='#' else STARPU_USE_MPI_MASTER_SLAVE_TRUE='#' STARPU_USE_MPI_MASTER_SLAVE_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of MPI master-slave devices" >&5 $as_echo_n "checking maximum number of MPI master-slave devices... " >&6; } # Check whether --enable-maxmpidev was given. if test "${enable_maxmpidev+set}" = set; then : enableval=$enable_maxmpidev; nmaxmpidev=$enableval else if test x$build_mpi_master_slave = xyes; then nmaxmpidev=4 else nmaxmpidev=0 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxmpidev" >&5 $as_echo "$nmaxmpidev" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXMPIDEVS $nmaxmpidev _ACEOF ############################################################################### # # # Miscellaneous things for MPI # # # ############################################################################### # Check whether --enable-mpi-pedantic-isend was given. if test "${enable_mpi_pedantic_isend+set}" = set; then : enableval=$enable_mpi_pedantic_isend; enable_mpi_pedantic_isend=$enableval else enable_mpi_pedantic_isend=no fi if test x$enable_mpi_pedantic_isend = xyes; then $as_echo "#define STARPU_MPI_PEDANTIC_ISEND 1" >>confdefs.h fi # 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; enable_mpi_check=$enableval else enable_mpi_check=$default_enable_mpi_check fi running_mpi_check=no if test -d "$srcdir/.git" -o -f "$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 if test x$enable_mpi = xno ; then running_mpi_check=no 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 { $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; } { $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: $build_mpi_lib" >&5 $as_echo "$build_mpi_lib" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the StarPU MPI nmad library should be generated" >&5 $as_echo_n "checking whether the StarPU MPI nmad library should be generated... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_nmad_lib" >&5 $as_echo "$build_nmad_lib" >&6; } if test x$build_mpi_lib = xyes -o x$build_nmad_lib = xyes ; then $as_echo "#define STARPU_USE_MPI 1" >>confdefs.h if test x$build_mpi_lib = xyes ; then $as_echo "#define STARPU_USE_MPI_MPI 1" >>confdefs.h else $as_echo "#define STARPU_USE_MPI_NMAD 1" >>confdefs.h fi fi if test x$enable_mpi = xyes ; then if test x$enable_simgrid = xyes ; then if test x$enable_shared = xyes ; then as_fn_error $? "MPI with simgrid can not work with shared libraries, use --disable-shared to fix this, or disable MPI with --disable-mpi" "$LINENO" 5 else CFLAGS="$CFLAGS -fPIC" CXXFLAGS="$CXXFLAGS -fPIC" NVCCFLAGS="$NVCCFLAGS --compiler-options -fPIC" FFLAGS="$FFLAGS -fPIC" FCLAGS="$FFLAGS -fPIC" fi fi fi if test x$build_mpi_lib = xyes; then STARPU_USE_MPI_MPI_TRUE= STARPU_USE_MPI_MPI_FALSE='#' else STARPU_USE_MPI_MPI_TRUE='#' STARPU_USE_MPI_MPI_FALSE= fi if test x$build_nmad_lib = xyes; then STARPU_USE_MPI_NMAD_TRUE= STARPU_USE_MPI_NMAD_FALSE='#' else STARPU_USE_MPI_NMAD_TRUE='#' STARPU_USE_MPI_NMAD_FALSE= fi if test x$build_nmad_lib = xyes -o x$build_mpi_lib = xyes; then STARPU_USE_MPI_TRUE= STARPU_USE_MPI_FALSE='#' else STARPU_USE_MPI_TRUE='#' STARPU_USE_MPI_FALSE= 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 { $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 if test x$enable_mpi = xyes -o x$build_mpi_master_slave = 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. # openmpi version MPICC_LDFLAGS=`$mpicc_path --showme:link 2>/dev/null` if test -z "$MPICC_LDFLAGS" then # mpich version MPICC_LDFLAGS=`$mpicc_path -link_info | awk '{$1=""; print}'` fi else cc_or_mpicc=$CC fi CC_OR_MPICC=$cc_or_mpicc ############################################################################### # # # 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 ############################################################################### ############################################################################### # # # NUMA memory nodes # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of NUMA nodes" >&5 $as_echo_n "checking maximum number of NUMA nodes... " >&6; } # Check whether --enable-maxnumanodes was given. if test "${enable_maxnumanodes+set}" = set; then : enableval=$enable_maxnumanodes; nmaxnumanodes=$enableval else nmaxnumanodes=2 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxnumanodes" >&5 $as_echo "$nmaxnumanodes" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXNUMANODES $nmaxnumanodes _ACEOF ############################################################################### 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*|*-*-msys*) 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 : LIBS="$LIBS -lpthread" STARPU_EXPORTED_LIBS="$STARPU_EXPORTED_LIBS -lpthread" 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 for ac_func in scandir do : ac_fn_c_check_func "$LINENO" "scandir" "ac_cv_func_scandir" if test "x$ac_cv_func_scandir" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCANDIR 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 copy_file_range do : ac_fn_c_check_func "$LINENO" "copy_file_range" "ac_cv_func_copy_file_range" if test "x$ac_cv_func_copy_file_range" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_COPY_FILE_RANGE 1 _ACEOF fi done 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 # Check whether --enable-hdf5 was given. if test "${enable_hdf5+set}" = set; then : enableval=$enable_hdf5; enable_hdf5=$enableval else enable_hdf5=no fi if test "x$enable_hdf5" != xno ; then # Check whether --with-hdf5-include-dir was given. if test "${with_hdf5_include_dir+set}" = set; then : withval=$with_hdf5_include_dir; hdf5_include_dir="$withval" else hdf5_include_dir="" fi hdf5_inc_dir="/usr/include/hdf5 /usr/include/hdf5/serial ${hdf5_include_dir}" enable_include_hdf5=no for f in $hdf5_inc_dir; do if test -n "$f" ; then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="$CPPFLAGS -I$f" for ac_header in hdf5.h do : ac_fn_c_check_header_mongrel "$LINENO" "hdf5.h" "ac_cv_header_hdf5_h" "$ac_includes_default" if test "x$ac_cv_header_hdf5_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_HDF5_H 1 _ACEOF fi done if test "$ac_cv_header_hdf5_h" = "yes" ; then CPPFLAGS="-I${f} ${SAVED_CFLAGS}" enable_include_hdf5=yes break else CPPFLAGS=${SAVED_CPPFLAGS} fi unset ac_cv_header_hdf5_h fi done # Check whether --with-hdf5-lib-dir was given. if test "${with_hdf5_lib_dir+set}" = set; then : withval=$with_hdf5_lib_dir; hdf5_libraries_dir="$withval" else hdf5_libraries_dir="" fi hdf5_lib_dir="/usr/lib/x86_64-linux-gnu/hdf5 /usr/lib/x86_64-linux-gnu/hdf5/serial ${hdf5_libraries_dir}" enable_libraries_hdf5=no for f in $hdf5_lib_dir; do if test -n "$f" ; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS=-L${f} _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lhdf5" >&5 $as_echo_n "checking for main in -lhdf5... " >&6; } if ${ac_cv_lib_hdf5_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhdf5 $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_hdf5_main=yes else ac_cv_lib_hdf5_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_hdf5_main" >&5 $as_echo "$ac_cv_lib_hdf5_main" >&6; } if test "x$ac_cv_lib_hdf5_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBHDF5 1 _ACEOF LIBS="-lhdf5 $LIBS" fi STARPU_HDF5_LDFLAGS="$STARPU_HDF5_LDFLAGS $LIBS" LIBS=$_LIBS_SAV if test "$ac_cv_lib_hdf5_main" = "yes" ; then LDFLAGS="-L${f} ${SAVED_LDFLAGS} ${STARPU_HDF5_LDFLAGS}" enable_libraries_hdf5=yes break else LDFLAGS=${SAVED_LDFLAGS} fi unset ac_cv_lib_hdf5_main fi done fi if test "x$enable_libraries_hdf5" = "xyes" -a "x$enable_include_hdf5" = "xyes" -a "x$enable_hdf5" != "xno"; then $as_echo "#define STARPU_HAVE_HDF5 1" >>confdefs.h enable_hdf5=yes else enable_hdf5=no fi if test "x$enable_hdf5" = "xyes"; then STARPU_HAVE_HDF5_TRUE= STARPU_HAVE_HDF5_FALSE='#' else STARPU_HAVE_HDF5_TRUE='#' STARPU_HAVE_HDF5_FALSE= fi # 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_ATOMIC_COMPARE_EXCHANGE_N { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __atomic_compare_exchange_n" >&5 $as_echo_n "checking whether the target supports __atomic_compare_exchange_n... " >&6; } if ${ac_cv_have_atomic_compare_exchange_n+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar, baz; int main () { baz = __atomic_compare_exchange_n(&foo, &bar, 1, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_atomic_compare_exchange_n=yes else ac_cv_have_atomic_compare_exchange_n=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_atomic_compare_exchange_n" >&5 $as_echo "$ac_cv_have_atomic_compare_exchange_n" >&6; } if test $ac_cv_have_atomic_compare_exchange_n = yes; then $as_echo "#define STARPU_HAVE_ATOMIC_COMPARE_EXCHANGE_N 1" >>confdefs.h fi # This defines HAVE_ATOMIC_EXCHANGE_N { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __atomic_exchange_n" >&5 $as_echo_n "checking whether the target supports __atomic_exchange_n... " >&6; } if ${ac_cv_have_atomic_exchange_n+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __atomic_exchange_n(&foo, 1, __ATOMIC_SEQ_CST); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_atomic_exchange_n=yes else ac_cv_have_atomic_exchange_n=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_atomic_exchange_n" >&5 $as_echo "$ac_cv_have_atomic_exchange_n" >&6; } if test $ac_cv_have_atomic_exchange_n = yes; then $as_echo "#define STARPU_HAVE_ATOMIC_EXCHANGE_N 1" >>confdefs.h fi # This defines HAVE_ATOMIC_FETCH_ADD { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __atomic_fetch_add" >&5 $as_echo_n "checking whether the target supports __atomic_fetch_add... " >&6; } if ${ac_cv_have_atomic_fetch_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 = __atomic_fetch_add(&foo, 1, __ATOMIC_SEQ_CST); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_atomic_fetch_add=yes else ac_cv_have_atomic_fetch_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_atomic_fetch_add" >&5 $as_echo "$ac_cv_have_atomic_fetch_add" >&6; } if test $ac_cv_have_atomic_fetch_add = yes; then $as_echo "#define STARPU_HAVE_ATOMIC_FETCH_ADD 1" >>confdefs.h fi # This defines HAVE_ATOMIC_FETCH_OR { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __atomic_fetch_or" >&5 $as_echo_n "checking whether the target supports __atomic_fetch_or... " >&6; } if ${ac_cv_have_atomic_fetch_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 = __atomic_fetch_or(&foo, 1, __ATOMIC_SEQ_CST); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_atomic_fetch_or=yes else ac_cv_have_atomic_fetch_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_atomic_fetch_or" >&5 $as_echo "$ac_cv_have_atomic_fetch_or" >&6; } if test $ac_cv_have_atomic_fetch_or = yes; then $as_echo "#define STARPU_HAVE_ATOMIC_FETCH_OR 1" >>confdefs.h fi # This defines HAVE_ATOMIC_TEST_AND_SET { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __atomic_test_and_set" >&5 $as_echo_n "checking whether the target supports __atomic_test_and_set... " >&6; } if ${ac_cv_have_atomic_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 = __atomic_test_and_set(&foo, __ATOMIC_SEQ_CST); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_atomic_test_and_set=yes else ac_cv_have_atomic_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_atomic_test_and_set" >&5 $as_echo "$ac_cv_have_atomic_test_and_set" >&6; } if test $ac_cv_have_atomic_test_and_set = yes; then $as_echo "#define STARPU_HAVE_ATOMIC_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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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 library is available in $__cuda_L" >&5 $as_echo_n "checking whether CUDA library is available in $__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 -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 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} -lcudart" 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 -lcudart" STARPU_CUFFT_LDFLAGS="-lcufft" 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 case \ $NVCCFLAGS\ in *\ -std=*\ *) ;; *) SAVED_CXX="$CXX" CXX="$NVCC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #include #else #include #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else NVCCFLAGS="-std=c++11 $NVCCFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXX="$SAVED_CXX" 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 "$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 missing from existing flags if test x$SIZEOF_VOID_P = x8; then case \ $NVCCFLAGS\ in *\ -m64\ *) ;; *) NVCCFLAGS="${NVCCFLAGS} -m64" ;; esac fi SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${STARPU_CUDA_CPPFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" SAVED_LIBS="${LIBS}" 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 : $as_echo "#define HAVE_LIBCUSPARSE 1" >>confdefs.h STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcusparse" 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 LIBS="${LIBS} -lnvidia-ml" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { nvmlInit(); ; 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 () { nvmlInit(); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : have_valid_nvml="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: NVML found and can be compiled, but compiled application can not be run, you are probably on a machine without the CUDA driver" >&5 $as_echo "NVML found and can be compiled, but compiled application can not be run, you are probably on a machine without the CUDA driver" >&6; } have_valid_nvml="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_echo "$as_me:${as_lineno-$LINENO}: WARNING: NVML found, but nvml.h could not be compiled" >&5 $as_echo "$as_me: WARNING: NVML found, but nvml.h could not be compiled" >&2;} have_valid_nvml="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$have_valid_nvml = xyes ; then ac_fn_c_check_decl "$LINENO" "nvmlDeviceGetTotalEnergyConsumption" "ac_cv_have_decl_nvmlDeviceGetTotalEnergyConsumption" "#include " if test "x$ac_cv_have_decl_nvmlDeviceGetTotalEnergyConsumption" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_NVMLDEVICEGETTOTALENERGYCONSUMPTION $ac_have_decl _ACEOF if test $ac_have_decl = 1; then : for ac_func in nvmlDeviceGetTotalEnergyConsumption do : ac_fn_c_check_func "$LINENO" "nvmlDeviceGetTotalEnergyConsumption" "ac_cv_func_nvmlDeviceGetTotalEnergyConsumption" if test "x$ac_cv_func_nvmlDeviceGetTotalEnergyConsumption" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NVMLDEVICEGETTOTALENERGYCONSUMPTION 1 _ACEOF fi done fi $as_echo "#define STARPU_HAVE_LIBNVIDIA_ML 1" >>confdefs.h STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lnvidia-ml" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvidia-ml should be used" >&5 $as_echo_n "checking whether nvidia-ml should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_valid_nvml" >&5 $as_echo "$have_valid_nvml" >&6; } CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}" 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=$enable_cuda fi if test x$enable_cuda_memcpy_peer = xyes; then $as_echo "#define STARPU_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asynchronous MPI Master Slave copy should be disabled" >&5 $as_echo_n "checking whether asynchronous MPI Master Slave copy should be disabled... " >&6; } # Check whether --enable-asynchronous-mpi-master-slave-copy was given. if test "${enable_asynchronous_mpi_master_slave_copy+set}" = set; then : enableval=$enable_asynchronous_mpi_master_slave_copy; enable_asynchronous_mpi_master_slave_copy=$enableval else enable_asynchronous_mpi_master_slave_copy=yes fi disable_asynchronous_mpi_master_slave_copy=no if test x$enable_asynchronous_mpi_master_slave_copy = xno ; then disable_asynchronous_mpi_master_slave_copy=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $disable_asynchronous_mpi_master_slave_copy" >&5 $as_echo "$disable_asynchronous_mpi_master_slave_copy" >&6; } if test x$disable_asynchronous_mpi_master_slave_copy = xyes ; then $as_echo "#define STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY 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 if test x$enable_mic = xyes; then nmaxmicdev=4 else nmaxmicdev=0 fi 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 ############################################################################### # # # 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" FFLAGS="$FFLAGS -O0" FCFLAGS="$FCFLAGS -O0" enable_spinlock_check=yes if test x$GCC = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler support -Og" >&5 $as_echo_n "checking whether C compiler support -Og... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Og" 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 -Og" { $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" 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 whether CXX compiler support -Og" >&5 $as_echo_n "checking whether CXX compiler support -Og... " >&6; } SAVED_CXXFLAGS="$CXXFLAGS" CXXFLAGS="-Og" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CXXFLAGS -Og" { $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 CXXFLAGS="$SAVED_CXXFLAGS" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Fortran 77 compiler support -Og" >&5 $as_echo_n "checking whether Fortran 77 compiler support -Og... " >&6; } SAVED_FFLAGS="$FFLAGS" FFLAGS="-Og" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : GLOBAL_AM_FFLAGS="$GLOBAL_AM_FFLAGS -Og" { $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 FFLAGS="$SAVED_FFLAGS" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Fortran compiler support -Og" >&5 $as_echo_n "checking whether Fortran compiler support -Og... " >&6; } SAVED_FCFLAGS="$FCFLAGS" FCFLAGS="-Og" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : GLOBAL_AM_FCFLAGS="$GLOBAL_AM_FCFLAGS -Og" { $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 FCFLAGS="$SAVED_FCFLAGS" 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 x$starpu_windows != xyes ; then if test x$enable_fstack_protector_all = xyes ; then CFLAGS="$CFLAGS -fstack-protector-all" CXXFLAGS="$CXXFLAGS -fstack-protector-all" FFLAGS="$FFLAGS -fstack-protector-all" FCFLAGS="$FCFLAGS -fstack-protector-all" fi fi fi else CFLAGS="-O3 $CFLAGS" CXXFLAGS="-O3 $CXXFLAGS" FFLAGS="-O3 $FFLAGS" FCFLAGS="-O3 $FCFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gdb information should be enabled" >&5 $as_echo_n "checking whether gdb information should be enabled... " >&6; } # Check whether --enable-gdb was given. if test "${enable_gdb+set}" = set; then : enableval=$enable_gdb; enable_gdb=$enableval else enable_gdb=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gdb" >&5 $as_echo "$enable_gdb" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether full gdb information should be enabled" >&5 $as_echo_n "checking whether full gdb information should be enabled... " >&6; } # Check whether --enable-full-gdb-information was given. if test "${enable_full_gdb_information+set}" = set; then : enableval=$enable_full_gdb_information; enable_full_gdb_information=$enableval else enable_full_gdb_information=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_full_gdb_information" >&5 $as_echo "$enable_full_gdb_information" >&6; } if test x$enable_gdb = xyes; then if test x$enable_full_gdb_information = xyes -a x$GCC = xyes; then CFLAGS+=" -gdwarf-2 -g3" CXXFLAGS+=" -gdwarf-2 -g3" FFLAGS+=" -gdwarf-2 -g3" FCFLAGS+=" -gdwarf-2 -g3" LDFLAGS+=" -gdwarf-2 -g3" else CFLAGS+=" -g " CXXFLAGS+=" -g " FFLAGS+=" -g " FCFLAGS+=" -g " LDFLAGS+=" -g " fi else CFLAGS+=" -g0 " CXXFLAGS+=" -g0 " FFLAGS+=" -g0 " FCFLAGS+=" -g0 " LDFLAGS+=" -g0 " fi 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 # fortify gets really enabled only with optimizations, avoid enabling it # when optimizations are not enabled, because with some glibc it # spews a lot of warnings. if test x$enable_debug != xyes; then if test x$GCC = xyes; then CPPFLAGS="-D_FORTIFY_SOURCE=1 $CPPFLAGS" 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" FFLAGS="${FFLAGS} --coverage" FCFLAGS="${FCFLAGS} --coverage" LDFLAGS="${LDFLAGS} --coverage" LIBS="${LIBS} -lgcov" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether coverity mode should be enabled" >&5 $as_echo_n "checking whether coverity mode should be enabled... " >&6; } # Check whether --enable-coverity was given. if test "${enable_coverity+set}" = set; then : enableval=$enable_coverity; enable_coverity=$enableval else enable_coverity=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_coverity" >&5 $as_echo "$enable_coverity" >&6; } if test x$enable_coverity = xyes; then STARPU_COVERITY_TRUE= STARPU_COVERITY_FALSE='#' else STARPU_COVERITY_TRUE='#' STARPU_COVERITY_FALSE= 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 fxt_close do : ac_fn_c_check_func "$LINENO" "fxt_close" "ac_cv_func_fxt_close" if test "x$ac_cv_func_fxt_close" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FXT_CLOSE 1 _ACEOF fi done 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 for ac_func in fut_setup_flush_callback do : ac_fn_c_check_func "$LINENO" "fut_setup_flush_callback" "ac_cv_func_fut_setup_flush_callback" if test "x$ac_cv_func_fut_setup_flush_callback" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FUT_SETUP_FLUSH_CALLBACK 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 ac_fn_c_check_decl "$LINENO" "fut_setup_flush_callback" "ac_cv_have_decl_fut_setup_flush_callback" "#include " if test "x$ac_cv_have_decl_fut_setup_flush_callback" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FUT_SETUP_FLUSH_CALLBACK $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; } have_valid_poti=no elif test $pkg_failed = untried; then have_valid_poti=no 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; } have_valid_poti=yes fi # Check whether --enable-poti was given. if test "${enable_poti+set}" = set; then : enableval=$enable_poti; enable_poti=$enableval else enable_poti=no fi if test x$enable_poti = xyes -a x$have_valid_poti = xyes ; then $as_echo "#define STARPU_HAVE_POTI 1" >>confdefs.h save_LIBS="$LIBS" LIBS="$LIBS $POTI_LIBS" for ac_func in poti_init_custom poti_user_NewEvent 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 LIBS="$save_LIBS" FXT_CFLAGS="$FXT_CFLAGS $POTI_CFLAGS" FXT_LIBS="$FXT_LIBS $POTI_LIBS" fi 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 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 memory nodes to use per MPI rank" >&5 $as_echo_n "checking maximum number of memory nodes to use per MPI rank... " >&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 + $nmaxmpidev` else # We have one memory node shared by all CPU workers, one node per GPU # and per MIC device # we add nodes to use 2 memory disks nodes=`expr $nmaxnumanodes + 2` 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 #nmaxmpidev = 0 if mpi master-slave is disabled nodes=`expr $nodes + $nmaxmpidev` 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_echo "$as_me:${as_lineno-$LINENO}: WARNING: Note: the wt_mask feature only supports 32 memory nodes" >&5 $as_echo "$as_me: WARNING: Note: the wt_mask feature only supports 32 memory nodes" >&2;} 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 #By default, if we cannot build mpi master-slave nmaxmpidev is set to zero. #But with the multiplication with maxcpus, we need to put it to one. if test x$build_mpi_master_slave != xyes; then nmaxmpidev=1 fi fi nmaxworkers=`expr 16 \* \( \( \( $nmaxmpidev \* $maxcpus \) + $nmaxcudadev + $nmaxopencldev + $nmaxmicthreads + 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 ############################################################################### # # # MP Common settings # # # ############################################################################### if test "x$enable_mic" = "xyes" -o "x$build_mpi_master_slave" = "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$build_mpi_master_slave = 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 ############################################################################### # # # Flags for C Compiler # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler support -Wall" >&5 $as_echo_n "checking whether C compiler support -Wall... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wall" 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 C compiler support -Werror=implicit" >&5 $as_echo_n "checking whether C compiler support -Werror=implicit... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=implicit" 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 C compiler support -Werror=implicit-function-declaration" >&5 $as_echo_n "checking whether C compiler support -Werror=implicit-function-declaration... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=implicit-function-declaration" 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 C compiler support -no-pie" >&5 $as_echo_n "checking whether C compiler support -no-pie... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-no-pie" 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 C compiler support -no-PIE" >&5 $as_echo_n "checking whether C compiler support -no-PIE... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-no-PIE" 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 C compiler support -fno-pie" >&5 $as_echo_n "checking whether C compiler support -fno-pie... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-fno-pie" 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 C compiler support -Wextra" >&5 $as_echo_n "checking whether C compiler support -Wextra... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wextra" 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 C compiler support -Wunused" >&5 $as_echo_n "checking whether C compiler support -Wunused... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wunused" 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 C compiler support -Wundef" >&5 $as_echo_n "checking whether C compiler support -Wundef... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wundef" 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 C compiler support -Wshadow" >&5 $as_echo_n "checking whether C compiler support -Wshadow... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wshadow" 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 C compiler support -Werror=pointer-arith" >&5 $as_echo_n "checking whether C compiler support -Werror=pointer-arith... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=pointer-arith" 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler support -fno-common" >&5 $as_echo_n "checking whether C compiler support -fno-common... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-fno-common" 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-common" { $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_debug = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler support -fno-optimize-sibling-calls" >&5 $as_echo_n "checking whether C compiler support -fno-optimize-sibling-calls... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-fno-optimize-sibling-calls" 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-optimize-sibling-calls" { $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 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" # Check whether --with-check-flags was given. if test "${with_check_flags+set}" = set; then : withval=$with_check_flags; check_flags=$withval else check_flags="" fi if test "x$check_flags" != "x" ; then for xflag in $check_flags do { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler support $x" >&5 $as_echo_n "checking whether C compiler support $x... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="$x" 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 $x" { $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" 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 whether CXX compiler support $x" >&5 $as_echo_n "checking whether CXX compiler support $x... " >&6; } SAVED_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$x" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CXXFLAGS $x" { $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 CXXFLAGS="$SAVED_CXXFLAGS" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Fortran 77 compiler support $x" >&5 $as_echo_n "checking whether Fortran 77 compiler support $x... " >&6; } SAVED_FFLAGS="$FFLAGS" FFLAGS="$x" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : GLOBAL_AM_FFLAGS="$GLOBAL_AM_FFLAGS $x" { $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 FFLAGS="$SAVED_FFLAGS" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Fortran compiler support $x" >&5 $as_echo_n "checking whether Fortran compiler support $x... " >&6; } SAVED_FCFLAGS="$FCFLAGS" FCFLAGS="$x" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : GLOBAL_AM_FCFLAGS="$GLOBAL_AM_FCFLAGS $x" { $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 FCFLAGS="$SAVED_FCFLAGS" 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 done fi ############################################################################### # # # 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 use_mpi_fort=no 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_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 OLD_FCFLAGS="$FCFLAGS" FCFLAGS="$FCFLAGS -cpp" cat > conftest.$ac_ext <<_ACEOF program main #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9) #error GFortran too old, version >= 4.9.x needed, Fortran examples will not be built #endif end _ACEOF if ac_fn_fc_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 FCFLAGS="$OLD_FCFLAGS" 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 "$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 enable_build_fortran="yes" 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;} enable_build_fortran="yes" fi fi fi if test "x$enable_build_fortran" = "xyes" ; then $as_echo "#define STARPU_HAVE_FC 1" >>confdefs.h if test x$build_mpi_lib = xyes -o x$build_nmad_lib = xyes -o x$build_mpi_master_slave = xyes ; then #Check MPIFORT if test x$enable_simgrid = xyes ; then DEFAULT_MPIFORT=smpifort else DEFAULT_MPIFORT=mpifort fi # Check whether --with-mpifort was given. if test "${with_mpifort+set}" = set; then : withval=$with_mpifort; DEFAULT_MPIFORT=$withval fi case $DEFAULT_MPIFORT in /*) mpifort_path="$DEFAULT_MPIFORT" ;; *) # 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="$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 ;; esac # We test if the MPIFORT compiler exists if test ! -x $mpifort_path; then { $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; } mpifort_path=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 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpifort is available" >&5 $as_echo_n "checking whether mpifort is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpifort_path" >&5 $as_echo "$mpifort_path" >&6; } MPIFORT=$mpifort_path if test x$mpifort_path != xno ; then MPIPATH=$(dirname $mpifort_path):$PATH else MPIPATH=$PATH 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 #We have MPI C/C++ compiler if test x$build_mpi_master_slave = xyes; then #Check if we can compile fortran cases if test x$use_mpi_fort = xyes ; then F77LD=$mpifort_path FCLD=$mpifort_path F77=$mpifort_path FC=$mpifort_path else 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 ######################################################################## # # # Cluster support # # # ######################################################################## # Check whether --enable-cluster was given. if test "${enable_cluster+set}" = set; then : enableval=$enable_cluster; enable_cluster=$enableval else enable_cluster=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cluster support" >&5 $as_echo_n "checking for cluster support... " >&6; } if test x$enable_cluster = xyes; then $as_echo "#define STARPU_CLUSTER 1" >>confdefs.h 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 fi if test "x$enable_cluster" = "xyes"; then STARPU_CLUSTER_TRUE= STARPU_CLUSTER_FALSE='#' else STARPU_CLUSTER_TRUE='#' STARPU_CLUSTER_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cluster" >&5 $as_echo "$enable_cluster" >&6; } ############################################################################### # # # 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 openmp_msg="" if test x$starpu_windows = xyes ; then enable_openmp=no openmp_msg="disabled on windows" fi if test "x$use_mpi_master_slave" = "xyes" ; then enable_openmp=no openmp_msg="incompatibility with MPI master slave support" fi if test x$enable_openmp = xyes; then $as_echo "#define STARPU_OPENMP 1" >>confdefs.h 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 STARPU_OPENMP_TRUE= STARPU_OPENMP_FALSE='#' else STARPU_OPENMP_TRUE='#' STARPU_OPENMP_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_openmp $openmp_msg" >&5 $as_echo "$enable_openmp $openmp_msg" >&6; } if test x$enable_simgrid = xno; then if test -n "{OPENMP_CFLAGS}"; then CFLAGS="${CFLAGS} ${OPENMP_CFLAGS}" STARPU_OMP_LDFLAGS="${OPENMP_CFLAGS}" fi fi if test x$enable_simgrid = xno -a -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 # MPI Master Slave and SOCL are not compatible if test "x$use_mpi_master_slave" = "xyes" ; then if test "x$enable_socl" = "xyes" ; then as_fn_error $? "MPI Master-Slave and SOCL can not be used at the same time !" "$LINENO" 5 fi if test "x$enable_socl" = "xmaybe" ; then enable_socl=no fi 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 STARPU_BUILD_SOCL_TRUE= STARPU_BUILD_SOCL_FALSE='#' else STARPU_BUILD_SOCL_TRUE='#' STARPU_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 STARPU_BUILD_TESTS_TRUE= STARPU_BUILD_TESTS_FALSE='#' else STARPU_BUILD_TESTS_TRUE='#' STARPU_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 STARPU_BUILD_EXAMPLES_TRUE= STARPU_BUILD_EXAMPLES_FALSE='#' else STARPU_BUILD_EXAMPLES_TRUE='#' STARPU_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 STARPU_HAVE_OPENGL_TRUE= STARPU_HAVE_OPENGL_FALSE='#' else STARPU_HAVE_OPENGL_TRUE='#' STARPU_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 STARPU_HAVE_X11_TRUE= STARPU_HAVE_X11_FALSE='#' else STARPU_HAVE_X11_TRUE='#' STARPU_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" = "xopenblas" ; then blas_lib=openblas elif test "x$enableval" = "xnone" ; then blas_lib=none elif test "x$enableval" = "xmkl" ; then blas_lib=mkl elif test "x$enableval" = "xarmpl" ; then blas_lib=armpl 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 = xopenblas; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENBLAS" >&5 $as_echo_n "checking for OPENBLAS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$OPENBLAS_CFLAGS"; then pkg_cv_OPENBLAS_CFLAGS="$OPENBLAS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openblas\""; } >&5 ($PKG_CONFIG --exists --print-errors "openblas") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENBLAS_CFLAGS=`$PKG_CONFIG --cflags "openblas" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$OPENBLAS_LIBS"; then pkg_cv_OPENBLAS_LIBS="$OPENBLAS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openblas\""; } >&5 ($PKG_CONFIG --exists --print-errors "openblas") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENBLAS_LIBS=`$PKG_CONFIG --libs "openblas" 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 OPENBLAS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openblas"` else OPENBLAS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openblas"` fi # Put the nasty error message in config.log where it belongs echo "$OPENBLAS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test x$blas_lib = xopenblas; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_sgemm in -lopenblas" >&5 $as_echo_n "checking for cblas_sgemm in -lopenblas... " >&6; } if ${ac_cv_lib_openblas_cblas_sgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lopenblas -lopenblas $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_openblas_cblas_sgemm=yes else ac_cv_lib_openblas_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_openblas_cblas_sgemm" >&5 $as_echo "$ac_cv_lib_openblas_cblas_sgemm" >&6; } if test "x$ac_cv_lib_openblas_cblas_sgemm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBOPENBLAS 1 _ACEOF LIBS="-lopenblas $LIBS" else as_fn_error $? "cannot find openblas lib" "$LINENO" 5 fi STARPU_OPENBLAS_LDFLAGS="$STARPU_OPENBLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_OPENBLAS 1" >>confdefs.h STARPU_OPENBLAS=1 fi elif test $pkg_failed = untried; then if test x$blas_lib = xopenblas; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_sgemm in -lopenblas" >&5 $as_echo_n "checking for cblas_sgemm in -lopenblas... " >&6; } if ${ac_cv_lib_openblas_cblas_sgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lopenblas -lopenblas $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_openblas_cblas_sgemm=yes else ac_cv_lib_openblas_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_openblas_cblas_sgemm" >&5 $as_echo "$ac_cv_lib_openblas_cblas_sgemm" >&6; } if test "x$ac_cv_lib_openblas_cblas_sgemm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBOPENBLAS 1 _ACEOF LIBS="-lopenblas $LIBS" else as_fn_error $? "cannot find openblas lib" "$LINENO" 5 fi STARPU_OPENBLAS_LDFLAGS="$STARPU_OPENBLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_OPENBLAS 1" >>confdefs.h STARPU_OPENBLAS=1 fi else OPENBLAS_CFLAGS=$pkg_cv_OPENBLAS_CFLAGS OPENBLAS_LIBS=$pkg_cv_OPENBLAS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BLAS_OPENBLAS" >&5 $as_echo_n "checking for BLAS_OPENBLAS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$BLAS_OPENBLAS_CFLAGS"; then pkg_cv_BLAS_OPENBLAS_CFLAGS="$BLAS_OPENBLAS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"blas-openblas\""; } >&5 ($PKG_CONFIG --exists --print-errors "blas-openblas") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BLAS_OPENBLAS_CFLAGS=`$PKG_CONFIG --cflags "blas-openblas" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$BLAS_OPENBLAS_LIBS"; then pkg_cv_BLAS_OPENBLAS_LIBS="$BLAS_OPENBLAS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"blas-openblas\""; } >&5 ($PKG_CONFIG --exists --print-errors "blas-openblas") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BLAS_OPENBLAS_LIBS=`$PKG_CONFIG --libs "blas-openblas" 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 BLAS_OPENBLAS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "blas-openblas"` else BLAS_OPENBLAS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "blas-openblas"` fi # Put the nasty error message in config.log where it belongs echo "$BLAS_OPENBLAS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test x$blas_lib = xopenblas; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_sgemm in -lblas-openblas" >&5 $as_echo_n "checking for cblas_sgemm in -lblas-openblas... " >&6; } if ${ac_cv_lib_blas_openblas_cblas_sgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lblas-openblas -lblas-openblas $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_blas_openblas_cblas_sgemm=yes else ac_cv_lib_blas_openblas_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_blas_openblas_cblas_sgemm" >&5 $as_echo "$ac_cv_lib_blas_openblas_cblas_sgemm" >&6; } if test "x$ac_cv_lib_blas_openblas_cblas_sgemm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBBLAS_OPENBLAS 1 _ACEOF LIBS="-lblas-openblas $LIBS" else as_fn_error $? "cannot find blas-openblas lib" "$LINENO" 5 fi STARPU_OPENBLAS_LDFLAGS="$STARPU_OPENBLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_OPENBLAS 1" >>confdefs.h STARPU_OPENBLAS=1 fi elif test $pkg_failed = untried; then if test x$blas_lib = xopenblas; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_sgemm in -lblas-openblas" >&5 $as_echo_n "checking for cblas_sgemm in -lblas-openblas... " >&6; } if ${ac_cv_lib_blas_openblas_cblas_sgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lblas-openblas -lblas-openblas $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_blas_openblas_cblas_sgemm=yes else ac_cv_lib_blas_openblas_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_blas_openblas_cblas_sgemm" >&5 $as_echo "$ac_cv_lib_blas_openblas_cblas_sgemm" >&6; } if test "x$ac_cv_lib_blas_openblas_cblas_sgemm" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBBLAS_OPENBLAS 1 _ACEOF LIBS="-lblas-openblas $LIBS" else as_fn_error $? "cannot find blas-openblas lib" "$LINENO" 5 fi STARPU_OPENBLAS_LDFLAGS="$STARPU_OPENBLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_OPENBLAS 1" >>confdefs.h STARPU_OPENBLAS=1 fi else BLAS_OPENBLAS_CFLAGS=$pkg_cv_BLAS_OPENBLAS_CFLAGS BLAS_OPENBLAS_LIBS=$pkg_cv_BLAS_OPENBLAS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_OPENBLAS 1" >>confdefs.h STARPU_OPENBLAS=1 CFLAGS="${CFLAGS} ${OPENBLAS_CFLAGS} ${BLAS_OPENBLAS_CFLAGS} " LIBS="${LIBS} ${OPENBLAS_LIBS} ${BLAS_OPENBLAS_LIBS} " blas_lib=openblas fi 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 -o x$blas_lib = xarmpl; then # Should we use ARMPL ? if test -n "$ARMPL_DIR" ; then CPPFLAGS="${CPPFLAGS} -I$ARMPL_INCLUDES" SAVED_LIBS=$LIBS STARPU_BLAS_LDFLAGS="-L$ARMPL_LIBRARIES -larmpl_lp64 -lgfortran -lm" 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=armpl 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-armpl-cflags was given. if test "${with_armpl_cflags+set}" = set; then : withval=$with_armpl_cflags; CPPFLAGS="${CPPFLAGS} $withval" blas_lib=armpl fi # Check whether --with-armpl-ldflags was given. if test "${with_armpl_ldflags+set}" = set; then : withval=$with_armpl_ldflags; STARPU_BLAS_LDFLAGS="$withval" blas_lib=armpl fi if test x$blas_lib = xarmpl; then $as_echo "#define STARPU_ARMPL 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 = xsystem; then 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 : have_cblas_h=yes else have_cblas_h=no fi fi if test x$have_cblas_h = xyes; then STARPU_HAVE_CBLAS_H_TRUE= STARPU_HAVE_CBLAS_H_FALSE='#' else STARPU_HAVE_CBLAS_H_TRUE='#' STARPU_HAVE_CBLAS_H_FALSE= fi if test x$have_cblas_h = xyes; then $as_echo "#define STARPU_HAVE_CBLAS_H 1" >>confdefs.h fi if test x$blas_lib != xnone; then $as_echo "#define STARPU_HAVE_BLAS 1" >>confdefs.h SAVED_LIBS="$LIBS" LIBS="$LIBS -lblas" for ac_func in cblas_sgemv do : ac_fn_c_check_func "$LINENO" "cblas_sgemv" "ac_cv_func_cblas_sgemv" if test "x$ac_cv_func_cblas_sgemv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CBLAS_SGEMV 1 _ACEOF fi done LIBS="$SAVED_LIBS" fi if test $HAVE_CBLAS_SGEMV = 1; then STARPU_HAVE_CBLAS_SGEMV_TRUE= STARPU_HAVE_CBLAS_SGEMV_FALSE='#' else STARPU_HAVE_CBLAS_SGEMV_TRUE='#' STARPU_HAVE_CBLAS_SGEMV_FALSE= fi if test x$blas_lib = xatlas; then STARPU_ATLAS_BLAS_LIB_TRUE= STARPU_ATLAS_BLAS_LIB_FALSE='#' else STARPU_ATLAS_BLAS_LIB_TRUE='#' STARPU_ATLAS_BLAS_LIB_FALSE= fi if test x$blas_lib = xgoto; then STARPU_GOTO_BLAS_LIB_TRUE= STARPU_GOTO_BLAS_LIB_FALSE='#' else STARPU_GOTO_BLAS_LIB_TRUE='#' STARPU_GOTO_BLAS_LIB_FALSE= fi if test x$blas_lib = xmkl; then STARPU_MKL_BLAS_LIB_TRUE= STARPU_MKL_BLAS_LIB_FALSE='#' else STARPU_MKL_BLAS_LIB_TRUE='#' STARPU_MKL_BLAS_LIB_FALSE= fi if test x$blas_lib = xsystem; then STARPU_SYSTEM_BLAS_LIB_TRUE= STARPU_SYSTEM_BLAS_LIB_FALSE='#' else STARPU_SYSTEM_BLAS_LIB_TRUE='#' STARPU_SYSTEM_BLAS_LIB_FALSE= fi if test x$blas_lib = xnone -a x$enable_simgrid = xno; then STARPU_NO_BLAS_LIB_TRUE= STARPU_NO_BLAS_LIB_FALSE='#' else STARPU_NO_BLAS_LIB_TRUE='#' STARPU_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 ############################################################################### # # # Multiple linear regression # # # ############################################################################### # Check whether --enable-mlr was given. if test "${enable_mlr+set}" = set; then : enableval=$enable_mlr; enable_mlr=$enableval else enable_mlr=no fi # Check whether --enable-mlr-system-blas was given. if test "${enable_mlr_system_blas+set}" = set; then : enableval=$enable_mlr_system_blas; enable_mlr_blas=$enableval else enable_mlr_blas=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether multiple linear regression models are disabled" >&5 $as_echo_n "checking whether multiple linear regression models are disabled... " >&6; } if test x$enable_mlr = xyes -a "$starpu_windows" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } install_min_dgels=no support_mlr=yes _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dgels_" >&5 $as_echo_n "checking for library containing dgels_... " >&6; } if ${ac_cv_search_dgels_+:} 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 dgels_ (); int main () { return dgels_ (); ; return 0; } _ACEOF for ac_lib in '' lapack; 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_dgels_=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_dgels_+:} false; then : break fi done if ${ac_cv_search_dgels_+:} false; then : else ac_cv_search_dgels_=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dgels_" >&5 $as_echo "$ac_cv_search_dgels_" >&6; } ac_res=$ac_cv_search_dgels_ if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" use_system_lapack=yes fi STARPU_LAPACK_LDFLAGS="$STARPU_LAPACK_LDFLAGS $LIBS" LIBS=$_LIBS_SAV if test x$blas_lib = xnone ; then use_system_lapack=no fi if test x$enable_mlr_blas = xyes -a x$use_system_lapack = xyes; then $as_echo "#define STARPU_MLR_MODEL 1" >>confdefs.h LDFLAGS="-llapack $LDFLAGS" else if test x$enable_mlr_blas=xyes -a x$blas_lib = xmkl; then $as_echo "#define STARPU_MLR_MODEL 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether min-dgels is linked" >&5 $as_echo_n "checking whether min-dgels is linked... " >&6; } if test x"$DGELS_LIBS" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_MLR_MODEL 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking min-dgels source" >&5 $as_echo_n "checking min-dgels source... " >&6; } if test "${cross_compiling}" != "no" ; then # Cross-compiling is not supported by min-dgels { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } install_min_dgels=no support_mlr=no else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } DGELS_LIBS="-Wl,--start-group $STARPU_BUILD_DIR/min-dgels/build/minlibblas.a $STARPU_BUILD_DIR/min-dgels/build/minlibdgels.a $STARPU_BUILD_DIR/min-dgels/build/minlibf2c.a -Wl,--end-group" $as_echo "#define STARPU_MLR_MODEL 1" >>confdefs.h $as_echo "#define STARPU_BUILT_IN_MIN_DGELS 1" >>confdefs.h install_min_dgels=yes fi fi fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } install_min_dgels=no support_mlr=no fi if test x$install_min_dgels = xyes; then STARPU_USE_MIN_DGELS_TRUE= STARPU_USE_MIN_DGELS_FALSE='#' else STARPU_USE_MIN_DGELS_TRUE='#' STARPU_USE_MIN_DGELS_FALSE= fi ########################################## # 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 STARPU_BUILD_STARPUFFT_TRUE= STARPU_BUILD_STARPUFFT_FALSE='#' else STARPU_BUILD_STARPUFFT_TRUE='#' STARPU_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 STARPU_BUILD_STARPUFFT_EXAMPLES_TRUE= STARPU_BUILD_STARPUFFT_EXAMPLES_FALSE='#' else STARPU_BUILD_STARPUFFT_EXAMPLES_TRUE='#' STARPU_BUILD_STARPUFFT_EXAMPLES_FALSE= fi ########################################## # hwloc # ########################################## have_valid_hwloc=no SAVED_LIBS="${LIBS}" 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 or pkg-config" "$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 LIBS="${HWLOC_LIBS} ${SAVED_LIBS}" 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 for ac_func in hwloc_topology_set_components do : ac_fn_c_check_func "$LINENO" "hwloc_topology_set_components" "ac_cv_func_hwloc_topology_set_components" if test "x$ac_cv_func_hwloc_topology_set_components" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_HWLOC_TOPOLOGY_SET_COMPONENTS 1 _ACEOF fi done for ac_func in hwloc_cpukinds_get_nr do : ac_fn_c_check_func "$LINENO" "hwloc_cpukinds_get_nr" "ac_cv_func_hwloc_cpukinds_get_nr" if test "x$ac_cv_func_hwloc_cpukinds_get_nr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_HWLOC_CPUKINDS_GET_NR 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 LIBS="${SAVED_LIBS}" 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 whether --enable-icc was given. if test "${enable_icc+set}" = set; then : enableval=$enable_icc; enable_icc=$enableval else enable_icc=yes fi ICC="" if test "$enable_icc" = "yes" ; then # 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 fi # 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 ########################################## # Resource Manager # ########################################## starpurm_support=no starpurm_dlb_support=no # Check whether --enable-starpurm was given. if test "${enable_starpurm+set}" = set; then : enableval=$enable_starpurm; enable_starpurm=$enableval else enable_starpurm=no fi if test "x$enable_starpurm" != xno then starpurm_support=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether resource management debug messages should be displayed" >&5 $as_echo_n "checking whether resource management debug messages should be displayed... " >&6; } # Check whether --enable-starpurm-verbose was given. if test "${enable_starpurm_verbose+set}" = set; then : enableval=$enable_starpurm_verbose; enable_starpurm_verbose=$enableval else enable_starpurm_verbose=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_starpurm_verbose" >&5 $as_echo "$enable_starpurm_verbose" >&6; } if test x$enable_starpurm_verbose = xyes; then $as_echo "#define STARPURM_VERBOSE 1" >>confdefs.h fi # DLB DLB_CFLAGS="" DLB_LIBS="" # Check whether --enable-dlb was given. if test "${enable_dlb+set}" = set; then : enableval=$enable_dlb; enable_dlb=$enableval else enable_dlb=no fi if test "x$enable_dlb" != xno then # Check whether --with-dlb-include-dir was given. if test "${with_dlb_include_dir+set}" = set; then : withval=$with_dlb_include_dir; dlb_inc_dirs="$withval" else dlb_inc_dirs="" fi dlb_inc_dirs="${dlb_inc_dirs} /usr/include/dlb" dlb_incdir_found=no for dlb_incdir in $dlb_inc_dirs do if test -n "$dlb_incdir" then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS=-I${dlb_incdir} for ac_header in dlb.h do : ac_fn_c_check_header_mongrel "$LINENO" "dlb.h" "ac_cv_header_dlb_h" "$ac_includes_default" if test "x$ac_cv_header_dlb_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLB_H 1 _ACEOF fi done if test "$ac_cv_header_dlb_h" = "yes" then CPPFLAGS="-I$dlb_incdir ${SAVED_CPPFLAGS}" DLB_CFLAGS="-I${dlb_incdir}" dlb_incdir_found=yes break else CPPFLAGS=${SAVED_CPPFLAGS} fi unset ac_cv_header_dlb_h fi done # Check whether --with-dlb-lib-dir was given. if test "${with_dlb_lib_dir+set}" = set; then : withval=$with_dlb_lib_dir; dlb_lib_dirs="$withval" else dlb_lib_dirs="" fi dlb_lib_dirs="${dlb_lib_dirs} /usr/lib/dlb" dlb_libdir_found=no for dlb_libdir in $dlb_lib_dirs do if test -n "$dlb_libdir" then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS=-L${dlb_libdir} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DLB_Init in -ldlb" >&5 $as_echo_n "checking for DLB_Init in -ldlb... " >&6; } if ${ac_cv_lib_dlb_DLB_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldlb $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 DLB_Init (); int main () { return DLB_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dlb_DLB_Init=yes else ac_cv_lib_dlb_DLB_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_dlb_DLB_Init" >&5 $as_echo "$ac_cv_lib_dlb_DLB_Init" >&6; } if test "x$ac_cv_lib_dlb_DLB_Init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLB 1 _ACEOF LIBS="-ldlb $LIBS" fi if test "$ac_cv_lib_dlb_DLB_Init" = "yes" then LDFLAGS="-L${dlb_libdir} ${SAVED_LDFLAGS} ${STARPU_DLB_LDFLAGS}" DLB_LIBS="-L${dlb_libdir} -ldlb" dlb_libdir_found=yes break else LDFLAGS=${SAVED_LDFLAGS} fi unset ac_cv_lib_dlb_DLB_Init fi done SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_CFLAGS="${CFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" CPPFLAGS="$HWLOC_CPPFLAGS -D_GNU_SOURCE $CPPFLAGS" CFLAGS="$HWLOC_CFLAGS $CFLAGS" LIBS="$HWLOC_LIBS $LIBS" # check whether libhwloc has a dedicated glibc-sched.h include for conversion with glibc cpusets for ac_header in hwloc/glibc-sched.h do : ac_fn_c_check_header_mongrel "$LINENO" "hwloc/glibc-sched.h" "ac_cv_header_hwloc_glibc_sched_h" "$ac_includes_default" if test "x$ac_cv_header_hwloc_glibc_sched_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_HWLOC_GLIBC_SCHED_H 1 _ACEOF fi done CPPFLAGS="$SAVED_CPPFLAGS" CFLAGS="$SAVED_CFLAGS" LIBS="$SAVED_LIBS" SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_CFLAGS="${CFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" CPPFLAGS="$STARPU_CPPFLAGS $CPPFLAGS" CFLAGS="$STARPU_CFLAGS $CFLAGS" LIBS="$STARPU_LIBS $LIBS" # check if StarPU implements starpu_worker_set_going_to_sleep_callback() if test x$enable_worker_cb = xyes ; then $as_echo "#define STARPURM_STARPU_HAVE_WORKER_CALLBACKS 1" >>confdefs.h fi #AC_CHECK_FUNC([starpu_worker_set_going_to_sleep_callback],AC_DEFINE([STARPURM_STARPU_HAVE_WORKER_CALLBACKS], [1], [Define to 1 if StarPU has support for worker callbacks.])) CPPFLAGS="$SAVED_CPPFLAGS" CFLAGS="$SAVED_CFLAGS" LIBS="$SAVED_LIBS" if test "x$dlb_incdir_found" != "xyes" -o "x$dlb_libdir_found" != "xyes" then enable_dlb=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether DLB support should be enabled" >&5 $as_echo_n "checking whether DLB support should be enabled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_dlb" >&5 $as_echo "$enable_dlb" >&6; } if test "x$enable_dlb" != "xno" then $as_echo "#define STARPURM_HAVE_DLB 1" >>confdefs.h starpurm_dlb_support=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether DLB resource management debug messages should be displayed" >&5 $as_echo_n "checking whether DLB resource management debug messages should be displayed... " >&6; } # Check whether --enable-starpurm-dlb-verbose was given. if test "${enable_starpurm_dlb_verbose+set}" = set; then : enableval=$enable_starpurm_dlb_verbose; enable_starpurm_dlb_verbose=$enableval else enable_starpurm_dlb_verbose=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_starpurm_dlb_verbose" >&5 $as_echo "$enable_starpurm_dlb_verbose" >&6; } if test x$enable_starpurm_dlb_verbose = xyes; then $as_echo "#define STARPURM_DLB_VERBOSE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether DLB callbacks expect an user argument" >&5 $as_echo_n "checking whether DLB callbacks expect an user argument... " >&6; } if ${ac_cv_dlb_callback_arg+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include dlb_handler_t dlb_handle; void _dlb_callback_disable_cpu(int cpuid, void *arg) { (void)cpuid; (void)arg; } void f(void) { (void)DLB_CallbackSet_sp(dlb_handle, dlb_callback_disable_cpu, (dlb_callback_t)_dlb_callback_disable_cpu, 0); } int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_dlb_callback_arg=yes else ac_cv_dlb_callback_arg=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_dlb_callback_arg" >&5 $as_echo "$ac_cv_dlb_callback_arg" >&6; } if test $ac_cv_dlb_callback_arg = yes; then $as_echo "#define STARPURM_HAVE_DLB_CALLBACK_ARG 1" >>confdefs.h fi fi fi if test x$starpurm_dlb_support == "xyes"; then STARPURM_HAVE_DLB_TRUE= STARPURM_HAVE_DLB_FALSE='#' else STARPURM_HAVE_DLB_TRUE='#' STARPURM_HAVE_DLB_FALSE= fi if test x$starpurm_support = xyes; then STARPU_BUILD_STARPURM_TRUE= STARPU_BUILD_STARPURM_FALSE='#' else STARPU_BUILD_STARPURM_TRUE='#' STARPU_BUILD_STARPURM_FALSE= fi # Check whether --enable-starpurm-examples was given. if test "${enable_starpurm_examples+set}" = set; then : enableval=$enable_starpurm_examples; enable_starpurm_examples=$enableval else enable_starpurm_examples=no fi if test x$enable_starpurm_examples = xyes; then STARPU_BUILD_STARPURM_EXAMPLES_TRUE= STARPU_BUILD_STARPURM_EXAMPLES_FALSE='#' else STARPU_BUILD_STARPURM_EXAMPLES_TRUE='#' STARPU_BUILD_STARPURM_EXAMPLES_FALSE= fi ########################################## # Documentation # ########################################## def_enable_build_doc="yes" available_doc="no" if test -d "$srcdir/doc/doxygen/html" ; then def_enable_build_doc="no" available_doc="yes" fi # 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=$def_enable_build_doc fi # Check whether --enable-build-doc-pdf was given. if test "${enable_build_doc_pdf+set}" = set; then : enableval=$enable_build_doc_pdf; enable_build_doc_pdf=$enableval else enable_build_doc_pdf=no fi available_doc_pdf="no" if test -f "$srcdir/doc/doxygen/starpu.pdf" ; then enable_build_doc_pdf="no" available_doc_pdf="yes" fi # 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" enable_build_doc_pdf="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_pdf="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_pdf="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HTML documentation should be compiled" >&5 $as_echo_n "checking whether HTML 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 HTML documentation is available" >&5 $as_echo_n "checking whether HTML documentation is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $available_doc" >&5 $as_echo "$available_doc" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PDF documentation should be compiled" >&5 $as_echo_n "checking whether PDF documentation should be compiled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_build_doc_pdf" >&5 $as_echo "$enable_build_doc_pdf" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PDF documentation is available" >&5 $as_echo_n "checking whether PDF documentation is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $available_doc_pdf" >&5 $as_echo "$available_doc_pdf" >&6; } if test x$enable_build_doc != xno; then STARPU_BUILD_DOC_TRUE= STARPU_BUILD_DOC_FALSE='#' else STARPU_BUILD_DOC_TRUE='#' STARPU_BUILD_DOC_FALSE= fi if test x$available_doc != xno; then STARPU_AVAILABLE_DOC_TRUE= STARPU_AVAILABLE_DOC_FALSE='#' else STARPU_AVAILABLE_DOC_TRUE='#' STARPU_AVAILABLE_DOC_FALSE= fi if test x$enable_build_doc_pdf != xno; then STARPU_BUILD_DOC_PDF_TRUE= STARPU_BUILD_DOC_PDF_FALSE='#' else STARPU_BUILD_DOC_PDF_TRUE='#' STARPU_BUILD_DOC_PDF_FALSE= fi if test x$available_doc_pdf != xno; then STARPU_AVAILABLE_DOC_PDF_TRUE= STARPU_AVAILABLE_DOC_PDF_FALSE='#' else STARPU_AVAILABLE_DOC_PDF_TRUE='#' STARPU_AVAILABLE_DOC_PDF_FALSE= fi ############################################################################### # # # Final settings # # # ############################################################################### # these are the flags needed for linking libstarpu (and thus also for static linking) LIBSTARPU_LDFLAGS="$STARPU_OPENCL_LDFLAGS $STARPU_CUDA_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 $STARPU_BLAS_LDFLAGS $STARPU_OMP_LDFLAGS $DGELS_LIBS" LIBSTARPU_LINK=libstarpu-$STARPU_EFFECTIVE_VERSION.la 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. $as_echo "#define STARPU_STATIC_ONLY 1" >>confdefs.h STARPU_EXPORTED_LIBS="$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 src/common/config-src-build.h include/starpu_config.h starpurm/include/starpurm_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_env tools/starpu_codelet_profile tools/starpu_codelet_histo_profile tools/starpu_mpi_comm_matrix.py tools/starpu_workers_activity tools/starpu_paje_draw_histogram tools/starpu_paje_state_stats tools/starpu_paje_summary tools/starpu_mlr_analysis 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 starpu-1.3.pc mpi/libstarpumpi.pc mpi/starpumpi-1.0.pc mpi/starpumpi-1.1.pc mpi/starpumpi-1.2.pc mpi/starpumpi-1.3.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 starpufft/starpufft-1.3.pc starpurm/Makefile starpurm/src/Makefile starpurm/examples/Makefile starpurm/starpurm-1.3.pc examples/Makefile examples/stencil/Makefile tests/Makefile tests/loader-cross.sh tests/model-checking/starpu-mc.sh examples/loader-cross.sh examples/stencil/loader-cross.sh mpi/Makefile mpi/src/Makefile mpi/tests/Makefile mpi/examples/Makefile mpi/GNUmakefile 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 doc/doxygen_dev/Makefile doc/doxygen_dev/doxygen-config.cfg doc/doxygen_dev/doxygen_filter.sh tools/msvc/starpu_var.bat min-dgels/Makefile" 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_SIMGRID_MC_TRUE}" && test -z "${STARPU_SIMGRID_MC_FALSE}"; then as_fn_error $? "conditional \"STARPU_SIMGRID_MC\" 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_HAVE_CXX11_TRUE}" && test -z "${STARPU_HAVE_CXX11_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_CXX11\" 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_MPI_MASTER_SLAVE_TRUE}" && test -z "${STARPU_USE_MPI_MASTER_SLAVE_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MPI_MASTER_SLAVE\" 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 "${STARPU_USE_MPI_MPI_TRUE}" && test -z "${STARPU_USE_MPI_MPI_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MPI_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_MPI_NMAD_TRUE}" && test -z "${STARPU_USE_MPI_NMAD_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MPI_NMAD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_MPI_TRUE}" && test -z "${STARPU_USE_MPI_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MPI\" 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_HAVE_HDF5_TRUE}" && test -z "${STARPU_HAVE_HDF5_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_HDF5\" 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_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_COVERITY_TRUE}" && test -z "${STARPU_COVERITY_FALSE}"; then as_fn_error $? "conditional \"STARPU_COVERITY\" 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_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_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 "${STARPU_CLUSTER_TRUE}" && test -z "${STARPU_CLUSTER_FALSE}"; then as_fn_error $? "conditional \"STARPU_CLUSTER\" 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 "${STARPU_BUILD_SOCL_TRUE}" && test -z "${STARPU_BUILD_SOCL_FALSE}"; then as_fn_error $? "conditional \"STARPU_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 "${STARPU_BUILD_TESTS_TRUE}" && test -z "${STARPU_BUILD_TESTS_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_EXAMPLES_TRUE}" && test -z "${STARPU_BUILD_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_OPENGL_TRUE}" && test -z "${STARPU_HAVE_OPENGL_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_OPENGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_X11_TRUE}" && test -z "${STARPU_HAVE_X11_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_CBLAS_H_TRUE}" && test -z "${STARPU_HAVE_CBLAS_H_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_CBLAS_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_CBLAS_SGEMV_TRUE}" && test -z "${STARPU_HAVE_CBLAS_SGEMV_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_CBLAS_SGEMV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_ATLAS_BLAS_LIB_TRUE}" && test -z "${STARPU_ATLAS_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"STARPU_ATLAS_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_GOTO_BLAS_LIB_TRUE}" && test -z "${STARPU_GOTO_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"STARPU_GOTO_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_MKL_BLAS_LIB_TRUE}" && test -z "${STARPU_MKL_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"STARPU_MKL_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_SYSTEM_BLAS_LIB_TRUE}" && test -z "${STARPU_SYSTEM_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"STARPU_SYSTEM_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_NO_BLAS_LIB_TRUE}" && test -z "${STARPU_NO_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"STARPU_NO_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_MIN_DGELS_TRUE}" && test -z "${STARPU_USE_MIN_DGELS_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_MIN_DGELS\" 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 "${STARPU_BUILD_STARPUFFT_TRUE}" && test -z "${STARPU_BUILD_STARPUFFT_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_STARPUFFT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_STARPUFFT_EXAMPLES_TRUE}" && test -z "${STARPU_BUILD_STARPUFFT_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"STARPU_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 "${STARPURM_HAVE_DLB_TRUE}" && test -z "${STARPURM_HAVE_DLB_FALSE}"; then as_fn_error $? "conditional \"STARPURM_HAVE_DLB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_STARPURM_TRUE}" && test -z "${STARPU_BUILD_STARPURM_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_STARPURM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_STARPURM_EXAMPLES_TRUE}" && test -z "${STARPU_BUILD_STARPURM_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_STARPURM_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_DOC_TRUE}" && test -z "${STARPU_BUILD_DOC_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_AVAILABLE_DOC_TRUE}" && test -z "${STARPU_AVAILABLE_DOC_FALSE}"; then as_fn_error $? "conditional \"STARPU_AVAILABLE_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_BUILD_DOC_PDF_TRUE}" && test -z "${STARPU_BUILD_DOC_PDF_FALSE}"; then as_fn_error $? "conditional \"STARPU_BUILD_DOC_PDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_AVAILABLE_DOC_PDF_TRUE}" && test -z "${STARPU_AVAILABLE_DOC_PDF_FALSE}"; then as_fn_error $? "conditional \"STARPU_AVAILABLE_DOC_PDF\" 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.3.9, 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.3.9 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" MAKE="${MAKE-make}" # 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"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $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_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $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"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $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"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $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"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $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_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) 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 \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that 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' 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" ;; "src/common/config-src-build.h") CONFIG_HEADERS="$CONFIG_HEADERS src/common/config-src-build.h" ;; "include/starpu_config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/starpu_config.h" ;; "starpurm/include/starpurm_config.h") CONFIG_HEADERS="$CONFIG_HEADERS starpurm/include/starpurm_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_env") CONFIG_FILES="$CONFIG_FILES tools/starpu_env" ;; "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_mpi_comm_matrix.py") CONFIG_FILES="$CONFIG_FILES tools/starpu_mpi_comm_matrix.py" ;; "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_mlr_analysis") CONFIG_FILES="$CONFIG_FILES tools/starpu_mlr_analysis" ;; "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" ;; "starpu-1.3.pc") CONFIG_FILES="$CONFIG_FILES starpu-1.3.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" ;; "mpi/starpumpi-1.3.pc") CONFIG_FILES="$CONFIG_FILES mpi/starpumpi-1.3.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" ;; "starpufft/starpufft-1.3.pc") CONFIG_FILES="$CONFIG_FILES starpufft/starpufft-1.3.pc" ;; "starpurm/Makefile") CONFIG_FILES="$CONFIG_FILES starpurm/Makefile" ;; "starpurm/src/Makefile") CONFIG_FILES="$CONFIG_FILES starpurm/src/Makefile" ;; "starpurm/examples/Makefile") CONFIG_FILES="$CONFIG_FILES starpurm/examples/Makefile" ;; "starpurm/starpurm-1.3.pc") CONFIG_FILES="$CONFIG_FILES starpurm/starpurm-1.3.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" ;; "tests/model-checking/starpu-mc.sh") CONFIG_FILES="$CONFIG_FILES tests/model-checking/starpu-mc.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" ;; "mpi/GNUmakefile") CONFIG_FILES="$CONFIG_FILES mpi/GNUmakefile" ;; "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" ;; "doc/doxygen_dev/Makefile") CONFIG_FILES="$CONFIG_FILES doc/doxygen_dev/Makefile" ;; "doc/doxygen_dev/doxygen-config.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen_dev/doxygen-config.cfg" ;; "doc/doxygen_dev/doxygen_filter.sh") CONFIG_FILES="$CONFIG_FILES doc/doxygen_dev/doxygen_filter.sh" ;; "tools/msvc/starpu_var.bat") CONFIG_FILES="$CONFIG_FILES tools/msvc/starpu_var.bat" ;; "min-dgels/Makefile") CONFIG_FILES="$CONFIG_FILES min-dgels/Makefile" ;; *) 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; 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 $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that 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 # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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 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 this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX F77 FC ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### 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 # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # 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 into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # 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 # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # 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 where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # 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 # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # 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 cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _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 set != "${COLLECT_NAMES+set}"; 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) 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 tests/model-checking/starpu-mc.sh chmod +x examples/loader-cross.sh chmod +x examples/stencil/loader-cross.sh chmod +x tools/starpu_env chmod +x tools/starpu_codelet_profile chmod +x tools/starpu_codelet_histo_profile chmod +x tools/starpu_mpi_comm_matrix.py 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_mlr_analysis chmod +x tools/starpu_paje_sort chmod +x tools/starpu_smpirun chmod +x doc/doxygen/doxygen_filter.sh chmod +x doc/doxygen_dev/doxygen_filter.sh mkdir -p tests/microbenchs test -e tests/microbenchs/tasks_data_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_data_overhead.sh tests/microbenchs/ test -e tests/microbenchs/sync_tasks_data_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/sync_tasks_data_overhead.sh tests/microbenchs/ test -e tests/microbenchs/async_tasks_data_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/async_tasks_data_overhead.sh 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_sched.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead_sched.sh tests/microbenchs/ test -e tests/microbenchs/tasks_size_overhead_scheds.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead_scheds.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/ test -e tests/microbenchs/microbench.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/microbench.sh tests/microbenchs/ test -e tests/microbenchs/parallel_dependent_homogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_dependent_homogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_heterogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_heterogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_heterogeneous_tasks.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_heterogeneous_tasks.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_homogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_homogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_homogeneous_tasks.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_homogeneous_tasks.sh tests/microbenchs/ test -e tests/microbenchs/parallel_redux_homogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_redux_homogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_redux_heterogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_redux_heterogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/bandwidth_scheds.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/bandwidth_scheds.sh 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 tests/model-checking test -e tests/model-checking/prio_list.sh || ln -sf $ac_abs_top_srcdir/tests/model-checking/prio_list.sh tests/model-checking/ test -e tests/model-checking/barrier.sh || ln -sf $ac_abs_top_srcdir/tests/model-checking/barrier.sh tests/model-checking/ 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/ mkdir -p examples/cholesky test -e examples/cholesky/cholesky.sh || ln -sf $ac_abs_top_srcdir/examples/cholesky/cholesky.sh examples/cholesky/ mkdir -p examples/mult test -e examples/mult/sgemm.sh || ln -sf $ac_abs_top_srcdir/examples/mult/sgemm.sh examples/mult/ mkdir -p examples/scheduler test -e examples/scheduler/schedulers.sh || ln -sf $ac_abs_top_srcdir/examples/scheduler/schedulers.sh examples/scheduler test -e examples/scheduler/schedulers_context.sh || ln -sf $ac_abs_top_srcdir/examples/scheduler/schedulers_context.sh examples/scheduler 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 test -e tools/starpu_mlr_analysis.Rmd || ln -sf $ac_abs_top_srcdir/tools/starpu_mlr_analysis.Rmd tools/starpu_mlr_analysis.Rmd test -e tools/starpu_paje_summary.Rmd || ln -sf $ac_abs_top_srcdir/tools/starpu_paje_summary.Rmd tools/starpu_paje_summary.Rmd test -e tools/starpu_trace_state_stats.py || ln -sf $ac_abs_top_srcdir/tools/starpu_trace_state_stats.py tools/starpu_trace_state_stats.py chmod +x tools/starpu_trace_state_stats.py sed -i -e '/ STARPU_SRC_DIR /d' -e '/ STARPU_BUILD_DIR /d' src/common/config.h ;; 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 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 MIC threads: $nmaxmicthreads Maximum number of MPI master-slave devices: $nmaxmpidev Maximum number of memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $enable_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 Documentation HTML: $enable_build_doc Documentation PDF: $enable_build_doc_pdf Examples: $enable_build_examples StarPU Extensions: StarPU MPI enabled: $build_mpi_lib StarPU MPI(nmad) enabled: $build_nmad_lib MPI test suite: $running_mpi_check Master-Slave MPI enabled: $use_mpi_master_slave FFT Support: $fft_support Resource Management enabled: $starpurm_support OpenMP runtime support enabled: $enable_openmp Cluster support enabled: $enable_cluster SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ayu_msg HDF5 enabled: $enable_hdf5 Native fortran support: $enable_build_fortran Native MPI fortran support: $use_mpi_fort Support for multiple linear regression models: $support_mlr " >&5 $as_echo "$as_me: CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl 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 MIC threads: $nmaxmicthreads Maximum number of MPI master-slave devices: $nmaxmpidev Maximum number of memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $enable_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 Documentation HTML: $enable_build_doc Documentation PDF: $enable_build_doc_pdf Examples: $enable_build_examples StarPU Extensions: StarPU MPI enabled: $build_mpi_lib StarPU MPI(nmad) enabled: $build_nmad_lib MPI test suite: $running_mpi_check Master-Slave MPI enabled: $use_mpi_master_slave FFT Support: $fft_support Resource Management enabled: $starpurm_support OpenMP runtime support enabled: $enable_openmp Cluster support enabled: $enable_cluster SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ayu_msg HDF5 enabled: $enable_hdf5 Native fortran support: $enable_build_fortran Native MPI fortran support: $use_mpi_fort Support for multiple linear regression models: $support_mlr " >&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 if test x"$starpu_windows" = xyes -a "x$STARPU_MS_LIB" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: lib was not found, you will not be able to build StarPU applications with Microsoft Visual Studio. Add to your PATH the directories for MSVC, e.g c:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE; c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin" >&5 $as_echo "$as_me: WARNING: lib was not found, you will not be able to build StarPU applications with Microsoft Visual Studio. Add to your PATH the directories for MSVC, e.g c:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE; c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin" >&6;} fi starpu-1.3.9+dfsg/configure.ac000066400000000000000000004210701413463044200162540ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2013 Thibaut Lambert # Copyright (C) 2017 Guillaume Beauchamp # Copyright (C) 2018,2020 Federal University of Rio Grande do Sul (UFRGS) # Copyright (C) 2018 Umeà University # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9], [starpu-devel@inria.fr], [starpu], [http://gitlab.inria.fr/starpu/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([LIBSTARPURM_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPURM_INTERFACE_REVISION]) AC_SUBST([LIBSTARPURM_INTERFACE_AGE]) AC_SUBST([LIBSOCL_INTERFACE_CURRENT]) AC_SUBST([LIBSOCL_INTERFACE_REVISION]) AC_SUBST([LIBSOCL_INTERFACE_AGE]) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE([1.11 -Wall -Wno-portability foreign silent-rules color-tests parallel-tests]) 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_PROG_GREP AC_PROG_EGREP AC_PROG_INSTALL AC_PROG_MKDIR_P AC_CHECK_PROGS(PROG_STAT,gstat stat) AC_CHECK_PROGS(PROG_DATE,gdate date) AC_PATH_PROGS(PROG_FIND,find) dnl locate pkg-config PKG_PROG_PKG_CONFIG if test x$enable_perf_debug = xyes; then enable_shared=no fi default_enable_mpi_check=maybe default_enable_mpi=maybe ############################################################################### # # # 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 PKG_CHECK_MODULES([SIMGRID], [simgrid], [], [:]) if test "$simgrid_include_dir" != "no" ; then SIMGRID_CFLAGS="$SIMGRID_CFLAGS -I$simgrid_include_dir" fi if test "$simgrid_lib_dir" != "no" ; then SIMGRID_LIBS="$SIMGRID_LIBS -L$simgrid_lib_dir" fi if test "$simgrid_dir" != "no" ; then SIMGRID_CFLAGS="$SIMGRID_CFLAGS -I$simgrid_dir/include" SIMGRID_LIBS="$SIMGRID_LIBS -L$simgrid_dir/lib" fi 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 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([msg/msg.h], [AC_DEFINE([STARPU_HAVE_MSG_MSG_H], [1], [Define to 1 if you have msg.h in msg/.])]) AC_CHECK_HEADERS([simgrid/host.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_HOST_H], [1], [Define to 1 if you have host.h in simgrid/.])]) AC_CHECK_HEADERS([xbt/base.h], [AC_DEFINE([STARPU_HAVE_XBT_BASE_H], [1], [Define to 1 if you have base.h in xbt/.])]) AC_CHECK_HEADERS([simgrid/version.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_VERSION_H], [1], [Define to 1 if you have version.h in simgrid/.])], [], [[ #ifdef STARPU_HAVE_XBT_BASE_H #include #endif ]]) AC_CHECK_HEADERS([simgrid/simdag.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_SIMDAG_H], [1], [Define to 1 if you have simdag.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_HEADERS([xbt/config.h], [AC_DEFINE([STARPU_HAVE_XBT_CONFIG_H], [1], [Define to 1 if you have config.h in xbt/.])]) AC_CHECK_HEADERS([simgrid/actor.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_ACTOR_H], [1], [Define to 1 if you have actor.h in simgrid/.])]) AC_CHECK_HEADERS([simgrid/engine.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_ENGINE_H], [1], [Define to 1 if you have engine.h in simgrid/.])]) AC_CHECK_HEADERS([simgrid/semaphore.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_SEMAPHORE_H], [1], [Define to 1 if you have semaphore.h in simgrid/.])]) AC_CHECK_HEADERS([simgrid/mutex.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_MUTEX_H], [1], [Define to 1 if you have mutex.h in simgrid/.])]) AC_CHECK_HEADERS([simgrid/cond.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_COND_H], [1], [Define to 1 if you have cond.h in simgrid/.])]) AC_CHECK_HEADERS([simgrid/barrier.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_BARRIER_H], [1], [Define to 1 if you have barrier.h in simgrid/.])]) AC_CHECK_HEADERS([simgrid/engine.h]) AC_CHECK_HEADERS([simgrid/zone.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_ZONE_H], [1], [Define to 1 if you have zone.h in simgrid/.])]) AC_CHECK_TYPES([smx_actor_t], [AC_DEFINE([STARPU_HAVE_SMX_ACTOR_T], [1], [Define to 1 if you have the smx_actor_t type.])], [], [[#include ]]) # Latest functions AC_CHECK_FUNCS([MSG_process_attach sg_actor_attach sg_actor_init sg_actor_on_exit MSG_zone_get_hosts sg_zone_get_hosts MSG_process_self_name MSG_process_userdata_init sg_actor_get_data sg_actor_set_data sg_actor_data]) AC_CHECK_FUNCS([xbt_mutex_try_acquire smpi_process_set_user_data SMPI_thread_create sg_zone_get_by_name sg_link_get_name sg_link_name sg_link_set_bandwidth sg_link_bandwidth_set sg_host_get_route sg_host_route sg_host_self sg_host_list sg_host_get_speed sg_host_speed simcall_process_create sg_config_continue_after_help]) AC_CHECK_FUNCS([simgrid_set_maestro]) AC_CHECK_FUNCS([simgrid_init], [AC_DEFINE([STARPU_SIMGRID_HAVE_SIMGRID_INIT], [1], [Define to 1 if you have the `simgrid_init' function.])]) 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_FUNCS([sg_actor_sleep_for sg_actor_self sg_actor_ref sg_host_get_properties sg_host_send_to sg_host_sendto sg_cfg_set_int sg_actor_self_execute sg_actor_execute simgrid_get_clock]) AC_CHECK_DECLS([smpi_process_set_user_data], [], [], [[#include ]]) # Oldies for compatibility with older simgrid AC_CHECK_FUNCS([MSG_get_as_by_name MSG_zone_get_by_name MSG_environment_get_routing_root MSG_host_get_speed]) AC_DEFINE(STARPU_SIMGRID, [1], [Define this to enable simgrid execution]) # We won't bind or detect anything with_hwloc=no # disable mpi checks by default, they require static linking, we don't # want that by default default_enable_mpi_check=no # disable MPI support by default default_enable_mpi=no AC_LANG_PUSH([C++]) if test x$enable_shared = xno ; then # When linking statically, libtool does not realize we need libstdc++ for simgrid_cpp.cpp SIMGRID_LIBS="$SIMGRID_LIBS -lstdc++" LIBS="$LIBS -lstdc++" fi # Simgrid 3.12 & 3.13 need -std=c++11 to be able to build anything in C++... case \ $CXXFLAGS\ in *\ -std=*\ *) ;; *) # Make sure our C++ compiler can compile simgrid headers SIMGRID_INCLUDES=" #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #include #elif defined(STARPU_HAVE_MSG_MSG_H) #include #endif #ifdef STARPU_HAVE_XBT_BASE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_VERSION_H #include #endif #ifdef STARPU_HAVE_SIMGRID_ZONE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_HOST_H #include #endif #include " AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$SIMGRID_INCLUDES]])],, CXXFLAGS="-std=c++11 $CXXFLAGS") ;; esac AC_LANG_POP([C++]) AC_ARG_ENABLE(simgrid-mc, [AS_HELP_STRING([--enable-simgrid-mc], [Enable using Model Checker of simgrid])], enable_simgrid_mc=$enableval, enable_simgrid_mc=no) if test x$enable_simgrid_mc = xyes ; then AC_DEFINE(STARPU_SIMGRID_MC, [1], [Define this to enable Model Checker in simgrid execution]) AC_PATH_PROG([SIMGRID_MC], [simgrid-mc], [no], [$simgrid_dir/bin:$PATH]) LDFLAGS="$LDFLAGS -Wl,-znorelro -Wl,-znoseparate-code" fi fi AM_CONDITIONAL(STARPU_SIMGRID_MC, test x$enable_simgrid_mc = xyes) 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 if test x$enable_blocking = xyes ; then AC_MSG_CHECKING(whether worker callbacks should be enabled) AC_ARG_ENABLE(worker-callbacks, [AS_HELP_STRING([--enable-worker-callbacks], [enable worker callbacks])], enable_worker_cb=$enableval, enable_worker_cb=no) AC_MSG_RESULT($enable_worker_cb) else # worker sleep/wake-up callbacks only make sense if blocking drivers are enabled enable_worker_cb=no fi if test x$enable_worker_cb = xyes ; then AC_DEFINE(STARPU_WORKER_CALLBACKS, [1], [workers must call callbacks on sleep/wake-up]) fi ############################################################################### # # # LIBTOOLS # # # ############################################################################### #c++11 detection AX_CXX_COMPILE_STDCXX(11,noext,optional) AC_SUBST([STARPU_HAVE_CXX11], $HAVE_CXX11) AM_CONDITIONAL([STARPU_HAVE_CXX11], [test "$HAVE_CXX11" -eq 1]) if test $HAVE_CXX11 -eq 1; then AC_DEFINE(STARPU_HAVE_CXX11, [1], [compiler supports cxx11]) fi LT_PREREQ([2.2]) LT_INIT([win32-dll]) AC_HEADER_STDC AC_C_RESTRICT # Check if bash is available AC_PATH_PROG([REALBASH], [bash], , [/bin:$PATH]) # Record git version AC_PATH_PROG(gitcommand, git) if test "$gitcommand" = "" ; then if test -f $srcdir/STARPU-REVISION ; then cp $srcdir/STARPU-REVISION . else echo "unknown" > ./STARPU-REVISION fi else git log -n 1 --pretty="%H" $srcdir > ./STARPU-REVISION fi AM_CONDITIONAL([STARPU_CROSS_COMPILING], [test "x$cross_compiling" = "xyes"]) ############################################################################### # # # MPI compilers # # # ############################################################################### #Check MPICC if test x$enable_simgrid = xyes ; then DEFAULT_MPICC=smpicc else DEFAULT_MPICC=mpicc fi AC_ARG_WITH(mpicc, [AS_HELP_STRING([--with-mpicc=], [Name or path of the mpicc compiler])], [DEFAULT_MPICC=$withval]) case $DEFAULT_MPICC in /*) mpicc_path="$DEFAULT_MPICC" ;; *) AC_PATH_PROG(mpicc_path, $DEFAULT_MPICC, [no], [$simgrid_dir/bin:$PATH]) ;; esac # We test if the MPICC compiler exists if test ! -x $mpicc_path; then AC_MSG_RESULT(The mpicc compiler '$mpicc_path' does not have the execute permission) mpicc_path=no fi AC_MSG_CHECKING(whether mpicc is available) AC_MSG_RESULT($mpicc_path) AC_SUBST(MPICC, $mpicc_path) if test x$mpicc_path != xno ; then MPIPATH=$(dirname $mpicc_path):$PATH else MPIPATH=$PATH fi #Check MPICXX/MPIC++ if test x$enable_simgrid = xyes ; then DEFAULT_MPICXX=smpicxx else DEFAULT_MPICXX=mpicxx fi AC_ARG_WITH(mpicxx, [AS_HELP_STRING([--with-mpicxx=], [Name or path of the mpicxx/mpic++ compiler])], [DEFAULT_MPICXX=$withval]) case $DEFAULT_MPICXX in /*) mpicxx_path="$DEFAULT_MPICXX" ;; *) AC_PATH_PROG(mpicxx_path, $DEFAULT_MPICXX, [no], [$MPIPATH]) ;; esac # try with mpic++ if mpicxx was not found if test x$mpicxx_path = xno ; then DEFAULT_MPICXX=mpic++ AC_PATH_PROG(mpicxx_path, $DEFAULT_MPICXX, [no], [$MPIPATH]) fi # We test if the MPICXX/MPIC++ compiler exists if test ! -x $mpicxx_path; then AC_MSG_RESULT(The mpicxx compiler '$mpicxx_path' does not have the execute permission) mpicxx_path=no fi AC_MSG_CHECKING(whether mpicxx is available) AC_MSG_RESULT($mpicxx_path) AC_SUBST(MPICXX, $mpicxx_path) # Check if mpiexec is available if test x$enable_simgrid = xyes ; then DEFAULT_MPIEXEC=smpirun AC_ARG_WITH(smpirun, [AS_HELP_STRING([--with-smpirun[=]], [Name or path of the smpirun helper])], [DEFAULT_MPIEXEC=$withval]) else DEFAULT_MPIEXEC=mpiexec AC_ARG_WITH(mpiexec, [AS_HELP_STRING([--with-mpiexec=], [Name or path of mpiexec])], [DEFAULT_MPIEXEC=$withval]) fi case $DEFAULT_MPIEXEC in /*) mpiexec_path="$DEFAULT_MPIEXEC" ;; *) AC_PATH_PROG(mpiexec_path, $DEFAULT_MPIEXEC, [no], [$MPIPATH]) esac AC_MSG_CHECKING(whether mpiexec is available) AC_MSG_RESULT($mpiexec_path) # We test if MPIEXEC exists if test ! -x $mpiexec_path; then AC_MSG_RESULT(The mpiexec script '$mpiexec_path' is not valid) default_enable_mpi_check=no mpiexec_path="" fi AC_SUBST(MPIEXEC,$mpiexec_path) ############################################################################### # # # MPI # # # ############################################################################### AC_ARG_ENABLE(mpi, [AS_HELP_STRING([--disable-mpi], [Disable StarPU MPI library generation])], [enable_mpi=$enableval], [enable_mpi=$default_enable_mpi]) if test x$enable_mpi = xmaybe ; then if test -x "$mpicc_path"; then enable_mpi=yes else enable_mpi=no fi fi # in case MPI was explicitely required, but mpicc is not available, this is an error if test x$enable_mpi = xyes -a ! -x "$mpicc_path"; then AC_MSG_ERROR([Compiler MPI '$mpicc_path' not valid]) fi build_mpi_lib=$enable_mpi ############################################################################### # # # NEW MADELEINE # # # ############################################################################### AC_ARG_ENABLE(nmad, [AS_HELP_STRING([--enable-nmad], [Enable StarPU MPI library generation using the new madeleine backend])], [enable_nmad=$enableval], [enable_nmad=no]) build_nmad_lib=no AC_SUBST(CC_OR_MPICC, $cc_or_mpicc) #We can only build StarPU MPI Library if User wants it and MPI is available if test x$enable_mpi = xyes -a x$enable_nmad = xyes ; then build_nmad_lib=yes build_mpi_lib=no PKG_CHECK_MODULES([NMAD],[nmad]) AC_CHECK_DECL([piom_ltask_set_bound_thread_os_indexes], have_piom_ltask_set_bound_thread_os_indexes=yes, have_piom_ltask_set_bound_thread_os_indexes=no, [[#include ]]) if test x$have_piom_ltask_set_bound_thread_os_indexes = xyes; then AC_DEFINE(HAVE_PIOM_LTASK_SET_BOUND_THREAD_OS_INDEXES, [1], [piom_ltask_set_bound_thread_os_indexes is availabe]) fi else build_nmad_lib=no fi ############################################################################### # # # MPI Master Slave # # # ############################################################################### AC_ARG_ENABLE(mpi-master-slave, [AS_HELP_STRING([--enable-mpi-master-slave], [Enable StarPU to run with the master-slave mode])], use_mpi_master_slave=$enableval, use_mpi_master_slave=no) #We can only build MPI Master Slave if User wants it and MPI compiler are available if test x$use_mpi_master_slave = xyes -a x$mpicc_path != xno -a x${mpicxx_path} != xno ; then build_mpi_master_slave=yes else build_mpi_master_slave=no fi #users cannot use both at the same time if test x$build_mpi_master_slave = xyes -a x$enable_mpi = xyes; then AC_MSG_WARN(StarPU-MPI and MPI Master-Slave cannot be used at the same time ! Disabling StarPU-MPI...) build_mpi_lib=no build_nmad_lib=no enable_mpi=no fi if test x$build_mpi_master_slave = xyes; then AC_DEFINE(STARPU_USE_MPI_MASTER_SLAVE, [1], [MPI Master Slave support is enabled]) CC=$mpicc_path CCLD=$mpicc_path CXX=$mpicxx_path CXXLD=mpicxx_path fi AC_ARG_WITH(mpi-master-slave-multiple-thread, [AS_HELP_STRING([--with-mpi-master-slave-multiple-thread])], [AC_DEFINE([STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD], [1], [Use multiple threads to communicate with slaves])]) AC_MSG_CHECKING(whether the master-slave mode should be enabled) AC_MSG_RESULT($build_mpi_master_slave) AM_CONDITIONAL([STARPU_USE_MPI_MASTER_SLAVE], [test x$build_mpi_master_slave = xyes]) AC_MSG_CHECKING(maximum number of MPI master-slave devices) AC_ARG_ENABLE(maxmpidev, [AS_HELP_STRING([--enable-maxmpidev=], [maximum number of MPI master-slave devices])], nmaxmpidev=$enableval, [ if test x$build_mpi_master_slave = xyes; then nmaxmpidev=4 else nmaxmpidev=0 fi ]) AC_MSG_RESULT($nmaxmpidev) AC_DEFINE_UNQUOTED(STARPU_MAXMPIDEVS, [$nmaxmpidev], [maximum number of MPI devices]) ############################################################################### # # # Miscellaneous things for MPI # # # ############################################################################### AC_ARG_ENABLE(mpi-pedantic-isend, [AS_HELP_STRING([--enable-mpi-pedantic-isend], [Prevent StarPU MPI from reading buffers while being sent over MPI])], enable_mpi_pedantic_isend=$enableval, enable_mpi_pedantic_isend=no) if test x$enable_mpi_pedantic_isend = xyes; then AC_DEFINE(STARPU_MPI_PEDANTIC_ISEND, [1], [enable StarPU MPI pedantic isend]) fi # 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]), [enable_mpi_check=$enableval], [enable_mpi_check=$default_enable_mpi_check]) running_mpi_check=no if test -d "$srcdir/.git" -o -f "$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 if test x$enable_mpi = xno ; then running_mpi_check=no fi AM_CONDITIONAL(STARPU_MPI_CHECK, test x$running_mpi_check = xyes) AC_MSG_CHECKING(whether MPI tests should be run) AC_MSG_RESULT($running_mpi_check) AC_MSG_CHECKING(whether the StarPU MPI library should be generated) AC_MSG_RESULT($build_mpi_lib) AC_MSG_CHECKING(whether the StarPU MPI nmad library should be generated) AC_MSG_RESULT($build_nmad_lib) if test x$build_mpi_lib = xyes -o x$build_nmad_lib = xyes ; then AC_DEFINE(STARPU_USE_MPI,[1],[whether the StarPU MPI library is available]) if test x$build_mpi_lib = xyes ; then AC_DEFINE(STARPU_USE_MPI_MPI,[1],[whether the StarPU MPI library (with a native MPI implementation) is available]) else AC_DEFINE(STARPU_USE_MPI_NMAD,[1],[whether the StarPU MPI library (with a NewMadeleine implementation) is available]) fi fi if test x$enable_mpi = xyes ; then if test x$enable_simgrid = xyes ; then if test x$enable_shared = xyes ; then AC_MSG_ERROR([MPI with simgrid can not work with shared libraries, use --disable-shared to fix this, or disable MPI with --disable-mpi]) else CFLAGS="$CFLAGS -fPIC" CXXFLAGS="$CXXFLAGS -fPIC" NVCCFLAGS="$NVCCFLAGS --compiler-options -fPIC" FFLAGS="$FFLAGS -fPIC" FCLAGS="$FFLAGS -fPIC" fi fi fi AM_CONDITIONAL(STARPU_USE_MPI_MPI, test x$build_mpi_lib = xyes) AM_CONDITIONAL(STARPU_USE_MPI_NMAD, test x$build_nmad_lib = xyes) AM_CONDITIONAL(STARPU_USE_MPI, test x$build_nmad_lib = xyes -o x$build_mpi_lib = xyes) AC_ARG_WITH(mpiexec-args, [AS_HELP_STRING([--with-mpiexec-args[=]], [Arguments for mpiexec])], [ mpiexec_args=$withval ]) AC_SUBST(MPIEXEC_ARGS,$mpiexec_args) 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 if test x$enable_mpi = xyes -o x$build_mpi_master_slave = 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. # openmpi version MPICC_LDFLAGS=`$mpicc_path --showme:link 2>/dev/null` if test -z "$MPICC_LDFLAGS" then # mpich version MPICC_LDFLAGS=`$mpicc_path -link_info | awk '{$1=""; print}'` fi AC_SUBST(MPICC_LDFLAGS) else cc_or_mpicc=$CC fi AC_SUBST(CC_OR_MPICC, $cc_or_mpicc) ############################################################################### # # # 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], [disable 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"]) ############################################################################### ############################################################################### # # # NUMA memory nodes # # # ############################################################################### AC_MSG_CHECKING(maximum number of NUMA nodes) AC_ARG_ENABLE(maxnumanodes, [AS_HELP_STRING([--enable-maxnumanodes=], [maximum number of NUMA nodes])], nmaxnumanodes=$enableval, nmaxnumanodes=2) AC_MSG_RESULT($nmaxnumanodes) AC_DEFINE_UNQUOTED(STARPU_MAXNUMANODES, [$nmaxnumanodes], [maximum number of NUMA nodes]) ############################################################################### 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*|*-*-msys*) 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], [ LIBS="$LIBS -lpthread" STARPU_EXPORTED_LIBS="$STARPU_EXPORTED_LIBS -lpthread" ]) 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_FUNCS([scandir]) 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([copy_file_range]) AC_CHECK_FUNCS([mkostemp]) AC_CHECK_FUNCS([mkdtemp]) AC_CHECK_FUNCS([pread pwrite]) AC_ARG_ENABLE(hdf5, [AS_HELP_STRING([--enable-hdf5], [disable HDF5 support])], enable_hdf5=$enableval, enable_hdf5=no) if test "x$enable_hdf5" != xno ; then AC_ARG_WITH(hdf5-include-dir, [AS_HELP_STRING([--with-hdf5-include-dir=], [specify where HDF5 headers are installed])], [ hdf5_include_dir="$withval" ], [hdf5_include_dir=""]) hdf5_inc_dir="/usr/include/hdf5 /usr/include/hdf5/serial ${hdf5_include_dir}" enable_include_hdf5=no for f in $hdf5_inc_dir; do if test -n "$f" ; then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="$CPPFLAGS -I$f" AC_CHECK_HEADERS([hdf5.h]) if test "$ac_cv_header_hdf5_h" = "yes" ; then CPPFLAGS="-I${f} ${SAVED_CFLAGS}" enable_include_hdf5=yes break else CPPFLAGS=${SAVED_CPPFLAGS} fi unset ac_cv_header_hdf5_h fi done AC_ARG_WITH(hdf5-lib-dir, [AS_HELP_STRING([--with-hdf5-lib-dir=], [specify where HDF5 libraries are installed])], [ hdf5_libraries_dir="$withval" ], [hdf5_libraries_dir=""]) hdf5_lib_dir="/usr/lib/x86_64-linux-gnu/hdf5 /usr/lib/x86_64-linux-gnu/hdf5/serial ${hdf5_libraries_dir}" enable_libraries_hdf5=no for f in $hdf5_lib_dir; do if test -n "$f" ; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS=-L${f} STARPU_HAVE_LIBRARY(HDF5, [hdf5]) if test "$ac_cv_lib_hdf5_main" = "yes" ; then LDFLAGS="-L${f} ${SAVED_LDFLAGS} ${STARPU_HDF5_LDFLAGS}" enable_libraries_hdf5=yes break else LDFLAGS=${SAVED_LDFLAGS} fi unset ac_cv_lib_hdf5_main fi done fi if test "x$enable_libraries_hdf5" = "xyes" -a "x$enable_include_hdf5" = "xyes" -a "x$enable_hdf5" != "xno"; then AC_DEFINE([STARPU_HAVE_HDF5], [1], [Define to 1 if you have the header file.]) enable_hdf5=yes else enable_hdf5=no fi AM_CONDITIONAL(STARPU_HAVE_HDF5, test "x$enable_hdf5" = "xyes") # 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_ATOMIC_COMPARE_EXCHANGE_N STARPU_CHECK_ATOMIC_COMPARE_EXCHANGE_N # This defines HAVE_ATOMIC_EXCHANGE_N STARPU_CHECK_ATOMIC_EXCHANGE_N # This defines HAVE_ATOMIC_FETCH_ADD STARPU_CHECK_ATOMIC_FETCH_ADD # This defines HAVE_ATOMIC_FETCH_OR STARPU_CHECK_ATOMIC_FETCH_OR # This defines HAVE_ATOMIC_TEST_AND_SET STARPU_CHECK_ATOMIC_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 library is available in $__cuda_L) AC_MSG_RESULT() LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" 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 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} -lcudart" 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 -lcudart" STARPU_CUFFT_LDFLAGS="-lcufft" AC_LANG_PUSH([C++]) case \ $NVCCFLAGS\ in *\ -std=*\ *) ;; *) SAVED_CXX="$CXX" CXX="$NVCC" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #include #else #include #endif ]])],, NVCCFLAGS="-std=c++11 $NVCCFLAGS") CXX="$SAVED_CXX" esac AC_LANG_POP([C++]) 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 missing from existing flags if test x$SIZEOF_VOID_P = x8; then case \ $NVCCFLAGS\ in *\ -m64\ *) ;; *) NVCCFLAGS="${NVCCFLAGS} -m64" ;; esac fi SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${STARPU_CUDA_CPPFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" SAVED_LIBS="${LIBS}" AC_CHECK_HEADERS([cuda_gl_interop.h]) AC_CHECK_LIB([cusparse], [cusparseCreate], [AC_DEFINE([HAVE_LIBCUSPARSE], [1], [Define to 1 if you have the cusparse library]) STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcusparse"]) AC_CHECK_DECLS([cusparseSetStream], [], [], [[#include ]]) LIBS="${LIBS} -lnvidia-ml" AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[#include ]], [[nvmlInit();]] )], [ AC_RUN_IFELSE([AC_LANG_PROGRAM( [[#include ]], [[nvmlInit();]] )], [have_valid_nvml="yes"], [ AC_MSG_RESULT([NVML found and can be compiled, but compiled application can not be run, you are probably on a machine without the CUDA driver]) have_valid_nvml="no" ]) ], [ AC_MSG_WARN([NVML found, but nvml.h could not be compiled]) have_valid_nvml="no" ] ) if test x$have_valid_nvml = xyes ; then AC_CHECK_DECLS([nvmlDeviceGetTotalEnergyConsumption], [ AC_CHECK_FUNCS([nvmlDeviceGetTotalEnergyConsumption]) ], [], [[#include ]]) AC_DEFINE([STARPU_HAVE_LIBNVIDIA_ML], [1], [Define to 1 if you have the nvidia-ml library]) STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lnvidia-ml" fi AC_MSG_CHECKING(whether nvidia-ml should be used) AC_MSG_RESULT($have_valid_nvml) CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}" fi 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=$enable_cuda]) if test x$enable_cuda_memcpy_peer = xyes; then AC_DEFINE(STARPU_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 AC_MSG_CHECKING(whether asynchronous MPI Master Slave copy should be disabled) AC_ARG_ENABLE(asynchronous-mpi-master-slave-copy, [AS_HELP_STRING([--disable-asynchronous-mpi-master-slave-copy], [disable asynchronous copy between MPI Master and MPI Slave devices])], enable_asynchronous_mpi_master_slave_copy=$enableval, enable_asynchronous_mpi_master_slave_copy=yes) disable_asynchronous_mpi_master_slave_copy=no if test x$enable_asynchronous_mpi_master_slave_copy = xno ; then disable_asynchronous_mpi_master_slave_copy=yes fi AC_MSG_RESULT($disable_asynchronous_mpi_master_slave_copy) if test x$disable_asynchronous_mpi_master_slave_copy = xyes ; then AC_DEFINE([STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY], [1], [Define to 1 to disable asynchronous copy between MPI Master and MPI Slave devices]) 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, [ if test x$enable_mic = xyes; then nmaxmicdev=4 else nmaxmicdev=0 fi ]) 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 ############################################################################### # # # 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" FFLAGS="$FFLAGS -O0" FCFLAGS="$FCFLAGS -O0" enable_spinlock_check=yes if test x$GCC = xyes; then IS_SUPPORTED_CFLAG(-Og) IS_SUPPORTED_CXXFLAG(-Og) IS_SUPPORTED_FFLAG(-Og) IS_SUPPORTED_FCFLAG(-Og) 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" FFLAGS="$FFLAGS -fstack-protector-all" FCFLAGS="$FCFLAGS -fstack-protector-all" fi fi fi else CFLAGS="-O3 $CFLAGS" CXXFLAGS="-O3 $CXXFLAGS" FFLAGS="-O3 $FFLAGS" FCFLAGS="-O3 $FCFLAGS" fi AC_MSG_CHECKING(whether gdb information should be enabled) AC_ARG_ENABLE(gdb, [AS_HELP_STRING([--disable-gdb], [disable gdb information])], enable_gdb=$enableval, enable_gdb=yes) AC_MSG_RESULT($enable_gdb) AC_MSG_CHECKING(whether full gdb information should be enabled) AC_ARG_ENABLE(full-gdb-information, [AS_HELP_STRING([--disable-full-gdb-information], [disable full gdb information])], enable_full_gdb_information=$enableval, enable_full_gdb_information=yes) AC_MSG_RESULT($enable_full_gdb_information) if test x$enable_gdb = xyes; then if test x$enable_full_gdb_information = xyes -a x$GCC = xyes; then CFLAGS+=" -gdwarf-2 -g3" CXXFLAGS+=" -gdwarf-2 -g3" FFLAGS+=" -gdwarf-2 -g3" FCFLAGS+=" -gdwarf-2 -g3" LDFLAGS+=" -gdwarf-2 -g3" else CFLAGS+=" -g " CXXFLAGS+=" -g " FFLAGS+=" -g " FCFLAGS+=" -g " LDFLAGS+=" -g " fi else CFLAGS+=" -g0 " CXXFLAGS+=" -g0 " FFLAGS+=" -g0 " FCFLAGS+=" -g0 " LDFLAGS+=" -g0 " fi 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 # fortify gets really enabled only with optimizations, avoid enabling it # when optimizations are not enabled, because with some glibc it # spews a lot of warnings. if test x$enable_debug != xyes; then if test x$GCC = xyes; then CPPFLAGS="-D_FORTIFY_SOURCE=1 $CPPFLAGS" 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" FFLAGS="${FFLAGS} --coverage" FCFLAGS="${FCFLAGS} --coverage" LDFLAGS="${LDFLAGS} --coverage" LIBS="${LIBS} -lgcov" fi AC_MSG_CHECKING(whether coverity mode should be enabled) AC_ARG_ENABLE(coverity, [AS_HELP_STRING([--enable-coverity], [enable coverity mode])], enable_coverity=$enableval, enable_coverity=no) AC_MSG_RESULT($enable_coverity) AM_CONDITIONAL(STARPU_COVERITY, test x$enable_coverity = xyes) # 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([fxt_close]) AC_CHECK_FUNCS([enable_fut_flush]) AC_CHECK_FUNCS([fut_set_filename]) AC_CHECK_FUNCS([fut_setup_flush_callback]) 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 ]]) AC_CHECK_DECLS([fut_setup_flush_callback], [], [], [[#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], [have_valid_poti=yes], [have_valid_poti=no]) AC_ARG_ENABLE(poti, [AS_HELP_STRING([--enable-poti], [Enable the use of the POTI library to generate Paje traces])], enable_poti=$enableval, enable_poti=no) if test x$enable_poti = xyes -a x$have_valid_poti = xyes ; then AC_DEFINE(STARPU_HAVE_POTI, [1], [Define to 1 if you have libpoti and it is meant to be used]) save_LIBS="$LIBS" LIBS="$LIBS $POTI_LIBS" AC_CHECK_FUNCS([poti_init_custom poti_user_NewEvent]) LIBS="$save_LIBS" FXT_CFLAGS="$FXT_CFLAGS $POTI_CFLAGS" FXT_LIBS="$FXT_LIBS $POTI_LIBS" fi 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 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 memory nodes to use per MPI rank) AC_ARG_ENABLE(maxnodes, [AS_HELP_STRING([--enable-maxnodes=], [maximum number of memory nodes per MPI rank])], 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 + $nmaxmpidev` else # We have one memory node shared by all CPU workers, one node per GPU # and per MIC device # we add nodes to use 2 memory disks nodes=`expr $nmaxnumanodes + 2` 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 #nmaxmpidev = 0 if mpi master-slave is disabled nodes=`expr $nodes + $nmaxmpidev` 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_WARN([Note: the wt_mask feature only supports 32 memory nodes]) 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 #By default, if we cannot build mpi master-slave nmaxmpidev is set to zero. #But with the multiplication with maxcpus, we need to put it to one. if test x$build_mpi_master_slave != xyes; then nmaxmpidev=1 fi fi nmaxworkers=`expr 16 \* \( \( \( $nmaxmpidev \* $maxcpus \) + $nmaxcudadev + $nmaxopencldev + $nmaxmicthreads + 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]) ############################################################################### # # # MP Common settings # # # ############################################################################### AM_CONDITIONAL([STARPU_USE_MP], [test "x$enable_mic" = "xyes" -o "x$build_mpi_master_slave" = "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$build_mpi_master_slave = 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]) ############################################################################### # # # Flags for C Compiler # # # ############################################################################### 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) IS_SUPPORTED_CFLAG(-fno-common) if test x$enable_debug = xyes; then IS_SUPPORTED_CFLAG(-fno-optimize-sibling-calls) fi 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]) AC_ARG_WITH(check-flags, [AS_HELP_STRING([--with-check-flags], [Specify flags for C and Fortran compilers])], check_flags=$withval, check_flags="") if test "x$check_flags" != "x" ; then for xflag in $check_flags do IS_SUPPORTED_CFLAG($x) IS_SUPPORTED_CXXFLAG($x) IS_SUPPORTED_FFLAG($x) IS_SUPPORTED_FCFLAG($x) done fi ############################################################################### # # # 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) use_mpi_fort=no 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_LANG_PUSH([Fortran]) OLD_FCFLAGS="$FCFLAGS" FCFLAGS="$FCFLAGS -cpp" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9) #error GFortran too old, version >= 4.9.x needed, Fortran examples will not be built #endif ]] )], [enable_build_fortran="yes"], [enable_build_fortran="no"]) FCFLAGS="$OLD_FCFLAGS" AC_LANG_POP([Fortran]) 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 enable_build_fortran="yes" 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) enable_build_fortran="yes" 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$build_mpi_lib = xyes -o x$build_nmad_lib = xyes -o x$build_mpi_master_slave = xyes ; then #Check MPIFORT if test x$enable_simgrid = xyes ; then DEFAULT_MPIFORT=smpifort else DEFAULT_MPIFORT=mpifort fi AC_ARG_WITH(mpifort, [AS_HELP_STRING([--with-mpifort=], [Name or path of the mpifort compiler])], [DEFAULT_MPIFORT=$withval]) case $DEFAULT_MPIFORT in /*) mpifort_path="$DEFAULT_MPIFORT" ;; *) AC_PATH_PROG(mpifort_path, $DEFAULT_MPIFORT, [no], [$simgrid_dir/bin:$PATH]) ;; esac # We test if the MPIFORT compiler exists if test ! -x $mpifort_path; then AC_MSG_RESULT(The mpifort compiler '$mpifort_path' does not have the execute permission) mpifort_path=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]) fi fi AC_MSG_CHECKING(whether mpifort is available) AC_MSG_RESULT($mpifort_path) AC_SUBST(MPIFORT, $mpifort_path) if test x$mpifort_path != xno ; then MPIPATH=$(dirname $mpifort_path):$PATH else MPIPATH=$PATH 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 #We have MPI C/C++ compiler if test x$build_mpi_master_slave = xyes; then #Check if we can compile fortran cases if test x$use_mpi_fort = xyes ; then F77LD=$mpifort_path FCLD=$mpifort_path F77=$mpifort_path FC=$mpifort_path else 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"]) ######################################################################## # # # Cluster support # # # ######################################################################## AC_ARG_ENABLE(cluster, [AS_HELP_STRING([--enable-cluster], [build the cluster support])], enable_cluster=$enableval, enable_cluster=no) AC_MSG_CHECKING(for cluster support) if test x$enable_cluster = xyes; then AC_DEFINE(STARPU_CLUSTER, [1], [Define this to enable cluster support]) AC_OPENMP fi AM_CONDITIONAL([STARPU_CLUSTER], [test "x$enable_cluster" = "xyes"]) AC_MSG_RESULT($enable_cluster) ############################################################################### # # # OpenMP runtime support # # # ############################################################################### AC_ARG_ENABLE(openmp, [AS_HELP_STRING([--enable-openmp], [build the OpenMP runtime support])], enable_openmp=$enableval, enable_openmp=no) openmp_msg="" if test x$starpu_windows = xyes ; then enable_openmp=no openmp_msg="disabled on windows" fi if test "x$use_mpi_master_slave" = "xyes" ; then enable_openmp=no openmp_msg="incompatibility with MPI master slave support" fi if test x$enable_openmp = xyes; then AC_DEFINE(STARPU_OPENMP, [1], [Define this to enable OpenMP runtime support]) fi AC_MSG_CHECKING(for OpenMP runtime support) AM_CONDITIONAL([STARPU_OPENMP], [test "x$enable_openmp" = "xyes"]) AC_MSG_RESULT($enable_openmp $openmp_msg) if test x$enable_simgrid = xno; then if test -n "{OPENMP_CFLAGS}"; then CFLAGS="${CFLAGS} ${OPENMP_CFLAGS}" STARPU_OMP_LDFLAGS="${OPENMP_CFLAGS}" fi fi AM_CONDITIONAL([STARPU_HAVE_OPENMP],[test x$enable_simgrid = xno -a -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 # MPI Master Slave and SOCL are not compatible if test "x$use_mpi_master_slave" = "xyes" ; then if test "x$enable_socl" = "xyes" ; then AC_MSG_ERROR([MPI Master-Slave and SOCL can not be used at the same time !]) fi if test "x$enable_socl" = "xmaybe" ; then enable_socl=no fi 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([STARPU_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(STARPU_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(STARPU_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([STARPU_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([STARPU_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" = "xopenblas" ; then blas_lib=openblas elif test "x$enableval" = "xnone" ; then blas_lib=none elif test "x$enableval" = "xmkl" ; then blas_lib=mkl elif test "x$enableval" = "xarmpl" ; then blas_lib=armpl 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 = xopenblas; then PKG_CHECK_MODULES([OPENBLAS], [openblas], [PKG_CHECK_MODULES([BLAS_OPENBLAS], [blas-openblas], [AC_DEFINE([STARPU_OPENBLAS], [1], [Define to 1 if you use the openblas library.]) AC_SUBST([STARPU_OPENBLAS], [1]) CFLAGS="${CFLAGS} ${OPENBLAS_CFLAGS} ${BLAS_OPENBLAS_CFLAGS} " LIBS="${LIBS} ${OPENBLAS_LIBS} ${BLAS_OPENBLAS_LIBS} " blas_lib=openblas ], [ if test x$blas_lib = xopenblas; then STARPU_CHECK_LIB(OPENBLAS, blas-openblas, cblas_sgemm,,AC_MSG_ERROR([cannot find blas-openblas lib]),[-lblas-openblas]) AC_DEFINE([STARPU_OPENBLAS], [1], [Define to 1 if you use the openblas library.]) AC_SUBST([STARPU_OPENBLAS], [1]) fi ]) ], [ if test x$blas_lib = xopenblas; then STARPU_CHECK_LIB(OPENBLAS, openblas, cblas_sgemm,,AC_MSG_ERROR([cannot find openblas lib]),[-lopenblas]) AC_DEFINE([STARPU_OPENBLAS], [1], [Define to 1 if you use the openblas library.]) AC_SUBST([STARPU_OPENBLAS], [1]) 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 -o x$blas_lib = xarmpl; then # Should we use ARMPL ? if test -n "$ARMPL_DIR" ; then CPPFLAGS="${CPPFLAGS} -I$ARMPL_INCLUDES" SAVED_LIBS=$LIBS STARPU_BLAS_LDFLAGS="-L$ARMPL_LIBRARIES -larmpl_lp64 -lgfortran -lm" LIBS="$LIBS $STARPU_BLAS_LDFLAGS" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include ]], [[ ]])], [ blas_lib=armpl ], [ STARPU_BLAS_LDFLAGS="" ], ) LIBS=$SAVED_LIBS fi AC_ARG_WITH(armpl-cflags, [AS_HELP_STRING([--with-armpl-cflags], [specify ARMPL compilation flags])], [ CPPFLAGS="${CPPFLAGS} $withval" blas_lib=armpl ]) AC_ARG_WITH(armpl-ldflags, [AS_HELP_STRING([--with-armpl-ldflags], [specify ARMPL linking flags])], [ STARPU_BLAS_LDFLAGS="$withval" blas_lib=armpl ]) if test x$blas_lib = xarmpl; then AC_DEFINE(STARPU_ARMPL, [1], [use ARMPL 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 if test x$blas_lib = xsystem; then AC_CHECK_HEADER([cblas.h], [have_cblas_h=yes], [have_cblas_h=no]) fi AM_CONDITIONAL(STARPU_HAVE_CBLAS_H, test x$have_cblas_h = xyes) if test x$have_cblas_h = xyes; then AC_DEFINE(STARPU_HAVE_CBLAS_H, [1], [The blas library has blas.h]) fi if test x$blas_lib != xnone; then AC_DEFINE(STARPU_HAVE_BLAS, [1], [The blas library is available]) SAVED_LIBS="$LIBS" LIBS="$LIBS -lblas" AC_CHECK_FUNCS([cblas_sgemv]) LIBS="$SAVED_LIBS" fi AM_CONDITIONAL(STARPU_HAVE_CBLAS_SGEMV, test $HAVE_CBLAS_SGEMV = 1) AM_CONDITIONAL(STARPU_ATLAS_BLAS_LIB, test x$blas_lib = xatlas) AM_CONDITIONAL(STARPU_GOTO_BLAS_LIB, test x$blas_lib = xgoto) AM_CONDITIONAL(STARPU_MKL_BLAS_LIB, test x$blas_lib = xmkl) AM_CONDITIONAL(STARPU_SYSTEM_BLAS_LIB, test x$blas_lib = xsystem) AM_CONDITIONAL(STARPU_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) ############################################################################### # # # Multiple linear regression # # # ############################################################################### AC_ARG_ENABLE(mlr, [AS_HELP_STRING([--enable-mlr], [Enable multiple linear regression models])], enable_mlr=$enableval, enable_mlr=no) AC_ARG_ENABLE(mlr-system-blas, [AS_HELP_STRING([--enable-mlr-system-blas], [Make the multiple linear regression models use the system BLAS instead of min-dgels])], enable_mlr_blas=$enableval, enable_mlr_blas=no) AC_MSG_CHECKING(whether multiple linear regression models are disabled) if test x$enable_mlr = xyes -a "$starpu_windows" != "yes" ; then AC_MSG_RESULT(no) install_min_dgels=no support_mlr=yes STARPU_SEARCH_LIBS(LAPACK,[dgels_],[lapack],use_system_lapack=yes,,) if test x$blas_lib = xnone ; then use_system_lapack=no fi if test x$enable_mlr_blas = xyes -a x$use_system_lapack = xyes; then AC_DEFINE(STARPU_MLR_MODEL, [1], [use reflapack library]) LDFLAGS="-llapack $LDFLAGS" else if test x$enable_mlr_blas=xyes -a x$blas_lib = xmkl; then AC_DEFINE(STARPU_MLR_MODEL, [1], [use mkl library]) else AC_MSG_CHECKING(whether min-dgels is linked) if test x"$DGELS_LIBS" != x; then AC_MSG_RESULT(yes) AC_DEFINE(STARPU_MLR_MODEL, [1], [use user defined library]) AC_ARG_VAR([DGELS_LIBS], [linker flags for lapack dgels]) else AC_MSG_RESULT(no) AC_MSG_CHECKING(min-dgels source) if test "${cross_compiling}" != "no" ; then # Cross-compiling is not supported by min-dgels AC_MSG_RESULT(no) install_min_dgels=no support_mlr=no else AC_MSG_RESULT(yes) DGELS_LIBS="-Wl,--start-group $STARPU_BUILD_DIR/min-dgels/build/minlibblas.a $STARPU_BUILD_DIR/min-dgels/build/minlibdgels.a $STARPU_BUILD_DIR/min-dgels/build/minlibf2c.a -Wl,--end-group" AC_DEFINE(STARPU_MLR_MODEL, [1], [use user defined library]) AC_DEFINE(STARPU_BUILT_IN_MIN_DGELS, [1], [use built-in min_dgels]) AC_ARG_VAR([DGELS_LIBS], [linker flags for lapack dgels]) install_min_dgels=yes fi fi fi fi else AC_MSG_RESULT(yes) install_min_dgels=no support_mlr=no fi AM_CONDITIONAL(STARPU_USE_MIN_DGELS, test x$install_min_dgels = xyes) ########################################## # 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(STARPU_BUILD_STARPUFFT, [test x$fft_support = xyes]) AC_ARG_ENABLE(starpufft-examples, [AS_HELP_STRING([--enable-starpufft-examples], [enable build of StarPU FFT examples])], enable_starpufft_examples=$enableval, enable_starpufft_examples=no) AM_CONDITIONAL(STARPU_BUILD_STARPUFFT_EXAMPLES, [test x$enable_starpufft_examples = xyes]) ########################################## # hwloc # ########################################## have_valid_hwloc=no SAVED_LIBS="${LIBS}" 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 or pkg-config])] ) # 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'.])] ) LIBS="${HWLOC_LIBS} ${SAVED_LIBS}" 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]) AC_CHECK_FUNCS([hwloc_topology_set_components]) AC_CHECK_FUNCS([hwloc_cpukinds_get_nr]) AM_CONDITIONAL(STARPU_HWLOC_HAVE_TOPOLOGY_DUP, test $ac_cv_func_hwloc_topology_dup = yes) LIBS="${SAVED_LIBS}" 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 AC_ARG_ENABLE(icc, [AS_HELP_STRING([--enable-icc], [Enable the compilation of specific ICC examples])], enable_icc=$enableval, enable_icc=yes) ICC="" if test "$enable_icc" = "yes" ; then # Check if icc is available AC_CHECK_PROGS([ICC], [icc]) fi # 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])) ########################################## # Resource Manager # ########################################## starpurm_support=no starpurm_dlb_support=no AC_ARG_ENABLE(starpurm, [AS_HELP_STRING([--enable-starpurm], [enable resource management support])], enable_starpurm=$enableval, enable_starpurm=no) if test "x$enable_starpurm" != xno then starpurm_support=yes AC_MSG_CHECKING(whether resource management debug messages should be displayed) AC_ARG_ENABLE(starpurm-verbose, [AS_HELP_STRING([--enable-starpurm-verbose], [display resource management verbose debug messages])], enable_starpurm_verbose=$enableval, enable_starpurm_verbose=no) AC_MSG_RESULT($enable_starpurm_verbose) if test x$enable_starpurm_verbose = xyes; then AC_DEFINE(STARPURM_VERBOSE, [1], [display resource management verbose debug messages]) fi # DLB DLB_CFLAGS="" DLB_LIBS="" AC_ARG_ENABLE(dlb, [AS_HELP_STRING([--enable-dlb], [enable DLB support])], enable_dlb=$enableval, enable_dlb=no) if test "x$enable_dlb" != xno then AC_ARG_WITH(dlb-include-dir, [AS_HELP_STRING([--with-dlb-include-dir=], [specify where DLB headers are installed])], [dlb_inc_dirs="$withval"], [dlb_inc_dirs=""]) dlb_inc_dirs="${dlb_inc_dirs} /usr/include/dlb" dlb_incdir_found=no for dlb_incdir in $dlb_inc_dirs do if test -n "$dlb_incdir" then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS=-I${dlb_incdir} AC_CHECK_HEADERS([dlb.h]) if test "$ac_cv_header_dlb_h" = "yes" then CPPFLAGS="-I$dlb_incdir ${SAVED_CPPFLAGS}" DLB_CFLAGS="-I${dlb_incdir}" dlb_incdir_found=yes break else CPPFLAGS=${SAVED_CPPFLAGS} fi unset ac_cv_header_dlb_h fi done AC_ARG_WITH(dlb-lib-dir, [AS_HELP_STRING([--with-dlb-lib-dir=], [specify where DLB libraries are installed])], [dlb_lib_dirs="$withval"], [dlb_lib_dirs=""]) dlb_lib_dirs="${dlb_lib_dirs} /usr/lib/dlb" dlb_libdir_found=no for dlb_libdir in $dlb_lib_dirs do if test -n "$dlb_libdir" then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS=-L${dlb_libdir} AC_CHECK_LIB(dlb, [DLB_Init]) if test "$ac_cv_lib_dlb_DLB_Init" = "yes" then LDFLAGS="-L${dlb_libdir} ${SAVED_LDFLAGS} ${STARPU_DLB_LDFLAGS}" DLB_LIBS="-L${dlb_libdir} -ldlb" dlb_libdir_found=yes break else LDFLAGS=${SAVED_LDFLAGS} fi unset ac_cv_lib_dlb_DLB_Init fi done SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_CFLAGS="${CFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" CPPFLAGS="$HWLOC_CPPFLAGS -D_GNU_SOURCE $CPPFLAGS" CFLAGS="$HWLOC_CFLAGS $CFLAGS" LIBS="$HWLOC_LIBS $LIBS" # check whether libhwloc has a dedicated glibc-sched.h include for conversion with glibc cpusets AC_CHECK_HEADERS([hwloc/glibc-sched.h]) CPPFLAGS="$SAVED_CPPFLAGS" CFLAGS="$SAVED_CFLAGS" LIBS="$SAVED_LIBS" SAVED_CPPFLAGS="${CPPFLAGS}" SAVED_CFLAGS="${CFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" CPPFLAGS="$STARPU_CPPFLAGS $CPPFLAGS" CFLAGS="$STARPU_CFLAGS $CFLAGS" LIBS="$STARPU_LIBS $LIBS" # check if StarPU implements starpu_worker_set_going_to_sleep_callback() if test x$enable_worker_cb = xyes ; then AC_DEFINE([STARPURM_STARPU_HAVE_WORKER_CALLBACKS], [1], [Define to 1 if StarPU has support for worker callbacks.]) fi #AC_CHECK_FUNC([starpu_worker_set_going_to_sleep_callback],AC_DEFINE([STARPURM_STARPU_HAVE_WORKER_CALLBACKS], [1], [Define to 1 if StarPU has support for worker callbacks.])) CPPFLAGS="$SAVED_CPPFLAGS" CFLAGS="$SAVED_CFLAGS" LIBS="$SAVED_LIBS" if test "x$dlb_incdir_found" != "xyes" -o "x$dlb_libdir_found" != "xyes" then enable_dlb=no fi fi AC_MSG_CHECKING(whether DLB support should be enabled) AC_MSG_RESULT($enable_dlb) if test "x$enable_dlb" != "xno" then AC_DEFINE([STARPURM_HAVE_DLB], [1], [Define to 1 if dlb support is enabled.]) starpurm_dlb_support=yes AC_MSG_CHECKING(whether DLB resource management debug messages should be displayed) AC_ARG_ENABLE(starpurm-dlb-verbose, [AS_HELP_STRING([--enable-starpurm-dlb-verbose], [display resource management verbose debug messages])], enable_starpurm_dlb_verbose=$enableval, enable_starpurm_dlb_verbose=no) AC_MSG_RESULT($enable_starpurm_dlb_verbose) if test x$enable_starpurm_dlb_verbose = xyes; then AC_DEFINE(STARPURM_DLB_VERBOSE, [1], [display DLB resource management verbose debug messages]) fi AX_DLB_CALLBACK_ARG() fi AC_SUBST(DLB_CFLAGS) AC_SUBST(DLB_LIBS) fi AM_CONDITIONAL(STARPURM_HAVE_DLB, test x$starpurm_dlb_support == "xyes") AM_CONDITIONAL(STARPU_BUILD_STARPURM, [test x$starpurm_support = xyes]) AC_ARG_ENABLE(starpurm-examples, [AS_HELP_STRING([--enable-starpurm-examples], [enable build of StarPU Resource Manager examples])], enable_starpurm_examples=$enableval, enable_starpurm_examples=no) AM_CONDITIONAL(STARPU_BUILD_STARPURM_EXAMPLES, [test x$enable_starpurm_examples = xyes]) ########################################## # Documentation # ########################################## def_enable_build_doc="yes" available_doc="no" if test -d "$srcdir/doc/doxygen/html" ; then def_enable_build_doc="no" available_doc="yes" fi AC_ARG_ENABLE(build-doc, [AS_HELP_STRING([--disable-build-doc], [disable building of documentation])], enable_build_doc=$enableval, enable_build_doc=$def_enable_build_doc) AC_ARG_ENABLE(build-doc-pdf, [AS_HELP_STRING([--enable-build-doc-pdf], [enable building of PDF documentation])], enable_build_doc_pdf=$enableval, enable_build_doc_pdf=no) available_doc_pdf="no" if test -f "$srcdir/doc/doxygen/starpu.pdf" ; then enable_build_doc_pdf="no" available_doc_pdf="yes" fi # Check whether doxygen needed tools are installed AC_PATH_PROG(doxygencommand, doxygen) if test "$doxygencommand" = "" ; then enable_build_doc="no" enable_build_doc_pdf="no" fi AC_PATH_PROG(pdflatexcommand, pdflatex) if test "$pdflatexcommand" = "" ; then enable_build_doc_pdf="no" fi AC_PATH_PROG(epstopdfcommand, epstopdf) if test "$epstopdfcommand" = "" ; then enable_build_doc_pdf="no" fi AC_MSG_CHECKING(whether HTML documentation should be compiled) AC_MSG_RESULT($enable_build_doc) AC_MSG_CHECKING(whether HTML documentation is available) AC_MSG_RESULT($available_doc) AC_MSG_CHECKING(whether PDF documentation should be compiled) AC_MSG_RESULT($enable_build_doc_pdf) AC_MSG_CHECKING(whether PDF documentation is available) AC_MSG_RESULT($available_doc_pdf) AM_CONDITIONAL(STARPU_BUILD_DOC, [test x$enable_build_doc != xno]) AM_CONDITIONAL(STARPU_AVAILABLE_DOC, [test x$available_doc != xno]) AM_CONDITIONAL(STARPU_BUILD_DOC_PDF, [test x$enable_build_doc_pdf != xno]) AM_CONDITIONAL(STARPU_AVAILABLE_DOC_PDF, [test x$available_doc_pdf != xno]) ############################################################################### # # # Final settings # # # ############################################################################### # these are the flags needed for linking libstarpu (and thus also for static linking) LIBSTARPU_LDFLAGS="$STARPU_OPENCL_LDFLAGS $STARPU_CUDA_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 $STARPU_BLAS_LDFLAGS $STARPU_OMP_LDFLAGS $DGELS_LIBS" AC_SUBST([LIBSTARPU_LDFLAGS]) LIBSTARPU_LINK=libstarpu-$STARPU_EFFECTIVE_VERSION.la 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. AC_DEFINE(STARPU_STATIC_ONLY, [1], [Only static compilation was made]) STARPU_EXPORTED_LIBS="$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 tests/model-checking/starpu-mc.sh chmod +x examples/loader-cross.sh chmod +x examples/stencil/loader-cross.sh chmod +x tools/starpu_env chmod +x tools/starpu_codelet_profile chmod +x tools/starpu_codelet_histo_profile chmod +x tools/starpu_mpi_comm_matrix.py 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_mlr_analysis chmod +x tools/starpu_paje_sort chmod +x tools/starpu_smpirun chmod +x doc/doxygen/doxygen_filter.sh chmod +x doc/doxygen_dev/doxygen_filter.sh mkdir -p tests/microbenchs test -e tests/microbenchs/tasks_data_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_data_overhead.sh tests/microbenchs/ test -e tests/microbenchs/sync_tasks_data_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/sync_tasks_data_overhead.sh tests/microbenchs/ test -e tests/microbenchs/async_tasks_data_overhead.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/async_tasks_data_overhead.sh 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_sched.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead_sched.sh tests/microbenchs/ test -e tests/microbenchs/tasks_size_overhead_scheds.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/tasks_size_overhead_scheds.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/ test -e tests/microbenchs/microbench.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/microbench.sh tests/microbenchs/ test -e tests/microbenchs/parallel_dependent_homogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_dependent_homogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_heterogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_heterogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_heterogeneous_tasks.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_heterogeneous_tasks.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_homogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_homogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_independent_homogeneous_tasks.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_independent_homogeneous_tasks.sh tests/microbenchs/ test -e tests/microbenchs/parallel_redux_homogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_redux_homogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/parallel_redux_heterogeneous_tasks_data.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/parallel_redux_heterogeneous_tasks_data.sh tests/microbenchs/ test -e tests/microbenchs/bandwidth_scheds.sh || ln -sf $ac_abs_top_srcdir/tests/microbenchs/bandwidth_scheds.sh 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 tests/model-checking test -e tests/model-checking/prio_list.sh || ln -sf $ac_abs_top_srcdir/tests/model-checking/prio_list.sh tests/model-checking/ test -e tests/model-checking/barrier.sh || ln -sf $ac_abs_top_srcdir/tests/model-checking/barrier.sh tests/model-checking/ 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/ mkdir -p examples/cholesky test -e examples/cholesky/cholesky.sh || ln -sf $ac_abs_top_srcdir/examples/cholesky/cholesky.sh examples/cholesky/ mkdir -p examples/mult test -e examples/mult/sgemm.sh || ln -sf $ac_abs_top_srcdir/examples/mult/sgemm.sh examples/mult/ mkdir -p examples/scheduler test -e examples/scheduler/schedulers.sh || ln -sf $ac_abs_top_srcdir/examples/scheduler/schedulers.sh examples/scheduler test -e examples/scheduler/schedulers_context.sh || ln -sf $ac_abs_top_srcdir/examples/scheduler/schedulers_context.sh examples/scheduler 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 test -e tools/starpu_mlr_analysis.Rmd || ln -sf $ac_abs_top_srcdir/tools/starpu_mlr_analysis.Rmd tools/starpu_mlr_analysis.Rmd test -e tools/starpu_paje_summary.Rmd || ln -sf $ac_abs_top_srcdir/tools/starpu_paje_summary.Rmd tools/starpu_paje_summary.Rmd test -e tools/starpu_trace_state_stats.py || ln -sf $ac_abs_top_srcdir/tools/starpu_trace_state_stats.py tools/starpu_trace_state_stats.py chmod +x tools/starpu_trace_state_stats.py sed -i -e '/ STARPU_SRC_DIR /d' -e '/ STARPU_BUILD_DIR /d' src/common/config.h ]) # 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 src/common/config-src-build.h include/starpu_config.h starpurm/include/starpurm_config.h) SANITIZE=$(echo $CFLAGS | grep sanitize) AM_CONDITIONAL(STARPU_SANITIZE, test -n "$SANITIZE") AC_OUTPUT([ Makefile src/Makefile tools/Makefile tools/starpu_env tools/starpu_codelet_profile tools/starpu_codelet_histo_profile tools/starpu_mpi_comm_matrix.py tools/starpu_workers_activity tools/starpu_paje_draw_histogram tools/starpu_paje_state_stats tools/starpu_paje_summary tools/starpu_mlr_analysis 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 starpu-1.3.pc mpi/libstarpumpi.pc mpi/starpumpi-1.0.pc mpi/starpumpi-1.1.pc mpi/starpumpi-1.2.pc mpi/starpumpi-1.3.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 starpufft/starpufft-1.3.pc starpurm/Makefile starpurm/src/Makefile starpurm/examples/Makefile starpurm/starpurm-1.3.pc examples/Makefile examples/stencil/Makefile tests/Makefile tests/loader-cross.sh tests/model-checking/starpu-mc.sh examples/loader-cross.sh examples/stencil/loader-cross.sh mpi/Makefile mpi/src/Makefile mpi/tests/Makefile mpi/examples/Makefile mpi/GNUmakefile 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 doc/doxygen_dev/Makefile doc/doxygen_dev/doxygen-config.cfg doc/doxygen_dev/doxygen_filter.sh tools/msvc/starpu_var.bat min-dgels/Makefile ]) AC_MSG_NOTICE([ CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl 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 MIC threads: $nmaxmicthreads Maximum number of MPI master-slave devices: $nmaxmpidev Maximum number of memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $enable_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 Documentation HTML: $enable_build_doc Documentation PDF: $enable_build_doc_pdf Examples: $enable_build_examples StarPU Extensions: StarPU MPI enabled: $build_mpi_lib StarPU MPI(nmad) enabled: $build_nmad_lib MPI test suite: $running_mpi_check Master-Slave MPI enabled: $use_mpi_master_slave FFT Support: $fft_support Resource Management enabled: $starpurm_support OpenMP runtime support enabled: $enable_openmp Cluster support enabled: $enable_cluster SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ayu_msg HDF5 enabled: $enable_hdf5 Native fortran support: $enable_build_fortran Native MPI fortran support: $use_mpi_fort Support for multiple linear regression models: $support_mlr ]) 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 if test x"$starpu_windows" = xyes -a "x$STARPU_MS_LIB" = "x" ; then AC_MSG_NOTICE([ WARNING: lib was not found, you will not be able to build StarPU applications with Microsoft Visual Studio. Add to your PATH the directories for MSVC, e.g c:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE; c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin]) fi starpu-1.3.9+dfsg/doc/000077500000000000000000000000001413463044200145275ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/Makefile.am000066400000000000000000000021641413463044200165660ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-notests.mk SUBDIRS = doxygen SUBDIRS += doxygen_dev DIST_SUBDIRS = doxygen DIST_SUBDIRS += doxygen_dev EXTRA_DIST = tutorial/hello_world.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 txtdir = ${docdir}/tutorial txt_DATA = $(EXTRA_DIST) starpu-1.3.9+dfsg/doc/Makefile.in000066400000000000000000000665701413463044200166120ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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 distdir-am 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)/starpu-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 doxygen_dev DIST_SUBDIRS = doxygen doxygen_dev EXTRA_DIST = tutorial/hello_world.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 txtdir = ${docdir}/tutorial txt_DATA = $(EXTRA_DIST) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-notests.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.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): 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -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.3.9+dfsg/doc/doxygen/000077500000000000000000000000001413463044200162045ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen/Makefile.am000066400000000000000000000304051413463044200202420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 STARPU_BUILD_DOC if STARPU_BUILD_DOC_PDF all: $(DOX_HTML_DIR) $(DOX_PDF) EXTRA_DIST += $(DOX_HTML_DIR) $(DOX_PDF) txt_DATA = $(DOX_PDF) else all: $(DOX_HTML_DIR) EXTRA_DIST += $(DOX_HTML_DIR) endif DOX_HTML_SRCDIR=$(DOX_HTML_DIR) install-exec-hook: $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html \;) uninstall-hook: rm -rf $(DESTDIR)$(docdir)/manual/html else if STARPU_AVAILABLE_DOC EXTRA_DIST += $(top_srcdir)/doc/doxygen/html DOX_HTML_SRCDIR=$(top_srcdir)/doc/doxygen/html install-exec-hook: $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html \;) uninstall-hook: rm -rf $(DESTDIR)$(docdir)/manual/html endif if STARPU_AVAILABLE_DOC_PDF EXTRA_DIST += $(top_srcdir)/doc/doxygen/starpu.pdf txt_DATA = $(top_srcdir)/doc/doxygen/starpu.pdf 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_scheduling_policy_definition.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_support.doxy \ chapters/450_native_fortran_support.doxy \ chapters/460_socl_opencl_extensions.doxy \ chapters/470_simgrid.doxy \ chapters/480_openmp_runtime_support.doxy \ chapters/490_clustering_a_machine.doxy \ chapters/495_interoperability.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/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.c \ 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/fft_support.doxy \ chapters/api/versioning.doxy \ chapters/api/threads.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/starpu_chol_model_11_type.eps \ chapters/images/starpu_chol_model_11_type.pdf \ chapters/images/starpu_chol_model_11_type.png \ chapters/images/tasks_size_overhead.eps \ chapters/images/tasks_size_overhead.pdf \ chapters/images/tasks_size_overhead.png \ chapters/images/temanejo.png if STARPU_BUILD_DOC EXTRA_DIST += \ $(top_srcdir)/doc/doxygen/chapters/version.sty \ $(top_srcdir)/doc/doxygen/chapters/version.html 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` +"%F" > 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` +"%F" > 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_clusters.h \ $(top_srcdir)/include/starpu_cublas.h \ $(top_srcdir)/include/starpu_cublas_v2.h \ $(top_srcdir)/include/starpu_cusparse.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_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_dep.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_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/starpu_mpi_lb.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 \ $(top_srcdir)/starpurm/include/starpurm.h doxy: @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @$(DOXYGEN) $(DOX_CONFIG) $(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_HTML_DIR): $(DOX_TAG) $(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 ;\ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ ! < refman.log grep -v group__ | grep -v _amgrp | grep -v deprecated__ | grep "multiply defined" || exit 1 ;\ $(MAKEINDEX) refman.idx ;\ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ 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 \ max_print_line=1000000 $(PDFLATEX) -interaction batchmode 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) starpu-1.3.9+dfsg/doc/doxygen/Makefile.in000066400000000000000000001102201413463044200202450ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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@ 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_BUILD_DOC_PDF_TRUE@@STARPU_BUILD_DOC_TRUE@am__append_1 = $(DOX_HTML_DIR) $(DOX_PDF) @STARPU_BUILD_DOC_PDF_FALSE@@STARPU_BUILD_DOC_TRUE@am__append_2 = $(DOX_HTML_DIR) @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@am__append_3 = $(top_srcdir)/doc/doxygen/html @STARPU_AVAILABLE_DOC_PDF_TRUE@@STARPU_BUILD_DOC_FALSE@am__append_4 = $(top_srcdir)/doc/doxygen/starpu.pdf @STARPU_BUILD_DOC_TRUE@am__append_5 = \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/doc/doxygen/chapters/version.sty \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/doc/doxygen/chapters/version.html subdir = doc/doxygen ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(am__append_1) $(am__append_2) $(am__append_3) \ $(am__append_4) $(am__append_5) doxygen.cfg refman.tex \ $(chapters) $(images) @STARPU_AVAILABLE_DOC_PDF_TRUE@@STARPU_BUILD_DOC_FALSE@txt_DATA = $(top_srcdir)/doc/doxygen/starpu.pdf @STARPU_BUILD_DOC_PDF_TRUE@@STARPU_BUILD_DOC_TRUE@txt_DATA = $(DOX_PDF) @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@DOX_HTML_SRCDIR = $(top_srcdir)/doc/doxygen/html @STARPU_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_scheduling_policy_definition.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_support.doxy \ chapters/450_native_fortran_support.doxy \ chapters/460_socl_opencl_extensions.doxy \ chapters/470_simgrid.doxy \ chapters/480_openmp_runtime_support.doxy \ chapters/490_clustering_a_machine.doxy \ chapters/495_interoperability.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/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.c \ 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/fft_support.doxy \ chapters/api/versioning.doxy \ chapters/api/threads.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/starpu_chol_model_11_type.eps \ chapters/images/starpu_chol_model_11_type.pdf \ chapters/images/starpu_chol_model_11_type.png \ chapters/images/tasks_size_overhead.eps \ chapters/images/tasks_size_overhead.pdf \ chapters/images/tasks_size_overhead.png \ chapters/images/temanejo.png @STARPU_BUILD_DOC_TRUE@dox_inputs = $(DOX_CONFIG) \ @STARPU_BUILD_DOC_TRUE@ $(chapters) \ @STARPU_BUILD_DOC_TRUE@ starpu_config.h \ @STARPU_BUILD_DOC_TRUE@ chapters/version.sty \ @STARPU_BUILD_DOC_TRUE@ chapters/version.html \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_bitmap.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_bound.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_clusters.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_cublas.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_cublas_v2.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_cusparse.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_cuda.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_data_filters.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_data.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_data_interfaces.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_deprecated_api.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_disk.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_driver.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_expert.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_fxt.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_hash.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_mic.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_mod.f90 \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_opencl.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_openmp.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_perfmodel.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_profiling.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_rand.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sched_component.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sched_ctx.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sched_ctx_hypervisor.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_scheduler.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_simgrid_wrap.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_sink.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_stdlib.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_bundle.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_dep.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_list.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_task_util.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_thread.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_thread_util.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_tree.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_util.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/starpu_worker.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/mpi/include/starpu_mpi.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/mpi/include/starpu_mpi_lb.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_config.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_lp.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_monitoring.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/sc_hypervisor/include/sc_hypervisor_policy.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/starpurm/include/starpurm.h @STARPU_BUILD_DOC_TRUE@CLEANFILES = $(DOX_TAG) starpu_config.h \ @STARPU_BUILD_DOC_TRUE@ -r \ @STARPU_BUILD_DOC_TRUE@ $(DOX_HTML_DIR) \ @STARPU_BUILD_DOC_TRUE@ $(DOX_LATEX_DIR) \ @STARPU_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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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." @STARPU_AVAILABLE_DOC_FALSE@@STARPU_BUILD_DOC_FALSE@install-exec-hook: @STARPU_AVAILABLE_DOC_FALSE@@STARPU_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 @STARPU_BUILD_DOC_PDF_TRUE@@STARPU_BUILD_DOC_TRUE@all: $(DOX_HTML_DIR) $(DOX_PDF) @STARPU_BUILD_DOC_PDF_FALSE@@STARPU_BUILD_DOC_TRUE@all: $(DOX_HTML_DIR) @STARPU_BUILD_DOC_TRUE@install-exec-hook: @STARPU_BUILD_DOC_TRUE@ $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html @STARPU_BUILD_DOC_TRUE@ (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html \;) @STARPU_BUILD_DOC_TRUE@uninstall-hook: @STARPU_BUILD_DOC_TRUE@ rm -rf $(DESTDIR)$(docdir)/manual/html @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@install-exec-hook: @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@ (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html \;) @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@uninstall-hook: @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@ rm -rf $(DESTDIR)$(docdir)/manual/html @STARPU_BUILD_DOC_TRUE@starpu_config.h: $(top_srcdir)/include/starpu_config.h.in @STARPU_BUILD_DOC_TRUE@ @$(SED) 's/#undef \(.*\)/#define \1 1/' $< > $@ @STARPU_BUILD_DOC_TRUE@chapters/version.sty: $(chapters) @STARPU_BUILD_DOC_TRUE@ @for f in $(chapters) ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $(top_srcdir)/doc/doxygen/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen/$$f ; fi \ @STARPU_BUILD_DOC_TRUE@ done | sort -r | head -1 > timestamp_sty @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_sty ; then \ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%F" > timestamp_sty_updated ;\ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%B %Y" > timestamp_sty_updated_month ;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_sty_updated ; then \ @STARPU_BUILD_DOC_TRUE@ echo ':newcommand{:STARPUUPDATED}{'`cat timestamp_sty_updated`'}' > $(top_srcdir)/doc/doxygen/chapters/version.sty;\ @STARPU_BUILD_DOC_TRUE@ else \ @STARPU_BUILD_DOC_TRUE@ echo ':newcommand{:STARPUUPDATED}{unknown date}' > $(top_srcdir)/doc/doxygen/chapters/version.sty;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @echo ':newcommand{:STARPUVERSION}{$(VERSION)}' >> $(top_srcdir)/doc/doxygen/chapters/version.sty @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/:/\\/g' $(top_srcdir)/doc/doxygen/chapters/version.sty @STARPU_BUILD_DOC_TRUE@ @for f in timestamp_sty timestamp_sty_updated timestamp_sty_updated_month ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $$f ; then $(RM) $$f ; fi ;\ @STARPU_BUILD_DOC_TRUE@ done @STARPU_BUILD_DOC_TRUE@chapters/version.html: $(chapters) @STARPU_BUILD_DOC_TRUE@ @for f in $(chapters) ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $(top_srcdir)/doc/doxygen/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen/$$f ; fi \ @STARPU_BUILD_DOC_TRUE@ done | sort -r | head -1 > timestamp_html @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_html ; then \ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%F" > timestamp_html_updated ;\ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%B %Y" > timestamp_html_updated_month ;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @echo "This manual documents the usage of StarPU version $(VERSION)." > $(top_srcdir)/doc/doxygen/chapters/version.html @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_html_updated ; then \ @STARPU_BUILD_DOC_TRUE@ echo "Its contents was last updated on "`cat timestamp_html_updated`"." >> $(top_srcdir)/doc/doxygen/chapters/version.html;\ @STARPU_BUILD_DOC_TRUE@ else \ @STARPU_BUILD_DOC_TRUE@ echo "Its contents was last updated on unknown_date." >> $(top_srcdir)/doc/doxygen/chapters/version.html;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @for f in timestamp_html timestamp_html_updated timestamp_html_updated_month ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $$f ; then $(RM) $$f ; fi ;\ @STARPU_BUILD_DOC_TRUE@ done @STARPU_BUILD_DOC_TRUE@doxy: @STARPU_BUILD_DOC_TRUE@ @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @STARPU_BUILD_DOC_TRUE@ @$(DOXYGEN) $(DOX_CONFIG) @STARPU_BUILD_DOC_TRUE@$(DOX_TAG): $(dox_inputs) @STARPU_BUILD_DOC_TRUE@ @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @STARPU_BUILD_DOC_TRUE@ @$(DOXYGEN) $(DOX_CONFIG) @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/ModuleDocumentation <\/li>/Modules<\/a>/' html/index.html @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/FileDocumentation <\/li>/Files<\/a>/' html/index.html @STARPU_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 @STARPU_BUILD_DOC_TRUE@ @if test -f html/navtree.js ; then $(SED) -i 's/\[ "Files", "Files.html", null \]/\[ "", "Files.html", null \]/' html/navtree.js ; fi @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/.*"Files.html".*//' html/pages.html @STARPU_BUILD_DOC_TRUE@ @if test -f latex/main.tex ; then mv latex/main.tex latex/index.tex ; fi @STARPU_BUILD_DOC_TRUE@ @$(SED) -i '/\\begin{titlepage}/,$$d' $(DOX_LATEX_DIR)/refman.tex @STARPU_BUILD_DOC_TRUE@ @cat $(top_srcdir)/doc/doxygen/refman.tex >> $(DOX_LATEX_DIR)/refman.tex @STARPU_BUILD_DOC_TRUE@$(DOX_HTML_DIR): $(DOX_TAG) @STARPU_BUILD_DOC_TRUE@$(DOX_PDF): $(DOX_TAG) refman.tex @STARPU_BUILD_DOC_TRUE@ @cp $(top_srcdir)/doc/doxygen/chapters/version.sty $(DOX_LATEX_DIR) @STARPU_BUILD_DOC_TRUE@ @cp $(top_srcdir)/doc/doxygen/chapters/images/*pdf $(DOX_LATEX_DIR) @STARPU_BUILD_DOC_TRUE@ @echo $(PDFLATEX) $(DOX_LATEX_DIR)/refman.tex @STARPU_BUILD_DOC_TRUE@ @cd $(DOX_LATEX_DIR) ;\ @STARPU_BUILD_DOC_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out ;\ @STARPU_BUILD_DOC_TRUE@ $(SED) -i -e 's/__env__/\\_Environment Variables!/' -e 's/\\-\\_\\-\\-\\_\\-env\\-\\_\\-\\-\\_\\-//' ExecutionConfigurationThroughEnvironmentVariables.tex ;\ @STARPU_BUILD_DOC_TRUE@ $(SED) -i -e 's/__configure__/\\_Configure Options!/' -e 's/\\-\\_\\-\\-\\_\\-configure\\-\\_\\-\\-\\_\\-//' CompilationConfiguration.tex ;\ @STARPU_BUILD_DOC_TRUE@ $(SED) -i s'/\\item Module\\.Documentation/\\item \\hyperlink{ModuleDocumentation}{Module Documentation}/' index.tex ;\ @STARPU_BUILD_DOC_TRUE@ $(SED) -i s'/\\item File\\.Documentation/\\item \\hyperlink{FileDocumentation}{File Documentation}/' index.tex ;\ @STARPU_BUILD_DOC_TRUE@ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ @STARPU_BUILD_DOC_TRUE@ ! < refman.log grep -v group__ | grep -v _amgrp | grep -v deprecated__ | grep "multiply defined" || exit 1 ;\ @STARPU_BUILD_DOC_TRUE@ $(MAKEINDEX) refman.idx ;\ @STARPU_BUILD_DOC_TRUE@ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ @STARPU_BUILD_DOC_TRUE@ done=0; repeat=5 ;\ @STARPU_BUILD_DOC_TRUE@ while test $$done = 0 -a $$repeat -gt 0; do \ @STARPU_BUILD_DOC_TRUE@ if $(EGREP) 'Rerun (LaTeX|to get cross-references right)' refman.log > /dev/null 2>&1; then \ @STARPU_BUILD_DOC_TRUE@ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex; \ @STARPU_BUILD_DOC_TRUE@ repeat=`expr $$repeat - 1`; \ @STARPU_BUILD_DOC_TRUE@ else \ @STARPU_BUILD_DOC_TRUE@ done=1; \ @STARPU_BUILD_DOC_TRUE@ fi; \ @STARPU_BUILD_DOC_TRUE@ done @STARPU_BUILD_DOC_TRUE@ mv $(DOX_LATEX_DIR)/refman.pdf $(DOX_PDF) # 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.3.9+dfsg/doc/doxygen/chapters/000077500000000000000000000000001413463044200200155ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen/chapters/000_introduction.doxy000066400000000000000000000271301413463044200240250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 runtime 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 an OpenCL front-end (\ref SOCLOpenclExtensions). StarPU's runtime 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 HowToDefineANewSchedulingPolicy). The remainder of this section describes the main concepts used in StarPU. A video is available on the StarPU website https://starpu.gitlabpages.inria.fr/ that presents these concepts in 26 minutes. Some tutorials are also available on https://starpu.gitlabpages.inria.fr/tutorials/ // 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 https://starpu.gitlabpages.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 HowToDefineANewSchedulingPolicy
    • \ref DebuggingTools
    • \ref OnlinePerformanceTools
    • \ref OfflinePerformanceTools
    • \ref FrequentlyAskedQuestions
  • Part 4: StarPU Extensions
    • \ref OutOfCore
    • \ref MPISupport
    • \ref FFTSupport
    • \ref MICSupport
    • \ref NativeFortranSupport
    • \ref SOCLOpenclExtensions
    • \ref SimGridSupport
    • \ref OpenMPRuntimeSupport
    • \ref ClusteringAMachine
  • 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.3.9+dfsg/doc/doxygen/chapters/101_building.doxy000066400000000000000000000454451413463044200231140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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.3 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. hwloc is available in major free operating system distributions, and for most operating systems. Make sure to not only install a hwloc or libhwloc package, but also hwloc-devel or libhwloc-dev so as to have hwloc headers etc. 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. If libhwloc is not available on your system, the option \ref without-hwloc "--without-hwloc" should be explicitely given when calling the script configure. \subsection GettingSources Getting Sources StarPU's sources can be obtained from the download page of the StarPU website (https://starpu.gitlabpages.inria.fr/files/). All releases and the development tree of StarPU are freely available on StarPU SCM server under the LGPL license. Some releases are available under the BSD license. The latest release can be downloaded from the StarPU download page (https://starpu.gitlabpages.inria.fr/files/). The latest nightly snapshot can be downloaded from the StarPU website (https://starpu.gitlabpages.inria.fr/files/testing/). And finally, current development version is also accessible via git. It should only be used if you need the very latest changes (i.e. less than a day old!). \verbatim $ git clone git@gitlab.inria.fr:starpu/starpu.git \endverbatim \subsection ConfiguringStarPU Configuring StarPU Running autogen.sh is not necessary when using the tarball releases of StarPU. However when using the source code from the git repository, you first need to generate the script configure and the different 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. To do so, simply enter the directory where you want the compilation to produce its files, and invoke the script configure 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 (https://starpu.gitlabpages/files/testing/master/). \verbatim $ make check \endverbatim \subsection InstallingStarPU Installing StarPU In order to install StarPU at the location which was specified during configuration: \verbatim $ make install \endverbatim If you have let StarPU install in /usr/local/, you additionally need to run \verbatim $ sudo ldconfig \endverbatim so the libraries can be found by the system. Libtool interface versioning information are included in libraries names (libstarpu-1.3.so, libstarpumpi-1.3.so and libstarpufft-1.3.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 to allow pkg-config to find it. For example if StarPU was installed in $STARPU_PATH: \verbatim $ export 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.3 # options for the compiler $ pkg-config --libs starpu-1.3 # 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.3 actually produces some output before going further: PKG_CONFIG_PATH has to point to the place where starpu-1.3.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 $ export LD_LIBRARY_PATH=$STARPU_PATH/lib:$LD_LIBRARY_PATH \endverbatim And it is useful to get access to the StarPU tools: \verbatim $ export PATH=$PATH:$STARPU_PATH/bin \endverbatim It is then useful to check that StarPU executes correctly and finds your hardware: \verbatim $ starpu_machine_display \endverbatim If it does not, please check the output of \c lstopo from \c hwloc and report the issue to the \c hwloc project, since this is what StarPU uses to detect the hardware.
A tool is provided to help setting all the environment variables needed by StarPU. Once StarPU is installed in a specific directory, calling the script bin/starpu_env will set in your current environment the variables STARPU_PATH, LD_LIBRARY_PATH, PKG_CONFIG_PATH, PATH and MANPATH. \verbatim $ source $STARPU_PATH/bin/starpu_env \endverbatim \subsection IntegratingStarPUInABuildSystem Integrating StarPU in a Build System \subsubsection StarPUInMake Integrating StarPU in a Make Build System 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.3) LDLIBS += $$(pkg-config --libs starpu-1.3) \endverbatim If you have a \c test-starpu.c file containing for instance: \code{.c} #include #include int main(void) { int ret; ret = starpu_init(NULL); if (ret != 0) { return 1; } printf("%d CPU cores\n", starpu_worker_get_count_by_type(STARPU_CPU_WORKER)); printf("%d CUDA GPUs\n", starpu_worker_get_count_by_type(STARPU_CUDA_WORKER)); printf("%d OpenCL GPUs\n", starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER)); starpu_shutdown(); return 0; } \endcode You can build it with make test-starpu and run it with ./test-starpu \subsubsection StarPUInCMake Integrating StarPU in a CMake Build System This section shows a minimal example integrating StarPU in an existing application's CMake build system. Let's assume we want to build an executable from the following source code using CMake: \code{.c} #include #include int main(void) { int ret; ret = starpu_init(NULL); if (ret != 0) { return 1; } printf("%d CPU cores\n", starpu_worker_get_count_by_type(STARPU_CPU_WORKER)); printf("%d CUDA GPUs\n", starpu_worker_get_count_by_type(STARPU_CUDA_WORKER)); printf("%d OpenCL GPUs\n", starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER)); starpu_shutdown(); return 0; } \endcode The \c CMakeLists.txt file below uses the Pkg-Config support from CMake to autodetect the StarPU installation and library dependences (such as libhwloc) provided that the PKG_CONFIG_PATH variable is set, and is sufficient to build a statically-linked executable. This example has been successfully tested with CMake 3.2, though it may work with earlier CMake 3.x versions. \code{File CMakeLists.txt} cmake_minimum_required (VERSION 3.2) project (hello_starpu) find_package(PkgConfig) pkg_check_modules(STARPU REQUIRED starpu-1.3) if (STARPU_FOUND) include_directories (${STARPU_INCLUDE_DIRS}) link_directories (${STARPU_STATIC_LIBRARY_DIRS}) link_libraries (${STARPU_STATIC_LIBRARIES}) else (STARPU_FOUND) message(FATAL_ERROR "StarPU not found") endif() add_executable(hello_starpu hello_starpu.c) \endcode The following \c CMakeLists.txt implements an alternative, more complex strategy, still relying on Pkg-Config, but also taking into account additional flags. While more complete, this approach makes CMake's build types (Debug, Release, ...) unavailable because of the direct affectation to variable CMAKE_C_FLAGS. If both the full flags support and the build types support are needed, the \c CMakeLists.txt below may be altered to work with CMAKE_C_FLAGS_RELEASE, CMAKE_C_FLAGS_DEBUG, and others as needed. This example has been successfully tested with CMake 3.2, though it may work with earlier CMake 3.x versions. \code{File CMakeLists.txt} cmake_minimum_required (VERSION 3.2) project (hello_starpu) find_package(PkgConfig) pkg_check_modules(STARPU REQUIRED starpu-1.3) # This section must appear before 'add_executable' if (STARPU_FOUND) # CFLAGS other than -I foreach(CFLAG ${STARPU_CFLAGS_OTHER}) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CFLAG}") endforeach() # Static LDFLAGS other than -L foreach(LDFLAG ${STARPU_STATIC_LDFLAGS_OTHER}) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LDFLAG}") endforeach() # -L directories link_directories(${STARPU_STATIC_LIBRARY_DIRS}) else (STARPU_FOUND) message(FATAL_ERROR "StarPU not found") endif() add_executable(hello_starpu hello_starpu.c) # This section must appear after 'add_executable' if (STARPU_FOUND) # -I directories target_include_directories(hello_starpu PRIVATE ${STARPU_INCLUDE_DIRS}) # Static -l libs target_link_libraries(hello_starpu PRIVATE ${STARPU_STATIC_LIBRARIES}) endif() \endcode \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 this 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. If the application needs to reserve some cores for its own computations, it can do so with the field starpu_conf::reserve_ncpus, get the core IDs with starpu_get_next_bindid(), and bind to them with starpu_bind_thread_on(). Another option is for the application to pause StarPU by calling starpu_pause(), then to perform its own computations, and then to resume StarPU by calling starpu_resume() so that StarPU can execute tasks. \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 from 3.11 to 3.16, and 3.18 to 3.25. SimGrid versions 3.25 and above need to be configured with -Denable_msg=ON. Other versions may have compatibility issues, 3.17 notably does not build at all. MPI simulation does not work with version 3.22). 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. Read the chapter \ref SimGridSupport for more information on the SimGrid support. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/110_basic_examples.doxy000066400000000000000000000407111413463044200242650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page BasicExamples Basic Examples \section HelloWorldUsingStarPUAPI Hello World This section shows how to implement a simple program that submits a task to StarPU. \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 this 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.3) hello_world.c -o hello_world $(pkg-config --libs starpu-1.3) $ ./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 which 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.3) hello_world.c -o hello_world $(pkg-config --libs starpu-1.3) $ ./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.3) hello_world.c -o hello_world $(pkg-config --libs starpu-1.3) $ ./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 which 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 VectorScalingUsingStarPUAPI Vector Scaling The previous example has shown how to submit tasks. In this section, we show how StarPU tasks can manipulate data. 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.3) vector_scal.c -o vector_scal $(pkg-config --libs starpu-1.3) $ ./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.c 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.3) LDLIBS += $(shell pkg-config --libs starpu-1.3) 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.3.9+dfsg/doc/doxygen/chapters/201_advanced_examples.doxy000066400000000000000000000013471413463044200247540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page AdvancedExamples Advanced Examples TODO */ starpu-1.3.9+dfsg/doc/doxygen/chapters/210_check_list_performance.doxy000066400000000000000000000570271413463044200260100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 CheckTaskSize Check Task Size Make sure that your tasks are not too small, as the StarPU runtime overhead is not completely zero. As explained in \ref TaskSizeOverhead, you can run the script \c tasks_size_overhead.sh to get an idea of the scalability of tasks depending on their duration (in µs), on your own system. Typically, 10µs-ish tasks are definitely too small, the CUDA overhead itself is much bigger than this. 1ms-ish tasks may be a good start, but will not necessarily scale to many dozens of cores, so it's better to try to get 10ms-ish tasks. Tasks durations can easily be observed when performance models are defined (see \ref PerformanceModelExample) by using the tools starpu_perfmodel_plot or starpu_perfmodel_display (see \ref PerformanceOfCodelets) When using parallel tasks, the problem is even worse since StarPU has to synchronize the tasks execution. \section ConfigurationImprovePerformance Configuration Which May Improve Performance If you do not plan to use support for GPUs or out-of-core, i.e. not use StarPU's ability to manage data coherency between several memory nodes, the \c configure option \ref enable-maxnodes "--enable-maxnodes=1" allows to considerably reduce StarPU's memory management overhead. The \c configure option \ref enable-fast "--enable-fast" 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 Which May Improve Performance link to \ref DataManagement link to \ref DataPrefetch \section TaskRelatedFeaturesToImprovePerformance Task Related Features Which May Improve Performance link to \ref TaskGranularity link to \ref TaskSubmission link to \ref TaskPriorities \section SchedulingRelatedFeaturesToImprovePerformance Scheduling Related Features Which 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 For proper overlapping of asynchronous GPU data transfers, data has to be pinned by CUDA. Data allocated with starpu_malloc() is always properly pinned. If the application registers to StarPU some data which has not been allocated with starpu_malloc(), starpu_memory_pin() should be called to pin the data memory. 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. The function starpu_cuda_get_local_stream() returns a stream which can be used by all CUDA codelet operations to avoid this issue. For instance: \code{.c} func <<>> (foo, bar); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); \endcode as well as the use of \c cudaMemcpyAsync(), etc. for each CUDA operation one needs to use a version that takes the a stream parameter. If the kernel uses its own non-default stream, one can synchronize this 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 This code makes the StarPU-provided stream wait for a new event, which will be triggered by the completion of the kernel. Unfortunately, some CUDA libraries do not have stream variants of kernels. This will seriously lower the potential for overlapping. If some CUDA calls are made without specifying this local stream, synchronization needs to be explicited with cudaDeviceSynchronize() around these calls, to make sure that they get properly synchronized with the calls using the local stream. Notably, \c cudaMemcpy() and \c cudaMemset() are actually asynchronous and need such explicit synchronization! Use \c cudaMemcpyAsync() and \c cudaMemsetAsync() instead. Calling starpu_cublas_init() will ensure StarPU to properly call the CUBLAS library functions. 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. This 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. 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 be executed concurrently. This is useful when kernels are small and do not feed the whole GPU with threads to run. Concerning memory allocation, you should really not use \c cudaMalloc()/ \c cudaFree() within the kernel, since \c cudaFree() introduces a awfully lot of synchronizations within CUDA itself. You should instead add a parameter to the codelet with the ::STARPU_SCRATCH mode access. You can then pass to the task a handle registered with the desired size but with the \c NULL pointer, the handle can even be shared between tasks, StarPU will allocate per-task data on the fly before task execution, and reuse the allocated data between tasks. See examples/pi/pi_redux.c for an example of use. \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 Detecting 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 a stuck MPI or CUDA driver. 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 this condition, thus allowing to catch the situation in \c 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, as well as using prefetch and writeback optimizations. The environment variables \ref STARPU_LIMIT_CUDA_MEM, \ref STARPU_LIMIT_CUDA_devid_MEM, \ref STARPU_LIMIT_OPENCL_MEM, and \ref STARPU_LIMIT_OPENCL_devid_MEM can be used to control how much (in MiB) of the GPU device memory should be used at most by StarPU (the default value is to use 90% of the available memory). By default, the usage of the main memory is not limited, as the default mechanims do not provide means to evict main memory when it gets too 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. The environment variable \ref STARPU_LIMIT_CPU_MEM 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 buffers 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 \c malloc()/\c realloc(), and notify StarPU of the delta by calling starpu_memory_allocate() and starpu_memory_deallocate(). 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 this 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 when calling \c configure. To reduce the memory footprint of the data internal structures of StarPU, one can set the \ref enable-maxcpus "--enable-maxcpus", \ref enable-maxnumanodes "--enable-maxnumanodes", \ref enable-maxcudadev "--enable-maxcudadev", \ref enable-maxopencldev "--enable-maxopencldev" and \ref enable-maxnodes "--enable-maxnodes" \c 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" \c 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. Task submission can be blocked when a reasonable given number of tasks have been submitted, by setting the environment variables \ref STARPU_LIMIT_MIN_SUBMITTED_TASKS and \ref STARPU_LIMIT_MAX_SUBMITTED_TASKS. export STARPU_LIMIT_MAX_SUBMITTED_TASKS=10000 export STARPU_LIMIT_MIN_SUBMITTED_TASKS=9000 will 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 which 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 environment variable \ref STARPU_MAX_MEMORY_USE 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 this 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. There is 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 (\ref STARPU_PERF_MODEL_HOMOGENEOUS_CUDA), export STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL=1 (\ref STARPU_PERF_MODEL_HOMOGENEOUS_OPENCL), export STARPU_PERF_MODEL_HOMOGENEOUS_MIC=1 (\ref STARPU_PERF_MODEL_HOMOGENEOUS_MIC), export STARPU_PERF_MODEL_HOMOGENEOUS_MPI_MS=1 (\ref STARPU_PERF_MODEL_HOMOGENEOUS_MPI_MS) 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 bad scheduling decisions just because the first measurements were not so good. Note that StarPU will not record the very first measurement for a given codelet and a given size, because it would most often be hit by computation library loading or initialization. StarPU will also throw measurements away if it notices that after computing an average execution time, it notices that most subsequent tasks have an execution time largely outside the computed average ("Too big deviation for model..." warning messages). By looking at the details of the message and their reported measurements, it can highlight that your computation library really has non-stable measurements, which is probably an indication of an issue in the computation library, or the execution environment (e.g. rogue daemons). Details on the current performance model status can be obtained with the tool starpu_perfmodel_display: the option -l lists the available performance models, and the option -s allows 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. \ref STARPU_WORKER_STATS_FILE can be defined to specify a filename in which to display statistics, by default statistics are printed on the standard error stream. 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). \ref STARPU_BUS_STATS_FILE can be defined to specify a filename in which to display statistics, by default statistics are printed on the standard error stream. 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 brings an overhead on the execution time. To get a more precise analysis of which parts of StarPU bring the 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 \c 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, this will create a file gmon.out in the current directory, it can be processed by running gprof on your application: \code gprof ./test \endcode This will dump an analysis of the time spent in StarPU functions. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/301_tasks.doxy000066400000000000000000000573061413463044200224450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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, this 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. To determine what task size your application is actually using, one can use starpu_fxt_data_trace, see \ref DataTrace . 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 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 provide the priority information to StarPU. \section TaskDependencies Task Dependencies \subsection SequentialConsistency Sequential Consistency 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. Setting (or unsetting) sequential consistency can be done at the data level by calling starpu_data_set_sequential_consistency_flag() for a specific data or starpu_data_set_default_sequential_consistency_flag() for all datas. Setting (or unsetting) sequential consistency can also be done at task level by setting the field starpu_task::sequential_consistency to \c 0. Sequential consistency can also be set (or unset) for each handle of a specific task, this is done by using the field starpu_task::handles_sequential_consistency. When set, its value should be a array with the number of elements being the number of handles for the task, each element of the array being the sequential consistency for the \c i-th handle of the task. The field can easily be set when calling starpu_task_insert() with the flag ::STARPU_HANDLES_SEQUENTIAL_CONSISTENCY \code{.c} char *seq_consistency = malloc(cl.nbuffers * sizeof(char)); seq_consistency[0] = 1; seq_consistency[1] = 1; seq_consistency[2] = 0; ret = starpu_task_insert(&cl, STARPU_RW, handleA, STARPU_RW, handleB, STARPU_RW, handleC, STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, seq_consistency, 0); free(seq_consistency); \endcode The internal algorithm used by StarPU to set up implicit dependency is as follows: \code{.c} if (sequential_consistency(task) == 1) for(i=0 ; icl = &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 set with starpu_codelet::nbuffers. This field can however be set to \ref STARPU_VARIABLE_NBUFFERS, in which case starpu_task::nbuffers must be set, and starpu_task::modes (or starpu_task::dyn_modes, 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 provided implementations, and pick the one which 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 that 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 a 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. StarPU also provides a utility function starpu_codelet_unpack_args() to retrieve the ::STARPU_VALUE arguments passed to the task. There is several ways of calling this 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 is run 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. This is however for now only proof of concept, and has not really been optimized yet. \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 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.3.9+dfsg/doc/doxygen/chapters/310_data_management.doxy000066400000000000000000001430261413463044200244200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page DataManagement Data Management TODO: intro which mentions consistency among other things \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 Vectors can be partitioned into pieces by using starpu_vector_filter_block(). They can also be partitioned with some overlapping by using starpu_vector_filter_block_shadow(). By default StarPU uses the same size for each piece. If different sizes are desired, starpu_vector_filter_list() or starpu_vector_filter_list_long() can be used instead. To just divide in two pieces, starpu_vector_filter_divide_in_2() can be used. \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 2D matrices can be partitioned into 2D matrices along the x dimension by using starpu_matrix_filter_block(), and along the y dimension by using starpu_matrix_filter_vertical_block(). They can also be partitioned with some overlapping by using starpu_matrix_filter_block_shadow() and starpu_matrix_filter_vertical_block_shadow(). \subsection BlockDataInterface Block Data Interface To register 3-D matrices 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 3D matrices can be partitioned along the x dimension by using starpu_block_filter_block(), or along the y dimension by using starpu_block_filter_vertical_block, or along the z dimension by using starpu_block_filter_depth_block. They can also be partitioned with some overlapping by using starpu_block_filter_block_shadow(), starpu_block_filter_vertical_block_shadow(), or starpu_block_filter_depth_block_shadow(). \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. BCSR data handles can be partitioned into its dense matrix blocks by using starpu_bcsr_filter_canonical_block(), or split into other BCSR data handles by using starpu_bcsr_filter_vertical_block() (but only split along the leading dimension is supported, i.e. along adjacent nnz blocks) \subsection CSRDataInterface CSR Data Interface TODO CSR data handles can be partitioned into vertical CSR matrices by using starpu_csr_filter_vertical_block(). \subsection VariableSizeDataInterface Data Interface with Variable Size Tasks are actually allowed to change the size of data interfaces. The simplest case is just changing the amount of data actually used within the allocated buffer. This is for instance implemented for the matrix interface: one can set the new NX/NY values with STARPU_MATRIX_SET_NX(), STARPU_MATRIX_SET_NY(), and STARPU_MATRIX_SET_LD() at the end of the task implementation. Data transfers achieved by StarPU will then use these values instead of the whole allocated size. The values of course need to be set within the original allocation. To reserve room for increasing the NX/NY values, one can use starpu_matrix_data_register_allocsize() instead of starpu_matrix_data_register(), to specify the allocation size to be used instead of the default NX*NY*ELEMSIZE. To support this, the data interface has to implement the starpu_data_interface_ops::alloc_footprint and starpu_data_interface_ops::alloc_compare methods, for proper StarPU allocation management. A more involved case is changing the amount of allocated data. The task implementation can just reallocate the buffer during its execution, and set the proper new values in the interface structure, e.g. nx, ny, ld, etc. so that the StarPU core knows the new data layout. The starpu_data_interface_ops structure however then needs to have the starpu_data_interface_ops::dontcache field set to 1, to prevent StarPU from trying to perform any cached allocation, since the allocated size will vary. An example is available in tests/datawizard/variable_size.c. The example uses its own data interface so as to contain some simulation information for data growth, but the principle can be applied for any data interface. The principle is to use starpu_malloc_on_node_flags to make the new allocation, and use starpu_free_on_node_flags to release any previous allocation. The flags have to be precisely like in the example: \code{.c} unsigned workerid = starpu_worker_get_id_check(); unsigned dst_node = starpu_worker_get_memory_node(workerid); interface->ptr = starpu_malloc_on_node_flags(dst_node, size + increase, STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT | STARPU_MEMORY_OVERFLOW); starpu_free_on_node_flags(dst_node, old, size, STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT | STARPU_MEMORY_OVERFLOW); interface->size += increase; \endcode so that the allocated area has the expected properties and the allocation is accounted for properly. Depending on the interface (vector, CSR, etc.) you may have to fix several members of the data interface: e.g. both nx and allocsize for vectors, and store the pointer both in ptr and dev_handle. Some interfaces make a distinction between the actual number of elements stored in the data and the actually allocated buffer. For instance, the vector interface uses the nx field for the former, and the allocsize for the latter. This allows for lazy reallocation to avoid reallocating the buffer everytime to exactly match the actual number of elements. Computations and data transfers will use nx field, while allocation functions will use the allocsize. One just has to make sure that allocsize is always bigger or equal to nx. Important note: one can not change the size of a partitioned data. \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. The application can provide its own allocation function by calling starpu_malloc_set_hooks(). StarPU will then use them for all data handle allocations in the main memory. 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 this 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 this 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 \c 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 When the sub-data is not of the same type as the original data, the starpu_data_filter::get_child_ops field needs to be set appropriately for StarPU to know which type should be used. 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. When submitting tasks, one can mix using the handles of the partition, of the whole data. One can even partition recursively and mix using handles at different levels of the recursion. Of course, StarPU will have to introduce coherency synchronization. fmultiple_submit_implicit is a complete example using this technique. One can also look at fmultiple_submit_readonly which contains the explicit coherency synchronization which are automatically introduced by StarPU for fmultiple_submit_implicit. 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 then submit tasks working on the main handle, and tasks working on vert_handle handles. Between using the main handle and vert_handle handles, StarPU will automatically call starpu_data_partition_submit() and starpu_data_unpartition_submit(). All this code is asynchronous, just submitting which tasks, partitioning and unpartitioning will be done at runtime. Planning several partitioning of the same data is also possible, StarPU will unpartition and repartition as needed when mixing accesses of different partitions. If data access is done in read-only mode, StarPU will allow the different partitioning to coexist. As soon as a data is accessed in read-write mode, StarPU will automatically unpartition everything and activate only the partitioning leading to the data being written to. For instance, for a stencil application, one can split a subdomain into its interior and halos, and then just submit a task updating the whole subdomain, then submit MPI sends/receives to update the halos, then submit again a task updating the whole subdomain, etc. and StarPU will automatically partition/unpartition each time. \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} struct starpu_codelet cl_switch = { .where = STARPU_NOWHERE, .nbuffers = 3, .specific_nodes = 1, .nodes = { STARPU_MAIN_RAM, STARPU_MAIN_RAM, STARPU_MAIN_RAM }, }; 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 Note: when enabling a set of handles in this way, the set must not have any overlapping, i.e. the handles of the set must not have any part of data in common, otherwise StarPU will not properly handle concurrent accesses between them. And now we can start using vertical slices, etc. \section DataPointers Handles data buffer pointers A simple understanding of starpu handles is that it's a collection of buffers on each memory node of the machine, which contain the same data. The picture is however made more complex with the OpenCL support and with partitioning. When partitioning a handle, the data buffers of the subhandles will indeed be inside the data buffers of the main handle (to save transferring data back and forth between the main handle and the subhandles). But in OpenCL, a cl_mem is not a pointer, but an opaque value on which pointer arithmetic can not be used. That is why data interfaces contain three members: dev_handle, offset, and ptr. The dev_handle member is what the allocation function returned, and one can not do arithmetic on it. The offset member is the offset inside the allocated area, most often it will be 0 because data start at the beginning of the allocated area, but when the handle is partitioned, the subhandles will have varying offset values, for each subpiece. The ptr member, in the non-OpenCL case, i.e. when pointer arithmetic can be used on dev_handle, is just the sum of dev_handle and offset, provided for convenience. This means that:
  • computation kernels can use ptr in non-OpenCL implementations.
  • computation kernels have to use dev_handle and offset in the OpenCL implementation.
  • allocation methods of data interfaces have to store the value returned by starpu_malloc_on_node in dev_handle and ptr, and set offset to 0.
  • partitioning filters have to copy over dev_handle without modifying it, set in the child different values of offset, and set ptr accordingly as the sum of dev_handle and offset.
\section DefiningANewDataFilter Defining A New Data Filter StarPU provides a series of predefined filters in \ref 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. The starpu_filter_nparts_compute_chunk_size_and_offset() helper can be used to compute the division of pieces of data. \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 this case: it will allocate a buffer on each worker (lazily), 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. This 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 which 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 this 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 this 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 this, 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 this would be costly. It could also allocate one buffer per worker (similarly to \ref HowToInitializeAComputationLibraryOnceForEachWorker), but this 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 only used on CPUs, and one only 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 This section proposes an example how to define your own interface, when the StarPU-provided interface do not fit your needs. Here we take a dumb example of an array of complex numbers represented by two arrays of double values. Let's thus define a new data interface to manage arrays of complex numbers: \code{.c} /* interface for complex numbers */ struct starpu_complex_interface { double *real; double *imaginary; int nx; }; \endcode That structure stores enough to describe one buffer of such kind of data. It is used for the buffer stored in the main memory, another instance is used for the buffer stored in a GPU, etc. A data handle is thus a collection of such structures, to remember each buffer on each memory node. Note: one should not take pointers into such structures, because StarPU needs to be able to copy over the content of it to various places, for instance to efficiently migrate a data buffer from one data handle to another data handle. \subsection DefiningANewDataInterface_registration Data registration 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 The struct starpu_complex_interface complex is here used just to store the parameters that the user provided to starpu_complex_data_register. starpu_data_register() will first allocate the handle, and then pass the starpu_complex_interface structure to the starpu_data_interface_ops::register_data_handle method, which records them within the data handle (it is called once per node by starpu_data_register()): \code{.c} 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 = NULL; local_interface->imaginary = NULL; } } } \endcode If the application provided a home node, the corresponding pointers will be recorded for that node. Others have no buffer allocated yet. Possibly the interface needs some dynamic allocation (e.g. to store an array of dimensions that can have variable size). The corresponding deallocation will then be done in starpu_data_interface_ops::unregister_data_handle. 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 in \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 Convenience functions can defined to access the different fields of the complex interface from a StarPU data handle after a starpu_data_acquire() call: \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[], 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/. \subsection DefiningANewDataInterface_allocation Data allocation To be able to run tasks on GPUs etc. StarPU needs to know how to allocate a buffer for the interface. In our example, two allocations are needed in the allocation complex_allocate_data_on_node() method: one for the real part and one for the imaginary part. \code{.c} 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 = NULL; double *addr_imaginary = NULL; 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; } \endcode Here we try to allocate the two parts. If either of them fails, we return -ENOMEM. If they succeed, we can record the obtained pointers and returned the amount of allocated memory (for memory usage accounting). Conversely, complex_free_data_on_node() frees the two parts: \code{.c} 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); } \endcode We we have not made anything particular for GPUs or whatsoever: it is starpu_free_on_node() which knows how to actually make the allocation, and returns the resulting pointer, be it in main memory, in GPU memory, etc. \subsection DefiningANewDataInterface_copy Data copy Now that StarPU knows how to allocate/free a buffer, it needs to be able to copy over data into/from it. Defining a copy_any_to_any method allows StarPU to perform direct transfers between main memory and GPU memory. \code{.c} 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; } \endcode We here again have no idea what is main memory or GPU memory, or even if the copy is synchronous or asynchronous: we just call starpu_interface_copy() according to the interface, passing it the pointers, and checking whether it returned -EAGAIN, which means the copy is asynchronous, and StarPU will appropriately wait for it thanks to the \c async_data pointer. This copy method is referenced in a \ref starpu_data_copy_methods structure: \code{.c} static const struct starpu_data_copy_methods complex_copy_methods = { .any_to_any = copy_any_to_any }; \endcode which was referenced in the \ref starpu_data_interface_ops structure above. Other fields of \ref starpu_data_copy_methods allow to provide optimized variants, notably for the case of 2D or 3D matrix tiles with non-trivial ld. \subsection DefiningANewDataInterface_pack Data pack/unpack The copy methods allow for RAM/GPU transfers, but is not enough for e.g. transferring over MPI. That requires defining the pack/unpack methods. The principle is that the starpu_data_interface_ops::pack_data method concatenates the buffer data into a newly-allocated contiguous bytes array, conversely starpu_data_interface_ops::unpack_data extracts from a bytes array into the buffer data and frees the bytes array. \code{.c} 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; data = (void*) starpu_malloc_on_node_flags(node, *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; } \endcode complex_pack_data() first computes the size to be allocated, then allocates it, and copies over into it the content of the two real and imaginary arrays. \code{.c} 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)); starpu_free_on_node_flags(node, (uintptr_t) ptr, count, 0); return 0; } \endcode complex_unpack_data() simply uses memcpy to copy over from the bytes array into the data buffer, and releases the bytes array. \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 ::STARPU_SPECIFIC_NODE_LOCAL to let StarPU copy it to the memory node where the task will be executed. ::STARPU_SPECIFIC_NODE_CPU can also be used to request data to be put in CPU-accessible memory (and let StarPU choose the NUMA node). ::STARPU_SPECIFIC_NODE_FAST and ::STARPU_SPECIFIC_NODE_SLOW can also be used 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_SPECIFIC_NODE_CPU, STARPU_SPECIFIC_NODE_LOCAL}, }; \endcode the first data of the task will be kept in the CPU memory, while the second data will be copied to the CUDA GPU as usual. A working example is available in tests/datawizard/specific_node.c 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_SPECIFIC_NODE_LOCAL, STARPU_SPECIFIC_NODE_SLOW}, }; \endcode The first data will be copied into fast (but probably size-limited) local memory while the second data will be left in slow (but large) memory. This makes sense when the kernel does not make so many accesses to the second data, and thus data being remote e.g. over a PCI bus is not a performance problem, and avoids filling the fast local memory with data which does not need the performance. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/320_scheduling.doxy000066400000000000000000000442711413463044200234430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page Scheduling Scheduling \section TaskSchedulingPolicy Task Scheduling Policies The basics of the scheduling policy are the following:
  • 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 work-stealing scheduler lws. This is because it provides correct load balance and locality 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. \subsection NonPerformanceModelingPolicies 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. - The heteroprio scheduler uses different priorities for the different processing units. This scheduler must be configured to work correclty and to expect high-performance as described in the corresponding section. \subsection 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 \ref enable-verbose "--enable-verbose" \c configure option displays some statistics at the end of execution about the percentage of tasks which 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. - 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 dmdap (deque model data aware prio) scheduler is similar to dmda, 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 dmdar (deque model data aware ready) scheduler is similar to dmda, but it also privileges tasks whose data buffers are already available on the target device. - The dmdas combines dmdap and dmdas: it sorts tasks by priority order, but for a given priority it will privilege tasks whose data buffers are already available on the target device. - 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. \subsection ExistingModularizedSchedulers Modularized Schedulers StarPU provides a powerful way to implement schedulers, as documented in \ref DefiningANewModularSchedulingPolicy . It is currently shipped with the following pre-defined Modularized Schedulers : - modular-eager , modular-eager-prefetching are eager-based Schedulers (without and with prefetching)), they are \n naive schedulers, which try to map a task on the first available resource they find. The prefetching variant queues several tasks in advance to be able to do data prefetching. This may however degrade load balancing a bit. - modular-prio, modular-prio-prefetching, modular-eager-prio are prio-based Schedulers (without / with prefetching):, similar to Eager-Based Schedulers. Can handle tasks which have a defined priority and schedule them accordingly. The modular-eager-prio variant integrates the eager and priority queue in a single component. This allows it to do a better job at pushing tasks. - modular-random, modular-random-prio, modular-random-prefetching, modular-random-prio-prefetching are random-based Schedulers (without/with prefetching) : \n Select randomly a resource to be mapped on for each task. - modular-ws) implements Work Stealing: Maps tasks to workers in round robin, but allows workers to steal work from other workers. - modular-heft, modular-heft2, and modular-heft-prio are HEFT Schedulers : \n Maps tasks to workers using a heuristic very close to Heterogeneous Earliest Finish Time. It 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. modular-heft just takes tasks by order. modular-heft2 takes at most 5 tasks of the same priority and checks which one fits best. modular-heft-prio is similar to modular-heft, but only decides the memory node, not the exact worker, just pushing tasks to one central queue per memory node. By default, they sort tasks by priorities and privilege running first a task which has most of its data already available on the target. These can however be changed with \ref STARPU_SCHED_SORTED_ABOVE, \ref STARPU_SCHED_SORTED_BELOW, and \ref STARPU_SCHED_READY . - modular-heteroprio is a Heteroprio Scheduler: \n Maps tasks to worker similarly to HEFT, but first attribute accelerated tasks to GPUs, then not-so-accelerated tasks to CPUs. \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 Note: by default StarPU does not let CPU workers sleep, to let them react to task release as quickly as possible. For idle time to really let CPU cores save energy, one needs to use the \ref enable-blocking-drivers "--enable-blocking-drivers" configuration option. 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, e.g. by running ipmitool -I lanplus -H mymachine-ipmi -U myuser -P mypasswd sdr type Current The energy actually consumed by the total execution can be displayed by setting export STARPU_PROFILING=1 STARPU_WORKER_STATS=1 (\ref STARPU_PROFILING and \ref STARPU_WORKER_STATS). For OpenCL devices, on-line task consumption measurement is currently supported through the CL_PROFILING_POWER_CONSUMED OpenCL extension, implemented in the MoviSim simulator. For CUDA devices, on-line task consumption measurement is supported on V100 cards and beyond. This however only works for quite long tasks, since the measurement granularity is about 10ms. 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 this 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(). Another way to provide the energy performance is to define a perfmodel with starpu_perfmodel::type ::STARPU_PER_ARCH, and set the starpu_perfmodel::arch_cost_function field to a function which shall return the estimated consumption of the task in Joules. Such a function can for instance use starpu_task_expected_length() on the task (in µs), multiplied by the typical power consumption of the device, e.g. in W, and divided by 1000000. to get Joules. \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 or equivalently \code{.c} starpu_task_insert(&cl, ..., STARPU_EXECUTE_ON_WORKER, starpu_worker_get_by_type(STARPU_CUDA_WORKER, 0), ...); \endcode One can also specify a set worker(s) which are allowed to take the task, as an array of bit, for instance to allow workers 2 and 42: \code{.c} task->workerids = calloc(2,sizeof(uint32_t)); task->workerids[2/32] |= (1 << (2%32)); task->workerids[42/32] |= (1 << (42%32)); task->workerids_len = 2; \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 Configuring Heteroprio Within Heteroprio, one priority per processing unit type is assigned to each task, such that a task has several priorities. Each worker pops the task that has the highest priority for the hardware type it uses, which could be CPU or CUDA for example. Therefore, the priorities has to be used to manage the critical path, but also to promote the consumption of tasks by the more appropriate workers. The tasks are stored inside buckets, where each bucket corresponds to a priority set. Then each worker uses an indirect access array to know the order in which it should access the buckets. Moreover, all the tasks inside a bucket must be compatible with all the processing units that may access it (at least). As an example, see the following code where we have 5 types of tasks. CPU workers can compute all of them, but CUDA workers can only execute tasks of types 0 and 1, and is expected to go 20 and 30 time faster than the CPU, respectively. \code{.c} // In the file that init StarPU #include //////////////////////////////////////////////////// // Before calling starpu_init struct starpu_conf conf; starpu_conf_init(&conf); // Inform StarPU to use Heteroprio conf.sched_policy_name = "heteroprio"; // Inform StarPU about the function that will init the priorities in Heteroprio // where init_heteroprio is a function to implement conf.sched_policy_init = &init_heteroprio; // Do other things with conf if needed, then init StarPU starpu_init(&conf); //////////////////////////////////////////////////// void init_heteroprio(unsigned sched_ctx) { // CPU uses 5 buckets and visits them in the natural order starpu_heteroprio_set_nb_prios(ctx, STARPU_CPU_IDX, 5); // It uses direct mapping idx => idx for(unsigned idx = 0; idx < 5; ++idx){ starpu_heteroprio_set_mapping(ctx, STARPU_CPU_IDX, idx, idx); // If there is no CUDA worker we must tell that CPU is faster starpu_heteroprio_set_faster_arch(ctx, STARPU_CPU_IDX, idx); } if(starpu_cuda_worker_get_count()){ // CUDA is enabled and uses 2 buckets starpu_heteroprio_set_nb_prios(ctx, STARPU_CUDA_IDX, 2); // CUDA will first look at bucket 1 starpu_heteroprio_set_mapping(ctx, STARPU_CUDA_IDX, 0, 1); // CUDA will then look at bucket 2 starpu_heteroprio_set_mapping(ctx, STARPU_CUDA_IDX, 1, 2); // For bucket 1 CUDA is the fastest starpu_heteroprio_set_faster_arch(ctx, STARPU_CUDA_IDX, 1); // And CPU is 30 times slower starpu_heteroprio_set_arch_slow_factor(ctx, STARPU_CPU_IDX, 1, 30.0f); // For bucket 0 CUDA is the fastest starpu_heteroprio_set_faster_arch(ctx, STARPU_CUDA_IDX, 0); // And CPU is 20 times slower starpu_heteroprio_set_arch_slow_factor(ctx, STARPU_CPU_IDX, 0, 20.0f); } } \endcode Then, when a task is inserted the priority of the task will be used to select in which bucket is has to be stored. So, in the given example, the priority of a task will be between 0 and 4 included. However, tasks of priorities 0-1 must provide CPU and CUDA kernels, and tasks of priorities 2-4 must provide CPU kernels (at least). */ starpu-1.3.9+dfsg/doc/doxygen/chapters/330_scheduling_contexts.doxy000066400000000000000000000240741413463044200253720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page SchedulingContexts Scheduling Contexts TODO: improve! \section ContextGeneralIdeas 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 kernels. The main goal is to minimize interferences between the execution of multiple parallel kernels, by partitioning the underlying pool of workers using contexts. Scheduling contexts additionally allow a user to make use of a different scheduling policy depending on the target resource set. \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 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), the amount of workers (or -1 to designate all workers on the platform) and a list of optional parameters such as the scheduling policy, terminated by a 0. The scheduling policy 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 list of workers assigned to it, the number of workers, the name of the context and the scheduling policy to be used within the context */ int id_ctx = starpu_sched_ctx_create(workerids, 3, "my_ctx", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* let StarPU know that the following tasks will be submitted to this context */ starpu_sched_ctx_set_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. \subsection CreatingAContextWithTheDefaultBehavior Creating A Context With The Default Behavior If no scheduling policy is specified when creating the context, it will be used as another type of resource: a cluster. A cluster is a context without scheduler (eventually delegated to another runtime). For more information see \ref ClusteringAMachine. It is therefore mandatory to stipulate a scheduler to use the contexts in this traditional way. To create a context with the default scheduler, that is either controlled through the environment variable STARPU_SCHED or the StarPU default scheduler, one can explicitly use the option STARPU_SCHED_CTX_POLICY_NAME, "" as in the following example: \code{.c} /* the list of resources the context will manage */ int workerids[3] = {1, 3, 10}; /* indicate the list of workers assigned to it, the number of workers, and use the default scheduling policy. */ int id_ctx = starpu_sched_ctx_create(workerids, 3, "my_ctx", STARPU_SCHED_CTX_POLICY_NAME, "", 0); /* .... */ \endcode \section CreatingAGPUContext Creating A Context To Partition a GPU The contexts can also be used to group set of SMs of an NVIDIA GPU in order to isolate the parallel kernels and allow them to coexecution on a specified partiton of the GPU. Each context will be mapped to a stream and the user can indicate the number of SMs. The context can be added to a larger context already grouping CPU cores. This larger context can use a scheduling policy that assigns tasks to both CPUs and contexts (partitions of the GPU) based on performance models adjusted to the number of SMs. The GPU implementation of the task has to be modified accordingly and receive as a parameter the number of SMs. \code{.c} /* get the available streams (suppose we have nstreams = 2 by specifying them with STARPU_NWORKER_PER_CUDA=2 */ int nstreams = starpu_worker_get_stream_workerids(gpu_devid, stream_workerids, STARPU_CUDA_WORKER); int sched_ctx[nstreams]; sched_ctx[0] = starpu_sched_ctx_create(&stream_workerids[0], 1, "subctx", STARPU_SCHED_CTX_CUDA_NSMS, 6, 0); sched_ctx[1] = starpu_sched_ctx_create(&stream_workerids[1], 1, "subctx", STARPU_SCHED_CTX_CUDA_NSMS, 7, 0); int ncpus = 4; int workers[ncpus+nstreams]; workers[ncpus+0] = stream_workerids[0]; workers[ncpus+1] = stream_workerids[1]; big_sched_ctx = starpu_sched_ctx_create(workers, ncpus+nstreams, "ctx1", STARPU_SCHED_CTX_SUB_CTXS, sched_ctxs, nstreams, STARPU_SCHED_CTX_POLICY_NAME, "dmdas", 0); starpu_task_submit_to_ctx(task, big_sched_ctx); \endcode \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 those 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. Tasks 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 will be submitted when workers are added to the contexts. \code{.c} /* create a empty context */ unsigned sched_ctx_id = starpu_sched_ctx_create(NULL, 0, "ctx", 0); /* submit a task to this context */ starpu_sched_ctx_set_context(&sched_ctx_id); ret = starpu_task_insert(&codelet, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); /* add CPU workers to the context */ int procs[STARPU_NMAXWORKERS]; int nprocs = starpu_cpu_worker_get_count(); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, nprocs); starpu_sched_ctx_add_workers(procs, nprocs, sched_ctx_id); /* and wait for the task termination */ starpu_task_wait_for_all(); \endcode However, if resources are never allocated to the context, the application will not terminate. If these tasks have low priority, the application can inform StarPU to not submit them by calling the function starpu_sched_ctx_stop_task_submission(). */ starpu-1.3.9+dfsg/doc/doxygen/chapters/340_scheduling_context_hypervisor.doxy000066400000000000000000000233561413463044200275040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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/s 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/s 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.3.9+dfsg/doc/doxygen/chapters/350_scheduling_policy_definition.doxy000066400000000000000000000671501413463044200272360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ /*! \page HowToDefineANewSchedulingPolicy How To Define A New Scheduling Policy \section NewSchedulingPolicy_Introduction Introduction StarPU provides two ways of defining a scheduling policy, a basic monolithic way, and a modular way. The basic monolithic way is directly connected with the core of StarPU, which means that the policy then has to handle all performance details, such as data prefetching, task performance model calibration, worker locking, etc. examples/scheduler/dummy_sched.c is a trivial example which does not handle this, and thus e.g. does not achieve any data prefetching or smart scheduling. The modular way allows to implement just one component, and reuse existing components to cope with all these details. examples/scheduler/dummy_modular_sched.c is a trivial example very similar to dummy_sched.c, but implemented as a component, which allows to assemble it with other components, and notably get data prefetching support for free, and task performance model calibration is properly performed, which allows to easily extend it into taking task duration into account, etc. \section SchedulingHelpers Helper functions for defining a scheduling policy (Basic or modular) Make sure to have a look at the \ref API_Scheduling_Policy section, which provides a complete list of the functions available for writing advanced schedulers. This includes getting an estimation for a task computation completion with starpu_task_expected_length(), for the required data transfers with starpu_task_expected_data_transfer_time_for(), for the required energy with starpu_task_expected_energy(), etc. Other useful functions include starpu_transfer_bandwidth(), starpu_transfer_latency(), starpu_transfer_predict(), ... One can also directly test the presence of a data handle with starpu_data_is_on_node(). Prefetches can be triggered by calling either starpu_prefetch_task_input_for(), starpu_idle_prefetch_task_input(), starpu_prefetch_task_input_for_prio(), or starpu_idle_prefetch_task_input_for_prio(). The _prio versions allow to specify a priority for the transfer (instead of taking the task priority by default). These prefetches are only processed when there are no fetch data requests (i.e. a task is waiting for it) to process. The _idle versions queue the transfers on the idle prefetch queue, which is only processed when there are no non-idle prefetch to process. starpu_get_prefetch_flag() is a convenient helper for checking the value of the \ref STARPU_PREFETCH environment variable. Usual functions can be used on tasks, for instance one can use the following to get the data size for a task. \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 Task queues can be implemented with the starpu_task_list functions. Access to the \c hwloc topology is available with starpu_worker_get_hwloc_obj(). \section DefiningANewBasicSchedulingPolicy Defining A New Basic Scheduling Policy A full example showing how to define a new scheduling policy is available in the StarPU sources in examples/scheduler/dummy_sched.c. 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 to give the ready task to the scheduler. When a worker is idle, the starpu_sched_policy::pop_task method is called to get a task from the scheduler. 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 this list. A scheduler can also use starpu_push_local_task() to directly push tasks to a per-worker queue, and then starpu does not even need to implement starpu_sched_policy::pop_task. If there are no ready tasks within the scheduler, it can just return \c NULL, and the worker will sleep. The \ref starpu_sched_policy section provides the exact rules that govern the methods of the policy. One can enumerate the workers with this iterator: \code{.c} 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); ... } \endcode To provide synchronization between workers, a per-worker lock exists to protect the data structures of a given worker. It is acquired around scheduler methods, so that the scheduler does not need any additional mutex to protect its per-worker data. In case the scheduler wants to access another scheduler's data, it should use starpu_worker_lock() and starpu_worker_unlock(). Calling \code{.c}starpu_worker_lock(B)\endcode from a worker \c A will however thus make worker \c A wait for worker \c B to complete its scheduling method. That may be a problem if that method takes a long time, because it is e.g. computing a heuristic or waiting for another mutex, or even cause deadlocks if worker \c B is calling \code{.c}starpu_worker_lock(A)\endcode at the same time. In such a case, worker \c B must call starpu_worker_relax_on() and starpu_worker_relax_off() around the section which potentially blocks (and does not actually need protection). While a worker is in relaxed mode, e.g. between a pair of starpu_worker_relax_on() and starpu_worker_relax_off() calls, its state can be altered by other threads: for instance, worker \c A can push tasks for worker \c B. In consequence, worker \c B must re-assess its state after \code{.c}starpu_worker_relax_off(B)\endcode, such as taking possible new tasks pushed to its queue into account. When the starpu_sched_policy::push_task method has pushed a task for another worker, one has to call starpu_wake_worker_relax_light() so that the worker wakes up and picks it. If the task was pushed on a shared queue, one may want to only wake one idle worker. An example doing this is available in src/sched_policies/eager_central_policy.c. A pointer to one data structure specific to the scheduler can be set with starpu_sched_ctx_set_policy_data() and fetched with starpu_sched_ctx_get_policy_data(). Per-worker data structures can then be store in it by allocating a \ref STARPU_NMAXWORKERS -sized array of structures indexed by workers. A variety of examples of advanced schedulers can be read in src/sched_policies, for instance random_policy.c, eager_central_policy.c, work_stealing_policy.c Code protected by if (_starpu_get_nsched_ctxs() > 1) can be ignored, this is for scheduling contexts, which is an experimental feature. \section DefiningANewModularSchedulingPolicy Defining A New Modular Scheduling Policy 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
                                |  ^
                        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
                  |                             |
starpu_pop_task   |                             |
                  v                             v
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. \subsection Interface Each Scheduling Component must follow the following pre-defined Interface to be able to interact with other Scheduling Components. - push_task (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_task (parent_component, caller_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 The components also provide the following useful methods: - starpu_sched_component::estimated_load provides an estimated load of the component - starpu_sched_component::estimated_end provides an estimated date of availability of workers behind the component, after processing tasks in the component and below. This is computed only if the estimated field of the tasks have been set before passing it to the component. \subsection BuildAModularizedScheduler Building a Modularized Scheduler \subsubsection PreImplementedComponents Pre-implemented Components StarPU is currently shipped with the following four Scheduling Components : - Storage 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. When a push operation tries to queue a task beyond the threshold, the push fails. When some task leaves the queue (and thus possibly more tasks can fit), this component calls can_push from ancestors. - Resource-Mapping Components : Mct, Heft, Eager, Random, Work-Stealing \n "Core" of the Scheduling Strategy, those Components are the ones who make scheduling choices between their children components. - Worker Components : Worker \n Each Worker Component modelizes a concrete worker, and copes with the technical tricks of interacting with the StarPU core. Modular schedulers thus usually have them at the bottom of their component tree. - 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: a component that assumes tasks with a calibrated performance model; a component for non-yet-calibrated tasks, that will distribute them to get measurements done as quickly as possible; and a component that takes the tasks without performance models.\n The Best_Implementation Component chooses which implementation of a task should be used on the chosen resource. \subsubsection ProgressionAndValidationRules Progression And Validation Rules Some rules must be followed to ensure the correctness of a Modularized Scheduler : - At least one Storage Component without threshold is needed in a Modularized Scheduler, to store incoming tasks from StarPU. It can for instance be a global component at the top of the tree, or one component per worker at the bottom of the tree, or intermediate assemblies. The important point is that the starpu_sched_component::push_task call at the top can not fail, so there has to be a storage component without threshold between the top of the tree and the first storage component with threshold, or the workers themselves. - At least one Resource-Mapping Component is needed in a Modularized Scheduler. Resource-Mapping Components are the only ones which can make scheduling choices, and so the only ones which can have several child. \subsubsection ModularizedSchedulerLocking Locking in modularized schedulers Most often, components do not need to take locks. This allows e.g. the push operation to be called in parallel when tasks get released in parallel from different workers which have completed different ancestor tasks. When a component has internal information which needs to be kept coherent, the component can define its own lock at take it as it sees fit, e.g. to protect a task queue. This may however limit scalability of the scheduler. Conversely, since push and pull operations will be called concurrently from different workers, the component might prefer to use a central mutex to serialize all scheduling decisions to avoid pathological cases (all push calls decide to put their task on the same target) \subsubsection ImplementAModularizedScheduler Implementing a Modularized Scheduler The following code shows how to implement a Tree-Eager-Prefetching Scheduler. \code{.c} static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id) { /* The eager component will decide for each task which worker will run it, * and we want fifos both above and below the component */ starpu_sched_component_initialize_simple_scheduler( starpu_sched_component_eager_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFOS_BELOW, sched_ctx_id); } /* 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); } /* 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 starpu_sched_component_initialize_simple_scheduler() is a helper function which makes it very trivial to assemble a modular scheduler around a scheduling decision component as seen above (here, a dumb eager decision component). Most often a modular scheduler can be implemented that way. A modular scheduler can also be constructed hierarchically with starpu_sched_component_composed_recipe_create(). That modular scheduler can also be built by hand in the following way: \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 */ starpu_sched_component_connect(t->root, eager_component); /* 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_new(i); struct starpu_sched_component * fifo_component = starpu_sched_component_fifo_create(&fifo_data); starpu_sched_component_connect(fifo_component, worker_component); /* Each Flow-control Fifo Component associated to a Worker * Component is linked to the Eager Component as one of its * children */ 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); } /* 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 Other modular scheduler examples can be seen in src/sched_policies/modular_*.c For instance, \c modular-heft-prio needs performance models, decides memory nodes, uses prioritized fifos above and below, and decides the best implementation. If unsure on the result of the modular scheduler construction, you can run a simple application with FxT enabled (see \ref GeneratingTracesWithFxT), and open the generated file \c trace.html in a web-browser. \subsection ModularizedSchedulersAndParallelTasks Management of parallel task At the moment, parallel tasks can be managed in modularized schedulers through combined workers: instead of connecting a scheduling component to a worker component, one can connect it to a combined worker component (i.e. a worker component created with a combined worker id). That component will handle creating task aliases for parallel execution and push them to the different workers components. \subsection WriteASchedulingComponent Writing a Scheduling Component \subsubsection 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. \subsubsection 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 programmers want to give to the Scheduling Component they are 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 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. \subsubsection 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 ImplementAModularizedScheduler 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
\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. This 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 \c _starpu_graph_record to \c 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 \c _starpu_graph_compute_depths() to compute the bottom-up ranks, and then uses these ranks 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. This 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 this task, thus allowing to inspect the scheduler state, etc. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/360_debugging_tools.doxy000066400000000000000000000115741413463044200244750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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" \c configure 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.3.9+dfsg/doc/doxygen/chapters/370_online_performance_tools.doxy000066400000000000000000000534701413463044200264110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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. To display the summary in a file instead of the standard error stream, use the environment variable \ref STARPU_WORKER_STATS_FILE. \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/s 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. To display the summary in a file instead of the standard error stream, use the environment variable \ref STARPU_BUS_STATS_FILE. \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 MPI-relatedFeedback MPI-related Feedback Statistics about the data transfers which were performed over MPI can be obtained by setting the environment variable \ref STARPU_COMM_STATS to 1; a summary will then be displayed at program termination: \verbatim [starpu_comm_stats][1] TOTAL: 456.000000 B 0.000435 MB 0.000188 B/s 0.000000 MB/s [starpu_comm_stats][1:0] 456.000000 B 0.000435 MB 0.000188 B/s 0.000000 MB/s [starpu_comm_stats][0] TOTAL: 456.000000 B 0.000435 MB 0.000188 B/s 0.000000 MB/s [starpu_comm_stats][0:1] 456.000000 B 0.000435 MB 0.000188 B/s 0.000000 MB/s \endverbatim These statistics can be plotted as heatmaps using StarPU tool starpu_mpi_comm_matrix.py (see \ref MPIDebug). \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.
  • Another type of model is ::STARPU_MULTIPLE_REGRESSION_BASED, which is based on multiple linear regression. In this model, the user defines both the relevant parameters and the equation for computing the task duration. \f[ T_{kernel} = a + b(M^{\alpha_1} * N^{\beta_1} * K^{\gamma_1}) + c(M^{\alpha_2} * N^{\beta_2} * K^{\gamma_2}) + ... \f] \f$M, N, K\f$ are the parameters of the task, added at the task creation. These need to be extracted by the cl_perf_func function, which should be defined by the user. \f$\alpha, \beta, \gamma\f$ are the exponents defined by the user in model->combinations table. Finally, coefficients \f$a, b, c\f$ are computed automatically by the StarPU at the end of the execution, using least squares method of the dgels_ LAPACK function. examples/mlr/mlr.c example provides more details on the usage of ::STARPU_MULTIPLE_REGRESSION_BASED models. The \ref enable-mlr "--enable-mlr" configure option needs to be set to calibrate the model. Coefficients computation is done at the end of the execution, and the results are stored in standard codelet perfmodel files. Additional files containing the duration of task together with the value of each parameter are stored in .starpu/sampling/codelets/tmp/ directory. These files are reused when \ref STARPU_CALIBRATE environment variable is set to 1, to recompute coefficients based on the current, but also on the previous executions. By default StarPU uses a lightweight dgels implementation, but the \ref enable-mlr-system-blas "--enable-mlr-system-blas" configure option can be used to make StarPU use a system-provided dgels BLAS. Additionally, when multiple linear regression models are not enabled through \ref enable-mlr "--enable-mlr" or when the model->combinations are not defined, StarPU will still write output files into .starpu/sampling/codelets/tmp/ to allow performing an analysis. This analysis typically aims at finding the most appropriate equation for the codelet and tools/starpu_mlr_analysis script provides an example of how to perform such study.
  • 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 return 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. The application can also request an on-the-fly XML report of the performance model, by calling starpu_perfmodel_dump_xml() to print the report to a FILE*. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/380_offline_performance_tools.doxy000066400000000000000000000736171413463044200265550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 get a tarball from http://download.savannah.gnu.org/releases/fkt/?C=M 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 MPI id of the process that used StarPU (or 0 when running a sequential program). One can change the name of the file by setting the environnement variable \ref STARPU_FXT_SUFFIX, its contents will be used instead of prof_file_XXX. 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 \c 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. When the FxT trace file prof_file_something has been generated, it is possible to generate different trace formats 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. One can also set the environment variable \ref STARPU_GENERATE_TRACE_OPTIONS to specify options, see starpu_fxt_tool --help, for example: \verbatim $ export STARPU_GENERATE_TRACE=1 $ export STARPU_GENERATE_TRACE_OPTIONS="-no-acquire" \endverbatim When running a MPI application, \ref STARPU_GENERATE_TRACE will not work as expected (each node will try to generate trace files, 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, the generated 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 . \subsubsection CreatingAGanttDiagram Creating a Gantt Diagram One of the generated files is a trace in the Paje format. The file, located in the current directory, is named paje.trace. It can be viewed with ViTE (http://vite.gforge.inria.fr/) a trace visualizing open-source tool. To open the file paje.trace with ViTE, use the following command: \verbatim $ vite paje.trace \endverbatim Tasks can be assigned a name (instead of the default \c unknown) by filling the optional starpu_codelet::name, or assigning them a performance model. The name can also be set with the field starpu_task::name or by using \ref STARPU_NAME when calling starpu_task_insert(). Tasks are assigned default colors based on the worker which executed them (green for CPUs, yellow/orange/red for CUDAs, blue for OpenCLs, red for MICs, ...). To use a different color for every type of task, one can specify the option -c to starpu_fxt_tool or in \ref STARPU_GENERATE_TRACE_OPTIONS. Tasks can also be given a specific color by setting the field starpu_codelet::color or the starpu_task::color. Colors are expressed with the following format \c 0xRRGGBB (e.g \c 0xFF0000 for red). See basic_examples/task_insert_color for examples on how to assign colors. To get statistics on the time spend in runtime overhead, one can use the statistics plugin of ViTE. In Preferences, select Plugins. In "States Type", select "Worker State". Then click on "Reload" to update the histogram. The red "Idle" percentages are due to lack of parallelism, while the brown "Overhead" and "Scheduling" percentages are due to the overhead of the runtime and of the scheduler. To identify tasks precisely, the application can also set the field starpu_task::tag_id or setting \ref STARPU_TAG_ONLY when calling starpu_task_insert(). The value of the tag will then show up in the trace. One can also introduce user-defined events in the diagram thanks to the starpu_fxt_trace_user_event_string() function. One 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). \subsubsection CreatingADAGWithGraphviz Creating a DAG With Graphviz Another generated trace file is a task graph described using the DOT language. The file, created in the current directory, is named dag.dot file in the current directory. 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 \subsubsection TraceTaskDetails Getting Task Details Another generated trace file gives details on the executed tasks. The file, created in the current directory, is named tasks.rec. 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. Another possibility is to obtain the performance models as an auxiliary perfmodel.rec file, by using the starpu_perfmodel_recdump utility: \verbatim $ starpu_perfmodel_recdump tasks.rec -o perfmodel.rec \endverbatim \subsubsection MonitoringActivity Monitoring Activity Another generated trace file is an activity trace. The file, created in the current directory, is named activity.data. 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. \subsubsection Animation Getting Modular Schedular Animation When using modular schedulers (i.e. schedulers which use a modular architecture, and whose name start with "modular-"), the call to starpu_fxt_tool 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. An XML output can also be printed by using the -x option: \verbatim tools/starpu_perfmodel_display -x -s non_linear_memset_regression_based \endverbatim 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/s 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/s. \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 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 \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 An other way to get statistics of StarPU states (without installing R and pj_dump) is to use the starpu_trace_state_stats.py script which parses the generated trace.rec file instead of the paje.trace file. The output is similar to the previous script but it doesn't need any dependencies. The different prefixes used in trace.rec are: \verbatim E: Event type N: Event name C: Event category W: Worker ID T: Thread ID S: Start time \endverbatim Here's an example on how to use it: \verbatim $ starpu_trace_state_stats.py trace.rec | column -t -s "," "Name" "Count" "Type" "Duration" "Callback" 220 Runtime 0.075978 "chol_model_11" 10 Task 565.176 "chol_model_21" 45 Task 9184.828 "chol_model_22" 165 Task 64712.07 \endverbatim starpu_trace_state_stats.py can also be used to compute the different efficiencies. Refer to the usage description to show some examples. 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 starvz Trace visualization with StarVZ Creating views with StarVZ (see: https://github.com/schnorr/starvz) is made up of two steps. The initial stage consists of a pre-processing of the traces generated by the application, while the second one consists of the analysis itself and is carried out with R packages' aid. StarVZ is available at CRAN (https://cran.r-project.org/package=starvz) and depends on pj_dump (from pajeng) and rec2csv (from recutils). To download and install StarVZ, it is necessary to have R, pajeng, and recutils: \verbatim # For pj_dump and rec2csv apt install -y pajeng recutils # For R apt install -y r-base libxml2-dev libssl-dev libcurl4-openssl-dev libgit2-dev libboost-dev \endverbatim To install the StarVZ, the following command can be used: \verbatim echo "install.packages('starvz', repos = 'https://cloud.r-project.org')" | R --vanilla \endverbatim To generate traces from an application, it is necessary to set \ref STARPU_GENERATE_TRACE and build StarPU with FxT. Then, StarVZ can be used on a folder with StarPU FxT traces to produce a default view: \verbatim export PATH=$(Rscript -e 'cat(system.file("tools/", package = "starvz"), sep="\n")'):$PATH starvz /foo/path-to-fxt-files \endverbatim An example of default view: \image html starvz_visu.png \image latex starvz_visu.pdf "" width=\textwidth One can also use existing trace files (paje.trace, tasks.rec, data.rec, papi.rec and dag.dot) skipping the StarVZ internal call to starpu_fxt_tool with: \verbatim starvz --use-paje-trace /foo/path-to-trace-files \endverbatim Alternatively, each StarVZ step can be executed separately. Step 1 can be used on a folder with: \verbatim starvz -1 /foo/path-to-fxt-files \endverbatim Then the second step can be executed directly in R. StarVZ enables a set of different plots that can be configured on a .yaml file. A default file is provided (default.yaml); also, the options can be changed directly in R. \verbatim library(starvz) library(dplyr) dtrace <- starvz_read("./", selective = FALSE) # show idleness ratio dtrace$config$st$idleness = TRUE # show ABE bound dtrace$config$st$abe$active = TRUE # find the last task with dplyr dtrace$config$st$tasks$list = dtrace$Application %>% filter(End == max(End)) %>% .$JobId # show last task dependencies dtrace$config$st$tasks$active = TRUE dtrace$config$st$tasks$levels = 50 plot <- starvz_plot(dtrace) \endverbatim An example of visualization follows: \image html starvz_visu_r.png \image latex starvz_visu_r.pdf "" width=\textwidth \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 define the environment variable \ref STARPU_ENABLE_STATS. 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 GFlop/s : 44.21 \endverbatim // TODO: data transfer stats are similar to the ones displayed when // setting STARPU_BUS_STATS */ starpu-1.3.9+dfsg/doc/doxygen/chapters/390_faq.doxy000066400000000000000000000311651413463044200220720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 by default. 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. One can choose to dedicate only one thread for all the CUDA devices by setting the \ref STARPU_CUDA_THREAD_PER_DEV environment variable to \c 1. The application however should use ::STARPU_CUDA_ASYNC on its CUDA codelets (asynchronous execution), otherwise the execution of a synchronous CUDA codelet will monopolize the thread, and other CUDA devices will thus starve while it is executing. \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 \c -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 \c -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.3.9+dfsg/doc/doxygen/chapters/401_out_of_core.doxy000066400000000000000000000221041413463044200236100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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. */ /*! \page OutOfCore Out Of Core \section OutOfCore_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. Similarly to what happens with GPUs (it's actually exactly the same code), when available main memory becomes scarse, StarPU will evict unused data to the disk, thus leaving room for new allocations. Whenever some evicted data is needed again for a task, StarPU will automatically fetch it back from the disk. 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 \c stdio, \c unistd or \c unistd_o_direct backends, or a leveldb database for the \c leveldb backend, an HDF5 file path for the \c HDF5 backend, etc. The \c disk backend opens this place with the plug() method. StarPU can then start using it to allocate room and store data there with the disk 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 \c stdio or \c unistd cases, or a database key in the \c leveldb case, and then use starpu_*_register functions to turn it into a StarPU data handle. StarPU will then use this file as external source of data, and automatically read and write data as appropriate. In any case, the user also needs to set \ref STARPU_LIMIT_CPU_MEM to the amount of data that StarPU will be allowed to afford. By default StarPU will use the machine memory size, but part of it is taken by the kernel, the system, daemons, and the application's own allocated data, whose size can not be predicted. That is why the user needs to specify what StarPU can afford. Some Out-of-core tests are worth giving a read, see tests/disk/*.c \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 \c unistd library to realize the read/write operations, i.e. \c fread/\c 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 \ref STARPU_DISK_SWAP, \ref STARPU_DISK_SWAP_BACKEND and \ref STARPU_DISK_SWAP_SIZE : \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 \c stdio (some caching is done by \c libc and the kernel), \c unistd (only caching in the kernel), \c unistd_o_direct (no caching), \c leveldb, or \c hdf5. It is important to understand that when the backend is not set to \c unistd_o_direct, some caching will occur at the kernel level (the page cache), which will also consume memory... \ref STARPU_LIMIT_CPU_MEM might need to be set to less that half of the machine memory just to leave room for the kernel's page cache, otherwise the kernel will struggle to get memory. Using \c unistd_o_direct avoids this caching, thus allowing to set \ref STARPU_LIMIT_CPU_MEM to the machine memory size (minus some memory for normal kernel operations, system daemons, and application data). When the register call is made, 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 then automatically try to evict unused data to this new disk. One can also use the standard StarPU memory node API to prefetch data etc., see the \ref API_Standard_Memory_Library and the \ref API_Data_Interfaces. The disk is unregistered during the starpu_shutdown(). \section OOCDataRegistration Data Registration StarPU will only be able to achieve Out-Of-Core eviction if it controls memory allocation. For instance, if the application does the following: \code{.c} p = malloc(1024*1024*sizeof(float)); fill_with_data(p); starpu_matrix_data_register(&h, STARPU_MAIN_RAM, (uintptr_t) p, 1024, 1024, 1024, sizeof(float)); \endcode StarPU will not be able to release the corresponding memory since it's the application which allocated it, and StarPU can not know how, and thus how to release it. One thus have to use the following instead: \code{.c} starpu_matrix_data_register(&h, -1, NULL, 1024, 1024, 1024, sizeof(float)); starpu_task_insert(cl_fill_with_data, STARPU_W, h, 0); \endcode Which makes StarPU automatically do the allocation when the task running cl_fill_with_data gets executed. And then if its needs to, it will be able to release it after having pushed the data to the disk. Since no initial buffer is provided to starpu_matrix_data_register(), the handle does not have any initial value right after this call, and thus the very first task using the handle needs to use the ::STARPU_W mode like above, ::STARPU_R or ::STARPU_RW would not make sense. By default, StarPU will try to push any data handle to the disk. To specify whether a given handle should be pushed to the disk, starpu_data_set_ooc_flag() should be used. \section OOCWontUse Using Wont Use By default, StarPU uses a Least-Recently-Used (LRU) algorithm to determine which data should be evicted to the disk. This algorithm can be hinted by telling which data will no be used in the coming future thanks to starpu_data_wont_use(), for instance: \code{.c} starpu_task_insert(&cl_work, STARPU_RW, h, 0); starpu_data_wont_use(h); \endcode StarPU will mark the data as "inactive" and tend to evict to the disk that data rather than others. \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. \section Performances Scheduling heuristics for Out-of-core are still relatively experimental. The tricky part is that you usually have to find a compromise between privileging locality (which avoids back and forth with the disk) and privileging the critical path, i.e. taking into account priorities to avoid lack of parallelism at the end of the task graph. It is notably better to avoid defining different priorities to tasks with low priority, since that will make the scheduler want to schedule them by levels of priority, at the depense of locality. The scheduling algorithms worth trying are thus dmdar and lws, which privilege data locality over priorities. There will be work on this area in the coming future. \section FeedBackFigures Feedback Figures Beyond pure performance feedback, some figures are interesting to have a look at. Using export STARPU_BUS_STATS=1 (\ref STARPU_BUS_STATS and \ref STARPU_BUS_STATS_FILE to define a filename in which to display statistics, by default the standard error stream is used) gives an overview of the data transfers which were needed. The values can also be obtained at runtime by using starpu_bus_get_profiling_info(). An example can be read in src/profiling/profiling_helpers.c. \verbatim #--------------------- Data transfer speed for /tmp/sthibault-disk-DJzhAj (node 1): 0 -> 1: 99 MB/s 1 -> 0: 99 MB/s 0 -> 1: 23858 µs 1 -> 0: 23858 µs #--------------------- TEST DISK MEMORY #--------------------- Data transfer stats: Disk 0 -> NUMA 0 0.0000 GB 0.0000 MB/s (transfers : 0 - avg -nan MB) NUMA 0 -> Disk 0 0.0625 GB 63.6816 MB/s (transfers : 2 - avg 32.0000 MB) Total transfers: 0.0625 GB #--------------------- \endverbatim Using export STARPU_ENABLE_STATS=1 gives information for each memory node on data miss/hit and allocation miss/hit. \verbatim #--------------------- MSI cache stats : memory node NUMA 0 hit : 32 (66.67 %) miss : 16 (33.33 %) memory node Disk 0 hit : 0 (0.00 %) miss : 0 (0.00 %) #--------------------- #--------------------- Allocation cache stats: memory node NUMA 0 total alloc : 16 cached alloc: 0 (0.00 %) memory node Disk 0 total alloc : 8 cached alloc: 0 (0.00 %) #--------------------- \endverbatim \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. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/410_mpi_support.doxy000066400000000000000000001312301413463044200236670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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. In case the user wants to run several MPI processes by machine (e.g. one per NUMA node), \ref STARPU_WORKERS_GETBIND should be used to make StarPU take into account the binding set by the MPI launcher (otherwise each StarPU instance would try to bind on all cores of the machine...) 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 MPIBuild Building with MPI support If a mpicc compiler is already in your PATH, StarPU will automatically enable MPI support in the build. If mpicc is not in PATH, you can specify its location by passing --with-mpicc=/where/there/is/mpicc to ./configure It can be useful to enable MPI tests during make check by passing --enable-mpi-check to ./configure. And similarly to mpicc, if mpiexec in not in PATH, you can specify its location by passing --with-mpiexec=/where/there/is/mpiexec to ./configure, but this is not needed if it is next to mpicc, configure will look there in addition to PATH. Similarly, Fortran examples use mpif90, which can be specified manually with --with-mpifort if it can't be found automatically. \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.3 # options for the compiler $ pkg-config --libs starpumpi-1.3 # 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); 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(); 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_conf() to initialize StarPU-MPI. The third parameter of the function indicates if MPI should be initialized by StarPU or if the application did 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. For send communications, data is acquired with the mode ::STARPU_R. When using the \c configure option \ref enable-mpi-pedantic-isend "--enable-mpi-pedantic-isend", the mode ::STARPU_RW is used to make sure there is no more than 1 concurrent \c MPI_Isend() call accessing a data and StarPU does not read from it from tasks during the communication. 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. \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); *ptr = starpu_malloc_on_node_flags(node, *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; } \endcode The inverse 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_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_interface_datatype_register() allows to do so. This function takes 3 parameters: the interface ID 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. If for some data an MPI datatype can not be built (e.g. complex data structure), the creation function can return -1, StarPU-MPI will then fallback to using pack/unpack. The functions to create and free the MPI datatype are defined and registered 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_Get_address(complex_interface, displacements); MPI_Get_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); } static struct starpu_data_interface_ops interface_complex_ops = { ... }; interface_complex_ops.interfaceid = starpu_data_interface_get_next_id(); starpu_mpi_interface_datatype_register(interface_complex_ops.interfaceid, starpu_complex_interface_datatype_allocate, starpu_complex_interface_datatype_free); starpu_data_interface handle; starpu_complex_data_register(&handle, STARPU_MAIN_RAM, real, imaginary, 2); ... \endcode It is also possible to use starpu_mpi_datatype_register() to register the functions through a handle rather than the interface ID, but note that in that case it is important to make sure no communication is going to occur before the function starpu_mpi_datatype_register() is called. This would otherwise 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. One would thus need to synchronize all nodes: \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 this 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 this 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. 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, which posts the required send/recv on the various nodes which have to. Only the node which is to execute the task will then return a valid task structure, others will return NULL. This node must submit the 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 meant to happen after the task execution. \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 MPIInsertPruning Pruning MPI Task Insertion Making all MPI nodes process the whole graph 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. \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 this case, nodes which will not need the data can just pass \c 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 \c 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 \c 1 determines that it does not have to care about \c data0, but knows that it should send the value of its \c data1 to node \c 0, which owns data and thus will need the value of \c 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 MPIPriorities Priorities All send functions have a _prio variant which takes an additional priority parameter, which allows to make StarPU-MPI change the order of MPI requests before submitting them to MPI. The default priority is \c 0. When using the starpu_mpi_task_insert() helper, ::STARPU_PRIORITY defines both the task priority and the MPI requests priority. To test how much MPI priorities have a good effect on performance, you can set the environment variable \ref STARPU_MPI_PRIORITIES to \c 0 to disable the use of priorities in StarPU-MPI. \section MPICache MPI Cache Support StarPU-MPI automatically optimizes duplicate data transmissions: if an MPI node \c B needs a piece of data \c D from MPI node \c A for several tasks, only one transmission of \c D will take place from \c A to \c B, and the value of \c D will be kept on \c B as long as no task modifies \c D. If a task modifies \c D, \c B will wait for all tasks which need the previous value of \c D, before invalidating the value of \c D. As a consequence, it releases the memory occupied by \c D. Whenever a task running on \c B needs the new value of \c 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 \c 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 \c D will be initiated from \c A to \c 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 this (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 data is cached with starpu_mpi_cached_receive() and starpu_mpi_cached_send(). Functions starpu_mpi_cached_receive_set() and starpu_mpi_cached_send_set() are automatically called by starpu_mpi_task_insert() but can also be called directly by the application. Functions starpu_mpi_cached_send_clear() and starpu_mpi_cached_receive_clear() must be called to clear data from the cache. They are also automatically called when using starpu_mpi_task_insert(). 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 which 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 ; xstarpu_mpi_comm_matrix.py, this will produce 2 PDF files, one plot for the bandwidth, and one plot for the data volume. \image latex trace_bw_heatmap.pdf "Bandwidth Heatmap" width=0.5\textwidth \image html trace_bw_heatmap.png "Bandwidth Heatmap" \image latex trace_volume_heatmap.pdf "Data Volume Heatmap" width=0.5\textwidth \image html trace_volume_heatmap.png "Data Bandwidth Heatmap" \section MPIExamples More MPI examples MPI examples are available in the StarPU source code in mpi/examples:
  • 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).
\section Nmad Using the NewMadeleine communication library NewMadeleine (see http://pm2.gforge.inria.fr/newmadeleine/, part of the PM2 project) is an optimizing communication library for high-performance networks. NewMadeleine provides its own interface, but also an MPI interface (called MadMPI). Thus there are two possibilities to use NewMadeleine with StarPU:
  • using the NewMadeleine's native interface. StarPU supports this interface from its release 1.3.0, by enabling the \c configure option \ref enable-nmad "--enable-nmad". In this case, StarPU relies directly on NewMadeleine to make communications progress and NewMadeleine has to be built with the profile pukabi+madmpi.conf.
  • using the NewMadeleine's MPI interface (MadMPI). StarPU will use the standard MPI API and NewMadeleine will handle the calls to the MPI API. In this case, StarPU makes communications progress and thus communication progress has to be disabled in NewMadeleine by compiling it with the profile pukabi+madmpi-mini.conf.
To build NewMadeleine, download the latest version from the website (or, better, use the Git version to use the most recent version), then: \code{.sh} cd pm2/scripts ./pm2-build-packages ./ --prefix= \endcode With Guix, the NewMadeleine's native interface can be used by setting the parameter \c \-\-with-input=openmpi=nmad and MadMPI can be used with \c \-\-with-input=openmpi=nmad-mini. Whatever implementation (NewMadeleine or MadMPI) is used by StarPU, the public MPI interface of StarPU (described in \ref API_MPI_Support) is the same. \section MPIMasterSlave MPI Master Slave Support StarPU provides an other way to execute applications across many nodes. The Master Slave support permits to use remote cores without thinking about data distribution. This support can be activated with the \c configure option \ref enable-mpi-master-slave "--enable-mpi-master-slave". However, you should not activate both MPI support and MPI Master-Slave support. The existing kernels for CPU devices can be used as such. They only have to be exposed through the name of the function in the \ref starpu_codelet::cpu_funcs_name field. 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. Optionally, you can choose the use of another function on slaves thanks to the field \ref starpu_codelet::mpi_ms_funcs. By default, one core is dedicated on the master node to manage the entire set of slaves. If the implementation of MPI you are using has a good multiple threads support, you can use the \c configure option \ref with-mpi-master-slave-multiple-thread "--with-mpi-master-slave-multiple-thread" to dedicate one core per slave. Choosing the number of cores on each slave device is done by setting the environment variable \ref STARPU_NMPIMSTHREADS "STARPU_NMPIMSTHREADS=\" with \ being the requested number of cores. By default all the slave's cores are used. Setting the number of slaves nodes is done by changing the -n parameter when executing the application with mpirun or mpiexec. The master node is by default the node with the MPI rank equal to 0. To select another node, use the environment variable \ref STARPU_MPI_MASTER_NODE "STARPU_MPI_MASTER_NODE=\" with \ being the requested MPI rank node. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/420_fft_support.doxy000066400000000000000000000055621413463044200236720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 \c float, \c double and long double precisions, with the following \c 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 FFTCompilation Compilation The flags required to compile or link against the FFT library are accessible with the following commands: \verbatim $ pkg-config --cflags starpufft-1.3 # options for the compiler $ pkg-config --libs starpufft-1.3 # options for the linker \endverbatim Also pass the option --static if the application is to be linked statically. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/430_mic_support.doxy000066400000000000000000000112661413463044200236620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page MICSupport MIC Xeon Phi Support \section MICCompilation Compilation 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 \c configure 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 \c coi or \c 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 \c mic offloading support). \section PortingApplicationsToMIC Porting Applications To MIC Xeon Phi The simplest way to port an application to MIC Xeon Phi 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 \c -rdynamic must be passed to \c gcc (or \c -export-dynamic to \c ld) so that symbols of the main program are visible. If you have used the starpu_codelet::where field, you additionally need to add in it ::STARPU_MIC for the Xeon Phi. 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 \ref STARPU_SINK environment variable is defined (on the sink) or not (on the host). \section LaunchingPrograms Launching Programs 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.3.9+dfsg/doc/doxygen/chapters/450_native_fortran_support.doxy000066400000000000000000000247641413463044200261440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 NFAPIMIX for a discussion about valid and unspecified combinations. \section NFImplementation Implementation Details and Specificities \subsection NFPrerequisites 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 NFOldFortran on information on how to write StarPU Fortran code with older compilers. \subsection NFConfiguration 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 \c 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 NFExamples 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 NFAppCompile 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 NFIdioms 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 NFInitExit 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 NFInsertTask 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 NFStructs 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 NFNotes Additional Notes about the Native Fortran Support \subsection NFOldFortran 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 \c configure option \ref disable-fortran "--disable-fortran" (which only disables StarPU's native Fortran layer). \subsection NFAPIMIX 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.3.9+dfsg/doc/doxygen/chapters/460_socl_opencl_extensions.doxy000066400000000000000000000066131413463044200261000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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.3.9+dfsg/doc/doxygen/chapters/470_simgrid.doxy000066400000000000000000000254101413463044200227540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * NOTE: XXX: also update simgrid versions in 101_building.doxy !! */ /*! \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, and 3.18 to 3.29. SimGrid version 3.25 needs to be configured with -Denable_msg=ON . Other versions may have compatibility issues. 3.17 notably does not build at all. MPI simulation does not work with version 3.22. \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 \c main() has to be recompiled with \c starpu_simgrid_wrap.h, which in the SimGrid case will # define main() into starpu_main(), and it is \c libstarpu which will provide the real \c main() and will call the application's \c main(). To be able to test with crazy data sizes, one may want to only allocate application data if the macro \c STARPU_SIMGRID is not defined. Passing a NULL pointer to \c 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 starpu_codelet::cuda_funcs with \c (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 or ::STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT flags are 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 \c SIMGRID_CFLAGS and \c SIMGRID_LIBS, or use the \c 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 that 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: \c attila, \c mirage, \c idgraf, and \c 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_TRANSFER_COST, \ref STARPU_SIMGRID_CUDA_MALLOC_COST, \ref STARPU_SIMGRID_CUDA_QUEUE_COST, \ref STARPU_SIMGRID_TASK_SUBMIT_COST, \ref STARPU_SIMGRID_FETCHING_INPUT_COST and \ref STARPU_SIMGRID_SCHED_COST environment variables. \section SimulationMPIApplications MPI Applications StarPU-MPI applications can also be run in SimGrid mode. smpi currently requires that StarPU be build statically only, so --disable-shared needs to be passed to ./configure. The application needs to be compiled with \c 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 \c cluster.xml is a SimGrid-MPI platform description, and \c 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. So as to use FxT traces, libfxt also needs to be built statically, and with dynamic linking flags, i.e. with \verbatim CFLAGS=-fPIC ./configure --enable-static \endverbatim \section SimulationDebuggingApplications Debugging Applications By default, SimGrid uses its own implementation of threads, which prevents \c 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 \c gdb will be able to manipulate as usual. It is also worth noting SimGrid 3.21's new parameter --cfg=simix/breakpoint which allows to put a breakpoint at a precise (deterministic!) timing of the execution. If for instance in an execution trace we see that something odd is happening at time 19000ms, we can use --cfg=simix/breakpoint:19.000 and \c SIGTRAP will be raised at that point, which will thus interrupt execution within \c gdb, allowing to inspect e.g. scheduler state, etc. \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.3.9+dfsg/doc/doxygen/chapters/480_openmp_runtime_support.doxy000066400000000000000000000402771413463044200261640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 OMPImplementation Implementation Details and Specificities \subsection OMPMainThread 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 OMPTaskSemantics 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 OMPConfiguration Configuration The SORS can be compiled into libstarpu through the \c 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 OMPInitExit 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 OMPSharing 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 \c 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 OMPTask 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 OMPTaskExplicit 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 OMPDataDependencies Data Dependencies The SORS implements inter-tasks data dependencies as specified in OpenMP 4.0. Data dependencies are expressed using regular StarPU data handles (\ref 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 OMPTaskSyncs 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 OMPSynchronization Synchronization Support The SORS implements objects and method to build common OpenMP synchronization constructs. \subsection OMPSimpleLock 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 OMPNestableLock 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 OMPCritical Critical Sections The SORS implements support for OpenMP critical sections through the family of \ref 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 OMPBarrier 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.3.9+dfsg/doc/doxygen/chapters/490_clustering_a_machine.doxy000066400000000000000000000244021413463044200254630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page ClusteringAMachine Clustering A Machine \section ClusteringGeneralIdeas General Ideas Clusters are a concept introduced in this paper. The granularity problem is tackled by using resource aggregation: instead of dynamically splitting tasks, resources are aggregated to process coarse grain tasks in a parallel fashion. This is built on top of scheduling contexts to be able to handle any type of parallel tasks. This comes from a basic idea, making use of two levels of parallelism in a DAG. We keep the DAG parallelism but consider on top of it that a task can contain internal parallelism. A good example is if each task in the DAG is OpenMP enabled. The particularity of such tasks is that we will combine the power of two runtime systems: StarPU will manage the DAG parallelism and another runtime (e.g. OpenMP) will manage the internal parallelism. The challenge is in creating an interface between the two runtime systems so that StarPU can regroup cores inside a machine (creating what we call a \b cluster) on top of which the parallel tasks (e.g. OpenMP tasks) will be run in a contained fashion. The aim of the cluster API is to facilitate this process in an automatic fashion. For this purpose, we depend on the \c hwloc tool to detect the machine configuration and then partition it into usable clusters.
An example of code running on clusters is available in examples/sched_ctx/parallel_tasks_with_cluster_api.c.
Let's first look at how to create a cluster. To enable clusters in StarPU, one needs to set the configure option \ref enable-cluster "--enable-cluster". \section CreatingClusters Creating Clusters Partitioning a machine into clusters with the cluster API is fairly straightforward. The simplest way is to state under which machine topology level we wish to regroup all resources. This level is an \c hwloc object, of the type hwloc_obj_type_t. More information can be found in the hwloc documentation. Once a cluster is created, the full machine is represented with an opaque structure starpu_cluster_machine. This can be printed to show the current machine state. \code{.c} struct starpu_cluster_machine *clusters; clusters = starpu_cluster_machine(HWLOC_OBJ_SOCKET, 0); starpu_cluster_print(clusters); /* submit some tasks with OpenMP computations */ starpu_uncluster_machine(clusters); /* we are back in the default StarPU state */ \endcode The following graphic is an example of what a particular machine can look like once clusterized. The main difference is that we have less worker queues and tasks which will be executed on several resources at once. The execution of these tasks will be left to the internal runtime system, represented with a dashed box around the resources. \image latex runtime-par.eps "StarPU using parallel tasks" width=0.5\textwidth \image html runtime-par.png "StarPU using parallel tasks" Creating clusters as shown in the example above will create workers able to execute OpenMP code by default. The cluster creation function starpu_cluster_machine() takes optional parameters after the \c hwloc object (always terminated by the value \c 0) which allow to parametrize the cluster creation. These parameters can help creating clusters of a type different from OpenMP, or create a more precise partition of the machine. This is explained in Section \ref CreatingCustomClusters. \section ExampleOfConstrainingOpenMP Example Of Constraining OpenMP Clusters require being able to constrain the runtime managing the internal task parallelism (internal runtime) to the resources set by StarPU. The purpose of this is to express how StarPU must communicate with the internal runtime to achieve the required cooperation. In the case of OpenMP, StarPU will provide an awake thread from the cluster to execute this liaison. It will then provide on demand the process ids of the other resources supposed to be in the region. Finally, thanks to an OpenMP region we can create the required number of threads and bind each of them on the correct region. These will then be reused each time we encounter a \#pragma omp parallel in the following computations of our program. The following graphic is an example of what an OpenMP-type cluster looks like and how it represented in StarPU. We can see that one StarPU (black) thread is awake, and we need to create on the other resources the OpenMP threads (in pink). \image latex parallel_worker2.eps "StarPU with an OpenMP cluster" width=0.3\textwidth \image html parallel_worker2.png "StarPU with an OpenMP cluster" Finally, the following code shows how to force OpenMP to cooperate with StarPU and create the aforementioned OpenMP threads constrained in the cluster's resources set: \code{.c} void starpu_openmp_prologue(void * sched_ctx_id) { int sched_ctx = *(int*)sched_ctx_id; int *cpuids = NULL; int ncpuids = 0; int workerid = starpu_worker_get_id(); //we can target only CPU workers if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) { //grab all the ids inside the cluster starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); //set the number of threads omp_set_num_threads(ncpuids); #pragma omp parallel { //bind each threads to its respective resource starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); } free(cpuids); } return; } \endcode This function is the default function used when calling starpu_cluster_machine() without extra parameter. Cluster are based on several tools and models already available within StarPU contexts, and merely extend contexts. More on contexts can be read in Section \ref SchedulingContexts. \section CreatingCustomClusters Creating Custom Clusters Clusters can be created either with the predefined types provided within StarPU, or with user-defined functions to bind another runtime inside StarPU. The predefined cluster types provided by StarPU are ::STARPU_CLUSTER_OPENMP, ::STARPU_CLUSTER_INTEL_OPENMP_MKL and ::STARPU_CLUSTER_GNU_OPENMP_MKL. The last one is only provided if StarPU is compiled with the \c MKL library. It uses MKL functions to set the number of threads which is more reliable when using an OpenMP implementation different from the Intel one. The cluster type is set when calling the function starpu_cluster_machine() with the parameter ::STARPU_CLUSTER_TYPE as in the example below, which is creating a \c MKL cluster. \code{.c} struct starpu_cluster_machine *clusters; clusters = starpu_cluster_machine(HWLOC_OBJ_SOCKET, STARPU_CLUSTER_TYPE, STARPU_CLUSTER_GNU_OPENMP_MKL, 0); \endcode Using the default type ::STARPU_CLUSTER_OPENMP is similar to calling starpu_cluster_machine() without any extra parameter.
Users can also define their own function. \code{.c} void foo_func(void* foo_arg); int foo_arg = 0; struct starpu_cluster_machine *clusters; clusters = starpu_cluster_machine(HWLOC_OBJ_SOCKET, STARPU_CLUSTER_CREATE_FUNC, &foo_func, STARPU_CLUSTER_CREATE_FUNC_ARG, &foo_arg, 0); \endcode Parameters that can be given to starpu_cluster_machine() are ::STARPU_CLUSTER_MIN_NB, ::STARPU_CLUSTER_MAX_NB, ::STARPU_CLUSTER_NB, ::STARPU_CLUSTER_POLICY_NAME, ::STARPU_CLUSTER_POLICY_STRUCT, ::STARPU_CLUSTER_KEEP_HOMOGENEOUS, ::STARPU_CLUSTER_PREFERE_MIN, ::STARPU_CLUSTER_CREATE_FUNC, ::STARPU_CLUSTER_CREATE_FUNC_ARG, ::STARPU_CLUSTER_TYPE, ::STARPU_CLUSTER_AWAKE_WORKERS, ::STARPU_CLUSTER_PARTITION_ONE, ::STARPU_CLUSTER_NEW and ::STARPU_CLUSTER_NCORES. \section ClustersWithSchedulingContextsAPI Clusters With Scheduling As previously mentioned, the cluster API is implemented on top of \ref SchedulingContexts. Its main addition is to ease the creation of a machine CPU partition with no overlapping by using \c hwloc, whereas scheduling contexts can use any number of any type of resources. It is therefore possible, but not recommended, to create clusters using the scheduling contexts API. This can be useful mostly in the most complex machine configurations where users have to dimension precisely clusters by hand using their own algorithm. \code{.c} /* the list of resources the context will manage */ int workerids[3] = {1, 3, 10}; /* indicate the list of workers assigned to it, the number of workers, the name of the context and the scheduling policy to be used within the context */ int id_ctx = starpu_sched_ctx_create(workerids, 3, "my_ctx", 0); /* let StarPU know that the following tasks will be submitted to this context */ starpu_sched_ctx_set_task_context(id); task->prologue_callback_pop_func=&runtime_interface_function_here; /* submit the task to StarPU */ starpu_task_submit(task); \endcode As this example illustrates, creating a context without scheduling policy will create a cluster. The interface function between StarPU and the other runtime must be specified through the field starpu_task::prologue_callback_pop_func. Such a function can be similar to the OpenMP thread team creation one (see above).
Note that the OpenMP mode is the default mode both for clusters and contexts. The result of a cluster creation is a woken-up master worker and sleeping "slaves" which allow the master to run tasks on their resources. To create a cluster with woken-up workers, the flag ::STARPU_SCHED_CTX_AWAKE_WORKERS must be set when using the scheduling context API function starpu_sched_ctx_create(), or the flag ::STARPU_CLUSTER_AWAKE_WORKERS must be set when using the cluster API function starpu_cluster_machine(). */ starpu-1.3.9+dfsg/doc/doxygen/chapters/495_interoperability.doxy000066400000000000000000000140361413463044200247140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page InteroperabilitySupport Interoperability Support In situations where multiple parallel software elements have to coexist within the same application, uncoordinated accesses to computing units may lead such parallel software elements to collide and interfere. The purpose of the Interoperability routines of StarPU, implemented along the definition of the Resource Management APIs of Project H2020 INTERTWinE, is to enable StarPU to coexist with other parallel software elements without resulting in computing core oversubscription or undersubscription. These routines allow the programmer to dynamically control the computing resources allocated to StarPU, to add or remove processor cores and/or accelerator devices from the pool of resources used by StarPU's workers to execute tasks. They also allow multiple libraries and applicative codes using StarPU simultaneously to select distinct sets of resources independently. Internally, the Interoperability Support is built on top of Scheduling Contexts (see \ref SchedulingContexts). \section ResourceManagement StarPU Resource Management The \c starpurm module is a library built on top of the \c starpu library. It exposes a series of routines prefixed with \c starpurm_ defining the resource management API. All functions are defined in \ref API_Interop_Support. \subsection Build Linking a program with the starpurm module The \c starpurm module must be linked explicitly with the applicative executable using it. Example Makefiles in the starpurm/dev/ subdirectories show how to do so. If the \c pkg-config command is available and the \c PKG_CONFIG_PATH environment variable is properly positioned, the proper settings may be obtained with the following \c Makefile snippet: \code{Makefile} CFLAGS += $(shell pkg-config --cflags starpurm-1.3) LDFLAGS+= $(shell pkg-config --libs-only-L starpurm-1.3) LDLIBS += $(shell pkg-config --libs-only-l starpurm-1.3) \endcode \subsection InitExit Initialization and Shutdown The \c starpurm module is initialized with a call to starpurm_initialize() and must be finalized with a call to starpurm_shutdown(). The \c starpurm module supports CPU cores as well as devices. An integer ID is assigned to each supported device type. The ID assigned to a given device type can be queried with the starpurm_get_device_type_id() routine, which currently expects one of the following strings as argument and returns the corresponding ID:
  • "cpu"
  • "opencl"
  • "cuda"
  • "mic"
The \c cpu pseudo device type is defined for convenience and designates CPU cores. The number of units of each type available for computation can be obtained with a call to starpu_get_nb_devices_by_type(). Each CPU core unit available for computation is designated by its rank among the StarPU CPU worker threads and by its own CPUSET bit. Each non-CPU device unit can be designated both by its rank number in the type, and by the CPUSET bit corresponding to its StarPU device worker thread. The CPUSET of a computing unit or its associated worker can be obtained from its type ID and rank with starpurm_get_device_worker_cpuset(), which returns the corresponding HWLOC CPUSET. \subsection DefCTX Default Context The \c starpurm module assumes a default, global context, manipulated through a series of routines allowing to assign and withdraw computing units from the main StarPU context. Assigning CPU cores can be done with starpurm_assign_cpu_to_starpu() and starpurm_assign_cpu_mask_to_starpu(), and assigning device units can be done with starpurm_assign_device_to_starpu() and starpurm_assign_device_mask_to_starpu(). Conversely, withdrawing CPU cores can be done with starpurm_withdraw_cpu_from_starpu() and starpurm_withdraw_cpu_mask_from_starpu(=, and withdrawing device units can be done with starpurm_withdraw_device_from_starpu() and starpurm_withdraw_device_mask_from_starpu(). These routine should typically be used to control resource usage for the main applicative code. \subsection TmpCTXS Temporary Contexts Besides the default, global context, \c starpurm can create temporary contexts and launch the computation of kernels confined to these temporary contexts. The routine starpurm_spawn_kernel_on_cpus() can be used to do so: it allocates a temporary context and spawns a kernel within this context. The temporary context is subsequently freed upon completion of the kernel. The temporary context is set as the default context for the kernel throughout its lifespan. This routine should typically be used to control resource usage for a parallel kernel handled by an external library built on StarPU. Internally, it relies on the use of starpu_sched_ctx_set_context() to set the temporary context as default context for the parallel kernel, and then restore the main context upon completion. Note: the maximum number of temporary contexts allocated concurrently at any time should not exceed ::STARPU_NMAX_SCHED_CTXS-2, otherwise, the call to starpurm_spawn_kernel_on_cpus() may block until a temporary context becomes available. The routine starpurm_spawn_kernel_on_cpus() returns upon the completion of the parallel kernel. An asynchronous variant is available with the routine starpurm_spawn_kernel_on_cpus_callback(). This variant returns immediately, however it accepts a callback function, which is subsequently called to notify the calling code about the completion of the parallel kernel. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/501_environment_variables.doxy000066400000000000000000001473541413463044200257210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 EnvConfiguringWorkers 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_RESERVE_NCPU
\anchor STARPU_RESERVE_NCPU \addindex __env__STARPU_RESERVE_NCPU Specify the number of CPU cores that should not be used by StarPU, so the application can use starpu_get_next_bindid() and starpu_bind_thread_on() to bind its own threads. This option is ignored if \ref STARPU_NCPU or starpu_conf::ncpus is set.
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, i.e. the number of CUDA streams. The default value is 1.
STARPU_CUDA_THREAD_PER_WORKER
\anchor STARPU_CUDA_THREAD_PER_WORKER \addindex __env__STARPU_CUDA_THREAD_PER_WORKER Specify whether the cuda driver should use one thread per stream (1) or to use a single thread to drive all the streams of the device or all devices (0), and \ref STARPU_CUDA_THREAD_PER_DEV determines whether is it one thread per device or one thread for all devices. The default value is 0. Setting it to 1 is contradictory with setting \ref STARPU_CUDA_THREAD_PER_DEV.
STARPU_CUDA_THREAD_PER_DEV
\anchor STARPU_CUDA_THREAD_PER_DEV \addindex __env__STARPU_CUDA_THREAD_PER_DEV Specify whether the cuda driver should use one thread per device (1) or to use a single thread to drive all the devices (0). The default value is 1. It does not make sense to set this variable if \ref STARPU_CUDA_THREAD_PER_WORKER is set to to 1 (since \ref STARPU_CUDA_THREAD_PER_DEV is then meaningless).
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_NMPI_MS
\anchor STARPU_NMPI_MS \addindex __env__STARPU_NMPI_MS MPI Master Slave equivalent of the environment variable \ref STARPU_NCUDA, i.e. the number of MPI Master Slave devices to use.
STARPU_NMPIMSTHREADS
\anchor STARPU_NMPIMSTHREADS \addindex __env__STARPU_NMPIMSTHREADS Number of threads to use on the MPI Slave devices.
STARPU_MPI_MASTER_NODE
\anchor STARPU_MPI_MASTER_NODE \addindex __env__STARPU_MPI_MASTER_NODE This variable allows to chose which MPI node (with the MPI ID) will be the master.
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_GETBIND
\anchor STARPU_WORKERS_GETBIND \addindex __env__STARPU_WORKERS_GETBIND Setting it to non-zero makes StarPU use the OS-provided CPU binding to determine how many and which CPU cores it should use. This is notably useful when running several StarPU-MPI processes on the same host, to let the MPI launcher set the CPUs to be used.
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_COREID
\anchor STARPU_WORKERS_COREID \addindex __env__STARPU_WORKERS_COREID Same as \ref STARPU_WORKERS_CPUID, but bind the workers to cores instead of PUs (hyperthreads).
STARPU_MAIN_THREAD_BIND
\anchor STARPU_MAIN_THREAD_BIND \addindex __env__STARPU_MAIN_THREAD_BIND When defined, this make StarPU bind the thread that calls starpu_initialize() to a reserved CPU, subtracted from the CPU workers.
STARPU_MAIN_THREAD_CPUID
\anchor STARPU_MAIN_THREAD_CPUID \addindex __env__STARPU_MAIN_THREAD_CPUID When defined, this make StarPU bind the thread that calls starpu_initialize() to the given CPU ID.
STARPU_MAIN_THREAD_COREID
\anchor STARPU_MAIN_THREAD_COREID \addindex __env__STARPU_MAIN_THREAD_COREID Same as \ref STARPU_MAIN_THREAD_CPUID, but bind the thread that calls starpu_initialize() to the given core, instead of the PU (hyperthread).
STARPU_MPI_THREAD_CPUID
\anchor STARPU_MPI_THREAD_CPUID \addindex __env__STARPU_MPI_THREAD_CPUID When defined, this make StarPU bind its MPI thread to the given CPU ID. Setting it to -1 (the default value) will use a reserved CPU, subtracted from the CPU workers.
STARPU_MPI_THREAD_COREID
\anchor STARPU_MPI_THREAD_COREID \addindex __env__STARPU_MPI_THREAD_COREID Same as \ref STARPU_MPI_THREAD_CPUID, but bind the MPI thread to the given core ID, instead of the PU (hyperthread).
STARPU_MPI_NOBIND
\anchor STARPU_MPI_NOBIND \addindex __env__STARPU_MPI_NOBIND Setting it to non-zero will prevent StarPU from binding the MPI to a separate core. This is for instance useful when running the testsuite on a single system.
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_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_DISABLE_ASYNCHRONOUS_MPI_MS_COPY
\anchor STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY \addindex __env__STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY Disable asynchronous copies between CPU and MPI Slave 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_BACKOFF_MIN
\anchor STARPU_BACKOFF_MIN \addindex __env__STARPU_BACKOFF_MIN Set minimum exponential backoff of number of cycles to pause when spinning. Default value is 1.
STARPU_BACKOFF_MAX
\anchor STARPU_BACKOFF_MAX \addindex __env__STARPU_BACKOFF_MAX Set maximum exponential backoff of number of cycles to pause when spinning. Default value is 32.
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 Define 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 Indicate 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_SCHED_READY
\anchor STARPU_SCHED_READY \addindex __env__STARPU_SCHED_READY For a modular scheduler with sorted queues below the decision component, workers pick up a task which has most of its data already available. Setting this to 0 disables this.
STARPU_SCHED_SORTED_ABOVE
\anchor STARPU_SCHED_SORTED_ABOVE \addindex __env__STARPU_SCHED_SORTED_ABOVE For a modular scheduler with queues above the decision component, it is usually sorted by priority. Setting this to 0 disables this.
STARPU_SCHED_SORTED_BELOW
\anchor STARPU_SCHED_SORTED_BELOW \addindex __env__STARPU_SCHED_SORTED_BELOW For a modular scheduler with queues below the decision component, they are usually sorted by priority. Setting this to 0 disables this.
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 MPIDebug) 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_PRIORITIES
\anchor STARPU_MPI_PRIORITIES \addindex __env__STARPU_MPI_PRIORITIES When set to 0, the use of priorities to order MPI communications is disabled (\ref MPISupport).
STARPU_MPI_NDETACHED_SEND
\anchor STARPU_MPI_NDETACHED_SEND \addindex __env__STARPU_MPI_NDETACHED_SEND This sets the number of send requests that StarPU-MPI will emit concurrently. The default is 10.
STARPU_MPI_NREADY_PROCESS
\anchor STARPU_MPI_NREADY_PROCESS \addindex __env__STARPU_MPI_NREADY_PROCESS This sets the number of requests that StarPU-MPI will submit to MPI before polling for termination of existing requests. The default is 10.
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_MPI_DRIVER_CALL_FREQUENCY
\anchor STARPU_MPI_DRIVER_CALL_FREQUENCY \addindex __env__STARPU_MPI_DRIVER_CALL_FREQUENCY When set to a positive value, activates the interleaving of the execution of tasks with the progression of MPI communications (\ref MPISupport). The starpu_mpi_init_conf() function must have been called by the application for that environment variable to be used. When set to 0, the MPI progression thread does not use at all the driver given by the user, and only focuses on making MPI communications progress.
STARPU_MPI_DRIVER_TASK_FREQUENCY
\anchor STARPU_MPI_DRIVER_TASK_FREQUENCY \addindex __env__STARPU_MPI_DRIVER_TASK_FREQUENCY When set to a positive value, the interleaving of the execution of tasks with the progression of MPI communications mechanism to execute several tasks before checking communication requests again (\ref MPISupport). The starpu_mpi_init_conf() function must have been called by the application for that environment variable to be used, and the STARPU_MPI_DRIVER_CALL_FREQUENCY environment variable set to a positive value.
STARPU_SIMGRID
\anchor STARPU_SIMGRID \addindex __env__STARPU_SIMGRID When set to 1 (the default is 0), this makes StarPU check that it was really build with simulation support. This is convenient in scripts to avoid using a native version, that would try to update performance models...
STARPU_SIMGRID_TRANSFER_COST
\anchor STARPU_SIMGRID_TRANSFER_COST \addindex __env__STARPU_SIMGRID_TRANSFER_COST When set to 1 (which is the default), data transfers (over PCI bus, typically) are taken into account in SimGrid mode.
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 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 Define 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.
STARPU_SIMGRID_TASK_SUBMIT_COST
\anchor STARPU_SIMGRID_TASK_SUBMIT_COST \addindex __env__STARPU_SIMGRID_TASK_SUBMIT_COST When set to 1 (which is the default), task submission costs are taken into account in SimGrid mode. This provides more accurate SimGrid predictions, especially for the beginning of the execution.
STARPU_SIMGRID_FETCHING_INPUT_COST
\anchor STARPU_SIMGRID_FETCHING_INPUT_COST \addindex __env__STARPU_SIMGRID_FETCHING_INPUT_COST When set to 1 (which is the default), fetching input costs are taken into account in SimGrid mode. This provides more accurate SimGrid predictions, especially regarding data transfers.
STARPU_SIMGRID_SCHED_COST
\anchor STARPU_SIMGRID_SCHED_COST \addindex __env__STARPU_SIMGRID_SCHED_COST When set to 1 (0 is the default), scheduling costs are taken into account in SimGrid mode. This provides more accurate SimGrid predictions, and allows studying scheduling overhead of the runtime system. However, it also makes simulation non-deterministic.
STARPU_SINK
\anchor STARPU_SINK \addindex __env__STARPU_SINK Variable defined by StarPU when running MPI Xeon PHI on the sink.
\section MiscellaneousAndDebug Miscellaneous And Debug
STARPU_HOME
\anchor STARPU_HOME \addindex __env__STARPU_HOME Specify 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. Specify 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 Specify 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_MPI_MS
\anchor STARPU_PERF_MODEL_HOMOGENEOUS_MPI_MS \addindex __env__STARPU_PERF_MODEL_HOMOGENEOUS_MPI_MS When this is set to 1, StarPU will assume that all MPI Slave 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 MPI Slaves.
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 Specify 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 Allow to disable verbose mode at runtime when StarPU has been configured with the option \ref enable-verbose "--enable-verbose". Also disable the display of StarPU information and warning messages.
STARPU_MPI_DEBUG_LEVEL_MIN
\anchor STARPU_MPI_DEBUG_LEVEL_MIN \addindex __env__STARPU_MPI_DEBUG_LEVEL_MIN Set the minimum level of debug when StarPU has been configured with the option \ref enable-mpi-verbose "--enable-mpi-verbose".
STARPU_MPI_DEBUG_LEVEL_MAX
\anchor STARPU_MPI_DEBUG_LEVEL_MAX \addindex __env__STARPU_MPI_DEBUG_LEVEL_MAX Set the maximum level of debug when StarPU has been configured with the option \ref enable-mpi-verbose "--enable-mpi-verbose".
STARPU_LOGFILENAME
\anchor STARPU_LOGFILENAME \addindex __env__STARPU_LOGFILENAME Specify in which file the debugging output should be saved to.
STARPU_FXT_PREFIX
\anchor STARPU_FXT_PREFIX \addindex __env__STARPU_FXT_PREFIX Specify in which directory to save the generated trace if FxT is enabled.
STARPU_FXT_SUFFIX
\anchor STARPU_FXT_SUFFIX \addindex __env__STARPU_FXT_SUFFIX Specify in which file to save the generated trace if FxT is enabled.
STARPU_FXT_TRACE
\anchor STARPU_FXT_TRACE \addindex __env__STARPU_FXT_TRACE Specify whether to generate (1) or not (0) the FxT trace in /tmp/prof_file_XXX_YYY (the directory and file name can be changed with \ref STARPU_FXT_PREFIX and \ref STARPU_FXT_SUFFIX). The default is 1 (generate it)
STARPU_LIMIT_CUDA_devid_MEM
\anchor STARPU_LIMIT_CUDA_devid_MEM \addindex __env__STARPU_LIMIT_CUDA_devid_MEM Specify 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 Specify 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 Specify 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 Specify 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 Specify 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_LIMIT_CPU_NUMA_devid_MEM
\anchor STARPU_LIMIT_CPU_NUMA_devid_MEM \addindex __env__STARPU_LIMIT_CPU_NUMA_devid_MEM Specify the maximum number of megabytes that should be available to the application on the NUMA node with the OS identifier devid. Setting it overrides the value of STARPU_LIMIT_CPU_MEM.
STARPU_LIMIT_CPU_NUMA_MEM
\anchor STARPU_LIMIT_CPU_NUMA_MEM \addindex __env__STARPU_LIMIT_CPU_NUMA_MEM Specify the maximum number of megabytes that should be available to the application on each NUMA node. This is the same as specifying that same amount with \ref STARPU_LIMIT_CPU_NUMA_devid_MEM for each NUMA node number. The total memory available to StarPU will thus be this amount multiplied by the number of NUMA nodes used by StarPU. Any \ref STARPU_LIMIT_CPU_NUMA_devid_MEM additionally specified will take over STARPU_LIMIT_CPU_NUMA_MEM.
STARPU_LIMIT_BANDWIDTH
\anchor STARPU_LIMIT_BANDWIDTH \addindex __env__STARPU_LIMIT_BANDWIDTH Specify the maximum available PCI bandwidth of the system in MB/s. This can only be effective with simgrid simulation. This allows to easily override the bandwidths stored in the platform file generated from measurements on the native system. This can be used e.g. for convenient Specify the maximum number of megabytes that should be available to the application on each NUMA node. This is the same as specifying that same amount with \ref STARPU_LIMIT_CPU_NUMA_devid_MEM for each NUMA node number. The total memory available to StarPU will thus be this amount multiplied by the number of NUMA nodes used by StarPU. Any \ref STARPU_LIMIT_CPU_NUMA_devid_MEM additionally specified will take over STARPU_LIMIT_BANDWIDTH.
STARPU_MINIMUM_AVAILABLE_MEM
\anchor STARPU_MINIMUM_AVAILABLE_MEM \addindex __env__STARPU_MINIMUM_AVAILABLE_MEM Specify 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 0%.
STARPU_TARGET_AVAILABLE_MEM
\anchor STARPU_TARGET_AVAILABLE_MEM \addindex __env__STARPU_TARGET_AVAILABLE_MEM Specify 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 0%.
STARPU_MINIMUM_CLEAN_BUFFERS
\anchor STARPU_MINIMUM_CLEAN_BUFFERS \addindex __env__STARPU_MINIMUM_CLEAN_BUFFERS Specify 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 5%.
STARPU_TARGET_CLEAN_BUFFERS
\anchor STARPU_TARGET_CLEAN_BUFFERS \addindex __env__STARPU_TARGET_CLEAN_BUFFERS Specify 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 10%.
STARPU_DIDUSE_BARRIER
\anchor STARPU_DIDUSE_BARRIER \addindex __env__STARPU_DIDUSE_BARRIER When set to 1, StarPU will never evict a piece of data if it has not been used by at least one task. This avoids odd behaviors under high memory pressure, but can lead to deadlocks, so is to be considered experimental only.
STARPU_DISK_SWAP
\anchor STARPU_DISK_SWAP \addindex __env__STARPU_DISK_SWAP Specify 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 Specify the 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), leveldb (i.e. using a leveldb database), and hdf5 (i.e. using HDF5 library).
STARPU_DISK_SWAP_SIZE
\anchor STARPU_DISK_SWAP_SIZE \addindex __env__STARPU_DISK_SWAP_SIZE Specify the 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 Allow users 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 Allow users 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 Set 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, indicate that StarPU should automatically generate a Paje trace when starpu_shutdown() is called.
STARPU_GENERATE_TRACE_OPTIONS
\anchor STARPU_GENERATE_TRACE_OPTIONS \addindex __env__STARPU_GENERATE_TRACE_OPTIONS When the variable \ref STARPU_GENERATE_TRACE is set to 1 to generate a Paje trace, this variable can be set to specify options (see starpu_fxt_tool --help).
STARPU_ENABLE_STATS
\anchor STARPU_ENABLE_STATS \addindex __env__STARPU_ENABLE_STATS When defined, enable gathering various data statistics (\ref DataStatistics).
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). By default, statistics are printed on the standard error stream, use the environement variable \ref STARPU_BUS_STATS_FILE to define another filename.
STARPU_BUS_STATS_FILE
\anchor STARPU_BUS_STATS_FILE \addindex __env__STARPU_BUS_STATS_FILE Define the name of the file where to display data transfers statistics, see \ref STARPU_BUS_STATS.
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). By default, statistics are printed on the standard error stream, use the environement variable \ref STARPU_WORKER_STATS_FILE to define another filename.
STARPU_WORKER_STATS_FILE
\anchor STARPU_WORKER_STATS_FILE \addindex __env__STARPU_WORKER_STATS_FILE Define the name of the file where to display workers statistics, see \ref STARPU_WORKER_STATS.
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, trigger 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 Delay 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_PROGRESS
\anchor STARPU_TASK_PROGRESS \addindex __env__STARPU_TASK_PROGRESS Print the progression of tasks. This is convenient to determine whether a program is making progress in task execution, or is just stuck.
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).
STARPU_USE_NUMA
\anchor STARPU_USE_NUMA \addindex __env__STARPU_USE_NUMA When defined, NUMA nodes are taking into account by StarPU. Otherwise, memory is considered as only one node. This is experimental for now. When enabled, STARPU_MAIN_MEMORY is a pointer to the NUMA node associated to the first CPU worker if it exists, the NUMA node associated to the first GPU discovered otherwise. If StarPU doesn't find any NUMA node after these step, STARPU_MAIN_MEMORY is the first NUMA node discovered by StarPU.
STARPU_IDLE_FILE
\anchor STARPU_IDLE_FILE \addindex __env__STARPU_IDLE_FILE If the environment variable STARPU_IDLE_FILE is defined, a file named after its contents will be created at the end of the execution. The file will contain the sum of the idle times of all the workers.
STARPU_HWLOC_INPUT
\anchor STARPU_HWLOC_INPUT \addindex __env__STARPU_HWLOC_INPUT If the environment variable STARPU_HWLOC_INPUT is defined to the path of an XML file, hwloc will be made to use it as input instead of detecting the current platform topology, which can save significant initialization time. To produce this XML file, use lstopo file.xml
STARPU_CATCH_SIGNALS
\anchor STARPU_CATCH_SIGNALS \addindex __env__STARPU_CATCH_SIGNALS By default, StarPU catch signals SIGINT, SIGSEGV and SIGTRAP to perform final actions such as dumping FxT trace files even though the application has crashed. Setting this variable to a value other than 1 will disable this behaviour. This should be done on JVM systems which may use these signals for their own needs. The flag can also be set through the field starpu_conf::catch_signals.
STARPU_DISPLAY_BINDINGS
\anchor STARPU_DISPLAY_BINDINGS \addindex __env__STARPU_DISPLAY_BINDINGS Display the binding of all processes and threads running on the machine. If MPI is enabled, display the binding of each node.
Users can manually display the binding by calling starpu_display_bindings().
\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.3.9+dfsg/doc/doxygen/chapters/510_configure_options.doxy000066400000000000000000000534521413463044200250540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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-prefix \addindex __configure__--with-hwloc-prefix 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).
--enable-build-doc-pdf
\anchor enable-build-doc-pdf \addindex __configure__--enable-build-doc-pdf By default, ontly the HTML documentation is generated. Use this option to also enable the generation of the PDF documentation. This should be done on a machine which does have the tools doxygen and latex (plus the packages latex-xcolor and texlive-latex-extra).
--disable-icc
\anchor disable-icc \addindex __configure__--disable-icc Disable the usage of the ICC compiler. When found, some specific ICC examples are compiled.
--with-check-flags
\anchor with-check-flags \addindex __configure__--with-check-flags Specify flags which will be given to C, CXX and Fortran compilers when valid
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.
--enable-worker-callbacks
\anchor enable-worker-callbacks \addindex __configure__--enable-worker-callbacks If blocking drivers are enabled, enable callbacks to notify an external resource manager about workers going to sleep and waking up.
--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.
--enable-maxnumanodes=count
\anchor enable-maxnumanodes \addindex __configure__--enable-maxnumanodes Use at most count NUMA nodes. This information is then available as the macro ::STARPU_MAXNUMANODES.
--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 the 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.
--disable-asynchronous-mpi-master-slave-copy
\anchor disable-asynchronous-mpi-master-slave-copy \addindex __configure__--disable-asynchronous-mpi-master-slave-copy Disable asynchronous copies between CPU and MPI Slave 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
--disable-mpi
\anchor disable-mpi \addindex __configure__--disable-mpi Disable the build of libstarpumpi. By default, it is enabled when MPI is found.
--enable-mpi
\anchor enable-mpi \addindex __configure__--enable-mpi Enable the build of libstarpumpi. This is necessary when using Simgrid+MPI.
--with-mpicc=path
\anchor with-mpicc \addindex __configure__--with-mpicc Use the compiler mpicc at path, for StarPU-MPI. (\ref MPISupport).
--enable-mpi-pedantic-isend
\anchor enable-mpi-pedantic-isend \addindex __configure__--enable-mpi-pedantic-isend Before performing any MPI communication, StarPU-MPI waits for the data to be available in the main memory of the node submitting the request. For send communications, data is acquired with the mode ::STARPU_R. When enabling the pedantic mode, data are instead acquired with the ::STARPU_RW which thus ensures that there is not more than 1 concurrent MPI_Isend calls accessing the data and StarPU does not read from it from tasks during the communication.
--enable-mpi-master-slave
\anchor enable-mpi-master-slave \addindex __configure__--enable-mpi-master-slave Enable the MPI Master-Slave support. By default, it is disabled.
--with-mpi-master-slave-multiple-thread
\anchor with-mpi-master-slave-multiple-thread \addindex __configure__--with-mpi-master-slave-multiple-thread Create one thread per MPI Slave on the MPI master to manage communications.
--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
--enable-nmad
\anchor enable-nmad \addindex __configure__--enable-nmad Enable the NewMadeleine implementation for StarPU-MPI. See \ref Nmad for more details.
--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.
--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)
--enable-cluster
\anchor enable-cluster \addindex __configure__--enable-cluster Enable cluster Support (\ref ClusteringAMachine)
\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. This is however extremely heavy and should only be enabled when debugging insides of StarPU.
--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 - openblas: use OpenBLAS 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
--enable-hdf5
\anchor enable-hdf5 \addindex __configure__--enable-hdf5 Enable building HDF5 support.
--with-hdf5-include-dir=path
\anchor with-hdf5-include-dir \addindex __configure__--with-hdf5-include-dir Specify the directory where is stored the header hdf5.h.
--with-hdf5-lib-dir=path
\anchor with-hdf5-lib-dir \addindex __configure__--with-hdf5-lib-dir Specify the directory where is stored the hdf5 library.
--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.
--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-simgrid-mc
\anchor enable-simgrid-mc \addindex __configure__--enable-simgrid-mc Enable the Model Checker in simulation of execution in SimGrid, to allow exploring various execution paths.
--enable-calibration-heuristic
\anchor enable-calibration-heuristic \addindex __configure__--enable-calibration-heuristic Allow 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.
--enable-mlr
\anchor enable-mlr \addindex __configure__--enable-mlr Allow to enable multiple linear regression models (see \ref PerformanceModelExample)
--enable-mlr-system-blas
\anchor enable-mlr-system-blas \addindex __configure__--enable-mlr-system-blas Allow to make multiple linear regression models use the system-provided BLAS for dgels (see \ref PerformanceModelExample)
*/ starpu-1.3.9+dfsg/doc/doxygen/chapters/520_files.doxy000066400000000000000000000037001413463044200224120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page Files Files \file starpu_config.h \file starpu.h \file starpu_bitmap.h \file starpu_bound.h \file starpu_clusters.h \file starpu_cublas.h \file starpu_cublas_v2.h \file starpu_cusparse.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_helper.h \file starpu_heteroprio.h \file starpu_mic.h \file starpu_mpi_ms.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_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_dep.h \file starpu_task_list.h \file starpu_task_util.h \file starpu_thread.h \file starpu_thread_util.h \file starpu_tree.h \file starpu_util.h \file starpu_worker.h \file starpu_mpi.h \file starpu_mpi_lb.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 \file starpurm.h */ starpu-1.3.9+dfsg/doc/doxygen/chapters/601_scaling_vector_example.doxy000066400000000000000000000027411413463044200260310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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.c 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.3.9+dfsg/doc/doxygen/chapters/610_fdl_1_3.doxy000066400000000000000000000567331413463044200225350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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.3.9+dfsg/doc/doxygen/chapters/api/000077500000000000000000000000001413463044200205665ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen/chapters/api/fft_support.doxy000066400000000000000000000060251413463044200240510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \defgroup API_FFT_Support FFT Support \def STARPUFFT_FORWARD \ingroup API_FFT_Support todo \def STARPUFFT_INVERSE \ingroup API_FFT_Support todo \fn void * starpufft_malloc(size_t n) \ingroup API_FFT_Support Allocate memory for \p n bytes. This is preferred over \c 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 Initialize 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 Initialize 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 Release data for plan \p p, in the starpufft_start() case. \fn void starpufft_destroy_plan(starpufft_plan p) \ingroup API_FFT_Support Destroy plan \p p, i.e. release all CPU (fftw) and GPU (cufft) resources. */ starpu-1.3.9+dfsg/doc/doxygen/chapters/api/threads.doxy000066400000000000000000000312101413463044200231220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \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 Call starpu_pthread_create_on() and abort on error. \def STARPU_PTHREAD_CREATE \ingroup API_Threads Call starpu_pthread_create() and abort on error. \def STARPU_PTHREAD_MUTEX_INIT \ingroup API_Threads Call starpu_pthread_mutex_init() and abort on error. \def STARPU_PTHREAD_MUTEX_DESTROY \ingroup API_Threads Call starpu_pthread_mutex_destroy() and abort on error. \def STARPU_PTHREAD_MUTEX_LOCK \ingroup API_Threads Call starpu_pthread_mutex_lock() and abort on error. \def STARPU_PTHREAD_MUTEX_UNLOCK \ingroup API_Threads Call starpu_pthread_mutex_unlock() and abort on error. \def STARPU_PTHREAD_KEY_CREATE \ingroup API_Threads Call starpu_pthread_key_create() and abort on error. \def STARPU_PTHREAD_KEY_DELETE \ingroup API_Threads Call starpu_pthread_key_delete() and abort on error. \def STARPU_PTHREAD_SETSPECIFIC \ingroup API_Threads Call starpu_pthread_setspecific() and abort on error. \def STARPU_PTHREAD_GETSPECIFIC \ingroup API_Threads Call starpu_pthread_getspecific() and abort on error. \def STARPU_PTHREAD_RWLOCK_INIT \ingroup API_Threads Call starpu_pthread_rwlock_init() and abort on error. \def STARPU_PTHREAD_RWLOCK_RDLOCK \ingroup API_Threads Call starpu_pthread_rwlock_rdlock() and abort on error. \def STARPU_PTHREAD_RWLOCK_WRLOCK \ingroup API_Threads Call starpu_pthread_rwlock_wrlock() and abort on error. \def STARPU_PTHREAD_RWLOCK_UNLOCK \ingroup API_Threads Call starpu_pthread_rwlock_unlock() and abort on error. \def STARPU_PTHREAD_RWLOCK_DESTROY \ingroup API_Threads Call starpu_pthread_rwlock_destroy() and abort on error. \def STARPU_PTHREAD_COND_INIT \ingroup API_Threads Call starpu_pthread_cond_init() and abort on error. \def STARPU_PTHREAD_COND_DESTROY \ingroup API_Threads Call starpu_pthread_cond_destroy() and abort on error. \def STARPU_PTHREAD_COND_SIGNAL \ingroup API_Threads Call starpu_pthread_cond_signal() and abort on error. \def STARPU_PTHREAD_COND_BROADCAST \ingroup API_Threads Call starpu_pthread_cond_broadcast() and abort on error. \def STARPU_PTHREAD_COND_WAIT \ingroup API_Threads Call starpu_pthread_cond_wait() and abort on error. \def STARPU_PTHREAD_BARRIER_INIT \ingroup API_Threads Call starpu_pthread_barrier_init() and abort on error. \def STARPU_PTHREAD_BARRIER_DESTROY \ingroup API_Threads Call starpu_pthread_barrier_destroy() and abort on error. \def STARPU_PTHREAD_BARRIER_WAIT \ingroup API_Threads Call starpu_pthread_barrier_wait() and abort 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 Start 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 Wait 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 Terminate the calling thread and return 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 Initialize the thread attributes object pointed to by \p attr with default attribute values. Do 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 Destroy 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. Do 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 Set 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. Do 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 Initialize 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 Destroy a mutex object, and free 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 Lock the given \p mutex. If \p mutex is currently unlocked, it becomes locked and owned by the calling thread, and the function returns immediately. If \p mutex is already locked by another thread, the function suspends the calling thread until \p 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 Unlock the given \p 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 Behave 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 \c 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 Initialize 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 Allocate 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 Deallocate a TSD key. Do 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 Change 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 Return the value associated with \p key on success, and NULL on error. \typedef STARPU_PTHREAD_COND_INITIALIZER \ingroup API_Threads Initialize 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 Initialize 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 Restart 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 is not specified which. \fn int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond) \ingroup API_Threads Restart all the threads that are waiting on the condition variable \p cond. Nothing happens if no threads are waiting on \p cond. \fn int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) \ingroup API_Threads Atomically unlock \p mutex (as per starpu_pthread_mutex_unlock()) and wait 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 Atomicall unlocks \p mutex and wait on \p cond, as starpu_pthread_cond_wait() does, but also bound the duration of the wait with \p abstime. \fn int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond) \ingroup API_Threads Destroy 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 Similar to starpu_pthread_mutex_init(). \fn int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads Similar to starpu_pthread_mutex_destroy(). \fn int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock) \ingroup API_Threads Similar to 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 Similar to 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 Similar to 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 Similar to calling Unix' \c 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.3.9+dfsg/doc/doxygen/chapters/api/versioning.doxy000066400000000000000000000016061413463044200236610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \defgroup API_Versioning Versioning \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.3.9+dfsg/doc/doxygen/chapters/code/000077500000000000000000000000001413463044200207275ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen/chapters/code/complex.c000066400000000000000000000021561413463044200225460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/disk_compute.c000066400000000000000000000112331413463044200235610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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, sizeof(pid_str), "%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.3.9+dfsg/doc/doxygen/chapters/code/disk_copy.c000066400000000000000000000076661413463044200230760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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.3.9+dfsg/doc/doxygen/chapters/code/forkmode.c000066400000000000000000000026651413463044200227120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/multiformat.c000066400000000000000000000042101413463044200234330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/nf_initexit.f90000066400000000000000000000026021413463044200235670ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/simgrid.c000066400000000000000000000022161413463044200225320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/vector_scal_c.c000066400000000000000000000107671413463044200237140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/vector_scal_cpu.c000066400000000000000000000054311413463044200242510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/code/vector_scal_cuda.c000066400000000000000000000033351413463044200243770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } //! [To be included. You should update doxygen if you see this text.] starpu-1.3.9+dfsg/doc/doxygen/chapters/code/vector_scal_opencl.c000066400000000000000000000052731413463044200247460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/doc/doxygen/chapters/code/vector_scal_opencl_codelet.cl000066400000000000000000000017671413463044200266250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/doxygen/chapters/images/000077500000000000000000000000001413463044200212625ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen/chapters/images/data_trace.eps000066400000000000000000050425131413463044200240740ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/data_trace.pdf000066400000000000000000023265251413463044200240630ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/parallel_worker2.eps000066400000000000000000000745351413463044200252600ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/parallel_worker2.pdf000066400000000000000000000146031413463044200252300ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/parallel_worker2.png000066400000000000000000000065241413463044200252460ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/runtime-par.eps000066400000000000000000056427711413463044200242640ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/runtime-par.pdf000066400000000000000000000723451413463044200242330ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/runtime-par.png000066400000000000000000002177161413463044200242510ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/starpu_chol_model_11_type.pdf000066400000000000000000000176441413463044200270360ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/starpu_chol_model_11_type.png000066400000000000000000000133571413463044200270460ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based.eps000066400000000000000000000573331413463044200325000ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based.pdf000066400000000000000000000212641413463044200324540ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based.png000066400000000000000000000205511413463044200324650ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based_2.eps000066400000000000000000002123511413463044200327120ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based_2.pdf000066400000000000000000000574741413463044200327110ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/starpu_non_linear_memset_regression_based_2.png000066400000000000000000000175751413463044200327220ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/starpu_starpu_slu_lu_model_11.eps000066400000000000000000000554021413463044200277610ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/starpu_starpu_slu_lu_model_11.pdf000066400000000000000000000177701413463044200277510ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/starpu_starpu_slu_lu_model_11.png000066400000000000000000000167151413463044200277620ustar00rootroot00000000000000PNG  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 %%EndResource %%EndSetup %%Page: 1 1 %%BeginPageSetup %%PageBoundingBox: 0 0 360 216 %%EndPageSetup q 5 3 345 207 rectclip 1 0 0 -1 0 216 cm q 0 g 0.25 w 0 J 0 j [] 0.0 d 3.8 M q 1 0 0 1 0 0 cm 37.852 185.75 m 41.551 185.75 l S Q q 1 0 0 1 0 0 cm 344.148 185.75 m 340.449 185.75 l S Q BT 8 0 0 -8 25.1 188.775781 Tm /f-0-0 1 Tf ( 0)Tj ET q 1 0 0 1 0 0 cm 37.852 160.602 m 41.551 160.602 l S Q q 1 0 0 1 0 0 cm 344.148 160.602 m 340.449 160.602 l S Q BT 8 0 0 -8 20 163.625781 Tm /f-0-0 1 Tf [( 10)]TJ ET q 1 0 0 1 0 0 cm 37.852 135.5 m 41.551 135.5 l S Q q 1 0 0 1 0 0 cm 344.148 135.5 m 340.449 135.5 l S Q BT 8 0 0 -8 20 138.525781 Tm /f-0-0 1 Tf [( 20)]TJ ET q 1 0 0 1 0 0 cm 37.852 110.352 m 41.551 110.352 l S Q q 1 0 0 1 0 0 cm 344.148 110.352 m 340.449 110.352 l S Q BT 8 0 0 -8 20 113.375781 Tm /f-0-0 1 Tf [( 30)]TJ ET q 1 0 0 1 0 0 cm 37.852 85.25 m 41.551 85.25 l S Q q 1 0 0 1 0 0 cm 344.148 85.25 m 340.449 85.25 l S Q BT 8 0 0 -8 20 88.275781 Tm /f-0-0 1 Tf [( 40)]TJ ET q 1 0 0 1 0 0 cm 37.852 60.102 m 41.551 60.102 l S Q q 1 0 0 1 0 0 cm 344.148 60.102 m 340.449 60.102 l S Q BT 8 0 0 -8 20 63.125781 Tm /f-0-0 1 Tf [( 50)]TJ ET q 1 0 0 1 0 0 cm 37.852 35 m 41.551 35 l S Q q 1 0 0 1 0 0 cm 344.148 35 m 340.449 35 l S Q BT 8 0 0 -8 20 38.025781 Tm /f-0-0 1 Tf [( 60)]TJ ET q 1 0 0 1 0 0 cm 37.852 9.852 m 41.551 9.852 l S Q q 1 0 0 1 0 0 cm 344.148 9.852 m 340.449 9.852 l S Q BT 8 0 0 -8 20 12.875781 Tm /f-0-0 1 Tf [( 70)]TJ ET q 1 0 0 1 0 0 cm 37.852 185.75 m 37.852 182.051 l S Q q 1 0 0 1 0 0 cm 37.852 9.852 m 37.852 13.551 l S Q BT 8 0 0 -8 34.025 198.075781 Tm /f-0-0 1 Tf ( 0)Tj ET q 1 0 0 1 0 0 cm 81.602 185.75 m 81.602 182.051 l S Q q 1 0 0 1 0 0 cm 81.602 9.852 m 81.602 13.551 l S Q BT 8 0 0 -8 75.225 198.075781 Tm /f-0-0 1 Tf [( 10)]TJ ET q 1 0 0 1 0 0 cm 125.352 185.75 m 125.352 182.051 l S Q q 1 0 0 1 0 0 cm 125.352 9.852 m 125.352 13.551 l S Q BT 8 0 0 -8 118.975 198.075781 Tm /f-0-0 1 Tf [( 20)]TJ ET q 1 0 0 1 0 0 cm 169.102 185.75 m 169.102 182.051 l S Q q 1 0 0 1 0 0 cm 169.102 9.852 m 169.102 13.551 l S Q BT 8 0 0 -8 162.725 198.075781 Tm /f-0-0 1 Tf [( 30)]TJ ET q 1 0 0 1 0 0 cm 212.898 185.75 m 212.898 182.051 l S Q q 1 0 0 1 0 0 cm 212.898 9.852 m 212.898 13.551 l S Q BT 8 0 0 -8 206.525 198.075781 Tm /f-0-0 1 Tf [( 40)]TJ ET q 1 0 0 1 0 0 cm 256.648 185.75 m 256.648 182.051 l S Q q 1 0 0 1 0 0 cm 256.648 9.852 m 256.648 13.551 l S Q BT 8 0 0 -8 250.275 198.075781 Tm /f-0-0 1 Tf [( 50)]TJ ET q 1 0 0 1 0 0 cm 300.398 185.75 m 300.398 182.051 l S Q q 1 0 0 1 0 0 cm 300.398 9.852 m 300.398 13.551 l S Q BT 8 0 0 -8 294.025 198.075781 Tm /f-0-0 1 Tf [( 60)]TJ ET q 1 0 0 1 0 0 cm 344.148 185.75 m 344.148 182.051 l S Q q 1 0 0 1 0 0 cm 344.148 9.852 m 344.148 13.551 l S Q BT 8 0 0 -8 337.775 198.075781 Tm /f-0-0 1 Tf [( 70)]TJ ET q 1 0 0 1 0 0 cm 37.852 9.852 306.297 175.898 re S Q BT 0 -8 -8 0 11.975781 114.95 Tm /f-0-0 1 Tf [(spee)5(d)-3(u)3(p)]TJ 8 0 0 -8 158.25 212.025781 Tm [(n)3(umber of cor)22(e)-3(s)]TJ -13.40625 23.85 Td [(l)3(i)3(ne)5(ar)]TJ ET 0.580392 0 0.827451 rg q 1 0 0 1 0 0 cm 78.648 18.199 m 102.75 18.199 l S Q q 1 0 0 1 0 0 cm 42.25 183.25 m 45 181.648 l 47.801 180.051 l 50.602 178.449 l 53.352 176.852 l 56.148 175.25 l 58.949 173.648 l 61.699 172.051 l 64.5 170.449 l 67.301 168.852 l 70.051 167.25 l 72.852 165.648 l 75.648 164.051 l 78.398 162.449 l 81.199 160.852 l 86.801 157.648 l 89.551 156.051 l 92.352 154.449 l 95.148 152.852 l 97.898 151.25 l 100.699 149.648 l 103.5 148.051 l 106.25 146.449 l 109.051 144.852 l 111.852 143.25 l 114.602 141.648 l 117.398 140.051 l 120.199 138.449 l 123 136.852 l 125.75 135.25 l 128.551 133.648 l 131.352 132.051 l 134.102 130.449 l 136.898 128.852 l 139.699 127.25 l 142.449 125.648 l 145.25 124.051 l 148.051 122.449 l 150.801 120.852 l 153.602 119.25 l 156.398 117.648 l 159.199 116.102 l 161.949 114.5 l 164.75 112.898 l 167.551 111.301 l 170.301 109.699 l 173.102 108.102 l 175.898 106.5 l 178.648 104.898 l 181.449 103.301 l 184.25 101.699 l 187 100.102 l 192.602 96.898 l 195.398 95.301 l 198.148 93.699 l 200.949 92.102 l 203.75 90.5 l 206.5 88.898 l 209.301 87.301 l 212.102 85.699 l 214.852 84.102 l 217.648 82.5 l 220.449 80.898 l 223.199 79.301 l 226 77.699 l 228.801 76.102 l 231.551 74.5 l 234.352 72.898 l 237.148 71.301 l 239.949 69.699 l 242.699 68.102 l 248.301 64.898 l 251.051 63.301 l 253.852 61.699 l 256.648 60.102 l 259.398 58.5 l 262.199 56.898 l 265 55.301 l 267.75 53.699 l 270.551 52.102 l 273.352 50.5 l 276.148 48.898 l 278.898 47.301 l 281.699 45.699 l 284.5 44.102 l 287.25 42.5 l 290.051 40.898 l 292.852 39.301 l 295.602 37.699 l 298.398 36.102 l 301.199 34.5 l 303.949 32.898 l 306.75 31.301 l 309.551 29.699 l 312.352 28.148 l 315.102 26.551 l 317.898 24.949 l S Q 0 g BT 8 0 0 -8 53.15 30.525781 Tm /f-0-0 1 Tf [(40)-3(96)]TJ ET 0 0.619608 0.45098 rg q 1 0 0 1 0 0 cm 78.648 27.5 m 102.75 27.5 l S Q q 1 0 0 1 0 0 cm 42.25 183.25 m 46.602 180.75 l 51 178.25 l 55.352 175.699 l 59.75 173.199 l 64.102 170.699 l 68.5 168.199 l 72.852 165.699 l 77.25 163.199 l 81.602 160.699 l 86 158.148 l 90.352 155.648 l 94.75 153.148 l 99.102 150.648 l 103.5 148.148 l 107.852 145.648 l 112.25 143.148 l 116.602 140.648 l 121 138.102 l 125.352 135.602 l 129.75 133.102 l 134.102 130.602 l 138.5 128.102 l 142.852 125.602 l 147.25 123.102 l 151.602 120.602 l 156 118.102 l 160.352 115.602 l 164.75 113.051 l 169.102 110.551 l 173.5 108.051 l 177.852 105.551 l 182.25 103.051 l 186.602 100.551 l 195.398 95.551 l 199.75 93.051 l 204.148 90.551 l 208.5 88.051 l 212.898 85.5 l 217.25 83 l 221.648 80.5 l 226 78 l 230.398 75.5 l 234.75 73 l 239.148 70.551 l 243.5 68.051 l 247.898 65.449 l 252.25 62.949 l 256.648 60.449 l 261 58 l 265.398 57.352 l 269.75 53 l 274.148 50.5 l 278.5 47.949 l 282.898 45.449 l 287.25 43.051 l 291.648 40.449 l 296 38 l 300.398 35.551 l 304.75 33 l 309.148 30.398 l 313.5 27.949 l 317.898 28.398 l S Q q 1 0 0 1 0 0 cm 39.25 180.25 m 45.25 186.25 l S Q q 1 0 0 1 0 0 cm 39.25 186.25 m 45.25 180.25 l S Q q 1 0 0 1 0 0 cm 43.602 177.75 m 49.602 183.75 l S Q q 1 0 0 1 0 0 cm 43.602 183.75 m 49.602 177.75 l S Q q 1 0 0 1 0 0 cm 48 175.25 m 54 181.25 l S Q q 1 0 0 1 0 0 cm 48 181.25 m 54 175.25 l S Q q 1 0 0 1 0 0 cm 52.352 172.699 m 58.352 178.699 l S Q q 1 0 0 1 0 0 cm 52.352 178.699 m 58.352 172.699 l S Q q 1 0 0 1 0 0 cm 56.75 170.199 m 62.75 176.199 l S Q q 1 0 0 1 0 0 cm 56.75 176.199 m 62.75 170.199 l S Q q 1 0 0 1 0 0 cm 61.102 167.699 m 67.102 173.699 l S Q q 1 0 0 1 0 0 cm 61.102 173.699 m 67.102 167.699 l S Q q 1 0 0 1 0 0 cm 65.5 165.199 m 71.5 171.199 l S Q q 1 0 0 1 0 0 cm 65.5 171.199 m 71.5 165.199 l S Q q 1 0 0 1 0 0 cm 69.852 162.699 m 75.852 168.699 l S Q q 1 0 0 1 0 0 cm 69.852 168.699 m 75.852 162.699 l S Q q 1 0 0 1 0 0 cm 74.25 160.199 m 80.25 166.199 l S Q q 1 0 0 1 0 0 cm 74.25 166.199 m 80.25 160.199 l S Q q 1 0 0 1 0 0 cm 78.602 157.699 m 84.602 163.699 l S Q q 1 0 0 1 0 0 cm 78.602 163.699 m 84.602 157.699 l S Q q 1 0 0 1 0 0 cm 83 155.148 m 89 161.148 l S Q q 1 0 0 1 0 0 cm 83 161.148 m 89 155.148 l S Q q 1 0 0 1 0 0 cm 87.352 152.648 m 93.352 158.648 l S Q q 1 0 0 1 0 0 cm 87.352 158.648 m 93.352 152.648 l S Q q 1 0 0 1 0 0 cm 91.75 150.148 m 97.75 156.148 l S Q q 1 0 0 1 0 0 cm 91.75 156.148 m 97.75 150.148 l S Q q 1 0 0 1 0 0 cm 96.102 147.648 m 102.102 153.648 l S Q q 1 0 0 1 0 0 cm 96.102 153.648 m 102.102 147.648 l S Q q 1 0 0 1 0 0 cm 100.5 145.148 m 106.5 151.148 l S Q q 1 0 0 1 0 0 cm 100.5 151.148 m 106.5 145.148 l S Q q 1 0 0 1 0 0 cm 104.852 142.648 m 110.852 148.648 l S Q q 1 0 0 1 0 0 cm 104.852 148.648 m 110.852 142.648 l S Q q 1 0 0 1 0 0 cm 109.25 140.148 m 115.25 146.148 l S Q q 1 0 0 1 0 0 cm 109.25 146.148 m 115.25 140.148 l S Q q 1 0 0 1 0 0 cm 113.602 137.648 m 119.602 143.648 l S Q q 1 0 0 1 0 0 cm 113.602 143.648 m 119.602 137.648 l S Q q 1 0 0 1 0 0 cm 118 135.102 m 124 141.102 l S Q q 1 0 0 1 0 0 cm 118 141.102 m 124 135.102 l S Q q 1 0 0 1 0 0 cm 122.352 132.602 m 128.352 138.602 l S Q q 1 0 0 1 0 0 cm 122.352 138.602 m 128.352 132.602 l S Q q 1 0 0 1 0 0 cm 126.75 130.102 m 132.75 136.102 l S Q q 1 0 0 1 0 0 cm 126.75 136.102 m 132.75 130.102 l S Q q 1 0 0 1 0 0 cm 131.102 127.602 m 137.102 133.602 l S Q q 1 0 0 1 0 0 cm 131.102 133.602 m 137.102 127.602 l S Q q 1 0 0 1 0 0 cm 135.5 125.102 m 141.5 131.102 l S Q q 1 0 0 1 0 0 cm 135.5 131.102 m 141.5 125.102 l S Q q 1 0 0 1 0 0 cm 139.852 122.602 m 145.852 128.602 l S Q q 1 0 0 1 0 0 cm 139.852 128.602 m 145.852 122.602 l S Q q 1 0 0 1 0 0 cm 144.25 120.102 m 150.25 126.102 l S Q q 1 0 0 1 0 0 cm 144.25 126.102 m 150.25 120.102 l S Q q 1 0 0 1 0 0 cm 148.602 117.602 m 154.602 123.602 l S Q q 1 0 0 1 0 0 cm 148.602 123.602 m 154.602 117.602 l S Q q 1 0 0 1 0 0 cm 153 115.102 m 159 121.102 l S Q q 1 0 0 1 0 0 cm 153 121.102 m 159 115.102 l S Q q 1 0 0 1 0 0 cm 157.352 112.602 m 163.352 118.602 l S Q q 1 0 0 1 0 0 cm 157.352 118.602 m 163.352 112.602 l S Q q 1 0 0 1 0 0 cm 161.75 110.051 m 167.75 116.051 l S Q q 1 0 0 1 0 0 cm 161.75 116.051 m 167.75 110.051 l S Q q 1 0 0 1 0 0 cm 166.102 107.551 m 172.102 113.551 l S Q q 1 0 0 1 0 0 cm 166.102 113.551 m 172.102 107.551 l S Q q 1 0 0 1 0 0 cm 170.5 105.051 m 176.5 111.051 l S Q q 1 0 0 1 0 0 cm 170.5 111.051 m 176.5 105.051 l S Q q 1 0 0 1 0 0 cm 174.852 102.551 m 180.852 108.551 l S Q q 1 0 0 1 0 0 cm 174.852 108.551 m 180.852 102.551 l S Q q 1 0 0 1 0 0 cm 179.25 100.051 m 185.25 106.051 l S Q q 1 0 0 1 0 0 cm 179.25 106.051 m 185.25 100.051 l S Q q 1 0 0 1 0 0 cm 183.602 97.551 m 189.602 103.551 l S Q q 1 0 0 1 0 0 cm 183.602 103.551 m 189.602 97.551 l S Q q 1 0 0 1 0 0 cm 188 95.051 m 194 101.051 l S Q q 1 0 0 1 0 0 cm 188 101.051 m 194 95.051 l S Q q 1 0 0 1 0 0 cm 192.398 92.551 m 198.398 98.551 l S Q q 1 0 0 1 0 0 cm 192.398 98.551 m 198.398 92.551 l S Q q 1 0 0 1 0 0 cm 196.75 90.051 m 202.75 96.051 l S Q q 1 0 0 1 0 0 cm 196.75 96.051 m 202.75 90.051 l S Q q 1 0 0 1 0 0 cm 201.148 87.551 m 207.148 93.551 l S Q q 1 0 0 1 0 0 cm 201.148 93.551 m 207.148 87.551 l S Q q 1 0 0 1 0 0 cm 205.5 85.051 m 211.5 91.051 l S Q q 1 0 0 1 0 0 cm 205.5 91.051 m 211.5 85.051 l S Q q 1 0 0 1 0 0 cm 209.898 82.5 m 215.898 88.5 l S Q q 1 0 0 1 0 0 cm 209.898 88.5 m 215.898 82.5 l S Q q 1 0 0 1 0 0 cm 214.25 80 m 220.25 86 l S Q q 1 0 0 1 0 0 cm 214.25 86 m 220.25 80 l S Q q 1 0 0 1 0 0 cm 218.648 77.5 m 224.648 83.5 l S Q q 1 0 0 1 0 0 cm 218.648 83.5 m 224.648 77.5 l S Q q 1 0 0 1 0 0 cm 223 75 m 229 81 l S Q q 1 0 0 1 0 0 cm 223 81 m 229 75 l S Q q 1 0 0 1 0 0 cm 227.398 72.5 m 233.398 78.5 l S Q q 1 0 0 1 0 0 cm 227.398 78.5 m 233.398 72.5 l S Q q 1 0 0 1 0 0 cm 231.75 70 m 237.75 76 l S Q q 1 0 0 1 0 0 cm 231.75 76 m 237.75 70 l S Q q 1 0 0 1 0 0 cm 236.148 67.551 m 242.148 73.551 l S Q q 1 0 0 1 0 0 cm 236.148 73.551 m 242.148 67.551 l S Q q 1 0 0 1 0 0 cm 240.5 65.051 m 246.5 71.051 l S Q q 1 0 0 1 0 0 cm 240.5 71.051 m 246.5 65.051 l S Q q 1 0 0 1 0 0 cm 244.898 62.449 m 250.898 68.449 l S Q q 1 0 0 1 0 0 cm 244.898 68.449 m 250.898 62.449 l S Q q 1 0 0 1 0 0 cm 249.25 59.949 m 255.25 65.949 l S Q q 1 0 0 1 0 0 cm 249.25 65.949 m 255.25 59.949 l S Q q 1 0 0 1 0 0 cm 253.648 57.449 m 259.648 63.449 l S Q q 1 0 0 1 0 0 cm 253.648 63.449 m 259.648 57.449 l S Q q 1 0 0 1 0 0 cm 258 55 m 264 61 l S Q q 1 0 0 1 0 0 cm 258 61 m 264 55 l S Q q 1 0 0 1 0 0 cm 262.398 54.352 m 268.398 60.352 l S Q q 1 0 0 1 0 0 cm 262.398 60.352 m 268.398 54.352 l S Q q 1 0 0 1 0 0 cm 266.75 50 m 272.75 56 l S Q q 1 0 0 1 0 0 cm 266.75 56 m 272.75 50 l S Q q 1 0 0 1 0 0 cm 271.148 47.5 m 277.148 53.5 l S Q q 1 0 0 1 0 0 cm 271.148 53.5 m 277.148 47.5 l S Q q 1 0 0 1 0 0 cm 275.5 44.949 m 281.5 50.949 l S Q q 1 0 0 1 0 0 cm 275.5 50.949 m 281.5 44.949 l S Q q 1 0 0 1 0 0 cm 279.898 42.449 m 285.898 48.449 l S Q q 1 0 0 1 0 0 cm 279.898 48.449 m 285.898 42.449 l S Q q 1 0 0 1 0 0 cm 284.25 40.051 m 290.25 46.051 l S Q q 1 0 0 1 0 0 cm 284.25 46.051 m 290.25 40.051 l S Q q 1 0 0 1 0 0 cm 288.648 37.449 m 294.648 43.449 l S Q q 1 0 0 1 0 0 cm 288.648 43.449 m 294.648 37.449 l S Q q 1 0 0 1 0 0 cm 293 35 m 299 41 l S Q q 1 0 0 1 0 0 cm 293 41 m 299 35 l S Q q 1 0 0 1 0 0 cm 297.398 32.551 m 303.398 38.551 l S Q q 1 0 0 1 0 0 cm 297.398 38.551 m 303.398 32.551 l S Q q 1 0 0 1 0 0 cm 301.75 30 m 307.75 36 l S Q q 1 0 0 1 0 0 cm 301.75 36 m 307.75 30 l S Q q 1 0 0 1 0 0 cm 306.148 27.398 m 312.148 33.398 l S Q q 1 0 0 1 0 0 cm 306.148 33.398 m 312.148 27.398 l S Q q 1 0 0 1 0 0 cm 310.5 24.949 m 316.5 30.949 l S Q q 1 0 0 1 0 0 cm 310.5 30.949 m 316.5 24.949 l S Q q 1 0 0 1 0 0 cm 314.898 25.398 m 320.898 31.398 l S Q q 1 0 0 1 0 0 cm 314.898 31.398 m 320.898 25.398 l S Q q 1 0 0 1 0 0 cm 87.699 24.5 m 93.699 30.5 l S Q q 1 0 0 1 0 0 cm 87.699 30.5 m 93.699 24.5 l S Q 0 g BT 8 0 0 -8 53.15 39.825781 Tm /f-0-0 1 Tf [(20)-3(48)]TJ ET 0.337255 0.705882 0.913725 rg q 1 0 0 1 0 0 cm 78.648 36.801 m 102.75 36.801 l S Q q 1 0 0 1 0 0 cm 42.25 183.25 m 46.602 180.75 l 51 178.25 l 55.352 175.75 l 59.75 173.25 l 64.102 170.75 l 68.5 168.25 l 72.852 165.75 l 77.25 163.199 l 81.602 160.75 l 86 158.199 l 90.352 155.75 l 94.75 153.199 l 99.102 150.75 l 103.5 148.199 l 107.852 145.75 l 112.25 143.25 l 116.602 140.75 l 121 138.25 l 125.352 135.75 l 129.75 133.25 l 134.102 130.699 l 138.5 128.25 l 142.852 125.75 l 147.25 123.25 l 151.602 120.75 l 156 118.199 l 160.352 115.75 l 164.75 113.25 l 169.102 110.801 l 173.5 108.301 l 177.852 105.75 l 182.25 103.25 l 186.602 100.75 l 191 98.25 l 195.398 95.801 l 199.75 93.301 l 204.148 90.801 l 208.5 88.301 l 212.898 85.801 l 217.25 83.352 l 221.648 80.852 l 226 78.301 l 230.398 75.898 l 234.75 73.352 l 239.148 70.852 l 243.5 68.352 l 247.898 65.75 l 252.25 63.301 l 256.648 60.801 l 261 58.398 l 265.398 55.801 l 269.75 53.449 l 274.148 50.949 l 278.5 48.398 l 282.898 45.801 l 287.25 43.449 l 291.648 40.852 l 296 38.449 l 300.398 36 l 304.75 33.398 l 309.148 30.949 l 313.5 28.352 l 317.898 27.898 l S Q q 1 0 0 1 0 0 cm 39.25 183.25 m 45.25 183.25 l S Q q 1 0 0 1 0 0 cm 42.25 180.25 m 42.25 186.25 l S Q q 1 0 0 1 0 0 cm 39.25 180.25 m 45.25 186.25 l S Q q 1 0 0 1 0 0 cm 39.25 186.25 m 45.25 180.25 l S Q q 1 0 0 1 0 0 cm 43.602 180.75 m 49.602 180.75 l S Q q 1 0 0 1 0 0 cm 46.602 177.75 m 46.602 183.75 l S Q q 1 0 0 1 0 0 cm 43.602 177.75 m 49.602 183.75 l S Q q 1 0 0 1 0 0 cm 43.602 183.75 m 49.602 177.75 l S Q q 1 0 0 1 0 0 cm 48 178.25 m 54 178.25 l S Q q 1 0 0 1 0 0 cm 51 175.25 m 51 181.25 l S Q q 1 0 0 1 0 0 cm 48 175.25 m 54 181.25 l S Q q 1 0 0 1 0 0 cm 48 181.25 m 54 175.25 l S Q q 1 0 0 1 0 0 cm 52.352 175.75 m 58.352 175.75 l S Q q 1 0 0 1 0 0 cm 55.352 172.75 m 55.352 178.75 l S Q q 1 0 0 1 0 0 cm 52.352 172.75 m 58.352 178.75 l S Q q 1 0 0 1 0 0 cm 52.352 178.75 m 58.352 172.75 l S Q q 1 0 0 1 0 0 cm 56.75 173.25 m 62.75 173.25 l S Q q 1 0 0 1 0 0 cm 59.75 170.25 m 59.75 176.25 l S Q q 1 0 0 1 0 0 cm 56.75 170.25 m 62.75 176.25 l S Q q 1 0 0 1 0 0 cm 56.75 176.25 m 62.75 170.25 l S Q q 1 0 0 1 0 0 cm 61.102 170.75 m 67.102 170.75 l S Q q 1 0 0 1 0 0 cm 64.102 167.75 m 64.102 173.75 l S Q q 1 0 0 1 0 0 cm 61.102 167.75 m 67.102 173.75 l S Q q 1 0 0 1 0 0 cm 61.102 173.75 m 67.102 167.75 l S Q q 1 0 0 1 0 0 cm 65.5 168.25 m 71.5 168.25 l S Q q 1 0 0 1 0 0 cm 68.5 165.25 m 68.5 171.25 l S Q q 1 0 0 1 0 0 cm 65.5 165.25 m 71.5 171.25 l S Q q 1 0 0 1 0 0 cm 65.5 171.25 m 71.5 165.25 l S Q q 1 0 0 1 0 0 cm 69.852 165.75 m 75.852 165.75 l S Q q 1 0 0 1 0 0 cm 72.852 162.75 m 72.852 168.75 l S Q q 1 0 0 1 0 0 cm 69.852 162.75 m 75.852 168.75 l S Q q 1 0 0 1 0 0 cm 69.852 168.75 m 75.852 162.75 l S Q q 1 0 0 1 0 0 cm 74.25 163.199 m 80.25 163.199 l S Q q 1 0 0 1 0 0 cm 77.25 160.199 m 77.25 166.199 l S Q q 1 0 0 1 0 0 cm 74.25 160.199 m 80.25 166.199 l S Q q 1 0 0 1 0 0 cm 74.25 166.199 m 80.25 160.199 l S Q q 1 0 0 1 0 0 cm 78.602 160.75 m 84.602 160.75 l S Q q 1 0 0 1 0 0 cm 81.602 157.75 m 81.602 163.75 l S Q q 1 0 0 1 0 0 cm 78.602 157.75 m 84.602 163.75 l S Q q 1 0 0 1 0 0 cm 78.602 163.75 m 84.602 157.75 l S Q q 1 0 0 1 0 0 cm 83 158.199 m 89 158.199 l S Q q 1 0 0 1 0 0 cm 86 155.199 m 86 161.199 l S Q q 1 0 0 1 0 0 cm 83 155.199 m 89 161.199 l S Q q 1 0 0 1 0 0 cm 83 161.199 m 89 155.199 l S Q q 1 0 0 1 0 0 cm 87.352 155.75 m 93.352 155.75 l S Q q 1 0 0 1 0 0 cm 90.352 152.75 m 90.352 158.75 l S Q q 1 0 0 1 0 0 cm 87.352 152.75 m 93.352 158.75 l S Q q 1 0 0 1 0 0 cm 87.352 158.75 m 93.352 152.75 l S Q q 1 0 0 1 0 0 cm 91.75 153.199 m 97.75 153.199 l S Q q 1 0 0 1 0 0 cm 94.75 150.199 m 94.75 156.199 l S Q q 1 0 0 1 0 0 cm 91.75 150.199 m 97.75 156.199 l S Q q 1 0 0 1 0 0 cm 91.75 156.199 m 97.75 150.199 l S Q q 1 0 0 1 0 0 cm 96.102 150.75 m 102.102 150.75 l S Q q 1 0 0 1 0 0 cm 99.102 147.75 m 99.102 153.75 l S Q q 1 0 0 1 0 0 cm 96.102 147.75 m 102.102 153.75 l S Q q 1 0 0 1 0 0 cm 96.102 153.75 m 102.102 147.75 l S Q q 1 0 0 1 0 0 cm 100.5 148.199 m 106.5 148.199 l S Q q 1 0 0 1 0 0 cm 103.5 145.199 m 103.5 151.199 l S Q q 1 0 0 1 0 0 cm 100.5 145.199 m 106.5 151.199 l S Q q 1 0 0 1 0 0 cm 100.5 151.199 m 106.5 145.199 l S Q q 1 0 0 1 0 0 cm 104.852 145.75 m 110.852 145.75 l S Q q 1 0 0 1 0 0 cm 107.852 142.75 m 107.852 148.75 l S Q q 1 0 0 1 0 0 cm 104.852 142.75 m 110.852 148.75 l S Q q 1 0 0 1 0 0 cm 104.852 148.75 m 110.852 142.75 l S Q q 1 0 0 1 0 0 cm 109.25 143.25 m 115.25 143.25 l S Q q 1 0 0 1 0 0 cm 112.25 140.25 m 112.25 146.25 l S Q q 1 0 0 1 0 0 cm 109.25 140.25 m 115.25 146.25 l S Q q 1 0 0 1 0 0 cm 109.25 146.25 m 115.25 140.25 l S Q q 1 0 0 1 0 0 cm 113.602 140.75 m 119.602 140.75 l S Q q 1 0 0 1 0 0 cm 116.602 137.75 m 116.602 143.75 l S Q q 1 0 0 1 0 0 cm 113.602 137.75 m 119.602 143.75 l S Q q 1 0 0 1 0 0 cm 113.602 143.75 m 119.602 137.75 l S Q q 1 0 0 1 0 0 cm 118 138.25 m 124 138.25 l S Q q 1 0 0 1 0 0 cm 121 135.25 m 121 141.25 l S Q q 1 0 0 1 0 0 cm 118 135.25 m 124 141.25 l S Q q 1 0 0 1 0 0 cm 118 141.25 m 124 135.25 l S Q q 1 0 0 1 0 0 cm 122.352 135.75 m 128.352 135.75 l S Q q 1 0 0 1 0 0 cm 125.352 132.75 m 125.352 138.75 l S Q q 1 0 0 1 0 0 cm 122.352 132.75 m 128.352 138.75 l S Q q 1 0 0 1 0 0 cm 122.352 138.75 m 128.352 132.75 l S Q q 1 0 0 1 0 0 cm 126.75 133.25 m 132.75 133.25 l S Q q 1 0 0 1 0 0 cm 129.75 130.25 m 129.75 136.25 l S Q q 1 0 0 1 0 0 cm 126.75 130.25 m 132.75 136.25 l S Q q 1 0 0 1 0 0 cm 126.75 136.25 m 132.75 130.25 l S Q q 1 0 0 1 0 0 cm 131.102 130.699 m 137.102 130.699 l S Q q 1 0 0 1 0 0 cm 134.102 127.699 m 134.102 133.699 l S Q q 1 0 0 1 0 0 cm 131.102 127.699 m 137.102 133.699 l S Q q 1 0 0 1 0 0 cm 131.102 133.699 m 137.102 127.699 l S Q q 1 0 0 1 0 0 cm 135.5 128.25 m 141.5 128.25 l S Q q 1 0 0 1 0 0 cm 138.5 125.25 m 138.5 131.25 l S Q q 1 0 0 1 0 0 cm 135.5 125.25 m 141.5 131.25 l S Q q 1 0 0 1 0 0 cm 135.5 131.25 m 141.5 125.25 l S Q q 1 0 0 1 0 0 cm 139.852 125.75 m 145.852 125.75 l S Q q 1 0 0 1 0 0 cm 142.852 122.75 m 142.852 128.75 l S Q q 1 0 0 1 0 0 cm 139.852 122.75 m 145.852 128.75 l S Q q 1 0 0 1 0 0 cm 139.852 128.75 m 145.852 122.75 l S Q q 1 0 0 1 0 0 cm 144.25 123.25 m 150.25 123.25 l S Q q 1 0 0 1 0 0 cm 147.25 120.25 m 147.25 126.25 l S Q q 1 0 0 1 0 0 cm 144.25 120.25 m 150.25 126.25 l S Q q 1 0 0 1 0 0 cm 144.25 126.25 m 150.25 120.25 l S Q q 1 0 0 1 0 0 cm 148.602 120.75 m 154.602 120.75 l S Q q 1 0 0 1 0 0 cm 151.602 117.75 m 151.602 123.75 l S Q q 1 0 0 1 0 0 cm 148.602 117.75 m 154.602 123.75 l S Q q 1 0 0 1 0 0 cm 148.602 123.75 m 154.602 117.75 l S Q q 1 0 0 1 0 0 cm 153 118.199 m 159 118.199 l S Q q 1 0 0 1 0 0 cm 156 115.199 m 156 121.199 l S Q q 1 0 0 1 0 0 cm 153 115.199 m 159 121.199 l S Q q 1 0 0 1 0 0 cm 153 121.199 m 159 115.199 l S Q q 1 0 0 1 0 0 cm 157.352 115.75 m 163.352 115.75 l S Q q 1 0 0 1 0 0 cm 160.352 112.75 m 160.352 118.75 l S Q q 1 0 0 1 0 0 cm 157.352 112.75 m 163.352 118.75 l S Q q 1 0 0 1 0 0 cm 157.352 118.75 m 163.352 112.75 l S Q q 1 0 0 1 0 0 cm 161.75 113.25 m 167.75 113.25 l S Q q 1 0 0 1 0 0 cm 164.75 110.25 m 164.75 116.25 l S Q q 1 0 0 1 0 0 cm 161.75 110.25 m 167.75 116.25 l S Q q 1 0 0 1 0 0 cm 161.75 116.25 m 167.75 110.25 l S Q q 1 0 0 1 0 0 cm 166.102 110.801 m 172.102 110.801 l S Q q 1 0 0 1 0 0 cm 169.102 107.801 m 169.102 113.801 l S Q q 1 0 0 1 0 0 cm 166.102 107.801 m 172.102 113.801 l S Q q 1 0 0 1 0 0 cm 166.102 113.801 m 172.102 107.801 l S Q q 1 0 0 1 0 0 cm 170.5 108.301 m 176.5 108.301 l S Q q 1 0 0 1 0 0 cm 173.5 105.301 m 173.5 111.301 l S Q q 1 0 0 1 0 0 cm 170.5 105.301 m 176.5 111.301 l S Q q 1 0 0 1 0 0 cm 170.5 111.301 m 176.5 105.301 l S Q q 1 0 0 1 0 0 cm 174.852 105.75 m 180.852 105.75 l S Q q 1 0 0 1 0 0 cm 177.852 102.75 m 177.852 108.75 l S Q q 1 0 0 1 0 0 cm 174.852 102.75 m 180.852 108.75 l S Q q 1 0 0 1 0 0 cm 174.852 108.75 m 180.852 102.75 l S Q q 1 0 0 1 0 0 cm 179.25 103.25 m 185.25 103.25 l S Q q 1 0 0 1 0 0 cm 182.25 100.25 m 182.25 106.25 l S Q q 1 0 0 1 0 0 cm 179.25 100.25 m 185.25 106.25 l S Q q 1 0 0 1 0 0 cm 179.25 106.25 m 185.25 100.25 l S Q q 1 0 0 1 0 0 cm 183.602 100.75 m 189.602 100.75 l S Q q 1 0 0 1 0 0 cm 186.602 97.75 m 186.602 103.75 l S Q q 1 0 0 1 0 0 cm 183.602 97.75 m 189.602 103.75 l S Q q 1 0 0 1 0 0 cm 183.602 103.75 m 189.602 97.75 l S Q q 1 0 0 1 0 0 cm 188 98.25 m 194 98.25 l S Q q 1 0 0 1 0 0 cm 191 95.25 m 191 101.25 l S Q q 1 0 0 1 0 0 cm 188 95.25 m 194 101.25 l S Q q 1 0 0 1 0 0 cm 188 101.25 m 194 95.25 l S Q q 1 0 0 1 0 0 cm 192.398 95.801 m 198.398 95.801 l S Q q 1 0 0 1 0 0 cm 195.398 92.801 m 195.398 98.801 l S Q q 1 0 0 1 0 0 cm 192.398 92.801 m 198.398 98.801 l S Q q 1 0 0 1 0 0 cm 192.398 98.801 m 198.398 92.801 l S Q q 1 0 0 1 0 0 cm 196.75 93.301 m 202.75 93.301 l S Q q 1 0 0 1 0 0 cm 199.75 90.301 m 199.75 96.301 l S Q q 1 0 0 1 0 0 cm 196.75 90.301 m 202.75 96.301 l S Q q 1 0 0 1 0 0 cm 196.75 96.301 m 202.75 90.301 l S Q q 1 0 0 1 0 0 cm 201.148 90.801 m 207.148 90.801 l S Q q 1 0 0 1 0 0 cm 204.148 87.801 m 204.148 93.801 l S Q q 1 0 0 1 0 0 cm 201.148 87.801 m 207.148 93.801 l S Q q 1 0 0 1 0 0 cm 201.148 93.801 m 207.148 87.801 l S Q q 1 0 0 1 0 0 cm 205.5 88.301 m 211.5 88.301 l S Q q 1 0 0 1 0 0 cm 208.5 85.301 m 208.5 91.301 l S Q q 1 0 0 1 0 0 cm 205.5 85.301 m 211.5 91.301 l S Q q 1 0 0 1 0 0 cm 205.5 91.301 m 211.5 85.301 l S Q q 1 0 0 1 0 0 cm 209.898 85.801 m 215.898 85.801 l S Q q 1 0 0 1 0 0 cm 212.898 82.801 m 212.898 88.801 l S Q q 1 0 0 1 0 0 cm 209.898 82.801 m 215.898 88.801 l S Q q 1 0 0 1 0 0 cm 209.898 88.801 m 215.898 82.801 l S Q q 1 0 0 1 0 0 cm 214.25 83.352 m 220.25 83.352 l S Q q 1 0 0 1 0 0 cm 217.25 80.352 m 217.25 86.352 l S Q q 1 0 0 1 0 0 cm 214.25 80.352 m 220.25 86.352 l S Q q 1 0 0 1 0 0 cm 214.25 86.352 m 220.25 80.352 l S Q q 1 0 0 1 0 0 cm 218.648 80.852 m 224.648 80.852 l S Q q 1 0 0 1 0 0 cm 221.648 77.852 m 221.648 83.852 l S Q q 1 0 0 1 0 0 cm 218.648 77.852 m 224.648 83.852 l S Q q 1 0 0 1 0 0 cm 218.648 83.852 m 224.648 77.852 l S Q q 1 0 0 1 0 0 cm 223 78.301 m 229 78.301 l S Q q 1 0 0 1 0 0 cm 226 75.301 m 226 81.301 l S Q q 1 0 0 1 0 0 cm 223 75.301 m 229 81.301 l S Q q 1 0 0 1 0 0 cm 223 81.301 m 229 75.301 l S Q q 1 0 0 1 0 0 cm 227.398 75.898 m 233.398 75.898 l S Q q 1 0 0 1 0 0 cm 230.398 72.898 m 230.398 78.898 l S Q q 1 0 0 1 0 0 cm 227.398 72.898 m 233.398 78.898 l S Q q 1 0 0 1 0 0 cm 227.398 78.898 m 233.398 72.898 l S Q q 1 0 0 1 0 0 cm 231.75 73.352 m 237.75 73.352 l S Q q 1 0 0 1 0 0 cm 234.75 70.352 m 234.75 76.352 l S Q q 1 0 0 1 0 0 cm 231.75 70.352 m 237.75 76.352 l S Q q 1 0 0 1 0 0 cm 231.75 76.352 m 237.75 70.352 l S Q q 1 0 0 1 0 0 cm 236.148 70.852 m 242.148 70.852 l S Q q 1 0 0 1 0 0 cm 239.148 67.852 m 239.148 73.852 l S Q q 1 0 0 1 0 0 cm 236.148 67.852 m 242.148 73.852 l S Q q 1 0 0 1 0 0 cm 236.148 73.852 m 242.148 67.852 l S Q q 1 0 0 1 0 0 cm 240.5 68.352 m 246.5 68.352 l S Q q 1 0 0 1 0 0 cm 243.5 65.352 m 243.5 71.352 l S Q q 1 0 0 1 0 0 cm 240.5 65.352 m 246.5 71.352 l S Q q 1 0 0 1 0 0 cm 240.5 71.352 m 246.5 65.352 l S Q q 1 0 0 1 0 0 cm 244.898 65.75 m 250.898 65.75 l S Q q 1 0 0 1 0 0 cm 247.898 62.75 m 247.898 68.75 l S Q q 1 0 0 1 0 0 cm 244.898 62.75 m 250.898 68.75 l S Q q 1 0 0 1 0 0 cm 244.898 68.75 m 250.898 62.75 l S Q q 1 0 0 1 0 0 cm 249.25 63.301 m 255.25 63.301 l S Q q 1 0 0 1 0 0 cm 252.25 60.301 m 252.25 66.301 l S Q q 1 0 0 1 0 0 cm 249.25 60.301 m 255.25 66.301 l S Q q 1 0 0 1 0 0 cm 249.25 66.301 m 255.25 60.301 l S Q q 1 0 0 1 0 0 cm 253.648 60.801 m 259.648 60.801 l S Q q 1 0 0 1 0 0 cm 256.648 57.801 m 256.648 63.801 l S Q q 1 0 0 1 0 0 cm 253.648 57.801 m 259.648 63.801 l S Q q 1 0 0 1 0 0 cm 253.648 63.801 m 259.648 57.801 l S Q q 1 0 0 1 0 0 cm 258 58.398 m 264 58.398 l S Q q 1 0 0 1 0 0 cm 261 55.398 m 261 61.398 l S Q q 1 0 0 1 0 0 cm 258 55.398 m 264 61.398 l S Q q 1 0 0 1 0 0 cm 258 61.398 m 264 55.398 l S Q q 1 0 0 1 0 0 cm 262.398 55.801 m 268.398 55.801 l S Q q 1 0 0 1 0 0 cm 265.398 52.801 m 265.398 58.801 l S Q q 1 0 0 1 0 0 cm 262.398 52.801 m 268.398 58.801 l S Q q 1 0 0 1 0 0 cm 262.398 58.801 m 268.398 52.801 l S Q q 1 0 0 1 0 0 cm 266.75 53.449 m 272.75 53.449 l S Q q 1 0 0 1 0 0 cm 269.75 50.449 m 269.75 56.449 l S Q q 1 0 0 1 0 0 cm 266.75 50.449 m 272.75 56.449 l S Q q 1 0 0 1 0 0 cm 266.75 56.449 m 272.75 50.449 l S Q q 1 0 0 1 0 0 cm 271.148 50.949 m 277.148 50.949 l S Q q 1 0 0 1 0 0 cm 274.148 47.949 m 274.148 53.949 l S Q q 1 0 0 1 0 0 cm 271.148 47.949 m 277.148 53.949 l S Q q 1 0 0 1 0 0 cm 271.148 53.949 m 277.148 47.949 l S Q q 1 0 0 1 0 0 cm 275.5 48.398 m 281.5 48.398 l S Q q 1 0 0 1 0 0 cm 278.5 45.398 m 278.5 51.398 l S Q q 1 0 0 1 0 0 cm 275.5 45.398 m 281.5 51.398 l S Q q 1 0 0 1 0 0 cm 275.5 51.398 m 281.5 45.398 l S Q q 1 0 0 1 0 0 cm 279.898 45.801 m 285.898 45.801 l S Q q 1 0 0 1 0 0 cm 282.898 42.801 m 282.898 48.801 l S Q q 1 0 0 1 0 0 cm 279.898 42.801 m 285.898 48.801 l S Q q 1 0 0 1 0 0 cm 279.898 48.801 m 285.898 42.801 l S Q q 1 0 0 1 0 0 cm 284.25 43.449 m 290.25 43.449 l S Q q 1 0 0 1 0 0 cm 287.25 40.449 m 287.25 46.449 l S Q q 1 0 0 1 0 0 cm 284.25 40.449 m 290.25 46.449 l S Q q 1 0 0 1 0 0 cm 284.25 46.449 m 290.25 40.449 l S Q q 1 0 0 1 0 0 cm 288.648 40.852 m 294.648 40.852 l S Q q 1 0 0 1 0 0 cm 291.648 37.852 m 291.648 43.852 l S Q q 1 0 0 1 0 0 cm 288.648 37.852 m 294.648 43.852 l S Q q 1 0 0 1 0 0 cm 288.648 43.852 m 294.648 37.852 l S Q q 1 0 0 1 0 0 cm 293 38.449 m 299 38.449 l S Q q 1 0 0 1 0 0 cm 296 35.449 m 296 41.449 l S Q q 1 0 0 1 0 0 cm 293 35.449 m 299 41.449 l S Q q 1 0 0 1 0 0 cm 293 41.449 m 299 35.449 l S Q q 1 0 0 1 0 0 cm 297.398 36 m 303.398 36 l S Q q 1 0 0 1 0 0 cm 300.398 33 m 300.398 39 l S Q q 1 0 0 1 0 0 cm 297.398 33 m 303.398 39 l S Q q 1 0 0 1 0 0 cm 297.398 39 m 303.398 33 l S Q q 1 0 0 1 0 0 cm 301.75 33.398 m 307.75 33.398 l S Q q 1 0 0 1 0 0 cm 304.75 30.398 m 304.75 36.398 l S Q q 1 0 0 1 0 0 cm 301.75 30.398 m 307.75 36.398 l S Q q 1 0 0 1 0 0 cm 301.75 36.398 m 307.75 30.398 l S Q q 1 0 0 1 0 0 cm 306.148 30.949 m 312.148 30.949 l S Q q 1 0 0 1 0 0 cm 309.148 27.949 m 309.148 33.949 l S Q q 1 0 0 1 0 0 cm 306.148 27.949 m 312.148 33.949 l S Q q 1 0 0 1 0 0 cm 306.148 33.949 m 312.148 27.949 l S Q q 1 0 0 1 0 0 cm 310.5 28.352 m 316.5 28.352 l S Q q 1 0 0 1 0 0 cm 313.5 25.352 m 313.5 31.352 l S Q q 1 0 0 1 0 0 cm 310.5 25.352 m 316.5 31.352 l S Q q 1 0 0 1 0 0 cm 310.5 31.352 m 316.5 25.352 l S Q q 1 0 0 1 0 0 cm 314.898 27.898 m 320.898 27.898 l S Q q 1 0 0 1 0 0 cm 317.898 24.898 m 317.898 30.898 l S Q q 1 0 0 1 0 0 cm 314.898 24.898 m 320.898 30.898 l S Q q 1 0 0 1 0 0 cm 314.898 30.898 m 320.898 24.898 l S Q q 1 0 0 1 0 0 cm 87.699 36.801 m 93.699 36.801 l S Q q 1 0 0 1 0 0 cm 90.699 33.801 m 90.699 39.801 l S Q q 1 0 0 1 0 0 cm 87.699 33.801 m 93.699 39.801 l S Q q 1 0 0 1 0 0 cm 87.699 39.801 m 93.699 33.801 l S Q 0 g BT 8 0 0 -8 53.15 49.125781 Tm /f-0-0 1 Tf [(10)-3(24)]TJ ET 0.901961 0.623529 0 rg q 1 0 0 1 0 0 cm 78.648 46.102 m 102.75 46.102 l S Q q 1 0 0 1 0 0 cm 42.25 183.25 m 46.602 180.75 l 51 178.25 l 55.352 175.75 l 59.75 173.301 l 64.102 170.801 l 68.5 168.301 l 72.852 165.801 l 77.25 163.301 l 81.602 160.852 l 86 158.301 l 90.352 155.852 l 94.75 153.352 l 99.102 150.852 l 103.5 148.352 l 107.852 145.898 l 112.25 143.449 l 116.602 141 l 121 138.449 l 125.352 135.949 l 129.75 133.449 l 134.102 130.949 l 138.5 128.5 l 142.852 126.051 l 147.25 123.551 l 151.602 121.102 l 156 118.551 l 160.352 116.051 l 164.75 113.551 l 169.102 111.148 l 173.5 108.648 l 177.852 106.148 l 182.25 103.699 l 186.602 101.102 l 191 98.648 l 195.398 96.25 l 199.75 93.75 l 204.148 91.301 l 208.5 88.801 l 212.898 86.199 l 217.25 83.949 l 221.648 81.5 l 226 78.852 l 230.398 76.449 l 234.75 74 l 239.148 71.75 l 243.5 69 l 247.898 66.398 l 252.25 64 l 256.648 61.551 l 261 59.25 l 265.398 56.449 l 269.75 54.301 l 274.148 53.352 l 278.5 49.148 l 282.898 46.5 l 287.25 44.352 l 291.648 41.648 l 296 39.199 l 300.398 37.102 l 304.75 34.5 l 309.148 31.801 l 313.5 29.449 l 317.898 28.602 l S Q q 1 0 0 1 0 0 cm 39.25 180.25 6 6 re S Q q 1 0 0 1 0 0 cm 43.602 177.75 6 6 re S Q q 1 0 0 1 0 0 cm 48 175.25 6 6 re S Q q 1 0 0 1 0 0 cm 52.352 172.75 6 6 re S Q q 1 0 0 1 0 0 cm 56.75 170.301 6 6 re S Q q 1 0 0 1 0 0 cm 61.102 167.801 6 6 re S Q q 1 0 0 1 0 0 cm 65.5 165.301 6 6 re S Q q 1 0 0 1 0 0 cm 69.852 162.801 6 6 re S Q q 1 0 0 1 0 0 cm 74.25 160.301 6 6 re S Q q 1 0 0 1 0 0 cm 78.602 157.852 6 6 re S Q q 1 0 0 1 0 0 cm 83 155.301 6 6 re S Q q 1 0 0 1 0 0 cm 87.352 152.852 6 6 re S Q q 1 0 0 1 0 0 cm 91.75 150.352 6 6 re S Q q 1 0 0 1 0 0 cm 96.102 147.852 6 6 re S Q q 1 0 0 1 0 0 cm 100.5 145.352 6 6 re S Q q 1 0 0 1 0 0 cm 104.852 142.898 6 6 re S Q q 1 0 0 1 0 0 cm 109.25 140.449 6 6 re S Q q 1 0 0 1 0 0 cm 113.602 138 6 6 re S Q q 1 0 0 1 0 0 cm 118 135.449 6 6 re S Q q 1 0 0 1 0 0 cm 122.352 132.949 6 6 re S Q q 1 0 0 1 0 0 cm 126.75 130.449 6 6 re S Q q 1 0 0 1 0 0 cm 131.102 127.949 6 6 re S Q q 1 0 0 1 0 0 cm 135.5 125.5 6 6 re S Q q 1 0 0 1 0 0 cm 139.852 123.051 6 6 re S Q q 1 0 0 1 0 0 cm 144.25 120.551 6 6 re S Q q 1 0 0 1 0 0 cm 148.602 118.102 6 6 re S Q q 1 0 0 1 0 0 cm 153 115.551 6 6 re S Q q 1 0 0 1 0 0 cm 157.352 113.051 6 6 re S Q q 1 0 0 1 0 0 cm 161.75 110.551 6 6 re S Q q 1 0 0 1 0 0 cm 166.102 108.148 6 6 re S Q q 1 0 0 1 0 0 cm 170.5 105.648 6 6 re S Q q 1 0 0 1 0 0 cm 174.852 103.148 6 6 re S Q q 1 0 0 1 0 0 cm 179.25 100.699 6 6 re S Q q 1 0 0 1 0 0 cm 183.602 98.102 6 6 re S Q q 1 0 0 1 0 0 cm 188 95.648 6 6 re S Q q 1 0 0 1 0 0 cm 192.398 93.25 6 6 re S Q q 1 0 0 1 0 0 cm 196.75 90.75 6 6 re S Q q 1 0 0 1 0 0 cm 201.148 88.301 6 6 re S Q q 1 0 0 1 0 0 cm 205.5 85.801 6 6 re S Q q 1 0 0 1 0 0 cm 209.898 83.199 6 6 re S Q q 1 0 0 1 0 0 cm 214.25 80.949 6 6 re S Q q 1 0 0 1 0 0 cm 218.648 78.5 6 6 re S Q q 1 0 0 1 0 0 cm 223 75.852 6 6 re S Q q 1 0 0 1 0 0 cm 227.398 73.449 6 6 re S Q q 1 0 0 1 0 0 cm 231.75 71 6 6 re S Q q 1 0 0 1 0 0 cm 236.148 68.75 6 6 re S Q q 1 0 0 1 0 0 cm 240.5 66 6 6 re S Q q 1 0 0 1 0 0 cm 244.898 63.398 6 6 re S Q q 1 0 0 1 0 0 cm 249.25 61 6 6 re S Q q 1 0 0 1 0 0 cm 253.648 58.551 6 6 re S Q q 1 0 0 1 0 0 cm 258 56.25 6 6 re S Q q 1 0 0 1 0 0 cm 262.398 53.449 6 6 re S Q q 1 0 0 1 0 0 cm 266.75 51.301 6 6 re S Q q 1 0 0 1 0 0 cm 271.148 50.352 6 6 re S Q q 1 0 0 1 0 0 cm 275.5 46.148 6 6 re S Q q 1 0 0 1 0 0 cm 279.898 43.5 6 6 re S Q q 1 0 0 1 0 0 cm 284.25 41.352 6 6 re S Q q 1 0 0 1 0 0 cm 288.648 38.648 6 6 re S Q q 1 0 0 1 0 0 cm 293 36.199 6 6 re S Q q 1 0 0 1 0 0 cm 297.398 34.102 6 6 re S Q q 1 0 0 1 0 0 cm 301.75 31.5 6 6 re S Q q 1 0 0 1 0 0 cm 306.148 28.801 6 6 re S Q q 1 0 0 1 0 0 cm 310.5 26.449 6 6 re S Q q 1 0 0 1 0 0 cm 314.898 25.602 6 6 re S Q q 1 0 0 1 0 0 cm 87.699 43.102 6 6 re S Q 0 g BT 8 0 0 -8 58.25 58.425781 Tm /f-0-0 1 Tf [(51)-3(2)]TJ ET 0.941176 0.894118 0.258824 rg q 1 0 0 1 0 0 cm 78.648 55.398 m 102.75 55.398 l S Q q 1 0 0 1 0 0 cm 42.25 183.25 m 46.602 180.801 l 51 178.301 l 55.352 175.852 l 59.75 173.352 l 64.102 170.898 l 68.5 168.398 l 72.852 165.949 l 77.25 163.5 l 81.602 161 l 86 158.551 l 90.352 156.102 l 94.75 153.602 l 99.102 151.148 l 103.5 148.648 l 107.852 146.25 l 112.25 143.801 l 116.602 141.352 l 121 138.852 l 125.352 136.352 l 129.75 134 l 134.102 131.398 l 138.5 129.051 l 142.852 126.551 l 147.25 124.148 l 151.602 121.602 l 156 119.148 l 160.352 116.75 l 164.75 114.352 l 169.102 112.051 l 173.5 109.398 l 177.852 106.898 l 182.25 104.449 l 186.602 102.051 l 191 99.5 l 195.398 97.148 l 199.75 94.699 l 204.148 92.352 l 208.5 89.949 l 212.898 87.199 l 217.25 85.051 l 221.648 82.75 l 226 80 l 230.398 77.801 l 234.75 75.449 l 239.148 72.898 l 243.5 70.352 l 247.898 67.898 l 252.25 65.301 l 256.648 62.602 l 261 60.949 l 265.398 58.051 l 269.75 55.801 l 274.148 53.5 l 278.5 50.5 l 282.898 48.199 l 287.25 45.898 l 291.648 43.449 l 296 40.949 l 300.398 38.648 l 304.75 35.949 l 309.148 33.199 l 313.5 31.5 l 317.898 65.5 l S Q 39.25 180.25 6 6 re f q 1 0 0 1 0 0 cm 39.25 180.25 6 6 re S Q 43.602 177.801 6 6 re f q 1 0 0 1 0 0 cm 43.602 177.801 6 6 re S Q 48 175.301 6 6 re f q 1 0 0 1 0 0 cm 48 175.301 6 6 re S Q 52.352 172.852 6 6 re f q 1 0 0 1 0 0 cm 52.352 172.852 6 6 re S Q 56.75 170.352 6 6 re f q 1 0 0 1 0 0 cm 56.75 170.352 6 6 re S Q 61.102 167.898 6 6 re f q 1 0 0 1 0 0 cm 61.102 167.898 6 6 re S Q 65.5 165.398 6 6 re f q 1 0 0 1 0 0 cm 65.5 165.398 6 6 re S Q 69.852 162.949 6 6 re f q 1 0 0 1 0 0 cm 69.852 162.949 6 6 re S Q 74.25 160.5 6 6 re f q 1 0 0 1 0 0 cm 74.25 160.5 6 6 re S Q 78.602 158 6 6 re f q 1 0 0 1 0 0 cm 78.602 158 6 6 re S Q 83 155.551 6 6 re f q 1 0 0 1 0 0 cm 83 155.551 6 6 re S Q 87.352 153.102 6 6 re f q 1 0 0 1 0 0 cm 87.352 153.102 6 6 re S Q 91.75 150.602 6 6 re f q 1 0 0 1 0 0 cm 91.75 150.602 6 6 re S Q 96.102 148.148 6 6 re f q 1 0 0 1 0 0 cm 96.102 148.148 6 6 re S Q 100.5 145.648 6 6 re f q 1 0 0 1 0 0 cm 100.5 145.648 6 6 re S Q 104.852 143.25 6 6 re f q 1 0 0 1 0 0 cm 104.852 143.25 6 6 re S Q 109.25 140.801 6 6 re f q 1 0 0 1 0 0 cm 109.25 140.801 6 6 re S Q 113.602 138.352 6 6 re f q 1 0 0 1 0 0 cm 113.602 138.352 6 6 re S Q 118 135.852 6 6 re f q 1 0 0 1 0 0 cm 118 135.852 6 6 re S Q 122.352 133.352 6 6 re f q 1 0 0 1 0 0 cm 122.352 133.352 6 6 re S Q 126.75 131 6 6 re f q 1 0 0 1 0 0 cm 126.75 131 6 6 re S Q 131.102 128.398 6 6 re f q 1 0 0 1 0 0 cm 131.102 128.398 6 6 re S Q 135.5 126.051 6 6 re f q 1 0 0 1 0 0 cm 135.5 126.051 6 6 re S Q 139.852 123.551 6 6 re f q 1 0 0 1 0 0 cm 139.852 123.551 6 6 re S Q 144.25 121.148 6 6 re f q 1 0 0 1 0 0 cm 144.25 121.148 6 6 re S Q 148.602 118.602 6 6 re f q 1 0 0 1 0 0 cm 148.602 118.602 6 6 re S Q 153 116.148 6 6 re f q 1 0 0 1 0 0 cm 153 116.148 6 6 re S Q 157.352 113.75 6 6 re f q 1 0 0 1 0 0 cm 157.352 113.75 6 6 re S Q 161.75 111.352 6 6 re f q 1 0 0 1 0 0 cm 161.75 111.352 6 6 re S Q 166.102 109.051 6 6 re f q 1 0 0 1 0 0 cm 166.102 109.051 6 6 re S Q 170.5 106.398 6 6 re f q 1 0 0 1 0 0 cm 170.5 106.398 6 6 re S Q 174.852 103.898 6 6 re f q 1 0 0 1 0 0 cm 174.852 103.898 6 6 re S Q 179.25 101.449 6 6 re f q 1 0 0 1 0 0 cm 179.25 101.449 6 6 re S Q 183.602 99.051 6 6 re f q 1 0 0 1 0 0 cm 183.602 99.051 6 6 re S Q 188 96.5 6 6 re f q 1 0 0 1 0 0 cm 188 96.5 6 6 re S Q 192.398 94.148 6 6 re f q 1 0 0 1 0 0 cm 192.398 94.148 6 6 re S Q 196.75 91.699 6 6 re f q 1 0 0 1 0 0 cm 196.75 91.699 6 6 re S Q 201.148 89.352 6 6 re f q 1 0 0 1 0 0 cm 201.148 89.352 6 6 re S Q 205.5 86.949 6 6 re f q 1 0 0 1 0 0 cm 205.5 86.949 6 6 re S Q 209.898 84.199 6 6 re f q 1 0 0 1 0 0 cm 209.898 84.199 6 6 re S Q 214.25 82.051 6 6 re f q 1 0 0 1 0 0 cm 214.25 82.051 6 6 re S Q 218.648 79.75 6 6 re f q 1 0 0 1 0 0 cm 218.648 79.75 6 6 re S Q 223 77 6 6 re f q 1 0 0 1 0 0 cm 223 77 6 6 re S Q 227.398 74.801 6 6 re f q 1 0 0 1 0 0 cm 227.398 74.801 6 6 re S Q 231.75 72.449 6 6 re f q 1 0 0 1 0 0 cm 231.75 72.449 6 6 re S Q 236.148 69.898 6 6 re f q 1 0 0 1 0 0 cm 236.148 69.898 6 6 re S Q 240.5 67.352 6 6 re f q 1 0 0 1 0 0 cm 240.5 67.352 6 6 re S Q 244.898 64.898 6 6 re f q 1 0 0 1 0 0 cm 244.898 64.898 6 6 re S Q 249.25 62.301 6 6 re f q 1 0 0 1 0 0 cm 249.25 62.301 6 6 re S Q 253.648 59.602 6 6 re f q 1 0 0 1 0 0 cm 253.648 59.602 6 6 re S Q 258 57.949 6 6 re f q 1 0 0 1 0 0 cm 258 57.949 6 6 re S Q 262.398 55.051 6 6 re f q 1 0 0 1 0 0 cm 262.398 55.051 6 6 re S Q 266.75 52.801 6 6 re f q 1 0 0 1 0 0 cm 266.75 52.801 6 6 re S Q 271.148 50.5 6 6 re f q 1 0 0 1 0 0 cm 271.148 50.5 6 6 re S Q 275.5 47.5 6 6 re f q 1 0 0 1 0 0 cm 275.5 47.5 6 6 re S Q 279.898 45.199 6 6 re f q 1 0 0 1 0 0 cm 279.898 45.199 6 6 re S Q 284.25 42.898 6 6 re f q 1 0 0 1 0 0 cm 284.25 42.898 6 6 re S Q 288.648 40.449 6 6 re f q 1 0 0 1 0 0 cm 288.648 40.449 6 6 re S Q 293 37.949 6 6 re f q 1 0 0 1 0 0 cm 293 37.949 6 6 re S Q 297.398 35.648 6 6 re f q 1 0 0 1 0 0 cm 297.398 35.648 6 6 re S Q 301.75 32.949 6 6 re f q 1 0 0 1 0 0 cm 301.75 32.949 6 6 re S Q 306.148 30.199 6 6 re f q 1 0 0 1 0 0 cm 306.148 30.199 6 6 re S Q 310.5 28.5 6 6 re f q 1 0 0 1 0 0 cm 310.5 28.5 6 6 re S Q 314.898 62.5 6 6 re f q 1 0 0 1 0 0 cm 314.898 62.5 6 6 re S Q 87.699 52.398 6 6 re f q 1 0 0 1 0 0 cm 87.699 52.398 6 6 re S Q 0 g BT 8 0 0 -8 58.25 67.725781 Tm /f-0-0 1 Tf [(25)-3(6)]TJ ET 0 0.447059 0.698039 rg q 1 0 0 1 0 0 cm 78.648 64.699 m 102.75 64.699 l S Q q 1 0 0 1 0 0 cm 42.25 183.352 m 46.602 180.852 l 51 178.398 l 55.352 175.949 l 59.75 173.551 l 64.102 171.102 l 68.5 168.648 l 72.852 166.301 l 77.25 163.801 l 81.602 161.449 l 86 158.949 l 90.352 156.551 l 94.75 154.102 l 99.102 151.75 l 103.5 149.449 l 107.852 146.898 l 112.25 144.398 l 116.602 142.102 l 121 139.801 l 125.352 137.352 l 129.75 134.75 l 134.102 132.449 l 138.5 130.199 l 142.852 127.699 l 147.25 125.352 l 151.602 122.949 l 156 120.449 l 160.352 118.199 l 164.75 115.199 l 169.102 113.352 l 173.5 110.949 l 177.852 108.148 l 182.25 105.75 l 186.602 103.648 l 191 101.148 l 195.398 98.801 l 199.75 96.199 l 204.148 94 l 208.5 91.449 l 212.898 89.051 l 217.25 87.199 l 221.648 84.75 l 226 81.699 l 230.398 79.852 l 234.75 77.051 l 239.148 75 l 243.5 72.25 l 247.898 70 l 252.25 67.352 l 256.648 65.25 l 261 63.852 l 265.398 61.25 l 269.75 58.602 l 274.148 56.199 l 278.5 53.25 l 282.898 51.102 l 287.25 49.301 l 291.648 46.551 l 296 43.648 l 300.398 96.551 l 304.75 39.102 l 309.148 36.449 l 313.5 97.699 l 317.898 143.25 l S Q q 1 0 0 1 0 0 cm 45.25 183.352 m 45.25 187.352 39.25 187.352 39.25 183.352 c 39.25 179.352 45.25 179.352 45.25 183.352 c S Q q 1 0 0 1 0 0 cm 49.602 180.852 m 49.602 184.852 43.602 184.852 43.602 180.852 c 43.602 176.852 49.602 176.852 49.602 180.852 c S Q q 1 0 0 1 0 0 cm 54 178.398 m 54 182.398 48 182.398 48 178.398 c 48 174.398 54 174.398 54 178.398 c S Q q 1 0 0 1 0 0 cm 58.352 175.949 m 58.352 179.949 52.352 179.949 52.352 175.949 c 52.352 171.949 58.352 171.949 58.352 175.949 c S Q q 1 0 0 1 0 0 cm 62.75 173.551 m 62.75 177.551 56.75 177.551 56.75 173.551 c 56.75 169.551 62.75 169.551 62.75 173.551 c S Q q 1 0 0 1 0 0 cm 67.102 171.102 m 67.102 175.102 61.102 175.102 61.102 171.102 c 61.102 167.102 67.102 167.102 67.102 171.102 c S Q q 1 0 0 1 0 0 cm 71.5 168.648 m 71.5 172.648 65.5 172.648 65.5 168.648 c 65.5 164.648 71.5 164.648 71.5 168.648 c S Q q 1 0 0 1 0 0 cm 75.852 166.301 m 75.852 170.301 69.852 170.301 69.852 166.301 c 69.852 162.301 75.852 162.301 75.852 166.301 c S Q q 1 0 0 1 0 0 cm 80.25 163.801 m 80.25 167.801 74.25 167.801 74.25 163.801 c 74.25 159.801 80.25 159.801 80.25 163.801 c S Q q 1 0 0 1 0 0 cm 84.602 161.449 m 84.602 165.449 78.602 165.449 78.602 161.449 c 78.602 157.449 84.602 157.449 84.602 161.449 c S Q q 1 0 0 1 0 0 cm 89 158.949 m 89 162.949 83 162.949 83 158.949 c 83 154.949 89 154.949 89 158.949 c S Q q 1 0 0 1 0 0 cm 93.352 156.551 m 93.352 160.551 87.352 160.551 87.352 156.551 c 87.352 152.551 93.352 152.551 93.352 156.551 c S Q q 1 0 0 1 0 0 cm 97.75 154.102 m 97.75 158.102 91.75 158.102 91.75 154.102 c 91.75 150.102 97.75 150.102 97.75 154.102 c S Q q 1 0 0 1 0 0 cm 102.102 151.75 m 102.102 155.75 96.102 155.75 96.102 151.75 c 96.102 147.75 102.102 147.75 102.102 151.75 c S Q q 1 0 0 1 0 0 cm 106.5 149.449 m 106.5 153.449 100.5 153.449 100.5 149.449 c 100.5 145.449 106.5 145.449 106.5 149.449 c S Q q 1 0 0 1 0 0 cm 110.852 146.898 m 110.852 150.898 104.852 150.898 104.852 146.898 c 104.852 142.898 110.852 142.898 110.852 146.898 c S Q q 1 0 0 1 0 0 cm 115.25 144.398 m 115.25 148.398 109.25 148.398 109.25 144.398 c 109.25 140.398 115.25 140.398 115.25 144.398 c S Q q 1 0 0 1 0 0 cm 119.602 142.102 m 119.602 146.102 113.602 146.102 113.602 142.102 c 113.602 138.102 119.602 138.102 119.602 142.102 c S Q q 1 0 0 1 0 0 cm 124 139.801 m 124 143.801 118 143.801 118 139.801 c 118 135.801 124 135.801 124 139.801 c S Q q 1 0 0 1 0 0 cm 128.352 137.352 m 128.352 141.352 122.352 141.352 122.352 137.352 c 122.352 133.352 128.352 133.352 128.352 137.352 c S Q q 1 0 0 1 0 0 cm 132.75 134.75 m 132.75 138.75 126.75 138.75 126.75 134.75 c 126.75 130.75 132.75 130.75 132.75 134.75 c S Q q 1 0 0 1 0 0 cm 137.102 132.449 m 137.102 136.449 131.102 136.449 131.102 132.449 c 131.102 128.449 137.102 128.449 137.102 132.449 c S Q q 1 0 0 1 0 0 cm 141.5 130.199 m 141.5 134.199 135.5 134.199 135.5 130.199 c 135.5 126.199 141.5 126.199 141.5 130.199 c S Q q 1 0 0 1 0 0 cm 145.852 127.699 m 145.852 131.699 139.852 131.699 139.852 127.699 c 139.852 123.699 145.852 123.699 145.852 127.699 c S Q q 1 0 0 1 0 0 cm 150.25 125.352 m 150.25 129.352 144.25 129.352 144.25 125.352 c 144.25 121.352 150.25 121.352 150.25 125.352 c S Q q 1 0 0 1 0 0 cm 154.602 122.949 m 154.602 126.949 148.602 126.949 148.602 122.949 c 148.602 118.949 154.602 118.949 154.602 122.949 c S Q q 1 0 0 1 0 0 cm 159 120.449 m 159 124.449 153 124.449 153 120.449 c 153 116.449 159 116.449 159 120.449 c S Q q 1 0 0 1 0 0 cm 163.352 118.199 m 163.352 122.199 157.352 122.199 157.352 118.199 c 157.352 114.199 163.352 114.199 163.352 118.199 c S Q q 1 0 0 1 0 0 cm 167.75 115.199 m 167.75 119.199 161.75 119.199 161.75 115.199 c 161.75 111.199 167.75 111.199 167.75 115.199 c S Q q 1 0 0 1 0 0 cm 172.102 113.352 m 172.102 117.352 166.102 117.352 166.102 113.352 c 166.102 109.352 172.102 109.352 172.102 113.352 c S Q q 1 0 0 1 0 0 cm 176.5 110.949 m 176.5 114.949 170.5 114.949 170.5 110.949 c 170.5 106.949 176.5 106.949 176.5 110.949 c S Q q 1 0 0 1 0 0 cm 180.852 108.148 m 180.852 112.148 174.852 112.148 174.852 108.148 c 174.852 104.148 180.852 104.148 180.852 108.148 c S Q q 1 0 0 1 0 0 cm 185.25 105.75 m 185.25 109.75 179.25 109.75 179.25 105.75 c 179.25 101.75 185.25 101.75 185.25 105.75 c S Q q 1 0 0 1 0 0 cm 189.602 103.648 m 189.602 107.648 183.602 107.648 183.602 103.648 c 183.602 99.648 189.602 99.648 189.602 103.648 c S Q q 1 0 0 1 0 0 cm 194 101.148 m 194 105.148 188 105.148 188 101.148 c 188 97.148 194 97.148 194 101.148 c S Q q 1 0 0 1 0 0 cm 198.398 98.801 m 198.398 102.801 192.398 102.801 192.398 98.801 c 192.398 94.801 198.398 94.801 198.398 98.801 c S Q q 1 0 0 1 0 0 cm 202.75 96.199 m 202.75 100.199 196.75 100.199 196.75 96.199 c 196.75 92.199 202.75 92.199 202.75 96.199 c S Q q 1 0 0 1 0 0 cm 207.148 94 m 207.148 98 201.148 98 201.148 94 c 201.148 90 207.148 90 207.148 94 c S Q q 1 0 0 1 0 0 cm 211.5 91.449 m 211.5 95.449 205.5 95.449 205.5 91.449 c 205.5 87.449 211.5 87.449 211.5 91.449 c S Q q 1 0 0 1 0 0 cm 215.898 89.051 m 215.898 93.051 209.898 93.051 209.898 89.051 c 209.898 85.051 215.898 85.051 215.898 89.051 c S Q q 1 0 0 1 0 0 cm 220.25 87.199 m 220.25 91.199 214.25 91.199 214.25 87.199 c 214.25 83.199 220.25 83.199 220.25 87.199 c S Q q 1 0 0 1 0 0 cm 224.648 84.75 m 224.648 88.75 218.648 88.75 218.648 84.75 c 218.648 80.75 224.648 80.75 224.648 84.75 c S Q q 1 0 0 1 0 0 cm 229 81.699 m 229 85.699 223 85.699 223 81.699 c 223 77.699 229 77.699 229 81.699 c S Q q 1 0 0 1 0 0 cm 233.398 79.852 m 233.398 83.852 227.398 83.852 227.398 79.852 c 227.398 75.852 233.398 75.852 233.398 79.852 c S Q q 1 0 0 1 0 0 cm 237.75 77.051 m 237.75 81.051 231.75 81.051 231.75 77.051 c 231.75 73.051 237.75 73.051 237.75 77.051 c S Q q 1 0 0 1 0 0 cm 242.148 75 m 242.148 79 236.148 79 236.148 75 c 236.148 71 242.148 71 242.148 75 c S Q q 1 0 0 1 0 0 cm 246.5 72.25 m 246.5 76.25 240.5 76.25 240.5 72.25 c 240.5 68.25 246.5 68.25 246.5 72.25 c S Q q 1 0 0 1 0 0 cm 250.898 70 m 250.898 74 244.898 74 244.898 70 c 244.898 66 250.898 66 250.898 70 c S Q q 1 0 0 1 0 0 cm 255.25 67.352 m 255.25 71.352 249.25 71.352 249.25 67.352 c 249.25 63.352 255.25 63.352 255.25 67.352 c S Q q 1 0 0 1 0 0 cm 259.648 65.25 m 259.648 69.25 253.648 69.25 253.648 65.25 c 253.648 61.25 259.648 61.25 259.648 65.25 c S Q q 1 0 0 1 0 0 cm 264 63.852 m 264 67.852 258 67.852 258 63.852 c 258 59.852 264 59.852 264 63.852 c S Q q 1 0 0 1 0 0 cm 268.398 61.25 m 268.398 65.25 262.398 65.25 262.398 61.25 c 262.398 57.25 268.398 57.25 268.398 61.25 c S Q q 1 0 0 1 0 0 cm 272.75 58.602 m 272.75 62.602 266.75 62.602 266.75 58.602 c 266.75 54.602 272.75 54.602 272.75 58.602 c S Q q 1 0 0 1 0 0 cm 277.148 56.199 m 277.148 60.199 271.148 60.199 271.148 56.199 c 271.148 52.199 277.148 52.199 277.148 56.199 c S Q q 1 0 0 1 0 0 cm 281.5 53.25 m 281.5 57.25 275.5 57.25 275.5 53.25 c 275.5 49.25 281.5 49.25 281.5 53.25 c S Q q 1 0 0 1 0 0 cm 285.898 51.102 m 285.898 55.102 279.898 55.102 279.898 51.102 c 279.898 47.102 285.898 47.102 285.898 51.102 c S Q q 1 0 0 1 0 0 cm 290.25 49.301 m 290.25 53.301 284.25 53.301 284.25 49.301 c 284.25 45.301 290.25 45.301 290.25 49.301 c S Q q 1 0 0 1 0 0 cm 294.648 46.551 m 294.648 50.551 288.648 50.551 288.648 46.551 c 288.648 42.551 294.648 42.551 294.648 46.551 c S Q q 1 0 0 1 0 0 cm 299 43.648 m 299 47.648 293 47.648 293 43.648 c 293 39.648 299 39.648 299 43.648 c S Q q 1 0 0 1 0 0 cm 303.398 96.551 m 303.398 100.551 297.398 100.551 297.398 96.551 c 297.398 92.551 303.398 92.551 303.398 96.551 c S Q q 1 0 0 1 0 0 cm 307.75 39.102 m 307.75 43.102 301.75 43.102 301.75 39.102 c 301.75 35.102 307.75 35.102 307.75 39.102 c S Q q 1 0 0 1 0 0 cm 312.148 36.449 m 312.148 40.449 306.148 40.449 306.148 36.449 c 306.148 32.449 312.148 32.449 312.148 36.449 c S Q q 1 0 0 1 0 0 cm 316.5 97.699 m 316.5 101.699 310.5 101.699 310.5 97.699 c 310.5 93.699 316.5 93.699 316.5 97.699 c S Q q 1 0 0 1 0 0 cm 320.898 143.25 m 320.898 147.25 314.898 147.25 314.898 143.25 c 314.898 139.25 320.898 139.25 320.898 143.25 c S Q q 1 0 0 1 0 0 cm 93.699 64.699 m 93.699 68.699 87.699 68.699 87.699 64.699 c 87.699 60.699 93.699 60.699 93.699 64.699 c S Q 0 g BT 8 0 0 -8 58.25 77.025781 Tm /f-0-0 1 Tf [(12)-3(8)]TJ ET 0.898039 0.117647 0.0627451 rg q 1 0 0 1 0 0 cm 78.648 74 m 102.75 74 l S Q q 1 0 0 1 0 0 cm 42.25 183.352 m 46.602 180.949 l 51 178.602 l 55.352 176.199 l 59.75 173.898 l 64.102 171.5 l 68.5 169.148 l 72.852 166.801 l 77.25 164.25 l 81.602 162.102 l 86 159.801 l 90.352 157.398 l 94.75 155 l 99.102 152.898 l 103.5 150.699 l 107.852 148.199 l 112.25 145.648 l 116.602 143.398 l 121 140.949 l 125.352 138.699 l 129.75 136.398 l 134.102 133.801 l 138.5 131.801 l 142.852 129.551 l 147.25 127 l 151.602 124.949 l 156 122.699 l 160.352 120.301 l 164.75 117.699 l 169.102 116.102 l 173.5 114.648 l 177.852 111.051 l 182.25 109.102 l 186.602 124.75 l 191 104.25 l 195.398 139.5 l 199.75 139.5 l 204.148 139.602 l 208.5 139.602 l 212.898 130.199 l 217.25 140.051 l 221.648 141.301 l 226 131.051 l 230.398 141.051 l 234.75 140.352 l 239.148 143.051 l 243.5 143.398 l 247.898 131.199 l 252.25 131.648 l 256.648 130.898 l 261 141.199 l 265.398 130.449 l 269.75 143.75 l 274.148 142.551 l 278.5 130.898 l 282.898 131.648 l 287.25 145.801 l 291.648 132.898 l 296 132.449 l 300.398 144.852 l 304.75 133.699 l 309.148 132.352 l 313.5 165 l 317.898 170.102 l S Q 45.25 183.352 m 45.25 187.352 39.25 187.352 39.25 183.352 c 39.25 179.352 45.25 179.352 45.25 183.352 c f q 1 0 0 1 0 0 cm 45.25 183.352 m 45.25 187.352 39.25 187.352 39.25 183.352 c 39.25 179.352 45.25 179.352 45.25 183.352 c S Q 49.602 180.949 m 49.602 184.949 43.602 184.949 43.602 180.949 c 43.602 176.949 49.602 176.949 49.602 180.949 c f q 1 0 0 1 0 0 cm 49.602 180.949 m 49.602 184.949 43.602 184.949 43.602 180.949 c 43.602 176.949 49.602 176.949 49.602 180.949 c S Q 54 178.602 m 54 182.602 48 182.602 48 178.602 c 48 174.602 54 174.602 54 178.602 c f q 1 0 0 1 0 0 cm 54 178.602 m 54 182.602 48 182.602 48 178.602 c 48 174.602 54 174.602 54 178.602 c S Q 58.352 176.199 m 58.352 180.199 52.352 180.199 52.352 176.199 c 52.352 172.199 58.352 172.199 58.352 176.199 c f q 1 0 0 1 0 0 cm 58.352 176.199 m 58.352 180.199 52.352 180.199 52.352 176.199 c 52.352 172.199 58.352 172.199 58.352 176.199 c S Q 62.75 173.898 m 62.75 177.898 56.75 177.898 56.75 173.898 c 56.75 169.898 62.75 169.898 62.75 173.898 c f q 1 0 0 1 0 0 cm 62.75 173.898 m 62.75 177.898 56.75 177.898 56.75 173.898 c 56.75 169.898 62.75 169.898 62.75 173.898 c S Q 67.102 171.5 m 67.102 175.5 61.102 175.5 61.102 171.5 c 61.102 167.5 67.102 167.5 67.102 171.5 c f q 1 0 0 1 0 0 cm 67.102 171.5 m 67.102 175.5 61.102 175.5 61.102 171.5 c 61.102 167.5 67.102 167.5 67.102 171.5 c S Q 71.5 169.148 m 71.5 173.148 65.5 173.148 65.5 169.148 c 65.5 165.148 71.5 165.148 71.5 169.148 c f q 1 0 0 1 0 0 cm 71.5 169.148 m 71.5 173.148 65.5 173.148 65.5 169.148 c 65.5 165.148 71.5 165.148 71.5 169.148 c S Q 75.852 166.801 m 75.852 170.801 69.852 170.801 69.852 166.801 c 69.852 162.801 75.852 162.801 75.852 166.801 c f q 1 0 0 1 0 0 cm 75.852 166.801 m 75.852 170.801 69.852 170.801 69.852 166.801 c 69.852 162.801 75.852 162.801 75.852 166.801 c S Q 80.25 164.25 m 80.25 168.25 74.25 168.25 74.25 164.25 c 74.25 160.25 80.25 160.25 80.25 164.25 c f q 1 0 0 1 0 0 cm 80.25 164.25 m 80.25 168.25 74.25 168.25 74.25 164.25 c 74.25 160.25 80.25 160.25 80.25 164.25 c S Q 84.602 162.102 m 84.602 166.102 78.602 166.102 78.602 162.102 c 78.602 158.102 84.602 158.102 84.602 162.102 c f q 1 0 0 1 0 0 cm 84.602 162.102 m 84.602 166.102 78.602 166.102 78.602 162.102 c 78.602 158.102 84.602 158.102 84.602 162.102 c S Q 89 159.801 m 89 163.801 83 163.801 83 159.801 c 83 155.801 89 155.801 89 159.801 c f q 1 0 0 1 0 0 cm 89 159.801 m 89 163.801 83 163.801 83 159.801 c 83 155.801 89 155.801 89 159.801 c S Q 93.352 157.398 m 93.352 161.398 87.352 161.398 87.352 157.398 c 87.352 153.398 93.352 153.398 93.352 157.398 c f q 1 0 0 1 0 0 cm 93.352 157.398 m 93.352 161.398 87.352 161.398 87.352 157.398 c 87.352 153.398 93.352 153.398 93.352 157.398 c S Q 97.75 155 m 97.75 159 91.75 159 91.75 155 c 91.75 151 97.75 151 97.75 155 c f q 1 0 0 1 0 0 cm 97.75 155 m 97.75 159 91.75 159 91.75 155 c 91.75 151 97.75 151 97.75 155 c S Q 102.102 152.898 m 102.102 156.898 96.102 156.898 96.102 152.898 c 96.102 148.898 102.102 148.898 102.102 152.898 c f q 1 0 0 1 0 0 cm 102.102 152.898 m 102.102 156.898 96.102 156.898 96.102 152.898 c 96.102 148.898 102.102 148.898 102.102 152.898 c S Q 106.5 150.699 m 106.5 154.699 100.5 154.699 100.5 150.699 c 100.5 146.699 106.5 146.699 106.5 150.699 c f q 1 0 0 1 0 0 cm 106.5 150.699 m 106.5 154.699 100.5 154.699 100.5 150.699 c 100.5 146.699 106.5 146.699 106.5 150.699 c S Q 110.852 148.199 m 110.852 152.199 104.852 152.199 104.852 148.199 c 104.852 144.199 110.852 144.199 110.852 148.199 c f q 1 0 0 1 0 0 cm 110.852 148.199 m 110.852 152.199 104.852 152.199 104.852 148.199 c 104.852 144.199 110.852 144.199 110.852 148.199 c S Q 115.25 145.648 m 115.25 149.648 109.25 149.648 109.25 145.648 c 109.25 141.648 115.25 141.648 115.25 145.648 c f q 1 0 0 1 0 0 cm 115.25 145.648 m 115.25 149.648 109.25 149.648 109.25 145.648 c 109.25 141.648 115.25 141.648 115.25 145.648 c S Q 119.602 143.398 m 119.602 147.398 113.602 147.398 113.602 143.398 c 113.602 139.398 119.602 139.398 119.602 143.398 c f q 1 0 0 1 0 0 cm 119.602 143.398 m 119.602 147.398 113.602 147.398 113.602 143.398 c 113.602 139.398 119.602 139.398 119.602 143.398 c S Q 124 140.949 m 124 144.949 118 144.949 118 140.949 c 118 136.949 124 136.949 124 140.949 c f q 1 0 0 1 0 0 cm 124 140.949 m 124 144.949 118 144.949 118 140.949 c 118 136.949 124 136.949 124 140.949 c S Q 128.352 138.699 m 128.352 142.699 122.352 142.699 122.352 138.699 c 122.352 134.699 128.352 134.699 128.352 138.699 c f q 1 0 0 1 0 0 cm 128.352 138.699 m 128.352 142.699 122.352 142.699 122.352 138.699 c 122.352 134.699 128.352 134.699 128.352 138.699 c S Q 132.75 136.398 m 132.75 140.398 126.75 140.398 126.75 136.398 c 126.75 132.398 132.75 132.398 132.75 136.398 c f q 1 0 0 1 0 0 cm 132.75 136.398 m 132.75 140.398 126.75 140.398 126.75 136.398 c 126.75 132.398 132.75 132.398 132.75 136.398 c S Q 137.102 133.801 m 137.102 137.801 131.102 137.801 131.102 133.801 c 131.102 129.801 137.102 129.801 137.102 133.801 c f q 1 0 0 1 0 0 cm 137.102 133.801 m 137.102 137.801 131.102 137.801 131.102 133.801 c 131.102 129.801 137.102 129.801 137.102 133.801 c S Q 141.5 131.801 m 141.5 135.801 135.5 135.801 135.5 131.801 c 135.5 127.801 141.5 127.801 141.5 131.801 c f q 1 0 0 1 0 0 cm 141.5 131.801 m 141.5 135.801 135.5 135.801 135.5 131.801 c 135.5 127.801 141.5 127.801 141.5 131.801 c S Q 145.852 129.551 m 145.852 133.551 139.852 133.551 139.852 129.551 c 139.852 125.551 145.852 125.551 145.852 129.551 c f q 1 0 0 1 0 0 cm 145.852 129.551 m 145.852 133.551 139.852 133.551 139.852 129.551 c 139.852 125.551 145.852 125.551 145.852 129.551 c S Q 150.25 127 m 150.25 131 144.25 131 144.25 127 c 144.25 123 150.25 123 150.25 127 c f q 1 0 0 1 0 0 cm 150.25 127 m 150.25 131 144.25 131 144.25 127 c 144.25 123 150.25 123 150.25 127 c S Q 154.602 124.949 m 154.602 128.949 148.602 128.949 148.602 124.949 c 148.602 120.949 154.602 120.949 154.602 124.949 c f q 1 0 0 1 0 0 cm 154.602 124.949 m 154.602 128.949 148.602 128.949 148.602 124.949 c 148.602 120.949 154.602 120.949 154.602 124.949 c S Q 159 122.699 m 159 126.699 153 126.699 153 122.699 c 153 118.699 159 118.699 159 122.699 c f q 1 0 0 1 0 0 cm 159 122.699 m 159 126.699 153 126.699 153 122.699 c 153 118.699 159 118.699 159 122.699 c S Q 163.352 120.301 m 163.352 124.301 157.352 124.301 157.352 120.301 c 157.352 116.301 163.352 116.301 163.352 120.301 c f q 1 0 0 1 0 0 cm 163.352 120.301 m 163.352 124.301 157.352 124.301 157.352 120.301 c 157.352 116.301 163.352 116.301 163.352 120.301 c S Q 167.75 117.699 m 167.75 121.699 161.75 121.699 161.75 117.699 c 161.75 113.699 167.75 113.699 167.75 117.699 c f q 1 0 0 1 0 0 cm 167.75 117.699 m 167.75 121.699 161.75 121.699 161.75 117.699 c 161.75 113.699 167.75 113.699 167.75 117.699 c S Q 172.102 116.102 m 172.102 120.102 166.102 120.102 166.102 116.102 c 166.102 112.102 172.102 112.102 172.102 116.102 c f q 1 0 0 1 0 0 cm 172.102 116.102 m 172.102 120.102 166.102 120.102 166.102 116.102 c 166.102 112.102 172.102 112.102 172.102 116.102 c S Q 176.5 114.648 m 176.5 118.648 170.5 118.648 170.5 114.648 c 170.5 110.648 176.5 110.648 176.5 114.648 c f q 1 0 0 1 0 0 cm 176.5 114.648 m 176.5 118.648 170.5 118.648 170.5 114.648 c 170.5 110.648 176.5 110.648 176.5 114.648 c S Q 180.852 111.051 m 180.852 115.051 174.852 115.051 174.852 111.051 c 174.852 107.051 180.852 107.051 180.852 111.051 c f q 1 0 0 1 0 0 cm 180.852 111.051 m 180.852 115.051 174.852 115.051 174.852 111.051 c 174.852 107.051 180.852 107.051 180.852 111.051 c S Q 185.25 109.102 m 185.25 113.102 179.25 113.102 179.25 109.102 c 179.25 105.102 185.25 105.102 185.25 109.102 c f q 1 0 0 1 0 0 cm 185.25 109.102 m 185.25 113.102 179.25 113.102 179.25 109.102 c 179.25 105.102 185.25 105.102 185.25 109.102 c S Q 189.602 124.75 m 189.602 128.75 183.602 128.75 183.602 124.75 c 183.602 120.75 189.602 120.75 189.602 124.75 c f q 1 0 0 1 0 0 cm 189.602 124.75 m 189.602 128.75 183.602 128.75 183.602 124.75 c 183.602 120.75 189.602 120.75 189.602 124.75 c S Q 194 104.25 m 194 108.25 188 108.25 188 104.25 c 188 100.25 194 100.25 194 104.25 c f q 1 0 0 1 0 0 cm 194 104.25 m 194 108.25 188 108.25 188 104.25 c 188 100.25 194 100.25 194 104.25 c S Q 198.398 139.5 m 198.398 143.5 192.398 143.5 192.398 139.5 c 192.398 135.5 198.398 135.5 198.398 139.5 c f q 1 0 0 1 0 0 cm 198.398 139.5 m 198.398 143.5 192.398 143.5 192.398 139.5 c 192.398 135.5 198.398 135.5 198.398 139.5 c S Q 202.75 139.5 m 202.75 143.5 196.75 143.5 196.75 139.5 c 196.75 135.5 202.75 135.5 202.75 139.5 c f q 1 0 0 1 0 0 cm 202.75 139.5 m 202.75 143.5 196.75 143.5 196.75 139.5 c 196.75 135.5 202.75 135.5 202.75 139.5 c S Q 207.148 139.602 m 207.148 143.602 201.148 143.602 201.148 139.602 c 201.148 135.602 207.148 135.602 207.148 139.602 c f q 1 0 0 1 0 0 cm 207.148 139.602 m 207.148 143.602 201.148 143.602 201.148 139.602 c 201.148 135.602 207.148 135.602 207.148 139.602 c S Q 211.5 139.602 m 211.5 143.602 205.5 143.602 205.5 139.602 c 205.5 135.602 211.5 135.602 211.5 139.602 c f q 1 0 0 1 0 0 cm 211.5 139.602 m 211.5 143.602 205.5 143.602 205.5 139.602 c 205.5 135.602 211.5 135.602 211.5 139.602 c S Q 215.898 130.199 m 215.898 134.199 209.898 134.199 209.898 130.199 c 209.898 126.199 215.898 126.199 215.898 130.199 c f q 1 0 0 1 0 0 cm 215.898 130.199 m 215.898 134.199 209.898 134.199 209.898 130.199 c 209.898 126.199 215.898 126.199 215.898 130.199 c S Q 220.25 140.051 m 220.25 144.051 214.25 144.051 214.25 140.051 c 214.25 136.051 220.25 136.051 220.25 140.051 c f q 1 0 0 1 0 0 cm 220.25 140.051 m 220.25 144.051 214.25 144.051 214.25 140.051 c 214.25 136.051 220.25 136.051 220.25 140.051 c S Q 224.648 141.301 m 224.648 145.301 218.648 145.301 218.648 141.301 c 218.648 137.301 224.648 137.301 224.648 141.301 c f q 1 0 0 1 0 0 cm 224.648 141.301 m 224.648 145.301 218.648 145.301 218.648 141.301 c 218.648 137.301 224.648 137.301 224.648 141.301 c S Q 229 131.051 m 229 135.051 223 135.051 223 131.051 c 223 127.051 229 127.051 229 131.051 c f q 1 0 0 1 0 0 cm 229 131.051 m 229 135.051 223 135.051 223 131.051 c 223 127.051 229 127.051 229 131.051 c S Q 233.398 141.051 m 233.398 145.051 227.398 145.051 227.398 141.051 c 227.398 137.051 233.398 137.051 233.398 141.051 c f q 1 0 0 1 0 0 cm 233.398 141.051 m 233.398 145.051 227.398 145.051 227.398 141.051 c 227.398 137.051 233.398 137.051 233.398 141.051 c S Q 237.75 140.352 m 237.75 144.352 231.75 144.352 231.75 140.352 c 231.75 136.352 237.75 136.352 237.75 140.352 c f q 1 0 0 1 0 0 cm 237.75 140.352 m 237.75 144.352 231.75 144.352 231.75 140.352 c 231.75 136.352 237.75 136.352 237.75 140.352 c S Q 242.148 143.051 m 242.148 147.051 236.148 147.051 236.148 143.051 c 236.148 139.051 242.148 139.051 242.148 143.051 c f q 1 0 0 1 0 0 cm 242.148 143.051 m 242.148 147.051 236.148 147.051 236.148 143.051 c 236.148 139.051 242.148 139.051 242.148 143.051 c S Q 246.5 143.398 m 246.5 147.398 240.5 147.398 240.5 143.398 c 240.5 139.398 246.5 139.398 246.5 143.398 c f q 1 0 0 1 0 0 cm 246.5 143.398 m 246.5 147.398 240.5 147.398 240.5 143.398 c 240.5 139.398 246.5 139.398 246.5 143.398 c S Q 250.898 131.199 m 250.898 135.199 244.898 135.199 244.898 131.199 c 244.898 127.199 250.898 127.199 250.898 131.199 c f q 1 0 0 1 0 0 cm 250.898 131.199 m 250.898 135.199 244.898 135.199 244.898 131.199 c 244.898 127.199 250.898 127.199 250.898 131.199 c S Q 255.25 131.648 m 255.25 135.648 249.25 135.648 249.25 131.648 c 249.25 127.648 255.25 127.648 255.25 131.648 c f q 1 0 0 1 0 0 cm 255.25 131.648 m 255.25 135.648 249.25 135.648 249.25 131.648 c 249.25 127.648 255.25 127.648 255.25 131.648 c S Q 259.648 130.898 m 259.648 134.898 253.648 134.898 253.648 130.898 c 253.648 126.898 259.648 126.898 259.648 130.898 c f q 1 0 0 1 0 0 cm 259.648 130.898 m 259.648 134.898 253.648 134.898 253.648 130.898 c 253.648 126.898 259.648 126.898 259.648 130.898 c S Q 264 141.199 m 264 145.199 258 145.199 258 141.199 c 258 137.199 264 137.199 264 141.199 c f q 1 0 0 1 0 0 cm 264 141.199 m 264 145.199 258 145.199 258 141.199 c 258 137.199 264 137.199 264 141.199 c S Q 268.398 130.449 m 268.398 134.449 262.398 134.449 262.398 130.449 c 262.398 126.449 268.398 126.449 268.398 130.449 c f q 1 0 0 1 0 0 cm 268.398 130.449 m 268.398 134.449 262.398 134.449 262.398 130.449 c 262.398 126.449 268.398 126.449 268.398 130.449 c S Q 272.75 143.75 m 272.75 147.75 266.75 147.75 266.75 143.75 c 266.75 139.75 272.75 139.75 272.75 143.75 c f q 1 0 0 1 0 0 cm 272.75 143.75 m 272.75 147.75 266.75 147.75 266.75 143.75 c 266.75 139.75 272.75 139.75 272.75 143.75 c S Q 277.148 142.551 m 277.148 146.551 271.148 146.551 271.148 142.551 c 271.148 138.551 277.148 138.551 277.148 142.551 c f q 1 0 0 1 0 0 cm 277.148 142.551 m 277.148 146.551 271.148 146.551 271.148 142.551 c 271.148 138.551 277.148 138.551 277.148 142.551 c S Q 281.5 130.898 m 281.5 134.898 275.5 134.898 275.5 130.898 c 275.5 126.898 281.5 126.898 281.5 130.898 c f q 1 0 0 1 0 0 cm 281.5 130.898 m 281.5 134.898 275.5 134.898 275.5 130.898 c 275.5 126.898 281.5 126.898 281.5 130.898 c S Q 285.898 131.648 m 285.898 135.648 279.898 135.648 279.898 131.648 c 279.898 127.648 285.898 127.648 285.898 131.648 c f q 1 0 0 1 0 0 cm 285.898 131.648 m 285.898 135.648 279.898 135.648 279.898 131.648 c 279.898 127.648 285.898 127.648 285.898 131.648 c S Q 290.25 145.801 m 290.25 149.801 284.25 149.801 284.25 145.801 c 284.25 141.801 290.25 141.801 290.25 145.801 c f q 1 0 0 1 0 0 cm 290.25 145.801 m 290.25 149.801 284.25 149.801 284.25 145.801 c 284.25 141.801 290.25 141.801 290.25 145.801 c S Q 294.648 132.898 m 294.648 136.898 288.648 136.898 288.648 132.898 c 288.648 128.898 294.648 128.898 294.648 132.898 c f q 1 0 0 1 0 0 cm 294.648 132.898 m 294.648 136.898 288.648 136.898 288.648 132.898 c 288.648 128.898 294.648 128.898 294.648 132.898 c S Q 299 132.449 m 299 136.449 293 136.449 293 132.449 c 293 128.449 299 128.449 299 132.449 c f q 1 0 0 1 0 0 cm 299 132.449 m 299 136.449 293 136.449 293 132.449 c 293 128.449 299 128.449 299 132.449 c S Q 303.398 144.852 m 303.398 148.852 297.398 148.852 297.398 144.852 c 297.398 140.852 303.398 140.852 303.398 144.852 c f q 1 0 0 1 0 0 cm 303.398 144.852 m 303.398 148.852 297.398 148.852 297.398 144.852 c 297.398 140.852 303.398 140.852 303.398 144.852 c S Q 307.75 133.699 m 307.75 137.699 301.75 137.699 301.75 133.699 c 301.75 129.699 307.75 129.699 307.75 133.699 c f q 1 0 0 1 0 0 cm 307.75 133.699 m 307.75 137.699 301.75 137.699 301.75 133.699 c 301.75 129.699 307.75 129.699 307.75 133.699 c S Q 312.148 132.352 m 312.148 136.352 306.148 136.352 306.148 132.352 c 306.148 128.352 312.148 128.352 312.148 132.352 c f q 1 0 0 1 0 0 cm 312.148 132.352 m 312.148 136.352 306.148 136.352 306.148 132.352 c 306.148 128.352 312.148 128.352 312.148 132.352 c S Q 316.5 165 m 316.5 169 310.5 169 310.5 165 c 310.5 161 316.5 161 316.5 165 c f q 1 0 0 1 0 0 cm 316.5 165 m 316.5 169 310.5 169 310.5 165 c 310.5 161 316.5 161 316.5 165 c S Q 320.898 170.102 m 320.898 174.102 314.898 174.102 314.898 170.102 c 314.898 166.102 320.898 166.102 320.898 170.102 c f q 1 0 0 1 0 0 cm 320.898 170.102 m 320.898 174.102 314.898 174.102 314.898 170.102 c 314.898 166.102 320.898 166.102 320.898 170.102 c S Q 93.699 74 m 93.699 78 87.699 78 87.699 74 c 87.699 70 93.699 70 93.699 74 c f q 1 0 0 1 0 0 cm 93.699 74 m 93.699 78 87.699 78 87.699 74 c 87.699 70 93.699 70 93.699 74 c S Q 0 g BT 8 0 0 -8 63.35 86.325781 Tm /f-0-0 1 Tf [(64)]TJ ET q 1 0 0 1 0 0 cm 78.648 83.301 m 102.75 83.301 l S Q q 1 0 0 1 0 0 cm 42.25 183.449 m 46.602 181.148 l 51 178.898 l 55.352 176.699 l 59.75 174.449 l 64.102 171.949 l 68.5 169.949 l 72.852 167.551 l 77.25 165.5 l 81.602 163.199 l 86 161.551 l 90.352 158.852 l 94.75 156.75 l 99.102 154.648 l 103.5 152.551 l 107.852 150.75 l 112.25 161.648 l 116.602 147.949 l 121 161.398 l 125.352 161.699 l 129.75 162.051 l 134.102 159.051 l 138.5 162.352 l 142.852 162.949 l 147.25 162.301 l 151.602 158.199 l 156 158.352 l 160.352 162.199 l 164.75 158 l 169.102 163.102 l 173.5 163.449 l 177.852 157.602 l 182.25 159.398 l 186.602 160.5 l 191 159.852 l 195.398 164.75 l 199.75 165 l 204.148 165.398 l 208.5 164.898 l 212.898 158.352 l 217.25 164.25 l 221.648 164.801 l 226 157.75 l 230.398 165.398 l 234.75 164 l 239.148 165.199 l 243.5 165.301 l 247.898 157.852 l 252.25 158.199 l 256.648 157.852 l 261 165.051 l 265.398 158.648 l 269.75 165.852 l 274.148 164.699 l 278.5 157 l 282.898 157.449 l 287.25 166.449 l 291.648 158.352 l 296 157.699 l 300.398 166.648 l 304.75 159.352 l 309.148 158.301 l 313.5 168.051 l 317.898 177.301 l S Q q 1 0 0 1 0 0 cm 39.25 185.449 m 42.25 180.449 l 45.25 185.449 l h 39.25 185.449 m S Q q 1 0 0 1 0 0 cm 43.602 183.148 m 46.602 178.148 l 49.602 183.148 l h 43.602 183.148 m S Q q 1 0 0 1 0 0 cm 48 180.898 m 51 175.898 l 54 180.898 l h 48 180.898 m S Q q 1 0 0 1 0 0 cm 52.352 178.699 m 55.352 173.699 l 58.352 178.699 l h 52.352 178.699 m S Q q 1 0 0 1 0 0 cm 56.75 176.449 m 59.75 171.449 l 62.75 176.449 l h 56.75 176.449 m S Q q 1 0 0 1 0 0 cm 61.102 173.949 m 64.102 168.949 l 67.102 173.949 l h 61.102 173.949 m S Q q 1 0 0 1 0 0 cm 65.5 171.949 m 68.5 166.949 l 71.5 171.949 l h 65.5 171.949 m S Q q 1 0 0 1 0 0 cm 69.852 169.551 m 72.852 164.551 l 75.852 169.551 l h 69.852 169.551 m S Q q 1 0 0 1 0 0 cm 74.25 167.5 m 77.25 162.5 l 80.25 167.5 l h 74.25 167.5 m S Q q 1 0 0 1 0 0 cm 78.602 165.199 m 81.602 160.199 l 84.602 165.199 l h 78.602 165.199 m S Q q 1 0 0 1 0 0 cm 83 163.551 m 86 158.551 l 89 163.551 l h 83 163.551 m S Q q 1 0 0 1 0 0 cm 87.352 160.852 m 90.352 155.852 l 93.352 160.852 l h 87.352 160.852 m S Q q 1 0 0 1 0 0 cm 91.75 158.75 m 94.75 153.75 l 97.75 158.75 l h 91.75 158.75 m S Q q 1 0 0 1 0 0 cm 96.102 156.648 m 99.102 151.648 l 102.102 156.648 l h 96.102 156.648 m S Q q 1 0 0 1 0 0 cm 100.5 154.551 m 103.5 149.551 l 106.5 154.551 l h 100.5 154.551 m S Q q 1 0 0 1 0 0 cm 104.852 152.75 m 107.852 147.75 l 110.852 152.75 l h 104.852 152.75 m S Q q 1 0 0 1 0 0 cm 109.25 163.648 m 112.25 158.648 l 115.25 163.648 l h 109.25 163.648 m S Q q 1 0 0 1 0 0 cm 113.602 149.949 m 116.602 144.949 l 119.602 149.949 l h 113.602 149.949 m S Q q 1 0 0 1 0 0 cm 118 163.398 m 121 158.398 l 124 163.398 l h 118 163.398 m S Q q 1 0 0 1 0 0 cm 122.352 163.699 m 125.352 158.699 l 128.352 163.699 l h 122.352 163.699 m S Q q 1 0 0 1 0 0 cm 126.75 164.051 m 129.75 159.051 l 132.75 164.051 l h 126.75 164.051 m S Q q 1 0 0 1 0 0 cm 131.102 161.051 m 134.102 156.051 l 137.102 161.051 l h 131.102 161.051 m S Q q 1 0 0 1 0 0 cm 135.5 164.352 m 138.5 159.352 l 141.5 164.352 l h 135.5 164.352 m S Q q 1 0 0 1 0 0 cm 139.852 164.949 m 142.852 159.949 l 145.852 164.949 l h 139.852 164.949 m S Q q 1 0 0 1 0 0 cm 144.25 164.301 m 147.25 159.301 l 150.25 164.301 l h 144.25 164.301 m S Q q 1 0 0 1 0 0 cm 148.602 160.199 m 151.602 155.199 l 154.602 160.199 l h 148.602 160.199 m S Q q 1 0 0 1 0 0 cm 153 160.352 m 156 155.352 l 159 160.352 l h 153 160.352 m S Q q 1 0 0 1 0 0 cm 157.352 164.199 m 160.352 159.199 l 163.352 164.199 l h 157.352 164.199 m S Q q 1 0 0 1 0 0 cm 161.75 160 m 164.75 155 l 167.75 160 l h 161.75 160 m S Q q 1 0 0 1 0 0 cm 166.102 165.102 m 169.102 160.102 l 172.102 165.102 l h 166.102 165.102 m S Q q 1 0 0 1 0 0 cm 170.5 165.449 m 173.5 160.449 l 176.5 165.449 l h 170.5 165.449 m S Q q 1 0 0 1 0 0 cm 174.852 159.602 m 177.852 154.602 l 180.852 159.602 l h 174.852 159.602 m S Q q 1 0 0 1 0 0 cm 179.25 161.398 m 182.25 156.398 l 185.25 161.398 l h 179.25 161.398 m S Q q 1 0 0 1 0 0 cm 183.602 162.5 m 186.602 157.5 l 189.602 162.5 l h 183.602 162.5 m S Q q 1 0 0 1 0 0 cm 188 161.852 m 191 156.852 l 194 161.852 l h 188 161.852 m S Q q 1 0 0 1 0 0 cm 192.398 166.75 m 195.398 161.75 l 198.398 166.75 l h 192.398 166.75 m S Q q 1 0 0 1 0 0 cm 196.75 167 m 199.75 162 l 202.75 167 l h 196.75 167 m S Q q 1 0 0 1 0 0 cm 201.148 167.398 m 204.148 162.398 l 207.148 167.398 l h 201.148 167.398 m S Q q 1 0 0 1 0 0 cm 205.5 166.898 m 208.5 161.898 l 211.5 166.898 l h 205.5 166.898 m S Q q 1 0 0 1 0 0 cm 209.898 160.352 m 212.898 155.352 l 215.898 160.352 l h 209.898 160.352 m S Q q 1 0 0 1 0 0 cm 214.25 166.25 m 217.25 161.25 l 220.25 166.25 l h 214.25 166.25 m S Q q 1 0 0 1 0 0 cm 218.648 166.801 m 221.648 161.801 l 224.648 166.801 l h 218.648 166.801 m S Q q 1 0 0 1 0 0 cm 223 159.75 m 226 154.75 l 229 159.75 l h 223 159.75 m S Q q 1 0 0 1 0 0 cm 227.398 167.398 m 230.398 162.398 l 233.398 167.398 l h 227.398 167.398 m S Q q 1 0 0 1 0 0 cm 231.75 166 m 234.75 161 l 237.75 166 l h 231.75 166 m S Q q 1 0 0 1 0 0 cm 236.148 167.199 m 239.148 162.199 l 242.148 167.199 l h 236.148 167.199 m S Q q 1 0 0 1 0 0 cm 240.5 167.301 m 243.5 162.301 l 246.5 167.301 l h 240.5 167.301 m S Q q 1 0 0 1 0 0 cm 244.898 159.852 m 247.898 154.852 l 250.898 159.852 l h 244.898 159.852 m S Q q 1 0 0 1 0 0 cm 249.25 160.199 m 252.25 155.199 l 255.25 160.199 l h 249.25 160.199 m S Q q 1 0 0 1 0 0 cm 253.648 159.852 m 256.648 154.852 l 259.648 159.852 l h 253.648 159.852 m S Q q 1 0 0 1 0 0 cm 258 167.051 m 261 162.051 l 264 167.051 l h 258 167.051 m S Q q 1 0 0 1 0 0 cm 262.398 160.648 m 265.398 155.648 l 268.398 160.648 l h 262.398 160.648 m S Q q 1 0 0 1 0 0 cm 266.75 167.852 m 269.75 162.852 l 272.75 167.852 l h 266.75 167.852 m S Q q 1 0 0 1 0 0 cm 271.148 166.699 m 274.148 161.699 l 277.148 166.699 l h 271.148 166.699 m S Q q 1 0 0 1 0 0 cm 275.5 159 m 278.5 154 l 281.5 159 l h 275.5 159 m S Q q 1 0 0 1 0 0 cm 279.898 159.449 m 282.898 154.449 l 285.898 159.449 l h 279.898 159.449 m S Q q 1 0 0 1 0 0 cm 284.25 168.449 m 287.25 163.449 l 290.25 168.449 l h 284.25 168.449 m S Q q 1 0 0 1 0 0 cm 288.648 160.352 m 291.648 155.352 l 294.648 160.352 l h 288.648 160.352 m S Q q 1 0 0 1 0 0 cm 293 159.699 m 296 154.699 l 299 159.699 l h 293 159.699 m S Q q 1 0 0 1 0 0 cm 297.398 168.648 m 300.398 163.648 l 303.398 168.648 l h 297.398 168.648 m S Q q 1 0 0 1 0 0 cm 301.75 161.352 m 304.75 156.352 l 307.75 161.352 l h 301.75 161.352 m S Q q 1 0 0 1 0 0 cm 306.148 160.301 m 309.148 155.301 l 312.148 160.301 l h 306.148 160.301 m S Q q 1 0 0 1 0 0 cm 310.5 170.051 m 313.5 165.051 l 316.5 170.051 l h 310.5 170.051 m S Q q 1 0 0 1 0 0 cm 314.898 179.301 m 317.898 174.301 l 320.898 179.301 l h 314.898 179.301 m S Q q 1 0 0 1 0 0 cm 87.699 85.301 m 90.699 80.301 l 93.699 85.301 l h 87.699 85.301 m S Q BT 8 0 0 -8 63.35 95.625781 Tm /f-0-0 1 Tf [(32)]TJ ET 0.580392 0 0.827451 rg q 1 0 0 1 0 0 cm 78.648 92.602 m 102.75 92.602 l S Q q 1 0 0 1 0 0 cm 42.25 183.648 m 46.602 181.551 l 51 179.551 l 55.352 177.398 l 59.75 175.301 l 64.102 173.449 l 68.5 171.449 l 72.852 169.602 l 77.25 167.852 l 81.602 165.699 l 86 172.852 l 90.352 173.102 l 94.75 172.301 l 99.102 173.398 l 103.5 173.648 l 107.852 172.5 l 112.25 174.199 l 116.602 174 l 121 174.551 l 125.352 174.449 l 129.75 174.551 l 134.102 172.199 l 138.5 174.852 l 142.852 174.699 l 147.25 175 l 151.602 172.398 l 156 172.301 l 160.352 175.301 l 164.75 173.051 l 169.102 175.25 l 173.5 174.852 l 177.852 172.301 l 182.25 173.102 l 186.602 173.051 l 191 173 l 195.398 175.398 l 199.75 175.449 l 204.148 175.801 l 208.5 175.5 l 212.898 172.398 l 217.25 175.75 l 221.648 175.648 l 226 171.801 l 230.398 175.551 l 234.75 175.551 l 239.148 175.648 l 243.5 175.801 l 247.898 172.398 l 252.25 171.699 l 256.648 171.852 l 261 175.551 l 265.398 171.648 l 269.75 175.898 l 274.148 175.75 l 278.5 170.898 l 282.898 176.699 l 287.25 176.148 l 291.648 171.852 l 296 171.852 l 300.398 176.398 l 304.75 172.199 l 309.148 171.852 l 313.5 177 l 317.898 182 l S Q 39.25 185.648 m 42.25 180.648 l 45.25 185.648 l h 39.25 185.648 m f q 1 0 0 1 0 0 cm 39.25 185.648 m 42.25 180.648 l 45.25 185.648 l h 39.25 185.648 m S Q 43.602 183.551 m 46.602 178.551 l 49.602 183.551 l h 43.602 183.551 m f q 1 0 0 1 0 0 cm 43.602 183.551 m 46.602 178.551 l 49.602 183.551 l h 43.602 183.551 m S Q 48 181.551 m 51 176.551 l 54 181.551 l h 48 181.551 m f q 1 0 0 1 0 0 cm 48 181.551 m 51 176.551 l 54 181.551 l h 48 181.551 m S Q 52.352 179.398 m 55.352 174.398 l 58.352 179.398 l h 52.352 179.398 m f q 1 0 0 1 0 0 cm 52.352 179.398 m 55.352 174.398 l 58.352 179.398 l h 52.352 179.398 m S Q 56.75 177.301 m 59.75 172.301 l 62.75 177.301 l h 56.75 177.301 m f q 1 0 0 1 0 0 cm 56.75 177.301 m 59.75 172.301 l 62.75 177.301 l h 56.75 177.301 m S Q 61.102 175.449 m 64.102 170.449 l 67.102 175.449 l h 61.102 175.449 m f q 1 0 0 1 0 0 cm 61.102 175.449 m 64.102 170.449 l 67.102 175.449 l h 61.102 175.449 m S Q 65.5 173.449 m 68.5 168.449 l 71.5 173.449 l h 65.5 173.449 m f q 1 0 0 1 0 0 cm 65.5 173.449 m 68.5 168.449 l 71.5 173.449 l h 65.5 173.449 m S Q 69.852 171.602 m 72.852 166.602 l 75.852 171.602 l h 69.852 171.602 m f q 1 0 0 1 0 0 cm 69.852 171.602 m 72.852 166.602 l 75.852 171.602 l h 69.852 171.602 m S Q 74.25 169.852 m 77.25 164.852 l 80.25 169.852 l h 74.25 169.852 m f q 1 0 0 1 0 0 cm 74.25 169.852 m 77.25 164.852 l 80.25 169.852 l h 74.25 169.852 m S Q 78.602 167.699 m 81.602 162.699 l 84.602 167.699 l h 78.602 167.699 m f q 1 0 0 1 0 0 cm 78.602 167.699 m 81.602 162.699 l 84.602 167.699 l h 78.602 167.699 m S Q 83 174.852 m 86 169.852 l 89 174.852 l h 83 174.852 m f q 1 0 0 1 0 0 cm 83 174.852 m 86 169.852 l 89 174.852 l h 83 174.852 m S Q 87.352 175.102 m 90.352 170.102 l 93.352 175.102 l h 87.352 175.102 m f q 1 0 0 1 0 0 cm 87.352 175.102 m 90.352 170.102 l 93.352 175.102 l h 87.352 175.102 m S Q 91.75 174.301 m 94.75 169.301 l 97.75 174.301 l h 91.75 174.301 m f q 1 0 0 1 0 0 cm 91.75 174.301 m 94.75 169.301 l 97.75 174.301 l h 91.75 174.301 m S Q 96.102 175.398 m 99.102 170.398 l 102.102 175.398 l h 96.102 175.398 m f q 1 0 0 1 0 0 cm 96.102 175.398 m 99.102 170.398 l 102.102 175.398 l h 96.102 175.398 m S Q 100.5 175.648 m 103.5 170.648 l 106.5 175.648 l h 100.5 175.648 m f q 1 0 0 1 0 0 cm 100.5 175.648 m 103.5 170.648 l 106.5 175.648 l h 100.5 175.648 m S Q 104.852 174.5 m 107.852 169.5 l 110.852 174.5 l h 104.852 174.5 m f q 1 0 0 1 0 0 cm 104.852 174.5 m 107.852 169.5 l 110.852 174.5 l h 104.852 174.5 m S Q 109.25 176.199 m 112.25 171.199 l 115.25 176.199 l h 109.25 176.199 m f q 1 0 0 1 0 0 cm 109.25 176.199 m 112.25 171.199 l 115.25 176.199 l h 109.25 176.199 m S Q 113.602 176 m 116.602 171 l 119.602 176 l h 113.602 176 m f q 1 0 0 1 0 0 cm 113.602 176 m 116.602 171 l 119.602 176 l h 113.602 176 m S Q 118 176.551 m 121 171.551 l 124 176.551 l h 118 176.551 m f q 1 0 0 1 0 0 cm 118 176.551 m 121 171.551 l 124 176.551 l h 118 176.551 m S Q 122.352 176.449 m 125.352 171.449 l 128.352 176.449 l h 122.352 176.449 m f q 1 0 0 1 0 0 cm 122.352 176.449 m 125.352 171.449 l 128.352 176.449 l h 122.352 176.449 m S Q 126.75 176.551 m 129.75 171.551 l 132.75 176.551 l h 126.75 176.551 m f q 1 0 0 1 0 0 cm 126.75 176.551 m 129.75 171.551 l 132.75 176.551 l h 126.75 176.551 m S Q 131.102 174.199 m 134.102 169.199 l 137.102 174.199 l h 131.102 174.199 m f q 1 0 0 1 0 0 cm 131.102 174.199 m 134.102 169.199 l 137.102 174.199 l h 131.102 174.199 m S Q 135.5 176.852 m 138.5 171.852 l 141.5 176.852 l h 135.5 176.852 m f q 1 0 0 1 0 0 cm 135.5 176.852 m 138.5 171.852 l 141.5 176.852 l h 135.5 176.852 m S Q 139.852 176.699 m 142.852 171.699 l 145.852 176.699 l h 139.852 176.699 m f q 1 0 0 1 0 0 cm 139.852 176.699 m 142.852 171.699 l 145.852 176.699 l h 139.852 176.699 m S Q 144.25 177 m 147.25 172 l 150.25 177 l h 144.25 177 m f q 1 0 0 1 0 0 cm 144.25 177 m 147.25 172 l 150.25 177 l h 144.25 177 m S Q 148.602 174.398 m 151.602 169.398 l 154.602 174.398 l h 148.602 174.398 m f q 1 0 0 1 0 0 cm 148.602 174.398 m 151.602 169.398 l 154.602 174.398 l h 148.602 174.398 m S Q 153 174.301 m 156 169.301 l 159 174.301 l h 153 174.301 m f q 1 0 0 1 0 0 cm 153 174.301 m 156 169.301 l 159 174.301 l h 153 174.301 m S Q 157.352 177.301 m 160.352 172.301 l 163.352 177.301 l h 157.352 177.301 m f q 1 0 0 1 0 0 cm 157.352 177.301 m 160.352 172.301 l 163.352 177.301 l h 157.352 177.301 m S Q 161.75 175.051 m 164.75 170.051 l 167.75 175.051 l h 161.75 175.051 m f q 1 0 0 1 0 0 cm 161.75 175.051 m 164.75 170.051 l 167.75 175.051 l h 161.75 175.051 m S Q 166.102 177.25 m 169.102 172.25 l 172.102 177.25 l h 166.102 177.25 m f q 1 0 0 1 0 0 cm 166.102 177.25 m 169.102 172.25 l 172.102 177.25 l h 166.102 177.25 m S Q 170.5 176.852 m 173.5 171.852 l 176.5 176.852 l h 170.5 176.852 m f q 1 0 0 1 0 0 cm 170.5 176.852 m 173.5 171.852 l 176.5 176.852 l h 170.5 176.852 m S Q 174.852 174.301 m 177.852 169.301 l 180.852 174.301 l h 174.852 174.301 m f q 1 0 0 1 0 0 cm 174.852 174.301 m 177.852 169.301 l 180.852 174.301 l h 174.852 174.301 m S Q 179.25 175.102 m 182.25 170.102 l 185.25 175.102 l h 179.25 175.102 m f q 1 0 0 1 0 0 cm 179.25 175.102 m 182.25 170.102 l 185.25 175.102 l h 179.25 175.102 m S Q 183.602 175.051 m 186.602 170.051 l 189.602 175.051 l h 183.602 175.051 m f q 1 0 0 1 0 0 cm 183.602 175.051 m 186.602 170.051 l 189.602 175.051 l h 183.602 175.051 m S Q 188 175 m 191 170 l 194 175 l h 188 175 m f q 1 0 0 1 0 0 cm 188 175 m 191 170 l 194 175 l h 188 175 m S Q 192.398 177.398 m 195.398 172.398 l 198.398 177.398 l h 192.398 177.398 m f q 1 0 0 1 0 0 cm 192.398 177.398 m 195.398 172.398 l 198.398 177.398 l h 192.398 177.398 m S Q 196.75 177.449 m 199.75 172.449 l 202.75 177.449 l h 196.75 177.449 m f q 1 0 0 1 0 0 cm 196.75 177.449 m 199.75 172.449 l 202.75 177.449 l h 196.75 177.449 m S Q 201.148 177.801 m 204.148 172.801 l 207.148 177.801 l h 201.148 177.801 m f q 1 0 0 1 0 0 cm 201.148 177.801 m 204.148 172.801 l 207.148 177.801 l h 201.148 177.801 m S Q 205.5 177.5 m 208.5 172.5 l 211.5 177.5 l h 205.5 177.5 m f q 1 0 0 1 0 0 cm 205.5 177.5 m 208.5 172.5 l 211.5 177.5 l h 205.5 177.5 m S Q 209.898 174.398 m 212.898 169.398 l 215.898 174.398 l h 209.898 174.398 m f q 1 0 0 1 0 0 cm 209.898 174.398 m 212.898 169.398 l 215.898 174.398 l h 209.898 174.398 m S Q 214.25 177.75 m 217.25 172.75 l 220.25 177.75 l h 214.25 177.75 m f q 1 0 0 1 0 0 cm 214.25 177.75 m 217.25 172.75 l 220.25 177.75 l h 214.25 177.75 m S Q 218.648 177.648 m 221.648 172.648 l 224.648 177.648 l h 218.648 177.648 m f q 1 0 0 1 0 0 cm 218.648 177.648 m 221.648 172.648 l 224.648 177.648 l h 218.648 177.648 m S Q 223 173.801 m 226 168.801 l 229 173.801 l h 223 173.801 m f q 1 0 0 1 0 0 cm 223 173.801 m 226 168.801 l 229 173.801 l h 223 173.801 m S Q 227.398 177.551 m 230.398 172.551 l 233.398 177.551 l h 227.398 177.551 m f q 1 0 0 1 0 0 cm 227.398 177.551 m 230.398 172.551 l 233.398 177.551 l h 227.398 177.551 m S Q 231.75 177.551 m 234.75 172.551 l 237.75 177.551 l h 231.75 177.551 m f q 1 0 0 1 0 0 cm 231.75 177.551 m 234.75 172.551 l 237.75 177.551 l h 231.75 177.551 m S Q 236.148 177.648 m 239.148 172.648 l 242.148 177.648 l h 236.148 177.648 m f q 1 0 0 1 0 0 cm 236.148 177.648 m 239.148 172.648 l 242.148 177.648 l h 236.148 177.648 m S Q 240.5 177.801 m 243.5 172.801 l 246.5 177.801 l h 240.5 177.801 m f q 1 0 0 1 0 0 cm 240.5 177.801 m 243.5 172.801 l 246.5 177.801 l h 240.5 177.801 m S Q 244.898 174.398 m 247.898 169.398 l 250.898 174.398 l h 244.898 174.398 m f q 1 0 0 1 0 0 cm 244.898 174.398 m 247.898 169.398 l 250.898 174.398 l h 244.898 174.398 m S Q 249.25 173.699 m 252.25 168.699 l 255.25 173.699 l h 249.25 173.699 m f q 1 0 0 1 0 0 cm 249.25 173.699 m 252.25 168.699 l 255.25 173.699 l h 249.25 173.699 m S Q 253.648 173.852 m 256.648 168.852 l 259.648 173.852 l h 253.648 173.852 m f q 1 0 0 1 0 0 cm 253.648 173.852 m 256.648 168.852 l 259.648 173.852 l h 253.648 173.852 m S Q 258 177.551 m 261 172.551 l 264 177.551 l h 258 177.551 m f q 1 0 0 1 0 0 cm 258 177.551 m 261 172.551 l 264 177.551 l h 258 177.551 m S Q 262.398 173.648 m 265.398 168.648 l 268.398 173.648 l h 262.398 173.648 m f q 1 0 0 1 0 0 cm 262.398 173.648 m 265.398 168.648 l 268.398 173.648 l h 262.398 173.648 m S Q 266.75 177.898 m 269.75 172.898 l 272.75 177.898 l h 266.75 177.898 m f q 1 0 0 1 0 0 cm 266.75 177.898 m 269.75 172.898 l 272.75 177.898 l h 266.75 177.898 m S Q 271.148 177.75 m 274.148 172.75 l 277.148 177.75 l h 271.148 177.75 m f q 1 0 0 1 0 0 cm 271.148 177.75 m 274.148 172.75 l 277.148 177.75 l h 271.148 177.75 m S Q 275.5 172.898 m 278.5 167.898 l 281.5 172.898 l h 275.5 172.898 m f q 1 0 0 1 0 0 cm 275.5 172.898 m 278.5 167.898 l 281.5 172.898 l h 275.5 172.898 m S Q 279.898 178.699 m 282.898 173.699 l 285.898 178.699 l h 279.898 178.699 m f q 1 0 0 1 0 0 cm 279.898 178.699 m 282.898 173.699 l 285.898 178.699 l h 279.898 178.699 m S Q 284.25 178.148 m 287.25 173.148 l 290.25 178.148 l h 284.25 178.148 m f q 1 0 0 1 0 0 cm 284.25 178.148 m 287.25 173.148 l 290.25 178.148 l h 284.25 178.148 m S Q 288.648 173.852 m 291.648 168.852 l 294.648 173.852 l h 288.648 173.852 m f q 1 0 0 1 0 0 cm 288.648 173.852 m 291.648 168.852 l 294.648 173.852 l h 288.648 173.852 m S Q 293 173.852 m 296 168.852 l 299 173.852 l h 293 173.852 m f q 1 0 0 1 0 0 cm 293 173.852 m 296 168.852 l 299 173.852 l h 293 173.852 m S Q 297.398 178.398 m 300.398 173.398 l 303.398 178.398 l h 297.398 178.398 m f q 1 0 0 1 0 0 cm 297.398 178.398 m 300.398 173.398 l 303.398 178.398 l h 297.398 178.398 m S Q 301.75 174.199 m 304.75 169.199 l 307.75 174.199 l h 301.75 174.199 m f q 1 0 0 1 0 0 cm 301.75 174.199 m 304.75 169.199 l 307.75 174.199 l h 301.75 174.199 m S Q 306.148 173.852 m 309.148 168.852 l 312.148 173.852 l h 306.148 173.852 m f q 1 0 0 1 0 0 cm 306.148 173.852 m 309.148 168.852 l 312.148 173.852 l h 306.148 173.852 m S Q 310.5 179 m 313.5 174 l 316.5 179 l h 310.5 179 m f q 1 0 0 1 0 0 cm 310.5 179 m 313.5 174 l 316.5 179 l h 310.5 179 m S Q 314.898 184 m 317.898 179 l 320.898 184 l h 314.898 184 m f q 1 0 0 1 0 0 cm 314.898 184 m 317.898 179 l 320.898 184 l h 314.898 184 m S Q 87.699 94.602 m 90.699 89.602 l 93.699 94.602 l h 87.699 94.602 m f q 1 0 0 1 0 0 cm 87.699 94.602 m 90.699 89.602 l 93.699 94.602 l h 87.699 94.602 m S Q 0 g BT 8 0 0 -8 63.35 104.925781 Tm /f-0-0 1 Tf [(16)]TJ ET 0 0.619608 0.45098 rg q 1 0 0 1 0 0 cm 78.648 101.898 m 102.75 101.898 l S Q q 1 0 0 1 0 0 cm 42.25 183.75 m 46.602 181.898 l 51 180.398 l 55.352 178.949 l 59.75 177.199 l 64.102 176.5 l 68.5 176.648 l 72.852 178.801 l 77.25 179.25 l 81.602 178.551 l 86 179.352 l 90.352 179.602 l 94.75 178.699 l 99.102 179.648 l 103.5 179.898 l 107.852 179.25 l 112.25 180.102 l 116.602 179.75 l 121 180.25 l 125.352 180 l 129.75 180.148 l 134.102 179 l 138.5 180.398 l 142.852 180.449 l 147.25 180.5 l 151.602 179.25 l 156 179.199 l 160.352 180.352 l 164.75 179.449 l 169.102 180.551 l 173.5 180.699 l 177.852 179 l 182.25 179.352 l 186.602 179.551 l 191 179 l 195.398 180.801 l 199.75 180.5 l 204.148 180.898 l 208.5 180.699 l 212.898 179.051 l 217.25 180.648 l 221.648 180.602 l 226 178.699 l 230.398 180.648 l 234.75 180.648 l 239.148 180.801 l 243.5 180.801 l 247.898 179.148 l 252.25 178.551 l 256.648 178.5 l 261 180.648 l 265.398 178.551 l 269.75 180.801 l 274.148 180.801 l 278.5 178.75 l 282.898 178.352 l 287.25 181.102 l 291.648 179 l 296 178.75 l 300.398 181.051 l 304.75 178.801 l 309.148 178.898 l 313.5 181.398 l 317.898 183.699 l S Q q 1 0 0 1 0 0 cm 39.25 181.75 m 42.25 186.75 l 45.25 181.75 l h 39.25 181.75 m S Q q 1 0 0 1 0 0 cm 43.602 179.898 m 46.602 184.898 l 49.602 179.898 l h 43.602 179.898 m S Q q 1 0 0 1 0 0 cm 48 178.398 m 51 183.398 l 54 178.398 l h 48 178.398 m S Q q 1 0 0 1 0 0 cm 52.352 176.949 m 55.352 181.949 l 58.352 176.949 l h 52.352 176.949 m S Q q 1 0 0 1 0 0 cm 56.75 175.199 m 59.75 180.199 l 62.75 175.199 l h 56.75 175.199 m S Q q 1 0 0 1 0 0 cm 61.102 174.5 m 64.102 179.5 l 67.102 174.5 l h 61.102 174.5 m S Q q 1 0 0 1 0 0 cm 65.5 174.648 m 68.5 179.648 l 71.5 174.648 l h 65.5 174.648 m S Q q 1 0 0 1 0 0 cm 69.852 176.801 m 72.852 181.801 l 75.852 176.801 l h 69.852 176.801 m S Q q 1 0 0 1 0 0 cm 74.25 177.25 m 77.25 182.25 l 80.25 177.25 l h 74.25 177.25 m S Q q 1 0 0 1 0 0 cm 78.602 176.551 m 81.602 181.551 l 84.602 176.551 l h 78.602 176.551 m S Q q 1 0 0 1 0 0 cm 83 177.352 m 86 182.352 l 89 177.352 l h 83 177.352 m S Q q 1 0 0 1 0 0 cm 87.352 177.602 m 90.352 182.602 l 93.352 177.602 l h 87.352 177.602 m S Q q 1 0 0 1 0 0 cm 91.75 176.699 m 94.75 181.699 l 97.75 176.699 l h 91.75 176.699 m S Q q 1 0 0 1 0 0 cm 96.102 177.648 m 99.102 182.648 l 102.102 177.648 l h 96.102 177.648 m S Q q 1 0 0 1 0 0 cm 100.5 177.898 m 103.5 182.898 l 106.5 177.898 l h 100.5 177.898 m S Q q 1 0 0 1 0 0 cm 104.852 177.25 m 107.852 182.25 l 110.852 177.25 l h 104.852 177.25 m S Q q 1 0 0 1 0 0 cm 109.25 178.102 m 112.25 183.102 l 115.25 178.102 l h 109.25 178.102 m S Q q 1 0 0 1 0 0 cm 113.602 177.75 m 116.602 182.75 l 119.602 177.75 l h 113.602 177.75 m S Q q 1 0 0 1 0 0 cm 118 178.25 m 121 183.25 l 124 178.25 l h 118 178.25 m S Q q 1 0 0 1 0 0 cm 122.352 178 m 125.352 183 l 128.352 178 l h 122.352 178 m S Q q 1 0 0 1 0 0 cm 126.75 178.148 m 129.75 183.148 l 132.75 178.148 l h 126.75 178.148 m S Q q 1 0 0 1 0 0 cm 131.102 177 m 134.102 182 l 137.102 177 l h 131.102 177 m S Q q 1 0 0 1 0 0 cm 135.5 178.398 m 138.5 183.398 l 141.5 178.398 l h 135.5 178.398 m S Q q 1 0 0 1 0 0 cm 139.852 178.449 m 142.852 183.449 l 145.852 178.449 l h 139.852 178.449 m S Q q 1 0 0 1 0 0 cm 144.25 178.5 m 147.25 183.5 l 150.25 178.5 l h 144.25 178.5 m S Q q 1 0 0 1 0 0 cm 148.602 177.25 m 151.602 182.25 l 154.602 177.25 l h 148.602 177.25 m S Q q 1 0 0 1 0 0 cm 153 177.199 m 156 182.199 l 159 177.199 l h 153 177.199 m S Q q 1 0 0 1 0 0 cm 157.352 178.352 m 160.352 183.352 l 163.352 178.352 l h 157.352 178.352 m S Q q 1 0 0 1 0 0 cm 161.75 177.449 m 164.75 182.449 l 167.75 177.449 l h 161.75 177.449 m S Q q 1 0 0 1 0 0 cm 166.102 178.551 m 169.102 183.551 l 172.102 178.551 l h 166.102 178.551 m S Q q 1 0 0 1 0 0 cm 170.5 178.699 m 173.5 183.699 l 176.5 178.699 l h 170.5 178.699 m S Q q 1 0 0 1 0 0 cm 174.852 177 m 177.852 182 l 180.852 177 l h 174.852 177 m S Q q 1 0 0 1 0 0 cm 179.25 177.352 m 182.25 182.352 l 185.25 177.352 l h 179.25 177.352 m S Q q 1 0 0 1 0 0 cm 183.602 177.551 m 186.602 182.551 l 189.602 177.551 l h 183.602 177.551 m S Q q 1 0 0 1 0 0 cm 188 177 m 191 182 l 194 177 l h 188 177 m S Q q 1 0 0 1 0 0 cm 192.398 178.801 m 195.398 183.801 l 198.398 178.801 l h 192.398 178.801 m S Q q 1 0 0 1 0 0 cm 196.75 178.5 m 199.75 183.5 l 202.75 178.5 l h 196.75 178.5 m S Q q 1 0 0 1 0 0 cm 201.148 178.898 m 204.148 183.898 l 207.148 178.898 l h 201.148 178.898 m S Q q 1 0 0 1 0 0 cm 205.5 178.699 m 208.5 183.699 l 211.5 178.699 l h 205.5 178.699 m S Q q 1 0 0 1 0 0 cm 209.898 177.051 m 212.898 182.051 l 215.898 177.051 l h 209.898 177.051 m S Q q 1 0 0 1 0 0 cm 214.25 178.648 m 217.25 183.648 l 220.25 178.648 l h 214.25 178.648 m S Q q 1 0 0 1 0 0 cm 218.648 178.602 m 221.648 183.602 l 224.648 178.602 l h 218.648 178.602 m S Q q 1 0 0 1 0 0 cm 223 176.699 m 226 181.699 l 229 176.699 l h 223 176.699 m S Q q 1 0 0 1 0 0 cm 227.398 178.648 m 230.398 183.648 l 233.398 178.648 l h 227.398 178.648 m S Q q 1 0 0 1 0 0 cm 231.75 178.648 m 234.75 183.648 l 237.75 178.648 l h 231.75 178.648 m S Q q 1 0 0 1 0 0 cm 236.148 178.801 m 239.148 183.801 l 242.148 178.801 l h 236.148 178.801 m S Q q 1 0 0 1 0 0 cm 240.5 178.801 m 243.5 183.801 l 246.5 178.801 l h 240.5 178.801 m S Q q 1 0 0 1 0 0 cm 244.898 177.148 m 247.898 182.148 l 250.898 177.148 l h 244.898 177.148 m S Q q 1 0 0 1 0 0 cm 249.25 176.551 m 252.25 181.551 l 255.25 176.551 l h 249.25 176.551 m S Q q 1 0 0 1 0 0 cm 253.648 176.5 m 256.648 181.5 l 259.648 176.5 l h 253.648 176.5 m S Q q 1 0 0 1 0 0 cm 258 178.648 m 261 183.648 l 264 178.648 l h 258 178.648 m S Q q 1 0 0 1 0 0 cm 262.398 176.551 m 265.398 181.551 l 268.398 176.551 l h 262.398 176.551 m S Q q 1 0 0 1 0 0 cm 266.75 178.801 m 269.75 183.801 l 272.75 178.801 l h 266.75 178.801 m S Q q 1 0 0 1 0 0 cm 271.148 178.801 m 274.148 183.801 l 277.148 178.801 l h 271.148 178.801 m S Q q 1 0 0 1 0 0 cm 275.5 176.75 m 278.5 181.75 l 281.5 176.75 l h 275.5 176.75 m S Q q 1 0 0 1 0 0 cm 279.898 176.352 m 282.898 181.352 l 285.898 176.352 l h 279.898 176.352 m S Q q 1 0 0 1 0 0 cm 284.25 179.102 m 287.25 184.102 l 290.25 179.102 l h 284.25 179.102 m S Q q 1 0 0 1 0 0 cm 288.648 177 m 291.648 182 l 294.648 177 l h 288.648 177 m S Q q 1 0 0 1 0 0 cm 293 176.75 m 296 181.75 l 299 176.75 l h 293 176.75 m S Q q 1 0 0 1 0 0 cm 297.398 179.051 m 300.398 184.051 l 303.398 179.051 l h 297.398 179.051 m S Q q 1 0 0 1 0 0 cm 301.75 176.801 m 304.75 181.801 l 307.75 176.801 l h 301.75 176.801 m S Q q 1 0 0 1 0 0 cm 306.148 176.898 m 309.148 181.898 l 312.148 176.898 l h 306.148 176.898 m S Q q 1 0 0 1 0 0 cm 310.5 179.398 m 313.5 184.398 l 316.5 179.398 l h 310.5 179.398 m S Q q 1 0 0 1 0 0 cm 314.898 181.699 m 317.898 186.699 l 320.898 181.699 l h 314.898 181.699 m S Q q 1 0 0 1 0 0 cm 87.699 99.898 m 90.699 104.898 l 93.699 99.898 l h 87.699 99.898 m S Q 0 g BT 8 0 0 -8 68.45 114.225781 Tm /f-0-0 1 Tf (9)Tj ET 0.337255 0.705882 0.913725 rg q 1 0 0 1 0 0 cm 78.648 111.199 m 102.75 111.199 l S Q q 1 0 0 1 0 0 cm 42.25 184.148 m 46.602 182.699 l 51 181.449 l 55.352 180.5 l 59.75 181.949 l 64.102 182.051 l 68.5 182 l 72.852 181.898 l 77.25 182.449 l 81.602 181.852 l 86 182.602 l 90.352 182.5 l 94.75 182.25 l 99.102 182.699 l 103.5 182.699 l 107.852 182.352 l 112.25 182.648 l 116.602 182.648 l 121 182.75 l 125.352 182.75 l 129.75 182.699 l 134.102 182.301 l 138.5 183 l 142.852 182.801 l 147.25 182.949 l 151.602 182.199 l 156 182.25 l 160.352 182.949 l 164.75 182.352 l 169.102 183.102 l 173.5 182.949 l 177.852 182.148 l 182.25 182.301 l 186.602 182.449 l 191 182.301 l 195.398 183.051 l 199.75 183.148 l 204.148 183.148 l 208.5 183.051 l 212.898 182.051 l 217.25 183.102 l 221.648 183.148 l 226 182.102 l 230.398 183.148 l 234.75 183.102 l 239.148 183.148 l 243.5 183.102 l 247.898 182 l 252.25 182 l 256.648 181.949 l 261 183.102 l 265.398 182 l 269.75 183.199 l 274.148 183.102 l 278.5 181.949 l 282.898 182 l 287.25 183.25 l 291.648 182 l 296 182.051 l 300.398 183.301 l 304.75 182.102 l 309.148 182.148 l 313.5 183.449 l 317.898 184.648 l S Q 39.25 182.148 m 42.25 187.148 l 45.25 182.148 l h 39.25 182.148 m f q 1 0 0 1 0 0 cm 39.25 182.148 m 42.25 187.148 l 45.25 182.148 l h 39.25 182.148 m S Q 43.602 180.699 m 46.602 185.699 l 49.602 180.699 l h 43.602 180.699 m f q 1 0 0 1 0 0 cm 43.602 180.699 m 46.602 185.699 l 49.602 180.699 l h 43.602 180.699 m S Q 48 179.449 m 51 184.449 l 54 179.449 l h 48 179.449 m f q 1 0 0 1 0 0 cm 48 179.449 m 51 184.449 l 54 179.449 l h 48 179.449 m S Q 52.352 178.5 m 55.352 183.5 l 58.352 178.5 l h 52.352 178.5 m f q 1 0 0 1 0 0 cm 52.352 178.5 m 55.352 183.5 l 58.352 178.5 l h 52.352 178.5 m S Q 56.75 179.949 m 59.75 184.949 l 62.75 179.949 l h 56.75 179.949 m f q 1 0 0 1 0 0 cm 56.75 179.949 m 59.75 184.949 l 62.75 179.949 l h 56.75 179.949 m S Q 61.102 180.051 m 64.102 185.051 l 67.102 180.051 l h 61.102 180.051 m f q 1 0 0 1 0 0 cm 61.102 180.051 m 64.102 185.051 l 67.102 180.051 l h 61.102 180.051 m S Q 65.5 180 m 68.5 185 l 71.5 180 l h 65.5 180 m f q 1 0 0 1 0 0 cm 65.5 180 m 68.5 185 l 71.5 180 l h 65.5 180 m S Q 69.852 179.898 m 72.852 184.898 l 75.852 179.898 l h 69.852 179.898 m f q 1 0 0 1 0 0 cm 69.852 179.898 m 72.852 184.898 l 75.852 179.898 l h 69.852 179.898 m S Q 74.25 180.449 m 77.25 185.449 l 80.25 180.449 l h 74.25 180.449 m f q 1 0 0 1 0 0 cm 74.25 180.449 m 77.25 185.449 l 80.25 180.449 l h 74.25 180.449 m S Q 78.602 179.852 m 81.602 184.852 l 84.602 179.852 l h 78.602 179.852 m f q 1 0 0 1 0 0 cm 78.602 179.852 m 81.602 184.852 l 84.602 179.852 l h 78.602 179.852 m S Q 83 180.602 m 86 185.602 l 89 180.602 l h 83 180.602 m f q 1 0 0 1 0 0 cm 83 180.602 m 86 185.602 l 89 180.602 l h 83 180.602 m S Q 87.352 180.5 m 90.352 185.5 l 93.352 180.5 l h 87.352 180.5 m f q 1 0 0 1 0 0 cm 87.352 180.5 m 90.352 185.5 l 93.352 180.5 l h 87.352 180.5 m S Q 91.75 180.25 m 94.75 185.25 l 97.75 180.25 l h 91.75 180.25 m f q 1 0 0 1 0 0 cm 91.75 180.25 m 94.75 185.25 l 97.75 180.25 l h 91.75 180.25 m S Q 96.102 180.699 m 99.102 185.699 l 102.102 180.699 l h 96.102 180.699 m f q 1 0 0 1 0 0 cm 96.102 180.699 m 99.102 185.699 l 102.102 180.699 l h 96.102 180.699 m S Q 100.5 180.699 m 103.5 185.699 l 106.5 180.699 l h 100.5 180.699 m f q 1 0 0 1 0 0 cm 100.5 180.699 m 103.5 185.699 l 106.5 180.699 l h 100.5 180.699 m S Q 104.852 180.352 m 107.852 185.352 l 110.852 180.352 l h 104.852 180.352 m f q 1 0 0 1 0 0 cm 104.852 180.352 m 107.852 185.352 l 110.852 180.352 l h 104.852 180.352 m S Q 109.25 180.648 m 112.25 185.648 l 115.25 180.648 l h 109.25 180.648 m f q 1 0 0 1 0 0 cm 109.25 180.648 m 112.25 185.648 l 115.25 180.648 l h 109.25 180.648 m S Q 113.602 180.648 m 116.602 185.648 l 119.602 180.648 l h 113.602 180.648 m f q 1 0 0 1 0 0 cm 113.602 180.648 m 116.602 185.648 l 119.602 180.648 l h 113.602 180.648 m S Q 118 180.75 m 121 185.75 l 124 180.75 l h 118 180.75 m f q 1 0 0 1 0 0 cm 118 180.75 m 121 185.75 l 124 180.75 l h 118 180.75 m S Q 122.352 180.75 m 125.352 185.75 l 128.352 180.75 l h 122.352 180.75 m f q 1 0 0 1 0 0 cm 122.352 180.75 m 125.352 185.75 l 128.352 180.75 l h 122.352 180.75 m S Q 126.75 180.699 m 129.75 185.699 l 132.75 180.699 l h 126.75 180.699 m f q 1 0 0 1 0 0 cm 126.75 180.699 m 129.75 185.699 l 132.75 180.699 l h 126.75 180.699 m S Q 131.102 180.301 m 134.102 185.301 l 137.102 180.301 l h 131.102 180.301 m f q 1 0 0 1 0 0 cm 131.102 180.301 m 134.102 185.301 l 137.102 180.301 l h 131.102 180.301 m S Q 135.5 181 m 138.5 186 l 141.5 181 l h 135.5 181 m f q 1 0 0 1 0 0 cm 135.5 181 m 138.5 186 l 141.5 181 l h 135.5 181 m S Q 139.852 180.801 m 142.852 185.801 l 145.852 180.801 l h 139.852 180.801 m f q 1 0 0 1 0 0 cm 139.852 180.801 m 142.852 185.801 l 145.852 180.801 l h 139.852 180.801 m S Q 144.25 180.949 m 147.25 185.949 l 150.25 180.949 l h 144.25 180.949 m f q 1 0 0 1 0 0 cm 144.25 180.949 m 147.25 185.949 l 150.25 180.949 l h 144.25 180.949 m S Q 148.602 180.199 m 151.602 185.199 l 154.602 180.199 l h 148.602 180.199 m f q 1 0 0 1 0 0 cm 148.602 180.199 m 151.602 185.199 l 154.602 180.199 l h 148.602 180.199 m S Q 153 180.25 m 156 185.25 l 159 180.25 l h 153 180.25 m f q 1 0 0 1 0 0 cm 153 180.25 m 156 185.25 l 159 180.25 l h 153 180.25 m S Q 157.352 180.949 m 160.352 185.949 l 163.352 180.949 l h 157.352 180.949 m f q 1 0 0 1 0 0 cm 157.352 180.949 m 160.352 185.949 l 163.352 180.949 l h 157.352 180.949 m S Q 161.75 180.352 m 164.75 185.352 l 167.75 180.352 l h 161.75 180.352 m f q 1 0 0 1 0 0 cm 161.75 180.352 m 164.75 185.352 l 167.75 180.352 l h 161.75 180.352 m S Q 166.102 181.102 m 169.102 186.102 l 172.102 181.102 l h 166.102 181.102 m f q 1 0 0 1 0 0 cm 166.102 181.102 m 169.102 186.102 l 172.102 181.102 l h 166.102 181.102 m S Q 170.5 180.949 m 173.5 185.949 l 176.5 180.949 l h 170.5 180.949 m f q 1 0 0 1 0 0 cm 170.5 180.949 m 173.5 185.949 l 176.5 180.949 l h 170.5 180.949 m S Q 174.852 180.148 m 177.852 185.148 l 180.852 180.148 l h 174.852 180.148 m f q 1 0 0 1 0 0 cm 174.852 180.148 m 177.852 185.148 l 180.852 180.148 l h 174.852 180.148 m S Q 179.25 180.301 m 182.25 185.301 l 185.25 180.301 l h 179.25 180.301 m f q 1 0 0 1 0 0 cm 179.25 180.301 m 182.25 185.301 l 185.25 180.301 l h 179.25 180.301 m S Q 183.602 180.449 m 186.602 185.449 l 189.602 180.449 l h 183.602 180.449 m f q 1 0 0 1 0 0 cm 183.602 180.449 m 186.602 185.449 l 189.602 180.449 l h 183.602 180.449 m S Q 188 180.301 m 191 185.301 l 194 180.301 l h 188 180.301 m f q 1 0 0 1 0 0 cm 188 180.301 m 191 185.301 l 194 180.301 l h 188 180.301 m S Q 192.398 181.051 m 195.398 186.051 l 198.398 181.051 l h 192.398 181.051 m f q 1 0 0 1 0 0 cm 192.398 181.051 m 195.398 186.051 l 198.398 181.051 l h 192.398 181.051 m S Q 196.75 181.148 m 199.75 186.148 l 202.75 181.148 l h 196.75 181.148 m f q 1 0 0 1 0 0 cm 196.75 181.148 m 199.75 186.148 l 202.75 181.148 l h 196.75 181.148 m S Q 201.148 181.148 m 204.148 186.148 l 207.148 181.148 l h 201.148 181.148 m f q 1 0 0 1 0 0 cm 201.148 181.148 m 204.148 186.148 l 207.148 181.148 l h 201.148 181.148 m S Q 205.5 181.051 m 208.5 186.051 l 211.5 181.051 l h 205.5 181.051 m f q 1 0 0 1 0 0 cm 205.5 181.051 m 208.5 186.051 l 211.5 181.051 l h 205.5 181.051 m S Q 209.898 180.051 m 212.898 185.051 l 215.898 180.051 l h 209.898 180.051 m f q 1 0 0 1 0 0 cm 209.898 180.051 m 212.898 185.051 l 215.898 180.051 l h 209.898 180.051 m S Q 214.25 181.102 m 217.25 186.102 l 220.25 181.102 l h 214.25 181.102 m f q 1 0 0 1 0 0 cm 214.25 181.102 m 217.25 186.102 l 220.25 181.102 l h 214.25 181.102 m S Q 218.648 181.148 m 221.648 186.148 l 224.648 181.148 l h 218.648 181.148 m f q 1 0 0 1 0 0 cm 218.648 181.148 m 221.648 186.148 l 224.648 181.148 l h 218.648 181.148 m S Q 223 180.102 m 226 185.102 l 229 180.102 l h 223 180.102 m f q 1 0 0 1 0 0 cm 223 180.102 m 226 185.102 l 229 180.102 l h 223 180.102 m S Q 227.398 181.148 m 230.398 186.148 l 233.398 181.148 l h 227.398 181.148 m f q 1 0 0 1 0 0 cm 227.398 181.148 m 230.398 186.148 l 233.398 181.148 l h 227.398 181.148 m S Q 231.75 181.102 m 234.75 186.102 l 237.75 181.102 l h 231.75 181.102 m f q 1 0 0 1 0 0 cm 231.75 181.102 m 234.75 186.102 l 237.75 181.102 l h 231.75 181.102 m S Q 236.148 181.148 m 239.148 186.148 l 242.148 181.148 l h 236.148 181.148 m f q 1 0 0 1 0 0 cm 236.148 181.148 m 239.148 186.148 l 242.148 181.148 l h 236.148 181.148 m S Q 240.5 181.102 m 243.5 186.102 l 246.5 181.102 l h 240.5 181.102 m f q 1 0 0 1 0 0 cm 240.5 181.102 m 243.5 186.102 l 246.5 181.102 l h 240.5 181.102 m S Q 244.898 180 m 247.898 185 l 250.898 180 l h 244.898 180 m f q 1 0 0 1 0 0 cm 244.898 180 m 247.898 185 l 250.898 180 l h 244.898 180 m S Q 249.25 180 m 252.25 185 l 255.25 180 l h 249.25 180 m f q 1 0 0 1 0 0 cm 249.25 180 m 252.25 185 l 255.25 180 l h 249.25 180 m S Q 253.648 179.949 m 256.648 184.949 l 259.648 179.949 l h 253.648 179.949 m f q 1 0 0 1 0 0 cm 253.648 179.949 m 256.648 184.949 l 259.648 179.949 l h 253.648 179.949 m S Q 258 181.102 m 261 186.102 l 264 181.102 l h 258 181.102 m f q 1 0 0 1 0 0 cm 258 181.102 m 261 186.102 l 264 181.102 l h 258 181.102 m S Q 262.398 180 m 265.398 185 l 268.398 180 l h 262.398 180 m f q 1 0 0 1 0 0 cm 262.398 180 m 265.398 185 l 268.398 180 l h 262.398 180 m S Q 266.75 181.199 m 269.75 186.199 l 272.75 181.199 l h 266.75 181.199 m f q 1 0 0 1 0 0 cm 266.75 181.199 m 269.75 186.199 l 272.75 181.199 l h 266.75 181.199 m S Q 271.148 181.102 m 274.148 186.102 l 277.148 181.102 l h 271.148 181.102 m f q 1 0 0 1 0 0 cm 271.148 181.102 m 274.148 186.102 l 277.148 181.102 l h 271.148 181.102 m S Q 275.5 179.949 m 278.5 184.949 l 281.5 179.949 l h 275.5 179.949 m f q 1 0 0 1 0 0 cm 275.5 179.949 m 278.5 184.949 l 281.5 179.949 l h 275.5 179.949 m S Q 279.898 180 m 282.898 185 l 285.898 180 l h 279.898 180 m f q 1 0 0 1 0 0 cm 279.898 180 m 282.898 185 l 285.898 180 l h 279.898 180 m S Q 284.25 181.25 m 287.25 186.25 l 290.25 181.25 l h 284.25 181.25 m f q 1 0 0 1 0 0 cm 284.25 181.25 m 287.25 186.25 l 290.25 181.25 l h 284.25 181.25 m S Q 288.648 180 m 291.648 185 l 294.648 180 l h 288.648 180 m f q 1 0 0 1 0 0 cm 288.648 180 m 291.648 185 l 294.648 180 l h 288.648 180 m S Q 293 180.051 m 296 185.051 l 299 180.051 l h 293 180.051 m f q 1 0 0 1 0 0 cm 293 180.051 m 296 185.051 l 299 180.051 l h 293 180.051 m S Q 297.398 181.301 m 300.398 186.301 l 303.398 181.301 l h 297.398 181.301 m f q 1 0 0 1 0 0 cm 297.398 181.301 m 300.398 186.301 l 303.398 181.301 l h 297.398 181.301 m S Q 301.75 180.102 m 304.75 185.102 l 307.75 180.102 l h 301.75 180.102 m f q 1 0 0 1 0 0 cm 301.75 180.102 m 304.75 185.102 l 307.75 180.102 l h 301.75 180.102 m S Q 306.148 180.148 m 309.148 185.148 l 312.148 180.148 l h 306.148 180.148 m f q 1 0 0 1 0 0 cm 306.148 180.148 m 309.148 185.148 l 312.148 180.148 l h 306.148 180.148 m S Q 310.5 181.449 m 313.5 186.449 l 316.5 181.449 l h 310.5 181.449 m f q 1 0 0 1 0 0 cm 310.5 181.449 m 313.5 186.449 l 316.5 181.449 l h 310.5 181.449 m S Q 314.898 182.648 m 317.898 187.648 l 320.898 182.648 l h 314.898 182.648 m f q 1 0 0 1 0 0 cm 314.898 182.648 m 317.898 187.648 l 320.898 182.648 l h 314.898 182.648 m S Q 87.699 109.199 m 90.699 114.199 l 93.699 109.199 l h 87.699 109.199 m f q 1 0 0 1 0 0 cm 87.699 109.199 m 90.699 114.199 l 93.699 109.199 l h 87.699 109.199 m S Q 0 g BT 8 0 0 -8 68.45 123.525781 Tm /f-0-0 1 Tf (4)Tj ET 0.901961 0.623529 0 rg q 1 0 0 1 0 0 cm 78.648 120.5 m 102.75 120.5 l S Q q 1 0 0 1 0 0 cm 42.25 184.949 m 46.602 184.301 l 51 184.148 l 55.352 184.25 l 59.75 184.199 l 64.102 184.148 l 68.5 184.199 l 72.852 184.102 l 77.25 184.352 l 81.602 184.051 l 86 184.199 l 90.352 184.199 l 94.75 184.051 l 99.102 184.25 l 103.5 184.301 l 107.852 184.102 l 112.25 184.352 l 129.75 184.352 l 134.102 184.148 l 138.5 184.5 l 142.852 184.449 l 147.25 184.449 l 151.602 184.102 l 156 184.148 l 160.352 184.449 l 164.75 184.199 l 169.102 184.449 l 173.5 184.5 l 177.852 184 l 182.25 184.148 l 186.602 184.199 l 191 184.102 l 195.398 184.5 l 199.75 184.5 l 204.148 184.551 l 208.5 184.5 l 212.898 184.051 l 217.25 184.5 l 221.648 184.5 l 226 184.051 l 230.398 184.551 l 234.75 184.5 l 239.148 184.551 l 243.5 184.551 l 247.898 184.102 l 252.25 184.051 l 256.648 184.051 l 261 184.5 l 265.398 184.051 l 269.75 184.551 l 274.148 184.5 l 278.5 184 l 282.898 183.949 l 287.25 184.602 l 291.648 184.051 l 296 183.949 l 300.398 184.602 l 304.75 184.051 l 309.148 184.051 l 313.5 184.699 l 317.898 185.352 l S Q q 1 0 0 1 0 0 cm 39.25 184.949 m 42.25 187.949 l 45.25 184.949 l 42.25 181.949 l h 39.25 184.949 m S Q q 1 0 0 1 0 0 cm 43.602 184.301 m 46.602 187.301 l 49.602 184.301 l 46.602 181.301 l h 43.602 184.301 m S Q q 1 0 0 1 0 0 cm 48 184.148 m 51 187.148 l 54 184.148 l 51 181.148 l h 48 184.148 m S Q q 1 0 0 1 0 0 cm 52.352 184.25 m 55.352 187.25 l 58.352 184.25 l 55.352 181.25 l h 52.352 184.25 m S Q q 1 0 0 1 0 0 cm 56.75 184.199 m 59.75 187.199 l 62.75 184.199 l 59.75 181.199 l h 56.75 184.199 m S Q q 1 0 0 1 0 0 cm 61.102 184.148 m 64.102 187.148 l 67.102 184.148 l 64.102 181.148 l h 61.102 184.148 m S Q q 1 0 0 1 0 0 cm 65.5 184.199 m 68.5 187.199 l 71.5 184.199 l 68.5 181.199 l h 65.5 184.199 m S Q q 1 0 0 1 0 0 cm 69.852 184.102 m 72.852 187.102 l 75.852 184.102 l 72.852 181.102 l h 69.852 184.102 m S Q q 1 0 0 1 0 0 cm 74.25 184.352 m 77.25 187.352 l 80.25 184.352 l 77.25 181.352 l h 74.25 184.352 m S Q q 1 0 0 1 0 0 cm 78.602 184.051 m 81.602 187.051 l 84.602 184.051 l 81.602 181.051 l h 78.602 184.051 m S Q q 1 0 0 1 0 0 cm 83 184.199 m 86 187.199 l 89 184.199 l 86 181.199 l h 83 184.199 m S Q q 1 0 0 1 0 0 cm 87.352 184.199 m 90.352 187.199 l 93.352 184.199 l 90.352 181.199 l h 87.352 184.199 m S Q q 1 0 0 1 0 0 cm 91.75 184.051 m 94.75 187.051 l 97.75 184.051 l 94.75 181.051 l h 91.75 184.051 m S Q q 1 0 0 1 0 0 cm 96.102 184.25 m 99.102 187.25 l 102.102 184.25 l 99.102 181.25 l h 96.102 184.25 m S Q q 1 0 0 1 0 0 cm 100.5 184.301 m 103.5 187.301 l 106.5 184.301 l 103.5 181.301 l h 100.5 184.301 m S Q q 1 0 0 1 0 0 cm 104.852 184.102 m 107.852 187.102 l 110.852 184.102 l 107.852 181.102 l h 104.852 184.102 m S Q q 1 0 0 1 0 0 cm 109.25 184.352 m 112.25 187.352 l 115.25 184.352 l 112.25 181.352 l h 109.25 184.352 m S Q q 1 0 0 1 0 0 cm 113.602 184.352 m 116.602 187.352 l 119.602 184.352 l 116.602 181.352 l h 113.602 184.352 m S Q q 1 0 0 1 0 0 cm 118 184.352 m 121 187.352 l 124 184.352 l 121 181.352 l h 118 184.352 m S Q q 1 0 0 1 0 0 cm 122.352 184.352 m 125.352 187.352 l 128.352 184.352 l 125.352 181.352 l h 122.352 184.352 m S Q q 1 0 0 1 0 0 cm 126.75 184.352 m 129.75 187.352 l 132.75 184.352 l 129.75 181.352 l h 126.75 184.352 m S Q q 1 0 0 1 0 0 cm 131.102 184.148 m 134.102 187.148 l 137.102 184.148 l 134.102 181.148 l h 131.102 184.148 m S Q q 1 0 0 1 0 0 cm 135.5 184.5 m 138.5 187.5 l 141.5 184.5 l 138.5 181.5 l h 135.5 184.5 m S Q q 1 0 0 1 0 0 cm 139.852 184.449 m 142.852 187.449 l 145.852 184.449 l 142.852 181.449 l h 139.852 184.449 m S Q q 1 0 0 1 0 0 cm 144.25 184.449 m 147.25 187.449 l 150.25 184.449 l 147.25 181.449 l h 144.25 184.449 m S Q q 1 0 0 1 0 0 cm 148.602 184.102 m 151.602 187.102 l 154.602 184.102 l 151.602 181.102 l h 148.602 184.102 m S Q q 1 0 0 1 0 0 cm 153 184.148 m 156 187.148 l 159 184.148 l 156 181.148 l h 153 184.148 m S Q q 1 0 0 1 0 0 cm 157.352 184.449 m 160.352 187.449 l 163.352 184.449 l 160.352 181.449 l h 157.352 184.449 m S Q q 1 0 0 1 0 0 cm 161.75 184.199 m 164.75 187.199 l 167.75 184.199 l 164.75 181.199 l h 161.75 184.199 m S Q q 1 0 0 1 0 0 cm 166.102 184.449 m 169.102 187.449 l 172.102 184.449 l 169.102 181.449 l h 166.102 184.449 m S Q q 1 0 0 1 0 0 cm 170.5 184.5 m 173.5 187.5 l 176.5 184.5 l 173.5 181.5 l h 170.5 184.5 m S Q q 1 0 0 1 0 0 cm 174.852 184 m 177.852 187 l 180.852 184 l 177.852 181 l h 174.852 184 m S Q q 1 0 0 1 0 0 cm 179.25 184.148 m 182.25 187.148 l 185.25 184.148 l 182.25 181.148 l h 179.25 184.148 m S Q q 1 0 0 1 0 0 cm 183.602 184.199 m 186.602 187.199 l 189.602 184.199 l 186.602 181.199 l h 183.602 184.199 m S Q q 1 0 0 1 0 0 cm 188 184.102 m 191 187.102 l 194 184.102 l 191 181.102 l h 188 184.102 m S Q q 1 0 0 1 0 0 cm 192.398 184.5 m 195.398 187.5 l 198.398 184.5 l 195.398 181.5 l h 192.398 184.5 m S Q q 1 0 0 1 0 0 cm 196.75 184.5 m 199.75 187.5 l 202.75 184.5 l 199.75 181.5 l h 196.75 184.5 m S Q q 1 0 0 1 0 0 cm 201.148 184.551 m 204.148 187.551 l 207.148 184.551 l 204.148 181.551 l h 201.148 184.551 m S Q q 1 0 0 1 0 0 cm 205.5 184.5 m 208.5 187.5 l 211.5 184.5 l 208.5 181.5 l h 205.5 184.5 m S Q q 1 0 0 1 0 0 cm 209.898 184.051 m 212.898 187.051 l 215.898 184.051 l 212.898 181.051 l h 209.898 184.051 m S Q q 1 0 0 1 0 0 cm 214.25 184.5 m 217.25 187.5 l 220.25 184.5 l 217.25 181.5 l h 214.25 184.5 m S Q q 1 0 0 1 0 0 cm 218.648 184.5 m 221.648 187.5 l 224.648 184.5 l 221.648 181.5 l h 218.648 184.5 m S Q q 1 0 0 1 0 0 cm 223 184.051 m 226 187.051 l 229 184.051 l 226 181.051 l h 223 184.051 m S Q q 1 0 0 1 0 0 cm 227.398 184.551 m 230.398 187.551 l 233.398 184.551 l 230.398 181.551 l h 227.398 184.551 m S Q q 1 0 0 1 0 0 cm 231.75 184.5 m 234.75 187.5 l 237.75 184.5 l 234.75 181.5 l h 231.75 184.5 m S Q q 1 0 0 1 0 0 cm 236.148 184.551 m 239.148 187.551 l 242.148 184.551 l 239.148 181.551 l h 236.148 184.551 m S Q q 1 0 0 1 0 0 cm 240.5 184.551 m 243.5 187.551 l 246.5 184.551 l 243.5 181.551 l h 240.5 184.551 m S Q q 1 0 0 1 0 0 cm 244.898 184.102 m 247.898 187.102 l 250.898 184.102 l 247.898 181.102 l h 244.898 184.102 m S Q q 1 0 0 1 0 0 cm 249.25 184.051 m 252.25 187.051 l 255.25 184.051 l 252.25 181.051 l h 249.25 184.051 m S Q q 1 0 0 1 0 0 cm 253.648 184.051 m 256.648 187.051 l 259.648 184.051 l 256.648 181.051 l h 253.648 184.051 m S Q q 1 0 0 1 0 0 cm 258 184.5 m 261 187.5 l 264 184.5 l 261 181.5 l h 258 184.5 m S Q q 1 0 0 1 0 0 cm 262.398 184.051 m 265.398 187.051 l 268.398 184.051 l 265.398 181.051 l h 262.398 184.051 m S Q q 1 0 0 1 0 0 cm 266.75 184.551 m 269.75 187.551 l 272.75 184.551 l 269.75 181.551 l h 266.75 184.551 m S Q q 1 0 0 1 0 0 cm 271.148 184.5 m 274.148 187.5 l 277.148 184.5 l 274.148 181.5 l h 271.148 184.5 m S Q q 1 0 0 1 0 0 cm 275.5 184 m 278.5 187 l 281.5 184 l 278.5 181 l h 275.5 184 m S Q q 1 0 0 1 0 0 cm 279.898 183.949 m 282.898 186.949 l 285.898 183.949 l 282.898 180.949 l h 279.898 183.949 m S Q q 1 0 0 1 0 0 cm 284.25 184.602 m 287.25 187.602 l 290.25 184.602 l 287.25 181.602 l h 284.25 184.602 m S Q q 1 0 0 1 0 0 cm 288.648 184.051 m 291.648 187.051 l 294.648 184.051 l 291.648 181.051 l h 288.648 184.051 m S Q q 1 0 0 1 0 0 cm 293 183.949 m 296 186.949 l 299 183.949 l 296 180.949 l h 293 183.949 m S Q q 1 0 0 1 0 0 cm 297.398 184.602 m 300.398 187.602 l 303.398 184.602 l 300.398 181.602 l h 297.398 184.602 m S Q q 1 0 0 1 0 0 cm 301.75 184.051 m 304.75 187.051 l 307.75 184.051 l 304.75 181.051 l h 301.75 184.051 m S Q q 1 0 0 1 0 0 cm 306.148 184.051 m 309.148 187.051 l 312.148 184.051 l 309.148 181.051 l h 306.148 184.051 m S Q q 1 0 0 1 0 0 cm 310.5 184.699 m 313.5 187.699 l 316.5 184.699 l 313.5 181.699 l h 310.5 184.699 m S Q q 1 0 0 1 0 0 cm 314.898 185.352 m 317.898 188.352 l 320.898 185.352 l 317.898 182.352 l h 314.898 185.352 m S Q q 1 0 0 1 0 0 cm 87.699 120.5 m 90.699 123.5 l 93.699 120.5 l 90.699 117.5 l h 87.699 120.5 m S Q 0 g q 1 0 0 1 0 0 cm 37.852 9.852 306.297 175.898 re S Q Q Q showpage %%Trailer end %%EOF starpu-1.3.9+dfsg/doc/doxygen/chapters/images/tasks_size_overhead.pdf000066400000000000000000000643671413463044200260310ustar00rootroot00000000000000%PDF-1.5 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xͮ8%e"oER 40]=BDd1?"Ρ{ &?FcF\x߿?cwey},_=y~._W~t\{+oྶ͡zǙ)/rZ޳`#鷯R{JiK=_Ϗ?=?_.EW\Y|cY죢~E[ߓ{ݾlO+Ky]nZ7nZrCћ~ -ӕXW=ƠY/&$خD>F"{ח}ڎ]_1x+"R/dLA\りZ$_ L}׉k(tpvuѤ,OEV* "c&NE~s>}](v{0dl/%w..un7`.Qt=Y}Qڃ d{)_b梿<-~EsѕRvo-˱^oˊq]kW+˻Yă5 5X=ӫ^KH ܿ$Am/EBQZv.|Y۟?ӟy墯Y6;([_+_ K,!h_[^ݗOԟ:!e#_n˚|/һVvߞեhlǃUK?ʓ(>w^дj}/0b8j2uqc̪$i*N9lZe?QTyWαw*PNRin[J.Rݶ[yCk%{qs";&m}knYۅ26˃ܲFjuǘ/VsI0H˜.Ck,uJs+yfyͰV]Q5=>WYuWt^W]KhS^׆v9J1f`&,83a,:MJjuY'0 QcJBUN&beqYn7ՌlʿSd]lydS(ǚ(f2c:4BĤ:R5l[6P~n*fh5\[5>~+mJo80MUDu÷zFol[ql*s!%R^'}]v/{<Ⱥgl*[uEۓLD0Łi2YsaS cGeBMj4NQ(!is=S~z>YQ+5|b~r4>[QuԒ0tTm$>~:{N~:2ud\ΉU5}r5{|$°ϿWqV#?k-loG8|^kK)S/e|'$'m_?4Z9Xr2n$ZtJ uG΃P|yli|eD΃Pv4%%A׍8i+ZC9[n8 W'LJD&"GC >ʦTMd;('Ș\~zG0ReCS)2i=luK|Iu;خGC|=_lAר$6[e[;0[=\mʢ4` a"<ɲ<[D<ց{^0ޞeSX9Ov|([Xu>OUа[:ȂSk|esXo7j}0շȖGU\ٱTU_Γu'-b^}՗N]%ʦTMb+78 S$|uXtN6A8/Dqiτ i=Fb7XEC* |nr_!7غcz._ir+fU@Qtkg21`q/_ןأp_h|{'qR]1rhrg5GxWǯM?K.I.MINDU)s RdD {POސK')3ګ9B&s3Hohs%h~p7*au x3:BO@:<B_FOm7~ti]x{ѓ>JMBϻo㬗%8뗙=~x`x !ptfs2mLS)- y]S=A]+Ğe6OyBl`Ϗ:̆h-Ô֞)3t(b6WTg 4`Hi6oyClP)l I[Ly`E-N"ǥ.u2?R gSfakϴO b`q(Ue @kMf "F 5ysNgS@blyt଄)t Q[Lq`t4|lt844׶\a6ucj\є/Viiƴ Lm MT>!٤jgoLPfYm6R]2G#&քbLk@.-fs󄶑b`Nc#t>8t>񂩁tj4dk[Lq`'Sj]f@:F9c F%q3FъcAb(`Z7 UqSe`o3)ENYtѩ  cCkm:<w:)t4r[Lq`3"o<ݷźcu4;\Jag\Y} \A `g} uxZ)I{@R'H͏lz:]P=`r3Ŏ!`2c"] -}tR:'Ow'Jl,)ֱew`}u+קXO6m#lyd+W^:<Vr3 w4 @̦*T{eXl-`h-6" B@i|NQQ#Lɳd`m!ɓmAXÌK ǖG6?RB!84b>)@[Lq`#^p!bc>9!IO2[Z8G쑧!@,LY%ɢ4& e DNMĻ-Ŕy a+4eHMS --CKo1Łi!<j"27*nh3[\m3MTTA]p7#BYawF QC\5c#\Ӑ#Fh<>E1 LgB4;Lq`ZaABMlԋp(KMȖRuX/gW9=jqOieZyes`y-+oq|6W."Sd;Sl}Ko1Łi>F}ls}O+7[Z{-:JK<l$"yJ(9yBȃ Dil9׵%_P>Fi8ߋ<ɌIq>S9SA&&p) UoZ{m]6?4" V4f#K)Cuò^鹈QI G̿ʦe6lŦTF0cC&9vBGy1uh-}`G%z.r5Jԇ%/n?Nǻc0ϟWVbTX Wt #[؄ʸg#$*s.P(QMD5=5QDq5?D{ʼn* D0Q8QNL }!RT'΢VQ%kc[& &2RuII$\T#M]-\4IVz8n4ѢU`-ZTc+-jiML M4qNXQ2ի)['(( ̫!pt xvxT9ѐ%C5US۵$fwIc}l#úw.mYg7x."rJɸU7d\``Bi+R{ER(Ԅ+&YFlA*m *ufNiH YQ_gKZ—_Vk/%v>ATROit{I p*peD!jٽ5OaJK X|I xFD*ՋQf@ѭy)(p(UB^,DXK G%mJJIBu~1Kj!t}9|}.H=Pbuc|Ӭ.1F=&sz5; F 圥t}5t^ C`~9i- Q @ _NY5nė_dy/tXZ*xgz6g\nWȗKavCNs'QZ4q=K),cNrG=MFiiZJ4ugir9v3<9lK1h1Zc4z;Q:@ҡ;FicS9HoA:@psw0frb9v}{z!9G:q-a;Gr޿K b1:6/=NrFKpFrvVLBJ- 7Ѽih iql8Q#1xya*?7qQs^91Tsִ '@͌K)h38쿛9PGsbs,cp)(nf؄1 4ÍXE> w6,&Fyx3rlRQ?lCf]) lRI4{V;}cFs7&[K\o]`:o]aֲwC+yICw1F;M1{wӍޙI~V{twr[&Κ> l7\7eXý3S:'> }S }Zh?ߌ9Ø>u:Xҍիc&ܪ©o]o]գHEYVaX{W tڢ.<l0q[`ɭۊ:,3XܺVGsN{=pk5;8uGot?K殫⎎tG?H˶? 2(/>CǀTK?XG]c-޶ 00#X7b- wn| PF-8f#ȿ-zKBǖO8FGH{}5H?{%A٦jua[KŋZR*{h7~tHtH[4tHvmtJzS::8 ~(mGכ:W/ZLUW4(oU<@K>_83zө3z+h ^{^_aёw7i}?DhY: .$(]JW}-HFƜ(x8Vs!:}?AGzMSILPXs7BVEWfQbYx~|̄!(}Wn1e(\ c]̮ś\<(j"WqPd(nvvv "JG\sJW{gޗnJW|:/A@0Ĉ7 E!ƃI(O&Hةr]$KGڟJ-²χ9͟Fs`֖u7YP/Rr:촬ԗMNjS_h֣h* xx 8%kѨTt˩æE1yh+jXsQZ.A0[xT^|P EJA ERUʧQԶr˧t.Ő?S8FȔB1$}%0 $&@2~5R@R2BKPE/7DRRKE.!uilUޔ@6r f[/bVХZȝn%V4/󕲹wi:ܒGȤ%n`(▐y0tN>-IpL-)ob*RQ0? &isg(PLc4(PV3|t:` JN0gG0ήo:j"*=H70h]IdMZVG4)X]7ɾuV?DD!Q%eat,74 X5$߭6*|(-bΎjy@pBe@pj'Lڿ=Vϊˎ7Di(۱Ԡl%ܪj2Ynyd *ܡ'FWqo(? O&sY9,)++Cn2ewܗ4QⅫ˼!8vwN,SX{".N^],&dMEܪCa1[M܄$wƁGlH8c97S vn ]Qx gV3b,7,8aNié#z 2VH[^ap.\Q6/}"hc,wI DI% hER8VvPݞH7":eww!ɴwe&GB2V <40[W|C"49=$8 e&Y tg0m?8K%UY1wo}Z(ʙ2ă.b,ߺ2s97-T bS45 (rވ(9-t]on%MշZĶ[e$MlPAؠS9 Afc,I(k͵Fh"fуߕ@ }w[(.(Ḃs0%YX&-o 'ߎZWRJASyAHCg*2YX#wF+<CRG%L\}֑"n*gW8&"AR2H {7 {9j3L0LJoFT Iɽ-3nI-QRэWg@TJi sA,"VGgʪ~~ZN*);k'JPƝ#`:Zs.e&*.S[7Vji+:jMTt$~6,1.zہB;Ÿj ½˓I0,~~;gj*žq-gp.v`.om@.'@+R@@ERqQm 1 b)jY7#9nOPZ6K!UL)u߁#mBwN3EYl..[Tii/q 2ԪO|k@bI;yK!uLIk3HuSGSk?]TRMn ߥڝNuh"-CȢ*S^,E{d:wF'rErw:j 5.;ڋ&LS_;zH*Kn\j&Pq,EU 922|G#5|yRpz`6)kE6*P'0ܐ|8CBCg(_g+C,yk\kE,"tI"C> RzGuyxzE3?َє|o]O']g~{j+%7F*.R1%?N߸HaL{xศVnxS|h"ϦoZxӎ_j}*5QAG8vT.rdkjT. ,EUPz}U3w3EKYIdj%D{xศV-ShnY:|仨~G|=`'ڣ ˟.T*&IN+P|hj'(fZ]T93iy[ {`5"s.-e ՟.D^\ PYfxT# vG!y!uLUcMB;"wnrȳ(K~=2z7qoʎ:c5wkG#U|Yuu.!@,E[LUcElXnFj.6̤V4F{xศ7  jۛ'+S7). 2^_dyc#eAf𚭾%܊֯aJrA*lJ+RX ?)*XmNZn$ĤL ry?At$Oحq4NȤdzmk>-1I,LyBOtb@jEgNġ TS5vJ*XUX %nPΗf$=GzuSL?56cԍKJ]3<6 HC䔞֋[*T1 -N{ mS߆=qBGÍwN>~b +pmָ%@U9mm5=wLdF:r|@'/t^IF">!r냄4yA9*&%[Ga=d Y2z߭vtW~M<> Hq&/+]|h8Q7.qMN~b pMp˫65 !"۹N.u_gH_.mQ:~4+wb;"MF} jf)_L s;iO3Q'hGM@&vG<03=±[ hy0 oy2GU![8o=E$#G[g; O|j63'Q|>9뫯i8êO+NxUxl"q!6m=GO͌y^4 tOH-0,4$Kad À-EM'TB[3n5Cp v8>"Dte\t4VTl6 цOL6ZipŽGvb0T0pnGHH}0E޳|[ !#% hp4C#ˆ4/h^~} 2wW"Mz0<`i/wKG@ʽ:P,C(KZ ռ({!GO\4>LJ<>!Be,4Cd),泂D:>&"ǎ'4N[=EL;v 8>"Dx]CN|FᏊRXl>!A7H$tH"}DnWMI}zmx3'<~厦C)#t5LScb AR%4JSAǙ,E'(,Ue׉#B@@\stnM"'Q6\VZJ^,e#q !@q5 a$vBGNuhz!rcN|0Zx2c<1}Dji>3 ay&*f0j #ӢG-g^իrqsFKqn{wxkuIcrpm9^qs+!˲@7Y'`>RؾTy0!nDxC s*5K(Ɲ}P~{5zoC&L>5|[yT?ۨXhM7|.}& #۲l{Fn#Cdh#)X9$0 1 $l6aGe ^83lC]3׸U.x"邡GcXsPiizfBJ7SK=1]nP2z,4p"j,VÌ4rV͞!9`knCd#<= 6 !&k Q¥Xߝ@@>M xXִujSh>&/DVQ^̯3ij"< (P?1]HIƗqu5%.t)5EƪoʋJ`Y 5Ga=rLC|찷;45r8]nN[?O/a]ӱ?lʣS!8¡N0+td,oUĨմPk묝lR1/jZՌz53+O&O&~kÎgȞޞTEby';VQuX5C&R7g7غAa˜l鍧$a2'A̜-G/9A!3`i#ˣ{Nuz/"4yWC2aL%)Ò4ٜcZhJt 4eevIJȵ>nV"$ݰE_m] \n|bXak'\r ?B?hC]CS}9"1â?a>ȉbF ](gs ?.I^4.b0EM?/N32u< ~Č$UzcnNLkn\,$5$o~'D!nПl ԉb3vCNRU~8>/l]A.BGѹXx]M%LWOy16cW2G译sWIkr-u/3JeT#lh: ,5X/tbDٸ>8RtŊOvLkmJFsMUI9u4|7&%R|~!HA댺'i)@~BBE ԁp&,KaAdAuf!#n?ܐAϋm onU:h~9tP?^j u)X0b@=l!"qh_?}^ i70DjRө`T\:BDz{MN!07t#7S5MZ3vgj}Gu̻hh]Sdsԉ":afb^_gEhP&Xh:Н4Z#mn`F}DBh~k.m(ݙ)R]!ufAL/zd8yѼP]^-" $?ndɲthj 1+sq52 V-zc;}^4SK`dDtayZy&Q*@zZMbN'm+tAlGOusЏ"'_: bSro), L+=H>X2SGAnxW8niq Gu(O5XgDS{ 'xSUrh}ێQntH}\4$<=JJn :$  aƺrh#$DEtAdzLmpPOoՙ@Gwݾ%uHXRP0icή"hR|Ѥh}qu;FFʼn' l9&LdE0%(ȢP-ᩖY!׀#bILX4Nq1D- ml8 jL.>N }kTSSM}1ZU_, _z 8?j B_5L`SUae`bKtD]& se70O1ߔD%i&yt!:&sЩy"Әx򽣱DޣȽh1ּ-`[sq46!T;оΩiR #~P=7$XzDG:C@/V'L],v?eEٝ}zyrjXN>\K.8C_3}'bT FMpunKS3qΓaF#',Yrjnꬩ:> >> /Font << /f-0-0 6 0 R >> >> endobj 2 0 obj << /Type /Page % 1 /Parent 1 0 R /MediaBox [ 0 0 360 216 ] /Contents 4 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 3 0 R >> endobj 7 0 obj << /Length 8 0 R /Filter /FlateDecode /Length1 7628 >> stream xX{XUU_k{srs7DE-N-h@C3E-AB -Cs;G$/!36j4SSMP6HY=|u{Z{Jђr;{^A_+6%b'D9х޳lBlM]u3!!恇ys ?|rBb`йaz˰4wǖ;ϟ]}6Bb>bq4|o#sGBB\""^'mH5"]jV&$\M|\{zg,"t3^2~#R*QX:Đ@Zq;bZm4AVYH 3ILšq5W]WV~k+2fy >MХi\ D# ["A#9xiF"3:e&N>#Nl4M&EtX-Æo( YX?8_sޡ5%B7 8;@J\b& ch˖ A[H1kuƘAr#G,u*+f:1zmSE*]$۹Be qZ*.e:*T"x ɣҢBJR2~cs'4O'޾󛶾0#%f|NπӼoc7e<%Iw-ۅ< H܆z' 0NdVh^KZܞaEvnT{\U!HVU1N'њ%˲QV nEsJE O'C >&s5W⛒@RD z栾*Y'hq('<?:+6]u[ iB+-EBDBi^`S95u#5##u#:/$T-?'՛KJV*́ HZIz0L`88E&%-5'WekSǂe{w#%ިit0z֡ѰfΙUUi~3=\t`e]]/|bΞ~N XU 1pV֌&MIϯܴ| 5c%-!c5}\1gdD"-ZelMtiA]M9"T1ҒpxӽK _yW亳gm(,M{,M˖["m оʐ6q@SMz5JYXOņ!}av5(XMcJ2ЬD>YXXjtquXɡ9B=i(d>/̷whPyS0f7҈ͩѨIJ}7<1kx'?AS?}QC?ZEo6߿gLɦ=<ׇw1D׃XHF>6K%1(%ى}-ЈZz{[9(܉H,,c˘nl5]'Qdh 4T4ZIoШu5J1HE?4E=e˞-m'AaGO͇ ׂfwD_S2پ!}▓录}K})j]D~PhPxw8Cy iUG-܉D `Xt*!MJ+v-B[=wZ6QdiF|ߏ8*j[--{!E#}6>$j3B 1'Je2uL[+՗ʌe2s눳4(Q]ϯ۽{]_+]-kcMp+rVnFW:tEJߟ:gECQ-o+>&{ӽ#} ?$H8xg0/@&,82/ ӊģb1 G*_1=1?}A"!g\ Vv/"mU A:Y@HIF6Fl$q_[ V2L,[|f6 o VrxH~DJA2I#G 3E[H FJOʄRn9Z,q,Rw>AΓ@ƑMQI)_wK)$[h2 P,| '+>%Ǭl2kdBjX-Qv;[F) ;lCBy.g:r?|cW]p. pi4\y|6}Vma4i|8| >8 Y?sx?o9?w;g`g9r8Ni-nx'Nq8Ž;hhp[r8sxCCZ \ga777ف@/~>{94r-=v݅v "ѯvNpaqغȶf#\A$X9lڨg8lCKq^`f/383 +x nd].8A'Gď8lq-D*C4N;(VZFy9 fzZ :Z3h835 BqPD Gmf f hzpm/L!, endstream endobj 8 0 obj 5355 endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode >> stream x]n E|,EWdYҍ}n?!Tc RƇ . ٩}iݰ@&vp&<݂F8ep( zRދ,u^plD]C%y6d`6ߧEӀA{[?"dɼmMum3VP~dpл :m:ol9[}탨K'ꊹJ\0%sI\1W;yO,%bV{yh/^I^kJZS#a6ĜMR6ŬesIy$gAjfM|d>e:;Ձ.~tӷb҃IJ oO\Uƪa endstream endobj 10 0 obj 335 endobj 11 0 obj << /Type /FontDescriptor /FontName /OOOCAG+BitstreamVeraSans-Roman /FontFamily (Bitstream Vera Sans) /Flags 32 /FontBBox [ -183 -235 1287 928 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 928 /StemV 80 /StemH 80 /FontFile2 7 0 R >> endobj 6 0 obj << /Type /Font /Subtype /TrueType /BaseFont /OOOCAG+BitstreamVeraSans-Roman /FirstChar 32 /LastChar 117 /FontDescriptor 11 0 R /Encoding /WinAnsiEncoding /Widths [ 317 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 636 636 636 636 636 636 636 636 636 636 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612 634 549 634 615 352 0 0 277 0 0 277 974 633 611 634 0 411 520 0 633 ] /ToUnicode 9 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 2 0 R ] /Count 1 >> endobj 12 0 obj << /Producer (cairo 1.16.0 (https://cairographics.org)) /CreationDate (D:20210315134910+01'00) >> endobj 13 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 14 0000000000 65535 f 0000026269 00000 n 0000019404 00000 n 0000019295 00000 n 0000000015 00000 n 0000019271 00000 n 0000025819 00000 n 0000019622 00000 n 0000025071 00000 n 0000025094 00000 n 0000025507 00000 n 0000025530 00000 n 0000026334 00000 n 0000026451 00000 n trailer << /Size 14 /Root 13 0 R /Info 12 0 R >> startxref 26504 %%EOF starpu-1.3.9+dfsg/doc/doxygen/chapters/images/tasks_size_overhead.png000066400000000000000000000267531413463044200260410ustar00rootroot00000000000000PNG  IHDR,MPLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ???___sVBrooo777f^v pHYs+ IDATxiª::E[g60{T"c%P( BP( BPуpM]wѺ<+j36Dz aw. zz ~uaPӝR` `ԯ5QZ'/j$}(u98* Zw;3Z\=[aza_Q73wk;,SֺPXw2_2<ھ i>IiL;}Hƛx}F޷:8CoC=Fc+-,MJiw j\wCy'wl$^G;ѓ{x"N=Jd!W[ j@0G" = AaLO2">d=L{π^EmD@TS!j UY|!j `O =6&`Cķ-KڋZ @9Ǥbbv[JFZ-{au 5pnPn6u@Lxܓ*1s=. wHVԂ) 7 hN%S4pұ00O J %Fc,q?RFvzw-r YOzX\my0ޯ:hD $H?@ZRYW>S4,lK;rV)0'ʂQ4 @F ۀ[8Huj޹=T:Xq-0z$5Rp 9(`Ej |4j*PO%:ڷy5PMWiodߙ;Ebj)j:?//171ڌ|,f(P{Z`h=j:?ǕdT'f*Qt~+18)/j!?]B_W@5Jg@!%o!F-dTb\퓫095eP̦fL,UXR4:>۽w/PŶhńRom~r|IMg6͡UbOyVPOW:?*U3t~Cqip)|lc{W8{?NaXˏ <=JBB,TU=gYiY}ȉ~ M=giY(y:sGk5"=K(q_0 Nl#O>2wΓDz\pGbL} g34V/AI<c>ޟ >d{|xp" >}o$> a&kX3Co:Dm@]/Wˎbwgta"-5u?+Es^ ,n׿3 ЛijM: Ѿe:dZCY:>/"@TXldY\ޛ(tZlJD;2 ViYjT+F)iTW*-KM6엳z@ NPۀTQefP v)#?x6iOefZ& Y:zDU:: T'Ⱦ_5Ld SUG|b5nj _*Jm% wOen͹k ?UiYjX˞sWʬYN ʾiY FvMsRQ{7nQ }Z Θu(*!N'@>-VM4L29J@>-?S~~p.bYX>>7buBК:Lo.s]5 򋷨oܚΊEV?@(P!uZ;cV"$$K b3B+dH/ժ]]NK#yY FHEWˍ~z y1<K]qQ8B]&;N BM}EBPE?6#z[R2>Ho >ƬXtL EZ8|@TEL* `9'Τuz0a#OI pU'Yzna8N|`Ac~dSՐōܦޜР̸1+c\Y?>n@5j^?/̸m@ p ~CeSyIʌY ,ӂ_O;PGk_sNRNi@9zD>4 )~q<*>v |PΊ?II$WLCo#1? Xf+bk]9.6nΊd=Goo֡oy +bED5cjX by75+VRdrfC{@s^5Ѩ-z'ּ~kP5#_ `#㨸Df3fHE_3:9H'ŚtBs2^ϒZ9wur6"%:z[0*)>E-w8:#OVxzC8 w?޺ן eh_9Hͷf8ɻ^*<0|zaXÀr+|ui:\)<׹T/C`׾먒s8Nտz&DѯO-dI+ur;9I+u4Y^Rˋv$\}g)^߫JO_?[@{pr|bw/:nQ+u izuWwV7~.9Mi+ui!?~`_g̹}g/aDJ$U3 PW>maFBXM_K8g޸ʈ~^!FB4Daou'ޠ:藺'% WR{9zG?Rp&X2O[FB'40tYm@3>i|KSS~>TÏ!zj<]~vĥ] *\$G%}rl;E 8֢p !T v]˔jGOGbit\ DR!59;CqOMS!x[TrJf>w^‚K˙ȝ?2V:WX}GJ ɽݞEO@KG;~ZH U72?֟P ,~|C{l"U t.q>G><IuI[ȇUp_f{.~R J!ȉ~j(0Gjݝ>&\Y`ueR:g霹`DRxw8J+FޤCGh/-=_H_OmnҒs %x$`Gt]+Uj`:#zJ~.<{BxGBHD}h 59ަnPEۡM재'x 0(';kng"A9w}0z[iɓC3G|*w1r QѢ*8d}t`cM}>ZMͱP V< S6U7~!wxD+_G<-ҶNF#ztoB۶g#zYѻUh֡9;wSDIaGnu7!ޭZF vDowTыtWi{eF!H׈~6;)~[iCm vD/~Zj3m `aT^Z'{j7B+\au%@BHGX y XSU+0&@[ބ`L`Л#O NFM!υѯ Eswᣎ@X`Ln'|@H`LΜѯ )8 {[ 7EIUN ~5z豹EM!!97.{OL XGw1!0$'E+t`L`H*["hƶ "'m4rߵuoX!Д7z2!F8@hʍ~MhA !:/*m*%-oKe8]n*% ޷m ^c,6k{GS۱Ys"}d>g*n{fj_cUǍ.~k ŵ_=bL \$u嶞Oj~Y5,\GTj@uh*6 `nVX8c׍Yq!}7q/ Lcq6`OXfq;xU0l}um0J&)+ !ϸ(1qk] 4 ';"6VlW_h&j]ZT~8m{l|9۸ u@Ϙa .XPBUa%XKʿeVCucF&/Fɲ]@ < -:Z`0Jl)d }?75a(NDSԆ_ole|>ŀwY6 s,?+eCLM7$r@c`ڕ#I Al@.ӏn{K Jĩ[pZ r~Ff-> Ao[ 96 22_fYOw_v c ם}@珽lfy@$([=B j//WI LYn Z%߶u+KCI򾁀z9ާB`~Z iVױL)Qsh]BɷsH4@@dHn5 > BV D C~hcQq̊q#z`;(Z::?MAIj;xH( kQW.޶U[&Y[ө 1 -۶ʮb]XxRe%CUp" ȤJOCLC?5C!'P%>Y9v:gyA/PX _.F:; ,RQձ!*Ysy/iR_"Gm!P ~MJ/1 t !xJ1P? @j# sߗf @pn j9'p[`>S".EAfH{G7u%4rF] . {mueEvn(3wO%}.}nh|Ì>#[k1P< }"9;P:^: 2]cQ/ ~CW  n{i [pPr+߃JaMfo%2/ao(pKP@=WeJMD;ր5:mo8pJ Ck _L[Nkj5MS(o+ qϘ:vcdfn6U۲L8qF%\ssL֧QVLcVܝ[\6F8ss5HEw/2BvNBꋙWv` Q~wQ38Vej =53ZcUd[eV2#-_ Df5XǷv2BDA{,xƽxM;X 3J@iՊ`į3ԛeT>}@csvռs޺@@Lݩ8qUV{ bʔ*.y$9ng\? ^`uVtjh(n1/ZoIHe3[5t !2*vc 8ecN.fUR.[!x!I製=ANŃ.%pcyrIVUp 9:bz0S$αvj@#okCI"g|ps{\`>d#v 0 Xf$(XI*v{D]YC{u~㰫=c`SfWǩPȕ-Ȩ:]`Xx/@꼿a8 @6ALg9ua[c<wfCPҡȳr&KOyf ]u؟mC,/<` y lQ0O/>q9wH :3'$IE 8IDAT"`.$p_-X5/Wɚfs$p:<ч| 7oz 䲫]< U)4 w im'cw>_p=p@&z1MV/a2ePݭ+P?\}-P (>1Sse[gZui X'G~Y[%?肽/0kcj3m:rm`1ofPs圻3niobǹF.f {dTHxVʊڋX7Z~ t"싩@v]"&3xR"d(W+xgȣ_11$71xπqb h:̥B/Z 4\E_PuTvu읗u>ZV Yn/Yl/bl>]ҲbŊBJ9 +wyHx̖239Nkۀe- 0X YSsY/# dKoԁb8.Pf+CeX43fO@w$;EJp h4X\uA7,_Xy{u^۩5:kHoeU1  .& еX0PeG,"O\m!i {H{5`bW#ة9|:F،Jlv$OrI@Mjp~? DxZZ:{J3Gt3'%۲X8j6QZb)S@B_YOa$n4-|:Ȃ*gPlm̲+*%OLLPbaG &Ub2wC/wĉtvˍo jARZهBu l\DT!^Ryuޯ`Ko\n5:9'i;@_URC?Xsc0]7 ]DpgjWNxzVɳ^nҾчCNdc_Y5Y.WMJ.ƺU]/g}r ;Wg z[i7Znu?o>ȋ:-o-sOa 0;ZW?OҊ\:Us"e]xuߌ/ۚ沜^^o?7b 4ѫgׄNԲ7{ۯ־Ue;zV=8>Ǣ)K˽ȁۓxep:`U|繯νiZpy\:.)#4=ށ y[f'5`YLz' \S7+ykɢw *MVQ(􅁄-+Y?5(`5 \N:;`\kt%Hm1s;L]Vn^G}pM2fjHH-̃:^Ǧcġ\\`q-[-?}" 7ZVm >142"?_qqb>ZG ڛ\]6UllXz'Ҷ// *K56nc~>oNG>_ Zb@.wVYy}k?֋^M.o"::^\Up"GǸ[d;*T}|⼼c V߻B*\]hPbhsYZ::\-ʧ"Vތ:X~On$kN.D!%vYfZ|uӟjsm yA>ٚ CX6ڋ:pHc1 A YN6ΥrEnY_!e1IVӟ߱WPGۛm (5`ued#%W 'u(]j S:z!W:ę\v"ѶA R=n":>e5pUyѨ qP( BPS&T4ُdU3K#%uT6{%kUQCtL5H꙼j~ƌ:ޞPX{HuOڣډm/;knX$0 º@+*nrTN٘j'jbY{Rgj#}5kcO/Hk;c[f.U 5Mɹgnz6*Y/7X{GMsuvkț3uQHBA=}mhvx&|$S,UYϮ"Ls4Un`kM㽦9"#6לuXcVP;Tm˪Aďb R]vl|U3'j͂8;kcRWǜѩSxYjX{T.ۨanUP,ѣ蜨c>NjuܙznWs7w<Tw`:[[UsOYb BP( BP( BP(*S,o.N'P]&蠶Q!Xϧ DnvZOy̔!V, 1sEP37Đ?˛e!׸O T߰=ͪjs:~l2~?GOCٍݛ #6}~(W< }fdRwV!OCTIt{De+$s@=;#7@jF,u4:iOQ$,x}cFNO:(9pPF4}V Q0]BQpM"@ !>@ !>@ !>@ !>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.3.9+dfsg/doc/doxygen/chapters/version.html000066400000000000000000000001461413463044200223710ustar00rootroot00000000000000This manual documents the usage of StarPU version 1.3.9. Its contents was last updated on 2021-10-21. starpu-1.3.9+dfsg/doc/doxygen/chapters/version.sty000066400000000000000000000001131413463044200222360ustar00rootroot00000000000000\newcommand{\STARPUUPDATED}{2021-10-21} \newcommand{\STARPUVERSION}{1.3.9} starpu-1.3.9+dfsg/doc/doxygen/doxygen-config.cfg.in000066400000000000000000000075251413463044200222230ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2011 Télécom-SudParis # 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. # INPUT = @top_srcdir@/doc/doxygen/chapters \ @top_srcdir@/doc/doxygen/chapters/api \ @top_builddir@/doc/doxygen/starpu_config.h \ @top_srcdir@/include/starpu_bitmap.h \ @top_srcdir@/include/starpu_bound.h \ @top_srcdir@/include/starpu_clusters.h \ @top_srcdir@/include/starpu_cusparse.h \ @top_srcdir@/include/starpu_cublas.h \ @top_srcdir@/include/starpu_cublas_v2.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_helper.h \ @top_srcdir@/include/starpu_mic.h \ @top_srcdir@/include/starpu_mpi_ms.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_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_dep.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_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/starpu_mpi.h \ @top_srcdir@/mpi/include/starpu_mpi_lb.h \ @top_srcdir@/mpi/include/fstarpu_mpi_mod.f90 \ @top_srcdir@/starpufft/include/starpufft.h \ @top_srcdir@/sc_hypervisor/include \ @top_srcdir@/sc_hypervisor/include/sc_hypervisor_config.h \ @top_srcdir@/sc_hypervisor/include/sc_hypervisor_policy.h \ @top_srcdir@/sc_hypervisor/include/sc_hypervisor_lp.h \ @top_srcdir@/sc_hypervisor/include/sc_hypervisor.h \ @top_srcdir@/sc_hypervisor/include/sc_hypervisor_monitoring.h \ @top_srcdir@/starpurm/include/starpurm.h \ @top_srcdir@/include/schedulers/starpu_heteroprio.h 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.3.9+dfsg/doc/doxygen/doxygen.cfg000066400000000000000000002366761413463044200203660ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # 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_MPI=1 \ STARPU_HAVE_HWLOC=1 \ STARPU_USE_SC_HYPERVISOR=1 \ STARPU_SIMGRID=1 \ STARPU_OPENMP=1 \ STARPU_CLUSTER=1 \ STARPU_MKL=1 \ STARPU_WORKER_CALLBACKS=1 \ STARPU_HAVE_GLPK_H=1 \ STARPU_USE_MPI_MASTER_SLAVE=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.3.9+dfsg/doc/doxygen/doxygen_filter.sh.in000077500000000000000000000021361413463044200221740ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 -i 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 -e 's/^\/\/.*//' | sed -e 's/STARPU_TASK_LIST_INLINE//' fi starpu-1.3.9+dfsg/doc/doxygen/refman.tex000066400000000000000000000226471413463044200202110ustar00rootroot00000000000000% StarPU --- Runtime system for heterogeneous multicore architectures. % % Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. % \input{./version.sty} \setlength{\parskip}{0pt} \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–2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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} \setcounter{tocdepth}{2} \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{How To Define a New Scheduling Policy} \label{HowToDefineANewSchedulingPolicy} \hypertarget{HowToDefineANewSchedulingPolicy}{} \input{HowToDefineANewSchedulingPolicy} \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 Xeon Phi Support} \label{MICSupport} \hypertarget{MICSupport}{} \input{MICSupport} \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{The StarPU OpenMP Runtime Support (SORS)} \label{OpenMPRuntimeSupport} \hypertarget{OpenMPRuntimeSupport}{} \input{OpenMPRuntimeSupport} \chapter{Clustering a Machine} \label{ClusteringAMachine} \hypertarget{ClusteringAMachine}{} \input{ClusteringAMachine} \chapter{Interoperability Support} \label{InteropSupport} \hypertarget{InteropSupport}{} \input{InteroperabilitySupport} \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{Deprecated List} \input{deprecated} \chapter{Module Documentation a.k.a StarPU's API} \label{ModuleDocumentation} \hypertarget{ModuleDocumentation}{} \input{group__API__Versioning} \newpage \input{group__API__Initialization__and__Termination} \newpage \input{group__API__Standard__Memory__Library} \newpage \input{group__API__Toolbox} \newpage \input{group__API__Threads} \newpage \input{group__API__Bitmap} \newpage \input{group__API__Workers__Properties} \newpage \input{group__API__Data__Management} \newpage \input{group__API__Data__Interfaces} \newpage \input{group__API__Data__Partition} \newpage \input{group__API__Out__Of__Core} \newpage \input{group__API__Codelet__And__Tasks} \newpage \input{group__API__Insert__Task} \newpage \input{group__API__Explicit__Dependencies} \newpage \input{group__API__Performance__Model} \newpage \input{group__API__Profiling} \newpage \input{group__API__Theoretical__Lower__Bound__on__Execution__Time} \newpage \input{group__API__CUDA__Extensions} \newpage \input{group__API__OpenCL__Extensions} \newpage \input{group__API__OpenMP__Runtime__Support} \newpage \input{group__API__MIC__Extensions} \newpage \input{group__API__Miscellaneous__Helpers} \newpage \input{group__API__FxT__Support} \newpage \input{group__API__FFT__Support} \newpage \input{group__API__MPI__Support} \newpage \input{group__API__Task__Bundles} \newpage \input{group__API__Task__Lists} \newpage \input{group__API__Parallel__Tasks} \newpage \input{group__API__Running__Drivers} \newpage \input{group__API__Expert__Mode} \newpage \input{group__API__Scheduling__Contexts} \newpage \input{group__API__Scheduling__Policy} \newpage \input{group__API__Tree} \newpage \input{group__API__SC__Hypervisor} \newpage \input{group__API__SC__Hypervisor__usage} \newpage \input{group__API__SC__Hypervisor__LP} \newpage \input{group__API__Modularized__Scheduler} \newpage \input{group__API__Clustering__Machine} \newpage \input{group__API__Interop__Support} \newpage \input{group__API__Master__Slave} \newpage \input{group__API__Random__Functions} \newpage \input{group__API__Sink} \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__clusters_8h} \input{starpu__config_8h} \input{starpu__cublas_8h} \input{starpu__cublas__v2_8h} \input{starpu__cusparse_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__helper_8h} \input{starpu__heteroprio_8h} \input{starpu__mic_8h} \input{starpu__mod_8f90} \input{starpu__mpi_8h} \input{starpu__mpi__lb_8h} \input{starpu__mpi__ms_8h} \input{starpu__opencl_8h} \input{starpu__openmp_8h} \input{starpu__perfmodel_8h} \input{starpu__profiling_8h} \input{starpu__rand_8h} \input{starpu__sched__component_8h} \input{starpu__sched__ctx_8h} \input{starpu__sched__ctx__hypervisor_8h} \input{starpu__scheduler_8h} \input{starpu__simgrid__wrap_8h} \input{starpu__sink_8h} \input{starpu__stdlib_8h} \input{starpu__task_8h} \input{starpu__task__bundle_8h} \input{starpu__task__dep_8h} \input{starpu__task__list_8h} \input{starpu__task__util_8h} \input{starpu__thread_8h} \input{starpu__thread__util_8h} \input{starpu__tree_8h} \input{starpu__util_8h} \input{starpu__worker_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} \input{starpurm_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{The GNU Free Documentation License} \label{GNUFreeDocumentationLicense} \hypertarget{GNUFreeDocumentationLicense}{} \input{GNUFreeDocumentationLicense} %\part{Index} \addcontentsline{toc}{chapter}{Index} \printindex \end{document} starpu-1.3.9+dfsg/doc/doxygen_dev/000077500000000000000000000000001413463044200170425ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen_dev/Makefile.am000066400000000000000000000246161413463044200211070ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_dev DOX_CONFIG = $(top_srcdir)/doc/doxygen_dev/doxygen.cfg DOX_HTML_DIR = html_dev DOX_LATEX_DIR = latex DOX_PDF = $(DOX_DIR)/starpu_dev.pdf DOX_TAG = starpu.tag txtdir = $(docdir)/manual EXTRA_DIST = if STARPU_BUILD_DOC if STARPU_BUILD_DOC_PDF all: $(DOX_HTML_DIR) $(DOX_PDF) EXTRA_DIST += $(DOX_HTML_DIR) $(DOX_PDF) txt_DATA = $(DOX_PDF) else all: $(DOX_HTML_DIR) EXTRA_DIST += $(DOX_HTML_DIR) endif DOX_HTML_SRCDIR=$(DOX_HTML_DIR) install-exec-hook: $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html_dev (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html_dev \;) uninstall-hook: rm -rf $(DESTDIR)$(docdir)/manual/html_dev else if STARPU_AVAILABLE_DOC EXTRA_DIST += $(top_srcdir)/doc/doxygen_dev/html_dev DOX_HTML_SRCDIR=$(top_srcdir)/doc/doxygen_dev/html_dev install-exec-hook: $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html_dev (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html_dev \;) uninstall-hook: rm -rf $(DESTDIR)$(docdir)/manual/html_dev endif if STARPU_AVAILABLE_DOC_PDF EXTRA_DIST += $(top_srcdir)/doc/doxygen_dev/starpu_dev.pdf txt_DATA = $(top_srcdir)/doc/doxygen_dev/starpu_dev.pdf endif endif chapters = \ chapters/000_introduction.doxy \ chapters/010_core.doxy images = if STARPU_BUILD_DOC EXTRA_DIST += \ $(top_srcdir)/doc/doxygen_dev/chapters/version.sty \ $(top_srcdir)/doc/doxygen_dev/chapters/version.html config.h: $(top_srcdir)/src/common/config.h.in @$(SED) 's/#undef \(.*\)/#define \1 1/' $< > $@ @$(SED) -i '1s/^/\/\*\* \@file \*\/\n/' $@ chapters/version.sty: $(chapters) @for f in $(chapters) ; do \ if test -f $(top_srcdir)/doc/doxygen_dev/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen_dev/$$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_dev/chapters/version.sty;\ else \ echo ':newcommand{:STARPUUPDATED}{unknown date}' > $(top_srcdir)/doc/doxygen_dev/chapters/version.sty;\ fi @echo ':newcommand{:STARPUVERSION}{$(VERSION)}' >> $(top_srcdir)/doc/doxygen_dev/chapters/version.sty @$(SED) -i 's/:/\\/g' $(top_srcdir)/doc/doxygen_dev/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_dev/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen_dev/$$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 internal usage of StarPU version $(VERSION)." > $(top_srcdir)/doc/doxygen_dev/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_dev/chapters/version.html;\ else \ echo "Its contents was last updated on unknown_date." >> $(top_srcdir)/doc/doxygen_dev/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) \ config.h \ chapters/version.sty \ chapters/version.html \ $(top_srcdir)/src/datawizard/data_request.h \ $(top_srcdir)/src/datawizard/coherency.h \ $(top_srcdir)/src/datawizard/sort_data_handles.h \ $(top_srcdir)/src/datawizard/memalloc.h \ $(top_srcdir)/src/datawizard/copy_driver.h \ $(top_srcdir)/src/datawizard/filters.h \ $(top_srcdir)/src/datawizard/datastats.h \ $(top_srcdir)/src/datawizard/write_back.h \ $(top_srcdir)/src/datawizard/interfaces/data_interface.h \ $(top_srcdir)/src/datawizard/memory_manager.h \ $(top_srcdir)/src/datawizard/node_ops.h \ $(top_srcdir)/src/datawizard/memstats.h \ $(top_srcdir)/src/datawizard/datawizard.h \ $(top_srcdir)/src/datawizard/memory_nodes.h \ $(top_srcdir)/src/datawizard/footprint.h \ $(top_srcdir)/src/datawizard/malloc.h \ $(top_srcdir)/src/drivers/cpu/driver_cpu.h \ $(top_srcdir)/src/drivers/cuda/driver_cuda.h \ $(top_srcdir)/src/drivers/opencl/driver_opencl_utils.h \ $(top_srcdir)/src/drivers/opencl/driver_opencl.h \ $(top_srcdir)/src/drivers/disk/driver_disk.h \ $(top_srcdir)/src/drivers/mpi/driver_mpi_common.h \ $(top_srcdir)/src/drivers/mpi/driver_mpi_sink.h \ $(top_srcdir)/src/drivers/mpi/driver_mpi_source.h \ $(top_srcdir)/src/drivers/mp_common/sink_common.h \ $(top_srcdir)/src/drivers/mp_common/mp_common.h \ $(top_srcdir)/src/drivers/mp_common/source_common.h \ $(top_srcdir)/src/drivers/driver_common/driver_common.h \ $(top_srcdir)/src/drivers/mic/driver_mic_sink.h \ $(top_srcdir)/src/drivers/mic/driver_mic_source.h \ $(top_srcdir)/src/drivers/mic/driver_mic_common.h \ $(top_srcdir)/src/profiling/profiling.h \ $(top_srcdir)/src/profiling/bound.h \ $(top_srcdir)/src/util/starpu_data_cpy.h \ $(top_srcdir)/src/util/openmp_runtime_support.h \ $(top_srcdir)/src/util/starpu_clusters_create.h \ $(top_srcdir)/src/util/starpu_task_insert_utils.h \ $(top_srcdir)/src/common/graph.h \ $(top_srcdir)/src/common/fxt.h \ $(top_srcdir)/src/common/starpu_spinlock.h \ $(top_srcdir)/src/common/rbtree_i.h \ $(top_srcdir)/src/common/rbtree.h \ $(top_srcdir)/src/common/timing.h \ $(top_srcdir)/src/common/rwlock.h \ $(top_srcdir)/src/common/barrier.h \ $(top_srcdir)/src/common/prio_list.h \ $(top_srcdir)/src/common/barrier_counter.h \ $(top_srcdir)/src/common/uthash.h \ $(top_srcdir)/src/common/utils.h \ $(top_srcdir)/src/common/thread.h \ $(top_srcdir)/src/common/list.h \ $(top_srcdir)/src/debug/starpu_debug_helpers.h \ $(top_srcdir)/src/debug/traces/starpu_fxt.h \ $(top_srcdir)/src/starpu_parameters.h \ $(top_srcdir)/src/sched_policies/fifo_queues.h \ $(top_srcdir)/src/sched_policies/helper_mct.h \ $(top_srcdir)/src/sched_policies/sched_component.h \ $(top_srcdir)/src/sched_policies/prio_deque.h \ $(top_srcdir)/src/core/jobs.h \ $(top_srcdir)/src/core/disk_ops/unistd/disk_unistd_global.h \ $(top_srcdir)/src/core/dependencies/tags.h \ $(top_srcdir)/src/core/dependencies/data_concurrency.h \ $(top_srcdir)/src/core/dependencies/implicit_data_deps.h \ $(top_srcdir)/src/core/dependencies/cg.h \ $(top_srcdir)/src/core/idle_hook.h \ $(top_srcdir)/src/core/sched_ctx_list.h \ $(top_srcdir)/src/core/perfmodel/multiple_regression.h \ $(top_srcdir)/src/core/perfmodel/perfmodel.h \ $(top_srcdir)/src/core/perfmodel/regression.h \ $(top_srcdir)/src/core/debug.h \ $(top_srcdir)/src/core/sched_ctx.h \ $(top_srcdir)/src/core/simgrid.h \ $(top_srcdir)/src/core/task_bundle.h \ $(top_srcdir)/src/core/topology.h \ $(top_srcdir)/src/core/combined_workers.h \ $(top_srcdir)/src/core/detect_combined_workers.h \ $(top_srcdir)/src/core/task.h \ $(top_srcdir)/src/core/disk.h \ $(top_srcdir)/src/core/sched_policy.h \ $(top_srcdir)/src/core/errorcheck.h \ $(top_srcdir)/src/core/progress_hook.h \ $(top_srcdir)/src/core/drivers.h \ $(top_srcdir)/src/core/workers.h $(DOX_HTML_DIR): $(DOX_TAG) @$(MKDIR_P) $(DOX_HTML_DIR) $(DOX_TAG): $(dox_inputs) @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @$(DOXYGEN) $(DOX_CONFIG) @$(SED) -i 's/ModuleDocumentation <\/li>/Modules<\/a>/' html_dev/index.html @$(SED) -i 's/FileDocumentation <\/li>/Files<\/a>/' html_dev/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_dev/navtree.js ; then $(SED) -i 's/\[ "Files", "Files.html", null \]/\[ "", "Files.html", null \]/' html_dev/navtree.js ; fi @$(SED) -i 's/.*"Files.html".*//' html_dev/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_dev/refman.tex >> $(DOX_LATEX_DIR)/refman.tex $(DOX_PDF): $(DOX_TAG) refman.tex @cp $(top_srcdir)/doc/doxygen_dev/chapters/version.sty $(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 s'/\\item Module\\-Documentation/\\item \\hyperlink{ModuleDocumentation}{Module Documentation}/' index.tex ;\ $(SED) -i s'/\\item File\\-Documentation/\\item \\hyperlink{FileDocumentation}{File Documentation}/' index.tex ;\ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ ! < refman.log grep -v group__ | grep -v _amgrp | grep -v deprecated__ | grep "multiply defined" || exit 1 ;\ $(MAKEINDEX) refman.idx ;\ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ 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 \ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex; \ repeat=`expr $$repeat - 1`; \ else \ done=1; \ fi; \ done mv $(DOX_LATEX_DIR)/refman.pdf $(DOX_PDF) CLEANFILES = $(DOX_TAG) config.h \ -r \ $(DOX_HTML_DIR) \ $(DOX_LATEX_DIR) \ $(DOX_PDF) endif EXTRA_DIST += doxygen.cfg refman.tex \ $(chapters) $(images) starpu-1.3.9+dfsg/doc/doxygen_dev/Makefile.in000066400000000000000000001056531413463044200211210ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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@ 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_BUILD_DOC_PDF_TRUE@@STARPU_BUILD_DOC_TRUE@am__append_1 = $(DOX_HTML_DIR) $(DOX_PDF) @STARPU_BUILD_DOC_PDF_FALSE@@STARPU_BUILD_DOC_TRUE@am__append_2 = $(DOX_HTML_DIR) @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@am__append_3 = $(top_srcdir)/doc/doxygen_dev/html_dev @STARPU_AVAILABLE_DOC_PDF_TRUE@@STARPU_BUILD_DOC_FALSE@am__append_4 = $(top_srcdir)/doc/doxygen_dev/starpu_dev.pdf @STARPU_BUILD_DOC_TRUE@am__append_5 = \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/doc/doxygen_dev/chapters/version.sty \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/doc/doxygen_dev/chapters/version.html subdir = doc/doxygen_dev ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_dev DOX_CONFIG = $(top_srcdir)/doc/doxygen_dev/doxygen.cfg DOX_HTML_DIR = html_dev DOX_LATEX_DIR = latex DOX_PDF = $(DOX_DIR)/starpu_dev.pdf DOX_TAG = starpu.tag txtdir = $(docdir)/manual EXTRA_DIST = $(am__append_1) $(am__append_2) $(am__append_3) \ $(am__append_4) $(am__append_5) doxygen.cfg refman.tex \ $(chapters) $(images) @STARPU_AVAILABLE_DOC_PDF_TRUE@@STARPU_BUILD_DOC_FALSE@txt_DATA = $(top_srcdir)/doc/doxygen_dev/starpu_dev.pdf @STARPU_BUILD_DOC_PDF_TRUE@@STARPU_BUILD_DOC_TRUE@txt_DATA = $(DOX_PDF) @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@DOX_HTML_SRCDIR = $(top_srcdir)/doc/doxygen_dev/html_dev @STARPU_BUILD_DOC_TRUE@DOX_HTML_SRCDIR = $(DOX_HTML_DIR) chapters = \ chapters/000_introduction.doxy \ chapters/010_core.doxy images = @STARPU_BUILD_DOC_TRUE@dox_inputs = $(DOX_CONFIG) \ @STARPU_BUILD_DOC_TRUE@ $(chapters) \ @STARPU_BUILD_DOC_TRUE@ config.h \ @STARPU_BUILD_DOC_TRUE@ chapters/version.sty \ @STARPU_BUILD_DOC_TRUE@ chapters/version.html \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/data_request.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/coherency.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/sort_data_handles.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/memalloc.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/copy_driver.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/filters.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/datastats.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/write_back.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/interfaces/data_interface.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/memory_manager.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/node_ops.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/memstats.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/datawizard.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/memory_nodes.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/footprint.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/datawizard/malloc.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/cpu/driver_cpu.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/cuda/driver_cuda.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/opencl/driver_opencl_utils.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/opencl/driver_opencl.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/disk/driver_disk.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mpi/driver_mpi_common.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mpi/driver_mpi_sink.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mpi/driver_mpi_source.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mp_common/sink_common.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mp_common/mp_common.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mp_common/source_common.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/driver_common/driver_common.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mic/driver_mic_sink.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mic/driver_mic_source.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/drivers/mic/driver_mic_common.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/profiling/profiling.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/profiling/bound.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/util/starpu_data_cpy.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/util/openmp_runtime_support.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/util/starpu_clusters_create.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/util/starpu_task_insert_utils.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/graph.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/fxt.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/starpu_spinlock.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/rbtree_i.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/rbtree.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/timing.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/rwlock.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/barrier.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/prio_list.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/barrier_counter.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/uthash.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/utils.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/thread.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/common/list.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/debug/starpu_debug_helpers.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/debug/traces/starpu_fxt.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/starpu_parameters.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/sched_policies/fifo_queues.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/sched_policies/helper_mct.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/sched_policies/sched_component.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/sched_policies/prio_deque.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/jobs.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/disk_ops/unistd/disk_unistd_global.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/dependencies/tags.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/dependencies/data_concurrency.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/dependencies/implicit_data_deps.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/dependencies/cg.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/idle_hook.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/sched_ctx_list.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/perfmodel/multiple_regression.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/perfmodel/perfmodel.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/perfmodel/regression.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/debug.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/sched_ctx.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/simgrid.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/task_bundle.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/topology.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/combined_workers.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/detect_combined_workers.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/task.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/disk.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/sched_policy.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/errorcheck.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/progress_hook.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/drivers.h \ @STARPU_BUILD_DOC_TRUE@ $(top_srcdir)/src/core/workers.h @STARPU_BUILD_DOC_TRUE@CLEANFILES = $(DOX_TAG) config.h \ @STARPU_BUILD_DOC_TRUE@ -r \ @STARPU_BUILD_DOC_TRUE@ $(DOX_HTML_DIR) \ @STARPU_BUILD_DOC_TRUE@ $(DOX_LATEX_DIR) \ @STARPU_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_dev/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/doxygen_dev/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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." @STARPU_AVAILABLE_DOC_FALSE@@STARPU_BUILD_DOC_FALSE@install-exec-hook: @STARPU_AVAILABLE_DOC_FALSE@@STARPU_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 @STARPU_BUILD_DOC_PDF_TRUE@@STARPU_BUILD_DOC_TRUE@all: $(DOX_HTML_DIR) $(DOX_PDF) @STARPU_BUILD_DOC_PDF_FALSE@@STARPU_BUILD_DOC_TRUE@all: $(DOX_HTML_DIR) @STARPU_BUILD_DOC_TRUE@install-exec-hook: @STARPU_BUILD_DOC_TRUE@ $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html_dev @STARPU_BUILD_DOC_TRUE@ (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html_dev \;) @STARPU_BUILD_DOC_TRUE@uninstall-hook: @STARPU_BUILD_DOC_TRUE@ rm -rf $(DESTDIR)$(docdir)/manual/html_dev @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@install-exec-hook: @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir)/manual/html_dev @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@ (cd $(DOX_HTML_SRCDIR) && $(PROG_FIND) . -type f -exec $(INSTALL_DATA) {} $(DESTDIR)$(docdir)/manual/html_dev \;) @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@uninstall-hook: @STARPU_AVAILABLE_DOC_TRUE@@STARPU_BUILD_DOC_FALSE@ rm -rf $(DESTDIR)$(docdir)/manual/html_dev @STARPU_BUILD_DOC_TRUE@config.h: $(top_srcdir)/src/common/config.h.in @STARPU_BUILD_DOC_TRUE@ @$(SED) 's/#undef \(.*\)/#define \1 1/' $< > $@ @STARPU_BUILD_DOC_TRUE@ @$(SED) -i '1s/^/\/\*\* \@file \*\/\n/' $@ @STARPU_BUILD_DOC_TRUE@chapters/version.sty: $(chapters) @STARPU_BUILD_DOC_TRUE@ @for f in $(chapters) ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $(top_srcdir)/doc/doxygen_dev/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen_dev/$$f ; fi \ @STARPU_BUILD_DOC_TRUE@ done | sort -r | head -1 > timestamp_sty @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_sty ; then \ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%d %B %Y" > timestamp_sty_updated ;\ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_sty` +"%B %Y" > timestamp_sty_updated_month ;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_sty_updated ; then \ @STARPU_BUILD_DOC_TRUE@ echo ':newcommand{:STARPUUPDATED}{'`cat timestamp_sty_updated`'}' > $(top_srcdir)/doc/doxygen_dev/chapters/version.sty;\ @STARPU_BUILD_DOC_TRUE@ else \ @STARPU_BUILD_DOC_TRUE@ echo ':newcommand{:STARPUUPDATED}{unknown date}' > $(top_srcdir)/doc/doxygen_dev/chapters/version.sty;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @echo ':newcommand{:STARPUVERSION}{$(VERSION)}' >> $(top_srcdir)/doc/doxygen_dev/chapters/version.sty @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/:/\\/g' $(top_srcdir)/doc/doxygen_dev/chapters/version.sty @STARPU_BUILD_DOC_TRUE@ @for f in timestamp_sty timestamp_sty_updated timestamp_sty_updated_month ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $$f ; then $(RM) $$f ; fi ;\ @STARPU_BUILD_DOC_TRUE@ done @STARPU_BUILD_DOC_TRUE@chapters/version.html: $(chapters) @STARPU_BUILD_DOC_TRUE@ @for f in $(chapters) ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $(top_srcdir)/doc/doxygen_dev/$$f ; then $(PROG_STAT) --format=%Y $(top_srcdir)/doc/doxygen_dev/$$f ; fi \ @STARPU_BUILD_DOC_TRUE@ done | sort -r | head -1 > timestamp_html @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_html ; then \ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%d %B %Y" > timestamp_html_updated ;\ @STARPU_BUILD_DOC_TRUE@ LC_ALL=C $(PROG_DATE) --date=@`cat timestamp_html` +"%B %Y" > timestamp_html_updated_month ;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @echo "This manual documents the internal usage of StarPU version $(VERSION)." > $(top_srcdir)/doc/doxygen_dev/chapters/version.html @STARPU_BUILD_DOC_TRUE@ @if test -s timestamp_html_updated ; then \ @STARPU_BUILD_DOC_TRUE@ echo "Its contents was last updated on "`cat timestamp_html_updated`"." >> $(top_srcdir)/doc/doxygen_dev/chapters/version.html;\ @STARPU_BUILD_DOC_TRUE@ else \ @STARPU_BUILD_DOC_TRUE@ echo "Its contents was last updated on unknown_date." >> $(top_srcdir)/doc/doxygen_dev/chapters/version.html;\ @STARPU_BUILD_DOC_TRUE@ fi @STARPU_BUILD_DOC_TRUE@ @for f in timestamp_html timestamp_html_updated timestamp_html_updated_month ; do \ @STARPU_BUILD_DOC_TRUE@ if test -f $$f ; then $(RM) $$f ; fi ;\ @STARPU_BUILD_DOC_TRUE@ done @STARPU_BUILD_DOC_TRUE@$(DOX_HTML_DIR): $(DOX_TAG) @STARPU_BUILD_DOC_TRUE@ @$(MKDIR_P) $(DOX_HTML_DIR) @STARPU_BUILD_DOC_TRUE@$(DOX_TAG): $(dox_inputs) @STARPU_BUILD_DOC_TRUE@ @rm -fr $(DOX_HTML_DIR) $(DOX_LATEX_DIR) @STARPU_BUILD_DOC_TRUE@ @$(DOXYGEN) $(DOX_CONFIG) @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/ModuleDocumentation <\/li>/Modules<\/a>/' html_dev/index.html @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/FileDocumentation <\/li>/Files<\/a>/' html_dev/index.html @STARPU_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 @STARPU_BUILD_DOC_TRUE@ @if test -f html_dev/navtree.js ; then $(SED) -i 's/\[ "Files", "Files.html", null \]/\[ "", "Files.html", null \]/' html_dev/navtree.js ; fi @STARPU_BUILD_DOC_TRUE@ @$(SED) -i 's/.*"Files.html".*//' html_dev/pages.html @STARPU_BUILD_DOC_TRUE@ @if test -f latex/main.tex ; then mv latex/main.tex latex/index.tex ; fi @STARPU_BUILD_DOC_TRUE@ @$(SED) -i '/\\begin{titlepage}/,$$d' $(DOX_LATEX_DIR)/refman.tex @STARPU_BUILD_DOC_TRUE@ @cat $(top_srcdir)/doc/doxygen_dev/refman.tex >> $(DOX_LATEX_DIR)/refman.tex @STARPU_BUILD_DOC_TRUE@$(DOX_PDF): $(DOX_TAG) refman.tex @STARPU_BUILD_DOC_TRUE@ @cp $(top_srcdir)/doc/doxygen_dev/chapters/version.sty $(DOX_LATEX_DIR) @STARPU_BUILD_DOC_TRUE@ @echo $(PDFLATEX) $(DOX_LATEX_DIR)/refman.tex @STARPU_BUILD_DOC_TRUE@ @cd $(DOX_LATEX_DIR) ;\ @STARPU_BUILD_DOC_TRUE@ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out ;\ @STARPU_BUILD_DOC_TRUE@ $(SED) -i s'/\\item Module\\-Documentation/\\item \\hyperlink{ModuleDocumentation}{Module Documentation}/' index.tex ;\ @STARPU_BUILD_DOC_TRUE@ $(SED) -i s'/\\item File\\-Documentation/\\item \\hyperlink{FileDocumentation}{File Documentation}/' index.tex ;\ @STARPU_BUILD_DOC_TRUE@ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ @STARPU_BUILD_DOC_TRUE@ ! < refman.log grep -v group__ | grep -v _amgrp | grep -v deprecated__ | grep "multiply defined" || exit 1 ;\ @STARPU_BUILD_DOC_TRUE@ $(MAKEINDEX) refman.idx ;\ @STARPU_BUILD_DOC_TRUE@ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex ;\ @STARPU_BUILD_DOC_TRUE@ done=0; repeat=5 ;\ @STARPU_BUILD_DOC_TRUE@ while test $$done = 0 -a $$repeat -gt 0; do \ @STARPU_BUILD_DOC_TRUE@ if $(EGREP) 'Rerun (LaTeX|to get cross-references right)' refman.log > /dev/null 2>&1; then \ @STARPU_BUILD_DOC_TRUE@ max_print_line=1000000 $(PDFLATEX) -interaction batchmode refman.tex; \ @STARPU_BUILD_DOC_TRUE@ repeat=`expr $$repeat - 1`; \ @STARPU_BUILD_DOC_TRUE@ else \ @STARPU_BUILD_DOC_TRUE@ done=1; \ @STARPU_BUILD_DOC_TRUE@ fi; \ @STARPU_BUILD_DOC_TRUE@ done @STARPU_BUILD_DOC_TRUE@ mv $(DOX_LATEX_DIR)/refman.pdf $(DOX_PDF) # 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.3.9+dfsg/doc/doxygen_dev/chapters/000077500000000000000000000000001413463044200206535ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/doxygen_dev/chapters/000_introduction.doxy000066400000000000000000000015631413463044200246650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \mainpage Introduction \htmlonly

Foreword

\endhtmlonly \htmlinclude version.html \htmlinclude foreword.html \section Motivation Motivation */ starpu-1.3.9+dfsg/doc/doxygen_dev/chapters/010_core.doxy000066400000000000000000000454361413463044200231040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /*! \page StarPUCore StarPU Core \section CoreEntities StarPU Core Entities TODO \subsection CoreEntitiesOverview Overview Execution entities: - worker: A worker (see \ref CoreEntitiesWorkers, \ref CoreEntitiesWorkersAndContexts) entity is a CPU thread created by StarPU to manage one computing unit. The computing unit can be a local CPU core, an accelerator or GPU device, or --- on the master side when running in master-slave distributed mode --- a remote slave computing node. It is responsible for querying scheduling policies for tasks to execute. - sched_context: A scheduling context (see \ref CoreEntitiesContexts, \ref CoreEntitiesWorkersAndContexts) is a logical set of workers governed by an instance of a scheduling policy. It defines the computing units to which the scheduling policy instance may assign work entities. - driver: A driver is the set of hardware-dependent routines used by a worker to initialize its associated computing unit, execute work entities on it, and finalize the computing unit usage at the end of the session. Work entities: - task: A task is a high level work request submitted to StarPU by the application, or internally by StarPU itself. - job: A job is a low level view of a work request. It is not exposed to the application. A job structure may be shared among several task structures in the case of a parallel task. Data entities: - data handle: A data handle is a high-level, application opaque object designating a piece of data currently registered to the StarPU data management layer. Internally, it is a \ref _starpu_data_state structure. - data replicate: A data replicate is a low-level object designating one copy of a piece of data registered to StarPU as a data handle, residing in one memory node managed by StarPU. It is not exposed to the application. \subsection CoreEntitiesWorkers Workers A worker is a CPU thread created by StarPU. Its role is to manage one computing unit. This computing unit can be a local CPU core, in which case, the worker thread manages the actual CPU core to which it is assigned; or it can be a computing device such as a GPU or an accelerator (or even a remote computing node when StarPU is running in distributed master-slave mode.) When a worker manages a computing device, the CPU core to which the worker's thread is by default exclusively assigned to the device management work and does not participate to computation. \subsubsection CoreEntitiesWorkersStates States Scheduling operations related state While a worker is conducting a scheduling operations, e.g. the worker is in the process of selecting a new task to execute, flag state_sched_op_pending is set to \c !0, otherwise it is set to \c 0. While state_sched_op_pending is !0, the following exhaustive list of operations on that workers are restricted in the stated way: - adding the worker to a context is not allowed; - removing the worker from a context is not allowed; - adding the worker to a parallel task team is not allowed; - removing the worker from a parallel task team is not allowed; - querying state information about the worker is only allowed while state_relax_refcnt > 0; - in particular, querying whether the worker is blocked on a parallel team entry is only allowed while state_relax_refcnt > 0. Entering and leaving the state_sched_op_pending state is done through calls to \ref _starpu_worker_enter_sched_op() and \ref _starpu_worker_leave_sched_op() respectively (see these functions in use in functions \ref _starpu_get_worker_task() and \ref _starpu_get_multi_worker_task()). These calls ensure that any pending conflicting operation deferred while the worker was in the state_sched_op_pending state is performed in an orderly manner.
Scheduling contexts related states Flag \c state_changing_ctx_notice is set to \c !0 when a thread is about to add the worker to a scheduling context or remove it from a scheduling context, and is currently waiting for a safe window to do so, until the targeted worker is not in a scheduling operation or parallel task operation anymore. This flag set to \c !0 will also prevent the targeted worker to attempt a fresh scheduling operation or parallel task operation to avoid starving conditions. However, a scheduling operation that was already in progress before the notice is allowed to complete. Flag \c state_changing_ctx_waiting is set to \c !0 when a scheduling context worker addition or removal involving the targeted worker is about to occur and the worker is currently performing a scheduling operation to tell the targeted worker that the initiator thread is waiting for the scheduling operation to complete and should be woken up upon completion.
Relaxed synchronization related states Any StarPU worker may participate to scheduling operations, and in this process, may be forced to observe state information from other workers. A StarPU worker thread may therefore be observed by any thread, even other StarPU workers. Since workers may observe each other in any order, it is not possible to rely exclusively on the \c sched_mutex of each worker to protect the observation of worker state flags by other workers, because worker A observing worker B would involve locking workers in (A B) sequence, while worker B observing worker A would involve locking workers in (B A) sequence, leading to lock inversion deadlocks. In consequence, no thread must hold more than one worker's sched_mutex at any time. Instead, workers implement a relaxed locking scheme based on the \c state_relax_refcnt counter, itself protected by the worker's sched_mutex. When state_relax_refcnt > 0, the targeted worker state flags may be observed, otherwise the thread attempting the observation must repeatedly wait on the targeted worker's \c sched_cond condition until state_relax_refcnt > 0. The relaxed mode, while on, can actually be seen as a transactional consistency model, where concurrent accesses are authorized and potential conflicts are resolved after the fact. When the relaxed mode is off, the consistency model becomes a mutual exclusion model, where the sched_mutex of the worker must be held in order to access or change the worker state.
Parallel tasks related states When a worker is scheduled to participate to the execution of a parallel task, it must wait for the whole team of workers participating to the execution of this task to be ready. While the worker waits for its teammates, it is not available to run other tasks or perform other operations. Such a waiting operation can therefore not start while conflicting operations such as scheduling operations and scheduling context resizing involving the worker are on-going. Conversely these operations and other may query weather the worker is blocked on a parallel task entry with \ref starpu_worker_is_blocked_in_parallel(). The \ref starpu_worker_is_blocked_in_parallel() function is allowed to proceed while and only while state_relax_refcnt > 0. Due to the relaxed worker locking scheme, the \c state_blocked_in_parallel flag of the targeted worker may change after it has been observed by an observer thread. In consequence, flag \c state_blocked_in_parallel_observed of the targeted worker is set to \c 1 by the observer immediately after the observation to "taint" the targeted worker. The targeted worker will clear the \c state_blocked_in_parallel_observed flag tainting and defer the processing of parallel task related requests until a full scheduling operation shot completes without the \c state_blocked_in_parallel_observed flag being tainted again. The purpose of this tainting flag is to prevent parallel task operations to be started immediately after the observation of a transient scheduling state. Worker's management of parallel tasks is governed by the following set of state flags and counters: - \c state_blocked_in_parallel: set to \c !0 while the worker is currently blocked on a parallel task; - \c state_blocked_in_parallel_observed: set to \c !0 to taint the worker when a thread has observed the state_blocked_in_parallel flag of this worker while its \c state_relax_refcnt state counter was \c >0. Any pending request to add or remove the worker from a parallel task team will be deferred until a whole scheduling operation shot completes without being tainted again. - \c state_block_in_parallel_req: set to \c !0 when a thread is waiting on a request for the worker to be added to a parallel task team. Must be protected by the worker's \c sched_mutex. - \c state_block_in_parallel_ack: set to \c !0 by the worker when acknowledging a request for being added to a parallel task team. Must be protected by the worker's \c sched_mutex. - \c state_unblock_in_parallel_req: set to \c !0 when a thread is waiting on a request for the worker to be removed from a parallel task team. Must be protected by the worker's \c sched_mutex. - \c state_unblock_in_parallel_ack: set to \c !0 by the worker when acknowledging a request for being removed from a parallel task team. Must be protected by the worker's \c sched_mutex. - \c block_in_parallel_ref_count: counts the number of consecutive pending requests to enter parallel task teams. Only the first of a train of requests for entering parallel task teams triggers the transition of the \c state_block_in_parallel_req flag from \c 0 to \c 1. Only the last of a train of requests to leave a parallel task team triggers the transition of flag \c state_unblock_in_parallel_req from \c 0 to \c 1. Must be protected by the worker's \c sched_mutex. \subsubsection CoreEntitiesWorkersOperations Operations Entry point All the operations of a worker are handled in an iterative fashion, either by the application code on a thread launched by the application, or automatically by StarPU on a device-dependent CPU thread launched by StarPU. Whether a worker's operation cycle is managed automatically or not is controlled per session by the field \c not_launched_drivers of the \c starpu_conf struct, and is decided in \ref _starpu_launch_drivers() function. When managed automatically, cycles of operations for a worker are handled by the corresponding driver specific _starpu__worker() function, where \c DRV is a driver name such as cpu (\c _starpu_cpu_worker) or cuda (\c _starpu_cuda_worker), for instance. Otherwise, the application must supply a thread which will repeatedly call \ref starpu_driver_run_once() for the corresponding worker. In both cases, control is then transferred to \ref _starpu_cpu_driver_run_once() (or the corresponding driver specific func). The cycle of operations typically includes, at least, the following operations: - task scheduling - parallel task team build-up - task input processing - data transfer processing - task execution When the worker cycles are handled by StarPU automatically, the iterative operation processing ends when the \c running field of \c _starpu_config becomes false. This field should not be read directly, instead it should be read through the \ref _starpu_machine_is_running() function.
Task scheduling If the worker does not yet have a queued task, it calls _starpu_get_worker_task() to try and obtain a task. This may involve scheduling operations such as stealing a queued but not yet executed task from another worker. The operation may not necessarily succeed if no tasks are ready and/or suitable to run on the worker's computing unit.
Parallel task team build-up If the worker has a task ready to run and the corresponding job has a size \c >1, then the task is a parallel job and the worker must synchronize with the other workers participating to the parallel execution of the job to assign a unique rank for each worker. The synchronization is done through the job's \c sync_mutex mutex.
Task input processing Before the task can be executed, its input data must be made available on a memory node reachable by the worker's computing unit. To do so, the worker calls \ref _starpu_fetch_task_input()
Data transfer processing The worker makes pending data transfers (involving memory node(s) that it is driving) progress, with a call to \ref __starpu_datawizard_progress(),
Task execution Once the worker has a pending task assigned and the input data for that task are available in the memory node reachable by the worker's computing unit, the worker calls \ref _starpu_cpu_driver_execute_task() (or the corresponding driver specific function) to proceed to the execution of the task. \subsection CoreEntitiesContexts Scheduling Contexts A scheduling context is a logical set of workers governed by an instance of a scheduling policy. Tasks submitted to a given scheduling context are confined to the computing units governed by the workers belonging to this scheduling context at the time they get scheduled. A scheduling context is identified by an unsigned integer identifier between \c 0 and STARPU_NMAX_SCHED_CTXS - 1. The \c STARPU_NMAX_SCHED_CTXS identifier value is reserved to indicated an unallocated, invalid or deleted scheduling context. Accesses to the scheduling context structure are governed by a multiple-readers/single-writer lock (\c rwlock field). Changes to the structure contents, additions or removals of workers, statistics updates, all must be done with proper exclusive write access. \subsection CoreEntitiesWorkersAndContexts Workers and Scheduling Contexts A worker can be assigned to one or more scheduling contexts. It exclusively receives tasks submitted to the scheduling context(s) it is currently assigned at the time such tasks are scheduled. A worker may add itself to or remove itself from a scheduling context.
Locking and synchronization rules between workers and scheduling contexts A thread currently holding a worker sched_mutex must not attempt to acquire a scheduling context rwlock, neither for writing nor for reading. Such an attempt constitutes a lock inversion and may result in a deadlock. A worker currently in a scheduling operation must enter the relaxed state before attempting to acquire a scheduling context rwlock, either for reading or for writing. When the set of workers assigned to a scheduling context is about to be modified, all the workers in the union between the workers belonging to the scheduling context before the change and the workers expected to belong to the scheduling context after the change must be notified using the \ref notify_workers_about_changing_ctx_pending() function prior to the update. After the update, all the workers in that same union must be notified for the update completion with a call to \ref notify_workers_about_changing_ctx_done(). The function \ref notify_workers_about_changing_ctx_pending() places every worker passed in argument in a state compatible with changing the scheduling context assignment of that worker, possibly blocking until that worker leaves incompatible states such as a pending scheduling operation. If the caller of \c notify_workers_about_changing_ctx_pending() is itself a worker included in the set of workers passed in argument, it does not notify itself, with the assumption that the worker is already calling \c notify_workers_about_changing_ctx_pending() from a state compatible with a scheduling context assignment update. Once a worker has been notified about a scheduling context change pending, it cannot proceed with incompatible operations such as a scheduling operation until it receives a notification that the context update operation is complete. \subsection CoreEntitiesDrivers Drivers Each driver defines a set of routines depending on some specific hardware. These routines include hardware discovery/initialization, task execution, device memory management and data transfers. While most hardware dependent routines are in source files located in the \c /src/drivers subdirectory of the StarPU tree, some can be found elsewhere in the tree such as \c src/datawizard/malloc.c for memory allocation routines or the subdirectories of \c src/datawizard/interfaces/ for data transfer routines. The driver ABI defined in the \ref _starpu_driver_ops structure includes the following operations: - \c .init: initialize a driver instance for the calling worker managing a hardware computing unit compatible with this driver. - \c .run_once: perform a single driver progress cycle for the calling worker (see \ref CoreEntitiesWorkersOperations). - \c .deinit: deinitialize the driver instance for the calling worker - \c .run: executes the following sequence automatically: call \c .init, repeatedly call \c .run_once until the function \ref _starpu_machine_is_running() returns false, call \c .deinit. The source code common to all drivers is shared in src/drivers/driver_common/driver_common.[ch]. This file includes services such as grabbing a new task to execute on a worker, managing statistics accounting on job startup and completion and updating the worker status \subsubsection CoreEntitiesDriversMP Master/Slave Drivers A subset of the drivers corresponds to drivers managing computing units in master/slave mode, that is, drivers involving a local master instance managing one or more remote slave instances on the targeted device(s). This includes devices such as discrete manycore accelerators (e.g. Intel's Knight Corners board, for instance), or pseudo devices such as a cluster of cpu nodes driver through StarPU's MPI master/slave mode. A driver instance on the master side is named the \b source, while a driver instances on the slave side is named the \b sink. A significant part of the work realized on the source and sink sides of master/slave drivers is identical among all master/slave drivers, due to the similarities in the software pattern. Therefore, many routines are shared among all these drivers in the \c src/drivers/mp_common subdirectory. In particular, a set of default commands to be used between sources and sinks is defined, assuming the availability of some communication channel between them (see enum \ref _starpu_mp_command) TODO \subsection CoreEntitiesTasksJobs Tasks and Jobs TODO \subsection CoreEntitiesData Data TODO */ starpu-1.3.9+dfsg/doc/doxygen_dev/chapters/version.html000066400000000000000000000001641413463044200232270ustar00rootroot00000000000000This manual documents the internal usage of StarPU version 1.3.9. Its contents was last updated on 21 October 2021. starpu-1.3.9+dfsg/doc/doxygen_dev/chapters/version.sty000066400000000000000000000001201413463044200230720ustar00rootroot00000000000000\newcommand{\STARPUUPDATED}{21 October 2021} \newcommand{\STARPUVERSION}{1.3.9} starpu-1.3.9+dfsg/doc/doxygen_dev/doxygen-config.cfg.in000066400000000000000000000141221413463044200230500ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # INPUT = @top_srcdir@/doc/doxygen_dev/chapters \ @top_builddir@/doc/doxygen_dev/config.h \ @top_srcdir@/src/datawizard/data_request.h \ @top_srcdir@/src/datawizard/coherency.h \ @top_srcdir@/src/datawizard/sort_data_handles.h \ @top_srcdir@/src/datawizard/memalloc.h \ @top_srcdir@/src/datawizard/copy_driver.h \ @top_srcdir@/src/datawizard/filters.h \ @top_srcdir@/src/datawizard/datastats.h \ @top_srcdir@/src/datawizard/write_back.h \ @top_srcdir@/src/datawizard/interfaces/data_interface.h \ @top_srcdir@/src/datawizard/memory_manager.h \ @top_srcdir@/src/datawizard/node_ops.h \ @top_srcdir@/src/datawizard/memstats.h \ @top_srcdir@/src/datawizard/datawizard.h \ @top_srcdir@/src/datawizard/memory_nodes.h \ @top_srcdir@/src/datawizard/footprint.h \ @top_srcdir@/src/datawizard/malloc.h \ @top_srcdir@/src/drivers/cpu/driver_cpu.h \ @top_srcdir@/src/drivers/cuda/driver_cuda.h \ @top_srcdir@/src/drivers/opencl/driver_opencl_utils.h \ @top_srcdir@/src/drivers/opencl/driver_opencl.h \ @top_srcdir@/src/drivers/disk/driver_disk.h \ @top_srcdir@/src/drivers/mpi/driver_mpi_common.h \ @top_srcdir@/src/drivers/mpi/driver_mpi_sink.h \ @top_srcdir@/src/drivers/mpi/driver_mpi_source.h \ @top_srcdir@/src/drivers/mp_common/sink_common.h \ @top_srcdir@/src/drivers/mp_common/mp_common.h \ @top_srcdir@/src/drivers/mp_common/source_common.h \ @top_srcdir@/src/drivers/driver_common/driver_common.h \ @top_srcdir@/src/drivers/mic/driver_mic_sink.h \ @top_srcdir@/src/drivers/mic/driver_mic_source.h \ @top_srcdir@/src/drivers/mic/driver_mic_common.h \ @top_srcdir@/src/profiling/profiling.h \ @top_srcdir@/src/profiling/bound.h \ @top_srcdir@/src/util/starpu_data_cpy.h \ @top_srcdir@/src/util/openmp_runtime_support.h \ @top_srcdir@/src/util/starpu_clusters_create.h \ @top_srcdir@/src/util/starpu_task_insert_utils.h \ @top_srcdir@/src/common/graph.h \ @top_srcdir@/src/common/fxt.h \ @top_srcdir@/src/common/starpu_spinlock.h \ @top_srcdir@/src/common/rbtree_i.h \ @top_srcdir@/src/common/rbtree.h \ @top_srcdir@/src/common/timing.h \ @top_srcdir@/src/common/rwlock.h \ @top_srcdir@/src/common/barrier.h \ @top_srcdir@/src/common/prio_list.h \ @top_srcdir@/src/common/barrier_counter.h \ @top_srcdir@/src/common/uthash.h \ @top_srcdir@/src/common/utils.h \ @top_srcdir@/src/common/thread.h \ @top_srcdir@/src/common/list.h \ @top_srcdir@/src/debug/starpu_debug_helpers.h \ @top_srcdir@/src/debug/traces/starpu_fxt.h \ @top_srcdir@/src/starpu_parameters.h \ @top_srcdir@/src/sched_policies/fifo_queues.h \ @top_srcdir@/src/sched_policies/helper_mct.h \ @top_srcdir@/src/sched_policies/sched_component.h \ @top_srcdir@/src/sched_policies/prio_deque.h \ @top_srcdir@/src/core/jobs.h \ @top_srcdir@/src/core/disk_ops/unistd/disk_unistd_global.h \ @top_srcdir@/src/core/dependencies/tags.h \ @top_srcdir@/src/core/dependencies/data_concurrency.h \ @top_srcdir@/src/core/dependencies/implicit_data_deps.h \ @top_srcdir@/src/core/dependencies/cg.h \ @top_srcdir@/src/core/idle_hook.h \ @top_srcdir@/src/core/sched_ctx_list.h \ @top_srcdir@/src/core/perfmodel/multiple_regression.h \ @top_srcdir@/src/core/perfmodel/perfmodel.h \ @top_srcdir@/src/core/perfmodel/regression.h \ @top_srcdir@/src/core/debug.h \ @top_srcdir@/src/core/sched_ctx.h \ @top_srcdir@/src/core/simgrid.h \ @top_srcdir@/src/core/task_bundle.h \ @top_srcdir@/src/core/topology.h \ @top_srcdir@/src/core/combined_workers.h \ @top_srcdir@/src/core/detect_combined_workers.h \ @top_srcdir@/src/core/task.h \ @top_srcdir@/src/core/disk.h \ @top_srcdir@/src/core/sched_policy.h \ @top_srcdir@/src/core/errorcheck.h \ @top_srcdir@/src/core/progress_hook.h \ @top_srcdir@/src/core/drivers.h \ @top_srcdir@/src/core/workers.h \ @top_srcdir@/mpi/src/starpu_mpi_init.h \ @top_srcdir@/mpi/src/starpu_mpi_datatype.h \ @top_srcdir@/mpi/src/starpu_mpi_task_insert.h \ @top_srcdir@/mpi/src/starpu_mpi_select_node.h \ @top_srcdir@/mpi/src/starpu_mpi_fxt.h \ @top_srcdir@/mpi/src/starpu_mpi_cache.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_mpi_backend.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_driver.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_early_data.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_comm.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_tag.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_early_request.h \ @top_srcdir@/mpi/src/mpi/starpu_mpi_sync_data.h \ @top_srcdir@/mpi/src/load_balancer/policy/load_data_interface.h \ @top_srcdir@/mpi/src/load_balancer/policy/load_balancer_policy.h \ @top_srcdir@/mpi/src/load_balancer/policy/data_movements_interface.h \ @top_srcdir@/mpi/src/nmad/starpu_mpi_nmad_backend.h \ @top_srcdir@/mpi/src/starpu_mpi_stats.h \ @top_srcdir@/mpi/src/starpu_mpi_private.h \ @top_srcdir@/mpi/src/starpu_mpi_cache_stats.h \ @top_srcdir@/starpurm/src/starpurm_private.h EXAMPLE_PATH = @top_srcdir@/doc/doxygen_dev \ @top_srcdir@/doc/doxygen/chapters INPUT_FILTER = @top_builddir@/doc/doxygen_dev/doxygen_filter.sh #LATEX_HEADER = @top_srcdir@/doc/doxygen_dev/refman.tex #IMAGE_PATH = @top_srcdir@/doc/doxygen_dev/chapters/images starpu-1.3.9+dfsg/doc/doxygen_dev/doxygen.cfg000066400000000000000000002365711413463044200212160ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # 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 Internal 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_dev # 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_MPI=1 \ STARPU_HAVE_HWLOC=1 \ STARPU_USE_SC_HYPERVISOR=1 \ STARPU_SIMGRID=1 \ STARPU_OPENMP=1 \ STARPU_USE_MPI_MPI=1 \ STARPU_USE_MPI_NMAD=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.3.9+dfsg/doc/doxygen_dev/doxygen_filter.sh.in000077500000000000000000000024301413463044200230270ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 -i 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 # replace LIST_TYPE foo by struct foo so that doxygen processes it correctly # we assume lines only containing ); are ending of the definition of such a struct sed -e 's/STARPU_DEPRECATED//' $1 | sed 's/^\/\/.*//' | sed 's/LIST_TYPE(\(.*\),/struct \1 {/' | sed 's/^);/};/' fi starpu-1.3.9+dfsg/doc/doxygen_dev/refman.tex000066400000000000000000000115431413463044200210400ustar00rootroot00000000000000% StarPU --- Runtime system for heterogeneous multicore architectures. % % Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria % % StarPU is free software; you can redistribute it and/or modify % it under the terms of the GNU Lesser General Public License as published by % the Free Software Foundation; either version 2.1 of the License, or (at % your option) any later version. % % StarPU is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even 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{./version.sty} \setlength{\parskip}{0pt} \begin{titlepage} \vspace*{4cm} {\Huge \textbf{StarPU Internal 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 internal usage of StarPU version \STARPUVERSION. Its contents was last updated on \STARPUUPDATED.\\ Copyright © 2009–2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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} \setcounter{tocdepth}{2} \tableofcontents \pagenumbering{arabic} \hypersetup{pageanchor=true,citecolor=blue} \chapter{Introduction} \label{index} \hypertarget{index}{} \input{index} \chapter{Star\+PU Core} \label{StarPUCore} \hypertarget{StarPUCore}{} \input{StarPUCore} \chapter{Module Index} \input{modules} \chapter{Module Documentation} \label{ModuleDocumentation} \hypertarget{ModuleDocumentation}{} \input{group__workers} \chapter{File Index} \input{files} \chapter{StarPU File Documentation} \input{barrier_8h} \input{barrier__counter_8h} \input{bound_8h} \input{cg_8h} \input{coherency_8h} \input{combined__workers_8h} \input{config_8h} \input{copy__driver_8h} \input{data__concurrency_8h} \input{data__interface_8h} \input{data__request_8h} \input{datastats_8h} \input{datawizard_8h} \input{debug_8h} \input{detect__combined__workers_8h} \input{disk_8h} \input{disk__unistd__global_8h} \input{driver__common_8h} \input{driver__cpu_8h} \input{driver__cuda_8h} \input{driver__disk_8h} \input{driver__mic__common_8h} \input{driver__mic__sink_8h} \input{driver__mic__source_8h} \input{driver__mpi__common_8h} \input{driver__mpi__sink_8h} \input{driver__mpi__source_8h} \input{driver__opencl_8h} \input{driver__opencl__utils_8h} \input{drivers_8h} \input{errorcheck_8h} \input{fifo__queues_8h} \input{filters_8h} \input{footprint_8h} \input{fxt_8h} \input{graph_8h} \input{helper__mct_8h} \input{idle__hook_8h} \input{implicit__data__deps_8h} \input{jobs_8h} \input{malloc_8h} \input{memalloc_8h} \input{memory__manager_8h} \input{memory__nodes_8h} \input{memstats_8h} \input{mp__common_8h} \input{multiple__regression_8h} \input{node__ops_8h} \input{openmp__runtime__support_8h} \input{perfmodel_8h} \input{prio__deque_8h} \input{prio__list_8h} \input{profiling_8h} \input{progress__hook_8h} \input{rbtree_8h} \input{rbtree__i_8h} \input{regression_8h} \input{rwlock_8h} \input{sched__component_8h} \input{sched__ctx_8h} \input{sched__ctx__list_8h} \input{sched__policy_8h} \input{simgrid_8h} \input{sink__common_8h} \input{sort__data__handles_8h} \input{source__common_8h} \input{starpu__clusters__create_8h} \input{starpu__data__cpy_8h} \input{starpu__debug__helpers_8h} \input{starpu__fxt_8h} \input{starpu__parameters_8h} \input{starpu__spinlock_8h} \input{starpu__task__insert__utils_8h} \input{tags_8h} \input{task_8h} \input{task__bundle_8h} \input{thread_8h} \input{timing_8h} \input{topology_8h} \input{utils_8h} \input{uthash_8h} \input{write__back_8h} \chapter{StarPU MPI File Documentation} \input{starpu__mpi__cache_8h} \input{starpu__mpi__driver_8h} \input{starpu__mpi__init_8h} \input{starpu__mpi__nmad__backend_8h} \input{starpu__mpi__stats_8h} \input{starpu__mpi__cache__stats_8h} \input{starpu__mpi__early__data_8h} \input{starpu__mpi__sync__data_8h} \input{starpu__mpi__comm_8h} \input{starpu__mpi__early__request_8h} \input{starpu__mpi__mpi__backend_8h} \input{starpu__mpi__private_8h} \input{starpu__mpi__tag_8h} \input{starpu__mpi__datatype_8h} \input{starpu__mpi__fxt_8h} \input{starpu__mpi__select__node_8h} \input{starpu__mpi__task__insert_8h} \input{load__balancer__policy_8h} \input{load__data__interface_8h} \input{data__movements__interface_8h} \chapter{StarPU Resource Manager File Documentation} \input{starpurm__private_8h} \end{document} starpu-1.3.9+dfsg/doc/tutorial/000077500000000000000000000000001413463044200163725ustar00rootroot00000000000000starpu-1.3.9+dfsg/doc/tutorial/Makefile000066400000000000000000000037261413463044200200420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3) LDLIBS += $$(pkg-config --libs starpu-1.3) HAS_CUDA = $(shell starpu_machine_display 2>/dev/null | grep CUDA | head -1) NVCC ?= nvcc HAS_OPENCL = $(shell starpu_machine_display 2>/dev/null | grep OpenCL | head -1) %.o: %.cu nvcc $(CFLAGS) $< -c TARGETS = hello_world vector_scal 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 LDLIBS += -lOpenCL endif vector_scal: $(VECTOR_SCAL_PREREQUISITES) $(VECTOR_SCAL_COMPILER) $^ $(LDLIBS) -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) $^ $(LDLIBS) -o $@ clean: rm -f $(TARGETS) *.o starpu-1.3.9+dfsg/doc/tutorial/README000066400000000000000000000023671413463044200172620ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 PATH=$PATH:$STARPU_DIR/bin % export PKG_CONFIG_PATH=$STARPU_DIR/lib/pkgconfig:$PKG_CONFIG_PATH % export LD_LIBRARY_PATH=$STARPU_DIR/lib:$LD_LIBRARY_PATH % starpu_machine_display % make hello_world % ./hello_world % make vector_scal % ./vector_scal % STARPU_NCPU=0 ./vector_scal % STARPU_NCPU=0 STARPU_NCUDA=0 ./vector_scal % STARPU_NCPU=0 STARPU_NOPENCL=0 ./vector_scal % STARPU_NOPENCL=0 STARPU_NCUDA=0 ./vector_scal starpu-1.3.9+dfsg/doc/tutorial/hello_world.c000066400000000000000000000033541413463044200210550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/doc/tutorial/hello_world_msvc.c000066400000000000000000000034421413463044200221030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 %p)\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.3.9+dfsg/doc/tutorial/vector_scal.c000066400000000000000000000101551413463044200210440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/doc/tutorial/vector_scal_cpu.c000066400000000000000000000035501413463044200217140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/doc/tutorial/vector_scal_cuda.cu000066400000000000000000000031351413463044200222250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/doc/tutorial/vector_scal_opencl.c000066400000000000000000000042041413463044200224020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; 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(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &programs, "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; else global = (global + local-1) / local * local; 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.3.9+dfsg/doc/tutorial/vector_scal_opencl_kernel.cl000066400000000000000000000015641413463044200241240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/000077500000000000000000000000001413463044200156005ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/Makefile.am000066400000000000000000000762001413463044200176410ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2016 Uppsala University # Copyright (C) 2017 Erwan Leria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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) -Wno-unused AM_CXXFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CXXFLAGS) -Wno-unused 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 \ mult/sgemm.sh \ 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 \ sched_ctx/axpy_partition_gpu.h \ sched_ctx/axpy_partition_gpu.cu \ heat/heat.sh \ cholesky/cholesky.sh \ cholesky/cholesky_compiled.c \ lu/lu.sh CLEANFILES = *.gcno *.gcda *.linkinfo *.mod starpu_idle_microsec.log *.mps */*.mps */*/*.mps *.dot */*.dot */*/*.dot *.pl */*.pl */*/*.pl *.png *.output tasks.rec perfs.rec */perfs.rec */*/perfs.rec perfs2.rec if STARPU_USE_CUDA if STARPU_COVERITY include $(top_srcdir)/starpu-mynvcc.mk else NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) .cu.o: $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) endif endif if STARPU_HAVE_ICC .icc.o: $(V_icc) $(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 \ sched_ctx/axpy_partition_gpu.h ##################################### # What to install and what to check # ##################################### examplebin_PROGRAMS += $(STARPU_EXAMPLES) TESTS = $(SHELL_TESTS) $(STARPU_EXAMPLES) SHELL_TESTS = if !STARPU_USE_MPI_MASTER_SLAVE SHELL_TESTS += scheduler/schedulers.sh SHELL_TESTS += scheduler/schedulers_context.sh if !STARPU_NO_BLAS_LIB SHELL_TESTS += mult/sgemm.sh endif endif check_PROGRAMS = $(STARPU_EXAMPLES) noinst_PROGRAMS = if !STARPU_HAVE_WINDOWS ## test loader program if !STARPU_CROSS_COMPILING LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ -I$(top_srcdir)/src/ LOADER_BIN = $(abs_top_builddir)/examples/$(LOADER) loader_SOURCES = ../tests/loader.c noinst_PROGRAMS += loader else LOADER = LOADER_BIN = $(top_builddir)/examples/loader-cross.sh endif if STARPU_USE_MPI_MASTER_SLAVE LOADER_BIN2 = $(MPI_LAUNCHER) $(LOADER_BIN) else LOADER_BIN2 = $(LOADER_BIN) endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN2) else TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN2) 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 \ scheduler/dummy_sched \ scheduler/dummy_modular_sched \ worker_collections/worker_list_example \ api/bcsr_data_interface \ api/block_data_interface \ api/coo_data_interface \ api/csr_data_interface \ api/matrix_data_interface \ api/multiformat_data_interface \ api/variable_data_interface \ api/vector_data_interface \ api/void_data_interface if !STARPU_SIMGRID STARPU_EXAMPLES += \ basic_examples/hello_world \ basic_examples/topology \ basic_examples/vector_scal \ basic_examples/mult \ basic_examples/block \ basic_examples/variable \ basic_examples/multiformat \ basic_examples/dynamic_handles \ basic_examples/task_insert_color \ mlr/mlr \ cpp/incrementer_cpp \ cpp/add_vectors \ cpp/add_vectors_interface \ filters/fread \ filters/fvector \ filters/fblock \ filters/fmatrix \ filters/fmultiple_manual \ filters/fmultiple_submit \ filters/fmultiple_submit_readonly \ filters/fmultiple_submit_implicit \ filters/frecursive \ 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/heteroprio_test \ sched_ctx/sched_ctx \ sched_ctx/sched_ctx_empty \ sched_ctx/sched_ctx_delete \ sched_ctx/two_cpu_contexts \ sched_ctx/dummy_sched_with_ctx \ worker_collections/worker_tree_example \ reductions/dot_product \ reductions/minmax_reduction \ dependency/task_end_dep \ dependency/task_end_dep_add \ dependency/sequential_consistency endif if !STARPU_SIMGRID STARPU_EXAMPLES += \ scheduler/dummy_sched if STARPU_HAVE_CXX11 STARPU_EXAMPLES += \ cpp/add_vectors_cpp11 endif 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 endif endif endif if STARPU_USE_CUDA STARPU_EXAMPLES += \ mult/sgemm \ mult/dgemm endif if !STARPU_NO_BLAS_LIB STARPU_EXAMPLES += \ mult/sgemm \ mult/dgemm \ lu/lu_example_float \ lu/lu_example_double \ lu/lu_implicit_example_float \ lu/lu_implicit_example_double \ cholesky/cholesky_tag \ cholesky/cholesky_tile_tag \ cholesky/cholesky_implicit \ cholesky/cholesky_compil if !STARPU_SIMGRID STARPU_EXAMPLES += \ axpy/axpy \ cholesky/cholesky_grain_tag \ heat/heat \ cg/cg \ pipeline/pipeline if !STARPU_USE_MPI_MASTER_SLAVE SHELL_TESTS += \ heat/heat.sh \ lu/lu.sh endif endif if STARPU_SIMGRID if !STARPU_QUICK_CHECK SHELL_TESTS += \ cholesky/cholesky.sh endif endif endif if !STARPU_SIMGRID if STARPU_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 STARPU_HAVE_CBLAS_H if STARPU_HAVE_CBLAS_SGEMV STARPU_EXAMPLES += \ spmv/dw_block_spmv endif 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_awake\ sched_ctx/parallel_tasks_reuse_handle \ sched_ctx/parallel_code if STARPU_HAVE_HWLOC if STARPU_HWLOC_HAVE_TOPOLOGY_DUP STARPU_EXAMPLES += \ sched_ctx/parallel_tasks_with_cluster_api endif endif endif endif !STARPU_SIMGRID if STARPU_USE_CUDA STARPU_EXAMPLES += \ sched_ctx/gpu_partition sched_ctx_gpu_partition_SOURCES = \ sched_ctx/gpu_partition.c \ sched_ctx/axpy_partition_gpu.cu endif ################## # 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 filters_fmultiple_submit_implicit_SOURCES = \ filters/fmultiple_submit_implicit.c if STARPU_USE_CUDA filters_fmultiple_submit_implicit_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 !STARPU_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 # ################ mult_sgemm_SOURCES = \ mult/sgemm.c mult_sgemm_LDADD = \ $(STARPU_BLAS_LDFLAGS) mult_dgemm_SOURCES = \ mult/dgemm.c mult_dgemm_LDADD = \ $(STARPU_BLAS_LDFLAGS) if !STARPU_NO_BLAS_LIB mult_sgemm_SOURCES += \ common/blas.c mult_dgemm_SOURCES += \ common/blas.c endif #################### # Cholesky example # #################### if !STARPU_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) cholesky_cholesky_compil_SOURCES = \ cholesky/cholesky_compil.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ sched_ctx_utils/sched_ctx_utils.c \ common/blas.c cholesky_cholesky_compil_LDADD = \ $(STARPU_BLAS_LDFLAGS) endif ############## # LU example # ############## if !STARPU_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 STARPU_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 !STARPU_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 !STARPU_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 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) ########################### # 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 ########################### # C++ Add vectors example # ########################### cpp_add_vectors_SOURCES = \ cpp/add_vectors.cpp cpp_add_vectors_interface_SOURCES = \ cpp/add_vectors_interface.cpp if STARPU_HAVE_CXX11 cpp_add_vectors_cpp11_SOURCES = \ cpp/add_vectors_cpp11.cpp 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 \ interface/complex_filters.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 STARPU_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 ###### # 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 STARPU_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 !STARPU_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.3.9+dfsg/examples/Makefile.in000066400000000000000000022172661413463044200176650ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_1 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) examplebin_PROGRAMS = $(am__EXEEXT_14) 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) $(am__EXEEXT_15) \ $(am__EXEEXT_16) TESTS = $(SHELL_TESTS) $(am__EXEEXT_14) @STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__append_2 = \ @STARPU_USE_MPI_MASTER_SLAVE_FALSE@ scheduler/schedulers.sh \ @STARPU_USE_MPI_MASTER_SLAVE_FALSE@ scheduler/schedulers_context.sh @STARPU_NO_BLAS_LIB_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__append_3 = mult/sgemm.sh check_PROGRAMS = $(am__EXEEXT_14) noinst_PROGRAMS = $(am__EXEEXT_17) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__append_4 = loader @STARPU_SIMGRID_FALSE@am__append_5 = basic_examples/hello_world \ @STARPU_SIMGRID_FALSE@ basic_examples/topology \ @STARPU_SIMGRID_FALSE@ basic_examples/vector_scal \ @STARPU_SIMGRID_FALSE@ basic_examples/mult 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@ basic_examples/task_insert_color mlr/mlr \ @STARPU_SIMGRID_FALSE@ cpp/incrementer_cpp cpp/add_vectors \ @STARPU_SIMGRID_FALSE@ cpp/add_vectors_interface filters/fread \ @STARPU_SIMGRID_FALSE@ filters/fvector filters/fblock \ @STARPU_SIMGRID_FALSE@ filters/fmatrix filters/fmultiple_manual \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit_readonly \ @STARPU_SIMGRID_FALSE@ filters/fmultiple_submit_implicit \ @STARPU_SIMGRID_FALSE@ filters/frecursive \ @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 spmv/spmv \ @STARPU_SIMGRID_FALSE@ callback/callback callback/prologue \ @STARPU_SIMGRID_FALSE@ incrementer/incrementer binary/binary \ @STARPU_SIMGRID_FALSE@ interface/complex matvecmult/matvecmult \ @STARPU_SIMGRID_FALSE@ profiling/profiling \ @STARPU_SIMGRID_FALSE@ scheduler/heteroprio_test \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_empty \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_delete \ @STARPU_SIMGRID_FALSE@ sched_ctx/two_cpu_contexts \ @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_SIMGRID_FALSE@ dependency/task_end_dep \ @STARPU_SIMGRID_FALSE@ dependency/task_end_dep_add \ @STARPU_SIMGRID_FALSE@ dependency/sequential_consistency \ @STARPU_SIMGRID_FALSE@ scheduler/dummy_sched @STARPU_HAVE_CXX11_TRUE@@STARPU_SIMGRID_FALSE@am__append_6 = \ @STARPU_HAVE_CXX11_TRUE@@STARPU_SIMGRID_FALSE@ cpp/add_vectors_cpp11 @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_7 = \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ fortran/hello @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_8 = \ @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ basic_examples/vector_scal_fortran @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__append_9 = \ @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_USE_CUDA_TRUE@am__append_10 = \ @STARPU_USE_CUDA_TRUE@ mult/sgemm \ @STARPU_USE_CUDA_TRUE@ mult/dgemm @STARPU_NO_BLAS_LIB_FALSE@am__append_11 = \ @STARPU_NO_BLAS_LIB_FALSE@ mult/sgemm \ @STARPU_NO_BLAS_LIB_FALSE@ mult/dgemm \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_float \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_double \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_implicit_example_float \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_implicit_example_double \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_tag \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_tile_tag \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_compil @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__append_12 = \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ axpy/axpy \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cholesky/cholesky_grain_tag \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ heat/heat \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cg/cg \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ pipeline/pipeline @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__append_13 = \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ heat/heat.sh \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ lu/lu.sh @STARPU_NO_BLAS_LIB_FALSE@@STARPU_QUICK_CHECK_FALSE@@STARPU_SIMGRID_TRUE@am__append_14 = \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_QUICK_CHECK_FALSE@@STARPU_SIMGRID_TRUE@ cholesky/cholesky.sh @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@am__append_15 = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_example_complex_float \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_example_complex_double \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_float \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_double @STARPU_HAVE_CBLAS_H_TRUE@@STARPU_HAVE_CBLAS_SGEMV_TRUE@@STARPU_SIMGRID_FALSE@am__append_16 = \ @STARPU_HAVE_CBLAS_H_TRUE@@STARPU_HAVE_CBLAS_SGEMV_TRUE@@STARPU_SIMGRID_FALSE@ spmv/dw_block_spmv @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_17 = \ @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ fortran/hello @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__append_18 = \ @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@ basic_examples/vector_scal_fortran @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@am__append_19 = \ @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_awake\ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_tasks_reuse_handle \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_code @STARPU_HAVE_HWLOC_TRUE@@STARPU_HAVE_OPENMP_TRUE@@STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE@@STARPU_SIMGRID_FALSE@am__append_20 = \ @STARPU_HAVE_HWLOC_TRUE@@STARPU_HAVE_OPENMP_TRUE@@STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_tasks_with_cluster_api @STARPU_USE_CUDA_TRUE@am__append_21 = \ @STARPU_USE_CUDA_TRUE@ sched_ctx/gpu_partition @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_ICC_TRUE@am__append_22 = \ @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_ICC_TRUE@ basic_examples/vector_scal_cpu_icc.icc @STARPU_USE_CUDA_TRUE@am__append_23 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/vector_scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_24 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/vector_scal_opencl.c @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@am__append_25 = \ @STARPU_HAVE_F77_TRUE@@STARPU_USE_CUDA_TRUE@ basic_examples/vector_scal_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_26 = \ @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_27 = \ @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_28 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/block_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_29 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/block_opencl.c @STARPU_USE_CUDA_TRUE@am__append_30 = \ @STARPU_USE_CUDA_TRUE@ basic_examples/variable_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_31 = \ @STARPU_USE_OPENCL_TRUE@ basic_examples/variable_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_32 = \ @STARPU_USE_CUDA_TRUE@ filters/fblock_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_33 = \ @STARPU_USE_OPENCL_TRUE@ filters/fblock_opencl.c @STARPU_USE_CUDA_TRUE@am__append_34 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_35 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_36 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_37 = \ @STARPU_USE_CUDA_TRUE@ filters/fmultiple_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_38 = \ @STARPU_USE_CUDA_TRUE@ filters/custom_mf/conversion.cu \ @STARPU_USE_CUDA_TRUE@ filters/custom_mf/cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_39 = \ @STARPU_USE_OPENCL_TRUE@ filters/custom_mf/conversion_opencl.c \ @STARPU_USE_OPENCL_TRUE@ filters/custom_mf/custom_opencl.c @STARPU_NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@am__append_40 = \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@ axpy/axpy_opencl.c @STARPU_NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@am__append_41 = \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@ axpy/axpy_opencl_kernel.cl @STARPU_NO_BLAS_LIB_FALSE@am__append_42 = \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@am__append_43 = \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_USE_CUDA_TRUE@am__append_44 = \ @STARPU_USE_CUDA_TRUE@ spmv/spmv_cuda.cu @STARPU_USE_CUDA_TRUE@am__append_45 = \ @STARPU_USE_CUDA_TRUE@ incrementer/incrementer_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_46 = \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_47 = \ @STARPU_USE_CUDA_TRUE@ incrementer/incrementer_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_48 = \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl.c @STARPU_USE_OPENCL_TRUE@am__append_49 = \ @STARPU_USE_OPENCL_TRUE@ incrementer/incrementer_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_50 = \ @STARPU_USE_CUDA_TRUE@ interface/complex_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_51 = \ @STARPU_USE_OPENCL_TRUE@ interface/complex_kernels_opencl.c @STARPU_USE_CUDA_TRUE@am__append_52 = \ @STARPU_USE_CUDA_TRUE@ reductions/dot_product_kernels.cu @STARPU_HAVE_X11_TRUE@am__append_53 = $(X_CFLAGS) ###### # Pi # ###### @STARPU_HAVE_WINDOWS_FALSE@am__append_54 = \ @STARPU_HAVE_WINDOWS_FALSE@ pi/pi \ @STARPU_HAVE_WINDOWS_FALSE@ pi/pi_redux @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@am__append_55 = \ @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_56 = \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ pi/pi_redux_kernel.cu ########################### # OpenGL interoperability # ########################### @STARPU_HAVE_OPENGL_TRUE@am__append_57 = \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop/gl_interop \ @STARPU_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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = loader-cross.sh CONFIG_CLEAN_VPATH_FILES = @STARPU_SIMGRID_FALSE@am__EXEEXT_1 = \ @STARPU_SIMGRID_FALSE@ basic_examples/hello_world$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ basic_examples/topology$(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@ basic_examples/task_insert_color$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ mlr/mlr$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ cpp/incrementer_cpp$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ cpp/add_vectors$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ cpp/add_vectors_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/fread$(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@ filters/fmultiple_submit_implicit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/frecursive$(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/heteroprio_test$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_empty$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_delete$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ sched_ctx/two_cpu_contexts$(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_SIMGRID_FALSE@ dependency/task_end_dep$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ dependency/task_end_dep_add$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ dependency/sequential_consistency$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ scheduler/dummy_sched$(EXEEXT) @STARPU_HAVE_CXX11_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_2 = cpp/add_vectors_cpp11$(EXEEXT) @STARPU_HAVE_F77_H_TRUE@@STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_3 = fortran/hello$(EXEEXT) @STARPU_HAVE_F77_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_4 = basic_examples/vector_scal_fortran$(EXEEXT) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_5 = 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_USE_CUDA_TRUE@am__EXEEXT_6 = mult/sgemm$(EXEEXT) \ @STARPU_USE_CUDA_TRUE@ mult/dgemm$(EXEEXT) @STARPU_NO_BLAS_LIB_FALSE@am__EXEEXT_7 = mult/sgemm$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mult/dgemm$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_double$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_implicit_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_implicit_example_double$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_tag$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_tile_tag$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_compil$(EXEEXT) @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_8 = axpy/axpy$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cholesky/cholesky_grain_tag$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ heat/heat$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ cg/cg$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ pipeline/pipeline$(EXEEXT) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_9 = lu/lu_example_complex_float$(EXEEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_example_complex_double$(EXEEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_float$(EXEEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_SIMGRID_FALSE@ lu/lu_implicit_example_complex_double$(EXEEXT) @STARPU_HAVE_CBLAS_H_TRUE@@STARPU_HAVE_CBLAS_SGEMV_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_10 = spmv/dw_block_spmv$(EXEEXT) @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_11 = 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_awake$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_tasks_reuse_handle$(EXEEXT) \ @STARPU_HAVE_OPENMP_TRUE@@STARPU_SIMGRID_FALSE@ sched_ctx/parallel_code$(EXEEXT) @STARPU_HAVE_HWLOC_TRUE@@STARPU_HAVE_OPENMP_TRUE@@STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_12 = sched_ctx/parallel_tasks_with_cluster_api$(EXEEXT) @STARPU_USE_CUDA_TRUE@am__EXEEXT_13 = \ @STARPU_USE_CUDA_TRUE@ sched_ctx/gpu_partition$(EXEEXT) am__EXEEXT_14 = sched_ctx/prio$(EXEEXT) scheduler/dummy_sched$(EXEEXT) \ scheduler/dummy_modular_sched$(EXEEXT) \ worker_collections/worker_list_example$(EXEEXT) \ api/bcsr_data_interface$(EXEEXT) \ api/block_data_interface$(EXEEXT) \ api/coo_data_interface$(EXEEXT) \ api/csr_data_interface$(EXEEXT) \ api/matrix_data_interface$(EXEEXT) \ api/multiformat_data_interface$(EXEEXT) \ api/variable_data_interface$(EXEEXT) \ api/vector_data_interface$(EXEEXT) \ api/void_data_interface$(EXEEXT) $(am__EXEEXT_1) \ $(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_3) $(am__EXEEXT_4) $(am__EXEEXT_11) \ $(am__EXEEXT_12) $(am__EXEEXT_13) @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_15 = pi/pi$(EXEEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ pi/pi_redux$(EXEEXT) @STARPU_HAVE_OPENGL_TRUE@am__EXEEXT_16 = \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop/gl_interop$(EXEEXT) \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop/gl_interop_idle$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_17 = loader$(EXEEXT) PROGRAMS = $(examplebin_PROGRAMS) $(noinst_PROGRAMS) api_bcsr_data_interface_SOURCES = api/bcsr_data_interface.c api_bcsr_data_interface_OBJECTS = bcsr_data_interface.$(OBJEXT) api_bcsr_data_interface_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 api_block_data_interface_SOURCES = api/block_data_interface.c api_block_data_interface_OBJECTS = block_data_interface.$(OBJEXT) api_block_data_interface_LDADD = $(LDADD) api_coo_data_interface_SOURCES = api/coo_data_interface.c api_coo_data_interface_OBJECTS = coo_data_interface.$(OBJEXT) api_coo_data_interface_LDADD = $(LDADD) api_csr_data_interface_SOURCES = api/csr_data_interface.c api_csr_data_interface_OBJECTS = csr_data_interface.$(OBJEXT) api_csr_data_interface_LDADD = $(LDADD) api_matrix_data_interface_SOURCES = api/matrix_data_interface.c api_matrix_data_interface_OBJECTS = matrix_data_interface.$(OBJEXT) api_matrix_data_interface_LDADD = $(LDADD) api_multiformat_data_interface_SOURCES = \ api/multiformat_data_interface.c api_multiformat_data_interface_OBJECTS = \ multiformat_data_interface.$(OBJEXT) api_multiformat_data_interface_LDADD = $(LDADD) api_variable_data_interface_SOURCES = api/variable_data_interface.c api_variable_data_interface_OBJECTS = \ variable_data_interface.$(OBJEXT) api_variable_data_interface_LDADD = $(LDADD) api_vector_data_interface_SOURCES = api/vector_data_interface.c api_vector_data_interface_OBJECTS = vector_data_interface.$(OBJEXT) api_vector_data_interface_LDADD = $(LDADD) api_void_data_interface_SOURCES = api/void_data_interface.c api_void_data_interface_OBJECTS = void_data_interface.$(OBJEXT) api_void_data_interface_LDADD = $(LDADD) am__axpy_axpy_SOURCES_DIST = axpy/axpy.c common/blas.c \ axpy/axpy_opencl.c @STARPU_NO_BLAS_LIB_FALSE@@STARPU_USE_OPENCL_TRUE@am__objects_1 = axpy_opencl.$(OBJEXT) @STARPU_NO_BLAS_LIB_FALSE@am_axpy_axpy_OBJECTS = axpy.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) $(am__objects_1) axpy_axpy_OBJECTS = $(am_axpy_axpy_OBJECTS) am__DEPENDENCIES_1 = @STARPU_NO_BLAS_LIB_FALSE@axpy_axpy_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) 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) basic_examples_task_insert_color_SOURCES = \ basic_examples/task_insert_color.c basic_examples_task_insert_color_OBJECTS = \ task_insert_color.$(OBJEXT) basic_examples_task_insert_color_LDADD = $(LDADD) basic_examples_topology_SOURCES = basic_examples/topology.c basic_examples_topology_OBJECTS = topology.$(OBJEXT) basic_examples_topology_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 @STARPU_NO_BLAS_LIB_FALSE@am_cg_cg_OBJECTS = cg.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cg_kernels.$(OBJEXT) blas.$(OBJEXT) cg_cg_OBJECTS = $(am_cg_cg_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@cg_cg_DEPENDENCIES = $(am__DEPENDENCIES_1) am__cholesky_cholesky_compil_SOURCES_DIST = \ cholesky/cholesky_compil.c cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c sched_ctx_utils/sched_ctx_utils.c \ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@am_cholesky_cholesky_compil_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_compil.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) cholesky_cholesky_compil_OBJECTS = \ $(am_cholesky_cholesky_compil_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_compil_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(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 @STARPU_NO_BLAS_LIB_FALSE@am_cholesky_cholesky_grain_tag_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_grain_tag.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) cholesky_cholesky_grain_tag_OBJECTS = \ $(am_cholesky_cholesky_grain_tag_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_grain_tag_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_cholesky_cholesky_implicit_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) cholesky_cholesky_implicit_OBJECTS = \ $(am_cholesky_cholesky_implicit_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_cholesky_cholesky_tag_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_tag.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) cholesky_cholesky_tag_OBJECTS = $(am_cholesky_cholesky_tag_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_tag_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_cholesky_cholesky_tile_tag_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_tile_tag.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) cholesky_cholesky_tile_tag_OBJECTS = \ $(am_cholesky_cholesky_tile_tag_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_tile_tag_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am_cpp_add_vectors_OBJECTS = add_vectors.$(OBJEXT) cpp_add_vectors_OBJECTS = $(am_cpp_add_vectors_OBJECTS) cpp_add_vectors_LDADD = $(LDADD) am__cpp_add_vectors_cpp11_SOURCES_DIST = cpp/add_vectors_cpp11.cpp @STARPU_HAVE_CXX11_TRUE@am_cpp_add_vectors_cpp11_OBJECTS = \ @STARPU_HAVE_CXX11_TRUE@ add_vectors_cpp11.$(OBJEXT) cpp_add_vectors_cpp11_OBJECTS = $(am_cpp_add_vectors_cpp11_OBJECTS) cpp_add_vectors_cpp11_LDADD = $(LDADD) am_cpp_add_vectors_interface_OBJECTS = \ add_vectors_interface.$(OBJEXT) cpp_add_vectors_interface_OBJECTS = \ $(am_cpp_add_vectors_interface_OBJECTS) cpp_add_vectors_interface_LDADD = $(LDADD) 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) dependency_sequential_consistency_SOURCES = \ dependency/sequential_consistency.c dependency_sequential_consistency_OBJECTS = \ sequential_consistency.$(OBJEXT) dependency_sequential_consistency_LDADD = $(LDADD) dependency_task_end_dep_SOURCES = dependency/task_end_dep.c dependency_task_end_dep_OBJECTS = task_end_dep.$(OBJEXT) dependency_task_end_dep_LDADD = $(LDADD) dependency_task_end_dep_add_SOURCES = dependency/task_end_dep_add.c dependency_task_end_dep_add_OBJECTS = task_end_dep_add.$(OBJEXT) dependency_task_end_dep_add_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_implicit_SOURCES_DIST = \ filters/fmultiple_submit_implicit.c filters/fmultiple_cuda.cu am_filters_fmultiple_submit_implicit_OBJECTS = \ fmultiple_submit_implicit.$(OBJEXT) $(am__objects_18) filters_fmultiple_submit_implicit_OBJECTS = \ $(am_filters_fmultiple_submit_implicit_OBJECTS) filters_fmultiple_submit_implicit_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_fread_SOURCES = filters/fread.c filters_fread_OBJECTS = fread.$(OBJEXT) filters_fread_LDADD = $(LDADD) filters_frecursive_SOURCES = filters/frecursive.c filters_frecursive_OBJECTS = frecursive.$(OBJEXT) filters_frecursive_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 @STARPU_HAVE_OPENGL_TRUE@am_gl_interop_gl_interop_OBJECTS = \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop.$(OBJEXT) gl_interop_gl_interop_OBJECTS = $(am_gl_interop_gl_interop_OBJECTS) @STARPU_HAVE_OPENGL_TRUE@gl_interop_gl_interop_DEPENDENCIES = \ @STARPU_HAVE_OPENGL_TRUE@ $(am__DEPENDENCIES_1) am__gl_interop_gl_interop_idle_SOURCES_DIST = \ gl_interop/gl_interop_idle.c @STARPU_HAVE_OPENGL_TRUE@am_gl_interop_gl_interop_idle_OBJECTS = \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop_idle.$(OBJEXT) gl_interop_gl_interop_idle_OBJECTS = \ $(am_gl_interop_gl_interop_idle_OBJECTS) @STARPU_HAVE_OPENGL_TRUE@gl_interop_gl_interop_idle_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_heat_heat_OBJECTS = heat.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dw_factolu.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dw_factolu_tag.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dw_factolu_grain.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dw_sparse_cg.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ heat_display.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ lu_kernels_model.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dw_sparse_cg_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dw_factolu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) heat_heat_OBJECTS = $(am_heat_heat_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@heat_heat_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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_filters.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) complex_filters.$(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 @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_example_complex_double_OBJECTS = lu_example_complex_double.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ zlu.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ zlu_pivot.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ zlu_kernels.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_example_complex_double_OBJECTS = \ $(am_lu_lu_example_complex_double_OBJECTS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_complex_double_DEPENDENCIES = $(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 @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_example_complex_float_OBJECTS = lu_example_complex_float.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ clu.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ clu_pivot.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ clu_kernels.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_example_complex_float_OBJECTS = \ $(am_lu_lu_example_complex_float_OBJECTS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_complex_float_DEPENDENCIES = $(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 @STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_example_double_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ lu_example_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dlu.$(OBJEXT) dlu_pivot.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dlu_kernels.$(OBJEXT) blas.$(OBJEXT) lu_lu_example_double_OBJECTS = $(am_lu_lu_example_double_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_double_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_example_float_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ lu_example_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ slu.$(OBJEXT) slu_pivot.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ slu_kernels.$(OBJEXT) blas.$(OBJEXT) lu_lu_example_float_OBJECTS = $(am_lu_lu_example_float_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_float_DEPENDENCIES = \ @STARPU_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 @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_complex_double_OBJECTS = lu_example_complex_double.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ zlu_implicit.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ zlu_implicit_pivot.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ zlu_kernels.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_implicit_example_complex_double_OBJECTS = \ $(am_lu_lu_implicit_example_complex_double_OBJECTS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_double_DEPENDENCIES = $(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 @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_complex_float_OBJECTS = lu_example_complex_float.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ clu_implicit.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ clu_implicit_pivot.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ clu_kernels.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas_complex.$(OBJEXT) \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) lu_lu_implicit_example_complex_float_OBJECTS = \ $(am_lu_lu_implicit_example_complex_float_OBJECTS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_float_DEPENDENCIES = $(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 @STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_double_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ lu_example_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dlu_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dlu_implicit_pivot.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ dlu_kernels.$(OBJEXT) blas.$(OBJEXT) lu_lu_implicit_example_double_OBJECTS = \ $(am_lu_lu_implicit_example_double_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_double_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_lu_lu_implicit_example_float_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ lu_example_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ slu_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ slu_implicit_pivot.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ slu_kernels.$(OBJEXT) blas.$(OBJEXT) lu_lu_implicit_example_float_OBJECTS = \ $(am_lu_lu_implicit_example_float_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_float_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) mandelbrot_mandelbrot_SOURCES = mandelbrot/mandelbrot.c mandelbrot_mandelbrot_OBJECTS = \ mandelbrot_mandelbrot-mandelbrot.$(OBJEXT) @STARPU_HAVE_X11_TRUE@mandelbrot_mandelbrot_DEPENDENCIES = \ @STARPU_HAVE_X11_TRUE@ $(am__DEPENDENCIES_1) \ @STARPU_HAVE_X11_TRUE@ $(am__DEPENDENCIES_1) \ @STARPU_HAVE_X11_TRUE@ $(am__DEPENDENCIES_1) matvecmult_matvecmult_SOURCES = matvecmult/matvecmult.c matvecmult_matvecmult_OBJECTS = matvecmult.$(OBJEXT) matvecmult_matvecmult_LDADD = $(LDADD) mlr_mlr_SOURCES = mlr/mlr.c mlr_mlr_OBJECTS = mlr.$(OBJEXT) mlr_mlr_LDADD = $(LDADD) am__mult_dgemm_SOURCES_DIST = mult/dgemm.c common/blas.c @STARPU_NO_BLAS_LIB_FALSE@am__objects_21 = blas.$(OBJEXT) am_mult_dgemm_OBJECTS = dgemm.$(OBJEXT) $(am__objects_21) mult_dgemm_OBJECTS = $(am_mult_dgemm_OBJECTS) mult_dgemm_DEPENDENCIES = $(am__DEPENDENCIES_1) am__mult_sgemm_SOURCES_DIST = mult/sgemm.c common/blas.c am_mult_sgemm_OBJECTS = sgemm.$(OBJEXT) $(am__objects_21) mult_sgemm_OBJECTS = $(am_mult_sgemm_OBJECTS) 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_22 = 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_22) 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_23 = 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_23) 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 @STARPU_NO_BLAS_LIB_FALSE@am_pipeline_pipeline_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ pipeline.$(OBJEXT) blas.$(OBJEXT) pipeline_pipeline_OBJECTS = $(am_pipeline_pipeline_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@pipeline_pipeline_DEPENDENCIES = \ @STARPU_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_24 = reductions/dot_product_kernels.$(OBJEXT) am_reductions_dot_product_OBJECTS = dot_product.$(OBJEXT) \ $(am__objects_24) 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) am__sched_ctx_gpu_partition_SOURCES_DIST = sched_ctx/gpu_partition.c \ sched_ctx/axpy_partition_gpu.cu @STARPU_USE_CUDA_TRUE@am_sched_ctx_gpu_partition_OBJECTS = \ @STARPU_USE_CUDA_TRUE@ gpu_partition.$(OBJEXT) \ @STARPU_USE_CUDA_TRUE@ sched_ctx/axpy_partition_gpu.$(OBJEXT) sched_ctx_gpu_partition_OBJECTS = \ $(am_sched_ctx_gpu_partition_OBJECTS) sched_ctx_gpu_partition_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_parallel_tasks_with_cluster_api_SOURCES = \ sched_ctx/parallel_tasks_with_cluster_api.c sched_ctx_parallel_tasks_with_cluster_api_OBJECTS = \ parallel_tasks_with_cluster_api.$(OBJEXT) sched_ctx_parallel_tasks_with_cluster_api_LDADD = $(LDADD) 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_delete_SOURCES = sched_ctx/sched_ctx_delete.c sched_ctx_sched_ctx_delete_OBJECTS = sched_ctx_delete.$(OBJEXT) sched_ctx_sched_ctx_delete_LDADD = $(LDADD) sched_ctx_sched_ctx_empty_SOURCES = sched_ctx/sched_ctx_empty.c sched_ctx_sched_ctx_empty_OBJECTS = sched_ctx_empty.$(OBJEXT) sched_ctx_sched_ctx_empty_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_modular_sched_SOURCES = \ scheduler/dummy_modular_sched.c scheduler_dummy_modular_sched_OBJECTS = dummy_modular_sched.$(OBJEXT) scheduler_dummy_modular_sched_LDADD = $(LDADD) scheduler_dummy_sched_SOURCES = scheduler/dummy_sched.c scheduler_dummy_sched_OBJECTS = dummy_sched.$(OBJEXT) scheduler_dummy_sched_LDADD = $(LDADD) scheduler_heteroprio_test_SOURCES = scheduler/heteroprio_test.c scheduler_heteroprio_test_OBJECTS = heteroprio_test.$(OBJEXT) scheduler_heteroprio_test_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_OBJECTS = dw_block_spmv.$(OBJEXT) \ dw_block_spmv_kernels.$(OBJEXT) mm_to_bcsr.$(OBJEXT) \ mmio.$(OBJEXT) spmv_dw_block_spmv_OBJECTS = $(am_spmv_dw_block_spmv_OBJECTS) spmv_dw_block_spmv_DEPENDENCIES = $(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_25 = spmv/spmv_cuda.$(OBJEXT) am_spmv_spmv_OBJECTS = spmv.$(OBJEXT) spmv_kernels.$(OBJEXT) \ $(am__objects_25) 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) 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/add_vectors.Po \ ./$(DEPDIR)/add_vectors_cpp11.Po \ ./$(DEPDIR)/add_vectors_interface.Po ./$(DEPDIR)/axpy.Po \ ./$(DEPDIR)/axpy_opencl.Po ./$(DEPDIR)/bcsr_data_interface.Po \ ./$(DEPDIR)/binary.Po ./$(DEPDIR)/blas.Po \ ./$(DEPDIR)/blas_complex.Po ./$(DEPDIR)/block.Po \ ./$(DEPDIR)/block_cpu.Po ./$(DEPDIR)/block_data_interface.Po \ ./$(DEPDIR)/block_opencl.Po ./$(DEPDIR)/callback.Po \ ./$(DEPDIR)/cg.Po ./$(DEPDIR)/cg_kernels.Po \ ./$(DEPDIR)/cholesky_compil.Po \ ./$(DEPDIR)/cholesky_grain_tag.Po \ ./$(DEPDIR)/cholesky_implicit.Po \ ./$(DEPDIR)/cholesky_kernels.Po ./$(DEPDIR)/cholesky_models.Po \ ./$(DEPDIR)/cholesky_tag.Po ./$(DEPDIR)/cholesky_tile_tag.Po \ ./$(DEPDIR)/clu.Po ./$(DEPDIR)/clu_implicit.Po \ ./$(DEPDIR)/clu_implicit_pivot.Po ./$(DEPDIR)/clu_kernels.Po \ ./$(DEPDIR)/clu_pivot.Po ./$(DEPDIR)/complex.Po \ ./$(DEPDIR)/complex_filters.Po \ ./$(DEPDIR)/complex_interface.Po \ ./$(DEPDIR)/complex_kernels_opencl.Po \ ./$(DEPDIR)/conversion_opencl.Po \ ./$(DEPDIR)/coo_data_interface.Po \ ./$(DEPDIR)/csr_data_interface.Po \ ./$(DEPDIR)/custom_conversion_codelets.Po \ ./$(DEPDIR)/custom_interface.Po \ ./$(DEPDIR)/custom_mf_filter.Po ./$(DEPDIR)/custom_opencl.Po \ ./$(DEPDIR)/dgemm.Po ./$(DEPDIR)/dlu.Po \ ./$(DEPDIR)/dlu_implicit.Po ./$(DEPDIR)/dlu_implicit_pivot.Po \ ./$(DEPDIR)/dlu_kernels.Po ./$(DEPDIR)/dlu_pivot.Po \ ./$(DEPDIR)/dot_product.Po ./$(DEPDIR)/dummy_modular_sched.Po \ ./$(DEPDIR)/dummy_sched.Po ./$(DEPDIR)/dummy_sched_with_ctx.Po \ ./$(DEPDIR)/dw_block_spmv.Po \ ./$(DEPDIR)/dw_block_spmv_kernels.Po ./$(DEPDIR)/dw_factolu.Po \ ./$(DEPDIR)/dw_factolu_grain.Po \ ./$(DEPDIR)/dw_factolu_kernels.Po \ ./$(DEPDIR)/dw_factolu_tag.Po ./$(DEPDIR)/dw_sparse_cg.Po \ ./$(DEPDIR)/dw_sparse_cg_kernels.Po \ ./$(DEPDIR)/dynamic_handles.Po ./$(DEPDIR)/fblock.Po \ ./$(DEPDIR)/fblock_cpu.Po ./$(DEPDIR)/fblock_opencl.Po \ ./$(DEPDIR)/fmatrix.Po ./$(DEPDIR)/fmultiple_manual.Po \ ./$(DEPDIR)/fmultiple_submit.Po \ ./$(DEPDIR)/fmultiple_submit_implicit.Po \ ./$(DEPDIR)/fmultiple_submit_readonly.Po ./$(DEPDIR)/fread.Po \ ./$(DEPDIR)/frecursive.Po ./$(DEPDIR)/fvector.Po \ ./$(DEPDIR)/gl_interop.Po ./$(DEPDIR)/gl_interop_idle.Po \ ./$(DEPDIR)/gpu_partition.Po ./$(DEPDIR)/heat.Po \ ./$(DEPDIR)/heat_display.Po ./$(DEPDIR)/hello_c.Po \ ./$(DEPDIR)/hello_world.Po ./$(DEPDIR)/heteroprio_test.Po \ ./$(DEPDIR)/incrementer.Po ./$(DEPDIR)/incrementer_cpp.Po \ ./$(DEPDIR)/incrementer_kernels_opencl.Po \ ./$(DEPDIR)/loader-loader.Po \ ./$(DEPDIR)/lu_example_complex_double.Po \ ./$(DEPDIR)/lu_example_complex_float.Po \ ./$(DEPDIR)/lu_example_double.Po \ ./$(DEPDIR)/lu_example_float.Po \ ./$(DEPDIR)/lu_kernels_model.Po \ ./$(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po \ ./$(DEPDIR)/marshalling.Po \ ./$(DEPDIR)/matrix_data_interface.Po ./$(DEPDIR)/matvecmult.Po \ ./$(DEPDIR)/minmax_reduction.Po ./$(DEPDIR)/mlr.Po \ ./$(DEPDIR)/mm_to_bcsr.Po ./$(DEPDIR)/mmio.Po \ ./$(DEPDIR)/mult.Po ./$(DEPDIR)/multiformat.Po \ ./$(DEPDIR)/multiformat_conversion_codelets.Po \ ./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po \ ./$(DEPDIR)/multiformat_data_interface.Po \ ./$(DEPDIR)/multiformat_opencl.Po \ ./$(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po \ ./$(DEPDIR)/parallel_tasks_with_cluster_api.Po \ ./$(DEPDIR)/pi.Po ./$(DEPDIR)/pi_redux.Po \ ./$(DEPDIR)/pipeline.Po ./$(DEPDIR)/ppm_downscaler.Po \ ./$(DEPDIR)/prio.Po ./$(DEPDIR)/profiling.Po \ ./$(DEPDIR)/prologue.Po ./$(DEPDIR)/sched_ctx.Po \ ./$(DEPDIR)/sched_ctx_delete.Po ./$(DEPDIR)/sched_ctx_empty.Po \ ./$(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po \ ./$(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po \ ./$(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po \ ./$(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po \ ./$(DEPDIR)/sched_ctx_utils.Po \ ./$(DEPDIR)/sched_ctx_without_sched_policy_awake.Po \ ./$(DEPDIR)/sequential_consistency.Po ./$(DEPDIR)/sgemm.Po \ ./$(DEPDIR)/shadow.Po ./$(DEPDIR)/shadow2d.Po \ ./$(DEPDIR)/shadow3d.Po ./$(DEPDIR)/slu.Po \ ./$(DEPDIR)/slu_implicit.Po ./$(DEPDIR)/slu_implicit_pivot.Po \ ./$(DEPDIR)/slu_kernels.Po ./$(DEPDIR)/slu_pivot.Po \ ./$(DEPDIR)/sobol_gold.Po ./$(DEPDIR)/sobol_primitives.Po \ ./$(DEPDIR)/spmv.Po ./$(DEPDIR)/spmv_kernels.Po \ ./$(DEPDIR)/tag_example.Po ./$(DEPDIR)/tag_example2.Po \ ./$(DEPDIR)/tag_example3.Po ./$(DEPDIR)/tag_example4.Po \ ./$(DEPDIR)/tag_restartable.Po ./$(DEPDIR)/task_end_dep.Po \ ./$(DEPDIR)/task_end_dep_add.Po \ ./$(DEPDIR)/task_insert_color.Po ./$(DEPDIR)/topology.Po \ ./$(DEPDIR)/two_cpu_contexts.Po ./$(DEPDIR)/variable.Po \ ./$(DEPDIR)/variable_data_interface.Po \ ./$(DEPDIR)/variable_kernels_cpu.Po \ ./$(DEPDIR)/variable_kernels_opencl.Po \ ./$(DEPDIR)/vector_data_interface.Po \ ./$(DEPDIR)/vector_scal.Po ./$(DEPDIR)/vector_scal_c.Po \ ./$(DEPDIR)/vector_scal_cpu.Po \ ./$(DEPDIR)/vector_scal_opencl.Po \ ./$(DEPDIR)/vector_scal_spmd.Po \ ./$(DEPDIR)/void_data_interface.Po \ ./$(DEPDIR)/worker_list_example.Po \ ./$(DEPDIR)/worker_tree_example.Po \ ./$(DEPDIR)/yuv_downscaler.Po ./$(DEPDIR)/zlu.Po \ ./$(DEPDIR)/zlu_implicit.Po ./$(DEPDIR)/zlu_implicit_pivot.Po \ ./$(DEPDIR)/zlu_kernels.Po ./$(DEPDIR)/zlu_pivot.Po 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 = api/bcsr_data_interface.c api/block_data_interface.c \ api/coo_data_interface.c api/csr_data_interface.c \ api/matrix_data_interface.c api/multiformat_data_interface.c \ api/variable_data_interface.c api/vector_data_interface.c \ api/void_data_interface.c $(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/task_insert_color.c basic_examples/topology.c \ $(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_compil_SOURCES) \ $(cholesky_cholesky_grain_tag_SOURCES) \ $(cholesky_cholesky_implicit_SOURCES) \ $(cholesky_cholesky_tag_SOURCES) \ $(cholesky_cholesky_tile_tag_SOURCES) \ $(cpp_add_vectors_SOURCES) $(cpp_add_vectors_cpp11_SOURCES) \ $(cpp_add_vectors_interface_SOURCES) \ $(cpp_incrementer_cpp_SOURCES) \ dependency/sequential_consistency.c dependency/task_end_dep.c \ dependency/task_end_dep_add.c \ $(filters_custom_mf_custom_mf_filter_SOURCES) \ $(filters_fblock_SOURCES) filters/fmatrix.c \ $(filters_fmultiple_manual_SOURCES) \ $(filters_fmultiple_submit_SOURCES) \ $(filters_fmultiple_submit_implicit_SOURCES) \ $(filters_fmultiple_submit_readonly_SOURCES) filters/fread.c \ filters/frecursive.c 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 mlr/mlr.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_gpu_partition_SOURCES) \ sched_ctx/nested_sched_ctxs.c sched_ctx/parallel_code.c \ sched_ctx/parallel_tasks_reuse_handle.c \ sched_ctx/parallel_tasks_with_cluster_api.c sched_ctx/prio.c \ sched_ctx/sched_ctx.c sched_ctx/sched_ctx_delete.c \ sched_ctx/sched_ctx_empty.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_modular_sched.c \ scheduler/dummy_sched.c scheduler/heteroprio_test.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 \ worker_collections/worker_list_example.c \ worker_collections/worker_tree_example.c DIST_SOURCES = api/bcsr_data_interface.c api/block_data_interface.c \ api/coo_data_interface.c api/csr_data_interface.c \ api/matrix_data_interface.c api/multiformat_data_interface.c \ api/variable_data_interface.c api/vector_data_interface.c \ api/void_data_interface.c $(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) \ basic_examples/task_insert_color.c basic_examples/topology.c \ $(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_compil_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) \ $(cpp_add_vectors_SOURCES) \ $(am__cpp_add_vectors_cpp11_SOURCES_DIST) \ $(cpp_add_vectors_interface_SOURCES) \ $(am__cpp_incrementer_cpp_SOURCES_DIST) \ dependency/sequential_consistency.c dependency/task_end_dep.c \ dependency/task_end_dep_add.c \ $(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_implicit_SOURCES_DIST) \ $(am__filters_fmultiple_submit_readonly_SOURCES_DIST) \ filters/fread.c filters/frecursive.c 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 mlr/mlr.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 \ $(am__sched_ctx_gpu_partition_SOURCES_DIST) \ sched_ctx/nested_sched_ctxs.c sched_ctx/parallel_code.c \ sched_ctx/parallel_tasks_reuse_handle.c \ sched_ctx/parallel_tasks_with_cluster_api.c sched_ctx/prio.c \ sched_ctx/sched_ctx.c sched_ctx/sched_ctx_delete.c \ sched_ctx/sched_ctx_empty.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_modular_sched.c \ scheduler/dummy_sched.c scheduler/heteroprio_test.c \ $(spmd_vector_scal_spmd_SOURCES) $(spmv_dw_block_spmv_SOURCES) \ $(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 \ 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 distdir-am 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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-mynvcc.mk $(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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2016 Uppsala University # Copyright (C) 2017 Erwan Leria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(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) $(GLOBAL_AM_CXXFLAGS) -Wno-unused 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_41) \ @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 \ mult/sgemm.sh \ 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 \ sched_ctx/axpy_partition_gpu.h \ sched_ctx/axpy_partition_gpu.cu \ heat/heat.sh \ cholesky/cholesky.sh \ cholesky/cholesky_compiled.c \ lu/lu.sh CLEANFILES = *.gcno *.gcda *.linkinfo *.mod starpu_idle_microsec.log *.mps */*.mps */*/*.mps *.dot */*.dot */*/*.dot *.pl */*.pl */*/*.pl *.png *.output tasks.rec perfs.rec */perfs.rec */*/perfs.rec perfs2.rec # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_0 = @echo " myNVCC " $@; @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_1 = @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc = $(V_mynvcc_$(V)) 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 \ sched_ctx/axpy_partition_gpu.h SHELL_TESTS = $(am__append_2) $(am__append_3) $(am__append_13) \ $(am__append_14) @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/ -I$(top_srcdir)/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_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@LOADER_BIN2 = $(LOADER_BIN) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_TRUE@LOADER_BIN2 = $(MPI_LAUNCHER) $(LOADER_BIN) @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN2) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN2) # 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 scheduler/dummy_sched \ scheduler/dummy_modular_sched \ worker_collections/worker_list_example api/bcsr_data_interface \ api/block_data_interface api/coo_data_interface \ api/csr_data_interface api/matrix_data_interface \ api/multiformat_data_interface api/variable_data_interface \ api/vector_data_interface api/void_data_interface \ $(am__append_5) $(am__append_6) $(am__append_7) \ $(am__append_8) $(am__append_9) $(am__append_10) \ $(am__append_11) $(am__append_12) $(am__append_15) \ $(am__append_16) $(am__append_17) $(am__append_18) \ $(am__append_19) $(am__append_20) $(am__append_21) @STARPU_USE_CUDA_TRUE@sched_ctx_gpu_partition_SOURCES = \ @STARPU_USE_CUDA_TRUE@ sched_ctx/gpu_partition.c \ @STARPU_USE_CUDA_TRUE@ sched_ctx/axpy_partition_gpu.cu ################## # Basic examples # ################## basic_examples_vector_scal_SOURCES = basic_examples/vector_scal.c \ basic_examples/vector_scal_cpu.c $(am__append_22) \ $(am__append_23) $(am__append_24) @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_25) @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_26) $(am__append_27) ################# # block example # ################# basic_examples_block_SOURCES = basic_examples/block.c \ basic_examples/block_cpu.c $(am__append_28) $(am__append_29) #################### # Variable example # #################### basic_examples_variable_SOURCES = basic_examples/variable.c \ basic_examples/variable_kernels_cpu.c $(am__append_30) \ $(am__append_31) ########### # Filters # ########### filters_fblock_SOURCES = filters/fblock.c filters/fblock_cpu.c \ $(am__append_32) $(am__append_33) filters_fmultiple_manual_SOURCES = filters/fmultiple_manual.c \ $(am__append_34) filters_fmultiple_submit_SOURCES = filters/fmultiple_submit.c \ $(am__append_35) filters_fmultiple_submit_readonly_SOURCES = \ filters/fmultiple_submit_readonly.c $(am__append_36) filters_fmultiple_submit_implicit_SOURCES = \ filters/fmultiple_submit_implicit.c $(am__append_37) 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_38) $(am__append_39) ################ # AXPY example # ################ @STARPU_NO_BLAS_LIB_FALSE@axpy_axpy_SOURCES = axpy/axpy.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c $(am__append_40) @STARPU_NO_BLAS_LIB_FALSE@axpy_axpy_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ################ # Mult example # ################ mult_sgemm_SOURCES = mult/sgemm.c $(am__append_42) mult_sgemm_LDADD = \ $(STARPU_BLAS_LDFLAGS) mult_dgemm_SOURCES = mult/dgemm.c $(am__append_43) mult_dgemm_LDADD = \ $(STARPU_BLAS_LDFLAGS) #################### # Cholesky example # #################### @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_tag_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_tag.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_tag_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_tile_tag_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_tile_tag.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_tile_tag_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_grain_tag_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_grain_tag.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_grain_tag_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_compil_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_compil.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_compil_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ############## # LU example # ############## @STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_float_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/slu.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/slu_pivot.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/slu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_float_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_double_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/dlu.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/dlu_pivot.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/dlu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_double_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_float_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/slu_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/slu_implicit_pivot.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/slu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_float_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_double_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/dlu_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/dlu_implicit_pivot.c \ @STARPU_NO_BLAS_LIB_FALSE@ lu/dlu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_double_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_complex_float_SOURCES = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_complex_float.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/clu.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/clu_pivot.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/clu_kernels.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_complex_float_LDADD = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_float_SOURCES = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_complex_float.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/clu_implicit.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/clu_implicit_pivot.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/clu_kernels.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_float_LDADD = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_complex_double_SOURCES = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_complex_double.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/zlu.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/zlu_pivot.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/zlu_kernels.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_example_complex_double_LDADD = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_double_SOURCES = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/lu_example_complex_double.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/zlu_implicit.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/zlu_implicit_pivot.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/zlu_kernels.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ lu/blas_complex.c \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@lu_lu_implicit_example_complex_double_LDADD = \ @STARPU_MKL_BLAS_LIB_TRUE@@STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ################ # Heat example # ################ @STARPU_NO_BLAS_LIB_FALSE@heat_heat_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ heat/heat.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/dw_factolu.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/dw_factolu_tag.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/dw_factolu_grain.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/dw_sparse_cg.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/heat_display.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/lu_kernels_model.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/dw_sparse_cg_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ heat/dw_factolu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@heat_heat_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_OPENGL_RENDER_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) ############## # CG example # ############## @STARPU_NO_BLAS_LIB_FALSE@cg_cg_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cg/cg.c \ @STARPU_NO_BLAS_LIB_FALSE@ cg/cg_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cg_cg_LDADD = \ @STARPU_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_44) 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) ########################### # C++ Incrementer example # ########################### cpp_incrementer_cpp_SOURCES = cpp/incrementer_cpp.cpp $(am__append_45) \ $(am__append_46) ########################### # C++ Add vectors example # ########################### cpp_add_vectors_SOURCES = \ cpp/add_vectors.cpp cpp_add_vectors_interface_SOURCES = \ cpp/add_vectors_interface.cpp @STARPU_HAVE_CXX11_TRUE@cpp_add_vectors_cpp11_SOURCES = \ @STARPU_HAVE_CXX11_TRUE@ cpp/add_vectors_cpp11.cpp ####################### # Incrementer example # ####################### incrementer_incrementer_SOURCES = incrementer/incrementer.c \ $(am__append_47) $(am__append_48) ################## # Binary example # ################## binary_binary_SOURCES = binary/binary.c $(am__append_49) ##################### # interface example # ##################### interface_complex_SOURCES = interface/complex.c \ interface/complex_interface.c interface/complex_filters.c \ $(am__append_50) $(am__append_51) ####################### # dot_product example # ####################### reductions_dot_product_SOURCES = reductions/dot_product.c \ $(am__append_52) mandelbrot_mandelbrot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) \ $(am__append_53) @STARPU_HAVE_X11_TRUE@mandelbrot_mandelbrot_LDADD = $(X_PRE_LIBS) $(X_LIBS) -lX11 $(X_EXTRA_LIBS) @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_55) @STARPU_HAVE_WINDOWS_FALSE@pi_pi_redux_SOURCES = pi/pi_redux.c \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__append_56) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@pi_pi_redux_LDADD = \ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_CUDA_TRUE@ $(STARPU_CURAND_LDFLAGS) @STARPU_HAVE_OPENGL_TRUE@gl_interop_gl_interop_SOURCES = \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop/gl_interop.c @STARPU_HAVE_OPENGL_TRUE@gl_interop_gl_interop_LDADD = \ @STARPU_HAVE_OPENGL_TRUE@ $(STARPU_OPENGL_RENDER_LDFLAGS) @STARPU_HAVE_OPENGL_TRUE@gl_interop_gl_interop_idle_SOURCES = \ @STARPU_HAVE_OPENGL_TRUE@ gl_interop/gl_interop_idle.c @STARPU_HAVE_OPENGL_TRUE@gl_interop_gl_interop_idle_LDADD = \ @STARPU_HAVE_OPENGL_TRUE@ $(STARPU_OPENGL_RENDER_LDFLAGS) #################### # pipeline example # #################### @STARPU_NO_BLAS_LIB_FALSE@pipeline_pipeline_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ pipeline/pipeline.c \ @STARPU_NO_BLAS_LIB_FALSE@ common/blas.c @STARPU_NO_BLAS_LIB_FALSE@pipeline_pipeline_LDADD = \ @STARPU_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 $(top_srcdir)/starpu-mynvcc.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu.mk $(top_srcdir)/starpu-mynvcc.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 api/$(am__dirstamp): @$(MKDIR_P) api @: > api/$(am__dirstamp) api/bcsr_data_interface$(EXEEXT): $(api_bcsr_data_interface_OBJECTS) $(api_bcsr_data_interface_DEPENDENCIES) $(EXTRA_api_bcsr_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/bcsr_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_bcsr_data_interface_OBJECTS) $(api_bcsr_data_interface_LDADD) $(LIBS) api/block_data_interface$(EXEEXT): $(api_block_data_interface_OBJECTS) $(api_block_data_interface_DEPENDENCIES) $(EXTRA_api_block_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/block_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_block_data_interface_OBJECTS) $(api_block_data_interface_LDADD) $(LIBS) api/coo_data_interface$(EXEEXT): $(api_coo_data_interface_OBJECTS) $(api_coo_data_interface_DEPENDENCIES) $(EXTRA_api_coo_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/coo_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_coo_data_interface_OBJECTS) $(api_coo_data_interface_LDADD) $(LIBS) api/csr_data_interface$(EXEEXT): $(api_csr_data_interface_OBJECTS) $(api_csr_data_interface_DEPENDENCIES) $(EXTRA_api_csr_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/csr_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_csr_data_interface_OBJECTS) $(api_csr_data_interface_LDADD) $(LIBS) api/matrix_data_interface$(EXEEXT): $(api_matrix_data_interface_OBJECTS) $(api_matrix_data_interface_DEPENDENCIES) $(EXTRA_api_matrix_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/matrix_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_matrix_data_interface_OBJECTS) $(api_matrix_data_interface_LDADD) $(LIBS) api/multiformat_data_interface$(EXEEXT): $(api_multiformat_data_interface_OBJECTS) $(api_multiformat_data_interface_DEPENDENCIES) $(EXTRA_api_multiformat_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/multiformat_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_multiformat_data_interface_OBJECTS) $(api_multiformat_data_interface_LDADD) $(LIBS) api/variable_data_interface$(EXEEXT): $(api_variable_data_interface_OBJECTS) $(api_variable_data_interface_DEPENDENCIES) $(EXTRA_api_variable_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/variable_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_variable_data_interface_OBJECTS) $(api_variable_data_interface_LDADD) $(LIBS) api/vector_data_interface$(EXEEXT): $(api_vector_data_interface_OBJECTS) $(api_vector_data_interface_DEPENDENCIES) $(EXTRA_api_vector_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/vector_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_vector_data_interface_OBJECTS) $(api_vector_data_interface_LDADD) $(LIBS) api/void_data_interface$(EXEEXT): $(api_void_data_interface_OBJECTS) $(api_void_data_interface_DEPENDENCIES) $(EXTRA_api_void_data_interface_DEPENDENCIES) api/$(am__dirstamp) @rm -f api/void_data_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(api_void_data_interface_OBJECTS) $(api_void_data_interface_LDADD) $(LIBS) 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/task_insert_color$(EXEEXT): $(basic_examples_task_insert_color_OBJECTS) $(basic_examples_task_insert_color_DEPENDENCIES) $(EXTRA_basic_examples_task_insert_color_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/task_insert_color$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_task_insert_color_OBJECTS) $(basic_examples_task_insert_color_LDADD) $(LIBS) basic_examples/topology$(EXEEXT): $(basic_examples_topology_OBJECTS) $(basic_examples_topology_DEPENDENCIES) $(EXTRA_basic_examples_topology_DEPENDENCIES) basic_examples/$(am__dirstamp) @rm -f basic_examples/topology$(EXEEXT) $(AM_V_CCLD)$(LINK) $(basic_examples_topology_OBJECTS) $(basic_examples_topology_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_compil$(EXEEXT): $(cholesky_cholesky_compil_OBJECTS) $(cholesky_cholesky_compil_DEPENDENCIES) $(EXTRA_cholesky_cholesky_compil_DEPENDENCIES) cholesky/$(am__dirstamp) @rm -f cholesky/cholesky_compil$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cholesky_cholesky_compil_OBJECTS) $(cholesky_cholesky_compil_LDADD) $(LIBS) 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) cpp/$(am__dirstamp): @$(MKDIR_P) cpp @: > cpp/$(am__dirstamp) cpp/add_vectors$(EXEEXT): $(cpp_add_vectors_OBJECTS) $(cpp_add_vectors_DEPENDENCIES) $(EXTRA_cpp_add_vectors_DEPENDENCIES) cpp/$(am__dirstamp) @rm -f cpp/add_vectors$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(cpp_add_vectors_OBJECTS) $(cpp_add_vectors_LDADD) $(LIBS) cpp/add_vectors_cpp11$(EXEEXT): $(cpp_add_vectors_cpp11_OBJECTS) $(cpp_add_vectors_cpp11_DEPENDENCIES) $(EXTRA_cpp_add_vectors_cpp11_DEPENDENCIES) cpp/$(am__dirstamp) @rm -f cpp/add_vectors_cpp11$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(cpp_add_vectors_cpp11_OBJECTS) $(cpp_add_vectors_cpp11_LDADD) $(LIBS) cpp/add_vectors_interface$(EXEEXT): $(cpp_add_vectors_interface_OBJECTS) $(cpp_add_vectors_interface_DEPENDENCIES) $(EXTRA_cpp_add_vectors_interface_DEPENDENCIES) cpp/$(am__dirstamp) @rm -f cpp/add_vectors_interface$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(cpp_add_vectors_interface_OBJECTS) $(cpp_add_vectors_interface_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/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) dependency/$(am__dirstamp): @$(MKDIR_P) dependency @: > dependency/$(am__dirstamp) dependency/sequential_consistency$(EXEEXT): $(dependency_sequential_consistency_OBJECTS) $(dependency_sequential_consistency_DEPENDENCIES) $(EXTRA_dependency_sequential_consistency_DEPENDENCIES) dependency/$(am__dirstamp) @rm -f dependency/sequential_consistency$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dependency_sequential_consistency_OBJECTS) $(dependency_sequential_consistency_LDADD) $(LIBS) dependency/task_end_dep$(EXEEXT): $(dependency_task_end_dep_OBJECTS) $(dependency_task_end_dep_DEPENDENCIES) $(EXTRA_dependency_task_end_dep_DEPENDENCIES) dependency/$(am__dirstamp) @rm -f dependency/task_end_dep$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dependency_task_end_dep_OBJECTS) $(dependency_task_end_dep_LDADD) $(LIBS) dependency/task_end_dep_add$(EXEEXT): $(dependency_task_end_dep_add_OBJECTS) $(dependency_task_end_dep_add_DEPENDENCIES) $(EXTRA_dependency_task_end_dep_add_DEPENDENCIES) dependency/$(am__dirstamp) @rm -f dependency/task_end_dep_add$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dependency_task_end_dep_add_OBJECTS) $(dependency_task_end_dep_add_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_implicit$(EXEEXT): $(filters_fmultiple_submit_implicit_OBJECTS) $(filters_fmultiple_submit_implicit_DEPENDENCIES) $(EXTRA_filters_fmultiple_submit_implicit_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fmultiple_submit_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fmultiple_submit_implicit_OBJECTS) $(filters_fmultiple_submit_implicit_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/fread$(EXEEXT): $(filters_fread_OBJECTS) $(filters_fread_DEPENDENCIES) $(EXTRA_filters_fread_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/fread$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_fread_OBJECTS) $(filters_fread_LDADD) $(LIBS) filters/frecursive$(EXEEXT): $(filters_frecursive_OBJECTS) $(filters_frecursive_DEPENDENCIES) $(EXTRA_filters_frecursive_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/frecursive$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_frecursive_OBJECTS) $(filters_frecursive_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) mlr/$(am__dirstamp): @$(MKDIR_P) mlr @: > mlr/$(am__dirstamp) mlr/mlr$(EXEEXT): $(mlr_mlr_OBJECTS) $(mlr_mlr_DEPENDENCIES) $(EXTRA_mlr_mlr_DEPENDENCIES) mlr/$(am__dirstamp) @rm -f mlr/mlr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mlr_mlr_OBJECTS) $(mlr_mlr_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/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) sched_ctx/$(DEPDIR) @: > sched_ctx/$(DEPDIR)/$(am__dirstamp) sched_ctx/axpy_partition_gpu.$(OBJEXT): sched_ctx/$(am__dirstamp) \ sched_ctx/$(DEPDIR)/$(am__dirstamp) sched_ctx/gpu_partition$(EXEEXT): $(sched_ctx_gpu_partition_OBJECTS) $(sched_ctx_gpu_partition_DEPENDENCIES) $(EXTRA_sched_ctx_gpu_partition_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/gpu_partition$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_gpu_partition_OBJECTS) $(sched_ctx_gpu_partition_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/parallel_tasks_with_cluster_api$(EXEEXT): $(sched_ctx_parallel_tasks_with_cluster_api_OBJECTS) $(sched_ctx_parallel_tasks_with_cluster_api_DEPENDENCIES) $(EXTRA_sched_ctx_parallel_tasks_with_cluster_api_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/parallel_tasks_with_cluster_api$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_parallel_tasks_with_cluster_api_OBJECTS) $(sched_ctx_parallel_tasks_with_cluster_api_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_delete$(EXEEXT): $(sched_ctx_sched_ctx_delete_OBJECTS) $(sched_ctx_sched_ctx_delete_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_delete_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_delete$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_delete_OBJECTS) $(sched_ctx_sched_ctx_delete_LDADD) $(LIBS) sched_ctx/sched_ctx_empty$(EXEEXT): $(sched_ctx_sched_ctx_empty_OBJECTS) $(sched_ctx_sched_ctx_empty_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_empty_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_empty$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_empty_OBJECTS) $(sched_ctx_sched_ctx_empty_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_modular_sched$(EXEEXT): $(scheduler_dummy_modular_sched_OBJECTS) $(scheduler_dummy_modular_sched_DEPENDENCIES) $(EXTRA_scheduler_dummy_modular_sched_DEPENDENCIES) scheduler/$(am__dirstamp) @rm -f scheduler/dummy_modular_sched$(EXEEXT) $(AM_V_CCLD)$(LINK) $(scheduler_dummy_modular_sched_OBJECTS) $(scheduler_dummy_modular_sched_LDADD) $(LIBS) 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) scheduler/heteroprio_test$(EXEEXT): $(scheduler_heteroprio_test_OBJECTS) $(scheduler_heteroprio_test_DEPENDENCIES) $(EXTRA_scheduler_heteroprio_test_DEPENDENCIES) scheduler/$(am__dirstamp) @rm -f scheduler/heteroprio_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(scheduler_heteroprio_test_OBJECTS) $(scheduler_heteroprio_test_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) 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 sched_ctx/*.$(OBJEXT) -rm -f spmv/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_vectors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_vectors_cpp11.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_vectors_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/axpy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/axpy_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas_complex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_cpu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cg_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_compil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_grain_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_models.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_tile_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_implicit_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clu_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_filters.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_kernels_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conversion_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_conversion_codelets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_mf_filter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_implicit_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlu_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot_product.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_modular_sched.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_sched.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_sched_with_ctx.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_block_spmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_block_spmv_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu_grain.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_factolu_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_sparse_cg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_sparse_cg_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynamic_handles.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fblock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fblock_cpu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fblock_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmatrix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_manual.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_submit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_submit_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmultiple_submit_readonly.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fread.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frecursive.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fvector.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_interop.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gl_interop_idle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_partition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heat_display.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello_c.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello_world.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heteroprio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incrementer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incrementer_cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incrementer_kernels_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_complex_double.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_complex_float.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_double.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_example_float.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_kernels_model.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/marshalling.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matvecmult.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax_reduction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mlr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mm_to_bcsr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mult.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_tasks_with_cluster_api.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pi_redux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipeline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppm_downscaler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/profiling.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prologue.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_delete.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_empty.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_utils.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_without_sched_policy_awake.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sequential_consistency.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow2d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow3d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_implicit_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slu_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol_gold.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol_primitives.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmv_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_example4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_restartable.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_end_dep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_end_dep_add.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_insert_color.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/two_cpu_contexts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_kernels_cpu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_kernels_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_c.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_cpu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_scal_spmd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/void_data_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worker_list_example.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worker_tree_example.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yuv_downscaler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_implicit_pivot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlu_pivot.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 $@ $< bcsr_data_interface.o: api/bcsr_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_data_interface.o -MD -MP -MF $(DEPDIR)/bcsr_data_interface.Tpo -c -o bcsr_data_interface.o `test -f 'api/bcsr_data_interface.c' || echo '$(srcdir)/'`api/bcsr_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_data_interface.Tpo $(DEPDIR)/bcsr_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/bcsr_data_interface.c' object='bcsr_data_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_data_interface.o `test -f 'api/bcsr_data_interface.c' || echo '$(srcdir)/'`api/bcsr_data_interface.c bcsr_data_interface.obj: api/bcsr_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_data_interface.obj -MD -MP -MF $(DEPDIR)/bcsr_data_interface.Tpo -c -o bcsr_data_interface.obj `if test -f 'api/bcsr_data_interface.c'; then $(CYGPATH_W) 'api/bcsr_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/bcsr_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_data_interface.Tpo $(DEPDIR)/bcsr_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/bcsr_data_interface.c' object='bcsr_data_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_data_interface.obj `if test -f 'api/bcsr_data_interface.c'; then $(CYGPATH_W) 'api/bcsr_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/bcsr_data_interface.c'; fi` block_data_interface.o: api/block_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_data_interface.o -MD -MP -MF $(DEPDIR)/block_data_interface.Tpo -c -o block_data_interface.o `test -f 'api/block_data_interface.c' || echo '$(srcdir)/'`api/block_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_data_interface.Tpo $(DEPDIR)/block_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/block_data_interface.c' object='block_data_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_data_interface.o `test -f 'api/block_data_interface.c' || echo '$(srcdir)/'`api/block_data_interface.c block_data_interface.obj: api/block_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_data_interface.obj -MD -MP -MF $(DEPDIR)/block_data_interface.Tpo -c -o block_data_interface.obj `if test -f 'api/block_data_interface.c'; then $(CYGPATH_W) 'api/block_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/block_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_data_interface.Tpo $(DEPDIR)/block_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/block_data_interface.c' object='block_data_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_data_interface.obj `if test -f 'api/block_data_interface.c'; then $(CYGPATH_W) 'api/block_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/block_data_interface.c'; fi` coo_data_interface.o: api/coo_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_data_interface.o -MD -MP -MF $(DEPDIR)/coo_data_interface.Tpo -c -o coo_data_interface.o `test -f 'api/coo_data_interface.c' || echo '$(srcdir)/'`api/coo_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_data_interface.Tpo $(DEPDIR)/coo_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/coo_data_interface.c' object='coo_data_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_data_interface.o `test -f 'api/coo_data_interface.c' || echo '$(srcdir)/'`api/coo_data_interface.c coo_data_interface.obj: api/coo_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_data_interface.obj -MD -MP -MF $(DEPDIR)/coo_data_interface.Tpo -c -o coo_data_interface.obj `if test -f 'api/coo_data_interface.c'; then $(CYGPATH_W) 'api/coo_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/coo_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_data_interface.Tpo $(DEPDIR)/coo_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/coo_data_interface.c' object='coo_data_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_data_interface.obj `if test -f 'api/coo_data_interface.c'; then $(CYGPATH_W) 'api/coo_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/coo_data_interface.c'; fi` csr_data_interface.o: api/csr_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_data_interface.o -MD -MP -MF $(DEPDIR)/csr_data_interface.Tpo -c -o csr_data_interface.o `test -f 'api/csr_data_interface.c' || echo '$(srcdir)/'`api/csr_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_data_interface.Tpo $(DEPDIR)/csr_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/csr_data_interface.c' object='csr_data_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_data_interface.o `test -f 'api/csr_data_interface.c' || echo '$(srcdir)/'`api/csr_data_interface.c csr_data_interface.obj: api/csr_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_data_interface.obj -MD -MP -MF $(DEPDIR)/csr_data_interface.Tpo -c -o csr_data_interface.obj `if test -f 'api/csr_data_interface.c'; then $(CYGPATH_W) 'api/csr_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/csr_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_data_interface.Tpo $(DEPDIR)/csr_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/csr_data_interface.c' object='csr_data_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_data_interface.obj `if test -f 'api/csr_data_interface.c'; then $(CYGPATH_W) 'api/csr_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/csr_data_interface.c'; fi` matrix_data_interface.o: api/matrix_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_data_interface.o -MD -MP -MF $(DEPDIR)/matrix_data_interface.Tpo -c -o matrix_data_interface.o `test -f 'api/matrix_data_interface.c' || echo '$(srcdir)/'`api/matrix_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_data_interface.Tpo $(DEPDIR)/matrix_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/matrix_data_interface.c' object='matrix_data_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_data_interface.o `test -f 'api/matrix_data_interface.c' || echo '$(srcdir)/'`api/matrix_data_interface.c matrix_data_interface.obj: api/matrix_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_data_interface.obj -MD -MP -MF $(DEPDIR)/matrix_data_interface.Tpo -c -o matrix_data_interface.obj `if test -f 'api/matrix_data_interface.c'; then $(CYGPATH_W) 'api/matrix_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/matrix_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_data_interface.Tpo $(DEPDIR)/matrix_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/matrix_data_interface.c' object='matrix_data_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_data_interface.obj `if test -f 'api/matrix_data_interface.c'; then $(CYGPATH_W) 'api/matrix_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/matrix_data_interface.c'; fi` multiformat_data_interface.o: api/multiformat_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_data_interface.o -MD -MP -MF $(DEPDIR)/multiformat_data_interface.Tpo -c -o multiformat_data_interface.o `test -f 'api/multiformat_data_interface.c' || echo '$(srcdir)/'`api/multiformat_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_data_interface.Tpo $(DEPDIR)/multiformat_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/multiformat_data_interface.c' object='multiformat_data_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_data_interface.o `test -f 'api/multiformat_data_interface.c' || echo '$(srcdir)/'`api/multiformat_data_interface.c multiformat_data_interface.obj: api/multiformat_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_data_interface.obj -MD -MP -MF $(DEPDIR)/multiformat_data_interface.Tpo -c -o multiformat_data_interface.obj `if test -f 'api/multiformat_data_interface.c'; then $(CYGPATH_W) 'api/multiformat_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/multiformat_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_data_interface.Tpo $(DEPDIR)/multiformat_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/multiformat_data_interface.c' object='multiformat_data_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_data_interface.obj `if test -f 'api/multiformat_data_interface.c'; then $(CYGPATH_W) 'api/multiformat_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/multiformat_data_interface.c'; fi` variable_data_interface.o: api/variable_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_data_interface.o -MD -MP -MF $(DEPDIR)/variable_data_interface.Tpo -c -o variable_data_interface.o `test -f 'api/variable_data_interface.c' || echo '$(srcdir)/'`api/variable_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_data_interface.Tpo $(DEPDIR)/variable_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/variable_data_interface.c' object='variable_data_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_data_interface.o `test -f 'api/variable_data_interface.c' || echo '$(srcdir)/'`api/variable_data_interface.c variable_data_interface.obj: api/variable_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_data_interface.obj -MD -MP -MF $(DEPDIR)/variable_data_interface.Tpo -c -o variable_data_interface.obj `if test -f 'api/variable_data_interface.c'; then $(CYGPATH_W) 'api/variable_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/variable_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_data_interface.Tpo $(DEPDIR)/variable_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/variable_data_interface.c' object='variable_data_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_data_interface.obj `if test -f 'api/variable_data_interface.c'; then $(CYGPATH_W) 'api/variable_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/variable_data_interface.c'; fi` vector_data_interface.o: api/vector_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_data_interface.o -MD -MP -MF $(DEPDIR)/vector_data_interface.Tpo -c -o vector_data_interface.o `test -f 'api/vector_data_interface.c' || echo '$(srcdir)/'`api/vector_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_data_interface.Tpo $(DEPDIR)/vector_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/vector_data_interface.c' object='vector_data_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 vector_data_interface.o `test -f 'api/vector_data_interface.c' || echo '$(srcdir)/'`api/vector_data_interface.c vector_data_interface.obj: api/vector_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_data_interface.obj -MD -MP -MF $(DEPDIR)/vector_data_interface.Tpo -c -o vector_data_interface.obj `if test -f 'api/vector_data_interface.c'; then $(CYGPATH_W) 'api/vector_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/vector_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_data_interface.Tpo $(DEPDIR)/vector_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/vector_data_interface.c' object='vector_data_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 vector_data_interface.obj `if test -f 'api/vector_data_interface.c'; then $(CYGPATH_W) 'api/vector_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/vector_data_interface.c'; fi` void_data_interface.o: api/void_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT void_data_interface.o -MD -MP -MF $(DEPDIR)/void_data_interface.Tpo -c -o void_data_interface.o `test -f 'api/void_data_interface.c' || echo '$(srcdir)/'`api/void_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/void_data_interface.Tpo $(DEPDIR)/void_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/void_data_interface.c' object='void_data_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_data_interface.o `test -f 'api/void_data_interface.c' || echo '$(srcdir)/'`api/void_data_interface.c void_data_interface.obj: api/void_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT void_data_interface.obj -MD -MP -MF $(DEPDIR)/void_data_interface.Tpo -c -o void_data_interface.obj `if test -f 'api/void_data_interface.c'; then $(CYGPATH_W) 'api/void_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/void_data_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/void_data_interface.Tpo $(DEPDIR)/void_data_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api/void_data_interface.c' object='void_data_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_data_interface.obj `if test -f 'api/void_data_interface.c'; then $(CYGPATH_W) 'api/void_data_interface.c'; else $(CYGPATH_W) '$(srcdir)/api/void_data_interface.c'; fi` 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` task_insert_color.o: basic_examples/task_insert_color.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_insert_color.o -MD -MP -MF $(DEPDIR)/task_insert_color.Tpo -c -o task_insert_color.o `test -f 'basic_examples/task_insert_color.c' || echo '$(srcdir)/'`basic_examples/task_insert_color.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_insert_color.Tpo $(DEPDIR)/task_insert_color.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/task_insert_color.c' object='task_insert_color.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_insert_color.o `test -f 'basic_examples/task_insert_color.c' || echo '$(srcdir)/'`basic_examples/task_insert_color.c task_insert_color.obj: basic_examples/task_insert_color.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_insert_color.obj -MD -MP -MF $(DEPDIR)/task_insert_color.Tpo -c -o task_insert_color.obj `if test -f 'basic_examples/task_insert_color.c'; then $(CYGPATH_W) 'basic_examples/task_insert_color.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/task_insert_color.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_insert_color.Tpo $(DEPDIR)/task_insert_color.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/task_insert_color.c' object='task_insert_color.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_insert_color.obj `if test -f 'basic_examples/task_insert_color.c'; then $(CYGPATH_W) 'basic_examples/task_insert_color.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/task_insert_color.c'; fi` topology.o: basic_examples/topology.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT topology.o -MD -MP -MF $(DEPDIR)/topology.Tpo -c -o topology.o `test -f 'basic_examples/topology.c' || echo '$(srcdir)/'`basic_examples/topology.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/topology.Tpo $(DEPDIR)/topology.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/topology.c' object='topology.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o topology.o `test -f 'basic_examples/topology.c' || echo '$(srcdir)/'`basic_examples/topology.c topology.obj: basic_examples/topology.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT topology.obj -MD -MP -MF $(DEPDIR)/topology.Tpo -c -o topology.obj `if test -f 'basic_examples/topology.c'; then $(CYGPATH_W) 'basic_examples/topology.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/topology.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/topology.Tpo $(DEPDIR)/topology.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='basic_examples/topology.c' object='topology.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o topology.obj `if test -f 'basic_examples/topology.c'; then $(CYGPATH_W) 'basic_examples/topology.c'; else $(CYGPATH_W) '$(srcdir)/basic_examples/topology.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_compil.o: cholesky/cholesky_compil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_compil.o -MD -MP -MF $(DEPDIR)/cholesky_compil.Tpo -c -o cholesky_compil.o `test -f 'cholesky/cholesky_compil.c' || echo '$(srcdir)/'`cholesky/cholesky_compil.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_compil.Tpo $(DEPDIR)/cholesky_compil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_compil.c' object='cholesky_compil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_compil.o `test -f 'cholesky/cholesky_compil.c' || echo '$(srcdir)/'`cholesky/cholesky_compil.c cholesky_compil.obj: cholesky/cholesky_compil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_compil.obj -MD -MP -MF $(DEPDIR)/cholesky_compil.Tpo -c -o cholesky_compil.obj `if test -f 'cholesky/cholesky_compil.c'; then $(CYGPATH_W) 'cholesky/cholesky_compil.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_compil.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_compil.Tpo $(DEPDIR)/cholesky_compil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_compil.c' object='cholesky_compil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_compil.obj `if test -f 'cholesky/cholesky_compil.c'; then $(CYGPATH_W) 'cholesky/cholesky_compil.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_compil.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` 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_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_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` sequential_consistency.o: dependency/sequential_consistency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sequential_consistency.o -MD -MP -MF $(DEPDIR)/sequential_consistency.Tpo -c -o sequential_consistency.o `test -f 'dependency/sequential_consistency.c' || echo '$(srcdir)/'`dependency/sequential_consistency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sequential_consistency.Tpo $(DEPDIR)/sequential_consistency.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dependency/sequential_consistency.c' object='sequential_consistency.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sequential_consistency.o `test -f 'dependency/sequential_consistency.c' || echo '$(srcdir)/'`dependency/sequential_consistency.c sequential_consistency.obj: dependency/sequential_consistency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sequential_consistency.obj -MD -MP -MF $(DEPDIR)/sequential_consistency.Tpo -c -o sequential_consistency.obj `if test -f 'dependency/sequential_consistency.c'; then $(CYGPATH_W) 'dependency/sequential_consistency.c'; else $(CYGPATH_W) '$(srcdir)/dependency/sequential_consistency.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sequential_consistency.Tpo $(DEPDIR)/sequential_consistency.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dependency/sequential_consistency.c' object='sequential_consistency.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sequential_consistency.obj `if test -f 'dependency/sequential_consistency.c'; then $(CYGPATH_W) 'dependency/sequential_consistency.c'; else $(CYGPATH_W) '$(srcdir)/dependency/sequential_consistency.c'; fi` task_end_dep.o: dependency/task_end_dep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_end_dep.o -MD -MP -MF $(DEPDIR)/task_end_dep.Tpo -c -o task_end_dep.o `test -f 'dependency/task_end_dep.c' || echo '$(srcdir)/'`dependency/task_end_dep.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_end_dep.Tpo $(DEPDIR)/task_end_dep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dependency/task_end_dep.c' object='task_end_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 task_end_dep.o `test -f 'dependency/task_end_dep.c' || echo '$(srcdir)/'`dependency/task_end_dep.c task_end_dep.obj: dependency/task_end_dep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_end_dep.obj -MD -MP -MF $(DEPDIR)/task_end_dep.Tpo -c -o task_end_dep.obj `if test -f 'dependency/task_end_dep.c'; then $(CYGPATH_W) 'dependency/task_end_dep.c'; else $(CYGPATH_W) '$(srcdir)/dependency/task_end_dep.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_end_dep.Tpo $(DEPDIR)/task_end_dep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dependency/task_end_dep.c' object='task_end_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 task_end_dep.obj `if test -f 'dependency/task_end_dep.c'; then $(CYGPATH_W) 'dependency/task_end_dep.c'; else $(CYGPATH_W) '$(srcdir)/dependency/task_end_dep.c'; fi` task_end_dep_add.o: dependency/task_end_dep_add.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_end_dep_add.o -MD -MP -MF $(DEPDIR)/task_end_dep_add.Tpo -c -o task_end_dep_add.o `test -f 'dependency/task_end_dep_add.c' || echo '$(srcdir)/'`dependency/task_end_dep_add.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_end_dep_add.Tpo $(DEPDIR)/task_end_dep_add.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dependency/task_end_dep_add.c' object='task_end_dep_add.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_end_dep_add.o `test -f 'dependency/task_end_dep_add.c' || echo '$(srcdir)/'`dependency/task_end_dep_add.c task_end_dep_add.obj: dependency/task_end_dep_add.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_end_dep_add.obj -MD -MP -MF $(DEPDIR)/task_end_dep_add.Tpo -c -o task_end_dep_add.obj `if test -f 'dependency/task_end_dep_add.c'; then $(CYGPATH_W) 'dependency/task_end_dep_add.c'; else $(CYGPATH_W) '$(srcdir)/dependency/task_end_dep_add.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_end_dep_add.Tpo $(DEPDIR)/task_end_dep_add.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dependency/task_end_dep_add.c' object='task_end_dep_add.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_end_dep_add.obj `if test -f 'dependency/task_end_dep_add.c'; then $(CYGPATH_W) 'dependency/task_end_dep_add.c'; else $(CYGPATH_W) '$(srcdir)/dependency/task_end_dep_add.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_implicit.o: filters/fmultiple_submit_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_submit_implicit.o -MD -MP -MF $(DEPDIR)/fmultiple_submit_implicit.Tpo -c -o fmultiple_submit_implicit.o `test -f 'filters/fmultiple_submit_implicit.c' || echo '$(srcdir)/'`filters/fmultiple_submit_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_submit_implicit.Tpo $(DEPDIR)/fmultiple_submit_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_submit_implicit.c' object='fmultiple_submit_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 fmultiple_submit_implicit.o `test -f 'filters/fmultiple_submit_implicit.c' || echo '$(srcdir)/'`filters/fmultiple_submit_implicit.c fmultiple_submit_implicit.obj: filters/fmultiple_submit_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fmultiple_submit_implicit.obj -MD -MP -MF $(DEPDIR)/fmultiple_submit_implicit.Tpo -c -o fmultiple_submit_implicit.obj `if test -f 'filters/fmultiple_submit_implicit.c'; then $(CYGPATH_W) 'filters/fmultiple_submit_implicit.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_submit_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fmultiple_submit_implicit.Tpo $(DEPDIR)/fmultiple_submit_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fmultiple_submit_implicit.c' object='fmultiple_submit_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 fmultiple_submit_implicit.obj `if test -f 'filters/fmultiple_submit_implicit.c'; then $(CYGPATH_W) 'filters/fmultiple_submit_implicit.c'; else $(CYGPATH_W) '$(srcdir)/filters/fmultiple_submit_implicit.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` fread.o: filters/fread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fread.o -MD -MP -MF $(DEPDIR)/fread.Tpo -c -o fread.o `test -f 'filters/fread.c' || echo '$(srcdir)/'`filters/fread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fread.Tpo $(DEPDIR)/fread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fread.c' object='fread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fread.o `test -f 'filters/fread.c' || echo '$(srcdir)/'`filters/fread.c fread.obj: filters/fread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fread.obj -MD -MP -MF $(DEPDIR)/fread.Tpo -c -o fread.obj `if test -f 'filters/fread.c'; then $(CYGPATH_W) 'filters/fread.c'; else $(CYGPATH_W) '$(srcdir)/filters/fread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fread.Tpo $(DEPDIR)/fread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/fread.c' object='fread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fread.obj `if test -f 'filters/fread.c'; then $(CYGPATH_W) 'filters/fread.c'; else $(CYGPATH_W) '$(srcdir)/filters/fread.c'; fi` frecursive.o: filters/frecursive.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT frecursive.o -MD -MP -MF $(DEPDIR)/frecursive.Tpo -c -o frecursive.o `test -f 'filters/frecursive.c' || echo '$(srcdir)/'`filters/frecursive.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/frecursive.Tpo $(DEPDIR)/frecursive.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/frecursive.c' object='frecursive.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o frecursive.o `test -f 'filters/frecursive.c' || echo '$(srcdir)/'`filters/frecursive.c frecursive.obj: filters/frecursive.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT frecursive.obj -MD -MP -MF $(DEPDIR)/frecursive.Tpo -c -o frecursive.obj `if test -f 'filters/frecursive.c'; then $(CYGPATH_W) 'filters/frecursive.c'; else $(CYGPATH_W) '$(srcdir)/filters/frecursive.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/frecursive.Tpo $(DEPDIR)/frecursive.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/frecursive.c' object='frecursive.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o frecursive.obj `if test -f 'filters/frecursive.c'; then $(CYGPATH_W) 'filters/frecursive.c'; else $(CYGPATH_W) '$(srcdir)/filters/frecursive.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_filters.o: interface/complex_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_filters.o -MD -MP -MF $(DEPDIR)/complex_filters.Tpo -c -o complex_filters.o `test -f 'interface/complex_filters.c' || echo '$(srcdir)/'`interface/complex_filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_filters.Tpo $(DEPDIR)/complex_filters.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex_filters.c' object='complex_filters.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_filters.o `test -f 'interface/complex_filters.c' || echo '$(srcdir)/'`interface/complex_filters.c complex_filters.obj: interface/complex_filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT complex_filters.obj -MD -MP -MF $(DEPDIR)/complex_filters.Tpo -c -o complex_filters.obj `if test -f 'interface/complex_filters.c'; then $(CYGPATH_W) 'interface/complex_filters.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex_filters.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/complex_filters.Tpo $(DEPDIR)/complex_filters.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface/complex_filters.c' object='complex_filters.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_filters.obj `if test -f 'interface/complex_filters.c'; then $(CYGPATH_W) 'interface/complex_filters.c'; else $(CYGPATH_W) '$(srcdir)/interface/complex_filters.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` mlr.o: mlr/mlr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mlr.o -MD -MP -MF $(DEPDIR)/mlr.Tpo -c -o mlr.o `test -f 'mlr/mlr.c' || echo '$(srcdir)/'`mlr/mlr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mlr.Tpo $(DEPDIR)/mlr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mlr/mlr.c' object='mlr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mlr.o `test -f 'mlr/mlr.c' || echo '$(srcdir)/'`mlr/mlr.c mlr.obj: mlr/mlr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mlr.obj -MD -MP -MF $(DEPDIR)/mlr.Tpo -c -o mlr.obj `if test -f 'mlr/mlr.c'; then $(CYGPATH_W) 'mlr/mlr.c'; else $(CYGPATH_W) '$(srcdir)/mlr/mlr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mlr.Tpo $(DEPDIR)/mlr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mlr/mlr.c' object='mlr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mlr.obj `if test -f 'mlr/mlr.c'; then $(CYGPATH_W) 'mlr/mlr.c'; else $(CYGPATH_W) '$(srcdir)/mlr/mlr.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` gpu_partition.o: sched_ctx/gpu_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_partition.o -MD -MP -MF $(DEPDIR)/gpu_partition.Tpo -c -o gpu_partition.o `test -f 'sched_ctx/gpu_partition.c' || echo '$(srcdir)/'`sched_ctx/gpu_partition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_partition.Tpo $(DEPDIR)/gpu_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/gpu_partition.c' object='gpu_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 gpu_partition.o `test -f 'sched_ctx/gpu_partition.c' || echo '$(srcdir)/'`sched_ctx/gpu_partition.c gpu_partition.obj: sched_ctx/gpu_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_partition.obj -MD -MP -MF $(DEPDIR)/gpu_partition.Tpo -c -o gpu_partition.obj `if test -f 'sched_ctx/gpu_partition.c'; then $(CYGPATH_W) 'sched_ctx/gpu_partition.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/gpu_partition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_partition.Tpo $(DEPDIR)/gpu_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/gpu_partition.c' object='gpu_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 gpu_partition.obj `if test -f 'sched_ctx/gpu_partition.c'; then $(CYGPATH_W) 'sched_ctx/gpu_partition.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/gpu_partition.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` parallel_tasks_with_cluster_api.o: sched_ctx/parallel_tasks_with_cluster_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_tasks_with_cluster_api.o -MD -MP -MF $(DEPDIR)/parallel_tasks_with_cluster_api.Tpo -c -o parallel_tasks_with_cluster_api.o `test -f 'sched_ctx/parallel_tasks_with_cluster_api.c' || echo '$(srcdir)/'`sched_ctx/parallel_tasks_with_cluster_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_tasks_with_cluster_api.Tpo $(DEPDIR)/parallel_tasks_with_cluster_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/parallel_tasks_with_cluster_api.c' object='parallel_tasks_with_cluster_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 parallel_tasks_with_cluster_api.o `test -f 'sched_ctx/parallel_tasks_with_cluster_api.c' || echo '$(srcdir)/'`sched_ctx/parallel_tasks_with_cluster_api.c parallel_tasks_with_cluster_api.obj: sched_ctx/parallel_tasks_with_cluster_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_tasks_with_cluster_api.obj -MD -MP -MF $(DEPDIR)/parallel_tasks_with_cluster_api.Tpo -c -o parallel_tasks_with_cluster_api.obj `if test -f 'sched_ctx/parallel_tasks_with_cluster_api.c'; then $(CYGPATH_W) 'sched_ctx/parallel_tasks_with_cluster_api.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/parallel_tasks_with_cluster_api.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_tasks_with_cluster_api.Tpo $(DEPDIR)/parallel_tasks_with_cluster_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/parallel_tasks_with_cluster_api.c' object='parallel_tasks_with_cluster_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 parallel_tasks_with_cluster_api.obj `if test -f 'sched_ctx/parallel_tasks_with_cluster_api.c'; then $(CYGPATH_W) 'sched_ctx/parallel_tasks_with_cluster_api.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/parallel_tasks_with_cluster_api.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_delete.o: sched_ctx/sched_ctx_delete.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_delete.o -MD -MP -MF $(DEPDIR)/sched_ctx_delete.Tpo -c -o sched_ctx_delete.o `test -f 'sched_ctx/sched_ctx_delete.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_delete.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_delete.Tpo $(DEPDIR)/sched_ctx_delete.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_delete.c' object='sched_ctx_delete.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_delete.o `test -f 'sched_ctx/sched_ctx_delete.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_delete.c sched_ctx_delete.obj: sched_ctx/sched_ctx_delete.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_delete.obj -MD -MP -MF $(DEPDIR)/sched_ctx_delete.Tpo -c -o sched_ctx_delete.obj `if test -f 'sched_ctx/sched_ctx_delete.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_delete.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_delete.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_delete.Tpo $(DEPDIR)/sched_ctx_delete.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_delete.c' object='sched_ctx_delete.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_delete.obj `if test -f 'sched_ctx/sched_ctx_delete.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_delete.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_delete.c'; fi` sched_ctx_empty.o: sched_ctx/sched_ctx_empty.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_empty.o -MD -MP -MF $(DEPDIR)/sched_ctx_empty.Tpo -c -o sched_ctx_empty.o `test -f 'sched_ctx/sched_ctx_empty.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_empty.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_empty.Tpo $(DEPDIR)/sched_ctx_empty.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_empty.c' object='sched_ctx_empty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_empty.o `test -f 'sched_ctx/sched_ctx_empty.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_empty.c sched_ctx_empty.obj: sched_ctx/sched_ctx_empty.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_empty.obj -MD -MP -MF $(DEPDIR)/sched_ctx_empty.Tpo -c -o sched_ctx_empty.obj `if test -f 'sched_ctx/sched_ctx_empty.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_empty.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_empty.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_empty.Tpo $(DEPDIR)/sched_ctx_empty.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_empty.c' object='sched_ctx_empty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_empty.obj `if test -f 'sched_ctx/sched_ctx_empty.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_empty.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_empty.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_modular_sched.o: scheduler/dummy_modular_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dummy_modular_sched.o -MD -MP -MF $(DEPDIR)/dummy_modular_sched.Tpo -c -o dummy_modular_sched.o `test -f 'scheduler/dummy_modular_sched.c' || echo '$(srcdir)/'`scheduler/dummy_modular_sched.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_modular_sched.Tpo $(DEPDIR)/dummy_modular_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scheduler/dummy_modular_sched.c' object='dummy_modular_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_modular_sched.o `test -f 'scheduler/dummy_modular_sched.c' || echo '$(srcdir)/'`scheduler/dummy_modular_sched.c dummy_modular_sched.obj: scheduler/dummy_modular_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dummy_modular_sched.obj -MD -MP -MF $(DEPDIR)/dummy_modular_sched.Tpo -c -o dummy_modular_sched.obj `if test -f 'scheduler/dummy_modular_sched.c'; then $(CYGPATH_W) 'scheduler/dummy_modular_sched.c'; else $(CYGPATH_W) '$(srcdir)/scheduler/dummy_modular_sched.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_modular_sched.Tpo $(DEPDIR)/dummy_modular_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scheduler/dummy_modular_sched.c' object='dummy_modular_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_modular_sched.obj `if test -f 'scheduler/dummy_modular_sched.c'; then $(CYGPATH_W) 'scheduler/dummy_modular_sched.c'; else $(CYGPATH_W) '$(srcdir)/scheduler/dummy_modular_sched.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` heteroprio_test.o: scheduler/heteroprio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heteroprio_test.o -MD -MP -MF $(DEPDIR)/heteroprio_test.Tpo -c -o heteroprio_test.o `test -f 'scheduler/heteroprio_test.c' || echo '$(srcdir)/'`scheduler/heteroprio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/heteroprio_test.Tpo $(DEPDIR)/heteroprio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scheduler/heteroprio_test.c' object='heteroprio_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 heteroprio_test.o `test -f 'scheduler/heteroprio_test.c' || echo '$(srcdir)/'`scheduler/heteroprio_test.c heteroprio_test.obj: scheduler/heteroprio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heteroprio_test.obj -MD -MP -MF $(DEPDIR)/heteroprio_test.Tpo -c -o heteroprio_test.obj `if test -f 'scheduler/heteroprio_test.c'; then $(CYGPATH_W) 'scheduler/heteroprio_test.c'; else $(CYGPATH_W) '$(srcdir)/scheduler/heteroprio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/heteroprio_test.Tpo $(DEPDIR)/heteroprio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scheduler/heteroprio_test.c' object='heteroprio_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 heteroprio_test.obj `if test -f 'scheduler/heteroprio_test.c'; then $(CYGPATH_W) 'scheduler/heteroprio_test.c'; else $(CYGPATH_W) '$(srcdir)/scheduler/heteroprio_test.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` 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 $@ $< add_vectors.o: cpp/add_vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT add_vectors.o -MD -MP -MF $(DEPDIR)/add_vectors.Tpo -c -o add_vectors.o `test -f 'cpp/add_vectors.cpp' || echo '$(srcdir)/'`cpp/add_vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/add_vectors.Tpo $(DEPDIR)/add_vectors.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/add_vectors.cpp' object='add_vectors.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 add_vectors.o `test -f 'cpp/add_vectors.cpp' || echo '$(srcdir)/'`cpp/add_vectors.cpp add_vectors.obj: cpp/add_vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT add_vectors.obj -MD -MP -MF $(DEPDIR)/add_vectors.Tpo -c -o add_vectors.obj `if test -f 'cpp/add_vectors.cpp'; then $(CYGPATH_W) 'cpp/add_vectors.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/add_vectors.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/add_vectors.Tpo $(DEPDIR)/add_vectors.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/add_vectors.cpp' object='add_vectors.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 add_vectors.obj `if test -f 'cpp/add_vectors.cpp'; then $(CYGPATH_W) 'cpp/add_vectors.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/add_vectors.cpp'; fi` add_vectors_cpp11.o: cpp/add_vectors_cpp11.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT add_vectors_cpp11.o -MD -MP -MF $(DEPDIR)/add_vectors_cpp11.Tpo -c -o add_vectors_cpp11.o `test -f 'cpp/add_vectors_cpp11.cpp' || echo '$(srcdir)/'`cpp/add_vectors_cpp11.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/add_vectors_cpp11.Tpo $(DEPDIR)/add_vectors_cpp11.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/add_vectors_cpp11.cpp' object='add_vectors_cpp11.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 add_vectors_cpp11.o `test -f 'cpp/add_vectors_cpp11.cpp' || echo '$(srcdir)/'`cpp/add_vectors_cpp11.cpp add_vectors_cpp11.obj: cpp/add_vectors_cpp11.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT add_vectors_cpp11.obj -MD -MP -MF $(DEPDIR)/add_vectors_cpp11.Tpo -c -o add_vectors_cpp11.obj `if test -f 'cpp/add_vectors_cpp11.cpp'; then $(CYGPATH_W) 'cpp/add_vectors_cpp11.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/add_vectors_cpp11.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/add_vectors_cpp11.Tpo $(DEPDIR)/add_vectors_cpp11.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/add_vectors_cpp11.cpp' object='add_vectors_cpp11.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 add_vectors_cpp11.obj `if test -f 'cpp/add_vectors_cpp11.cpp'; then $(CYGPATH_W) 'cpp/add_vectors_cpp11.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/add_vectors_cpp11.cpp'; fi` add_vectors_interface.o: cpp/add_vectors_interface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT add_vectors_interface.o -MD -MP -MF $(DEPDIR)/add_vectors_interface.Tpo -c -o add_vectors_interface.o `test -f 'cpp/add_vectors_interface.cpp' || echo '$(srcdir)/'`cpp/add_vectors_interface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/add_vectors_interface.Tpo $(DEPDIR)/add_vectors_interface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/add_vectors_interface.cpp' object='add_vectors_interface.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 add_vectors_interface.o `test -f 'cpp/add_vectors_interface.cpp' || echo '$(srcdir)/'`cpp/add_vectors_interface.cpp add_vectors_interface.obj: cpp/add_vectors_interface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT add_vectors_interface.obj -MD -MP -MF $(DEPDIR)/add_vectors_interface.Tpo -c -o add_vectors_interface.obj `if test -f 'cpp/add_vectors_interface.cpp'; then $(CYGPATH_W) 'cpp/add_vectors_interface.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/add_vectors_interface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/add_vectors_interface.Tpo $(DEPDIR)/add_vectors_interface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpp/add_vectors_interface.cpp' object='add_vectors_interface.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 add_vectors_interface.obj `if test -f 'cpp/add_vectors_interface.cpp'; then $(CYGPATH_W) 'cpp/add_vectors_interface.cpp'; else $(CYGPATH_W) '$(srcdir)/cpp/add_vectors_interface.cpp'; fi` 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 api/.libs api/_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 dependency/.libs dependency/_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 mlr/.libs mlr/_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 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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 $$? 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) mult/sgemm.sh.log: mult/sgemm.sh @p='mult/sgemm.sh'; \ b='mult/sgemm.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) cholesky/cholesky.sh.log: cholesky/cholesky.sh @p='cholesky/cholesky.sh'; \ b='cholesky/cholesky.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) 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) 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) scheduler/dummy_modular_sched.log: scheduler/dummy_modular_sched$(EXEEXT) @p='scheduler/dummy_modular_sched$(EXEEXT)'; \ b='scheduler/dummy_modular_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) 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) api/bcsr_data_interface.log: api/bcsr_data_interface$(EXEEXT) @p='api/bcsr_data_interface$(EXEEXT)'; \ b='api/bcsr_data_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) api/block_data_interface.log: api/block_data_interface$(EXEEXT) @p='api/block_data_interface$(EXEEXT)'; \ b='api/block_data_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) api/coo_data_interface.log: api/coo_data_interface$(EXEEXT) @p='api/coo_data_interface$(EXEEXT)'; \ b='api/coo_data_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) api/csr_data_interface.log: api/csr_data_interface$(EXEEXT) @p='api/csr_data_interface$(EXEEXT)'; \ b='api/csr_data_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) api/matrix_data_interface.log: api/matrix_data_interface$(EXEEXT) @p='api/matrix_data_interface$(EXEEXT)'; \ b='api/matrix_data_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) api/multiformat_data_interface.log: api/multiformat_data_interface$(EXEEXT) @p='api/multiformat_data_interface$(EXEEXT)'; \ b='api/multiformat_data_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) api/variable_data_interface.log: api/variable_data_interface$(EXEEXT) @p='api/variable_data_interface$(EXEEXT)'; \ b='api/variable_data_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) api/vector_data_interface.log: api/vector_data_interface$(EXEEXT) @p='api/vector_data_interface$(EXEEXT)'; \ b='api/vector_data_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) api/void_data_interface.log: api/void_data_interface$(EXEEXT) @p='api/void_data_interface$(EXEEXT)'; \ b='api/void_data_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) 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/topology.log: basic_examples/topology$(EXEEXT) @p='basic_examples/topology$(EXEEXT)'; \ b='basic_examples/topology'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) basic_examples/task_insert_color.log: basic_examples/task_insert_color$(EXEEXT) @p='basic_examples/task_insert_color$(EXEEXT)'; \ b='basic_examples/task_insert_color'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mlr/mlr.log: mlr/mlr$(EXEEXT) @p='mlr/mlr$(EXEEXT)'; \ b='mlr/mlr'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) cpp/add_vectors.log: cpp/add_vectors$(EXEEXT) @p='cpp/add_vectors$(EXEEXT)'; \ b='cpp/add_vectors'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/add_vectors_interface.log: cpp/add_vectors_interface$(EXEEXT) @p='cpp/add_vectors_interface$(EXEEXT)'; \ b='cpp/add_vectors_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) filters/fread.log: filters/fread$(EXEEXT) @p='filters/fread$(EXEEXT)'; \ b='filters/fread'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) filters/fmultiple_submit_implicit.log: filters/fmultiple_submit_implicit$(EXEEXT) @p='filters/fmultiple_submit_implicit$(EXEEXT)'; \ b='filters/fmultiple_submit_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) filters/frecursive.log: filters/frecursive$(EXEEXT) @p='filters/frecursive$(EXEEXT)'; \ b='filters/frecursive'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/heteroprio_test.log: scheduler/heteroprio_test$(EXEEXT) @p='scheduler/heteroprio_test$(EXEEXT)'; \ b='scheduler/heteroprio_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) 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/sched_ctx_empty.log: sched_ctx/sched_ctx_empty$(EXEEXT) @p='sched_ctx/sched_ctx_empty$(EXEEXT)'; \ b='sched_ctx/sched_ctx_empty'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_delete.log: sched_ctx/sched_ctx_delete$(EXEEXT) @p='sched_ctx/sched_ctx_delete$(EXEEXT)'; \ b='sched_ctx/sched_ctx_delete'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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) dependency/task_end_dep.log: dependency/task_end_dep$(EXEEXT) @p='dependency/task_end_dep$(EXEEXT)'; \ b='dependency/task_end_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) dependency/task_end_dep_add.log: dependency/task_end_dep_add$(EXEEXT) @p='dependency/task_end_dep_add$(EXEEXT)'; \ b='dependency/task_end_dep_add'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) dependency/sequential_consistency.log: dependency/sequential_consistency$(EXEEXT) @p='dependency/sequential_consistency$(EXEEXT)'; \ b='dependency/sequential_consistency'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/add_vectors_cpp11.log: cpp/add_vectors_cpp11$(EXEEXT) @p='cpp/add_vectors_cpp11$(EXEEXT)'; \ b='cpp/add_vectors_cpp11'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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) 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) cholesky/cholesky_compil.log: cholesky/cholesky_compil$(EXEEXT) @p='cholesky/cholesky_compil$(EXEEXT)'; \ b='cholesky/cholesky_compil'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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) sched_ctx/parallel_tasks_with_cluster_api.log: sched_ctx/parallel_tasks_with_cluster_api$(EXEEXT) @p='sched_ctx/parallel_tasks_with_cluster_api$(EXEEXT)'; \ b='sched_ctx/parallel_tasks_with_cluster_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) sched_ctx/gpu_partition.log: sched_ctx/gpu_partition$(EXEEXT) @p='sched_ctx/gpu_partition$(EXEEXT)'; \ b='sched_ctx/gpu_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) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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 api/$(am__dirstamp) -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 dependency/$(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 mlr/$(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/$(DEPDIR)/$(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 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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/add_vectors.Po -rm -f ./$(DEPDIR)/add_vectors_cpp11.Po -rm -f ./$(DEPDIR)/add_vectors_interface.Po -rm -f ./$(DEPDIR)/axpy.Po -rm -f ./$(DEPDIR)/axpy_opencl.Po -rm -f ./$(DEPDIR)/bcsr_data_interface.Po -rm -f ./$(DEPDIR)/binary.Po -rm -f ./$(DEPDIR)/blas.Po -rm -f ./$(DEPDIR)/blas_complex.Po -rm -f ./$(DEPDIR)/block.Po -rm -f ./$(DEPDIR)/block_cpu.Po -rm -f ./$(DEPDIR)/block_data_interface.Po -rm -f ./$(DEPDIR)/block_opencl.Po -rm -f ./$(DEPDIR)/callback.Po -rm -f ./$(DEPDIR)/cg.Po -rm -f ./$(DEPDIR)/cg_kernels.Po -rm -f ./$(DEPDIR)/cholesky_compil.Po -rm -f ./$(DEPDIR)/cholesky_grain_tag.Po -rm -f ./$(DEPDIR)/cholesky_implicit.Po -rm -f ./$(DEPDIR)/cholesky_kernels.Po -rm -f ./$(DEPDIR)/cholesky_models.Po -rm -f ./$(DEPDIR)/cholesky_tag.Po -rm -f ./$(DEPDIR)/cholesky_tile_tag.Po -rm -f ./$(DEPDIR)/clu.Po -rm -f ./$(DEPDIR)/clu_implicit.Po -rm -f ./$(DEPDIR)/clu_implicit_pivot.Po -rm -f ./$(DEPDIR)/clu_kernels.Po -rm -f ./$(DEPDIR)/clu_pivot.Po -rm -f ./$(DEPDIR)/complex.Po -rm -f ./$(DEPDIR)/complex_filters.Po -rm -f ./$(DEPDIR)/complex_interface.Po -rm -f ./$(DEPDIR)/complex_kernels_opencl.Po -rm -f ./$(DEPDIR)/conversion_opencl.Po -rm -f ./$(DEPDIR)/coo_data_interface.Po -rm -f ./$(DEPDIR)/csr_data_interface.Po -rm -f ./$(DEPDIR)/custom_conversion_codelets.Po -rm -f ./$(DEPDIR)/custom_interface.Po -rm -f ./$(DEPDIR)/custom_mf_filter.Po -rm -f ./$(DEPDIR)/custom_opencl.Po -rm -f ./$(DEPDIR)/dgemm.Po -rm -f ./$(DEPDIR)/dlu.Po -rm -f ./$(DEPDIR)/dlu_implicit.Po -rm -f ./$(DEPDIR)/dlu_implicit_pivot.Po -rm -f ./$(DEPDIR)/dlu_kernels.Po -rm -f ./$(DEPDIR)/dlu_pivot.Po -rm -f ./$(DEPDIR)/dot_product.Po -rm -f ./$(DEPDIR)/dummy_modular_sched.Po -rm -f ./$(DEPDIR)/dummy_sched.Po -rm -f ./$(DEPDIR)/dummy_sched_with_ctx.Po -rm -f ./$(DEPDIR)/dw_block_spmv.Po -rm -f ./$(DEPDIR)/dw_block_spmv_kernels.Po -rm -f ./$(DEPDIR)/dw_factolu.Po -rm -f ./$(DEPDIR)/dw_factolu_grain.Po -rm -f ./$(DEPDIR)/dw_factolu_kernels.Po -rm -f ./$(DEPDIR)/dw_factolu_tag.Po -rm -f ./$(DEPDIR)/dw_sparse_cg.Po -rm -f ./$(DEPDIR)/dw_sparse_cg_kernels.Po -rm -f ./$(DEPDIR)/dynamic_handles.Po -rm -f ./$(DEPDIR)/fblock.Po -rm -f ./$(DEPDIR)/fblock_cpu.Po -rm -f ./$(DEPDIR)/fblock_opencl.Po -rm -f ./$(DEPDIR)/fmatrix.Po -rm -f ./$(DEPDIR)/fmultiple_manual.Po -rm -f ./$(DEPDIR)/fmultiple_submit.Po -rm -f ./$(DEPDIR)/fmultiple_submit_implicit.Po -rm -f ./$(DEPDIR)/fmultiple_submit_readonly.Po -rm -f ./$(DEPDIR)/fread.Po -rm -f ./$(DEPDIR)/frecursive.Po -rm -f ./$(DEPDIR)/fvector.Po -rm -f ./$(DEPDIR)/gl_interop.Po -rm -f ./$(DEPDIR)/gl_interop_idle.Po -rm -f ./$(DEPDIR)/gpu_partition.Po -rm -f ./$(DEPDIR)/heat.Po -rm -f ./$(DEPDIR)/heat_display.Po -rm -f ./$(DEPDIR)/hello_c.Po -rm -f ./$(DEPDIR)/hello_world.Po -rm -f ./$(DEPDIR)/heteroprio_test.Po -rm -f ./$(DEPDIR)/incrementer.Po -rm -f ./$(DEPDIR)/incrementer_cpp.Po -rm -f ./$(DEPDIR)/incrementer_kernels_opencl.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/lu_example_complex_double.Po -rm -f ./$(DEPDIR)/lu_example_complex_float.Po -rm -f ./$(DEPDIR)/lu_example_double.Po -rm -f ./$(DEPDIR)/lu_example_float.Po -rm -f ./$(DEPDIR)/lu_kernels_model.Po -rm -f ./$(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po -rm -f ./$(DEPDIR)/marshalling.Po -rm -f ./$(DEPDIR)/matrix_data_interface.Po -rm -f ./$(DEPDIR)/matvecmult.Po -rm -f ./$(DEPDIR)/minmax_reduction.Po -rm -f ./$(DEPDIR)/mlr.Po -rm -f ./$(DEPDIR)/mm_to_bcsr.Po -rm -f ./$(DEPDIR)/mmio.Po -rm -f ./$(DEPDIR)/mult.Po -rm -f ./$(DEPDIR)/multiformat.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po -rm -f ./$(DEPDIR)/multiformat_data_interface.Po -rm -f ./$(DEPDIR)/multiformat_opencl.Po -rm -f ./$(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po -rm -f ./$(DEPDIR)/parallel_tasks_with_cluster_api.Po -rm -f ./$(DEPDIR)/pi.Po -rm -f ./$(DEPDIR)/pi_redux.Po -rm -f ./$(DEPDIR)/pipeline.Po -rm -f ./$(DEPDIR)/ppm_downscaler.Po -rm -f ./$(DEPDIR)/prio.Po -rm -f ./$(DEPDIR)/profiling.Po -rm -f ./$(DEPDIR)/prologue.Po -rm -f ./$(DEPDIR)/sched_ctx.Po -rm -f ./$(DEPDIR)/sched_ctx_delete.Po -rm -f ./$(DEPDIR)/sched_ctx_empty.Po -rm -f ./$(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po -rm -f ./$(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po -rm -f ./$(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po -rm -f ./$(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po -rm -f ./$(DEPDIR)/sched_ctx_utils.Po -rm -f ./$(DEPDIR)/sched_ctx_without_sched_policy_awake.Po -rm -f ./$(DEPDIR)/sequential_consistency.Po -rm -f ./$(DEPDIR)/sgemm.Po -rm -f ./$(DEPDIR)/shadow.Po -rm -f ./$(DEPDIR)/shadow2d.Po -rm -f ./$(DEPDIR)/shadow3d.Po -rm -f ./$(DEPDIR)/slu.Po -rm -f ./$(DEPDIR)/slu_implicit.Po -rm -f ./$(DEPDIR)/slu_implicit_pivot.Po -rm -f ./$(DEPDIR)/slu_kernels.Po -rm -f ./$(DEPDIR)/slu_pivot.Po -rm -f ./$(DEPDIR)/sobol_gold.Po -rm -f ./$(DEPDIR)/sobol_primitives.Po -rm -f ./$(DEPDIR)/spmv.Po -rm -f ./$(DEPDIR)/spmv_kernels.Po -rm -f ./$(DEPDIR)/tag_example.Po -rm -f ./$(DEPDIR)/tag_example2.Po -rm -f ./$(DEPDIR)/tag_example3.Po -rm -f ./$(DEPDIR)/tag_example4.Po -rm -f ./$(DEPDIR)/tag_restartable.Po -rm -f ./$(DEPDIR)/task_end_dep.Po -rm -f ./$(DEPDIR)/task_end_dep_add.Po -rm -f ./$(DEPDIR)/task_insert_color.Po -rm -f ./$(DEPDIR)/topology.Po -rm -f ./$(DEPDIR)/two_cpu_contexts.Po -rm -f ./$(DEPDIR)/variable.Po -rm -f ./$(DEPDIR)/variable_data_interface.Po -rm -f ./$(DEPDIR)/variable_kernels_cpu.Po -rm -f ./$(DEPDIR)/variable_kernels_opencl.Po -rm -f ./$(DEPDIR)/vector_data_interface.Po -rm -f ./$(DEPDIR)/vector_scal.Po -rm -f ./$(DEPDIR)/vector_scal_c.Po -rm -f ./$(DEPDIR)/vector_scal_cpu.Po -rm -f ./$(DEPDIR)/vector_scal_opencl.Po -rm -f ./$(DEPDIR)/vector_scal_spmd.Po -rm -f ./$(DEPDIR)/void_data_interface.Po -rm -f ./$(DEPDIR)/worker_list_example.Po -rm -f ./$(DEPDIR)/worker_tree_example.Po -rm -f ./$(DEPDIR)/yuv_downscaler.Po -rm -f ./$(DEPDIR)/zlu.Po -rm -f ./$(DEPDIR)/zlu_implicit.Po -rm -f ./$(DEPDIR)/zlu_implicit_pivot.Po -rm -f ./$(DEPDIR)/zlu_kernels.Po -rm -f ./$(DEPDIR)/zlu_pivot.Po -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 -f ./$(DEPDIR)/add_vectors.Po -rm -f ./$(DEPDIR)/add_vectors_cpp11.Po -rm -f ./$(DEPDIR)/add_vectors_interface.Po -rm -f ./$(DEPDIR)/axpy.Po -rm -f ./$(DEPDIR)/axpy_opencl.Po -rm -f ./$(DEPDIR)/bcsr_data_interface.Po -rm -f ./$(DEPDIR)/binary.Po -rm -f ./$(DEPDIR)/blas.Po -rm -f ./$(DEPDIR)/blas_complex.Po -rm -f ./$(DEPDIR)/block.Po -rm -f ./$(DEPDIR)/block_cpu.Po -rm -f ./$(DEPDIR)/block_data_interface.Po -rm -f ./$(DEPDIR)/block_opencl.Po -rm -f ./$(DEPDIR)/callback.Po -rm -f ./$(DEPDIR)/cg.Po -rm -f ./$(DEPDIR)/cg_kernels.Po -rm -f ./$(DEPDIR)/cholesky_compil.Po -rm -f ./$(DEPDIR)/cholesky_grain_tag.Po -rm -f ./$(DEPDIR)/cholesky_implicit.Po -rm -f ./$(DEPDIR)/cholesky_kernels.Po -rm -f ./$(DEPDIR)/cholesky_models.Po -rm -f ./$(DEPDIR)/cholesky_tag.Po -rm -f ./$(DEPDIR)/cholesky_tile_tag.Po -rm -f ./$(DEPDIR)/clu.Po -rm -f ./$(DEPDIR)/clu_implicit.Po -rm -f ./$(DEPDIR)/clu_implicit_pivot.Po -rm -f ./$(DEPDIR)/clu_kernels.Po -rm -f ./$(DEPDIR)/clu_pivot.Po -rm -f ./$(DEPDIR)/complex.Po -rm -f ./$(DEPDIR)/complex_filters.Po -rm -f ./$(DEPDIR)/complex_interface.Po -rm -f ./$(DEPDIR)/complex_kernels_opencl.Po -rm -f ./$(DEPDIR)/conversion_opencl.Po -rm -f ./$(DEPDIR)/coo_data_interface.Po -rm -f ./$(DEPDIR)/csr_data_interface.Po -rm -f ./$(DEPDIR)/custom_conversion_codelets.Po -rm -f ./$(DEPDIR)/custom_interface.Po -rm -f ./$(DEPDIR)/custom_mf_filter.Po -rm -f ./$(DEPDIR)/custom_opencl.Po -rm -f ./$(DEPDIR)/dgemm.Po -rm -f ./$(DEPDIR)/dlu.Po -rm -f ./$(DEPDIR)/dlu_implicit.Po -rm -f ./$(DEPDIR)/dlu_implicit_pivot.Po -rm -f ./$(DEPDIR)/dlu_kernels.Po -rm -f ./$(DEPDIR)/dlu_pivot.Po -rm -f ./$(DEPDIR)/dot_product.Po -rm -f ./$(DEPDIR)/dummy_modular_sched.Po -rm -f ./$(DEPDIR)/dummy_sched.Po -rm -f ./$(DEPDIR)/dummy_sched_with_ctx.Po -rm -f ./$(DEPDIR)/dw_block_spmv.Po -rm -f ./$(DEPDIR)/dw_block_spmv_kernels.Po -rm -f ./$(DEPDIR)/dw_factolu.Po -rm -f ./$(DEPDIR)/dw_factolu_grain.Po -rm -f ./$(DEPDIR)/dw_factolu_kernels.Po -rm -f ./$(DEPDIR)/dw_factolu_tag.Po -rm -f ./$(DEPDIR)/dw_sparse_cg.Po -rm -f ./$(DEPDIR)/dw_sparse_cg_kernels.Po -rm -f ./$(DEPDIR)/dynamic_handles.Po -rm -f ./$(DEPDIR)/fblock.Po -rm -f ./$(DEPDIR)/fblock_cpu.Po -rm -f ./$(DEPDIR)/fblock_opencl.Po -rm -f ./$(DEPDIR)/fmatrix.Po -rm -f ./$(DEPDIR)/fmultiple_manual.Po -rm -f ./$(DEPDIR)/fmultiple_submit.Po -rm -f ./$(DEPDIR)/fmultiple_submit_implicit.Po -rm -f ./$(DEPDIR)/fmultiple_submit_readonly.Po -rm -f ./$(DEPDIR)/fread.Po -rm -f ./$(DEPDIR)/frecursive.Po -rm -f ./$(DEPDIR)/fvector.Po -rm -f ./$(DEPDIR)/gl_interop.Po -rm -f ./$(DEPDIR)/gl_interop_idle.Po -rm -f ./$(DEPDIR)/gpu_partition.Po -rm -f ./$(DEPDIR)/heat.Po -rm -f ./$(DEPDIR)/heat_display.Po -rm -f ./$(DEPDIR)/hello_c.Po -rm -f ./$(DEPDIR)/hello_world.Po -rm -f ./$(DEPDIR)/heteroprio_test.Po -rm -f ./$(DEPDIR)/incrementer.Po -rm -f ./$(DEPDIR)/incrementer_cpp.Po -rm -f ./$(DEPDIR)/incrementer_kernels_opencl.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/lu_example_complex_double.Po -rm -f ./$(DEPDIR)/lu_example_complex_float.Po -rm -f ./$(DEPDIR)/lu_example_double.Po -rm -f ./$(DEPDIR)/lu_example_float.Po -rm -f ./$(DEPDIR)/lu_kernels_model.Po -rm -f ./$(DEPDIR)/mandelbrot_mandelbrot-mandelbrot.Po -rm -f ./$(DEPDIR)/marshalling.Po -rm -f ./$(DEPDIR)/matrix_data_interface.Po -rm -f ./$(DEPDIR)/matvecmult.Po -rm -f ./$(DEPDIR)/minmax_reduction.Po -rm -f ./$(DEPDIR)/mlr.Po -rm -f ./$(DEPDIR)/mm_to_bcsr.Po -rm -f ./$(DEPDIR)/mmio.Po -rm -f ./$(DEPDIR)/mult.Po -rm -f ./$(DEPDIR)/multiformat.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po -rm -f ./$(DEPDIR)/multiformat_data_interface.Po -rm -f ./$(DEPDIR)/multiformat_opencl.Po -rm -f ./$(DEPDIR)/openmp_vector_scal_omp-vector_scal_omp.Po -rm -f ./$(DEPDIR)/parallel_tasks_with_cluster_api.Po -rm -f ./$(DEPDIR)/pi.Po -rm -f ./$(DEPDIR)/pi_redux.Po -rm -f ./$(DEPDIR)/pipeline.Po -rm -f ./$(DEPDIR)/ppm_downscaler.Po -rm -f ./$(DEPDIR)/prio.Po -rm -f ./$(DEPDIR)/profiling.Po -rm -f ./$(DEPDIR)/prologue.Po -rm -f ./$(DEPDIR)/sched_ctx.Po -rm -f ./$(DEPDIR)/sched_ctx_delete.Po -rm -f ./$(DEPDIR)/sched_ctx_empty.Po -rm -f ./$(DEPDIR)/sched_ctx_nested_sched_ctxs-nested_sched_ctxs.Po -rm -f ./$(DEPDIR)/sched_ctx_parallel_code-parallel_code.Po -rm -f ./$(DEPDIR)/sched_ctx_parallel_tasks_reuse_handle-parallel_tasks_reuse_handle.Po -rm -f ./$(DEPDIR)/sched_ctx_sched_ctx_without_sched_policy-sched_ctx_without_sched_policy.Po -rm -f ./$(DEPDIR)/sched_ctx_utils.Po -rm -f ./$(DEPDIR)/sched_ctx_without_sched_policy_awake.Po -rm -f ./$(DEPDIR)/sequential_consistency.Po -rm -f ./$(DEPDIR)/sgemm.Po -rm -f ./$(DEPDIR)/shadow.Po -rm -f ./$(DEPDIR)/shadow2d.Po -rm -f ./$(DEPDIR)/shadow3d.Po -rm -f ./$(DEPDIR)/slu.Po -rm -f ./$(DEPDIR)/slu_implicit.Po -rm -f ./$(DEPDIR)/slu_implicit_pivot.Po -rm -f ./$(DEPDIR)/slu_kernels.Po -rm -f ./$(DEPDIR)/slu_pivot.Po -rm -f ./$(DEPDIR)/sobol_gold.Po -rm -f ./$(DEPDIR)/sobol_primitives.Po -rm -f ./$(DEPDIR)/spmv.Po -rm -f ./$(DEPDIR)/spmv_kernels.Po -rm -f ./$(DEPDIR)/tag_example.Po -rm -f ./$(DEPDIR)/tag_example2.Po -rm -f ./$(DEPDIR)/tag_example3.Po -rm -f ./$(DEPDIR)/tag_example4.Po -rm -f ./$(DEPDIR)/tag_restartable.Po -rm -f ./$(DEPDIR)/task_end_dep.Po -rm -f ./$(DEPDIR)/task_end_dep_add.Po -rm -f ./$(DEPDIR)/task_insert_color.Po -rm -f ./$(DEPDIR)/topology.Po -rm -f ./$(DEPDIR)/two_cpu_contexts.Po -rm -f ./$(DEPDIR)/variable.Po -rm -f ./$(DEPDIR)/variable_data_interface.Po -rm -f ./$(DEPDIR)/variable_kernels_cpu.Po -rm -f ./$(DEPDIR)/variable_kernels_opencl.Po -rm -f ./$(DEPDIR)/vector_data_interface.Po -rm -f ./$(DEPDIR)/vector_scal.Po -rm -f ./$(DEPDIR)/vector_scal_c.Po -rm -f ./$(DEPDIR)/vector_scal_cpu.Po -rm -f ./$(DEPDIR)/vector_scal_opencl.Po -rm -f ./$(DEPDIR)/vector_scal_spmd.Po -rm -f ./$(DEPDIR)/void_data_interface.Po -rm -f ./$(DEPDIR)/worker_list_example.Po -rm -f ./$(DEPDIR)/worker_tree_example.Po -rm -f ./$(DEPDIR)/yuv_downscaler.Po -rm -f ./$(DEPDIR)/zlu.Po -rm -f ./$(DEPDIR)/zlu_implicit.Po -rm -f ./$(DEPDIR)/zlu_implicit_pivot.Po -rm -f ./$(DEPDIR)/zlu_kernels.Po -rm -f ./$(DEPDIR)/zlu_pivot.Po -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-exec install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles 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-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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ @$(MKDIR_P) `dirname $@` @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) @STARPU_HAVE_ICC_TRUE@.icc.o: @STARPU_HAVE_ICC_TRUE@ $(V_icc) $(ICC) -x c $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(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.3.9+dfsg/examples/README.txt000066400000000000000000000055761413463044200173130ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/api/000077500000000000000000000000001413463044200163515ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/api/bcsr_data_interface.c000066400000000000000000000030111413463044200224520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the BCSR data // interface only uses StarPU's public API #define starpu_interface_bcsr_ops my_starpu_interface_bcsr_ops #define starpu_bcsr_data_register my_starpu_bcsr_data_register #define starpu_bcsr_get_nnz my_starpu_bcsr_get_nnz #define starpu_bcsr_get_nrow my_starpu_bcsr_get_nrow #define starpu_bcsr_get_firstentry my_starpu_bcsr_get_firstentry #define starpu_bcsr_get_r my_starpu_bcsr_get_r #define starpu_bcsr_get_c my_starpu_bcsr_get_c #define starpu_bcsr_get_elemsize my_starpu_bcsr_get_elemsize #define starpu_bcsr_get_local_nzval my_starpu_bcsr_get_local_nzval #define starpu_bcsr_get_local_colind my_starpu_bcsr_get_local_colind #define starpu_bcsr_get_local_rowptr my_starpu_bcsr_get_local_rowptr #include "../../src/datawizard/interfaces/bcsr_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/block_data_interface.c000066400000000000000000000027301413463044200226220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the block data // interface only uses StarPU's public API #define starpu_interface_block_ops my_starpu_interface_block_ops #define starpu_block_data_register my_starpu_block_data_register #define starpu_block_ptr_register my_starpu_block_ptr_register #define starpu_block_get_nx my_starpu_block_get_nx #define starpu_block_get_ny my_starpu_block_get_ny #define starpu_block_get_nz my_starpu_block_get_nz #define starpu_block_get_local_ldy my_starpu_block_get_local_ldy #define starpu_block_get_local_ldz my_starpu_block_get_local_ldz #define starpu_block_get_local_ptr my_starpu_block_get_local_ptr #define starpu_block_get_elemsize my_starpu_block_get_elemsize #include "../../src/datawizard/interfaces/block_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/coo_data_interface.c000066400000000000000000000017621413463044200223140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the COO data // interface only uses StarPU's public API #define starpu_interface_coo_ops my_starpu_interface_coo_ops #define starpu_coo_data_register my_starpu_coo_data_register #include "../../src/datawizard/interfaces/coo_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/csr_data_interface.c000066400000000000000000000026271413463044200223240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the CSR data // interface only uses StarPU's public API #define starpu_interface_csr_ops my_starpu_interface_csr_ops #define starpu_csr_data_register my_starpu_csr_data_register #define starpu_csr_get_nnz my_starpu_csr_get_nnz #define starpu_csr_get_nrow my_starpu_csr_get_nrow #define starpu_csr_get_firstentry my_starpu_csr_get_firstentry #define starpu_csr_get_elemsize my_starpu_csr_get_elemsize #define starpu_csr_get_local_nzval my_starpu_csr_get_local_nzval #define starpu_csr_get_local_colind my_starpu_csr_get_local_colind #define starpu_csr_get_local_rowptr my_starpu_csr_get_local_rowptr #include "../../src/datawizard/interfaces/csr_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/matrix_data_interface.c000066400000000000000000000030231413463044200230300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the matrix data // interface only uses StarPU's public API #define starpu_interface_matrix_ops my_starpu_interface_matrix_ops #define starpu_matrix_data_register my_starpu_matrix_data_register #define starpu_matrix_data_register_allocsize my_starpu_matrix_data_register_allocsize #define starpu_matrix_ptr_register my_starpu_matrix_data_ptr_register #define starpu_matrix_get_nx my_starpu_matrix_get_nx #define starpu_matrix_get_ny my_starpu_matrix_get_ny #define starpu_matrix_get_local_ld my_starpu_matrix_get_local_ld #define starpu_matrix_get_local_ptr my_starpu_matrix_get_local_ptr #define starpu_matrix_get_elemsize my_starpu_matrix_get_elemsize #define starpu_matrix_get_allocsize my_starpu_matrix_get_allocsize #include "../../src/datawizard/interfaces/matrix_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/multiformat_data_interface.c000066400000000000000000000020421413463044200240670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the multiformat data // interface only uses StarPU's public API #define starpu_interface_multiformat_ops my_starpu_interface_multiformat_ops #define starpu_multiformat_data_register my_starpu_multiformat_data_register #include "../../src/datawizard/interfaces/multiformat_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/variable_data_interface.c000066400000000000000000000023411413463044200233130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the variable data // interface only uses StarPU's public API #define starpu_interface_variable_ops my_starpu_interface_variable_ops #define starpu_variable_data_register my_starpu_variable_data_register #define starpu_variable_ptr_register my_starpu_variable_ptr_register #define starpu_variable_get_local_ptr my_starpu_variable_get_local_ptr #define starpu_variable_get_elemsize my_starpu_variable_get_elemsize #include "../../src/datawizard/interfaces/variable_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/vector_data_interface.c000066400000000000000000000026351413463044200230360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the vector data // interface only uses StarPU's public API #define starpu_interface_vector_ops my_starpu_interface_vector_ops #define starpu_vector_data_register my_starpu_vector_data_register #define starpu_vector_data_register_allocsize my_starpu_vector_data_register_allocsize #define starpu_vector_ptr_register my_starpu_vector_data_ptr_register #define starpu_vector_get_nx my_starpu_vector_get_nx #define starpu_vector_get_local_ptr my_starpu_vector_get_local_ptr #define starpu_vector_get_elemsize my_starpu_vector_get_elemsize #define starpu_vector_get_allocsize my_starpu_vector_get_allocsize #include "../../src/datawizard/interfaces/vector_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/api/void_data_interface.c000066400000000000000000000017701413463044200224740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that the implementation of the void data // interface only uses StarPU's public API #define starpu_interface_void_ops my_starpu_interface_void_ops #define starpu_void_data_register my_starpu_void_data_register #include "../../src/datawizard/interfaces/void_interface.c" int main() { return 0; } starpu-1.3.9+dfsg/examples/axpy/000077500000000000000000000000001413463044200165615ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/axpy/axpy.c000066400000000000000000000135621413463044200177150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], 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[], 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(void) { 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.3.9+dfsg/examples/axpy/axpy.h000066400000000000000000000014471413463044200177210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/axpy/axpy_opencl.c000066400000000000000000000047661413463044200212630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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]); unsigned x_offset = STARPU_VECTOR_GET_OFFSET(buffers[0]); cl_mem y = (cl_mem) STARPU_VECTOR_GET_DEV_HANDLE(buffers[1]); unsigned y_offset = STARPU_VECTOR_GET_OFFSET(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(x_offset), &x_offset); err|= clSetKernelArg(kernel, 2, sizeof(y), &y); err|= clSetKernelArg(kernel, 3, sizeof(y_offset), &y_offset); err|= clSetKernelArg(kernel, 4, sizeof(n), &n); err|= clSetKernelArg(kernel, 5, 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/axpy/axpy_opencl_kernel.cl000066400000000000000000000021101413463044200227540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, unsigned x_offset, __global TYPE *y, unsigned y_offset, unsigned nx, TYPE alpha) { const int i = get_global_id(0); x = (__global char*) x + x_offset; y = (__global char*) y + y_offset; if (i < nx) y[i] = alpha * x[i] + y[i]; } starpu-1.3.9+dfsg/examples/basic_examples/000077500000000000000000000000001413463044200205575ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/basic_examples/block.c000066400000000000000000000075471413463044200220320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/examples/basic_examples/block_opencl.c000066400000000000000000000047741413463044200233710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/basic_examples/block_opencl_kernel.cl000066400000000000000000000015741413463044200251000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/dynamic_handles.c000066400000000000000000000103451413463044200240500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) { (void)buffers; struct params *params = (struct params *) cl_arg; FPRINTF(stdout, "Hello world (params = {%i, %f} )\n", params->i, params->f); } int main(void) { 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.3.9+dfsg/examples/basic_examples/mult.c000066400000000000000000000305611413463044200217110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *arg) { (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(void) { 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.3.9+dfsg/examples/basic_examples/multiformat.c000066400000000000000000000157031413463044200232740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; (void)args; 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; struct starpu_conf conf; starpu_conf_init(&conf); /* this example doesn't support MPI Master-Slave */ conf.nmpi_ms = 0; ret = starpu_init(&conf); 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"); ret = starpu_opencl_unload_opencl(&opencl_conversion_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #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.3.9+dfsg/examples/basic_examples/multiformat_conversion_codelets.c000066400000000000000000000044231413463044200274200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (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) { (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.3.9+dfsg/examples/basic_examples/multiformat_conversion_codelets_cuda.cu000066400000000000000000000031231413463044200305750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/basic_examples/multiformat_conversion_codelets_opencl.c000066400000000000000000000046711413463044200307650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/basic_examples/multiformat_conversion_codelets_opencl_kernel.cl000066400000000000000000000017041413463044200324730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/basic_examples/multiformat_cuda.cu000066400000000000000000000033261413463044200244530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/examples/basic_examples/multiformat_opencl.c000066400000000000000000000045041413463044200246310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/basic_examples/multiformat_opencl_kernel.cl000066400000000000000000000015721413463044200263470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/basic_examples/multiformat_types.h000066400000000000000000000015601413463044200245210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/task_insert_color.c000066400000000000000000000047011413463044200244510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 func(void *descr[], void *_args) { int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); (void)_args; *x *= 2; } struct starpu_codelet mycodelet = { .modes = { STARPU_RW }, .cpu_funcs = {func}, .cpu_funcs_name = {"func"}, .nbuffers = 1 }; struct starpu_codelet mycodelet_color = { .modes = { STARPU_RW }, .cpu_funcs = {func}, .cpu_funcs_name = {"func"}, .nbuffers = 1, .color = 0x0000FF, }; int main(void) { unsigned i; int value=42; starpu_data_handle_t handle; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&value, sizeof(value)); // In the trace file, the following task should be green (executed on CPU) ret = starpu_task_insert(&mycodelet, STARPU_RW, handle, STARPU_NAME, "mytask", 0); if (STARPU_UNLIKELY(ret == -ENODEV)) { starpu_data_unregister(handle); goto enodev; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); // In the trace file, the following task will be red as specified by STARPU_TASK_COLOR ret = starpu_task_insert(&mycodelet, STARPU_RW, handle, STARPU_NAME, "mytask", STARPU_TASK_COLOR, 0xFF0000, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); // In the trace file, the following task will be blue as specified by the field color of mycodelet_color ret = starpu_task_insert(&mycodelet_color, STARPU_RW, handle, STARPU_NAME, "mytask", 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_shutdown(); return 0; enodev: return 77; } starpu-1.3.9+dfsg/examples/basic_examples/topology.c000066400000000000000000000021371413463044200226020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) int main(void) { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_worker_display_names(stdout, STARPU_CPU_WORKER); starpu_topology_print(stdout); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/basic_examples/variable.c000066400000000000000000000057401413463044200225160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) #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[], 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_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.3.9+dfsg/examples/basic_examples/variable_kernels.cu000066400000000000000000000021551413463044200244230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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[], void *_args) { float *val = (float *)STARPU_VARIABLE_GET_PTR(descr[0]); cuda_variable<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/examples/basic_examples/variable_kernels_cpu.c000066400000000000000000000015171413463044200251060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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[], void *_args) { (void)_args; float *val = (float *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1.0f; } starpu-1.3.9+dfsg/examples/basic_examples/variable_kernels_opencl.c000066400000000000000000000031121413463044200255700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; (void)_args; 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.3.9+dfsg/examples/basic_examples/variable_kernels_opencl_kernel.cl000066400000000000000000000014601413463044200273100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/vector_scal.c000066400000000000000000000146541413463044200232410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(void) { /* 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_memory_pin(vector, sizeof(vector)); 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); starpu_memory_unpin(vector, sizeof(vector)); #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.3.9+dfsg/examples/basic_examples/vector_scal_c.c000066400000000000000000000074301413463044200235350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/vector_scal_cpu.c000066400000000000000000000015641413463044200241040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/vector_scal_cpu_icc.icc000066400000000000000000000016341413463044200252340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/vector_scal_cpu_template.h000066400000000000000000000122221413463044200257750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/basic_examples/vector_scal_cuda.cu000066400000000000000000000031711413463044200244120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/basic_examples/vector_scal_fortran.F000066400000000000000000000021661413463044200247320ustar00rootroot00000000000000C StarPU --- Runtime system for heterogeneous multicore architectures. C C Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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.3.9+dfsg/examples/basic_examples/vector_scal_opencl.c000066400000000000000000000043621413463044200245740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/basic_examples/vector_scal_opencl_kernel.cl000066400000000000000000000015641413463044200263110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/binary/000077500000000000000000000000001413463044200170645ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/binary/binary.c000066400000000000000000000114701413463044200205170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], 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 ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #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(void) { int ret = 0; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 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"); if (starpu_opencl_worker_get_count() == 0) { FPRINTF(stderr, "This application requires an OpenCL worker.\n"); starpu_shutdown(); return 77; } 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.3.9+dfsg/examples/callback/000077500000000000000000000000001413463044200173345ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/callback/callback.c000066400000000000000000000043131413463044200212350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *_args) { (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; (void)callback_arg; 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(void) { 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.3.9+dfsg/examples/callback/prologue.c000066400000000000000000000056221413463044200213410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *_args) { (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(void) { 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_NFREE, &x, STARPU_PROLOGUE_CALLBACK_POP, pop_prologue_callback_func, STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE, 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.3.9+dfsg/examples/cg/000077500000000000000000000000001413463044200161715ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/cg/cg.c000066400000000000000000000252701413463044200167340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 = 5; #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]); if (i_max <= 0) { FPRINTF(stderr, "the number of iterations must be positive, not %d\n", i_max); exit(EXIT_FAILURE); } 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; 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.3.9+dfsg/examples/cg/cg.h000066400000000000000000000043071413463044200167370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/cg/cg_kernels.c000066400000000000000000000416361413463044200204630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 gp1 = 1.0; static const TYPE gm1 = -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) { (void)task; (void)nimpl; enum starpu_worker_archtype type = starpu_worker_get_type(workerid); if (type == STARPU_CPU_WORKER || type == STARPU_OPENCL_WORKER || type == STARPU_MIC_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) { (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, &gp1, 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) { (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) { (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, &gp1, 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) { (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) { (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) { (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) { (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) { (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) { (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) { (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.3.9+dfsg/examples/cholesky/000077500000000000000000000000001413463044200174215ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/cholesky/cholesky.h000066400000000000000000000231461413463044200214210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #ifdef STARPU_HAVE_VALGRIND_H #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 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_p/nblocks_p) #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_p; static unsigned nblocks_p; static unsigned nbigblocks_p; 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_p) size_p = 320*2*power_cbrt; if (!nblocks_p) nblocks_p = 2*power_cbrt; if (!nbigblocks_p) nbigblocks_p = power_cbrt; #else if (!size_p) size_p = 960*8*power_cbrt; if (!nblocks_p) nblocks_p = 8*power_cbrt; if (!nbigblocks_p) nbigblocks_p = 4*power_cbrt; #endif } static unsigned pinned_p = 1; static unsigned noprio_p = 0; static unsigned check_p = 0; static unsigned bound_p = 0; static unsigned bound_deps_p = 0; static unsigned bound_lp_p = 0; static unsigned bound_mps_p = 0; static unsigned with_ctxs_p = 0; static unsigned with_noctxs_p = 0; static unsigned chole1_p = 0; static unsigned chole2_p = 0; extern struct starpu_perfmodel chol_model_11; extern struct starpu_perfmodel chol_model_21; extern struct starpu_perfmodel chol_model_22; extern struct starpu_codelet cl11; extern struct starpu_codelet cl21; extern struct starpu_codelet cl22; extern struct starpu_codelet cl11_gpu; extern struct starpu_codelet cl21_gpu; extern struct starpu_codelet cl22_gpu; extern struct starpu_codelet cl11_cpu; extern struct starpu_codelet cl21_cpu; extern struct starpu_codelet cl22_cpu; 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 parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-with_ctxs") == 0) { with_ctxs_p = 1; break; } else if (strcmp(argv[i], "-with_noctxs") == 0) { with_noctxs_p = 1; break; } else if (strcmp(argv[i], "-chole1") == 0) { chole1_p = 1; break; } else if (strcmp(argv[i], "-chole2") == 0) { chole2_p = 1; break; } else if (strcmp(argv[i], "-size") == 0) { char *argptr; size_p = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks_p = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-nbigblocks") == 0) { char *argptr; nbigblocks_p = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-no-pin") == 0) { pinned_p = 0; } else if (strcmp(argv[i], "-no-prio") == 0) { noprio_p = 1; } else if (strcmp(argv[i], "-commute") == 0) { cl22.modes[2] |= STARPU_COMMUTE; } else if (strcmp(argv[i], "-bound") == 0) { bound_p = 1; } else if (strcmp(argv[i], "-bound-lp") == 0) { bound_lp_p = 1; } else if (strcmp(argv[i], "-bound-mps") == 0) { bound_mps_p = 1; } else if (strcmp(argv[i], "-bound-deps") == 0) { bound_deps_p = 1; } else if (strcmp(argv[i], "-check") == 0) { check_p = 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_p, size_p, nblocks_p, nblocks_p); exit(0); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) size_p = 16; #endif } #endif /* __DW_CHOLESKY_H__ */ starpu-1.3.9+dfsg/examples/cholesky/cholesky.sh000077500000000000000000000042271413463044200216060ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # ROOT=${0%.sh} [ -z "$STARPU_SCHED" ] || STARPU_SCHEDS="$STARPU_SCHED" #[ -n "$STARPU_SCHEDS" ] || STARPU_SCHEDS=`$(dirname $0)/../../tools/starpu_sched_display` [ -n "$STARPU_SCHEDS" ] || STARPU_SCHEDS="dmdas modular-heft2 modular-heft modular-heft-prio modular-heteroprio dmdap dmdar dmda dmdasd prio lws" [ -n "$STARPU_HOSTNAME" ] || export STARPU_HOSTNAME=mirage unset MALLOC_PERTURB_ INCR=2 STOP=32 if [ -n "$STARPU_SIMGRID" ] then INCR=4 STOP=14 # These use the thread factory, and are thus much longer if [ -n "$STARPU_QUICK_CHECK" ] then INCR=8 STOP=10 fi if [ -n "$STARPU_LONG_CHECK" ] then INCR=4 STOP=32 fi fi ( echo -n "#" for STARPU_SCHED in $STARPU_SCHEDS ; do echo -n " $STARPU_SCHED" done echo for size in `seq 2 $INCR $STOP` ; do echo -n "$((size * 960))" for STARPU_SCHED in $STARPU_SCHEDS do export STARPU_SCHED GFLOPS=`$STARPU_LAUNCH ${ROOT}_implicit -size $((size * 960)) -nblocks $size 2> /dev/null | grep -v GFlop/s | cut -d ' ' -f 3` [ -n "$GFLOPS" ] || GFLOPS='""' echo -n " $GFLOPS" done echo done ) | tee cholesky.output [ -n "$TERMINAL" ] || TERMINAL=eps [ -n "$OUTFILE" ] || OUTFILE=cholesky.eps cat > cholesky.gp << EOF set terminal $TERMINAL set output "$OUTFILE" set key top left set xlabel "size" set ylabel "GFlop/s" plot \\ EOF N=2 COMMA="" for STARPU_SCHED in $STARPU_SCHEDS do echo "$COMMA'cholesky.output' using 1:$N with lines title '$STARPU_SCHED' \\" >> cholesky.gp N=$(($N + 1)) COMMA=", " done gnuplot cholesky.gp #gv $OUTFILE true starpu-1.3.9+dfsg/examples/cholesky/cholesky_compil.c000066400000000000000000000276201413463044200227600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 can include an * externally-compiler-generated loop nest, which allows to play with * compiler-side optimizations. */ /* Note: this is using fortran ordering, i.e. column-major ordering, i.e. * elements with consecutive row number are consecutive in memory */ #include "cholesky.h" #include "../sched_ctx_utils/sched_ctx_utils.h" #include #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) { (void)arg; cl22.type = STARPU_SPMD; } static int _cholesky(starpu_data_handle_t dataA, unsigned nblocks) { double start; double end; unsigned long nelems = starpu_matrix_get_nx(dataA); unsigned long nn = nelems/nblocks; int M = nblocks; int N = nblocks; int lambda_b = starpu_get_env_float_default("CHOLESKY_LAMBDA_B", nblocks); int lambda_o_u = starpu_get_env_float_default("CHOLESKY_LAMBDA_O_U", 0); int lambda_o_d = starpu_get_env_float_default("CHOLESKY_LAMBDA_O_D", 0); unsigned unbound_prio = STARPU_MAX_PRIO == INT_MAX && STARPU_MIN_PRIO == INT_MIN; if (bound_p || bound_lp_p || bound_mps_p) starpu_bound_start(bound_deps_p, 0); starpu_fxt_start_profiling(); start = starpu_timing_now(); #define min(x,y) (x m) { mat[m+n*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 (m = 0; m < size; m++) { for (n = 0; n < size; n++) { if (n <= m) { FPRINTF(stdout, "%2.2f\t", test_mat[m +n*size]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (m = 0; m < size; m++) { for (n = 0; n < size; n++) { if (n <= m) { float orig = (1.0f/(1.0f+m+n)) + ((m == n)?1.0f*size:0.0f); float err = fabsf(test_mat[m +n*size] - orig) / orig; if (err > 0.0001) { FPRINTF(stderr, "Error[%u, %u] --> %2.6f != %2.6f (err %2.6f)\n", m, n, test_mat[m +n*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); #endif } 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_p || with_noctxs_p || chole1_p || chole2_p) 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_p) { construct_contexts(); start_2benchs(execute_cholesky); } else if(with_noctxs_p) start_2benchs(execute_cholesky); else if(chole1_p) start_1stbench(execute_cholesky); else if(chole2_p) start_2ndbench(execute_cholesky); else execute_cholesky(size_p, nblocks_p); starpu_cublas_shutdown(); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/cholesky/cholesky_compiled.c000066400000000000000000000023061413463044200232630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 base code, just like can be read in Chameleon */ /* A source-to-source compiler can very easily produce this kind of code, with rewritten loops etc */ unsigned k, m, n; for (k = 0; k < nblocks; k++) { POTRF(A(k,k), (2*nblocks - 2*k)); for (m = k+1; m < nblocks; m++) TRSM(A(k,k), A(m,k), (2*nblocks - 2*k - m)); for (n = k+1; n < nblocks; n++) { SYRK(A(n,k), A(n, n), (2*nblocks - 2*k - n)); for (m = n+1; m < nblocks; m++) GEMM(A(m,k), A(n,k), A(m,n), (2*nblocks - 2*k - n - m)); } } starpu-1.3.9+dfsg/examples/cholesky/cholesky_grain_tag.c000066400000000000000000000270501413463044200234250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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. */ /* Note: this is using fortran ordering, i.e. column-major ordering, i.e. * elements with consecutive row number are consecutive in memory */ #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 */ if (!noprio_p) 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 m, unsigned reclevel) { int ret; struct starpu_task *task = create_task(TAG21_AUX(k, m, 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, m, k); if (!noprio_p && (m == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21_AUX(k, m, reclevel), 2, TAG11_AUX(k, reclevel), TAG22_AUX(k-1, m, k, reclevel)); } else { starpu_tag_declare_deps(TAG21_AUX(k, m, reclevel), 1, TAG11_AUX(k, reclevel)); } int nx = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_STRSM(nx, nx); 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 m, unsigned n, unsigned reclevel) { int ret; /* FPRINTF(stdout, "task 22 k,n,m = %d,%d,%d TAG = %llx\nx", k,m,n, TAG22_AUX(k,m,n)); */ struct starpu_task *task = create_task(TAG22_AUX(k, m, n, reclevel)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, n, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, m, k); task->handles[2] = starpu_data_get_sub_data(dataA, 2, m, n); if ( (n == k + 1) && (m == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22_AUX(k, m, n, reclevel), 3, TAG22_AUX(k-1, m, n, reclevel), TAG21_AUX(k, n, reclevel), TAG21_AUX(k, m, reclevel)); } else { starpu_tag_declare_deps(TAG22_AUX(k, m, n, reclevel), 2, TAG21_AUX(k, n, reclevel), TAG21_AUX(k, m, reclevel)); } int nx = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SGEMM(nx, nx, nx); 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 k, m, n; 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); /* Split into blocks of complete rows first */ struct starpu_data_filter f = { .filter_func = starpu_matrix_filter_block, .nchildren = nblocks }; /* Then split rows into tiles */ struct starpu_data_filter f2 = { /* Note: here "vertical" is for row-major, we are here using column-major. */ .filter_func = starpu_matrix_filter_vertical_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 (m = k+1; m m) { mat[m+n*size_p] = 0.0f; /* debug */ } } } float *test_mat = malloc(size_p*size_p*sizeof(float)); STARPU_ASSERT(test_mat); STARPU_SSYRK("L", "N", size_p, size_p, 1.0f, mat, size_p, 0.0f, test_mat, size_p); FPRINTF(stderr, "comparing results ...\n"); #ifdef PRINT_OUTPUT for (m = 0; m < size_p; m++) { for (n = 0; n < size_p; n++) { if (n <= m) { FPRINTF(stdout, "%2.2f\t", test_mat[m +n*size_p]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (m = 0; m < size_p; m++) { for (n = 0; n < size_p; n++) { if (n <= m) { float orig = (1.0f/(1.0f+m+n)) + ((m == n)?1.0f*size_p:0.0f); float err = fabsf(test_mat[m +n*size_p] - orig) / orig; if (err > 0.0001) { FPRINTF(stderr, "Error[%u, %u] --> %2.6f != %2.6f (err %2.6f)\n", m, n, test_mat[m +n*size_p], orig, err); assert(0); } } } } free(test_mat); } #endif shutdown_system(&mat, size_p, pinned_p); return ret; } starpu-1.3.9+dfsg/examples/cholesky/cholesky_implicit.c000066400000000000000000000233601413463044200233040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(). */ /* Note: this is using fortran ordering, i.e. column-major ordering, i.e. * elements with consecutive row number are consecutive in memory */ #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) { (void)arg; cl22.type = STARPU_SPMD; } static int _cholesky(starpu_data_handle_t dataA, unsigned nblocks) { double start; double end; unsigned k,m,n; unsigned long nx = starpu_matrix_get_nx(dataA); unsigned long nn = nx/nblocks; unsigned unbound_prio = STARPU_MAX_PRIO == INT_MAX && STARPU_MIN_PRIO == INT_MIN; if (bound_p || bound_lp_p || bound_mps_p) starpu_bound_start(bound_deps_p, 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_p ? 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 (m = k+1; m m) { mat[m+n*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 (m = 0; m < size; m++) { for (n = 0; n < size; n++) { if (n <= m) { FPRINTF(stdout, "%2.2f\t", test_mat[m +n*size]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (m = 0; m < size; m++) { for (n = 0; n < size; n++) { if (n <= m) { float orig = (1.0f/(1.0f+m+n)) + ((m == n)?1.0f*size:0.0f); float err = fabsf(test_mat[m +n*size] - orig) / orig; if (err > 0.0001) { FPRINTF(stderr, "Error[%u, %u] --> %2.6f != %2.6f (err %2.6f)\n", m, n, test_mat[m +n*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); #endif } 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_p || with_noctxs_p || chole1_p || chole2_p) 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_p) { construct_contexts(); start_2benchs(execute_cholesky); } else if(with_noctxs_p) start_2benchs(execute_cholesky); else if(chole1_p) start_1stbench(execute_cholesky); else if(chole2_p) start_2ndbench(execute_cholesky); else execute_cholesky(size_p, nblocks_p); starpu_cublas_shutdown(); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/cholesky/cholesky_kernels.c000066400000000000000000000245431413463044200231410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, void *_args) { (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, void *_args) { /* printf("21\n"); */ float *sub11; float *sub21; (void)_args; 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, void *_args) { /* printf("11\n"); */ float *sub11; (void)_args; 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); #else starpu_cublas_set_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 = cudaDeviceSynchronize(); #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_perfmodel chol_model_11; struct starpu_perfmodel chol_model_21; struct starpu_perfmodel chol_model_22; 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, .color = 0xffff00, }; 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, .color = 0x8080ff, }; 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, .color = 0x00ff00, }; struct starpu_codelet cl11_gpu = { #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, .color = 0xffff00, }; struct starpu_codelet cl21_gpu = { #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, .color = 0x8080ff, }; struct starpu_codelet cl22_gpu = { #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, .color = 0x00ff00, }; struct starpu_codelet cl11_cpu = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u11}, .cpu_funcs_name = {"chol_cpu_codelet_update_u11"}, .nbuffers = 1, .modes = { STARPU_RW }, .model = &chol_model_11, .color = 0xffff00, }; struct starpu_codelet cl21_cpu = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u21}, .cpu_funcs_name = {"chol_cpu_codelet_update_u21"}, .nbuffers = 2, .modes = { STARPU_R, STARPU_RW }, .model = &chol_model_21, .color = 0x8080ff, }; struct starpu_codelet cl22_cpu = { .type = STARPU_SEQ, .max_parallelism = INT_MAX, .cpu_funcs = {chol_cpu_codelet_update_u22}, .cpu_funcs_name = {"chol_cpu_codelet_update_u22"}, .nbuffers = 3, .modes = { STARPU_R, STARPU_R, STARPU_RW }, .model = &chol_model_22, .color = 0x00ff00, }; starpu-1.3.9+dfsg/examples/cholesky/cholesky_models.c000066400000000000000000000106131413463044200227520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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.3.9+dfsg/examples/cholesky/cholesky_tag.c000066400000000000000000000244071413463044200222500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 */ /* Note: this is using fortran ordering, i.e. column-major ordering, i.e. * elements with consecutive row number are consecutive in memory */ #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_p) 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(starpu_data_handle_t dataA, unsigned k, unsigned m) { int ret; struct starpu_task *task = create_task(TAG21(k, m)); 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, m, k); if (!noprio_p && (m == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(k, m), 2, TAG11(k), TAG22(k-1, m, k)); } else { starpu_tag_declare_deps(TAG21(k, m), 1, TAG11(k)); } int nx = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_STRSM(nx, nx); 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 m, unsigned n) { int ret; /* FPRINTF(stdout, "task 22 k,n,m = %d,%d,%d TAG = %llx\n", k,m,n, TAG22(k,m,n)); */ struct starpu_task *task = create_task(TAG22(k, m, n)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = starpu_data_get_sub_data(dataA, 2, n, k); task->handles[1] = starpu_data_get_sub_data(dataA, 2, m, k); task->handles[2] = starpu_data_get_sub_data(dataA, 2, m, n); if (!noprio_p && (n == k + 1) && (m == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, m, n), 3, TAG22(k-1, m, n), TAG21(k, n), TAG21(k, m)); } else { starpu_tag_declare_deps(TAG22(k, m, n), 2, TAG21(k, n), TAG21(k, m)); } int nx = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SGEMM(nx, nx, nx); 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(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 k, m, n; 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 { ret = starpu_task_submit(task); if (ret == -ENODEV) { starpu_data_unpartition(dataA, STARPU_MAIN_RAM); return 77; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (m = k+1; m m) { mat[m+n*size_p] = 0.0f; /* debug */ } } } float *test_mat = malloc(size_p*size_p*sizeof(float)); STARPU_ASSERT(test_mat); STARPU_SSYRK("L", "N", size_p, size_p, 1.0f, mat, size_p, 0.0f, test_mat, size_p); FPRINTF(stderr, "comparing results ...\n"); #ifdef PRINT_OUTPUT for (m = 0; m < size_p; m++) { for (n = 0; n < size_p; n++) { if (n <= m) { FPRINTF(stdout, "%2.2f\t", test_mat[m +n*size_p]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (m = 0; m < size_p; m++) { for (n = 0; n < size_p; n++) { if (n <= m) { float orig = (1.0f/(1.0f+m+n)) + ((m == n)?1.0f*size_p:0.0f); float err = fabsf(test_mat[m +n*size_p] - orig) / orig; if (err > 0.0001) { FPRINTF(stderr, "Error[%u, %u] --> %2.6f != %2.6f (err %2.6f)\n", m, n, test_mat[m +n*size_p], orig, err); assert(0); } } } } free(test_mat); } #endif shutdown_system(&mat, size_p, pinned_p); return ret; } starpu-1.3.9+dfsg/examples/cholesky/cholesky_tile_tag.c000066400000000000000000000167541413463044200232730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 directly registers matrix tiles instead of using partitioning. */ /* Note: this is using fortran ordering, i.e. column-major ordering, i.e. * elements with consecutive row number are consecutive in memory */ #include "cholesky.h" #if defined(STARPU_USE_CUDA) && defined(STARPU_HAVE_MAGMA) #include "magma.h" #endif /* A [ m ] [ n ] */ float *A[NMAXBLOCKS][NMAXBLOCKS]; starpu_data_handle_t A_state[NMAXBLOCKS][NMAXBLOCKS]; /* * 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(unsigned k, unsigned nblocks) { (void)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 m) { int ret; struct starpu_task *task = create_task(TAG21(m, k)); task->cl = &cl21; /* which sub-data is manipulated ? */ task->handles[0] = A_state[k][k]; task->handles[1] = A_state[m][k]; if (m == k+1) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG21(m, k), 2, TAG11(k), TAG22(k-1, m, k)); } else { starpu_tag_declare_deps(TAG21(m, k), 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 m, unsigned n) { int ret; /* FPRINTF(stdout, "task 22 k,n,m = %d,%d,%d TAG = %llx\n", k,m,n, TAG22(k,m,n)); */ struct starpu_task *task = create_task(TAG22(k, m, n)); task->cl = &cl22; /* which sub-data is manipulated ? */ task->handles[0] = A_state[n][k]; task->handles[1] = A_state[m][k]; task->handles[2] = A_state[m][n]; if (!noprio_p && (n == k + 1) && (m == k +1) ) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ if (k > 0) { starpu_tag_declare_deps(TAG22(k, m, n), 3, TAG22(k-1, m, n), TAG21(n, k), TAG21(m, k)); } else { starpu_tag_declare_deps(TAG22(k, m, n), 2, TAG21(n, k), TAG21(m, k)); } int nx = starpu_matrix_get_nx(task->handles[0]); task->flops = FLOPS_SGEMM(nx, nx, nx); 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 k, m, n; for (k = 0; k < nblocks_p; k++) { starpu_iteration_push(k); struct starpu_task *task = create_task_11(k, nblocks_p); /* 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 (m = k+1; m #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_OPENBLAS) || defined(STARPU_SYSTEM_BLAS) || defined(STARPU_MKL) || defined(STARPU_ARMPL) 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); } #if defined(STARPU_MKL) || defined(STARPU_ARMPL) 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.3.9+dfsg/examples/common/blas.h000066400000000000000000000231661413463044200201720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); #if defined(STARPU_MKL) || defined(STARPU_ARMPL) 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_OPENBLAS) || defined(STARPU_SYSTEM_BLAS) || defined(STARPU_MKL) || defined(STARPU_ARMPL) #ifdef _STARPU_F2C_COMPATIBILITY /* for compatibility with F2C, FLOATRET may not be a float but a double in GOTOBLAS */ /* Don't know how to detect this automatically */ #define _STARPU_FLOATRET double #else #define _STARPU_FLOATRET float #endif 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 _STARPU_FLOATRET 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); extern _STARPU_FLOATRET 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); #if (defined STARPU_MKL) || (defined STARPU_ARMPL) 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.3.9+dfsg/examples/common/blas_model.c000066400000000000000000000024371413463044200213430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/common/blas_model.h000066400000000000000000000031471413463044200213470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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" #elif defined(STARPU_OPENBLAS) .symbol = "sgemm_openblas" #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" #elif defined(STARPU_OPENBLAS) .symbol = "dgemm_openblas" #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.3.9+dfsg/examples/cpp/000077500000000000000000000000001413463044200163625ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/cpp/add_vectors.cpp000066400000000000000000000113441413463044200213660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 * add two std::vector without copying them (0 copy). */ #include #include #ifdef PRINT_OUTPUT #include #endif #include void cpu_kernel_add_vectors(void *buffers[], void *cl_arg) { // get the current task starpu_task* task = starpu_task_get_current(); // get the user data (pointers to the vec_A, vec_B, vec_C std::vector) void* u_data0 = starpu_data_get_user_data(task->handles[0]); assert(u_data0); void* u_data1 = starpu_data_get_user_data(task->handles[1]); assert(u_data1); void* u_data2 = starpu_data_get_user_data(task->handles[2]); assert(u_data2); // cast void* in std::vector* std::vector* vec_A = static_cast*>(u_data0); std::vector* vec_B = static_cast*>(u_data1); std::vector* vec_C = static_cast*>(u_data2); // all the std::vector have to have the same size assert(vec_A->size() == vec_B->size() && vec_B->size() == vec_C->size()); // performs the vector addition (vec_C[] = vec_A[] + vec_B[]) for (size_t i = 0; i < vec_C->size(); i++) (*vec_C)[i] = (*vec_A)[i] + (*vec_B)[i]; } #define VEC_SIZE 1024 int main(int argc, char **argv) { std::vector vec_A(VEC_SIZE, 2); // all the vector is initialized to 2 std::vector vec_B(VEC_SIZE, 3); // all the vector is initialized to 3 std::vector vec_C(VEC_SIZE, 0); // all the vector is initialized to 0 struct starpu_conf conf; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; // initialize StarPU with default configuration int ret = starpu_init(&conf); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* StarPU can overwrite object if NUMA transfers are made */ if (starpu_memory_nodes_get_numa_count() > 1) { starpu_shutdown(); return 77; } // StarPU data registering starpu_data_handle_t spu_vec_A; starpu_data_handle_t spu_vec_B; starpu_data_handle_t spu_vec_C; // give the data of the vector to StarPU (C array) starpu_vector_data_register(&spu_vec_A, STARPU_MAIN_RAM, (uintptr_t)&vec_A[0], vec_A.size(), sizeof(char)); starpu_vector_data_register(&spu_vec_B, STARPU_MAIN_RAM, (uintptr_t)&vec_B[0], vec_B.size(), sizeof(char)); starpu_vector_data_register(&spu_vec_C, STARPU_MAIN_RAM, (uintptr_t)&vec_C[0], vec_C.size(), sizeof(char)); // pass the pointer to the C++ vector object to StarPU starpu_data_set_user_data(spu_vec_A, (void*)&vec_A); starpu_data_set_user_data(spu_vec_B, (void*)&vec_B); starpu_data_set_user_data(spu_vec_C, (void*)&vec_C); // create the StarPU codelet starpu_codelet cl; starpu_codelet_init(&cl); cl.cpu_funcs [0] = cpu_kernel_add_vectors; cl.cpu_funcs_name[0] = "cpu_kernel_add_vectors"; cl.nbuffers = 3; cl.modes [0] = STARPU_R; cl.modes [1] = STARPU_R; cl.modes [2] = STARPU_W; cl.name = "add_vectors"; // submit a new StarPU task to execute ret = starpu_task_insert(&cl, STARPU_R, spu_vec_A, STARPU_R, spu_vec_B, STARPU_W, spu_vec_C, 0); if (ret == -ENODEV) { // StarPU data unregistering starpu_data_unregister(spu_vec_C); starpu_data_unregister(spu_vec_B); starpu_data_unregister(spu_vec_A); // terminate StarPU, no task can be submitted after starpu_shutdown(); return 77; } STARPU_CHECK_RETURN_VALUE(ret, "task_submit::add_vectors"); // wait the task starpu_task_wait_for_all(); // StarPU data unregistering starpu_data_unregister(spu_vec_C); starpu_data_unregister(spu_vec_B); starpu_data_unregister(spu_vec_A); // terminate StarPU, no task can be submitted after starpu_shutdown(); // check results bool fail = false; int i = 0; while (!fail && i < VEC_SIZE) fail = vec_C[i++] != 5; if (fail) { #ifdef PRINT_OUTPUT std::cout << "Example failed..." << std::endl; #endif return EXIT_FAILURE; } else { #ifdef PRINT_OUTPUT std::cout << "Example successfully passed!" << std::endl; #endif return EXIT_SUCCESS; } } starpu-1.3.9+dfsg/examples/cpp/add_vectors_cpp11.cpp000066400000000000000000000113431413463044200223710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 * add two std::vector without copying them (0 copy). */ #include #include #ifdef PRINT_OUTPUT #include #endif #include #if !defined(STARPU_HAVE_CXX11) int main(int argc, char **argv) { return 77; } #else void cpu_kernel_add_vectors(void *buffers[], void *cl_arg) { // get the current task auto task = starpu_task_get_current(); // get the user data (pointers to the vec_A, vec_B, vec_C std::vector) auto u_data0 = starpu_data_get_user_data(task->handles[0]); assert(u_data0); auto u_data1 = starpu_data_get_user_data(task->handles[1]); assert(u_data1); auto u_data2 = starpu_data_get_user_data(task->handles[2]); assert(u_data2); // cast void* in std::vector* auto vec_A = static_cast*>(u_data0); auto vec_B = static_cast*>(u_data1); auto vec_C = static_cast*>(u_data2); // all the std::vector have to have the same size assert(vec_A->size() == vec_B->size() && vec_B->size() == vec_C->size()); // performs the vector addition (vec_C[] = vec_A[] + vec_B[]) for (size_t i = 0; i < vec_C->size(); i++) (*vec_C)[i] = (*vec_A)[i] + (*vec_B)[i]; } int main(int argc, char **argv) { constexpr int vec_size = 1024; std::vector vec_A(vec_size, 2); // all the vector is initialized to 2 std::vector vec_B(vec_size, 3); // all the vector is initialized to 3 std::vector vec_C(vec_size, 0); // all the vector is initialized to 0 struct starpu_conf conf; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; // initialize StarPU with default configuration auto ret = starpu_init(&conf); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_memory_nodes_get_numa_count() > 1) { starpu_shutdown(); return 77; } // StarPU data registering starpu_data_handle_t spu_vec_A; starpu_data_handle_t spu_vec_B; starpu_data_handle_t spu_vec_C; // give the data of the vector to StarPU (C array) starpu_vector_data_register(&spu_vec_A, STARPU_MAIN_RAM, (uintptr_t)vec_A.data(), vec_A.size(), sizeof(char)); starpu_vector_data_register(&spu_vec_B, STARPU_MAIN_RAM, (uintptr_t)vec_B.data(), vec_B.size(), sizeof(char)); starpu_vector_data_register(&spu_vec_C, STARPU_MAIN_RAM, (uintptr_t)vec_C.data(), vec_C.size(), sizeof(char)); // pass the pointer to the C++ vector object to StarPU starpu_data_set_user_data(spu_vec_A, (void*)&vec_A); starpu_data_set_user_data(spu_vec_B, (void*)&vec_B); starpu_data_set_user_data(spu_vec_C, (void*)&vec_C); // create the StarPU codelet starpu_codelet cl; starpu_codelet_init(&cl); cl.cpu_funcs [0] = cpu_kernel_add_vectors; cl.cpu_funcs_name[0] = "cpu_kernel_add_vectors"; cl.nbuffers = 3; cl.modes [0] = STARPU_R; cl.modes [1] = STARPU_R; cl.modes [2] = STARPU_W; cl.name = "add_vectors"; // submit a new StarPU task to execute ret = starpu_task_insert(&cl, STARPU_R, spu_vec_A, STARPU_R, spu_vec_B, STARPU_W, spu_vec_C, 0); if (ret == -ENODEV) { // StarPU data unregistering starpu_data_unregister(spu_vec_C); starpu_data_unregister(spu_vec_B); starpu_data_unregister(spu_vec_A); // terminate StarPU, no task can be submitted after starpu_shutdown(); return 77; } STARPU_CHECK_RETURN_VALUE(ret, "task_submit::add_vectors"); // wait the task starpu_task_wait_for_all(); // StarPU data unregistering starpu_data_unregister(spu_vec_C); starpu_data_unregister(spu_vec_B); starpu_data_unregister(spu_vec_A); // terminate StarPU, no task can be submitted after starpu_shutdown(); // check results auto fail = false; auto i = 0; while (!fail && i < vec_size) fail = vec_C[i++] != 5; if (fail) { #ifdef PRINT_OUTPUT std::cout << "Example failed..." << std::endl; #endif return EXIT_FAILURE; } else { #ifdef PRINT_OUTPUT std::cout << "Example successfully passed!" << std::endl; #endif return EXIT_SUCCESS; } } #endif starpu-1.3.9+dfsg/examples/cpp/add_vectors_interface.cpp000066400000000000000000000433351413463044200234130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 STL and starpu. We here just * add two std::vector with duplicating vectors. StarPU achieves data * transfers between objects. */ #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNU_MINOR < 9)) int main(int argc, char **argv) { return 77; } #else #include #include #ifdef PRINT_OUTPUT #include #endif #include #define MY_TYPE char, my_allocator /* create an allocator to put data on the correct NUMA node */ template class my_allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef T value_type; my_allocator() { this->node = STARPU_MAIN_RAM; } my_allocator(const my_allocator& a) { node = a.get_node(); } explicit my_allocator(const unsigned node) { this->node = node; } pointer allocate(size_type n, const void * = 0) { T* t = (T*) starpu_malloc_on_node(this->node, n * sizeof(T)); return t; } void deallocate(void* p, size_type n) { if (p) { starpu_free_on_node(this->node, (uintptr_t) p, n * sizeof(T)); } } unsigned get_node() const { return node; } pointer address(reference x) const { return &x; } const_pointer address(const_reference x) const { return &x; } my_allocator& operator=(const my_allocator&ref) { node = ref.node; return *this; } void construct(pointer p, const T& val) { new ((T*) p) T(val); } void destroy(pointer p) { p->~T(); } size_type max_size() const { return size_type(-1); } template struct rebind { typedef my_allocator other; }; template explicit my_allocator(const my_allocator&ref) { node = ref.node; } template my_allocator& operator=(const my_allocator&ref) { node = ref.node; return *this; } private: unsigned node; }; /* * Create a new interface to catch C++ vector and make appropriate data transfers */ struct vector_cpp_interface { enum starpu_data_interface_id id; uintptr_t ptr; uintptr_t dev_handle; size_t offset; uint32_t nx; size_t elemsize; std::vector* vec; uint32_t slice_base; }; #define VECTOR_CPP_GET_VEC(interface) ({ (((struct vector_cpp_interface *)(interface))->vec); }) static int vector_interface_copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); #if __cplusplus >= 201103L static const struct starpu_data_copy_methods vector_cpp_copy_data_methods_s = { .can_copy = NULL, .ram_to_ram = NULL, .ram_to_cuda = NULL, .ram_to_opencl = NULL, .ram_to_mic = NULL, .cuda_to_ram = NULL, .cuda_to_cuda = NULL, .cuda_to_opencl = NULL, .opencl_to_ram = NULL, .opencl_to_cuda = NULL, .opencl_to_opencl = NULL, .mic_to_ram = NULL, .ram_to_mpi_ms = NULL, .mpi_ms_to_ram = NULL, .mpi_ms_to_mpi_ms = NULL, .ram_to_cuda_async = NULL, .cuda_to_ram_async = NULL, .cuda_to_cuda_async = NULL, .ram_to_opencl_async = NULL, .opencl_to_ram_async = NULL, .opencl_to_opencl_async = NULL, .ram_to_mpi_ms_async = NULL, .mpi_ms_to_ram_async = NULL, .mpi_ms_to_mpi_ms_async = NULL, .ram_to_mic_async = NULL, .mic_to_ram_async = NULL, .any_to_any = vector_interface_copy_any_to_any, }; #else static const struct starpu_data_copy_methods vector_cpp_copy_data_methods_s = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, vector_interface_copy_any_to_any, }; #endif static void register_vector_cpp_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_vector_cpp_buffer_on_node(void *data_interface_, unsigned dst_node); static void *vector_cpp_to_pointer(void *data_interface, unsigned node); static int vector_cpp_pointer_is_inside(void *data_interface, unsigned node, void *ptr); static void free_vector_cpp_buffer_on_node(void *data_interface, unsigned node); static void free_vector_cpp_buffer_on_node(void *data_interface, unsigned node); static size_t vector_cpp_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_vector_cpp_interface_crc32(starpu_data_handle_t handle); static int vector_cpp_compare(void *data_interface_a, void *data_interface_b); static void display_vector_cpp_interface(starpu_data_handle_t handle, FILE *f); static int pack_vector_cpp_handle(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); static int unpack_vector_cpp_handle(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); static starpu_ssize_t vector_cpp_describe(void *data_interface, char *buf, size_t size); #if __cplusplus >= 201103L static struct starpu_data_interface_ops interface_vector_cpp_ops = { .register_data_handle = register_vector_cpp_handle, .unregister_data_handle = NULL, .allocate_data_on_node = allocate_vector_cpp_buffer_on_node, .free_data_on_node = free_vector_cpp_buffer_on_node, .init = NULL, .copy_methods = &vector_cpp_copy_data_methods_s, .handle_to_pointer = NULL, .to_pointer = vector_cpp_to_pointer, .pointer_is_inside = vector_cpp_pointer_is_inside, .get_size = vector_cpp_interface_get_size, .get_alloc_size = NULL, .footprint = footprint_vector_cpp_interface_crc32, .alloc_footprint = NULL, .compare = vector_cpp_compare, .alloc_compare = NULL, .display = display_vector_cpp_interface, .describe = vector_cpp_describe, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct vector_cpp_interface), .is_multiformat = 0, .dontcache = 0, .get_mf_ops = NULL, .pack_data = pack_vector_cpp_handle, .unpack_data = unpack_vector_cpp_handle, .name = (char *) "VECTOR_CPP_INTERFACE" }; #else static struct starpu_data_interface_ops interface_vector_cpp_ops = { register_vector_cpp_handle, NULL, allocate_vector_cpp_buffer_on_node, free_vector_cpp_buffer_on_node, NULL, &vector_cpp_copy_data_methods_s, vector_cpp_to_pointer, vector_cpp_pointer_is_inside, vector_cpp_interface_get_size, NULL, footprint_vector_cpp_interface_crc32, NULL, vector_cpp_compare, NULL, display_vector_cpp_interface, vector_cpp_describe, STARPU_UNKNOWN_INTERFACE_ID, sizeof(struct vector_cpp_interface), 0, 0, NULL, pack_vector_cpp_handle, unpack_vector_cpp_handle, (char *) "VECTOR_CPP_INTERFACE" }; #endif static void *vector_cpp_to_pointer(void *data_interface, unsigned node) { (void) node; struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) data_interface; return (void*) vector_interface->ptr; } static int vector_cpp_pointer_is_inside(void *data_interface, unsigned int node, void *ptr) { (void) node; struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) data_interface; return (char*) ptr >= (char*) vector_interface->ptr && (char*) ptr < (char*) vector_interface->ptr + vector_interface->nx*vector_interface->elemsize; } static void register_vector_cpp_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct vector_cpp_interface *local_interface = (struct vector_cpp_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; local_interface->vec = vector_interface->vec; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; local_interface->vec = NULL; } 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 vector_cpp_data_register(starpu_data_handle_t *handleptr, int home_node, std::vector* vec, uint32_t nx, size_t elemsize) { #if __cplusplus >= 201103L struct vector_cpp_interface vector = { .id = STARPU_UNKNOWN_INTERFACE_ID, .ptr = (uintptr_t) &(*vec)[0], .dev_handle = (uintptr_t) &(*vec)[0], .offset = 0, .nx = nx, .elemsize = elemsize, .vec = vec, .slice_base = 0 }; #else struct vector_cpp_interface vector = { STARPU_UNKNOWN_INTERFACE_ID, (uintptr_t) &(*vec)[0], (uintptr_t) &(*vec)[0], 0, nx, elemsize, vec, 0 }; #endif if (interface_vector_cpp_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_vector_cpp_ops.interfaceid = (enum starpu_data_interface_id )starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, &vector, &interface_vector_cpp_ops); } /* offer an access to the data parameters */ uint32_t vector_cpp_get_nx(starpu_data_handle_t handle) { struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return vector_interface->nx; } static uint32_t footprint_vector_cpp_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(vector_cpp_get_nx(handle), 0); } static int vector_cpp_compare(void *data_interface_a, void *data_interface_b) { struct vector_cpp_interface *vector_a = (struct vector_cpp_interface *) data_interface_a; struct vector_cpp_interface *vector_b = (struct vector_cpp_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_cpp_interface(starpu_data_handle_t handle, FILE *f) { struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%u\t", vector_interface->nx); } static int pack_vector_cpp_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 vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) starpu_data_get_interface_on_node(handle, node); *count = vector_interface->nx*vector_interface->elemsize; if (ptr != NULL) { *ptr = (void*) starpu_malloc_on_node_flags(node, *count, 0); memcpy(*ptr, (void*)vector_interface->ptr, vector_interface->elemsize*vector_interface->nx); } return 0; } static int unpack_vector_cpp_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 vector_cpp_interface *vector_interface = (struct vector_cpp_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); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); return 0; } static size_t vector_cpp_interface_get_size(starpu_data_handle_t handle) { size_t size; struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); size = vector_interface->nx*vector_interface->elemsize; return size; } size_t vector_cpp_get_elemsize(starpu_data_handle_t handle) { struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); 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_cpp_buffer_on_node(void *data_interface_, unsigned dst_node) { struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) data_interface_; uint32_t nx = vector_interface->nx; size_t elemsize = vector_interface->elemsize; starpu_ssize_t allocated_memory; const my_allocator allocator(dst_node); std::vector * vec = new std::vector(nx, 0, allocator); vector_interface->vec = vec; if (!vector_interface->vec) return -ENOMEM; allocated_memory = nx*elemsize; /* update the data properly in consequence */ vector_interface->ptr = (uintptr_t) &((*vec)[0]); vector_interface->dev_handle = (uintptr_t) &((*vec)[0]); vector_interface->offset = 0; return allocated_memory; } static void free_vector_cpp_buffer_on_node(void *data_interface, unsigned node) { struct vector_cpp_interface *vector_interface = (struct vector_cpp_interface *) data_interface; delete vector_interface->vec; } static int vector_interface_copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct vector_cpp_interface *src_vector = (struct vector_cpp_interface *) src_interface; struct vector_cpp_interface *dst_vector = (struct vector_cpp_interface *) 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); return ret; } static starpu_ssize_t vector_cpp_describe(void *data_interface, char *buf, size_t size) { struct vector_cpp_interface *vector = (struct vector_cpp_interface *) data_interface; return snprintf(buf, size, "V%ux%u", (unsigned) vector->nx, (unsigned) vector->elemsize); } /* * End of interface */ /* Kernel using STL objects */ void cpu_kernel_add_vectors(void *buffers[], void *cl_arg) { std::vector* vec_A = VECTOR_CPP_GET_VEC(buffers[0]); std::vector* vec_B = VECTOR_CPP_GET_VEC(buffers[1]); std::vector* vec_C = VECTOR_CPP_GET_VEC(buffers[2]); // all the std::vector have to have the same size assert(vec_A->size() == vec_B->size() && vec_B->size() == vec_C->size()); // performs the vector addition (vec_C[] = vec_A[] + vec_B[]) for (size_t i = 0; i < vec_C->size(); i++) (*vec_C)[i] = (*vec_A)[i] + (*vec_B)[i]; } #define VEC_SIZE 1024 int main(int argc, char **argv) { struct starpu_conf conf; bool fail; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; // initialize StarPU with default configuration int ret = starpu_init(&conf); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); { /* Test data transfers between NUMA nodes if available */ unsigned last_numa_node = starpu_memory_nodes_get_numa_count() - 1; const my_allocator allocator_main_ram(STARPU_MAIN_RAM); const my_allocator allocator_last_numa(last_numa_node); std::vector vec_A(VEC_SIZE, 2, allocator_main_ram); // all the vector is initialized to 2 std::vector vec_B(VEC_SIZE, 3, allocator_main_ram); // all the vector is initialized to 3 std::vector vec_C(VEC_SIZE, 0, allocator_last_numa); // all the vector is initialized to 0 // StarPU data registering starpu_data_handle_t spu_vec_A; starpu_data_handle_t spu_vec_B; starpu_data_handle_t spu_vec_C; // give the data of the vector to StarPU (C array) vector_cpp_data_register(&spu_vec_A, STARPU_MAIN_RAM, &vec_A, vec_A.size(), sizeof(char)); vector_cpp_data_register(&spu_vec_B, STARPU_MAIN_RAM, &vec_B, vec_B.size(), sizeof(char)); vector_cpp_data_register(&spu_vec_C, last_numa_node, &vec_C, vec_C.size(), sizeof(char)); // create the StarPU codelet starpu_codelet cl; starpu_codelet_init(&cl); cl.cpu_funcs [0] = cpu_kernel_add_vectors; cl.cpu_funcs_name[0] = "cpu_kernel_add_vectors"; cl.nbuffers = 3; cl.modes [0] = STARPU_R; cl.modes [1] = STARPU_R; cl.modes [2] = STARPU_W; cl.name = "add_vectors"; // submit a new StarPU task to execute ret = starpu_task_insert(&cl, STARPU_R, spu_vec_A, STARPU_R, spu_vec_B, STARPU_W, spu_vec_C, 0); if (ret == -ENODEV) { // StarPU data unregistering starpu_data_unregister(spu_vec_C); starpu_data_unregister(spu_vec_B); starpu_data_unregister(spu_vec_A); // terminate StarPU, no task can be submitted after starpu_shutdown(); return 77; } STARPU_CHECK_RETURN_VALUE(ret, "task_submit::add_vectors"); // wait the task starpu_task_wait_for_all(); // StarPU data unregistering starpu_data_unregister(spu_vec_C); starpu_data_unregister(spu_vec_B); starpu_data_unregister(spu_vec_A); // check results fail = false; int i = 0; while (!fail && i < VEC_SIZE) fail = vec_C[i++] != 5; } // terminate StarPU, no task can be submitted after starpu_shutdown(); if (fail) { #ifdef PRINT_OUTPUT std::cout << "Example failed..." << std::endl; #endif return EXIT_FAILURE; } else { #ifdef PRINT_OUTPUT std::cout << "Example successfully passed!" << std::endl; #endif return EXIT_SUCCESS; } } #endif starpu-1.3.9+dfsg/examples/cpp/incrementer_cpp.cpp000066400000000000000000000067431413463044200222550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; struct starpu_conf conf; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_init(&conf); 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.3.9+dfsg/examples/dependency/000077500000000000000000000000001413463044200177165ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/dependency/sequential_consistency.c000066400000000000000000000114421413463044200246570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 cpu_codeletA(void *descr[], void *args); void cpu_codeletB(void *descr[], void *args); void cpu_codeletC(void *descr[], void *args); struct starpu_codelet clA = { .cpu_funcs = {cpu_codeletA}, .cpu_funcs_name = {"cpu_codeletA"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codeletA" }; struct starpu_codelet clB = { .cpu_funcs = {cpu_codeletB}, .cpu_funcs_name = {"cpu_codeletB"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codeletB" }; struct starpu_codelet clC = { .cpu_funcs = {cpu_codeletC}, .cpu_funcs_name = {"cpu_codeletC"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codeletC" }; void cpu_codeletA(void *descr[], void *args) { int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); starpu_data_handle_t value_handle; starpu_tag_t tagHoldC; int ret; unsigned char handle_sequential_consistency[] = {0}; FPRINTF(stderr, "[Task A] Value = %d\n", *val); starpu_codelet_unpack_args(args, &value_handle, &tagHoldC); // With several data, one would need to use a dynamically // allocated array for the sequential consistency, // the array could be freed immediately after calling // starpu_task_insert() ret = starpu_task_insert(&clB, STARPU_RW, value_handle, STARPU_CALLBACK_WITH_ARG_NFREE, starpu_tag_notify_from_apps, tagHoldC, STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, handle_sequential_consistency, STARPU_NAME, "taskB", 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); *val *= 2; } void cpu_codeletB(void *descr[], void *args) { (void)args; int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); FPRINTF(stderr, "[Task B] Value = %d\n", *val); STARPU_ASSERT_MSG(*val == 24, "Incorrect value %d (expected 24)\n", *val); *val += 1; } void cpu_codeletC(void *descr[], void *args) { (void)args; int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); FPRINTF(stderr, "[Task C] Value = %d\n", *val); STARPU_ASSERT_MSG(*val == 25, "Incorrect value %d (expected 25)\n", *val); *val *= 2; } /* * Submit taskA and hold it * Submit taskC and hold it * Release taskA * Execute taskA --> submit taskB * Execute taskB --> callback: release taskC * * All three tasks use the same data in RW, taskB is submitted after * taskC, so taskB should normally only execute after taskC but as the * sequential consistency for (taskB, data) is unset, taskB can * execute straightaway */ int main(void) { int value=12; int ret; starpu_data_handle_t value_handle; starpu_tag_t tagHoldA = 42; starpu_tag_t tagHoldC = 84; starpu_tag_t tagA = 421; starpu_tag_t tagC = 842; struct starpu_conf conf; if (sizeof(starpu_tag_t) > sizeof(void*)) { // Can't pass a tag_t through callback arg :/ return 77; } starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_init(&conf); if (STARPU_UNLIKELY(ret == -ENODEV)) { return 77; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cpu_worker_get_count() < 1) { FPRINTF(stderr, "This application requires at least 1 cpu worker\n"); starpu_shutdown(); return 77; } starpu_variable_data_register(&value_handle, STARPU_MAIN_RAM, (uintptr_t)&value, sizeof(value)); starpu_tag_declare_deps_array(tagA, 1, &tagHoldA); starpu_tag_declare_deps_array(tagC, 1, &tagHoldC); ret = starpu_task_insert(&clA, STARPU_TAG, tagA, STARPU_RW, value_handle, STARPU_VALUE, &value_handle, sizeof(starpu_data_handle_t), STARPU_VALUE, &tagHoldC, sizeof(starpu_tag_t), STARPU_NAME, "taskA", 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&clC, STARPU_TAG, tagC, STARPU_RW, value_handle, STARPU_NAME, "taskC", 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); // Release taskA (we want to make sure it will execute after taskC has been submitted) starpu_tag_notify_from_apps(tagHoldA); starpu_data_unregister(value_handle); STARPU_ASSERT_MSG(value == 50, "Incorrect value %d (expected 50)\n", value); starpu_shutdown(); FPRINTF(stderr, "Value = %d\n", value); return ret; } starpu-1.3.9+dfsg/examples/dependency/task_end_dep.c000066400000000000000000000061721413463044200225100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 defer termination of a task until the termination of * another task. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define INIT 12 void cpu_codelet2(void *descr[], void *args) { int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); (void)args; STARPU_ASSERT(*val == 2*INIT); starpu_sleep(0.1); STARPU_ASSERT(*val == 2*INIT); *val *= 2; } struct starpu_codelet cl2 = { .cpu_funcs = {cpu_codelet2}, .cpu_funcs_name = {"cpu_codelet2"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codelet2" }; void cpu_codelet(void *descr[], void *args) { (void)args; int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); struct starpu_task *task = starpu_task_get_current(); starpu_task_insert(&cl2, STARPU_RW, task->handles[0], STARPU_TASK_END_DEPS_ARRAY, 1, &task, 0); STARPU_ASSERT(*val == INIT); starpu_sleep(0.1); STARPU_ASSERT(*val == INIT); *val *= 2; } struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codelet" }; int main(void) { int value=INIT; int ret; starpu_data_handle_t value_handle; struct starpu_conf conf; struct starpu_task *task; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_init(&conf); if (STARPU_UNLIKELY(ret == -ENODEV)) { return 77; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cpu_worker_get_count() < 1) { FPRINTF(stderr, "This application requires at least 1 cpu worker\n"); starpu_shutdown(); return 77; } starpu_variable_data_register(&value_handle, STARPU_MAIN_RAM, (uintptr_t)&value, sizeof(value)); task = starpu_task_build(&cl, STARPU_RW, value_handle, 0); STARPU_ASSERT(task); task->detach = 0; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_data_set_sequential_consistency_flag(value_handle, 0); starpu_data_acquire_on_node(value_handle, STARPU_MAIN_RAM, STARPU_R); /* Waiting for the main task should have also waited for the subtask */ STARPU_ASSERT(value == 2*2*INIT); starpu_data_release_on_node(value_handle, STARPU_MAIN_RAM); starpu_data_unregister(value_handle); STARPU_ASSERT(value == 2*2*INIT); starpu_shutdown(); FPRINTF(stderr, "Value = %d\n", value); return ret; } starpu-1.3.9+dfsg/examples/dependency/task_end_dep_add.c000066400000000000000000000047171413463044200233230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 defer termination of a task thanks to * starpu_task_end_dep_add. */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define INIT 12 void cpu_codelet2(void *descr[], void *args) { (void)descr; (void)args; } struct starpu_codelet cl2 = { .cpu_funcs = {cpu_codelet2}, .cpu_funcs_name = {"cpu_codelet2"}, .name = "codelet2" }; void cpu_codelet(void *descr[], void *args) { (void)args; int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); struct starpu_task *task; task = starpu_task_get_current(); starpu_task_end_dep_add(task, 1); starpu_task_insert(&cl2, STARPU_CALLBACK_WITH_ARG_NFREE, starpu_task_end_dep_release, task, 0); STARPU_ASSERT(*val == INIT); *val *= 2; } struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codelet" }; int main(void) { int value=INIT; int ret; starpu_data_handle_t value_handle; struct starpu_conf conf; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_init(&conf); if (STARPU_UNLIKELY(ret == -ENODEV)) { return 77; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cpu_worker_get_count() < 1) { FPRINTF(stderr, "This application requires at least 1 cpu worker\n"); starpu_shutdown(); return 77; } starpu_variable_data_register(&value_handle, STARPU_MAIN_RAM, (uintptr_t)&value, sizeof(value)); ret = starpu_task_insert(&cl, STARPU_RW, value_handle, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_data_unregister(value_handle); STARPU_ASSERT(value == 2*INIT); starpu_shutdown(); FPRINTF(stderr, "Value = %d\n", value); return ret; } starpu-1.3.9+dfsg/examples/filters/000077500000000000000000000000001413463044200172505ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/filters/custom_mf/000077500000000000000000000000001413463044200212445ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/filters/custom_mf/conversion.cu000066400000000000000000000031161413463044200237630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/filters/custom_mf/conversion_opencl.c000066400000000000000000000047561413463044200251510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/filters/custom_mf/conversion_opencl.cl000066400000000000000000000020071413463044200253100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/filters/custom_mf/cuda.cu000066400000000000000000000027101413463044200225110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/filters/custom_mf/custom_conversion_codelets.c000066400000000000000000000045161413463044200270570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (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) { (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.3.9+dfsg/examples/filters/custom_mf/custom_interface.c000066400000000000000000000360241413463044200247470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_to_pointer(void *data_interface, unsigned node); static int custom_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .to_pointer = custom_to_pointer, .pointer_is_inside = custom_pointer_is_inside, .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_to_pointer(void *data, unsigned node) { struct custom_data_interface *data_interface = data; 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 int custom_pointer_is_inside(void *data, unsigned node, void *ptr) { struct custom_data_interface *data_interface = data; switch(starpu_node_get_kind(node)) { case STARPU_CPU_RAM: return (char*) ptr >= (char*) data_interface->cpu_ptr && (char*) ptr < (char*) data_interface->cpu_ptr + data_interface->nx * data_interface->ops->cpu_elemsize; #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: return (char*) ptr >= (char*) data_interface->cuda_ptr && (char*) ptr < (char*) data_interface->cuda_ptr + data_interface->nx * data_interface->ops->cuda_elemsize; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: return (char*) ptr >= (char*) data_interface->opencl_ptr && (char*) ptr < (char*) data_interface->opencl_ptr + data_interface->nx * data_interface->ops->opencl_elemsize; #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) { (void)src_node; (void)dst_node; 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) { (void)src_interface; (void)src_node; (void)dst_interface; (void)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) { (void)src_interface; (void)src_node; (void)dst_interface; (void)dst_node; (void)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) { (void)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) { (void)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.3.9+dfsg/examples/filters/custom_mf/custom_interface.h000066400000000000000000000032721413463044200247530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/filters/custom_mf/custom_mf_filter.c000066400000000000000000000162021413463044200247520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (void)f; 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; (void)args; 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.3.9+dfsg/examples/filters/custom_mf/custom_opencl.c000066400000000000000000000047111413463044200242650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/filters/custom_mf/custom_opencl.cl000066400000000000000000000015711413463044200244420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/filters/custom_mf/custom_types.h000066400000000000000000000016631413463044200241610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/filters/fblock.c000066400000000000000000000130341413463044200206550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif /* 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.3.9+dfsg/examples/filters/fblock_cpu.c000066400000000000000000000025511413463044200215260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/filters/fblock_opencl.c000066400000000000000000000050751413463044200222230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[3]={nx,ny,nz}; err = clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global, NULL, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } starpu_opencl_release_kernel(kernel); } starpu-1.3.9+dfsg/examples/filters/fblock_opencl_kernel.cl000066400000000000000000000022161413463044200237310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { const int idx = get_global_id(0); const int idy = get_global_id(1); const int idz = get_global_id(2); if (idx >= nx) return; if (idy >= ny) return; if (idz >= nz) return; block = (__global int*) ((__global char *)block + offset); int i = idz*ldz + idy*ldy + idx; block[i] = factor; } starpu-1.3.9+dfsg/examples/filters/fmatrix.c000066400000000000000000000075671413463044200211050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 2D * matrix into 2D slices (along the X axis), and run a dumb kernel on them. */ #include #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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/filters/fmultiple_manual.c000066400000000000000000000174571413463044200227700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { unsigned i, j; (void)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]); int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); for(j=0; j= 0); for (i = 1; i < nbuffers; i++) STARPU_ASSERT(starpu_task_get_current_data_node(i) == node); } struct starpu_codelet cl_switch = { #if 1 /* Check for the values */ .cpu_funcs = {empty}, #else /* For production code: we do not need to actually execute anything */ .where = STARPU_NOWHERE, #endif .nbuffers = STARPU_VARIABLE_NBUFFERS, .name = "switch", }; int main(void) { unsigned j, n=1; int matrix[NX][NY]; int ret, i; /* We haven't taken care otherwise */ STARPU_ASSERT((NX%PARTS) == 0); STARPU_ASSERT((NY%PARTS) == 0); starpu_data_handle_t handle; starpu_data_handle_t vert_handle[PARTS]; starpu_data_handle_t horiz_handle[PARTS]; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* force to execute task on the home_node, here it is STARPU_MAIN_RAM */ cl_switch.specific_nodes = 1; for (i = 0; i < STARPU_NMAXBUFS; i++) cl_switch.nodes[i] = STARPU_MAIN_RAM; /* Declare the whole matrix to StarPU */ starpu_matrix_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)matrix, NX, NX, NY, sizeof(matrix[0][0])); /* Also declare the vertical slices to StarPU */ 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])); /* But make it invalid for now, we'll access data through the whole matrix first */ starpu_data_invalidate(vert_handle[i]); } /* And the horizontal slices to StarPU */ for (i = 0; i < PARTS; i++) { starpu_matrix_data_register(&horiz_handle[i], STARPU_MAIN_RAM, (uintptr_t)&matrix[i*(NY/PARTS)][0], NX, NX, NY/PARTS, sizeof(matrix[0][0])); starpu_data_invalidate(horiz_handle[i]); } /* Fill the matrix */ ret = starpu_task_insert(&cl_fill, STARPU_W, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* Now switch to vertical view of the matrix */ struct starpu_data_descr vert_descr[PARTS]; for (i = 0; i < PARTS; i++) { vert_descr[i].handle = vert_handle[i]; vert_descr[i].mode = STARPU_W; } ret = starpu_task_insert(&cl_switch, STARPU_RW, handle, STARPU_DATA_MODE_ARRAY, vert_descr, PARTS, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* And make sure we don't accidentally access the matrix through the whole-matrix handle */ starpu_data_invalidate_submit(handle); /* Check the values of the vertical slices */ for (i = 0; i < PARTS; i++) { int factor = 1; int start = i*(NX/PARTS); ret = starpu_task_insert(&cl_check_scale, STARPU_RW, vert_handle[i], STARPU_VALUE, &start, sizeof(start), STARPU_VALUE, &factor, sizeof(factor), 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* Now switch back to total view of the matrix */ for (i = 0; i < PARTS; i++) vert_descr[i].mode = STARPU_RW; ret = starpu_task_insert(&cl_switch, STARPU_DATA_MODE_ARRAY, vert_descr, PARTS, STARPU_W, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* And make sure we don't accidentally access the matrix through the vertical slices */ for (i = 0; i < PARTS; i++) starpu_data_invalidate_submit(vert_handle[i]); /* And switch to horizontal view of the matrix */ struct starpu_data_descr horiz_descr[PARTS]; for (i = 0; i < PARTS; i++) { horiz_descr[i].handle = horiz_handle[i]; horiz_descr[i].mode = STARPU_W; } ret = starpu_task_insert(&cl_switch, STARPU_RW, handle, STARPU_DATA_MODE_ARRAY, horiz_descr, PARTS, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* And make sure we don't accidentally access the matrix through the whole-matrix handle */ starpu_data_invalidate_submit(handle); /* Check the values of the horizontal slices */ for (i = 0; i < PARTS; i++) { int factor = 2; int start = factor*100*i*(NY/PARTS); ret = starpu_task_insert(&cl_check_scale, STARPU_RW, horiz_handle[i], STARPU_VALUE, &start, sizeof(start), STARPU_VALUE, &factor, sizeof(factor), 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* * Unregister data from StarPU and shutdown It does not really matter * which view is active at unregistration here, since all views cover * the whole matrix, so it will be completely updated in the main memory. */ for (i = 0; i < PARTS; i++) { starpu_data_unregister(vert_handle[i]); starpu_data_unregister(horiz_handle[i]); } starpu_data_unregister(handle); starpu_shutdown(); return ret; enodev: starpu_shutdown(); return 77; } starpu-1.3.9+dfsg/examples/filters/fmultiple_submit.c000066400000000000000000000135641413463044200230110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 through partition planning. * 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) { unsigned i, j; (void)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]); 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) { unsigned i, j; (void)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]); 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) { unsigned i, j; (void)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]); int *val = (int *)STARPU_MATRIX_GET_PTR(buffers[0]); for(j=0; j #define NX 20 #define PARTS 2 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void display_func(void *buffers[], void *cl_arg) { unsigned i; /* 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]); FPRINTF(stderr, "vector with n=%u : ", n); for (i = 0; i < n; i++) FPRINTF(stderr, "%5d ", val[i]); FPRINTF(stderr, "\n"); } void cpu_func(void *buffers[], void *cl_arg) { unsigned i; /* 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]); FPRINTF(stderr, "computing on vector with n=%u\n", n); for (i = 0; i < n; i++) val[i] *= 2; } int main(void) { int i; int vector[NX]; starpu_data_handle_t handle; starpu_data_handle_t subhandles[PARTS]; int ret; struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .cpu_funcs_name = {"cpu_func"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "vector_scal" }; struct starpu_codelet print_cl = { .cpu_funcs = {display_func}, .cpu_funcs_name = {"display_func"}, .nbuffers = 1, .modes = {STARPU_R}, .name = "vector_display" }; for(i=0 ; i #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void cpu_codelet(void *buffers[], void *cl_arg) { unsigned i, j; int factor; starpu_codelet_unpack_args(cl_arg, &factor, 0); /* 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]); FPRINTF(stderr, "computing on matrix with nx=%u, ny=%u, ld=%u\n", nx, ny, ld); 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(void) { 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) { (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) { (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(void) { 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) { (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) { (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(void) { 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) { (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) { (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(void) { 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.3.9+dfsg/examples/fortran90/marshalling.c000066400000000000000000000115721413463044200220770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2015 ONERA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (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.3.9+dfsg/examples/fortran90/mod_compute.f90000066400000000000000000000100041413463044200222520ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! Copyright (C) 2015 ONERA ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/fortran90/mod_interface.f90000066400000000000000000000043441413463044200225500ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! Copyright (C) 2015 ONERA ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/fortran90/mod_types.f90000066400000000000000000000024361413463044200217540ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! Copyright (C) 2015 ONERA ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/gl_interop/000077500000000000000000000000001413463044200177425ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/gl_interop/gl_interop.c000066400000000000000000000070101413463044200222460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/gl_interop/gl_interop_idle.c000066400000000000000000000077721413463044200232620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/heat/000077500000000000000000000000001413463044200165215ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/heat/dw_factolu.c000066400000000000000000000540311413463044200210170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_tasks = malloc(sizeof(unsigned)); *remaining_tasks = (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_tasks; 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_tasks); } } /* * 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\tGFlop/s\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\tGFlop/s\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"; #elif defined(STARPU_OPENBLAS) char * symbol_11 = "lu_model_11_openblas"; char * symbol_12 = "lu_model_12_openblas"; char * symbol_21 = "lu_model_21_openblas"; char * symbol_22 = "lu_model_22_openblas"; #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 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.3.9+dfsg/examples/heat/dw_factolu.h000066400000000000000000000112641413463044200210250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 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 *); extern struct starpu_perfmodel model_11; extern struct starpu_perfmodel model_12; extern struct starpu_perfmodel model_21; extern struct starpu_perfmodel model_22; #endif /* __DW_FACTO_LU_H__ */ starpu-1.3.9+dfsg/examples/heat/dw_factolu_grain.c000066400000000000000000000235331413463044200222020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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)))) /* * 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[64]; starpu_worker_get_name(worker, name, sizeof(name)); 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[64]; starpu_worker_get_name(worker, name, sizeof(name)); 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[64]; starpu_worker_get_name(worker, name, sizeof(name)); 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[64]; starpu_worker_get_name(worker, name, sizeof(name)); 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, void *_args) { (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, void *_args) { (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, void *_args) { (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, void *_args) { (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.3.9+dfsg/examples/heat/dw_factolu_tag.c000066400000000000000000000174421413463044200216570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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)))) 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.3.9+dfsg/examples/heat/dw_sparse_cg.h000066400000000000000000000061751413463044200213430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 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 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.3.9+dfsg/examples/heat/dw_sparse_cg_kernels.c000066400000000000000000000240421413463044200230520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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[], void *arg) { (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[], void *arg) { (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[], void *arg) { (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.3.9+dfsg/examples/heat/heat.c000066400000000000000000000461451413463044200176200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 */ #ifdef STARPU_QUICK_CHECK static unsigned ntheta = 8+2; static unsigned nthick = 8+2; #else static unsigned ntheta = 32+2; static unsigned nthick = 32+2; #endif 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((int)thick_i - (int)thick_j) <= 1) && (abs((int)theta_i - (int)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 = calloc(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, pinned); } #ifdef STARPU_OPENGL_RENDER const char *display = getenv("DISPLAY"); if (display && display[0]) opengl_render(ntheta, nthick, result, pmesh, argc, argv); #endif free(pmesh); free(RefArray); free(RefArrayBack); free(Bformer); free(result); return 0; } starpu-1.3.9+dfsg/examples/heat/heat.h000066400000000000000000000043171413463044200176200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 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.3.9+dfsg/examples/heat/heat.sh000077500000000000000000000025651413463044200200110ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/heat # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/heat" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/heat fi $STARPU_LAUNCH $PREFIX/heat -shape 0 $STARPU_LAUNCH $PREFIX/heat -shape 1 # sometimes lead to pivot being 0 #$STARPU_LAUNCH $PREFIX/heat -shape 2 $STARPU_LAUNCH $PREFIX/heat -cg # TODO: FIXME # segfault #$STARPU_LAUNCH $PREFIX/heat -v1 # (actually the default...) $STARPU_LAUNCH $PREFIX/heat -v2 # hang #$STARPU_LAUNCH $PREFIX/heat -v3 # hang #$STARPU_LAUNCH $PREFIX/heat -v4 starpu-1.3.9+dfsg/examples/heat/heat_display.c000066400000000000000000000140501413463044200213330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, int y) { 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.3.9+dfsg/examples/heat/lu_kernels_model.c000066400000000000000000000131611413463044200222120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) { (void)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) { (void)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) { (void)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) { (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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) { (void)arch; (void)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)) { (void)cost_function; 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.3.9+dfsg/examples/heat/lu_kernels_model.h000066400000000000000000000043341413463044200222210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/incrementer/000077500000000000000000000000001413463044200201135ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/incrementer/incrementer.c000066400000000000000000000071431413463044200225770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_codelet(void *descr[], void *_args); struct starpu_opencl_program opencl_program; #endif void cpu_codelet(void *descr[], void *_args) { (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 ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #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.3.9+dfsg/examples/incrementer/incrementer_kernels.cu000066400000000000000000000022211413463044200244770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/incrementer/incrementer_kernels_opencl.c000066400000000000000000000035521413463044200256620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (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.3.9+dfsg/examples/incrementer/incrementer_kernels_opencl_kernel.cl000066400000000000000000000015451413463044200273760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/interface/000077500000000000000000000000001413463044200175405ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/interface/complex.c000066400000000000000000000162351413463044200213620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (void) task; (void) 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[], 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(void) { int ret = 0; starpu_data_handle_t handle1; starpu_data_handle_t handle2; starpu_data_handle_t handle3; double real = 45.0; double imaginary = 12.0; double copy_real = 78.0; double copy_imaginary = 78.0; int compare; int *compare_ptr = &compare; starpu_data_handle_t vectorh; struct starpu_vector_interface *vectori; double *vector; 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); /* Create a vector of two complexs. */ starpu_complex_data_register(&handle3, -1, 0, 0, 2); 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"); /* Compare two different complexs. */ 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; } /* Copy one into the other. */ 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"); /* And compare again. */ 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"); } /* Put another value again */ starpu_data_acquire(handle2, STARPU_W); copy_real = 78.0; copy_imaginary = 77.0; starpu_data_release(handle2); /* Split it in two pieces (thus one complex each). */ struct starpu_data_filter f = { .filter_func = starpu_complex_filter_block, .nchildren = 2, }; starpu_data_partition(handle3, &f); /* Copy the two complexs into each part */ ret = starpu_task_insert(&cl_copy, STARPU_R, handle1, STARPU_W, starpu_data_get_sub_data(handle3, 1, 0), 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&cl_copy, STARPU_R, handle2, STARPU_W, starpu_data_get_sub_data(handle3, 1, 1), 0); if (ret == -ENODEV) goto end; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); /* Gather the two pieces. */ starpu_data_unpartition(handle3, STARPU_MAIN_RAM); /* Show it. */ ret = starpu_task_insert(&cl_display, STARPU_VALUE, "handle3", strlen("handle3")+1, STARPU_R, handle3, 0); /* Get the real and imaginary vectors. */ struct starpu_data_filter fcanon = { .filter_func = starpu_complex_filter_canonical, .nchildren = 2, .get_child_ops = starpu_complex_filter_canonical_child_ops, }; starpu_data_partition(handle3, &fcanon); /* Check the corresponding data. */ vectorh = starpu_data_get_sub_data(handle3, 1, 0); starpu_data_acquire(vectorh, STARPU_R); vectori = starpu_data_get_interface_on_node(vectorh, STARPU_MAIN_RAM); vector = (double*) vectori->ptr; STARPU_ASSERT_MSG(vector[0] == 45., "Bogus value: %f instead of %f", vector[0], 45.); STARPU_ASSERT_MSG(vector[1] == 78., "Bogus value: %f instead of %f", vector[1], 78.); starpu_data_release(vectorh); vectorh = starpu_data_get_sub_data(handle3, 1, 1); starpu_data_acquire(vectorh, STARPU_R); vectori = starpu_data_get_interface_on_node(vectorh, STARPU_MAIN_RAM); vector = (double*) vectori->ptr; STARPU_ASSERT_MSG(vector[0] == 12., "Bogus value: %f instead of %f", vector[0], 12.); STARPU_ASSERT_MSG(vector[1] == 77., "Bogus value: %f instead of %f", vector[1], 77.); starpu_data_release(vectorh); starpu_data_unpartition(handle3, STARPU_MAIN_RAM); 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_data_unregister(handle3); starpu_shutdown(); if (ret == -ENODEV) return 77; else return !compare; } starpu-1.3.9+dfsg/examples/interface/complex_codelet.h000066400000000000000000000054751413463044200230720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) /* Dumb performance model for simgrid */ static double complex_cost_function(struct starpu_task *task, unsigned nimpl) { (void) task; (void) nimpl; return 0.000001; } static struct starpu_perfmodel complex_model = { .type = STARPU_COMMON, .cost_function = complex_cost_function, .symbol = "complex" }; 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" void starpu_complex_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_complex_interface *complex_father = father_interface; struct starpu_complex_interface *complex_child = child_interface; uint32_t nx = complex_father->nx; size_t elemsize = sizeof(double); STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; /* Compute the split */ starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); complex_child->nx = child_nx; if (complex_father->real) { complex_child->real = (void*) ((uintptr_t) complex_father->real + offset); complex_child->imaginary = (void*) ((uintptr_t) complex_father->imaginary + offset); } } void starpu_complex_filter_canonical(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_complex_interface *complex_father = father_interface; struct starpu_vector_interface *vector_child = child_interface; STARPU_ASSERT_MSG(nchunks == 2, "complex can only be split into two pieces"); STARPU_ASSERT_MSG(id < 2, "complex has only two pieces"); vector_child->id = STARPU_VECTOR_INTERFACE_ID; if (id == 0) vector_child->ptr = (uintptr_t) complex_father->real; else vector_child->ptr = (uintptr_t) complex_father->imaginary; /* the complex interface doesn't support dev_handle/offset */ vector_child->dev_handle = vector_child->ptr; vector_child->offset = 0; vector_child->nx = complex_father->nx; vector_child->elemsize = sizeof(double); vector_child->slice_base = 0; vector_child->allocsize = vector_child->nx * vector_child->elemsize; } struct starpu_data_interface_ops *starpu_complex_filter_canonical_child_ops(STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned child) { return &starpu_interface_vector_ops; } starpu-1.3.9+dfsg/examples/interface/complex_interface.c000066400000000000000000000201131413463044200233700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 int complex_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void)node; struct starpu_complex_interface *complex_interface = data_interface; return ((char*) ptr >= (char*) &complex_interface->real && (char*) ptr < (char*) (&complex_interface->real + 1)) || ((char*) ptr >= (char*) &complex_interface->imaginary && (char*) ptr < (char*) (&complex_interface->imaginary + 1)); } 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; data = (void*) starpu_malloc_on_node_flags(node, *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)); starpu_free_on_node_flags(node, (uintptr_t) ptr, count, 0); 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 complex_compare(void *data_interface_a, void *data_interface_b) { struct starpu_complex_interface *complex_a = (struct starpu_complex_interface *) data_interface_a; struct starpu_complex_interface *complex_b = (struct starpu_complex_interface *) data_interface_b; return (complex_a->nx == complex_b->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), .to_pointer = NULL, .pointer_is_inside = complex_pointer_is_inside, .pack_data = complex_pack_data, .unpack_data = complex_unpack_data, .describe = complex_describe, .compare = complex_compare }; 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.3.9+dfsg/examples/interface/complex_interface.h000066400000000000000000000040101413463044200233730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) /* Split complex vector into smaller complex vectors */ void starpu_complex_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nchunks); /* Split complex into two simple vectors */ void starpu_complex_filter_canonical(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nchunks); struct starpu_data_interface_ops *starpu_complex_filter_canonical_child_ops(struct starpu_data_filter *f, unsigned child); #endif /* __COMPLEX_INTERFACE_H */ starpu-1.3.9+dfsg/examples/interface/complex_kernels.cl000066400000000000000000000020721413463044200232530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/interface/complex_kernels.cu000066400000000000000000000033121413463044200232620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/interface/complex_kernels_opencl.c000066400000000000000000000051101413463044200244330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/examples/loader-cross.sh.in000066400000000000000000000025441413463044200211430ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 case "$exec" in /*) ;; *) exec="$PWD/$exec" esac NATIVE=${exec/\/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" export STARPU_MIC_SINK_PROGRAM_PATH="$DIR" # 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" "$@" starpu-1.3.9+dfsg/examples/lu/000077500000000000000000000000001413463044200162205ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/lu/blas_complex.c000066400000000000000000000154601413463044200210420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_OPENBLAS) || 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.3.9+dfsg/examples/lu/blas_complex.h000066400000000000000000000233361413463044200210500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_OPENBLAS) || 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.3.9+dfsg/examples/lu/clu.c000066400000000000000000000014231413463044200171470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/clu_implicit.c000066400000000000000000000014341413463044200210430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/clu_implicit_pivot.c000066400000000000000000000014701413463044200222640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/clu_kernels.c000066400000000000000000000014041413463044200206710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/clu_pivot.c000066400000000000000000000014301413463044200203660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/complex_double.h000066400000000000000000000026771413463044200214060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/complex_float.h000066400000000000000000000026331413463044200212310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/dlu.c000066400000000000000000000014151413463044200171510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/dlu_implicit.c000066400000000000000000000014261413463044200210450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/dlu_implicit_pivot.c000066400000000000000000000014621413463044200222660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/dlu_kernels.c000066400000000000000000000013761413463044200207020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/dlu_pivot.c000066400000000000000000000014221413463044200203700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/lu-double.h000066400000000000000000000025721413463044200202670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/lu-float.h000066400000000000000000000025331413463044200201170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/lu.sh000077500000000000000000000046621413463044200172070ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) rm -rf $PREFIX/lu.traces mkdir -p $PREFIX/lu.traces if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/lu_implicit_example_float # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/lu_implicit_example_float" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/lu_implicit_example_float fi export STARPU_FXT_PREFIX=$PREFIX/lu.traces $STARPU_LAUNCH $PREFIX/lu_implicit_example_float -size $((160 * 4)) -nblocks 4 -piv $STARPU_LAUNCH $PREFIX/lu_implicit_example_float -size $((160 * 4)) -nblocks 4 -no-stride $STARPU_LAUNCH $PREFIX/lu_implicit_example_float -size $((160 * 4)) -nblocks 4 -bound $STARPU_LAUNCH $PREFIX/lu_implicit_example_float -size $((160 * 2)) -nblocks 2 -bounddeps -directory $STARPU_FXT_PREFIX $STARPU_LAUNCH $PREFIX/lu_implicit_example_float -size $((160 * 2)) -nblocks 2 -bound -bounddeps -bounddepsprio -directory $STARPU_FXT_PREFIX if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/lu_example_float # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/lu_example_float" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/lu_example_float fi $STARPU_LAUNCH $PREFIX/lu_example_float -size $((160 * 4)) -nblocks 4 -piv $STARPU_LAUNCH $PREFIX/lu_example_float -size $((160 * 4)) -nblocks 4 -no-stride $STARPU_LAUNCH $PREFIX/lu_example_float -size $((160 * 4)) -nblocks 4 -bound $STARPU_LAUNCH $PREFIX/lu_example_float -size $((160 * 2)) -nblocks 2 -bounddeps -directory $PREFIX/lu.traces $STARPU_LAUNCH $PREFIX/lu_example_float -size $((160 * 2)) -nblocks 2 -bound -bounddeps -bounddepsprio -directory $STARPU_FXT_PREFIX starpu-1.3.9+dfsg/examples/lu/lu_example.c000066400000000000000000000237701413463044200205300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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" #ifdef STARPU_HAVE_VALGRIND_H #include #endif 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; static unsigned no_prio=0; unsigned bound = 0; unsigned bounddeps = 0; unsigned boundprio = 0; char *directory = NULL; #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], "-directory") == 0) { directory = strdup(argv[++i]); } 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] [-directory d]\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) { (void)m; (void)n; (void)ld; (void)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 */ #ifdef STARPU_SIMGRID A = (void*) 1; #else starpu_malloc_flags((void **)&A, (size_t)size*size*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); #endif 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); #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) size = 16; #endif 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, no_prio); 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, no_prio); end = starpu_timing_now(); double timing = end - start; unsigned n = size; double flop = (2.0f*n*n*n)/3.0f; FPRINTF(stderr, "Synthetic GFlop/s (TOTAL) : \n"); FPRINTF(stdout, "%u %6.2f\n", n, (flop/timing/1000.0f)); } } else #endif { ret = STARPU_LU(lu_decomposition)(A, size, size, nblocks, no_prio); } if (profile) { FPRINTF(stderr, "Setting profile\n"); starpu_profiling_status_set(STARPU_PROFILING_DISABLE); starpu_profiling_bus_helper_display_summary(); } if (bound) { if (bounddeps) { if (!directory) directory = strdup("."); char filename[256]; snprintf(filename, sizeof(filename), "%s/%s", directory, "lu.pl"); FILE *f = fopen(filename, "w"); starpu_bound_print_lp(f); FPRINTF(stderr,"system printed to %s\n", filename); fclose(f); snprintf(filename, sizeof(filename), "%s/%s", directory, "lu.mps"); f = fopen(filename, "w"); starpu_bound_print_mps(f); FPRINTF(stderr,"system printed to %s\n", filename); fclose(f); snprintf(filename, sizeof(filename), "%s/%s", directory, "lu.dot"); f = fopen(filename, "w"); starpu_bound_print_dot(f); FPRINTF(stderr,"system printed to %s\n", filename); fclose(f); } } #ifndef STARPU_SIMGRID if (check) { FPRINTF(stderr, "Checking result\n"); if (pivot) { pivot_saved_matrix(ipiv); } check_result(); } if (pivot) free(ipiv); #endif #ifndef STARPU_SIMGRID starpu_free_flags(A, (size_t)size*size*sizeof(TYPE), STARPU_MALLOC_PINNED|STARPU_MALLOC_SIMULATION_FOLDED); #endif starpu_cublas_shutdown(); starpu_shutdown(); free(directory); if (ret == -ENODEV) return 77; else return 0; } starpu-1.3.9+dfsg/examples/lu/lu_example_complex_double.c000066400000000000000000000014461413463044200236050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/lu_example_complex_float.c000066400000000000000000000014441413463044200234360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/lu_example_double.c000066400000000000000000000014361413463044200220550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/lu_example_float.c000066400000000000000000000014341413463044200217060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/slu.c000066400000000000000000000014131413463044200171660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/slu_implicit.c000066400000000000000000000014241413463044200210620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/slu_implicit_pivot.c000066400000000000000000000014601413463044200223030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/slu_kernels.c000066400000000000000000000013741413463044200207170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/slu_pivot.c000066400000000000000000000014201413463044200204050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/xlu.c000066400000000000000000000155701413463044200172040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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" /* * 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, unsigned no_prio) { /* printf("task 11 k = %d TAG = %llx\n", k, (TAG11(k))); */ struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11; task->color = 0xffff00; /* 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, unsigned no_prio) { 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->color = 0x8080ff; /* 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, unsigned no_prio) { int ret; struct starpu_task *task = create_task(TAG21(k, i)); task->cl = &cl21; task->color = 0x8080c0; /* 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, unsigned no_prio) { 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->color = 0x00ff00; /* 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, unsigned no_prio) { 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, no_prio); /* 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 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, unsigned no_prio); int STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks, unsigned no_prio); int STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks, unsigned no_prio); #endif /* __XLU_H__ */ starpu-1.3.9+dfsg/examples/lu/xlu_implicit.c000066400000000000000000000131401413463044200210650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 int create_task_11(starpu_data_handle_t dataA, unsigned k, unsigned no_prio) { 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); task->color = 0xffff00; /* 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, unsigned no_prio) { 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); task->color = 0x8080ff; 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, unsigned no_prio) { 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); task->color = 0x8080c0; 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, unsigned no_prio) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl22; task->color = 0x00ff00; /* 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, unsigned no_prio) { 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, no_prio); if (ret == -ENODEV) return ret; for (i = k+1; icl = &cl_pivot; task->color = 0xc0c000; /* 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), unsigned no_prio) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl11_pivot; task->color = 0xffff00; 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), unsigned no_prio) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl12; task->color = 0x8080ff; /* 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), unsigned no_prio) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl21; task->color = 0x8080c0; /* 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), unsigned no_prio) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl22; task->color = 0x00ff00; /* 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, unsigned no_prio) { 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, no_prio); 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, no_prio); 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, void *_args) { (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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_LU_STR(lu_model_22_openblas) #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) { (void)task; (void)nimpl; enum starpu_worker_archtype type = starpu_worker_get_type(workerid); if (type == STARPU_CPU_WORKER || type == STARPU_MIC_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, void *_args) { (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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_LU_STR(lu_model_12_openblas) #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, void *_args) { (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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_LU_STR(lu_model_21_openblas) #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, void *_args) { (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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_LU_STR(lu_model_11_openblas) #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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_LU_STR(lu_model_11_pivot_openblas) #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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_LU_STR(lu_model_pivot_openblas) #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.3.9+dfsg/examples/lu/xlu_kernels.h000066400000000000000000000032641413463044200207310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/lu/xlu_pivot.c000066400000000000000000000305221413463044200204170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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" /* * 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), unsigned no_prio) { int ret; struct starpu_task *task = create_task(PIVOT(k, i)); task->cl = &cl_pivot; task->color = 0xc0c000; /* 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), unsigned no_prio) { struct starpu_task *task = create_task(TAG11(k)); task->cl = &cl11_pivot; task->color = 0xffff00; 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), unsigned no_prio) { 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->color = 0x8080ff; task->cl_arg = (void *)(uintptr_t)(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), unsigned no_prio) { int ret; struct starpu_task *task = create_task(TAG21(k, i)); task->cl = &cl21; task->color = 0x8080c0; /* 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 *)(uintptr_t)(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), unsigned no_prio) { 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->color = 0x00ff00; task->cl_arg = (void *)(uintptr_t)(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, unsigned no_prio) { 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, no_prio); /* 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, no_prio); if (ret == -ENODEV) return ret; } } for (i = k+1; i #include #include #ifdef STARPU_HAVE_X11 #include #include int use_x11_p = 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_p = 0; static double demozoom_p = 0.05; /* NB: The X11 code is inspired from the http://locklessinc.com/articles/mandelbrot/ article */ static int nblocks_p = 20; static int height_p = 400; static int width_p = 640; static int maxIt_p = 20000; /* max number of iteration in the Mandelbrot function */ static int niter_p = -1; /* number of loops in case we don't use X11, -1 means infinite */ static int use_spmd_p = 0; static double leftX_p = -0.745; static double rightX_p = -0.74375; static double topY_p = .15; static double bottomY_p = .14875; /* * X11 window management */ #ifdef STARPU_HAVE_X11 /* X11 data */ static Display *dpy_p; static Window win_p; static XImage *bitmap_p; static GC gc_p; static KeySym Left_p=-1, Right_p, Down_p, Up_p, Alt_p; static void exit_x11(void) { XDestroyImage(bitmap_p); XDestroyWindow(dpy_p, win_p); XCloseDisplay(dpy_p); } static void init_x11(int width, int height, unsigned *buffer) { /* Attempt to open the display */ dpy_p = XOpenDisplay(NULL); /* Failure */ if (!dpy_p) exit(0); unsigned long white = WhitePixel(dpy_p, DefaultScreen(dpy_p)); unsigned long black = BlackPixel(dpy_p, DefaultScreen(dpy_p)); win_p = XCreateSimpleWindow(dpy_p, DefaultRootWindow(dpy_p), 0, 0, width, height, 0, black, white); /* We want to be notified when the window appears */ XSelectInput(dpy_p, win_p, StructureNotifyMask); /* Make it appear */ XMapWindow(dpy_p, win_p); XTextProperty tp; char name[128] = "Mandelbrot - StarPU"; char *n = name; Status st = XStringListToTextProperty(&n, 1, &tp); if (st) XSetWMName(dpy_p, win_p, &tp); /* Wait for the MapNotify event */ XFlush(dpy_p); int depth = DefaultDepth(dpy_p, DefaultScreen(dpy_p)); Visual *visual = DefaultVisual(dpy_p, DefaultScreen(dpy_p)); /* Make bitmap */ bitmap_p = XCreateImage(dpy_p, visual, depth, ZPixmap, 0, (char *)buffer, width, height, 32, 0); /* Init GC */ gc_p = XCreateGC(dpy_p, win_p, 0, NULL); XSetForeground(dpy_p, gc_p, black); XSelectInput(dpy_p, win_p, ExposureMask | KeyPressMask | StructureNotifyMask); Atom wmDeleteMessage; wmDeleteMessage = XInternAtom(dpy_p, "WM_DELETE_WINDOW", False); XSetWMProtocols(dpy_p, win_p, &wmDeleteMessage, 1); Left_p = XStringToKeysym ("Left"); Right_p = XStringToKeysym ("Right"); Up_p = XStringToKeysym ("Up"); Down_p = XStringToKeysym ("Down"); Alt_p = XStringToKeysym ("Alt"); } static int handle_events(void) { XEvent event; XNextEvent(dpy_p, &event); if (event.type == KeyPress) { KeySym key; char text[255]; XLookupString(&event.xkey,text,255,&key,0); if (key == Left_p) { double widthX = rightX_p - leftX_p; leftX_p -= 0.25*widthX; rightX_p -= 0.25*widthX; } else if (key == Right_p) { double widthX = rightX_p - leftX_p; leftX_p += 0.25*widthX; rightX_p += 0.25*widthX; } else if (key == Up_p) { double heightY = topY_p - bottomY_p; topY_p += 0.25*heightY; bottomY_p += 0.25*heightY; } else if (key == Down_p) { double heightY = topY_p - bottomY_p; topY_p -= 0.25*heightY; bottomY_p -= 0.25*heightY; } else { double widthX = rightX_p - leftX_p; double heightY = topY_p - bottomY_p; if (text[0] == '-') { /* Zoom out */ leftX_p -= 0.125*widthX; rightX_p += 0.125*widthX; topY_p += 0.125*heightY; bottomY_p -= 0.125*heightY; } else if (text[0] == '+') { /* Zoom in */ leftX_p += 0.125*widthX; rightX_p -= 0.125*widthX; topY_p -= 0.125*heightY; bottomY_p += 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_p), &leftX_p); clSetKernelArg(kernel, 2, sizeof(topY_p), &topY_p); clSetKernelArg(kernel, 3, sizeof(stepX), &stepX); clSetKernelArg(kernel, 4, sizeof(stepY), &stepY); clSetKernelArg(kernel, 5, sizeof(maxIt_p), &maxIt_p); clSetKernelArg(kernel, 6, sizeof(iby), &iby); clSetKernelArg(kernel, 7, sizeof(block_size), &block_size); clSetKernelArg(kernel, 8, sizeof(width_p), &width_p); unsigned dim = 16; size_t local[2] = {dim, 1}; size_t global[2] = {width_p, 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_p; ix++) { double cx = leftX_p + ix * stepX; double cy = topY_p - iy * stepY; /* Z = X+I*Y */ double x = 0; double y = 0; int it; for (it = 0; it < maxIt_p; 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_p] = (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_p; ix++) { double cx = leftX_p + ix * stepX; double cy = topY_p - iy * stepY; /* Z = X+I*Y */ double x = 0; double y = 0; int it; for (it = 0; it < maxIt_p; 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_p] = (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_p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-height") == 0) { char *argptr; height_p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks_p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-niter") == 0) { char *argptr; niter_p = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-pos") == 0) { int ret = sscanf(argv[++i], "%lf:%lf:%lf:%lf", &leftX_p, &rightX_p, &bottomY_p, &topY_p); assert(ret == 4); } if (strcmp(argv[i], "-demo") == 0) { demo_p = 1; leftX_p = -50.22749575062760; rightX_p = 48.73874621262927; topY_p = -49.35016705749115; bottomY_p = 49.64891691946615; } if (strcmp(argv[i], "-demozoom") == 0) { char *argptr; demozoom_p = strtof(argv[++i], &argptr); } if (strcmp(argv[i], "-no-x11") == 0) { #ifdef STARPU_HAVE_X11 use_x11_p = 0; #endif } if (strcmp(argv[i], "-spmd") == 0) { use_spmd_p = 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_p) { conf.sched_policy_name = "peager"; } ret = starpu_init(&conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned *buffer; starpu_malloc((void **)&buffer, height_p*width_p*sizeof(unsigned)); #ifdef STARPU_HAVE_X11 if (use_x11_p) init_x11(width_p, height_p, buffer); #endif int block_size = height_p/nblocks_p; STARPU_ASSERT((height_p % nblocks_p) == 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_p]; int iby; for (iby = 0; iby < nblocks_p; iby++) { unsigned *data = &buffer[iby*block_size*width_p]; starpu_vector_data_register(&block_handles[iby], STARPU_MAIN_RAM, (uintptr_t)data, block_size*width_p, sizeof(unsigned)); } unsigned iter = 0; double start, end; start = starpu_timing_now(); while (niter_p-- != 0) { double stepX = (rightX_p - leftX_p)/width_p; double stepY = (topY_p - bottomY_p)/height_p; /* 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_p]; starpu_iteration_push(niter_p); for (iby = 0; iby < nblocks_p; iby++) { per_block_cnt[iby] = 0; int *pcnt = &per_block_cnt[iby]; ret = starpu_task_insert(use_spmd_p?&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_p)*nblocks_p + iby, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } for (iby = 0; iby < nblocks_p; iby++) { #ifdef STARPU_HAVE_X11 if (use_x11_p) { starpu_data_acquire(block_handles[iby], STARPU_R); XPutImage(dpy_p, win_p, gc_p, bitmap_p, 0, iby*block_size, 0, iby*block_size, width_p, block_size); starpu_data_release(block_handles[iby]); } #endif } starpu_iteration_pop(); if (demo_p) { /* Zoom in */ double zoom_factor = demozoom_p; double widthX = rightX_p - leftX_p; double heightY = topY_p - bottomY_p; 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_p = -50.22749575062760; rightX_p = 48.73874621262927; topY_p = -49.35016705749115; bottomY_p = 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_p += (zoom_factor/2)*widthX; rightX_p -= (zoom_factor/2)*widthX; topY_p -= (zoom_factor/2)*heightY; bottomY_p += (zoom_factor/2)*heightY; } } #ifdef STARPU_HAVE_X11 else if (use_x11_p && handle_events()) break; #endif } #ifdef STARPU_HAVE_X11 if (use_x11_p) exit_x11(); #endif for (iby = 0; iby < nblocks_p; iby++) starpu_data_unregister(block_handles[iby]); /* starpu_data_free_pinned_if_possible(buffer); */ starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/matvecmult/000077500000000000000000000000001413463044200177615ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/matvecmult/matvecmult.c000066400000000000000000000152561413463044200223170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args) { (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]); int ld = STARPU_MATRIX_GET_LD(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); err |= clSetKernelArg(kernel, n++, sizeof(ld), (void*)&ld); 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(void) { struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 0; conf.ncuda = 0; conf.nmic = 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.3.9+dfsg/examples/matvecmult/matvecmult_kernel.cl000066400000000000000000000017011413463044200240210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, int ld) { const int i = get_global_id(0); if (i < m) { float val = 0; int j; for (j = 0; j < n; j++) val += A[i*ld+j] * X[j]; Y[i] = val; } } starpu-1.3.9+dfsg/examples/mlr/000077500000000000000000000000001413463044200163725ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/mlr/mlr.c000066400000000000000000000131321413463044200173300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 use multiple linear regression models. First, there is mlr_codelet__init codelet for which we know the parameters, but not the their exponents and relations. This tasks should be benchmarked and analyzed to find the model, using "tools/starpu_mlr_analysis" script as a template. For the second (codelet cl_model_final), it is assumed that the analysis has already been performed and that the duration of the codelet mlr_codelet_final will be computed using the following equation: T = a + b * (M^2*N) + c * (N^3*K) where M, N, K are the parameters of the task, exponents are coming from model->combinations[..][..] and finally a, b, c are coefficients which mostly depend on the machine speed. These coefficients are going to be automatically computed using least square method. */ #include #include #include #include #ifdef STARPU_QUICK_CHECK #define NTASKS 10 #else #define NTASKS 1000 #endif static long sum; /* Performance function of the task, which is in this case very simple, as the parameter values just need to be written in the array "parameters" */ static void cl_params(struct starpu_task *task, double *parameters) { int m, n, k; int* vector_mn; vector_mn = (int*)STARPU_VECTOR_GET_PTR(task->interfaces[0]); m = vector_mn[0]; n = vector_mn[1]; starpu_codelet_unpack_args(task->cl_arg, &k); parameters[0] = m; parameters[1] = n; parameters[2] = k; } /* Function of the task that will be executed. In this case running dummy cycles, just to make sure task duration is significant */ void cpu_func(void *buffers[], void *cl_arg) { long i; int m,n,k; int* vector_mn; vector_mn = (int*)STARPU_VECTOR_GET_PTR(buffers[0]); m = vector_mn[0]; n = vector_mn[1]; starpu_codelet_unpack_args(cl_arg, &k); for(i=0; i < (long) (m*m*n); i++) sum+=i; for(i=0; i < (long) (n*n*n*k); i++) sum+=i; } /* ############################################ */ /* Start of the part specific to multiple linear regression perfmodels */ /* Defining perfmodel, number of parameters and their names Initially application developer only knows these parameters. The execution of this codelet will generate traces that can be analyzed using "tools/starpu_mlr_analysis" as a template to obtain the parameters combinations and exponents. */ static const char * parameters_names[] = { "M", "N", "K", }; static struct starpu_perfmodel cl_model_init = { .type = STARPU_MULTIPLE_REGRESSION_BASED, .symbol = "mlr_init", .parameters = cl_params, .nparameters = 3, .parameters_names = parameters_names, }; /* Defining the equation for modeling duration of the task. The parameters combinations and exponents are computed externally offline, for example using "tools/starpu_mlr_analysis" tool as a template. */ static unsigned combi1 [3] = { 2, 1, 0 }; static unsigned combi2 [3] = { 0, 3, 1 }; static unsigned *combinations[] = { combi1, combi2 }; static struct starpu_perfmodel cl_model_final = { .type = STARPU_MULTIPLE_REGRESSION_BASED, .symbol = "mlr_final", .parameters = cl_params, .nparameters = 3, .parameters_names = parameters_names, .ncombinations = 2, .combinations = combinations, }; /* End of the part specific to multiple linear regression perfmodels */ /* ############################################ */ static struct starpu_codelet cl_init = { .cpu_funcs = { cpu_func }, .cpu_funcs_name = { "cpu_func" }, .nbuffers = 1, .modes = {STARPU_R}, .model = &cl_model_init, }; static struct starpu_codelet cl_final = { .cpu_funcs = { cpu_func }, .cpu_funcs_name = { "cpu_func" }, .nbuffers = 1, .modes = {STARPU_R}, .model = &cl_model_final, }; int main(void) { /* Initialization */ unsigned i; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; sum=0; int* vector_mn = calloc(2, sizeof(int)); starpu_data_handle_t vector_mn_handle; starpu_vector_data_register(&vector_mn_handle, STARPU_MAIN_RAM, (uintptr_t)vector_mn, 2, sizeof(int)); /* Giving pseudo-random values to the M,N,K parameters and inserting tasks */ for (i = 0; i < 42; i++) { int j; int m,n,k; m = (int) ((rand() % 10)+1); n = (int) ((rand() % 10)+1); k = (int) ((rand() % 10)+1); /* To illustrate the usage, M and N are stored in a data handle */ starpu_data_acquire(vector_mn_handle, STARPU_W); vector_mn[0] = m; vector_mn[1] = n; starpu_data_release(vector_mn_handle); for (j = 0; j < NTASKS; j++) { starpu_insert_task(&cl_init, STARPU_R, vector_mn_handle, STARPU_VALUE, &k, sizeof(int), 0); starpu_insert_task(&cl_final, STARPU_R, vector_mn_handle, STARPU_VALUE, &k, sizeof(int), 0); } } starpu_data_unregister(vector_mn_handle); free(vector_mn); starpu_shutdown(); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; starpu_perfmodel_dump_xml(stdout, &cl_model_final); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/mult/000077500000000000000000000000001413463044200165615ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/mult/dgemm.c000066400000000000000000000013301413463044200200130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/mult/double.h000066400000000000000000000017671413463044200202170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 EPSILON 0.000000000001 #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.3.9+dfsg/examples/mult/sgemm.c000066400000000000000000000013301413463044200200320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/mult/sgemm.sh000077500000000000000000000071371413463044200202400ustar00rootroot00000000000000#!/bin/sh -x # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 # Testing another specific scheduler, no need to run this [ -z "$STARPU_SCHED" -o "$STARPU_SCHED" = dmdas ] || exit 77 # XXX: Also see tests/overlap/overlap.sh set -e PREFIX=$(dirname $0) rm -rf $PREFIX/sgemm.traces mkdir -p $PREFIX/sgemm.traces if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/sgemm # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/sgemm" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/sgemm fi export STARPU_FXT_PREFIX=$PREFIX/sgemm.traces STARPU_SCHED=dmdas $PREFIX/sgemm -check if [ -x $PREFIX/../../tools/starpu_fxt_tool ]; then $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_plot -s starpu_sgemm_gemm -i $STARPU_FXT_PREFIX/prof_file_${USER}_0 [ -f starpu_starpu_sgemm_gemm.gp -a -f starpu_starpu_sgemm_gemm.data -a -f starpu_starpu_sgemm_gemm.data ] # Generate paje, dag, data, etc. $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_tool -memory-states -label-deps -i $STARPU_FXT_PREFIX/prof_file_${USER}_0 $PREFIX/../../tools/starpu_paje_sort paje.trace ! type pj_dump || pj_dump -e 0 < paje.trace $PREFIX/../../tools/starpu_codelet_profile distrib.data starpu_sgemm_gemm [ -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 \) ] $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_data_trace $STARPU_FXT_PREFIX/prof_file_${USER}_0 starpu_sgemm_gemm [ -f data_trace.gp ] $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_stats -i $STARPU_FXT_PREFIX/prof_file_${USER}_0 $STARPU_LAUNCH $PREFIX/../../tools/starpu_tasks_rec_complete tasks.rec tasks2.rec python3 $PREFIX/../../tools/starpu_trace_state_stats.py trace.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.starpu_sgemm_gemm.0.492beed5.33177600.pdf ] || true if [ -x $PREFIX/../../tools/starpu_replay ]; then $STARPU_LAUNCH $PREFIX/../../tools/starpu_replay tasks.rec fi [ ! -x $PREFIX/../../tools/starpu_perfmodel_recdump ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_recdump tasks.rec -o perfs2.rec [ -f perfs2.rec ] fi [ ! -x $PREFIX/../../tools/starpu_perfmodel_display ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_display -s starpu_sgemm_gemm [ ! -x $PREFIX/../../tools/starpu_perfmodel_display ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_display -x -s starpu_sgemm_gemm [ ! -x $PREFIX/../../tools/starpu_perfmodel_recdump ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_recdump -o perfs.rec [ -f perfs.rec ] starpu-1.3.9+dfsg/examples/mult/simple.h000066400000000000000000000017571413463044200202350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 EPSILON 0.000001 #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.3.9+dfsg/examples/mult/xgemm.c000066400000000000000000000272141413463044200200500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2017 Erwan Leria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #ifdef STARPU_HAVE_BLAS #include #endif #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) #ifdef STARPU_HAVE_BLAS static int 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 < EPSILON*xdim*ydim*zdim) { FPRINTF(stderr, "Results are OK\n"); return 0; } 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]); return 1; } } #endif 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[], void *arg) { (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 #ifdef STARPU_HAVE_BLAS void cpu_mult(void *descr[], void *arg) { (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); } } #endif static struct starpu_perfmodel starpu_gemm_model = { .type = STARPU_HISTORY_BASED, .symbol = STARPU_GEMM_STR(gemm) }; static struct starpu_codelet cl = { #ifdef STARPU_HAVE_BLAS .type = STARPU_SEQ, /* changed to STARPU_SPMD if -spmd is passed */ .max_parallelism = INT_MAX, .cpu_funcs = {cpu_mult}, .cpu_funcs_name = {"cpu_mult"}, #endif #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; if (nslicesx == 0) { fprintf(stderr, "the number of blocks in X cannot be 0!\n"); exit(EXIT_FAILURE); } if (nslicesy == 0) { fprintf(stderr, "the number of blocks in Y cannot be 0!\n"); exit(EXIT_FAILURE); } } else if (strcmp(argv[i], "-nblocksx") == 0) { char *argptr; nslicesx = strtol(argv[++i], &argptr, 10); if (nslicesx == 0) { fprintf(stderr, "the number of blocks in X cannot be 0!\n"); exit(EXIT_FAILURE); } } else if (strcmp(argv[i], "-nblocksy") == 0) { char *argptr; nslicesy = strtol(argv[++i], &argptr, 10); if (nslicesy == 0) { fprintf(stderr, "the number of blocks in Y cannot be 0!\n"); exit(EXIT_FAILURE); } } else if (strcmp(argv[i], "-x") == 0) { char *argptr; xdim = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-xy") == 0) { char *argptr; xdim = ydim = 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] [-xy n] [-z z] [-size size] [-iter iter] [-bound] [-check] [-spmd]\n", argv[0]); fprintf(stderr,"Currently selected: %ux%u * %ux%u and %ux%u blocks (size %ux%u length %u), %u iterations\n", zdim, ydim, xdim, zdim, nslicesx, nslicesy, xdim / nslicesx, ydim / nslicesy, zdim, niter); exit(EXIT_SUCCESS); } else { fprintf(stderr,"Unrecognized option %s\n", 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) { check = 0; 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); #ifdef STARPU_HAVE_BLAS #ifndef STARPU_SIMGRID if (check) ret = check_output(); #endif #endif 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.3.9+dfsg/examples/native_fortran/000077500000000000000000000000001413463044200206215ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/native_fortran/nf_codelets.f90000066400000000000000000000074321413463044200234340ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/native_fortran/nf_compute.f90000066400000000000000000000105201413463044200232760ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! Copyright (C) 2015 ONERA ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/native_fortran/nf_dynbuf.f90000066400000000000000000000054401413463044200231160ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/native_fortran/nf_dynbuf_cl.f90000066400000000000000000000027621413463044200236000ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/native_fortran/nf_example.f90000066400000000000000000000141021413463044200232550ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! Copyright (C) 2015 ONERA ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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 REAL(KIND=C_DOUBLE),TARGET :: flops 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) flops = elt%Ng * ( (elt%Np * numpar%Neq_max * 2) + 1 + elt%Np * numpar%Neq_max) 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, & FSTARPU_FLOPS, c_loc(flops), & 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.3.9+dfsg/examples/native_fortran/nf_matrix.f90000066400000000000000000000072031413463044200231320ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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(void) { 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.3.9+dfsg/examples/pi/000077500000000000000000000000001413463044200162105ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/pi/pi.c000066400000000000000000000137261413463044200167750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (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) { (void)task; (void)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.3.9+dfsg/examples/pi/pi.h000066400000000000000000000016061413463044200167740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/pi/pi_kernel.cu000066400000000000000000000107521413463044200205160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cures = cudaGetLastError(); if (cures != cudaSuccess) STARPU_CUDA_REPORT_ERROR(cures); /* 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 = cudaGetLastError(); if (cures != cudaSuccess) STARPU_CUDA_REPORT_ERROR(cures); cures = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (cures) STARPU_CUDA_REPORT_ERROR(cures); cudaFree(per_block_cnt); cudaFree(random_numbers); } starpu-1.3.9+dfsg/examples/pi/pi_redux.c000066400000000000000000000255461413463044200202070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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) { (void)arg; #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: /* 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) { (void)task; (void)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) { (void)cl_arg; 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) { (void)cl_arg; 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) { (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) { (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) { (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) { (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 (fabs(pi_approx - PI) > 1.0) return 1; return 0; } starpu-1.3.9+dfsg/examples/pi/pi_redux_kernel.cu000066400000000000000000000075331413463044200217300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cures = cudaGetLastError(); if (cures != cudaSuccess) STARPU_CUDA_REPORT_ERROR(cures); /* 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 = cudaGetLastError(); if (cures != cudaSuccess) STARPU_CUDA_REPORT_ERROR(cures); cures = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (cures) STARPU_CUDA_REPORT_ERROR(cures); cudaFree(per_block_cnt); } starpu-1.3.9+dfsg/examples/pipeline/000077500000000000000000000000001413463044200174055ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/pipeline/pipeline.c000066400000000000000000000152711413463044200213640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (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) { (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.; cublasStatus_t status = cublasSaxpy(starpu_cublas_get_local_handle(), n, &alpha, x, 1, y, 1); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); } #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 *arg) { (void)arg; 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) { (void)arg; float *x = (float *) STARPU_VECTOR_GET_PTR(descr[0]); int n = STARPU_VECTOR_GET_NX(descr[0]); float y; cublasStatus_t status = cublasSasum(starpu_cublas_get_local_handle(), n, x, 1, &y); if (status != CUBLAS_STATUS_SUCCESS) STARPU_CUBLAS_REPORT_ERROR(status); 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 }; static void release_sem(void *arg) { sem_post(arg); }; 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_NFREE, release_sem, &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.3.9+dfsg/examples/ppm_downscaler/000077500000000000000000000000001413463044200206155ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/ppm_downscaler/ppm_downscaler.c000066400000000000000000000115221413463044200237770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/ppm_downscaler/ppm_downscaler.h000066400000000000000000000016301413463044200240030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/ppm_downscaler/yuv_downscaler.c000066400000000000000000000226031413463044200240300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 { strncpy(filename_in, filename_in_default, 1023); strncpy(filename_out, filename_out_default, 1023); } } #define FRAMESIZE sizeof(struct yuv_frame) #define NEW_FRAMESIZE sizeof(struct yuv_new_frame) void ds_kernel_cpu(void *descr[], void *arg) { (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"); if (!f_in) { fprintf(stderr, "couldn't open input file %s\n", filename_in); exit(EXIT_FAILURE); } /* allocate room for an output buffer */ FILE *f_out = fopen(filename_out, "w+"); if (!f_out) { fprintf(stderr, "couldn't open output file %s\n", filename_out); exit(EXIT_FAILURE); } 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]); } free(frame_y_handle); free(frame_u_handle); free(frame_v_handle); free(new_frame_y_handle); free(new_frame_u_handle); free(new_frame_v_handle); /* 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.3.9+dfsg/examples/ppm_downscaler/yuv_downscaler.h000066400000000000000000000021251413463044200240320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/profiling/000077500000000000000000000000001413463044200175715ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/profiling/profiling.c000066400000000000000000000106731413463044200217350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(void *descr[], void *arg) { (void)descr; (void)arg; 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); if (niter) { 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, "\t%d task(s)\n", worker_info.executed_tasks); 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.3.9+dfsg/examples/reductions/000077500000000000000000000000001413463044200177575ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/reductions/dot_product.c000066400000000000000000000276111413463044200224600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (void)task; (void)nimpl; enum starpu_worker_archtype type = starpu_worker_get_type(workerid); if (type == STARPU_CPU_WORKER || type == STARPU_OPENCL_WORKER || type == STARPU_MIC_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) { (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) { (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 *cl_arg) { (void)cl_arg; 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) { (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) { (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=1; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); 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) { (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) { (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 *cl_arg) { (void)cl_arg; 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=1; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); 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(void) { 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 { FPRINTF(stderr, "ERROR: fabs(%e - %e) >= %e * 1e-6\n", reference_dot, _dot, reference_dot); 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.3.9+dfsg/examples/reductions/dot_product.h000066400000000000000000000014271413463044200224620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/reductions/dot_product_kernels.cu000066400000000000000000000023551413463044200243660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/reductions/dot_product_opencl_kernels.cl000066400000000000000000000022331413463044200257100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { *dota += *dotb; } __kernel void _dot_opencl(__global float *x, __global float *y, __global DOT_TYPE *dot, unsigned n) { /* FIXME: real parallel implementation */ unsigned i; __local double tmp; tmp = 0.0; for (i = 0; i < n ; i++) tmp += x[i]*y[i]; *dot += tmp; } starpu-1.3.9+dfsg/examples/reductions/minmax_reduction.c000066400000000000000000000131241413463044200234710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (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) { (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) { (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(void) { 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.3.9+dfsg/examples/sched_ctx/000077500000000000000000000000001413463044200175445ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/sched_ctx/axpy_partition_gpu.cu000066400000000000000000000045771413463044200240370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 "axpy_partition_gpu.h" #include //This code demonstrates how to transform a kernel to execute on a given set of GPU SMs. // Original kernel __global__ void saxpy(int n, float a, float *x, float *y) { int i = blockIdx.x*blockDim.x + threadIdx.x; if (i>>(__P_HKARGS,n,a,x,y); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/sched_ctx/axpy_partition_gpu.h000066400000000000000000000107071413463044200236470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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. */ #pragma once __device__ static uint get_smid(void) { #if defined(__CUDACC__) uint ret; asm("mov.u32 %0, %smid;" : "=r"(ret) ); return ret; #else return 0; #endif } #define __P_HKARGS dimGrid, active_blocks ,occupancy, block_assignment_d, mapping_start #define __P_KARGS dim3 blocks, int active_blocks, int occupancy, unsigned int* block_assignment, int mapping_start #define __P_DARGS blocks,blockid #define __P_BEGIN \ __shared__ unsigned int block_start; \ int smid = get_smid(); \ if(threadIdx.x == 0 && threadIdx.y == 0 && threadIdx.z == 0) \ { \ block_start = atomicDec(&block_assignment[smid],0xDEADBEEF); \ } \ __syncthreads(); \ \ if(block_start > active_blocks) \ { \ return; \ } #define __P_LOOPXY \ dim3 blockid; \ blockid.z = 0; \ \ int gridDim_sum = blocks.x*blocks.y; \ int startBlock = block_start + (smid - mapping_start) * occupancy; \ \ for(int blockid_sum = startBlock; blockid_sum < gridDim_sum; blockid_sum +=active_blocks) \ { \ blockid.x = blockid_sum % blocks.x; \ blockid.y = blockid_sum / blocks.x; #define __P_LOOPEND } // Needed if shared memory is used #define __P_LOOPEND_SAFE __syncthreads(); } #define __P_LOOPX \ dim3 blockid; \ blockid.z = 0; \ blockid.y = 0; \ int gridDim_sum = blocks.x; \ int startBlock = (smid-mapping_start) + block_start*(active_blocks/occupancy); \ \ for(int blockid_sum = startBlock; blockid_sum < gridDim_sum; blockid_sum +=active_blocks) \ { \ blockid.x = blockid_sum; // int startBlock = block_start + (smid - mapping_start) * occupancy; \ //////////// HOST side functions template static void buildPartitionedBlockMapping(F cudaFun, int threads, int shmem, int mapping_start, int allocation, int &width, int &active_blocks, unsigned int *block_assignment_d,cudaStream_t current_stream = #ifdef cudaStreamPerThread cudaStreamPerThread #else NULL #endif ) { int occupancy; int nb_SM = 13; //TODO: replace with call int mapping_end = mapping_start + allocation - 1; // exclusive unsigned int block_assignment[15]; #if CUDART_VERSION >= 6050 cudaOccupancyMaxActiveBlocksPerMultiprocessor(&occupancy,cudaFun,threads,shmem); #else occupancy = 4; #endif width = occupancy * nb_SM; // Physical wrapper grid size. Fits GPU exactly active_blocks = occupancy*allocation; // The total number of blocks doing work for(int i = 0; i < mapping_start; i++) block_assignment[i] = (unsigned) -1; for(int i = mapping_start; i <= mapping_end; i++) { block_assignment[i] = occupancy - 1; } for(int i = mapping_end+1; i < nb_SM; i++) block_assignment[i] = (unsigned) -1; cudaMemcpyAsync((void*)block_assignment_d,block_assignment,sizeof(block_assignment),cudaMemcpyHostToDevice, current_stream); //cudaMemcpy((void*)block_assignment_d,block_assignment,sizeof(block_assignment),cudaMemcpyHostToDevice); //cudaDeviceSynchronize(); } #define __P_HOSTSETUP(KERNEL,GRIDDIM,BLOCKSIZE,SHMEMSIZE,MAPPING_START,MAPPING_END,STREAM) \ unsigned int* block_assignment_d; cudaMalloc((void**) &block_assignment_d,15*sizeof(unsigned int)); \ int width = 0; \ int active_blocks = 0; \ buildPartitionedBlockMapping(KERNEL,BLOCKSIZE,SHMEMSIZE,(MAPPING_START),(MAPPING_END)-(MAPPING_START), \ width, active_blocks, block_assignment_d,STREAM); \ int occupancy = active_blocks/((MAPPING_END)-(MAPPING_START)); \ dim3 dimGrid = (GRIDDIM);\ int mapping_start = (MAPPING_START); starpu-1.3.9+dfsg/examples/sched_ctx/dummy_sched_with_ctx.c000066400000000000000000000135461413463044200241330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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) { 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_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", .worker_type = STARPU_WORKER_LIST, }; void dummy_func(void *descr[], void *arg) { (void)descr; (void)arg; } 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(void) { 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.3.9+dfsg/examples/sched_ctx/gpu_partition.c000066400000000000000000000141751413463044200226040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 & run axpy on them. */ #include #include #include #include #include #include #define N 512*512 #define NITER 100 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define EPSILON 1e-6 float *_vec_x[NITER], *_vec_y[NITER]; float _alpha = 3.41; /* descriptors for StarPU */ starpu_data_handle_t _handle_y[NITER], _handle_x[NITER]; void axpy_cpu(void *descr[], void *arg) { float alpha = *((float *)arg); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); float *block_x = (float *)STARPU_VECTOR_GET_PTR(descr[0]); float *block_y = (float *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned i; for( i = 0; i < n; i++) block_y[i] = alpha * block_x[i] + block_y[i]; } #ifdef STARPU_USE_CUDA extern void cuda_axpy(void *descr[], 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 = {cuda_axpy}, #elif defined(STARPU_SIMGRID) .cuda_funcs = {(void*)1}, #endif .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .name = "axpy", .model = &axpy_model }; static int check(int niter) { int i; for (i = 0; i < N; i++) { float expected_value = _alpha * _vec_x[niter][i] + 4.0; if (fabs(_vec_y[niter][i] - expected_value) > expected_value * EPSILON) { FPRINTF(stderr,"[error for iter %d, indice %d], obtained value %f NOT expected value %f (%f*%f+%f)\n", niter, i, _vec_y[niter][i], expected_value, _alpha, _vec_x[niter][i], 4.0); return EXIT_FAILURE; } } return EXIT_SUCCESS; } int main(void) { int ret, exit_value = 0; int iter; int ncuda = 0; int gpu_devid = -1; #ifdef STARPU_DEVEL #warning temporary fix: skip test as cuda computation fails #endif return 77; #ifndef STARPU_HAVE_SETENV return 77; #else /* Have separate threads for streams */ setenv("STARPU_CUDA_THREAD_PER_WORKER", "1", 1); setenv("STARPU_NWORKER_PER_CUDA", "2", 1); setenv("STARPU_NCUDA", "1", 1); #endif /* Initialize StarPU */ ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_CUDA ncuda = starpu_worker_get_devids(STARPU_CUDA_WORKER, &gpu_devid, 1); FPRINTF(stderr, "gpu_devid found %d \n", gpu_devid); #endif if (ncuda == 0) { starpu_shutdown(); return 77; } for(iter = 0; iter < NITER; iter++) { /* This is equivalent to vec_a = malloc(N*sizeof(float)); vec_b = malloc(N*sizeof(float)); */ starpu_malloc((void **)&_vec_x[iter], N*sizeof(float)); assert(_vec_x[iter]); starpu_malloc((void **)&_vec_y[iter], N*sizeof(float)); assert(_vec_y[iter]); unsigned i; for (i = 0; i < N; i++) { _vec_x[iter][i] = 1.0f; /*(float)starpu_drand48(); */ _vec_y[iter][i] = 4.0f; /*(float)starpu_drand48(); */ } /* Declare the data to StarPU */ starpu_vector_data_register(&_handle_x[iter], STARPU_MAIN_RAM, (uintptr_t)_vec_x[iter], N, sizeof(float)); starpu_vector_data_register(&_handle_y[iter], STARPU_MAIN_RAM, (uintptr_t)_vec_y[iter], N, sizeof(float)); } double start; double end; #ifdef STARPU_USE_CUDA unsigned nworkers = starpu_worker_get_count(); int stream_workerids[nworkers]; int nstreams = starpu_worker_get_stream_workerids(gpu_devid, stream_workerids, STARPU_CUDA_WORKER); int s; for(s = 0; s < nstreams; s++) FPRINTF(stderr, "stream w %d \n", stream_workerids[s]); int ncpus = starpu_cpu_worker_get_count(); int workers[ncpus+nstreams]; starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, workers, ncpus); unsigned sched_ctxs[nstreams]; int nsms[nstreams]; nsms[0] = 6; nsms[1] = 7; for(s = 0; s < nstreams; s++) { sched_ctxs[s] = starpu_sched_ctx_create(&stream_workerids[s], 1, "subctx", STARPU_SCHED_CTX_CUDA_NSMS, nsms[s], 0); workers[ncpus+s] = stream_workerids[s]; } unsigned sched_ctx1 = starpu_sched_ctx_create(workers, ncpus+nstreams, "ctx1", STARPU_SCHED_CTX_SUB_CTXS, sched_ctxs, nstreams, STARPU_SCHED_CTX_POLICY_NAME, "dmdas", 0); FPRINTF(stderr, "parent ctx %u\n", sched_ctx1); starpu_sched_ctx_set_context(&sched_ctx1); #endif start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { struct starpu_task *task = starpu_task_create(); task->cl = &axpy_cl; task->cl_arg = &_alpha; task->cl_arg_size = sizeof(_alpha); task->handles[0] = _handle_x[iter]; task->handles[1] = _handle_y[iter]; 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: for(iter = 0; iter < NITER; iter++) { starpu_data_unregister(_handle_x[iter]); starpu_data_unregister(_handle_y[iter]); } end = starpu_timing_now(); double timing = end - start; FPRINTF(stderr, "timing -> %2.2f us %2.2f MB/s\n", timing, 3*N*sizeof(float)/timing); // FPRINTF(stderr, "AFTER y[0] = %2.2f (ALPHA = %2.2f)\n", _vec_y[iter][0], _alpha); if (exit_value != 77) { for(iter = 0; iter < NITER; iter++) { exit_value = check(iter); if(exit_value != EXIT_SUCCESS) break; } } for(iter = 0; iter < NITER; iter++) { starpu_free((void *)_vec_x[iter]); starpu_free((void *)_vec_y[iter]); } /* Stop StarPU */ starpu_shutdown(); return exit_value; } starpu-1.3.9+dfsg/examples/sched_ctx/nested_sched_ctxs.c000066400000000000000000000135511413463044200234060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *arg) { (void)descr; unsigned sched_ctx = (uintptr_t)arg; int t = parallel_code(sched_ctx); if (sched_ctx > 0 && sched_ctx < 3) { STARPU_ATOMIC_ADD(&tasks_executed[sched_ctx-1], t); } //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(void) { 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 = nprocs3; int nprocs5 = nprocs2/2; int nprocs6 = nprocs5; 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*NTASKS); printf("ctx%u: tasks starpu executed %d out of %d\n", sched_ctx2, tasks_executed[1], NTASKS*NTASKS); #ifdef STARPU_USE_CPU free(procs1); free(procs2); #endif starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/sched_ctx/parallel_code.c000066400000000000000000000053421413463044200225020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_USE_CPU #include #ifdef STARPU_QUICK_CHECK #define NTASKS 4 #else #define NTASKS 10 #endif int parallel_code(unsigned *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); */ omp_set_num_threads(ncpuids); #pragma omp parallel { 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++) { #pragma omp atomic t++; } } free(cpuids); return t; } void *th(void* p) { unsigned* sched_ctx = (unsigned*)p; void* ret; ret = starpu_sched_ctx_exec_parallel_code((void*)parallel_code, p, *sched_ctx); pthread_exit(ret); } int main(void) { int ret; void* tasks_executed; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int nprocs1; int *procs1; unsigned ncpus = starpu_cpu_worker_get_count(); procs1 = (int*)malloc(ncpus*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, ncpus); nprocs1 = ncpus; unsigned sched_ctx1 = starpu_sched_ctx_create(procs1, nprocs1, "ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* This is the interesting part, we can launch a code to hijack the context and use its cores to do something else entirely thanks to this */ pthread_t mp; pthread_create(&mp, NULL, th, &sched_ctx1); pthread_join(mp, &tasks_executed); /* Finished, delete the context and print the amount of executed tasks */ starpu_sched_ctx_delete(sched_ctx1); printf("ctx%u: tasks starpu executed %ld out of %d\n", sched_ctx1, (intptr_t)tasks_executed, NTASKS); starpu_shutdown(); free(procs1); return 0; } #else /* STARPU_USE_CPU */ int main(int argc, char **argv) { /* starpu_sched_ctx_exec_parallel_code() requires a CPU worker has parallel region master */ return 77; /* STARPU_TEST_SKIPPED */ } #endif /* STARPU_USE_CPU */ starpu-1.3.9+dfsg/examples/sched_ctx/parallel_tasks_reuse_handle.c000066400000000000000000000131111413463044200254240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_QUICK_CHECK #define NTASKS 64 #define SIZE 40 #define LOOPS 4 #else #define NTASKS 100 #define SIZE 400 #define LOOPS 10 #endif #define N_NESTED_CTXS 2 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_) { fprintf(stderr, "%p: %s -->\n", (void*)pthread_self(), __func__); 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); fprintf(stderr, "%p: %s <--\n", (void*)pthread_self(), __func__); return; } void noop(void * buffers[], void * cl_arg) { (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,"prio", 0); /* Initialize nested contexts */ contexts = malloc(sizeof(struct context)*N_NESTED_CTXS); int cpus_per_context = main_context.ncpus/N_NESTED_CTXS; int i; for(i = 0; i < N_NESTED_CTXS; i++) { contexts[i].ncpus = cpus_per_context; if (i == N_NESTED_CTXS-1) contexts[i].ncpus += main_context.ncpus%N_NESTED_CTXS; contexts[i].cpus = main_context.cpus+i*cpus_per_context; } for(i = 0; i < N_NESTED_CTXS; 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 < N_NESTED_CTXS; 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; idestroy = 1; t->possibly_parallel = 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.3.9+dfsg/examples/sched_ctx/parallel_tasks_with_cluster_api.c000066400000000000000000000071611413463044200263430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #if !defined(STARPU_CLUSTER) int main(void) { return 77; } #else #ifdef STARPU_QUICK_CHECK #define NTASKS 8 #else #define NTASKS 32 #endif #define SIZE 4000 /* 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[1]); int size; starpu_codelet_unpack_args(cl_arg, &size); fprintf(stderr, "sum_cpu\n"); int i, k; #pragma omp parallel fprintf(stderr, "hello from the task %d\n", omp_get_thread_num()); for (k=0;k<10;k++) { #pragma omp parallel for for (i=0; i 6) ? 1 : 0, /* Note that this mode requires that you put a prologue callback managing this on all tasks to be taken into account. */ STARPU_PROLOGUE_CALLBACK_POP, &starpu_openmp_prologue, 0); 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); starpu_uncluster_machine(clusters); starpu_shutdown(); return 0; } #endif starpu-1.3.9+dfsg/examples/sched_ctx/prio.c000066400000000000000000000041071413463044200206630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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(void) { 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.3.9+dfsg/examples/sched_ctx/sched_ctx.c000066400000000000000000000113151413463044200216550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_HAVE_VALGRIND_H #include #endif #ifdef STARPU_QUICK_CHECK #define NTASKS 64 #else #define NTASKS 1000 #endif int tasks_executed = 0; int ctx1_tasks_executed = 0; int ctx2_tasks_executed = 0; int cpu_tasks_executed = 0; int gpu_tasks_executed = 0; static void sched_ctx_cpu_func(void *descr[], void *arg) { (void)descr; (void)arg; (void)STARPU_ATOMIC_ADD(&tasks_executed,1); (void)STARPU_ATOMIC_ADD(&ctx1_tasks_executed,1); (void)STARPU_ATOMIC_ADD(&cpu_tasks_executed,1); } static void sched_ctx2_cpu_func(void *descr[], void *arg) { (void)descr; (void)arg; (void)STARPU_ATOMIC_ADD(&tasks_executed,1); (void)STARPU_ATOMIC_ADD(&ctx2_tasks_executed,1); (void)STARPU_ATOMIC_ADD(&cpu_tasks_executed,1); } static void sched_ctx2_cuda_func(void *descr[], void *arg) { (void)descr; (void)arg; (void)STARPU_ATOMIC_ADD(&tasks_executed,1); (void)STARPU_ATOMIC_ADD(&ctx2_tasks_executed,1); (void)STARPU_ATOMIC_ADD(&gpu_tasks_executed,1); } 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_ctx2_cpu_func}, .cuda_funcs = {sched_ctx2_cuda_func}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(void) { int ntasks = NTASKS; int ret; unsigned ncuda = 0; int nprocs1 = 0; int nprocs2 = 0; int procs1[STARPU_NMAXWORKERS], procs2[STARPU_NMAXWORKERS]; char *sched = getenv("STARPU_SCHED"); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) ntasks = 8; #endif #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*/ 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); 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); printf("tasks executed on ctx1: %d\n", ctx1_tasks_executed); printf("tasks executed on ctx2: %d\n", ctx2_tasks_executed); printf("tasks executed on CPU: %d\n", cpu_tasks_executed); printf("tasks executed on GPU: %d\n", gpu_tasks_executed); enodev: starpu_shutdown(); return nprocs1 == 0 ? 77 : 0; } starpu-1.3.9+dfsg/examples/sched_ctx/sched_ctx_delete.c000066400000000000000000000027471413463044200232100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 main(void) { int ret; int nprocs = 0; int procs[STARPU_NMAXWORKERS]; unsigned sched_ctx1, sched_ctx2; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_worker_get_count_by_type(STARPU_CPU_WORKER) == 0) { // Needs at least 1 CPU worker starpu_shutdown(); return 77; } nprocs = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, nprocs); sched_ctx1 = starpu_sched_ctx_create(procs, nprocs, "ctx1", 0); sched_ctx2 = starpu_sched_ctx_create(procs, nprocs, "ctx2", 0); starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1); starpu_sched_ctx_delete(sched_ctx1); starpu_sched_ctx_delete(sched_ctx2); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/sched_ctx/sched_ctx_empty.c000066400000000000000000000034321413463044200230740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) static void cpu_func(void *descr[], void *arg) { (void)descr; (void)arg; FPRINTF(stdout, "Hello world\n"); } static struct starpu_codelet codelet = { .cpu_funcs = {cpu_func}, .nbuffers = 0, .name = "codelet" }; int main(void) { int ret; int nprocs = 0; int procs[STARPU_NMAXWORKERS]; unsigned sched_ctx_id; ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); nprocs = starpu_cpu_worker_get_count(); // if there is no cpu, skip if (nprocs == 0) goto enodev; sched_ctx_id = starpu_sched_ctx_create(NULL, 0, "ctx", 0); starpu_sched_ctx_set_context(&sched_ctx_id); ret = starpu_task_insert(&codelet, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, nprocs); starpu_sched_ctx_add_workers(procs, nprocs, sched_ctx_id); starpu_task_wait_for_all(); starpu_sched_ctx_delete(sched_ctx_id); enodev: starpu_shutdown(); return nprocs == 0 ? 77 : 0; } starpu-1.3.9+dfsg/examples/sched_ctx/sched_ctx_without_sched_policy.c000066400000000000000000000104301413463044200261620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) reduction(+:t) { 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[], void *arg) { (void)descr; 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}, .model = NULL, .nbuffers = 0, .name = "sched_ctx" }; int main(void) { 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; #ifdef STARPU_USE_CUDA if (ncuda > 0 && nprocs1 > 1) { procs1[nprocs1-1] = procscuda[0]; } #endif /*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); starpu_sched_ctx_display_workers(sched_ctx1, stderr); starpu_sched_ctx_display_workers(sched_ctx2, stderr); 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.3.9+dfsg/examples/sched_ctx/sched_ctx_without_sched_policy_awake.c000066400000000000000000000076451413463044200273500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *arg) { (void)descr; 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(void) { 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.3.9+dfsg/examples/sched_ctx/two_cpu_contexts.c000066400000000000000000000067171413463044200233320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *cl_args) { (void)descr; 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(void) { 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; 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() { 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.3.9+dfsg/examples/sched_ctx_utils/sched_ctx_utils.h000066400000000000000000000021301413463044200243150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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.3.9+dfsg/examples/scheduler/000077500000000000000000000000001413463044200175565ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/scheduler/dummy_modular_sched.c000066400000000000000000000161701413463044200237530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_params { int verbose; }; struct dummy_sched_data { int verbose; struct starpu_task_list sched_list; starpu_pthread_mutex_t policy_mutex; }; static void dummy_deinit_data(struct starpu_sched_component * component) { struct dummy_sched_data *data = component->data; STARPU_ASSERT(starpu_task_list_empty(&data->sched_list)); if (data->verbose) fprintf(stderr, "Destroying Dummy scheduler\n"); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int dummy_push_task(struct starpu_sched_component *component, struct starpu_task *task) { struct dummy_sched_data *data = component->data; if (data->verbose) fprintf(stderr, "pushing task %p\n", task); /* 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); /* Tell below that they can now pull */ component->can_pull(component); return 0; } static struct starpu_task *dummy_pull_task(struct starpu_sched_component *component, struct starpu_sched_component *to) { struct dummy_sched_data *data = component->data; if (data->verbose) fprintf(stderr, "%p pulling for a task\n", to); #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 int dummy_can_push(struct starpu_sched_component * component, struct starpu_sched_component * to) { struct dummy_sched_data *data = component->data; int didwork = 0; if (data->verbose) fprintf(stderr, "%p tells me I can push to him\n", to); struct starpu_task *task; task = starpu_sched_component_pump_to(component, to, &didwork); if (task) { if (data->verbose) fprintf(stderr, "oops, %p couldn't take our task\n", to); /* Oops, we couldn't push everything, put back this task */ STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_task_list_push_back(&data->sched_list, task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); } else { if (data->verbose) { if (didwork) fprintf(stderr, "pushed some tasks to %p\n", to); else fprintf(stderr, "I didn't have anything for %p\n", to); } } /* There is room now */ return didwork || starpu_sched_component_can_push(component, to); } static int dummy_can_pull(struct starpu_sched_component * component) { struct dummy_sched_data *data = component->data; if (data->verbose) fprintf(stderr,"telling below they can pull\n"); return starpu_sched_component_can_pull(component); } struct starpu_sched_component *dummy_create(struct starpu_sched_tree *tree, struct dummy_sched_params *params) { struct starpu_sched_component *component = starpu_sched_component_create(tree, "dummy"); struct dummy_sched_data *data = malloc(sizeof(*data)); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); /* Create a linked-list of tasks and a condition variable to protect it */ starpu_task_list_init(&data->sched_list); data->verbose = params->verbose; component->data = data; component->push_task = dummy_push_task; component->pull_task = dummy_pull_task; component->can_push = dummy_can_push; component->can_pull = dummy_can_pull; component->deinit_data = dummy_deinit_data; return component; } static void init_dummy_sched(unsigned sched_ctx_id) { FPRINTF(stderr, "Initialising Dummy scheduler\n"); struct dummy_sched_params params = { .verbose = 0, }; starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) dummy_create, ¶ms, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO, sched_ctx_id); } static void deinit_dummy_sched(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); } static struct starpu_sched_policy dummy_sched_policy = { .init_sched = init_dummy_sched, .deinit_sched = deinit_dummy_sched, .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 = "dummy", .policy_description = "dummy modular scheduling strategy", .worker_type = STARPU_WORKER_LIST, }; void dummy_func(void *descr[], void *arg) { (void)descr; (void)arg; } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = &starpu_perfmodel_nop, .nbuffers = 0, .name = "dummy", }; int main(void) { int ntasks = NTASKS; int ret; struct starpu_conf conf; char *sched = getenv("STARPU_SCHED"); if (sched && sched[0]) /* Testing a specific scheduler, no need to run this */ return 77; 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.3.9+dfsg/examples/scheduler/dummy_sched.c000066400000000000000000000126121413463044200222250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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) { 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_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 = workers->get_next(workers, &it); starpu_wake_worker_relax_light(worker); } 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", .worker_type = STARPU_WORKER_LIST, }; void dummy_func(void *descr[], void *arg) { (void)descr; (void)arg; } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cpu_funcs_name = {"dummy_func"}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = &starpu_perfmodel_nop, .nbuffers = 0, .name = "dummy", }; int main(void) { int ntasks = NTASKS; int ret; struct starpu_conf conf; char *sched = getenv("STARPU_SCHED"); if (sched && sched[0]) /* Testing a specific scheduler, no need to run this */ return 77; 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.3.9+dfsg/examples/scheduler/heteroprio_test.c000066400000000000000000000147621413463044200231530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 making use of the heteroprio scheduler, it shows how * priorities are taken into account. */ #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) void initSchedulerCallback(unsigned sched_ctx) { // CPU uses 3 buckets #ifdef STARPU_USE_CPU if (starpu_cpu_worker_get_count()) { starpu_heteroprio_set_nb_prios(0, STARPU_CPU_IDX, 3); // It uses direct mapping idx => idx unsigned idx; for(idx = 0; idx < 3; ++idx) { starpu_heteroprio_set_mapping(sched_ctx, STARPU_CPU_IDX, idx, idx); starpu_heteroprio_set_faster_arch(sched_ctx, STARPU_CPU_IDX, idx); } } #endif #ifdef STARPU_USE_OPENCL // OpenCL is enabled and uses 2 buckets starpu_heteroprio_set_nb_prios(sched_ctx, STARPU_OPENCL_IDX, 2); // OpenCL will first look to priority 2 int prio2 = starpu_cpu_worker_get_count() ? 2 : 1; starpu_heteroprio_set_mapping(sched_ctx, STARPU_OPENCL_IDX, 0, prio2); // For this bucket OpenCL is the fastest starpu_heteroprio_set_faster_arch(sched_ctx, STARPU_OPENCL_IDX, prio2); // And CPU is 4 times slower #ifdef STARPU_USE_CPU starpu_heteroprio_set_arch_slow_factor(sched_ctx, STARPU_CPU_IDX, 2, 4.0f); #endif int prio1 = starpu_cpu_worker_get_count() ? 1 : 0; starpu_heteroprio_set_mapping(sched_ctx, STARPU_OPENCL_IDX, 1, prio1); // We let the CPU as the fastest and tell that OpenCL is 1.7 times slower starpu_heteroprio_set_arch_slow_factor(sched_ctx, STARPU_OPENCL_IDX, prio1, 1.7f); #endif } void callback_a_cpu(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; usleep(100000); FPRINTF(stderr, "[COMMUTE_LOG] callback %s\n", __FUNCTION__); fflush(stderr); } void callback_b_cpu(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; usleep(100000); FPRINTF(stderr, "[COMMUTE_LOG] callback %s\n", __FUNCTION__); fflush(stderr); } void callback_c_cpu(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; usleep(100000); FPRINTF(stderr, "[COMMUTE_LOG] callback %s\n", __FUNCTION__); fflush(stderr); } #ifdef STARPU_USE_OPENCL void callback_a_opencl(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; usleep(100000); FPRINTF(stderr, "[COMMUTE_LOG] callback %s\n", __FUNCTION__); fflush(stderr); } void callback_b_opencl(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; usleep(100000); FPRINTF(stderr, "[COMMUTE_LOG] callback %s\n", __FUNCTION__); fflush(stderr); } void callback_c_opencl(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; usleep(100000); FPRINTF(stderr, "[COMMUTE_LOG] callback %s\n", __FUNCTION__); fflush(stderr); } #endif int main(void) { int ret; struct starpu_conf conf; int ncpus, nopencls; ret = starpu_conf_init(&conf); STARPU_CHECK_RETURN_VALUE(ret, "starpu_conf_init"); assert(ret == 0); conf.sched_policy_name = "heteroprio"; conf.sched_policy_init = &initSchedulerCallback; ret = starpu_init(&conf); if (ret == -ENODEV) return 77; ncpus = starpu_cpu_worker_get_count(); nopencls = starpu_opencl_worker_get_count(); FPRINTF(stderr, "Worker = %u\n", starpu_worker_get_count()); FPRINTF(stderr, "Worker CPU = %d\n", ncpus); FPRINTF(stderr, "Worker OpenCL = %d\n", nopencls); if (ncpus + nopencls == 0) { FPRINTF(stderr, "Needs at least one CPU or OpenCL device\n"); starpu_shutdown(); return 77; } struct starpu_codelet codeleteA; { memset(&codeleteA, 0, sizeof(codeleteA)); codeleteA.nbuffers = 2; codeleteA.modes[0] = STARPU_RW; codeleteA.modes[1] = STARPU_RW; codeleteA.name = "codeleteA"; #ifdef STARPU_USE_CPU codeleteA.cpu_funcs[0] = callback_a_cpu; #endif #ifdef STARPU_USE_OPENCL codeleteA.opencl_funcs[0] = callback_a_opencl; #endif } struct starpu_codelet codeleteB; { memset(&codeleteB, 0, sizeof(codeleteB)); codeleteB.nbuffers = 2; codeleteB.modes[0] = STARPU_RW; codeleteB.modes[1] = STARPU_RW; codeleteB.name = "codeleteB"; codeleteB.cpu_funcs[0] = callback_b_cpu; #ifdef STARPU_USE_OPENCL codeleteB.opencl_funcs[0] = callback_b_opencl; #endif } struct starpu_codelet codeleteC; { memset(&codeleteC, 0, sizeof(codeleteC)); codeleteC.nbuffers = 2; codeleteC.modes[0] = STARPU_RW; codeleteC.modes[1] = STARPU_RW; codeleteC.name = "codeleteC"; codeleteC.cpu_funcs[0] = callback_c_cpu; #ifdef STARPU_USE_OPENCL codeleteC.opencl_funcs[0] = callback_c_opencl; #endif } const int nbHandles = 10; FPRINTF(stderr, "Nb handles = %d\n", nbHandles); starpu_data_handle_t handles[nbHandles]; memset(handles, 0, sizeof(handles[0])*nbHandles); int dataA[nbHandles]; int idx; for(idx = 0; idx < nbHandles; ++idx) { dataA[idx] = idx; } int idxHandle; for(idxHandle = 0; idxHandle < nbHandles; ++idxHandle) { starpu_variable_data_register(&handles[idxHandle], 0, (uintptr_t)&dataA[idxHandle], sizeof(dataA[idxHandle])); } const int nbTasks = 4; FPRINTF(stderr, "Submit %d tasks \n", nbTasks); int prio2 = starpu_cpu_worker_get_count() ? 2 : 1; int idxTask; for(idxTask = 0; idxTask < nbTasks; ++idxTask) { starpu_insert_task(&codeleteA, STARPU_PRIORITY, 0, (STARPU_RW), handles[(idxTask*2)%nbHandles], (STARPU_RW), handles[(idxTask*3+1)%nbHandles], 0); starpu_insert_task(&codeleteB, STARPU_PRIORITY, 1, (STARPU_RW), handles[(idxTask*2 +1 )%nbHandles], (STARPU_RW), handles[(idxTask*2)%nbHandles], 0); starpu_insert_task(&codeleteC, STARPU_PRIORITY, prio2, (STARPU_RW), handles[(idxTask)%nbHandles], (STARPU_RW), handles[(idxTask*idxTask)%nbHandles], 0); } FPRINTF(stderr, "Wait task\n"); starpu_task_wait_for_all(); FPRINTF(stderr, "Release data\n"); for(idxHandle = 0 ; idxHandle < nbHandles ; ++idxHandle) { starpu_data_unregister(handles[idxHandle]); } FPRINTF(stderr, "Shutdown\n"); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/scheduler/schedulers.sh000077500000000000000000000027751413463044200222710ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 } basedir=$(dirname $0) if test ! -x $basedir/../cholesky/cholesky_tag then echo "Application $basedir/../cholesky/cholesky_tag unavailable" exit 77 fi if [ -n "$STARPU_SCHED" ] then SCHEDULERS=$STARPU_SCHED else SCHEDULERS=`$basedir/../../tools/starpu_sched_display | grep -v heteroprio` fi run() { sched=$1 echo "cholesky.$sched" STARPU_SCHED=$sched $STARPU_LAUNCH $basedir/../cholesky/cholesky_tag -size $((320*3)) -nblocks 3 check_success $? } case "$MAKEFLAGS" in *\ -j1[0-9]*\ *|*\ -j[2-9]*\ *) for sched in $SCHEDULERS do run $sched & done while true do wait -n RET=$? if [ $RET = 127 ] ; then break ; fi check_success $RET done ;; *) for sched in $SCHEDULERS do run $sched done ;; esac starpu-1.3.9+dfsg/examples/scheduler/schedulers_context.sh000077500000000000000000000024011413463044200240170ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 } basedir=$(dirname $0) if test ! -x $basedir/../sched_ctx/sched_ctx then echo "Application $basedir/../sched_ctx/sched_ctx unavailable" exit 77 fi if [ -n "$STARPU_SCHED" ] then SCHEDULERS="$STARPU_SCHED" else SCHEDULERS=`$basedir/../../tools/starpu_sched_display | grep -v pheft | grep -v peager | grep -v heteroprio | grep -v modular-gemm` fi for sched in $SCHEDULERS do echo "sched_ctx.$sched" STARPU_SCHED=$sched $STARPU_LAUNCH $basedir/../sched_ctx/sched_ctx check_success $? done starpu-1.3.9+dfsg/examples/spmd/000077500000000000000000000000001413463044200165435ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/spmd/vector_scal_spmd.c000066400000000000000000000100661413463044200222410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(void) { 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.3.9+dfsg/examples/spmv/000077500000000000000000000000001413463044200165655ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/spmv/dw_block_spmv.c000066400000000000000000000202471413463044200215670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); } } 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 = starpu_bcsr_filter_canonical_block_get_nchildren; /* the children use a matrix interface ! */ bcsr_f.get_child_ops = starpu_bcsr_filter_canonical_block_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]); if (ret == -ENODEV) exit(77); 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(int argc, 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, "GFlop/s : %2.2f\n", totalflop/timing/1000); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/examples/spmv/dw_block_spmv.h000066400000000000000000000021121413463044200215630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/spmv/dw_block_spmv_kernels.c000066400000000000000000000040541413463044200233100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, 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.3.9+dfsg/examples/spmv/matrix_market/000077500000000000000000000000001413463044200214345ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/spmv/matrix_market/examples/000077500000000000000000000000001413463044200232525ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/spmv/matrix_market/examples/fidapm05.mtx000066400000000000000000000330101413463044200254060ustar00rootroot00000000000000%%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.3.9+dfsg/examples/spmv/matrix_market/mm_to_bcsr.c000066400000000000000000000206521413463044200237310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #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.3.9+dfsg/examples/spmv/matrix_market/mmio.c000066400000000000000000000301531413463044200225430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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 0) { nzval[pos] = LOWER_BAND; colind[pos] = row-1; pos++; } nzval[pos] = MIDDLE_BAND; colind[pos] = row; pos++; if (row < size - 1) { nzval[pos] = UPPER_BAND; 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)); starpu_malloc((void **)&vector_exp_out_ptr, size*sizeof(float)); assert(vector_in_ptr && vector_out_ptr && vector_exp_out_ptr); /* fill them */ for (ind = 0; ind < size; ind++) { vector_in_ptr[ind] = ind % 100; 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]); } /* Check the result */ memset(vector_exp_out_ptr, 0, sizeof(vector_exp_out_ptr[0])*size); for (row = 0; row < size; row++) { if (row > 0) vector_exp_out_ptr[row] += LOWER_BAND * vector_in_ptr[row-1]; vector_exp_out_ptr[row] += MIDDLE_BAND * vector_in_ptr[row]; if (row < size-1) vector_exp_out_ptr[row] += UPPER_BAND * vector_in_ptr[row+1]; } for (row = 0; row < size; row++) { if (vector_out_ptr[row] != vector_exp_out_ptr[row]) { FPRINTF(stderr, "check failed at %u: %f vs expected %f\n", row, vector_out_ptr[row], vector_exp_out_ptr[row]); exit(EXIT_FAILURE); } } starpu_free(nzval); starpu_free(colind); starpu_free(rowptr); starpu_free(vector_in_ptr); starpu_free(vector_out_ptr); starpu_free(vector_exp_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.3.9+dfsg/examples/spmv/spmv.h000066400000000000000000000023401413463044200177220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/spmv/spmv_cuda.cu000066400000000000000000000064611413463044200211060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/spmv/spmv_kernels.c000066400000000000000000000104061413463044200214420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; (void)args; 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[], void *arg) { (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.3.9+dfsg/examples/spmv/spmv_opencl.cl000066400000000000000000000025201413463044200214310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/stencil/000077500000000000000000000000001413463044200172415ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/stencil/0.5.out000066400000000000000000000241551413463044200203030ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/0.out000066400000000000000000000300321413463044200201270ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/1.out000066400000000000000000000231411413463044200201330ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/2.out000066400000000000000000000227361413463044200201450ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/3.out000066400000000000000000000231411413463044200201350ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/4.out000066400000000000000000000237521413463044200201460ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/6.out000066400000000000000000000251711413463044200201450ustar00rootroot00000000000000| 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.3.9+dfsg/examples/stencil/Makefile.am000066400000000000000000000112661413463044200213030ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 = $(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 STARPU_USE_MPI LIBS += $(top_builddir)/mpi/src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la AM_CPPFLAGS += -I$(top_srcdir)/mpi/include if STARPU_SIMGRID MPI = $(abs_top_builddir)/tools/starpu_smpirun -np 4 -platform $(abs_top_srcdir)/tools/perfmodels/cluster.xml -hostfile $(abs_top_srcdir)/tools/perfmodels/hostfile NVCCFLAGS += --compiler-options -fPIC else MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 endif else MPI = endif CC = $(CC_OR_MPICC) if STARPU_USE_CUDA if STARPU_COVERITY include $(top_srcdir)/starpu-mynvcc.mk else NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ -I$(top_srcdir)/examples/ $(HWLOC_CFLAGS) .cu.cubin: $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) .cu.o: $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) endif endif ##################################### # What to install and what to check # ##################################### check_PROGRAMS = $(STARPU_EXAMPLES) noinst_PROGRAMS = if !STARPU_SIMGRID if STARPU_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/ -I$(top_srcdir)/src/ LOADER_BIN = ./$(LOADER) loader_SOURCES = ../../tests/loader.c noinst_PROGRAMS += loader else LOADER = LOADER_BIN = $(top_builddir)/examples/stencil/loader-cross.sh endif if STARPU_USE_MPI_MASTER_SLAVE MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(MPI) $(LOADER_BIN) else TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) endif endif ################### # stencil example # ################### STARPU_EXAMPLES = \ stencil \ implicit_stencil examplebindir = $(libdir)/starpu/examples/stencil examplebin_PROGRAMS = \ stencil \ implicit_stencil stencil_SOURCES = \ life.c \ stencil-kernels.c \ stencil-tasks.c \ stencil-blocks.c \ stencil.c noinst_HEADERS = \ stencil.h \ implicit-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 implicit_stencil_SOURCES = \ life.c \ implicit-stencil-kernels.c \ implicit-stencil-tasks.c \ implicit-stencil-blocks.c \ implicit-stencil.c if STARPU_USE_CUDA implicit_stencil_SOURCES += \ life_cuda.cu \ shadow.cu endif if STARPU_USE_OPENCL implicit_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.3.9+dfsg/examples/stencil/Makefile.in000066400000000000000000001603361413463044200213170ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_MPI_TRUE@am__append_1 = $(top_builddir)/mpi/src/libstarpumpi-@STARPU_EFFECTIVE_VERSION@.la @STARPU_USE_MPI_TRUE@am__append_2 = -I$(top_srcdir)/mpi/include @STARPU_SIMGRID_TRUE@@STARPU_USE_MPI_TRUE@am__append_3 = --compiler-options -fPIC @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_4 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ -I$(top_srcdir)/examples/ $(HWLOC_CFLAGS) check_PROGRAMS = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_2) @STARPU_MPI_CHECK_TRUE@@STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_TRUE@TESTS = $(am__EXEEXT_1) @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_FALSE@TESTS = $(am__EXEEXT_1) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__append_5 = loader examplebin_PROGRAMS = stencil$(EXEEXT) implicit_stencil$(EXEEXT) @STARPU_USE_CUDA_TRUE@am__append_6 = \ @STARPU_USE_CUDA_TRUE@ life_cuda.cu \ @STARPU_USE_CUDA_TRUE@ shadow.cu @STARPU_USE_OPENCL_TRUE@am__append_7 = \ @STARPU_USE_OPENCL_TRUE@ life_opencl.c \ @STARPU_USE_OPENCL_TRUE@ shadow_opencl.c @STARPU_USE_CUDA_TRUE@am__append_8 = \ @STARPU_USE_CUDA_TRUE@ life_cuda.cu \ @STARPU_USE_CUDA_TRUE@ shadow.cu @STARPU_USE_OPENCL_TRUE@am__append_9 = \ @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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = loader-cross.sh CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = stencil$(EXEEXT) implicit_stencil$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_2 = loader$(EXEEXT) PROGRAMS = $(examplebin_PROGRAMS) $(noinst_PROGRAMS) am__implicit_stencil_SOURCES_DIST = life.c implicit-stencil-kernels.c \ implicit-stencil-tasks.c implicit-stencil-blocks.c \ implicit-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_implicit_stencil_OBJECTS = life.$(OBJEXT) \ implicit-stencil-kernels.$(OBJEXT) \ implicit-stencil-tasks.$(OBJEXT) \ implicit-stencil-blocks.$(OBJEXT) implicit-stencil.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) implicit_stencil_OBJECTS = $(am_implicit_stencil_OBJECTS) implicit_stencil_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_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am_loader_OBJECTS = loader-loader.$(OBJEXT) loader_OBJECTS = $(am_loader_OBJECTS) loader_LDADD = $(LDADD) 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 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/implicit-stencil-blocks.Po \ ./$(DEPDIR)/implicit-stencil-kernels.Po \ ./$(DEPDIR)/implicit-stencil-tasks.Po \ ./$(DEPDIR)/implicit-stencil.Po ./$(DEPDIR)/life.Po \ ./$(DEPDIR)/life_opencl.Po ./$(DEPDIR)/loader-loader.Po \ ./$(DEPDIR)/shadow_opencl.Po ./$(DEPDIR)/stencil-blocks.Po \ ./$(DEPDIR)/stencil-kernels.Po ./$(DEPDIR)/stencil-tasks.Po \ ./$(DEPDIR)/stencil.Po 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 = $(implicit_stencil_SOURCES) $(loader_SOURCES) \ $(stencil_SOURCES) DIST_SOURCES = $(am__implicit_stencil_SOURCES_DIST) \ $(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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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-mynvcc.mk $(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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_3) $(am__append_4) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(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_HAVE_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_TRUE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_SIMGRID_TRUE@@STARPU_USE_MPI_TRUE@MPI = $(abs_top_builddir)/tools/starpu_smpirun -np 4 -platform $(abs_top_srcdir)/tools/perfmodels/cluster.xml -hostfile $(abs_top_srcdir)/tools/perfmodels/hostfile @STARPU_USE_MPI_FALSE@MPI = # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_0 = @echo " myNVCC " $@; @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_1 = @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc = $(V_mynvcc_$(V)) @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/ -I$(top_srcdir)/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 = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(MPI) $(LOADER_BIN) ################### # stencil example # ################### STARPU_EXAMPLES = \ stencil \ implicit_stencil examplebindir = $(libdir)/starpu/examples/stencil stencil_SOURCES = life.c stencil-kernels.c stencil-tasks.c \ stencil-blocks.c stencil.c $(am__append_6) $(am__append_7) noinst_HEADERS = \ stencil.h \ implicit-stencil.h \ shadow.h implicit_stencil_SOURCES = life.c implicit-stencil-kernels.c \ implicit-stencil-tasks.c implicit-stencil-blocks.c \ implicit-stencil.c $(am__append_8) $(am__append_9) 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 $(top_srcdir)/starpu-mynvcc.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu.mk $(top_srcdir)/starpu-mynvcc.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 implicit_stencil$(EXEEXT): $(implicit_stencil_OBJECTS) $(implicit_stencil_DEPENDENCIES) $(EXTRA_implicit_stencil_DEPENDENCIES) @rm -f implicit_stencil$(EXEEXT) $(AM_V_CCLD)$(LINK) $(implicit_stencil_OBJECTS) $(implicit_stencil_LDADD) $(LIBS) 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)/implicit-stencil-blocks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/implicit-stencil-kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/implicit-stencil-tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/implicit-stencil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/life.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/life_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil-blocks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil-kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil-tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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) implicit_stencil.log: implicit_stencil$(EXEEXT) @p='implicit_stencil$(EXEEXT)'; \ b='implicit_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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/implicit-stencil-blocks.Po -rm -f ./$(DEPDIR)/implicit-stencil-kernels.Po -rm -f ./$(DEPDIR)/implicit-stencil-tasks.Po -rm -f ./$(DEPDIR)/implicit-stencil.Po -rm -f ./$(DEPDIR)/life.Po -rm -f ./$(DEPDIR)/life_opencl.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/shadow_opencl.Po -rm -f ./$(DEPDIR)/stencil-blocks.Po -rm -f ./$(DEPDIR)/stencil-kernels.Po -rm -f ./$(DEPDIR)/stencil-tasks.Po -rm -f ./$(DEPDIR)/stencil.Po -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 -f ./$(DEPDIR)/implicit-stencil-blocks.Po -rm -f ./$(DEPDIR)/implicit-stencil-kernels.Po -rm -f ./$(DEPDIR)/implicit-stencil-tasks.Po -rm -f ./$(DEPDIR)/implicit-stencil.Po -rm -f ./$(DEPDIR)/life.Po -rm -f ./$(DEPDIR)/life_opencl.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/shadow_opencl.Po -rm -f ./$(DEPDIR)/stencil-blocks.Po -rm -f ./$(DEPDIR)/stencil-kernels.Po -rm -f ./$(DEPDIR)/stencil-tasks.Po -rm -f ./$(DEPDIR)/stencil.Po -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 am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ @$(MKDIR_P) `dirname $@` @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) $< -c -o $@ $(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.3.9+dfsg/examples/stencil/README000066400000000000000000000031351413463044200201230ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 You can also use the implicit distributed flavour of this application (e.g. with communications between processes automatically inferred by StarPU-MPI), which is called implicit_stencil. starpu-1.3.9+dfsg/examples/stencil/implicit-stencil-blocks.c000066400000000000000000000300601413463044200241300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "implicit-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: */ static int mpi_tag_common(int z, int dir, int layer_or_boundary, int buffer) { return (z<<12) | (layer_or_boundary << 8) | ((((1+dir)/2))<<4) | buffer; } int MPI_TAG_LAYERS(int z, int buffer) { z = (z + nbz)%nbz; /* No direction for layers ; layer is 0 */ int tag = mpi_tag_common(z, 0, 0, buffer); return tag; } int MPI_TAG_BOUNDARIES(int z, int dir, int buffer) { z = (z + nbz)%nbz; int tag = mpi_tag_common(z, dir, 1, buffer); 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, double time) { FPRINTF(stderr, "%lu B of memory were allocated on node %d in %f ms\n", (unsigned long)allocated, rank, time/1000); } void allocate_memory_on_node(int rank) { unsigned bz; /* Correctly allocate and declare all data handles to StarPU. */ for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); int node = block->mpi_node; unsigned size_bz = block_sizes_z[bz]; if (node == rank) { /* Main blocks */ allocate_block_on_node(&block->layers_handle[0], bz, &block->layers[0], (sizex + 2*K), (sizey + 2*K), (size_bz + 2*K)); 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 */ 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 */ 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); } /* Register void blocks to StarPU, that StarPU-MPI will request to * neighbour nodes if needed for the local computation */ else { /* Main blocks */ starpu_block_data_register(&block->layers_handle[0], -1, (uintptr_t) NULL, (sizex + 2*K), (sizex + 2*K)*(sizey + 2*K), (sizex + 2*K), (sizey + 2*K), (size_bz + 2*K), sizeof(TYPE)); starpu_block_data_register(&block->layers_handle[1], -1, (uintptr_t) NULL, (sizex + 2*K), (sizex + 2*K)*(sizey + 2*K), (sizex + 2*K), (sizey + 2*K), (size_bz + 2*K), sizeof(TYPE)); /* Boundary blocks : Top */ starpu_block_data_register(&block->boundaries_handle[T][0], -1, (uintptr_t) NULL, (sizex + 2*K), (sizex + 2*K)*(sizey + 2*K), (sizex + 2*K), (sizey + 2*K), K, sizeof(TYPE)); starpu_block_data_register(&block->boundaries_handle[T][1], -1, (uintptr_t) NULL, (sizex + 2*K), (sizex + 2*K)*(sizey + 2*K), (sizex + 2*K), (sizey + 2*K), K, sizeof(TYPE)); /* Boundary blocks : Bottom */ starpu_block_data_register(&block->boundaries_handle[B][0], -1, (uintptr_t) NULL, (sizex + 2*K), (sizex + 2*K)*(sizey + 2*K), (sizex + 2*K), (sizey + 2*K), K, sizeof(TYPE)); starpu_block_data_register(&block->boundaries_handle[B][1], -1, (uintptr_t) NULL, (sizex + 2*K), (sizex + 2*K)*(sizey + 2*K), (sizex + 2*K), (sizey + 2*K), K, sizeof(TYPE)); } #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) /* Register all data to StarPU-MPI, even the ones that are not * allocated on the local node. */ /* Main blocks */ starpu_mpi_data_register(block->layers_handle[0], MPI_TAG_LAYERS(bz, 0), node); starpu_mpi_data_register(block->layers_handle[1], MPI_TAG_LAYERS(bz, 1), node); /* Boundary blocks : Top */ starpu_mpi_data_register(block->boundaries_handle[T][0], MPI_TAG_BOUNDARIES(bz, T, 0), node); starpu_mpi_data_register(block->boundaries_handle[T][1], MPI_TAG_BOUNDARIES(bz, T, 1), node); /* Boundary blocks : Bottom */ starpu_mpi_data_register(block->boundaries_handle[B][0], MPI_TAG_BOUNDARIES(bz, B, 0), node); starpu_mpi_data_register(block->boundaries_handle[B][1], MPI_TAG_BOUNDARIES(bz, B, 1), node); #endif } /* Initialize all the data in parallel */ for (bz = 0; bz < nbz; bz++) { struct block_description *block = get_block_description(bz); int node = block->mpi_node; if (node == rank) { /* Set all the data to 0 */ create_task_memset(sizex, sizey, bz); /* Initialize the first layer with some random data */ create_task_initlayer(sizex, sizey, bz); } } starpu_task_wait_for_all(); } 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); } else { starpu_data_unregister(block->layers_handle[0]); starpu_data_unregister(block->layers_handle[1]); } /* Boundary blocks : Top */ if (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); } else { starpu_data_unregister(block->boundaries_handle[T][0]); starpu_data_unregister(block->boundaries_handle[T][1]); } /* Boundary blocks : Bottom */ if (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); } else { starpu_data_unregister(block->boundaries_handle[B][0]); starpu_data_unregister(block->boundaries_handle[B][1]); } } } /* 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) { unsigned size_bz = block_sizes_z[bz]; #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++) 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.3.9+dfsg/examples/stencil/implicit-stencil-kernels.c000066400000000000000000000613451413463044200243300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "implicit-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) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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 */ } } #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) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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 */ } } #endif /* STARPU_USE_OPENCL */ /* * cl_update (CPU version) */ void update_func_cpu(void *descr[], void *arg) { unsigned zz; starpu_codelet_unpack_args(arg, &zz); struct block_description *block = get_block_description(zz); int workerid = starpu_worker_get_id_check(); DEBUG( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); if (block->bz == 0) DEBUG("!!! 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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 */ } } /* 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[], void *arg) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); 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[], void *arg) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); STARPU_ASSERT(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[], void *arg) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); 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[], void *arg) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); (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[], void *arg) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); 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[], void *arg) { unsigned z; starpu_codelet_unpack_args(arg, &z); struct block_description *block = get_block_description(z); (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} }; /* Memset a block's buffers */ void memset_func(void *descr[], void *arg) { (void)descr; unsigned sizex, sizey, bz; starpu_codelet_unpack_args(arg, &sizex, &sizey, &bz); struct block_description *block = get_block_description(bz); unsigned size_bz = get_block_size(bz); unsigned x,y,z; for (x = 0; x < sizex + 2*K; x++) { for (y = 0; y < sizey + 2*K; y++) { /* Main blocks */ for (z = 0; z < size_bz + 2*K; z++) { block->layers[0][(x)+(y)*(sizex + 2*K)+(z)*(sizex+2*K)*(sizey+2*K)] = 0; block->layers[1][(x)+(y)*(sizex + 2*K)+(z)*(sizex+2*K)*(sizey+2*K)] = 0; } for (z = 0; z < K; z++) { /* Boundary blocks : Top */ block->boundaries[T][0][(x)+(y)*(sizex + 2*K)+(z)*(sizex+2*K)*(sizey+2*K)] = 0; block->boundaries[T][1][(x)+(y)*(sizex + 2*K)+(z)*(sizex+2*K)*(sizey+2*K)] = 0; /* Boundary blocks : Bottom */ block->boundaries[B][0][(x)+(y)*(sizex + 2*K)+(z)*(sizex+2*K)*(sizey+2*K)] = 0; block->boundaries[B][1][(x)+(y)*(sizex + 2*K)+(z)*(sizex+2*K)*(sizey+2*K)] = 0; } } } //memset(block->layers[0], 0, (sizex + 2*K)*(sizey + 2*K)*(size_bz + 2*K)*sizeof(block->layers[0])); //memset(block->layers[1], 0, (sizex + 2*K)*(sizey + 2*K)*(size_bz + 2*K)*sizeof(block->layers[1])); //memset(block->boundaries[T][0], 0, (sizex + 2*K)*(sizey + 2*K)*K*sizeof(block->boundaries[T][0])); //memset(block->boundaries[T][1], 0, (sizex + 2*K)*(sizey + 2*K)*K*sizeof(block->boundaries[T][1])); //memset(block->boundaries[B][0], 0, (sizex + 2*K)*(sizey + 2*K)*K*sizeof(block->boundaries[B][0])); //memset(block->boundaries[B][1], 0, (sizex + 2*K)*(sizey + 2*K)*K*sizeof(block->boundaries[B][1])); } static double memset_cost_function(struct starpu_task *task, unsigned nimpl) { (void) task; (void) nimpl; return 0.000001; } static struct starpu_perfmodel memset_model = { .type = STARPU_COMMON, .cost_function = memset_cost_function, .symbol = "memset" }; struct starpu_codelet cl_memset = { .cpu_funcs = {memset_func}, .cpu_funcs_name = {"memset_func"}, .model = &memset_model, .nbuffers = 6, .modes = {STARPU_W, STARPU_W, STARPU_W, STARPU_W, STARPU_W, STARPU_W} }; /* Initialize a block's layer */ static void initlayer_func(void *descr[], void *arg) { (void)descr; unsigned sizex, sizey, bz; starpu_codelet_unpack_args(arg, &sizex, &sizey, &bz); struct block_description *block = get_block_description(bz); unsigned size_bz = get_block_size(bz); /* Initialize layer with some random data */ 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)] = (int)((x/7.+y/13.+(bz*size_bz + z)/17.) * 10.) % 2; } static double initlayer_cost_function(struct starpu_task *task, unsigned nimpl) { (void) task; (void) nimpl; return 0.000001; } static struct starpu_perfmodel initlayer_model = { .type = STARPU_COMMON, .cost_function = initlayer_cost_function, .symbol = "initlayer" }; struct starpu_codelet cl_initlayer = { .cpu_funcs = {initlayer_func}, .model = &initlayer_model, .nbuffers = 1, .modes = {STARPU_W} }; starpu-1.3.9+dfsg/examples/stencil/implicit-stencil-tasks.c000066400000000000000000000137771413463044200240200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "implicit-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 #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) #include #define starpu_insert_task(...) starpu_mpi_insert_task(MPI_COMM_WORLD, __VA_ARGS__) #endif /* * Schedule initialization tasks */ void create_task_memset(unsigned sizex, unsigned sizey, unsigned z) { struct block_description *descr = get_block_description(z); struct starpu_codelet *codelet = &cl_memset; int ret = starpu_insert_task( codelet, STARPU_VALUE, &sizex, sizeof(unsigned), STARPU_VALUE, &sizey, sizeof(unsigned), STARPU_VALUE, &z, sizeof(unsigned), STARPU_W, descr->layers_handle[0], STARPU_W, descr->layers_handle[1], STARPU_W, descr->boundaries_handle[T][0], STARPU_W, descr->boundaries_handle[T][1], STARPU_W, descr->boundaries_handle[B][0], STARPU_W, descr->boundaries_handle[B][1], 0); if (ret) { FPRINTF(stderr, "Could not submit task save: %d\n", ret); if (ret == -ENODEV) exit(77); STARPU_ABORT(); } } void create_task_initlayer(unsigned sizex, unsigned sizey, unsigned z) { struct block_description *descr = get_block_description(z); struct starpu_codelet *codelet = &cl_initlayer; int ret = starpu_insert_task( codelet, STARPU_VALUE, &sizex, sizeof(unsigned), STARPU_VALUE, &sizey, sizeof(unsigned), STARPU_VALUE, &z, sizeof(unsigned), STARPU_W, descr->layers_handle[0], 0); if (ret) { FPRINTF(stderr, "Could not submit task save: %d\n", ret); if (ret == -ENODEV) exit(77); STARPU_ABORT(); } } /* * Schedule saving boundaries of blocks to communication buffers */ static void create_task_save_local(unsigned z, int dir) { struct block_description *descr = get_block_description(z); struct starpu_codelet *codelet; int ret; codelet = (dir == -1)?&save_cl_bottom:&save_cl_top; ret = starpu_insert_task( codelet, STARPU_VALUE, &z, sizeof(unsigned), STARPU_R, descr->layers_handle[0], STARPU_R, descr->layers_handle[1], STARPU_W, descr->boundaries_handle[(1-dir)/2][0], STARPU_W, descr->boundaries_handle[(1-dir)/2][1], STARPU_PRIORITY, STARPU_MAX_PRIO, 0); if (ret) { FPRINTF(stderr, "Could not submit task save: %d\n", ret); if (ret == -ENODEV) exit(77); STARPU_ABORT(); } } /* * Schedule update computation in computation buffer */ void create_task_update(unsigned iter, unsigned z, int local_rank) { STARPU_ASSERT(iter != 0); unsigned old_layer = (K*(iter-1)) % 2; unsigned new_layer = (old_layer + 1) % 2; struct block_description *descr = get_block_description(z); struct block_description *bottom_neighbour = descr->boundary_blocks[B]; struct block_description *top_neighbour = descr->boundary_blocks[T]; struct starpu_codelet *codelet = &cl_update; // Simple-level prio //int prio = ((bottom_neighbour->mpi_node != local_rank) || (top_neighbour->mpi_node != local_rank )) ? STARPU_MAX_PRIO : STARPU_DEFAULT_PRIO; // Two-level prio int prio = ((bottom_neighbour->mpi_node != local_rank) || (top_neighbour->mpi_node != local_rank )) ? STARPU_MAX_PRIO : ((bottom_neighbour->boundary_blocks[B]->mpi_node != local_rank) || (top_neighbour->boundary_blocks[T]->mpi_node != local_rank )) ? STARPU_MAX_PRIO-1 : STARPU_DEFAULT_PRIO; int ret = starpu_insert_task( codelet, STARPU_VALUE, &z, sizeof(unsigned), STARPU_RW, descr->layers_handle[old_layer], STARPU_RW, descr->layers_handle[new_layer], STARPU_R, bottom_neighbour->boundaries_handle[T][old_layer], STARPU_R, bottom_neighbour->boundaries_handle[T][new_layer], STARPU_R, top_neighbour->boundaries_handle[B][old_layer], STARPU_R, top_neighbour->boundaries_handle[B][new_layer], STARPU_PRIORITY, prio, 0); if (ret) { FPRINTF(stderr, "Could not submit task update block: %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 (iter = 0; iter <= niter; iter++) { for (bz = 0; bz < nbz; bz++) { if ((iter > 0) && ((get_block_mpi_node(bz) == rank)|| (get_block_mpi_node(bz+1) == rank)|| (get_block_mpi_node(bz-1) == rank))) create_task_update(iter, bz, rank); } for (bz = 0; bz < nbz; bz++) { if (iter != niter) { int node_z = get_block_mpi_node(bz); int node_z_and_b = get_block_mpi_node(bz-1); int node_z_and_t = get_block_mpi_node(bz+1); if ((node_z == rank) || ((node_z != node_z_and_b) && (node_z_and_b == rank))) create_task_save_local(bz, +1); if ((node_z == rank) || ((node_z != node_z_and_t) && (node_z_and_t == rank))) create_task_save_local(bz, -1); } } } } starpu-1.3.9+dfsg/examples/stencil/implicit-stencil.c000066400000000000000000000230071413463044200226600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "implicit-stencil.h" #ifdef STARPU_HAVE_VALGRIND_H #include #endif /* 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 #define NBZ 8 #else static unsigned niter = 32; #define SIZE 128 #define NBZ 64 #endif /* Problem size */ static unsigned sizex = SIZE; static unsigned sizey = SIZE; static unsigned sizez = NBZ*SIZE; /* Number of blocks (scattered over the different MPI processes) */ unsigned nbz = NBZ; double start; double begin, end; double timing; /* * 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); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { sizex = sizey = 3; nbz = 10; sizez = nbz*3; } #endif } static void init_problem(int argc, char **argv, int rank, int world_size) { parse_args(argc, argv); 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 */ start = starpu_timing_now(); allocate_memory_on_node(rank); end = starpu_timing_now(); timing = end - begin; display_memory_consumption(rank, timing); 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 */ 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[64]; 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) { #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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(); create_tasks(rank); //starpu_tag_notify_from_apps(TAG_INIT_TASK); //wait_end_tasks(rank); starpu_task_wait_for_all(); end = starpu_timing_now(); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) && !defined(STARPU_USE_MPI_MASTER_SLAVE) barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); #endif #if 0 check(rank); #endif /*display_debug(nbz, niter, rank);*/ /* 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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++) { 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"); 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); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) && !defined(STARPU_USE_MPI_MASTER_SLAVE) starpu_mpi_shutdown(); #endif starpu_shutdown(); #if defined(STARPU_USE_MPI) && !defined(STARPU_SIMGRID) && !defined(STARPU_USE_MPI_MASTER_SLAVE) MPI_Finalize(); #endif #ifdef STARPU_USE_OPENCL opencl_life_free(); opencl_shadow_free(); #endif /*STARPU_USE_OPENCL*/ return 0; } starpu-1.3.9+dfsg/examples/stencil/implicit-stencil.h000066400000000000000000000111571413463044200226700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_STENCIL_H__ #define __IMPLICIT_STENCIL_H__ #include #include #include #ifndef __CUDACC__ #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) #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 /* 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, double time); 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_memset(unsigned sizex, unsigned sizey, unsigned z); void create_task_initlayer(unsigned sizex, unsigned sizey, unsigned z); 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 struct starpu_codelet cl_memset; extern struct starpu_codelet cl_initlayer; 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 /* __IMPLICIT_STENCIL_H__ */ starpu-1.3.9+dfsg/examples/stencil/life.c000066400000000000000000000033141413463044200203250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) { (void)bz; 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.3.9+dfsg/examples/stencil/life_cuda.cu000066400000000000000000000061371413463044200215140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/stencil/life_opencl.c000066400000000000000000000074051413463044200216720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #define CL_TARGET_OPENCL_VERSION 100 #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.3.9+dfsg/examples/stencil/loader-cross.sh.in000066400000000000000000000025441413463044200226040ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 case "$exec" in /*) ;; *) exec="$PWD/$exec" esac NATIVE=${exec/\/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" export STARPU_MIC_SINK_PROGRAM_PATH="$DIR" # 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" "$@" starpu-1.3.9+dfsg/examples/stencil/mpi.out000066400000000000000000000260141413463044200205620ustar00rootroot00000000000000Warning: 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.3.9+dfsg/examples/stencil/results000066400000000000000000001422401413463044200206700ustar00rootroot00000000000000B=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.3.9+dfsg/examples/stencil/run000077500000000000000000000021151413463044200177720ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/stencil/shadow.cu000066400000000000000000000044251413463044200210640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/examples/stencil/shadow.h000066400000000000000000000033161413463044200207020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/examples/stencil/shadow_opencl.c000066400000000000000000000071701413463044200222370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/stencil/stencil-blocks.c000066400000000000000000000233651413463044200223320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/examples/stencil/stencil-kernels.c000066400000000000000000000545301413463044200225160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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 */ } } #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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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 */ } } #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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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 */ } } /* 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[], 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[], 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[], 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[], 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[], 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[], 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.3.9+dfsg/examples/stencil/stencil-tasks.c000066400000000000000000000231361413463044200221760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) { 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); } #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) /* 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); #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) if (node_z == local_rank) { /* Save data from update */ create_task_save_local(iter, z, dir); 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); #endif /* STARPU_USE_MPI */ } /* * Schedule update computation in computation buffer */ void create_task_update(unsigned iter, unsigned z, int local_rank) { (void)local_rank; // unneeded parameter, we keep it to have a similar function prototype to the implicit case 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[], void *arg) { (void)descr; (void)arg; } 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.3.9+dfsg/examples/stencil/stencil.c000066400000000000000000000226721413463044200210570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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" #ifdef STARPU_HAVE_VALGRIND_H #include #endif /* 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 #define NBZ 8 #else static unsigned niter = 32; #define SIZE 128 #define NBZ 64 #endif /* Problem size */ static unsigned sizex = SIZE; static unsigned sizey = SIZE; static unsigned sizez = NBZ*SIZE; /* Number of blocks (scattered over the different MPI processes) */ unsigned nbz = NBZ; /* * 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); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { sizex = sizey = 3; nbz = 10; sizez = nbz*3; } #endif } static void init_problem(int argc, char **argv, int rank, int world_size) { parse_args(argc, argv); 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[64]; 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) { #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) 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) && !defined(STARPU_USE_MPI_MASTER_SLAVE) MPI_Finalize(); #endif #ifdef STARPU_USE_OPENCL opencl_life_free(); opencl_shadow_free(); #endif /*STARPU_USE_OPENCL*/ return 0; } starpu-1.3.9+dfsg/examples/stencil/stencil.h000066400000000000000000000105471413463044200210620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ #if defined(STARPU_USE_MPI) && !defined(STARPU_USE_MPI_MASTER_SLAVE) #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 /* 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.3.9+dfsg/examples/tag_example/000077500000000000000000000000001413463044200200665ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/tag_example/tag_example.c000066400000000000000000000127421413463044200225260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (void)argcb; 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[], void *_args) { (void)descr; (void)_args; /* 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, char **argv) { int ret; #ifdef STARPU_HAVE_HELGRIND_H if (RUNNING_ON_VALGRIND) { ni /= 2; nj /= 2; nk /= 2; } #endif 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.3.9+dfsg/examples/tag_example/tag_example2.c000066400000000000000000000062671413463044200226150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *_args) { (void)descr; (void)_args; } int main(int argc , char **argv) { 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.3.9+dfsg/examples/tag_example/tag_example3.c000066400000000000000000000062501413463044200226060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *_args) { (void)descr; (void)_args; } int main(int argc, char **argv) { 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.3.9+dfsg/examples/tag_example/tag_example4.c000066400000000000000000000067731413463044200226210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (void)descr; int *arg = _args; STARPU_ATOMIC_OR(arg, 1); fprintf(stderr,"A"); } void cpu_codelet_B(void *descr[], void *_args) { (void)descr; 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, char **argv) { 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.3.9+dfsg/examples/tag_example/tag_restartable.c000066400000000000000000000101051413463044200233720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *_args) { (void)descr; (void)_args; /* int i = (uintptr_t) _args; printf("doing %x\n", i); usleep(SLEEP); printf("done %x\n", i); */ } int main(int argc, char **argv) { 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.3.9+dfsg/examples/worker_collections/000077500000000000000000000000001413463044200215075ustar00rootroot00000000000000starpu-1.3.9+dfsg/examples/worker_collections/worker_list_example.c000066400000000000000000000050031413463044200257300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 = starpu_worker_list.has_next; co->get_next = starpu_worker_list.get_next; co->add = starpu_worker_list.add; co->remove = starpu_worker_list.remove; co->init = starpu_worker_list.init; co->deinit = starpu_worker_list.deinit; co->init_iterator = starpu_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.3.9+dfsg/examples/worker_collections/worker_tree_example.c000066400000000000000000000053151413463044200257220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 = starpu_worker_tree.has_next; co->get_next = starpu_worker_tree.get_next; co->add = starpu_worker_tree.add; co->remove = starpu_worker_tree.remove; co->init = starpu_worker_tree.init; co->deinit = starpu_worker_tree.deinit; co->init_iterator = starpu_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.3.9+dfsg/include/000077500000000000000000000000001413463044200154055ustar00rootroot00000000000000starpu-1.3.9+dfsg/include/fstarpu_mod.f90000066400000000000000000004503071413463044200202610ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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_CL_ARGS_NFREE type(c_ptr), bind(C) :: FSTARPU_TASK_DEPS_ARRAY 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_EXECUTE_WHERE 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_TASK_COLOR type(c_ptr), bind(C) :: FSTARPU_TASK_SYNCHRONOUS type(c_ptr), bind(C) :: FSTARPU_HANDLES_SEQUENTIAL_CONSISTENCY type(c_ptr), bind(C) :: FSTARPU_TASK_END_DEP type(c_ptr), bind(C) :: FSTARPU_NODE_SELECTION_POLICY type(c_ptr), bind(C) :: FSTARPU_TASK_SCHED_DATA 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_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_SCHED_CTX_POLICY_INIT type(c_ptr), bind(C) :: FSTARPU_SCHED_CTX_USER_DATA 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_CODELET_SIMGRID_EXECUTE type(c_ptr), bind(C) :: FSTARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT type(c_ptr), bind(C) :: FSTARPU_CUDA_ASYNC type(c_ptr), bind(C) :: FSTARPU_OPENCL_ASYNC !type(c_ptr), bind(C) :: FSTARPU_PER_WORKER !type(c_ptr), bind(C) :: FSTARPU_PER_ARCH !type(c_ptr), bind(C) :: FSTARPU_PER_COMMON type(c_ptr), bind(C) :: FSTARPU_HISTORY_BASED type(c_ptr), bind(C) :: FSTARPU_REGRESSION_BASED type(c_ptr), bind(C) :: FSTARPU_NL_REGRESSION_BASED type(c_ptr), bind(C) :: FSTARPU_MULTIPLE_REGRESSION_BASED ! (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 ! 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 ! 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_set_model (cl, cl_perfmodel) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: cl_perfmodel end subroutine fstarpu_codelet_set_model subroutine fstarpu_codelet_set_energy_model (cl, cl_perfmodel) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: cl type(c_ptr), value, intent(in) :: cl_perfmodel end subroutine fstarpu_codelet_set_energy_model 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_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 function fstarpu_perfmodel_allocate () bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_perfmodel_allocate end function fstarpu_perfmodel_allocate subroutine fstarpu_perfmodel_free (model) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: model end subroutine fstarpu_perfmodel_free subroutine fstarpu_perfmodel_set_symbol (model, model_symbol) bind(C) use iso_c_binding, only: c_ptr, c_char type(c_ptr), value, intent(in) :: model character(c_char), intent(in) :: model_symbol end subroutine fstarpu_perfmodel_set_symbol subroutine fstarpu_perfmodel_set_type (model, type) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), value, intent(in) :: model type(c_ptr), value, intent(in) :: type ! C function expects an intptr_t end subroutine fstarpu_perfmodel_set_type ! == 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_pointer_is_inside(starpu_data_handle_t handle, unsigned node, void *ptr); function fstarpu_data_pointer_is_inside (dh,node,ptr) bind(C,name="starpu_data_pointer_is_inside") use iso_c_binding, only: c_ptr, c_int, c_ptr integer(c_int) :: fstarpu_data_pointer_is_inside type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node type(c_ptr), value, intent(in) :: ptr end function fstarpu_data_pointer_is_inside ! 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) & 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) & 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 !unsigned starpu_data_is_on_node(starpu_data_handle_t handle, unsigned node); function fstarpu_data_is_on_node(dh, node) & bind(C,name="starpu_data_is_on_node") use iso_c_binding, only: c_ptr, c_int integer(c_int) :: fstarpu_data_is_on_node type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: node end function fstarpu_data_is_on_node ! 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 () 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 ! void *starpu_sched_ctx_get_user_data(unsigned sched_ctx_id); function fstarpu_sched_ctx_get_user_data(sched_ctx_id) & bind(c,name="starpu_sched_ctx_get_user_data") use iso_c_binding, only: c_int, c_ptr integer(c_int), value, intent(in) :: sched_ctx_id type(c_ptr) :: fstarpu_sched_ctx_get_user_data end function fstarpu_sched_ctx_get_user_data ! 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 ! 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_CL_ARGS_NFREE = fstarpu_get_constant(C_CHAR_"FSTARPU_CL_ARGS_NFREE"//C_NULL_CHAR) FSTARPU_TASK_DEPS_ARRAY = fstarpu_get_constant(C_CHAR_"FSTARPU_TASK_DEPS_ARRAY"//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_EXECUTE_WHERE = fstarpu_get_constant(C_CHAR_"FSTARPU_EXECUTE_WHERE"//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_TASK_SCHED_DATA = fstarpu_get_constant(C_CHAR_"FSTARPU_TASK_SCHED_DATA"//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_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_SCHED_CTX_POLICY_INIT = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_POLICY_INIT"//C_NULL_CHAR) FSTARPU_SCHED_CTX_USER_DATA = & fstarpu_get_constant(C_CHAR_"FSTARPU_SCHED_CTX_USER_DATA"//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_CODELET_SIMGRID_EXECUTE = & fstarpu_get_constant(C_CHAR_"FSTARPU_CODELET_SIMGRID_EXECUTE"//C_NULL_CHAR) FSTARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT = & fstarpu_get_constant(C_CHAR_"FSTARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT"//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) !FSTARPU_PER_WORKER = & ! fstarpu_get_constant(C_CHAR_"FSTARPU_PER_WORKER"//C_NULL_CHAR) !FSTARPU_PER_ARCH = & ! fstarpu_get_constant(C_CHAR_"FSTARPU_PER_ARCH"//C_NULL_CHAR) !FSTARPU_PER_COMMON = & ! fstarpu_get_constant(C_CHAR_"FSTARPU_PER_COMMON"//C_NULL_CHAR) FSTARPU_HISTORY_BASED = & fstarpu_get_constant(C_CHAR_"FSTARPU_HISTORY_BASED"//C_NULL_CHAR) FSTARPU_REGRESSION_BASED = & fstarpu_get_constant(C_CHAR_"FSTARPU_REGRESSION_BASED"//C_NULL_CHAR) FSTARPU_NL_REGRESSION_BASED = & fstarpu_get_constant(C_CHAR_"FSTARPU_NL_REGRESSION_BASED"//C_NULL_CHAR) FSTARPU_MULTIPLE_REGRESSION_BASED = & fstarpu_get_constant(C_CHAR_"FSTARPU_MULTIPLE_REGRESSION_BASED"//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.3.9+dfsg/include/pthread_win32/000077500000000000000000000000001413463044200200565ustar00rootroot00000000000000starpu-1.3.9+dfsg/include/pthread_win32/pthread.h000066400000000000000000000273671413463044200216750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/include/pthread_win32/semaphore.h000066400000000000000000000035211413463044200222130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/include/schedulers/000077500000000000000000000000001413463044200175465ustar00rootroot00000000000000starpu-1.3.9+dfsg/include/schedulers/starpu_heteroprio.h000066400000000000000000000045551413463044200235060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_HETEROPRIO_H__ #define __STARPU_SCHEDULER_HETEROPRIO_H__ #include #ifdef __cplusplus extern "C" { #endif #define STARPU_HETEROPRIO_MAX_PRIO 100 /* #define STARPU_NB_TYPES 3 */ /* #define STARPU_CPU_IDX 0 */ /* #define STARPU_CUDA_IDX 1 */ /* #define STARPU_OPENCL_IDX 2 */ #define STARPU_HETEROPRIO_MAX_PREFETCH 2 #if STARPU_HETEROPRIO_MAX_PREFETCH <= 0 #error STARPU_HETEROPRIO_MAX_PREFETCH == 1 means no prefetch so STARPU_HETEROPRIO_MAX_PREFETCH must >= 1 #endif enum starpu_heteroprio_types { // First will be zero STARPU_CPU_IDX, // = 0 STARPU_CUDA_IDX, STARPU_OPENCL_IDX, STARPU_MIC_IDX, STARPU_MPI_MS_IDX, // This will be the number of archs STARPU_NB_TYPES }; static const unsigned starpu_heteroprio_types_to_arch[STARPU_NB_TYPES+1] = { STARPU_CPU, STARPU_CUDA, STARPU_OPENCL, STARPU_MIC, STARPU_MPI_MS, 0 }; /** Tell how many prio there are for a given arch */ void starpu_heteroprio_set_nb_prios(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned max_prio); /** Set the mapping for a given arch prio=>bucket */ void starpu_heteroprio_set_mapping(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned source_prio, unsigned dest_bucket_id); /** Tell which arch is the faster for the tasks of a bucket (optional) */ void starpu_heteroprio_set_faster_arch(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned bucket_id); /** Tell how slow is a arch for the tasks of a bucket (optional) */ void starpu_heteroprio_set_arch_slow_factor(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned bucket_id, float slow_factor); #ifdef __cplusplus } #endif #endif /* __STARPU_SCHEDULER_HETEROPRIO_H__ */ starpu-1.3.9+dfsg/include/starpu.h000066400000000000000000000454151413463044200171050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; typedef char int8_t; typedef short int16_t; typedef int int32_t; typedef long long int64_t; typedef INT_PTR intptr_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 #ifndef BUILDING_STARPU #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Initialization_and_Termination Initialization and Termination @{ */ /** Structure passed to the starpu_init() function 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. */ struct starpu_conf { /** @private Will be initialized by starpu_conf_init(). Should not be set by hand. */ int magic; /** @private Tell starpu_init() if MPI will be initialized later. */ int will_use_mpi; /** Name of the scheduling policy. This can also be specified with the environment variable \ref STARPU_SCHED. (default = NULL). */ const char *sched_policy_name; /** Definition of the scheduling policy. This field is ignored if starpu_conf::sched_policy_name is set. (default = NULL) */ struct starpu_sched_policy *sched_policy; void (*sched_policy_init)(unsigned); /** For all parameters specified in this structure that can also be set with environment variables, by default, StarPU chooses the value of the environment variable against the value set in starpu_conf. Setting the parameter starpu_conf::precedence_over_environment_variables to 1 allows to give precedence to the value set in the structure over the environment variable. */ int precedence_over_environment_variables; /** Number of CPU cores that StarPU can use. This can also be specified with the environment variable \ref STARPU_NCPU. (default = -1) */ int ncpus; /** Number of CPU cores to that StarPU should leave aside. They can then be used by application threads, by calling starpu_get_next_bindid() to get their ID, and starpu_bind_thread_on() to bind the current thread to them. */ int reserve_ncpus; /** Number of CUDA devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NCUDA. (default = -1) */ int ncuda; /** Number of OpenCL devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NOPENCL. (default = -1) */ int nopencl; /** Number of MIC devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NMIC. (default = -1) */ int nmic; /** Number of MPI Master Slave devices that StarPU can use. This can also be specified with the environment variable \ref STARPU_NMPI_MS. (default = -1) */ int nmpi_ms; /** 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) */ unsigned use_explicit_workers_bindid; /** 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. */ unsigned workers_bindid[STARPU_NMAXWORKERS]; /** 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) */ unsigned use_explicit_workers_cuda_gpuid; /** 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 \c cudaGetDevice()). */ unsigned workers_cuda_gpuid[STARPU_NMAXWORKERS]; /** 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) */ unsigned use_explicit_workers_opencl_gpuid; /** 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. */ unsigned workers_opencl_gpuid[STARPU_NMAXWORKERS]; /** 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) */ unsigned use_explicit_workers_mic_deviceid; /** 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. */ unsigned workers_mic_deviceid[STARPU_NMAXWORKERS]; /** If this flag is set, the MPI Master Slave workers will be attached to the MPI Master Slave devices specified in the array starpu_conf::workers_mpi_ms_deviceid. Otherwise, StarPU affects the MPI Master Slave devices in a round-robin fashion. (default = 0) */ unsigned use_explicit_workers_mpi_ms_deviceid; /** If the flag starpu_conf::use_explicit_workers_mpi_ms_deviceid is set, the array contains the logical identifiers of the MPI Master Slave devices to be used. */ unsigned workers_mpi_ms_deviceid[STARPU_NMAXWORKERS]; /** 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) */ int bus_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) */ int calibrate; /** 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) */ int single_combined_worker; /** 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) */ char *mic_sink_program_path; /** This flag should be set to 1 to disable asynchronous copies between CPUs and all accelerators. 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 with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_COPY. 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) */ int disable_asynchronous_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) */ int disable_asynchronous_cuda_copy; /** This flag should be set to 1 to disable asynchronous copies between CPUs and OpenCL accelerators. 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 with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY. 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) */ int disable_asynchronous_opencl_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). */ int disable_asynchronous_mic_copy; /** This flag should be set to 1 to disable asynchronous copies between CPUs and MPI Master Slave devices. This can also be specified with the environment variable \ref STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY. This can also be specified at compilation time by giving to the configure script the option \ref disable-asynchronous-mpi-master-slave-copy "--disable-asynchronous-mpi-master-slave-copy". (default = 0). */ int disable_asynchronous_mpi_ms_copy; /** Enable CUDA/OpenGL interoperation on these CUDA devices. This can be set to an array of CUDA device identifiers for which \c cudaGLSetGLDevice() should be called instead of \c cudaSetDevice(). Its size is specified by the starpu_conf::n_cuda_opengl_interoperability field below (default = NULL) */ unsigned *cuda_opengl_interoperability; /** Size of the array starpu_conf::cuda_opengl_interoperability */ unsigned n_cuda_opengl_interoperability; /** Array of drivers that should not be launched by StarPU. The application will run in one of its own threads. (default = NULL) */ struct starpu_driver *not_launched_drivers; /** The number of StarPU drivers that should not be launched by StarPU, i.e number of elements of the array starpu_conf::not_launched_drivers. (default = 0) */ unsigned n_not_launched_drivers; /** Specify 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). */ uint64_t trace_buffer_size; int global_sched_ctx_min_priority; int global_sched_ctx_max_priority; #ifdef STARPU_WORKER_CALLBACKS void (*callback_worker_going_to_sleep)(unsigned workerid); void (*callback_worker_waking_up)(unsigned workerid); #endif /** Specify if StarPU should catch SIGINT, SIGSEGV and SIGTRAP signals to make sure final actions (e.g dumping FxT trace files) are done even though the application has crashed. By default (value = \c 1), signals are catched. It should be disabled on systems which already catch these signals for their own needs (e.g JVM) This can also be specified with the environment variable \ref STARPU_CATCH_SIGNALS */ int catch_signals; /** Minimum spinning backoff of drivers. Default value: \c 1 */ unsigned driver_spinning_backoff_min; /** Maximum spinning backoff of drivers. Default value: \c 32 */ unsigned driver_spinning_backoff_max; }; /** Initialize the \p conf structure with the default values. In case some configuration parameters are already specified through environment variables, starpu_conf_init() initializes the fields of \p conf according to the environment variables. For instance if \ref STARPU_CALIBRATE is set, its value is put in the field starpu_conf::calibrate of \p conf. Upon successful completion, this function returns 0. Otherwise, -EINVAL indicates that the argument was NULL. */ int starpu_conf_init(struct starpu_conf *conf); /** StarPU initialization method, 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 \p conf. Default configuration is used if \p conf is NULL. Upon successful completion, this function returns 0. Otherwise, -ENODEV indicates that no worker was available (and thus StarPU was not initialized). */ int starpu_init(struct starpu_conf *conf) STARPU_WARN_UNUSED_RESULT; /** Similar to starpu_init(), but also take the \p argc and \p argv as defined by the application. Do not call starpu_init() and starpu_initialize() in the same program. */ int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv); /** Return 1 if StarPU is already initialized. */ int starpu_is_initialized(void); /** Wait for starpu_init() call to finish. */ void starpu_wait_initialized(void); /** StarPU termination method, 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. */ void starpu_shutdown(void); /** 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. */ void starpu_pause(void); /** Symmetrical call to starpu_pause(), used to resume the workers polling for new tasks. This would be typically called only once having submitted all tasks. */ void starpu_resume(void); /** Value to be passed to starpu_get_next_bindid() and starpu_bind_thread_on() when binding a thread which will significantly eat CPU time, and should thus have its own dedicated CPU. */ #define STARPU_THREAD_ACTIVE (1 << 0) /** Return a PU binding ID which can be used to bind threads with starpu_bind_thread_on(). \p flags can be set to STARPU_THREAD_ACTIVE or 0. When \p npreferred is set to non-zero, \p preferred is an array of size \p npreferred in which a preference of PU binding IDs can be set. By default StarPU will return the first PU available for binding. */ unsigned starpu_get_next_bindid(unsigned flags, unsigned *preferred, unsigned npreferred); /** Bind the calling thread on the given \p cpuid (which should have been obtained with starpu_get_next_bindid()). Return -1 if a thread was already bound to this PU (but binding will still have been done, and a warning will have been printed), so the caller can tell the user how to avoid the issue. \p name should be set to a unique string so that different calls with the same name for the same cpuid does not produce a warning. */ int starpu_bind_thread_on(int cpuid, unsigned flags, const char *name); /** Print a description of the topology on \p f. */ void starpu_topology_print(FILE *f); /** Return 1 if asynchronous data transfers between CPU and accelerators are disabled. */ int starpu_asynchronous_copy_disabled(void); /** Return 1 if asynchronous data transfers between CPU and CUDA accelerators are disabled. */ int starpu_asynchronous_cuda_copy_disabled(void); /** Return 1 if asynchronous data transfers between CPU and OpenCL accelerators are disabled. */ int starpu_asynchronous_opencl_copy_disabled(void); /** Return 1 if asynchronous data transfers between CPU and MIC devices are disabled. */ int starpu_asynchronous_mic_copy_disabled(void); /** Return 1 if asynchronous data transfers between CPU and MPI Slave devices are disabled. */ int starpu_asynchronous_mpi_ms_copy_disabled(void); void starpu_display_stats(void); void starpu_get_version(int *major, int *minor, int *release); /** @} */ #ifdef __cplusplus } #endif #include "starpu_deprecated_api.h" #endif /* __STARPU_H__ */ starpu-1.3.9+dfsg/include/starpu_bitmap.h000066400000000000000000000047321413463044200204360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ #ifndef __STARPU_BITMAP_H__ #define __STARPU_BITMAP_H__ #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Bitmap Bitmap @brief This is the interface for the bitmap utilities provided by StarPU. @{ */ /** create a empty starpu_bitmap */ struct starpu_bitmap *starpu_bitmap_create(void) STARPU_ATTRIBUTE_MALLOC; /** free \p b */ void starpu_bitmap_destroy(struct starpu_bitmap *b); /** set bit \p e in \p b */ void starpu_bitmap_set(struct starpu_bitmap *b, int e); /** unset bit \p e in \p b */ void starpu_bitmap_unset(struct starpu_bitmap *b, int e); /** unset all bits in \p b */ void starpu_bitmap_unset_all(struct starpu_bitmap *b); /** return true iff bit \p e is set in \p b */ int starpu_bitmap_get(struct starpu_bitmap *b, int e); /** Basically compute \c starpu_bitmap_unset_all(\p a) ; \p a = \p b & \p c; */ void starpu_bitmap_unset_and(struct starpu_bitmap *a, struct starpu_bitmap *b, struct starpu_bitmap *c); /** Basically compute \p a |= \p b */ void starpu_bitmap_or(struct starpu_bitmap *a, struct starpu_bitmap *b); /** return 1 iff \p e is set in \p b1 AND \p e is set in \p b2 */ int starpu_bitmap_and_get(struct starpu_bitmap *b1, struct starpu_bitmap *b2, int e); /** return the number of set bits in \p b */ int starpu_bitmap_cardinal(struct starpu_bitmap *b); /** return the index of the first set bit of \p b, -1 if none */ int starpu_bitmap_first(struct starpu_bitmap *b); /** return the position of the last set bit of \p b, -1 if none */ int starpu_bitmap_last(struct starpu_bitmap *b); /** return the position of set bit right after \p e in \p b, -1 if none */ int starpu_bitmap_next(struct starpu_bitmap *b, int e); /** todo */ int starpu_bitmap_has_next(struct starpu_bitmap *b, int e); /** @} */ #ifdef __cplusplus } #endif #endif starpu-1.3.9+dfsg/include/starpu_bound.h000066400000000000000000000043451413463044200202710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @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. @{ */ /** Start recording tasks (resets stats). \p deps tells whether dependencies should be recorded too (this is quite expensive) */ void starpu_bound_start(int deps, int prio); /** Stop recording tasks */ void starpu_bound_stop(void); /** Emit the DAG that was recorded on \p output. */ void starpu_bound_print_dot(FILE *output); /** Get theoretical upper bound (in ms) (needs glpk support detected by configure script). It returns 0 if some performance models are not calibrated. */ void starpu_bound_compute(double *res, double *integer_res, int integer); /** Emit the Linear Programming system on \p output for the recorded tasks, in the lp format */ void starpu_bound_print_lp(FILE *output); /** Emit the Linear Programming system on \p output for the recorded tasks, in the mps format */ void starpu_bound_print_mps(FILE *output); /** Emit on \p output the 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). */ void starpu_bound_print(FILE *output, int integer); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_BOUND_H__ */ starpu-1.3.9+dfsg/include/starpu_clusters.h000066400000000000000000000064641413463044200210320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_CLUSTERS_UTIL_H__ #define __STARPU_CLUSTERS_UTIL_H__ #include #ifdef STARPU_CLUSTER #ifdef STARPU_HAVE_HWLOC #include #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Clustering_Machine Clustering Machine @{ */ /** Used when calling starpu_cluster_machine */ #define STARPU_CLUSTER_MIN_NB (1< 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_LONG_CHECK #undef STARPU_USE_DRAND48 #undef STARPU_USE_ERAND48_R #undef STARPU_HAVE_NEARBYINTF #undef STARPU_HAVE_RINTF #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_CXX11 #undef STARPU_HAVE_STRERROR_R #undef STARPU_HAVE_STATEMENT_EXPRESSIONS #undef STARPU_PERF_MODEL_DIR #endif starpu-1.3.9+dfsg/include/starpu_cublas.h000066400000000000000000000033171413463044200204310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_CUDA_Extensions @{ */ /** Initialize 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. */ void starpu_cublas_init(void); /** Set 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(). */ void starpu_cublas_set_stream(void); /** Synchronously deinitialize the CUBLAS library on every CUDA device. */ void starpu_cublas_shutdown(void); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_CUBLAS_H__ */ starpu-1.3.9+dfsg/include/starpu_cublas_v2.h000066400000000000000000000023301413463044200210320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_CUDA_Extensions @{ */ /** Return the CUSPARSE handle to be used to queue CUSPARSE kernels. It is properly initialized and configured for multistream by starpu_cusparse_init(). */ cublasHandle_t starpu_cublas_get_local_handle(void); /** @} */ #ifdef __cplusplus } #endif #endif #endif /* __STARPU_CUBLAS_V2_H__ */ starpu-1.3.9+dfsg/include/starpu_cuda.h000066400000000000000000000126761413463044200201040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 STARPU_HAVE_LIBNVIDIA_ML #include #endif #ifdef __cplusplus extern "C" { #endif /** @defgroup API_CUDA_Extensions CUDA Extensions @{ */ /** Report a CUBLAS error. */ void starpu_cublas_report_error(const char *func, const char *file, int line, int status); /** Call starpu_cublas_report_error(), passing the current function, file and line position. */ #define STARPU_CUBLAS_REPORT_ERROR(status) starpu_cublas_report_error(__starpu_func__, __FILE__, __LINE__, status) /** Report a CUDA error. */ void starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status); /** Call starpu_cuda_report_error(), passing the current function, file and line position. */ #define STARPU_CUDA_REPORT_ERROR(status) starpu_cuda_report_error(__starpu_func__, __FILE__, __LINE__, status) /** Return 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 cudaDeviceSynchronize() is allowed, but will reduce the likelihood of having all transfers overlapped. */ cudaStream_t starpu_cuda_get_local_stream(void); /** Return a pointer to device properties for worker \p workerid (assumed to be a CUDA worker). */ const struct cudaDeviceProp *starpu_cuda_get_device_properties(unsigned workerid); /** 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 \p stream is NULL). If the asynchronous copy fails or if \p 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. */ 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); /** Copy \p numblocks blocks of \p blocksize bytes from the pointer \p src_ptr on \p src_node to the pointer \p dst_ptr on \p dst_node. The blocks start at addresses which are ld_src (resp. ld_dst) bytes apart in the source (resp. destination) interface. The function first tries to copy the data asynchronous (unless \p stream is NULL). If the asynchronous copy fails or if \p 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. */ int starpu_cuda_copy2d_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, cudaStream_t stream, enum cudaMemcpyKind kind); /** Copy \p numblocks_1 * \p numblocks_2 blocks of \p blocksize bytes from the pointer \p src_ptr on \p src_node to the pointer \p dst_ptr on \p dst_node. The blocks are grouped by \p numblocks_1 blocks whose start addresses are ld1_src (resp. ld1_dst) bytes apart in the source (resp. destination) interface. The function first tries to copy the data asynchronous (unless \p stream is NULL). If the asynchronous copy fails or if \p 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. */ int starpu_cuda_copy3d_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, cudaStream_t stream, enum cudaMemcpyKind kind); /** Call cudaSetDevice(\p devid) or cudaGLSetGLDevice(\p devid), according to whether \p devid is among the field starpu_conf::cuda_opengl_interoperability. */ void starpu_cuda_set_device(unsigned devid); #ifdef STARPU_HAVE_LIBNVIDIA_ML /** Return the nvml device for a CUDA device */ nvmlDevice_t starpu_cuda_get_nvmldev(unsigned devid); #endif /** @} */ #ifdef __cplusplus } #endif #endif /* STARPU_USE_CUDA && !STARPU_DONT_INCLUDE_CUDA_HEADERS */ #endif /* __STARPU_CUDA_H__ */ starpu-1.3.9+dfsg/include/starpu_cusparse.h000066400000000000000000000031361413463044200210040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_CUDA_Extensions @{ */ /** Initialize CUSPARSE on every CUDA device controlled by StarPU. This call blocks until CUSPARSE has been properly initialized on every device. */ void starpu_cusparse_init(void); /** Synchronously deinitialize the CUSPARSE library on every CUDA device. */ void starpu_cusparse_shutdown(void); #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS /** Return the CUSPARSE handle to be used to queue CUSPARSE kernels. It is properly initialized and configured for multistream by starpu_cusparse_init(). */ cusparseHandle_t starpu_cusparse_get_local_handle(void); #endif /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_CUSPARSE_H__ */ starpu-1.3.9+dfsg/include/starpu_data.h000066400000000000000000000542761413463044200201030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Data_Management Data Management @brief 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. @{ */ struct _starpu_data_state; /** 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 struct _starpu_data_state* starpu_data_handle_t; /** Describe a StarPU data access mode Note: when adding a flag here, update _starpu_detect_implicit_data_deps_with_handle Note: other STARPU_* values in include/starpu_task_util.h */ enum starpu_data_access_mode { STARPU_NONE=0, /**< todo */ STARPU_R=(1<<0), /**< read-only mode */ STARPU_W=(1<<1), /**< write-only mode */ STARPU_RW=(STARPU_R|STARPU_W), /**< read-write mode. Equivalent to ::STARPU_R|::STARPU_W */ STARPU_SCRATCH=(1<<2), /**< 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. */ STARPU_REDUX=(1<<3), /**< todo */ STARPU_COMMUTE=(1<<4), /**< ::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). */ STARPU_SSEND=(1<<5), /**< 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()) */ STARPU_LOCALITY=(1<<6), /**< 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 \c USE_LOCALITY flag defined in the src/sched_policies/work_stealing_policy.c source code. */ STARPU_NOPLAN=(1<<8), /**< Disable automatic submission of asynchronous partitioning/unpartitioning */ STARPU_ACCESS_MODE_MAX=(1<<9) /**< The purpose of ::STARPU_ACCESS_MODE_MAX is to be the maximum of this enum. */ }; struct starpu_data_interface_ops; /** Set the name of the data, to be shown in various profiling tools. */ void starpu_data_set_name(starpu_data_handle_t handle, const char *name); /** 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. */ void starpu_data_set_coordinates_array(starpu_data_handle_t handle, unsigned dimensions, int dims[]); /** 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. */ void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...); /** Get the coordinates of the data, as set by a previous call to starpu_data_set_coordinates_array() or starpu_data_set_coordinates() \p dimensions is the size of the \p dims array. This returns the actual number of returned coordinates. */ unsigned starpu_data_get_coordinates_array(starpu_data_handle_t handle, unsigned dimensions, int dims[]); /** Unregister a data \p 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. */ void starpu_data_unregister(starpu_data_handle_t handle); /** Similar to starpu_data_unregister(), except that StarPU does not put back a valid copy into the home node, in the buffer that was initially registered. */ void starpu_data_unregister_no_coherency(starpu_data_handle_t handle); /** Destroy the data \p handle once it is no longer needed by any submitted task. No coherency is provided. This is not safe to call starpu_data_unregister_submit() on a handle that comes from the registration of a non-NULL application home buffer, since the moment when the unregistration will happen is unknown to the application. Only calling starpu_shutdown() allows to be sure that the data was really unregistered. */ void starpu_data_unregister_submit(starpu_data_handle_t handle); /** Destroy all replicates of the data \p handle immediately. After data invalidation, the first access to \p handle must be performed in ::STARPU_W mode. Accessing an invalidated data in ::STARPU_R mode results in undefined behaviour. */ void starpu_data_invalidate(starpu_data_handle_t handle); /** Submit invalidation of the data \p handle after completion of previously submitted tasks. */ void starpu_data_invalidate_submit(starpu_data_handle_t handle); /** Specify that the data \p handle can be discarded without impacting the application. */ void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important); /** @name Access registered data from the application @{ */ /** 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. */ #define STARPU_ACQUIRE_NO_NODE -1 /** Similar to ::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. */ #define STARPU_ACQUIRE_NO_NODE_LOCK_ALL -2 /** 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 \p handle 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 with \p mode. 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. */ int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode); /** Similar to 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_NO_NODE_LOCK_ALL can be used instead of an explicit node number. */ int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode); /** Asynchronous equivalent of starpu_data_acquire(). When the data specified in \p handle is available in the access \p mode, the \p callback function is executed. The application may access the requested data during the execution of \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. */ int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg); /** Similar to 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_NO_NODE_LOCK_ALL can be used instead of an explicit node number. */ 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); /** Similar to starpu_data_acquire_cb() with the possibility of enabling or disabling data dependencies. When the data specified in \p handle is available in the access \p 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. */ 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); /** Similar to 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_NO_NODE_LOCK_ALL can be used instead of an explicit node number. */ 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_quick(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency, int quick); /** Similar to 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. */ 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, int quick, long *pre_sync_jobid, long *post_sync_jobid); /** 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. */ int starpu_data_acquire_try(starpu_data_handle_t handle, enum starpu_data_access_mode mode); /** Similar to 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. */ int starpu_data_acquire_on_node_try(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode); #ifdef __GCC__ /** 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. */ # 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 /** Release the piece of data acquired by the application either by starpu_data_acquire() or by starpu_data_acquire_cb(). */ void starpu_data_release(starpu_data_handle_t handle); /** Similar to 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 \c starpu_data_acquire_on_node* call. */ void starpu_data_release_on_node(starpu_data_handle_t handle, int node); /** @} */ /** This is an arbiter, which implements an advanced but centralized management of concurrent data accesses, see \ref ConcurrentDataAccess for the details. */ typedef struct starpu_arbiter *starpu_arbiter_t; /** Create a data access arbiter, see \ref ConcurrentDataAccess for the details */ starpu_arbiter_t starpu_arbiter_create(void) STARPU_ATTRIBUTE_MALLOC; /** Make access to \p handle managed by \p arbiter */ void starpu_data_assign_arbiter(starpu_data_handle_t handle, starpu_arbiter_t arbiter); /** Destroy the \p arbiter . This must only be called after all data assigned to it have been unregistered. */ void starpu_arbiter_destroy(starpu_arbiter_t arbiter); /** Explicitly ask StarPU to allocate room for a piece of data on the specified memory \p node. */ int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node); /** Issue a fetch request for the data \p handle to \p 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 \p async 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. */ int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); /** Issue a prefetch request for the data \p handle to \p node, i.e. requests that the data be replicated to \p node when there is room for it, so that it is available there for tasks. If \p async 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. */ int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); int starpu_data_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio); /** Issue an idle prefetch request for the data \p handle to \p node, i.e. requests that the data be replicated to \p node, so that it is available there for tasks, but only when the bus is really idle. If \p async 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. */ int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async); int starpu_data_idle_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio); /** Check whether a valid copy of \p handle is currently available on memory node \p node. */ unsigned starpu_data_is_on_node(starpu_data_handle_t handle, unsigned node); /** Advise StarPU that \p 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. */ void starpu_data_wont_use(starpu_data_handle_t handle); /** Set the write-through mask of the data \p handle (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 nodes. For instance a 1<<0 write-through mask means that the CUDA workers will commit their changes in main memory (node 0). */ void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask); /** @name Implicit Data Dependencies 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. @{ */ /** 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(). */ void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag); /** Get the data consistency mode associated to the data handle \p handle */ unsigned starpu_data_get_sequential_consistency_flag(starpu_data_handle_t handle); /** Return the default sequential consistency flag */ unsigned starpu_data_get_default_sequential_consistency_flag(void); /** 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(). */ void starpu_data_set_default_sequential_consistency_flag(unsigned flag); /** @} */ /** Set whether this data should be elligible to be evicted to disk storage (1) or not (0). The default is 1. */ void starpu_data_set_ooc_flag(starpu_data_handle_t handle, unsigned flag); /** Get whether this data was set to be elligible to be evicted to disk storage (1) or not (0). */ unsigned starpu_data_get_ooc_flag(starpu_data_handle_t handle); /** Query the status of \p handle on the specified \p memory_node. */ 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; /** Set 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. */ 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); /** Set the field \c user_data 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. */ void starpu_data_set_user_data(starpu_data_handle_t handle, void* user_data); /** Retrieve the field \c user_data previously set for the \p handle. */ void *starpu_data_get_user_data(starpu_data_handle_t handle); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_DATA_H__ */ starpu-1.3.9+dfsg/include/starpu_data_filters.h000066400000000000000000000531561413463044200216270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Data_Partition Data Partition @{ */ struct starpu_data_interface_ops; /** Describe a data partitioning operation, to be given to starpu_data_partition() */ struct starpu_data_filter { /** 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.
*/ void (*filter_func)(void *father_interface, void *child_interface, struct starpu_data_filter *, unsigned id, unsigned nparts); unsigned nchildren; /**< Number of parts to partition the data into. */ /** Return the number of children. This can be used instead of starpu_data_filter::nchildren when the number of children depends on the actual data (e.g. the number of blocks in a sparse matrix). */ unsigned (*get_nchildren)(struct starpu_data_filter *, starpu_data_handle_t initial_handle); /** When children use different data interface, return which interface is used by child number \p id. */ struct starpu_data_interface_ops *(*get_child_ops)(struct starpu_data_filter *, unsigned id); unsigned filter_arg; /**< Additional parameter for the filter function */ /** Additional pointer parameter for the filter function, such as the sizes of the different parts. */ void *filter_arg_ptr; }; /** @name Basic API @{ */ /** Request the partitioning of \p 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 */ void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f); /** Unapply the filter which has been applied to \p root_data, 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 will be waited for by starpu_data_unpartition(). Here an example of how to use the function. \code{.c} starpu_data_unpartition(A_handle, STARPU_MAIN_RAM); \endcode */ void starpu_data_unpartition(starpu_data_handle_t root_data, unsigned gathering_node); /** Return the \p i -th child of the given \p handle, which must have been partitionned beforehand. */ starpu_data_handle_t starpu_data_get_child(starpu_data_handle_t handle, unsigned i); /** Return the number of children \p handle has been partitioned into. */ int starpu_data_get_nb_children(starpu_data_handle_t handle); /** 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 */ starpu_data_handle_t starpu_data_get_sub_data(starpu_data_handle_t root_data, unsigned depth, ... ); /** Similar to starpu_data_get_sub_data() but use a \c va_list for the parameter list. */ starpu_data_handle_t starpu_data_vget_sub_data(starpu_data_handle_t root_data, unsigned depth, va_list pa); /** Apply \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. */ void starpu_data_map_filters(starpu_data_handle_t root_data, unsigned nfilters, ...); /** Apply \p nfilters filters to the handle designated by \p root_handle recursively. Use a \p va_list of pointers to variables of the type starpu_data_filter. */ void starpu_data_vmap_filters(starpu_data_handle_t root_data, unsigned nfilters, va_list pa); /** @} */ /** @name Asynchronous API @{ */ /** Plan to partition \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 */ void starpu_data_partition_plan(starpu_data_handle_t initial_handle, struct starpu_data_filter *f, starpu_data_handle_t *children); /** Submit 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 */ void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); /** Similar to starpu_data_partition_submit(), but do 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 correctly add dependencies between the reads on the \p initial_handle and the writes to be submitted. */ void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); /** Assume 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. */ void starpu_data_partition_readwrite_upgrade_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children); /** Assuming that \p initial_handle is partitioned into \p children, submit an unpartitionning of \p initial_handle, i.e. submit a gathering of the pieces on the requested \p gathering_node memory node, and submit an invalidation of the 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_submit_r(starpu_data_handle_t initial_handle, int gathering_node); /** Similar to starpu_data_partition_submit(), but do 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. */ void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node); /** 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. */ void starpu_data_partition_clean(starpu_data_handle_t root_data, unsigned nparts, starpu_data_handle_t *children); /** Similar to starpu_data_unpartition_submit_sequential_consistency() but allow to specify a callback function for the unpartitiong task */ void starpu_data_unpartition_submit_sequential_consistency_cb(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node, int sequential_consistency, void (*callback_func)(void *), void *callback_arg); /** Similar to starpu_data_partition_submit() but also allow to specify the coherency to be used for the main data \p initial_handle through the parameter \p sequential_consistency. */ void starpu_data_partition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int sequential_consistency); /** Similar to starpu_data_unpartition_submit() but also allow to specify the coherency to be used for the main data \p initial_handle through the parameter \p sequential_consistency. */ void starpu_data_unpartition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node, int sequential_consistency); /** @} */ /** @name Predefined BCSR Filter Functions Predefined partitioning functions for BCSR data. Examples on how to use them are shown in \ref PartitioningData. @{ */ /** Partition a block-sparse matrix into dense matrices. starpu_data_filter::get_child_ops needs to be set to starpu_bcsr_filter_canonical_block_child_ops() and starpu_data_filter::get_nchildren set to starpu_bcsr_filter_canonical_block_get_nchildren(). */ void starpu_bcsr_filter_canonical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Return the number of children obtained with starpu_bcsr_filter_canonical_block(). */ unsigned starpu_bcsr_filter_canonical_block_get_nchildren(struct starpu_data_filter *f, starpu_data_handle_t handle) ; /** Return the child_ops of the partition obtained with starpu_bcsr_filter_canonical_block(). */ struct starpu_data_interface_ops *starpu_bcsr_filter_canonical_block_child_ops(struct starpu_data_filter *f, unsigned child); /** Partition a block-sparse matrix into block-sparse matrices. The split is done along the leading dimension, i.e. along adjacent nnz blocks. */ void starpu_bcsr_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** @} */ /** @name Predefined CSR Filter Functions Predefined partitioning functions for CSR data. Examples on how to use them are shown in \ref PartitioningData. @{ */ /** Partition a block-sparse matrix into vertical block-sparse matrices. */ void starpu_csr_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** @} */ /** @name Predefined Matrix Filter Functions Predefined partitioning functions for matrix data. Examples on how to use them are shown in \ref PartitioningData. Note: this is using the C element order which is row-major, i.e. elements with consecutive x coordinates are consecutive in memory. @{ */ /** Partition 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. */ void starpu_matrix_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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 */ void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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. */ void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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 */ void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** @} */ /** @name Predefined Vector Filter Functions Predefined partitioning functions for vector data. Examples on how to use them are shown in \ref PartitioningData. @{ */ /** 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. */ void starpu_vector_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** 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 \c 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 */ void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** 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. */ void starpu_vector_filter_list_long(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** 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. */ void starpu_vector_filter_list(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** 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. */ void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** @} */ /** @name Predefined Block Filter Functions Predefined partitioning functions for block data. Examples on how to use them are shown in \ref PartitioningData. An example is available in \c examples/filters/shadow3d.c Note: this is using the C element order which is row-major, i.e. elements with consecutive x coordinates are consecutive in memory. @{ */ /** Partition 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. */ void starpu_block_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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. */ void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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. */ void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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. */ void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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. */ void starpu_block_filter_depth_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Partition 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. */ void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts); /** Given an integer \p n, \p n the number of parts it must be divided in, \p id the part currently considered, determines the \p chunk_size and the \p offset, taking into account the size of the elements stored in the data structure \p elemsize and \p ld, the leading dimension, which is most often 1. */ 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); /** @} */ /** @} */ #ifdef __cplusplus } #endif #endif starpu-1.3.9+dfsg/include/starpu_data_interfaces.h000066400000000000000000002314251413463044200222770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Data_Interfaces Data Interfaces @brief 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). In the case of NUMA systems, functions starpu_memory_nodes_numa_devid_to_id() and starpu_memory_nodes_numa_id_to_devid() can be used to convert from NUMA node numbers as seen by the Operating System and NUMA node numbers as seen by StarPU. There are several ways to register a memory region so that it can be managed by StarPU. StarPU provides data interfaces for vectors, 2D matrices, 3D matrices as well as BCSR and CSR sparse matrices. 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). Applications can provide their own interface as shown in \ref DefiningANewDataInterface. @{ */ /** Define the per-interface methods. If the starpu_data_copy_methods::any_to_any method is provided, it will be used by default if no 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. */ struct starpu_data_copy_methods { /** If defined, allow 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. */ int (*can_copy)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_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. */ int (*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 CUDA node. Return 0 on success. */ int (*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 OpenCL node. Return 0 on success. */ int (*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 MIC node. Return 0 on success. */ int (*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 CUDA node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. */ int (*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 CUDA node. Return 0 on success. */ int (*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 OpenCL node. Return 0 on success. */ int (*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 OpenCL node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. */ int (*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 CUDA node. Return 0 on success. */ int (*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 OpenCL node. Return 0 on success. */ int (*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 MIC node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. */ int (*mic_to_ram)(void *src_interface, unsigned srd_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 MPI Slave node. Return 0 on success. */ int (*ram_to_mpi_ms)(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 MPI Slave node to the \p dst_interface interface on the \p dst_node CPU node. Return 0 on success. */ int (*mpi_ms_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 MPI Slave node to the \p dst_interface interface on the \p dst_node MPI Slave node. Return 0 on success. */ int (*mpi_ms_to_mpi_ms)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node); #ifdef STARPU_USE_CUDA /** 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. */ int (*ram_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_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. */ int (*cuda_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_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. */ 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__) /** 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 \p 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. */ int (*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 OpenCL node to the \p dst_interface interface on the \p dst_node CPU node, by recording in \p 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. */ int (*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 OpenCL node, by recording in \p 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. */ 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 /** 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 MPI Slave node, with the given even. 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. */ int (*ram_to_mpi_ms_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void * event); /** Define how to copy data from the \p src_interface interface on the \p src_node MPI Slave node to the \p dst_interface interface on the \p dst_node CPU node, with the given event. 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. */ int (*mpi_ms_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void * event); /** Define how to copy data from the \p src_interface interface on the \p src_node MPI Slave node to the \p dst_interface interface on the \p dst_node MPI Slave 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. */ int (*mpi_ms_to_mpi_ms_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void * 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 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. */ int (*ram_to_mic_async)(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. 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. */ int (*mic_to_ram_async)(void *src_interface, unsigned srd_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. 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. This can only be implemented if the interface has ready-to-send data blocks. If the interface is more involved than this, i.e. it needs to collect pieces of data before transferring, starpu_data_interface_ops::pack_data and starpu_data_interface_ops::unpack_data should be implemented instead, and the core will just transfer the resulting data buffer. */ int (*any_to_any)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); }; /** Identifier for all predefined StarPU data interfaces */ enum starpu_data_interface_id { STARPU_UNKNOWN_INTERFACE_ID = -1, /**< Unknown interface */ STARPU_MATRIX_INTERFACE_ID=0, /**< Identifier for the matrix data interface */ STARPU_BLOCK_INTERFACE_ID=1, /**< Identifier for the block data interface*/ STARPU_VECTOR_INTERFACE_ID=2, /**< Identifier for the vector data interface*/ STARPU_CSR_INTERFACE_ID=3, /**< Identifier for the CSR data interface*/ STARPU_BCSR_INTERFACE_ID=4, /**< Identifier for the BCSR data interface*/ STARPU_VARIABLE_INTERFACE_ID=5, /**< Identifier for the variable data interface*/ STARPU_VOID_INTERFACE_ID=6, /**< Identifier for the void data interface*/ STARPU_MULTIFORMAT_INTERFACE_ID=7, /**< Identifier for the multiformat data interface*/ STARPU_COO_INTERFACE_ID=8, /**< Identifier for the COO data interface*/ STARPU_MAX_INTERFACE_ID=9 /**< Maximum number of data interfaces */ }; /** Per-interface data management methods. */ struct starpu_data_interface_ops { /** 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. This method is mandatory. */ void (*register_data_handle) (starpu_data_handle_t handle, unsigned home_node, void *data_interface); /** Unregister a data handle. This iterates over all memory nodes to free any pointer in the data interface on each of them. At this point, free_data_on_node has been already called on each of them. This just clears anything that would still be left. */ void (*unregister_data_handle) (starpu_data_handle_t handle); /** 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. Note that the memory node can be CPU memory, GPU memory, or even disk area. The result returned by starpu_malloc_on_node() should be just stored as uintptr_t without trying to interpret it since it may be a GPU pointer, a disk descriptor, etc. This method is mandatory to be able to support memory nodes. */ starpu_ssize_t (*allocate_data_on_node) (void *data_interface, unsigned node); /** Free data of the interface on a given node. This method is mandatory to be able to support memory nodes. */ void (*free_data_on_node) (void *data_interface, unsigned node); /** Initialize the interface. This method is optional. It is called when initializing the handler on all the memory nodes. */ void (*init) (void *data_interface); /** Struct with pointer to functions for performing ram/cuda/opencl synchronous and asynchronous transfers. This field is mandatory to be able to support memory nodes, except disk nodes which can be supported by just implementing starpu_data_interface_ops::pack_data and starpu_data_interface_ops::unpack_data. */ const struct starpu_data_copy_methods *copy_methods; /** @deprecated Use starpu_data_interface_ops::to_pointer instead. Return the current pointer (if any) for the handle on the given node. This method is only required if starpu_data_interface_ops::to_pointer is not implemented. */ void * (*handle_to_pointer) (starpu_data_handle_t handle, unsigned node); /** Return the current pointer (if any) for the given interface on the given node. This method is only required for starpu_data_handle_to_pointer() and starpu_data_get_local_ptr(), and for disk support. */ void * (*to_pointer) (void *data_interface, unsigned node); /** Return whether the given \p ptr is within the data for the given interface on the given node. This method is optional, as it is only used for coherency checks. */ int (*pointer_is_inside) (void *data_interface, unsigned node, void *ptr); /** Return an estimation of the size of data, for performance models and tracing feedback. */ size_t (*get_size) (starpu_data_handle_t handle); /** Return an estimation of the size of allocated data, for allocation management. If not specified, the starpu_data_interface_ops::get_size method is used instead. */ size_t (*get_alloc_size) (starpu_data_handle_t handle); /** Return a 32bit footprint which characterizes the data size and layout (nx, ny, ld, elemsize, etc.), required for indexing performance models. starpu_hash_crc32c_be() and alike can be used to produce this 32bit value from various types of values. */ uint32_t (*footprint) (starpu_data_handle_t handle); /** Return a 32bit footprint which characterizes the data allocation, to be used for indexing allocation cache. If not specified, the starpu_data_interface_ops::footprint method is used instead. */ uint32_t (*alloc_footprint) (starpu_data_handle_t handle); /** Compare the data size and layout of two interfaces (nx, ny, ld, elemsize, etc.), to be used for indexing performance models. It should return 1 if the two interfaces size and layout match computation-wise, and 0 otherwise. It does *not* compare the actual content of the interfaces. */ int (*compare) (void *data_interface_a, void *data_interface_b); /** Compare the data allocation of two interfaces etc.), to be used for indexing allocation cache. It should return 1 if the two interfaces are allocation-compatible, i.e. basically have the same alloc_size, and 0 otherwise. If not specified, the starpu_data_interface_ops::compare method is used instead. */ int (*alloc_compare) (void *data_interface_a, void *data_interface_b); /** Dump the sizes of a handle to a file. This is required for performance models */ void (*display) (starpu_data_handle_t handle, FILE *f); /** Describe the data into a string in a brief way, such as one letter to describe the type of data, and the data dimensions. This is required for tracing feedback. */ starpu_ssize_t (*describe) (void *data_interface, char *buf, size_t size); /** An identifier that is unique to each interface. */ enum starpu_data_interface_id interfaceid; /** Size of the interface data descriptor. */ size_t interface_size; /** */ char is_multiformat; /** 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. */ char dontcache; /** */ struct starpu_multiformat_data_interface_ops* (*get_mf_ops)(void *data_interface); /** Pack the data handle into a contiguous buffer at the address allocated with starpu_malloc_flags(ptr, size, 0) (and thus returned in \p ptr) and set the size of the newly created buffer in \p count. If \p 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. This method (and starpu_data_interface_ops::unpack_data) is required for disk support if the starpu_data_copy_methods::any_to_any method is not implemented (because the in-memory data layout is too complex). This is also required for MPI support if there is no registered MPI data type. */ int (*pack_data) (starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count); /** Unpack the data handle from the contiguous buffer at the address \p ptr of size \p count. The memory at the address \p ptr should be freed after the data unpacking operation. */ int (*unpack_data) (starpu_data_handle_t handle, unsigned node, void *ptr, size_t count); /** Name of the interface */ char *name; }; /** @name Basic API @{ */ /** 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()). */ void starpu_data_register(starpu_data_handle_t *handleptr, int home_node, void *data_interface, struct starpu_data_interface_ops *ops); /** 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. */ void starpu_data_ptr_register(starpu_data_handle_t handle, unsigned node); /** Register a new piece of data into the handle \p handledst with the same interface as the handle \p handlesrc. */ void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc); /** 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. */ void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node); /** Return whether the given \p ptr is within the data for \p handle on node \p node (1) or not (0). If the handle interface does not support this operation, and thus the result is unknown, -1 is returned. */ int starpu_data_pointer_is_inside(starpu_data_handle_t handle, unsigned node, void *ptr); /** Return the local pointer associated with \p handle or NULL if \p handle’s interface does not have any data allocated locally. */ void *starpu_data_get_local_ptr(starpu_data_handle_t handle); /** Return the interface associated with \p handle on \p memory_node. */ void *starpu_data_get_interface_on_node(starpu_data_handle_t handle, unsigned memory_node); /** Return the unique identifier of the interface associated with the given \p handle. */ enum starpu_data_interface_id starpu_data_get_interface_id(starpu_data_handle_t handle); /** 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. */ int starpu_data_pack(starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count); /** 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). */ int starpu_data_unpack(starpu_data_handle_t handle, void *ptr, size_t count); /** Return the size of the data associated with \p handle. */ size_t starpu_data_get_size(starpu_data_handle_t handle); /** Return the size of the allocated data associated with \p handle. */ size_t starpu_data_get_alloc_size(starpu_data_handle_t handle); /** Return the handle corresponding to the data pointed to by the \p ptr host pointer. */ starpu_data_handle_t starpu_data_lookup(const void *ptr); int starpu_data_get_home_node(starpu_data_handle_t handle); /** Return the next available id for a newly created data interface (\ref DefiningANewDataInterface). */ int starpu_data_interface_get_next_id(void); /** 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 starpu_data_copy_methods::any_to_any copy method, which is provided with \p 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. */ 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); /** Copy \p numblocks blocks of \p blocksize 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. The blocks start at addresses which are ld_src (resp. ld_dst) bytes apart in the source (resp. destination) interface. If blocksize == ld_src == ld_dst, the transfer is optimized into a single starpu_interface_copy call. This is to be used in the starpu_data_copy_methods::any_to_any copy method for 2D data, which is provided with \p 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. */ int starpu_interface_copy2d(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, void *async_data); /** Copy \p numblocks_1 * \p numblocks_2 blocks of \p blocksize 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. The blocks are grouped by \p numblocks_1 blocks whose start addresses are ld1_src (resp. ld1_dst) bytes apart in the source (resp. destination) interface. Such groups are grouped by numblocks_2 groups whose start addresses are ld2_src (resp. ld2_dst) bytes apart in the source (resp. destination) interface. If the blocks are contiguous, the transfers will be optimized. This is to be used in the starpu_data_copy_methods::any_to_any copy method for 3D data, which is provided with \p 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. */ int starpu_interface_copy3d(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks1, size_t ld1_src, size_t ld1_dst, size_t numblocks2, size_t ld2_src, size_t ld2_dst, void *async_data); /** Copy \p numblocks_1 * \p numblocks_2 * \p numblocks_3 blocks of \p blocksize 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. The blocks are grouped by \p numblocks_1 blocks whose start addresses are ld1_src (resp. ld1_dst) bytes apart in the source (resp. destination) interface. Such groups are grouped by numblocks_2 groups whose start addresses are ld2_src (resp. ld2_dst) bytes apart in the source (resp. destination) interface. Such groups are grouped by numblocks_3 groups whose start addresses are ld3_src (resp. ld3_dst) bytes apart in the source (resp. destination) interface. If the blocks are contiguous, the transfers will be optimized. This is to be used in the starpu_data_copy_methods::any_to_any copy method for 3D data, which is provided with \p 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. */ int starpu_interface_copy4d(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks1, size_t ld1_src, size_t ld1_dst, size_t numblocks2, size_t ld2_src, size_t ld2_dst, size_t numblocks3, size_t ld3_src, size_t ld3_dst, void *async_data); /** When an asynchonous implementation of the data transfer is implemented, the call to the underlying CUDA, OpenCL, etc. call should be surrounded by calls to starpu_interface_start_driver_copy_async() and starpu_interface_end_driver_copy_async(), so that it is recorded in offline execution traces, and the timing of the submission is checked. \p start must point to a variable whose value will be passed unchanged to starpu_interface_end_driver_copy_async(). */ void starpu_interface_start_driver_copy_async(unsigned src_node, unsigned dst_node, double *start); /** See starpu_interface_start_driver_copy_async(). */ void starpu_interface_end_driver_copy_async(unsigned src_node, unsigned dst_node, double start); /** Record in offline execution traces the copy of \p size bytes from node \p src_node to node \p dst_node */ void starpu_interface_data_copy(unsigned src_node, unsigned dst_node, size_t size); /** 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_flags(). */ uintptr_t starpu_malloc_on_node_flags(unsigned dst_node, size_t size, int flags); /** 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(). */ uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size); /** Free \p addr of \p size bytes on node \p dst_node which was previously allocated with starpu_malloc_on_node_flags() with the given allocation \p flags. */ void starpu_free_on_node_flags(unsigned dst_node, uintptr_t addr, size_t size, int flags); /** Free \p addr of \p size bytes on node \p dst_node which was previously allocated with starpu_malloc_on_node(). */ void starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size); /** Define the default flags for allocations performed by starpu_malloc_on_node() and starpu_free_on_node(). The default is \ref STARPU_MALLOC_PINNED | \ref STARPU_MALLOC_COUNT. */ void starpu_malloc_on_node_set_default_flags(unsigned node, int flags); /** @} */ /** @name Accessing Matrix Data Interfaces @{ */ extern struct starpu_data_interface_ops starpu_interface_matrix_ops; /** Matrix interface for dense matrices */ struct starpu_matrix_interface { enum starpu_data_interface_id id; /**< Identifier of the interface */ uintptr_t ptr; /**< local pointer of the matrix */ uintptr_t dev_handle; /**< device handle of the matrix */ size_t offset; /**< offset in the matrix */ uint32_t nx; /**< number of elements on the x-axis of the matrix */ uint32_t ny; /**< number of elements on the y-axis of the matrix */ uint32_t ld; /**< number of elements between each row of the matrix. Maybe be equal to starpu_matrix_interface::nx when there is no padding. */ size_t elemsize; /**< size of the elements of the matrix */ size_t allocsize; /**< size actually currently allocated */ }; /** 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 */ 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); /** Similar to starpu_matrix_data_register, but additionally specifies which allocation size should be used instead of the initial nx*ny*elemsize. */ void starpu_matrix_data_register_allocsize(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize, size_t allocsize); /** 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. */ 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); /** Return the number of elements on the x-axis of the matrix designated by \p handle. */ uint32_t starpu_matrix_get_nx(starpu_data_handle_t handle); /** Return the number of elements on the y-axis of the matrix designated by \p handle. */ uint32_t starpu_matrix_get_ny(starpu_data_handle_t handle); /** 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. */ uint32_t starpu_matrix_get_local_ld(starpu_data_handle_t handle); /** Return the local pointer associated with \p handle. */ uintptr_t starpu_matrix_get_local_ptr(starpu_data_handle_t handle); /** Return the size of the elements registered into the matrix designated by \p handle. */ size_t starpu_matrix_get_elemsize(starpu_data_handle_t handle); /** Return the allocated size of the matrix designated by \p handle. */ size_t starpu_matrix_get_allocsize(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) ; }) #define STARPU_MATRIX_GET_ALLOCSIZE(interface) ({ STARPU_MATRIX_CHECK(interface); (((struct starpu_matrix_interface *)(interface))->allocsize) ; }) #else /** 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. */ #define STARPU_MATRIX_GET_PTR(interface) (((struct starpu_matrix_interface *)(interface))->ptr) /** Return a device handle for the matrix designated by \p interface, to be used with OpenCL. The offset returned by ::STARPU_MATRIX_GET_OFFSET has to be used in addition to this. */ #define STARPU_MATRIX_GET_DEV_HANDLE(interface) (((struct starpu_matrix_interface *)(interface))->dev_handle) /** Return the offset in the matrix designated by \p interface, to be used with the device handle. */ #define STARPU_MATRIX_GET_OFFSET(interface) (((struct starpu_matrix_interface *)(interface))->offset) /** Return the number of elements on the x-axis of the matrix designated by \p interface. */ #define STARPU_MATRIX_GET_NX(interface) (((struct starpu_matrix_interface *)(interface))->nx) /** Return the number of elements on the y-axis of the matrix designated by \p interface. */ #define STARPU_MATRIX_GET_NY(interface) (((struct starpu_matrix_interface *)(interface))->ny) /** 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. */ #define STARPU_MATRIX_GET_LD(interface) (((struct starpu_matrix_interface *)(interface))->ld) /** Return the size of the elements registered into the matrix designated by \p interface. */ #define STARPU_MATRIX_GET_ELEMSIZE(interface) (((struct starpu_matrix_interface *)(interface))->elemsize) /** Return the allocated size of the matrix designated by \p interface. */ #define STARPU_MATRIX_GET_ALLOCSIZE(interface) (((struct starpu_matrix_interface *)(interface))->allocsize) #endif /** Set the number of elements on the x-axis of the matrix designated by \p interface. */ #define STARPU_MATRIX_SET_NX(interface, newnx) do { \ STARPU_MATRIX_CHECK(interface); \ (((struct starpu_matrix_interface *)(interface))->nx) = (newnx); \ } while (0) /** Set the number of elements on the y-axis of the matrix designated by \p interface. */ #define STARPU_MATRIX_SET_NY(interface, newny) do { \ STARPU_MATRIX_CHECK(interface); \ (((struct starpu_matrix_interface *)(interface))->ny) = (newny); \ } while(0) /** Set the number of elements between each row of the matrix designated by \p interface. May be set to the same value as nx when there is no padding. */ #define STARPU_MATRIX_SET_LD(interface, newld) do { \ STARPU_MATRIX_CHECK(interface); \ (((struct starpu_matrix_interface *)(interface))->ld) = (newld); \ } while(0) /** @} */ /** @name Accessing COO Data Interfaces @{ */ extern struct starpu_data_interface_ops starpu_interface_coo_ops; /** COO Matrices */ struct starpu_coo_interface { enum starpu_data_interface_id id; /**< identifier of the interface */ uint32_t *columns; /**< column array of the matrix */ uint32_t *rows; /**< row array of the matrix */ uintptr_t values; /**< values of the matrix */ uint32_t nx; /**< number of elements on the x-axis of the matrix */ uint32_t ny; /**< number of elements on the y-axis of the matrix */ uint32_t n_values; /**< number of values registered in the matrix */ size_t elemsize; /**< size of the elements of the matrix */ }; /** 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. */ 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); /** Return a pointer to the column array of the matrix designated by \p interface. */ #define STARPU_COO_GET_COLUMNS(interface) (((struct starpu_coo_interface *)(interface))->columns) /** Return a device handle for the column array of the matrix designated by \p interface, to be used with OpenCL. The offset returned by ::STARPU_COO_GET_OFFSET has to be used in addition to this. */ #define STARPU_COO_GET_COLUMNS_DEV_HANDLE(interface) (((struct starpu_coo_interface *)(interface))->columns) /** Return a pointer to the rows array of the matrix designated by \p interface. */ #define STARPU_COO_GET_ROWS(interface) (((struct starpu_coo_interface *)(interface))->rows) /** Return a device handle for the row array of the matrix designated by \p interface, to be used on OpenCL. The offset returned by ::STARPU_COO_GET_OFFSET has to be used in addition to this. */ #define STARPU_COO_GET_ROWS_DEV_HANDLE(interface) (((struct starpu_coo_interface *)(interface))->rows) /** Return a pointer to the values array of the matrix designated by \p interface. */ #define STARPU_COO_GET_VALUES(interface) (((struct starpu_coo_interface *)(interface))->values) /** Return a device handle for the value array of the matrix designated by \p interface, to be used on OpenCL. The offset returned by ::STARPU_COO_GET_OFFSET has to be used in addition to this. */ #define STARPU_COO_GET_VALUES_DEV_HANDLE(interface) (((struct starpu_coo_interface *)(interface))->values) /** Return the offset in the arrays of the COO matrix designated by \p interface. */ #define STARPU_COO_GET_OFFSET 0 /** Return the number of elements on the x-axis of the matrix designated by \p interface. */ #define STARPU_COO_GET_NX(interface) (((struct starpu_coo_interface *)(interface))->nx) /** Return the number of elements on the y-axis of the matrix designated by \p interface. */ #define STARPU_COO_GET_NY(interface) (((struct starpu_coo_interface *)(interface))->ny) /** Return the number of values registered in the matrix designated by \p interface. */ #define STARPU_COO_GET_NVALUES(interface) (((struct starpu_coo_interface *)(interface))->n_values) /** Return the size of the elements registered into the matrix designated by \p interface. */ #define STARPU_COO_GET_ELEMSIZE(interface) (((struct starpu_coo_interface *)(interface))->elemsize) /** @} */ /** @name Block Data Interface @{ */ extern struct starpu_data_interface_ops starpu_interface_block_ops; /* TODO: rename to 3dmatrix? */ /* TODO: add allocsize support */ /** Block interface for 3D dense blocks */ struct starpu_block_interface { enum starpu_data_interface_id id; /**< identifier of the interface */ uintptr_t ptr; /**< local pointer of the block */ uintptr_t dev_handle; /**< device handle of the block. */ size_t offset; /**< offset in the block. */ uint32_t nx; /**< number of elements on the x-axis of the block. */ uint32_t ny; /**< number of elements on the y-axis of the block. */ uint32_t nz; /**< number of elements on the z-axis of the block. */ uint32_t ldy; /**< number of elements between two lines */ uint32_t ldz; /**< number of elements between two planes */ size_t elemsize; /**< size of the elements of the block. */ }; /** 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 */ 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); /** 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. */ 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); /** Return the number of elements on the x-axis of the block designated by \p handle. */ uint32_t starpu_block_get_nx(starpu_data_handle_t handle); /** Return the number of elements on the y-axis of the block designated by \p handle. */ uint32_t starpu_block_get_ny(starpu_data_handle_t handle); /** Return the number of elements on the z-axis of the block designated by \p handle. */ uint32_t starpu_block_get_nz(starpu_data_handle_t handle); /** Return the number of elements between each row of the block designated by \p handle, in the format of the current memory node. */ uint32_t starpu_block_get_local_ldy(starpu_data_handle_t handle); /** Return the number of elements between each z plane of the block designated by \p handle, in the format of the current memory node. */ uint32_t starpu_block_get_local_ldz(starpu_data_handle_t handle); /** Return the local pointer associated with \p handle. */ uintptr_t starpu_block_get_local_ptr(starpu_data_handle_t handle); /** Return the size of the elements of the block designated by \p 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 /** Return a pointer to the block designated by \p interface. */ #define STARPU_BLOCK_GET_PTR(interface) (((struct starpu_block_interface *)(interface))->ptr) /** Return a device handle for the block designated by \p interface, to be used on OpenCL. The offset returned by ::STARPU_BLOCK_GET_OFFSET has to be used in addition to this. */ #define STARPU_BLOCK_GET_DEV_HANDLE(interface) (((struct starpu_block_interface *)(interface))->dev_handle) /** Return the offset in the block designated by \p interface, to be used with the device handle. */ #define STARPU_BLOCK_GET_OFFSET(interface) (((struct starpu_block_interface *)(interface))->offset) /** Return the number of elements on the x-axis of the block designated by \p interface. */ #define STARPU_BLOCK_GET_NX(interface) (((struct starpu_block_interface *)(interface))->nx) /** Return the number of elements on the y-axis of the block designated by \p interface. */ #define STARPU_BLOCK_GET_NY(interface) (((struct starpu_block_interface *)(interface))->ny) /** Return the number of elements on the z-axis of the block designated by \p interface. */ #define STARPU_BLOCK_GET_NZ(interface) (((struct starpu_block_interface *)(interface))->nz) /** 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. */ #define STARPU_BLOCK_GET_LDY(interface) (((struct starpu_block_interface *)(interface))->ldy) /** 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. */ #define STARPU_BLOCK_GET_LDZ(interface) (((struct starpu_block_interface *)(interface))->ldz) /** Return the size of the elements of the block designated by \p interface. */ #define STARPU_BLOCK_GET_ELEMSIZE(interface) (((struct starpu_block_interface *)(interface))->elemsize) #endif /** @} */ /** @name Vector Data Interface @{ */ extern struct starpu_data_interface_ops starpu_interface_vector_ops; /** */ struct starpu_vector_interface { enum starpu_data_interface_id id; /**< Identifier of the interface */ uintptr_t ptr; /**< local pointer of the vector */ uintptr_t dev_handle; /**< device handle of the vector. */ size_t offset; /**< offset in the vector */ uint32_t nx; /**< number of elements on the x-axis of the vector */ size_t elemsize; /**< size of the elements of the vector */ uint32_t slice_base; /**< vector slice base, used by the StarPU OpenMP runtime support */ size_t allocsize; /**< size actually currently allocated */ }; /** Register the \p nx \p 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 */ void starpu_vector_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize); /** Similar to starpu_matrix_data_register, but additionally specifies which allocation size should be used instead of the initial nx*elemsize. */ void starpu_vector_data_register_allocsize(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize, size_t allocsize); /** 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) */ void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset); /** Return the number of elements registered into the array designated by \p handle. */ uint32_t starpu_vector_get_nx(starpu_data_handle_t handle); /** Return the size of each element of the array designated by \p handle. */ size_t starpu_vector_get_elemsize(starpu_data_handle_t handle); /** Return the allocated size of the array designated by \p handle. */ size_t starpu_vector_get_allocsize(starpu_data_handle_t handle); /** Return the local pointer associated with \p 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_ALLOCSIZE(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->allocsize); }) #define STARPU_VECTOR_GET_SLICE_BASE(interface) ({ STARPU_VECTOR_CHECK(interface); (((struct starpu_vector_interface *)(interface))->slice_base); }) #else /** 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. */ #define STARPU_VECTOR_GET_PTR(interface) (((struct starpu_vector_interface *)(interface))->ptr) /** Return a device handle for the array designated by \p interface, to be used with OpenCL. the offset returned by ::STARPU_VECTOR_GET_OFFSET has to be used in addition to this. */ #define STARPU_VECTOR_GET_DEV_HANDLE(interface) (((struct starpu_vector_interface *)(interface))->dev_handle) /** Return the offset in the array designated by \p interface, to be used with the device handle. */ #define STARPU_VECTOR_GET_OFFSET(interface) (((struct starpu_vector_interface *)(interface))->offset) /** Return the number of elements registered into the array designated by \p interface. */ #define STARPU_VECTOR_GET_NX(interface) (((struct starpu_vector_interface *)(interface))->nx) /** Return the size of each element of the array designated by \p interface. */ #define STARPU_VECTOR_GET_ELEMSIZE(interface) (((struct starpu_vector_interface *)(interface))->elemsize) /** Return the size of each element of the array designated by \p interface. */ #define STARPU_VECTOR_GET_ALLOCSIZE(interface) (((struct starpu_vector_interface *)(interface))->allocsize) /** Return the OpenMP slice base annotation of each element of the array designated by \p interface. */ #define STARPU_VECTOR_GET_SLICE_BASE(interface) (((struct starpu_vector_interface *)(interface))->slice_base) #endif /** Set the number of elements registered into the array designated by \p interface. */ #define STARPU_VECTOR_SET_NX(interface, newnx) do { \ STARPU_VECTOR_CHECK(interface); \ (((struct starpu_vector_interface *)(interface))->nx) = (newnx); \ } while(0) /** @} */ /** @name Variable Data Interface @{ */ extern struct starpu_data_interface_ops starpu_interface_variable_ops; /** Variable interface for a single data (not a vector, a matrix, a list, ...) */ struct starpu_variable_interface { enum starpu_data_interface_id id; /**< Identifier of the interface */ uintptr_t ptr; /**< local pointer of the variable */ uintptr_t dev_handle; /**< device handle of the variable. */ size_t offset; /**< offset in the variable */ size_t elemsize; /**< size of the variable */ }; /** 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 = 42.0; starpu_data_handle_t var_handle; starpu_variable_data_register(&var_handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); \endcode */ void starpu_variable_data_register(starpu_data_handle_t *handle, int home_node, uintptr_t ptr, size_t size); /** 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) */ void starpu_variable_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset); /** Return the size of the variable designated by \p handle. */ size_t starpu_variable_get_elemsize(starpu_data_handle_t handle); /** Return a pointer to the variable designated by \p 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 /** Return a pointer to the variable designated by \p interface. */ #define STARPU_VARIABLE_GET_PTR(interface) (((struct starpu_variable_interface *)(interface))->ptr) /** Return the offset in the variable designated by \p interface, to be used with the device handle. */ #define STARPU_VARIABLE_GET_OFFSET(interface) (((struct starpu_variable_interface *)(interface))->offset) /** Return the size of the variable designated by \p interface. */ #define STARPU_VARIABLE_GET_ELEMSIZE(interface) (((struct starpu_variable_interface *)(interface))->elemsize) /** Return a device handle for the variable designated by \p interface, to be used with OpenCL. The offset returned by ::STARPU_VARIABLE_GET_OFFSET has to be used in addition to this. */ #define STARPU_VARIABLE_GET_DEV_HANDLE(interface) (((struct starpu_variable_interface *)(interface))->ptr) #endif /** @} */ /** @name Void Data Interface @{ */ extern struct starpu_data_interface_ops starpu_interface_void_ops; /** 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. */ void starpu_void_data_register(starpu_data_handle_t *handle); /** @} */ /** @name CSR Data Interface @{ */ extern struct starpu_data_interface_ops starpu_interface_csr_ops; /** CSR interface for sparse matrices (compressed sparse row representation) */ struct starpu_csr_interface { enum starpu_data_interface_id id; /**< Identifier of the interface */ uint32_t nnz; /**< number of non-zero entries */ uint32_t nrow; /**< number of rows */ uintptr_t nzval; /**< non-zero values */ uint32_t *colind; /**< position of non-zero entries on the row */ uint32_t *rowptr; /**< index (in nzval) of the first entry of the row */ uint32_t firstentry; /**< k for k-based indexing (0 or 1 usually). also useful when partitionning the matrix. */ size_t elemsize; /**< size of the elements of the matrix */ }; /** Register a CSR (Compressed Sparse Row Representation) sparse matrix. */ 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); /** Return the number of non-zero values in the matrix designated by \p handle. */ uint32_t starpu_csr_get_nnz(starpu_data_handle_t handle); /** Return the size of the row pointer array of the matrix designated by \p handle. */ uint32_t starpu_csr_get_nrow(starpu_data_handle_t handle); /** Return the index at which all arrays (the column indexes, the row pointers...) of the matrix designated by \p handle. */ uint32_t starpu_csr_get_firstentry(starpu_data_handle_t handle); /** Return a local pointer to the non-zero values of the matrix designated by \p handle. */ uintptr_t starpu_csr_get_local_nzval(starpu_data_handle_t handle); /** Return a local pointer to the column index of the matrix designated by \p handle. */ uint32_t *starpu_csr_get_local_colind(starpu_data_handle_t handle); /** Return a local pointer to the row pointer array of the matrix designated by \p handle. */ uint32_t *starpu_csr_get_local_rowptr(starpu_data_handle_t handle); /** Return the size of the elements registered into the matrix designated by \p handle. */ size_t starpu_csr_get_elemsize(starpu_data_handle_t handle); /** Return the number of non-zero values in the matrix designated by \p interface. */ #define STARPU_CSR_GET_NNZ(interface) (((struct starpu_csr_interface *)(interface))->nnz) /** Return the size of the row pointer array of the matrix designated by \p interface. */ #define STARPU_CSR_GET_NROW(interface) (((struct starpu_csr_interface *)(interface))->nrow) /** Return a pointer to the non-zero values of the matrix designated by \p interface. */ #define STARPU_CSR_GET_NZVAL(interface) (((struct starpu_csr_interface *)(interface))->nzval) /** Return a device handle for the array of non-zero values in the matrix designated by \p interface. The offset returned by ::STARPU_CSR_GET_OFFSET has to used in addition to this. */ #define STARPU_CSR_GET_NZVAL_DEV_HANDLE(interface) (((struct starpu_csr_interface *)(interface))->nnz) /** Return a pointer to the column index of the matrix designated by \p interface. */ #define STARPU_CSR_GET_COLIND(interface) (((struct starpu_csr_interface *)(interface))->colind) /** Return a device handle for the column index of the matrix designated by \p interface. The offset returned by ::STARPU_CSR_GET_OFFSET has to be used in addition to this. */ #define STARPU_CSR_GET_COLIND_DEV_HANDLE(interface) (((struct starpu_csr_interface *)(interface))->colind) /** Return a pointer to the row pointer array of the matrix designated by \p interface. */ #define STARPU_CSR_GET_ROWPTR(interface) (((struct starpu_csr_interface *)(interface))->rowptr) /** Return a device handle for the row pointer array of the matrix designated by \p interface. The offset returned by ::STARPU_CSR_GET_OFFSET has to be used in addition to this. */ #define STARPU_CSR_GET_ROWPTR_DEV_HANDLE(interface) (((struct starpu_csr_interface *)(interface))->rowptr) /** Return the offset in the arrays (colind, rowptr, nzval) of the matrix designated by \p interface, to be used with the device handles. */ #define STARPU_CSR_GET_OFFSET 0 /** Return the index at which all arrays (the column indexes, the row pointers...) of the \p interface start. */ #define STARPU_CSR_GET_FIRSTENTRY(interface) (((struct starpu_csr_interface *)(interface))->firstentry) /** Return the size of the elements registered into the matrix designated by \p interface. */ #define STARPU_CSR_GET_ELEMSIZE(interface) (((struct starpu_csr_interface *)(interface))->elemsize) /** @} */ /** @name BCSR Data Interface @{ */ extern struct starpu_data_interface_ops starpu_interface_bcsr_ops; /** BCSR interface for sparse matrices (blocked compressed sparse row representation) Note: when a BCSR matrix is partitioned, nzval, colind, and rowptr point into the corresponding father arrays. The rowptr content is thus the same as the father's. Firstentry is used to offset this so it becomes valid for the child arrays. */ struct starpu_bcsr_interface { enum starpu_data_interface_id id; /**< Identifier of the interface */ uint32_t nnz; /**< number of non-zero BLOCKS */ uint32_t nrow; /**< number of rows (in terms of BLOCKS) */ uintptr_t nzval; /**< non-zero values: nnz blocks of r*c elements */ uint32_t *colind; /**< array of nnz elements, colind[i] is the block-column index for block i in nzval */ uint32_t *rowptr; /**< array of nrow+1 * elements, rowptr[i] is * the block-index (in * nzval) of the first block * of row i. By convention, * rowptr[nrow] is the * number of blocks, this * allows an easier access * of the matrix's elements * for the kernels. */ uint32_t firstentry; /**< k for k-based indexing (0 or 1 usually). Also useful when partitionning the matrix. */ uint32_t r; /**< height of the blocks */ uint32_t c; /**< width of the blocks */ size_t elemsize; /**< size of the elements of the matrix */ }; /** 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 nrow 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 nrow+1 elements, rowptr[i] is the block-index (in \p nzval) of the first block of row i. By convention, rowptr[nrow] 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 with the following matrix: \code | 0 1 0 0 | \endcode \code | 2 3 0 0 | \endcode \code | 4 5 8 9 | \endcode \code | 6 7 10 11 | \endcode \code nzval = [0, 1, 2, 3] ++ [4, 5, 6, 7] ++ [8, 9, 10, 11] \endcode \code colind = [0, 0, 1] \endcode \code rowptr = [0, 1, 3] \endcode \code r = c = 2 \endcode which translates into the following code \code{.c} int R = 2; // Size of the blocks 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 */ 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); /** Return the number of non-zero elements in the matrix designated by \p handle. */ uint32_t starpu_bcsr_get_nnz(starpu_data_handle_t handle); /** Return the number of rows (in terms of blocks of size r*c) in the matrix designated by \p handle. */ uint32_t starpu_bcsr_get_nrow(starpu_data_handle_t handle); /** Return the index at which all arrays (the column indexes, the row pointers...) of the matrix desginated by \p handle. */ uint32_t starpu_bcsr_get_firstentry(starpu_data_handle_t handle); /** Return a pointer to the non-zero values of the matrix designated by \p handle. */ uintptr_t starpu_bcsr_get_local_nzval(starpu_data_handle_t handle); /** Return a pointer to the column index, which holds the positions of the non-zero entries in the matrix designated by \p handle. */ uint32_t *starpu_bcsr_get_local_colind(starpu_data_handle_t handle); /** Return the row pointer array of the matrix designated by \p handle. */ uint32_t *starpu_bcsr_get_local_rowptr(starpu_data_handle_t handle); /** Return the number of rows in a block. */ uint32_t starpu_bcsr_get_r(starpu_data_handle_t handle); /** Return the number of columns in a block. */ uint32_t starpu_bcsr_get_c(starpu_data_handle_t handle); /** Return the size of the elements in the matrix designated by \p handle. */ size_t starpu_bcsr_get_elemsize(starpu_data_handle_t handle); /** Return the number of non-zero values in the matrix designated by \p interface. */ #define STARPU_BCSR_GET_NNZ(interface) (((struct starpu_bcsr_interface *)(interface))->nnz) /** Return the number of block rows in the matrix designated by \p interface. */ #define STARPU_BCSR_GET_NROW(interface) (((struct starpu_bcsr_interface *)(interface))->nrow) /** Return a pointer to the non-zero values of the matrix designated by \p interface. */ #define STARPU_BCSR_GET_NZVAL(interface) (((struct starpu_bcsr_interface *)(interface))->nzval) /** Return a device handle for the array of non-zero values in the matrix designated by \p interface. The offset returned by ::STARPU_BCSR_GET_OFFSET has to be used in addition to this. */ #define STARPU_BCSR_GET_NZVAL_DEV_HANDLE(interface) (((struct starpu_bcsr_interface *)(interface))->nnz) /** Return a pointer to the column index of the matrix designated by \p interface. */ #define STARPU_BCSR_GET_COLIND(interface) (((struct starpu_bcsr_interface *)(interface))->colind) /** Return a device handle for the column index of the matrix designated by \p interface. The offset returned by ::STARPU_BCSR_GET_OFFSET has to be used in addition to this. */ #define STARPU_BCSR_GET_COLIND_DEV_HANDLE(interface) (((struct starpu_bcsr_interface *)(interface))->colind) /** Return a pointer to the row pointer array of the matrix designated by \p interface. */ #define STARPU_BCSR_GET_ROWPTR(interface) (((struct starpu_bcsr_interface *)(interface))->rowptr) /** Return a device handle for the row pointer array of the matrix designated by \p interface. The offset returned by ::STARPU_BCSR_GET_OFFSET has to be used in addition to this. */ #define STARPU_BCSR_GET_ROWPTR_DEV_HANDLE(interface) (((struct starpu_bcsr_interface *)(interface))->rowptr) /** Return the base of the indexing (0 or 1 usually) in the matrix designated by \p interface. */ #define STARPU_BCSR_GET_FIRSTENTRY(interface) (((struct starpu_bcsr_interface *)(interface))->firstentry) /** Return the height of blocks in the matrix designated by \p interface. */ #define STARPU_BCSR_GET_R(interface) (((struct starpu_bcsr_interface *)(interface))->r) /** Return the width of blocks in the matrix designated by \p interface. */ #define STARPU_BCSR_GET_C(interface) (((struct starpu_bcsr_interface *)(interface))->c) /** Return the size of elements in the matrix designated by \p interface. */ #define STARPU_BCSR_GET_ELEMSIZE(interface) (((struct starpu_bcsr_interface *)(interface))->elemsize) /** Return the offset in the arrays (coling, rowptr, nzval) of the matrix designated by \p interface, to be used with the device handles. */ #define STARPU_BCSR_GET_OFFSET 0 /** @} */ /** @name Multiformat Data Interface @{ */ /** Multiformat operations */ struct starpu_multiformat_data_interface_ops { size_t cpu_elemsize; /**< size of each element on CPUs */ size_t opencl_elemsize; /**< size of each element on OpenCL devices */ struct starpu_codelet *cpu_to_opencl_cl; /**< pointer to a codelet which converts from CPU to OpenCL */ struct starpu_codelet *opencl_to_cpu_cl; /**< pointer to a codelet which converts from OpenCL to CPU */ size_t cuda_elemsize; /**< size of each element on CUDA devices */ struct starpu_codelet *cpu_to_cuda_cl; /**< pointer to a codelet which converts from CPU to CUDA */ struct starpu_codelet *cuda_to_cpu_cl; /**< pointer to a codelet which converts from CUDA to CPU */ size_t mic_elemsize; /**< size of each element on MIC devices */ struct starpu_codelet *cpu_to_mic_cl; /**< pointer to a codelet which converts from CPU to MIC */ struct starpu_codelet *mic_to_cpu_cl; /**< pointer to a codelet which converts from MIC to CPU */ }; 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; }; /** 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. */ 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); /** Return the local pointer to the data with CPU format. */ #define STARPU_MULTIFORMAT_GET_CPU_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->cpu_ptr) /** Return the local pointer to the data with CUDA format. */ #define STARPU_MULTIFORMAT_GET_CUDA_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->cuda_ptr) /** Return the local pointer to the data with OpenCL format. */ #define STARPU_MULTIFORMAT_GET_OPENCL_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->opencl_ptr) /** Return the local pointer to the data with MIC format. */ #define STARPU_MULTIFORMAT_GET_MIC_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->mic_ptr) /** Return the number of elements in the data. */ #define STARPU_MULTIFORMAT_GET_NX(interface) (((struct starpu_multiformat_interface *)(interface))->nx) /** @} */ /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_DATA_INTERFACES_H__ */ starpu-1.3.9+dfsg/include/starpu_deprecated_api.h000066400000000000000000000135621413463044200221140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/include/starpu_disk.h000066400000000000000000000165461413463044200201220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 /** @defgroup API_Out_Of_Core Out Of Core @{ */ /** Set of functions to manipulate datas on disk. */ struct starpu_disk_ops { /** 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. */ void * (*plug) (void *parameter, starpu_ssize_t size); /** Disconnect a disk memory \p base. */ void (*unplug) (void *base); /** Measure the bandwidth and the latency for the disk \p node and save it. Returns 1 if it could measure it. */ int (*bandwidth) (unsigned node, void *base); /** Create a new location for datas of size \p size. Return an opaque object pointer. */ void * (*alloc) (void *base, size_t size); /** Free a data \p obj previously allocated with starpu_disk_ops::alloc. */ void (*free) (void *base, void *obj, size_t size); /** Open an existing location of datas, at a specific position \p pos dependent on the backend. */ void * (*open) (void *base, void *pos, size_t size); /** Close, without deleting it, a location of datas \p obj. */ void (*close) (void *base, void *obj, size_t size); /** Read \p size bytes of data from \p obj in \p base, at offset \p offset, and put into \p buf. Return the actual number of read bytes. */ int (*read) (void *base, void *obj, 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. Return 0 on success. */ int (*write) (void *base, void *obj, const void *buf, off_t offset, 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 */ int (*full_read) (void * base, void * obj, void ** ptr, size_t * size, unsigned dst_node); /** 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. */ int (*full_write) (void * base, void * obj, void * ptr, size_t size); /** Asynchronously write \p size bytes of data to \p obj in \p base, at offset \p offset, from \p buf. Return a void* pointer that StarPU will pass to \c xxx_request methods for testing for the completion. */ void * (*async_write) (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. Return a void* pointer that StarPU will pass to \c xxx_request methods for testing for the completion. */ void * (*async_read) (void *base, void *obj, void *buf, off_t offset, size_t size); /** Read all data from \p obj of \p base, from offset 0. Return it in an allocated buffer \p ptr, of size \p size */ void * (*async_full_read) (void * base, void * obj, void ** ptr, size_t * size, unsigned dst_node); /** Write data in \p ptr to \p obj of \p base, from offset 0, and truncate \p obj to \p size, so that a starpu_disk_ops::full_read will get it. */ void * (*async_full_write) (void * base, void * obj, void * ptr, 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. Return a void* pointer that StarPU will pass to \c xxx_request methods for testing for the completion. */ 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); /** Wait for completion of request \p async_channel returned by a previous asynchronous read, write or copy. */ void (*wait_request) (void * async_channel); /** Test for completion of request \p async_channel returned by a previous asynchronous read, write or copy. Return 1 on completion, 0 otherwise. */ int (*test_request) (void * async_channel); /** Free the request allocated by a previous asynchronous read, write or copy. */ void (*free_request)(void * async_channel); /* TODO: readv, writev, read2d, write2d, etc. */ }; /** Use the stdio library (fwrite, fread...) to read/write on disk. Warning: It creates one file per allocation ! Do not support asynchronous transfers. */ extern struct starpu_disk_ops starpu_disk_stdio_ops; /** Use the HDF5 library. It doesn't support multiple opening from different processes. You may only allow one process to write in the HDF5 file. If HDF5 library is not compiled with --thread-safe you can't open more than one HDF5 file at the same time. */ extern struct starpu_disk_ops starpu_disk_hdf5_ops; /** Use the unistd library (write, read...) to read/write on disk. Warning: It creates one file per allocation ! */ extern struct starpu_disk_ops starpu_disk_unistd_ops; /** Use 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. */ extern struct starpu_disk_ops starpu_disk_unistd_o_direct_ops; /** Use the leveldb created by Google. More information at https://code.google.com/p/leveldb/ Do not support asynchronous transfers. */ extern struct starpu_disk_ops starpu_disk_leveldb_ops; /** Close an existing data opened with starpu_disk_open(). */ void starpu_disk_close(unsigned node, void *obj, size_t size); /** Open an existing file memory in a disk node. \p size is the size of the file. \p pos is the specific position dependent on the backend, given to the \c open method of the disk operations. Return an opaque object pointer. */ void *starpu_disk_open(unsigned node, void *pos, size_t size); /** 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. */ int starpu_disk_register(struct starpu_disk_ops *func, void *parameter, starpu_ssize_t size); /** Minimum size of a registered disk. The size of a disk is the last parameter of the function starpu_disk_register(). */ #define STARPU_DISK_SIZE_MIN (16*1024*1024) /** Contain the node number of the disk swap, if set up through the \ref STARPU_DISK_SWAP variable. */ extern int starpu_disk_swap_node; /** @} */ #endif /* __STARPU_DISK_H__ */ starpu-1.3.9+dfsg/include/starpu_driver.h000066400000000000000000000052311413463044200204500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Running_Drivers Running Drivers @{ */ /** structure for a driver */ struct starpu_driver { /** Type of the driver. Only ::STARPU_CPU_WORKER, ::STARPU_CUDA_WORKER and ::STARPU_OPENCL_WORKER are currently supported. */ enum starpu_worker_archtype type; /** Identifier of the driver. */ 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; }; /** Initialize the given driver, run it until it receives a request to terminate, deinitialize it and return 0 on success. Return -EINVAL if starpu_driver::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 finally starpu_driver_deinit(). */ int starpu_driver_run(struct starpu_driver *d); /** Notify all running drivers that they should terminate. */ void starpu_drivers_request_termination(void); /** Initialize the given driver. Return 0 on success, -EINVAL if starpu_driver::type is not a valid ::starpu_worker_archtype. */ int starpu_driver_init(struct starpu_driver *d); /** Run the driver once, then return 0 on success, -EINVAL if starpu_driver::type is not a valid ::starpu_worker_archtype. */ int starpu_driver_run_once(struct starpu_driver *d); /** Deinitialize the given driver. Return 0 on success, -EINVAL if starpu_driver::type is not a valid ::starpu_worker_archtype. */ int starpu_driver_deinit(struct starpu_driver *d); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_DRIVER_H__ */ starpu-1.3.9+dfsg/include/starpu_expert.h000066400000000000000000000026171413463044200204710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Expert_Mode Expert Mode @{ */ /** Wake all the workers, so they can inspect data requests and task submissions again. */ void starpu_wake_all_blocked_workers(void); /** Register a progression hook, to be called when workers are idle. */ int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg); /** Unregister a given progression hook. */ void starpu_progression_hook_deregister(int hook_id); int starpu_idle_hook_register(unsigned (*func)(void *arg), void *arg); void starpu_idle_hook_deregister(int hook_id); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_H__ */ starpu-1.3.9+dfsg/include/starpu_fxt.h000066400000000000000000000102061413463044200177540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Joris Pablo * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_FxT_Support FxT Support @{ */ #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; unsigned no_smooth; unsigned no_acquire; unsigned memory_states; unsigned internal; unsigned label_deps; 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 *states_path; char *dir; /** 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. */ char *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. */ uint64_t 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. */ int file_rank; /** Output parameters */ char worker_names[STARPU_NMAXWORKERS][256]; /** Output parameters */ struct starpu_perfmodel_arch worker_archtypes[STARPU_NMAXWORKERS]; /** Output parameters */ int nworkers; /** In case we want to dump the list of codelets to an external tool */ struct starpu_fxt_codelet_event **dumped_codelets; /** In case we want to dump the list of codelets to an external tool */ long dumped_codelets_count; }; void starpu_fxt_options_init(struct starpu_fxt_options *options); void starpu_fxt_options_shutdown(struct starpu_fxt_options *options); void starpu_fxt_options_set_dir(struct starpu_fxt_options *options); void starpu_fxt_generate_trace(struct starpu_fxt_options *options); /** Determine whether profiling should be started by starpu_init(), or only when starpu_fxt_start_profiling() is called. \p autostart should be 1 to do so, or 0 to prevent it. */ void starpu_fxt_autostart_profiling(int autostart); /** 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. */ void starpu_fxt_start_profiling(void); /** 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. */ void starpu_fxt_stop_profiling(void); void starpu_fxt_write_data_trace(char *filename_in); /** Wrapper to get value of env variable STARPU_FXT_TRACE */ int starpu_fxt_is_enabled(); /** Add an event in the execution trace if FxT is enabled. */ void starpu_fxt_trace_user_event(unsigned long code); /** Add a string event in the execution trace if FxT is enabled. */ void starpu_fxt_trace_user_event_string(const char *s); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_FXT_H__ */ starpu-1.3.9+dfsg/include/starpu_hash.h000066400000000000000000000035651413463044200201100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @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. */ uint32_t starpu_hash_crc32c_be_n(const void *input, size_t n, uint32_t inputcrc); /** 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. */ uint32_t starpu_hash_crc32c_be(uint32_t input, uint32_t inputcrc); /** 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. */ uint32_t starpu_hash_crc32c_string(const char *str, uint32_t inputcrc); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_HASH_H__ */ starpu-1.3.9+dfsg/include/starpu_helper.h000066400000000000000000000151111413463044200204320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_HELPER_H__ #define __STARPU_HELPER_H__ #include #include #ifdef STARPU_HAVE_HWLOC #include #endif #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Miscellaneous_Helpers Miscellaneous Helpers @{ */ /** Return the min of the two parameters. */ #define STARPU_MIN(a,b) ((a)<(b)?(a):(b)) /** Return the max of the two parameters. */ #define STARPU_MAX(a,b) ((a)<(b)?(b):(a)) /** Define a value which can be used to mark pointers as invalid values. */ #define STARPU_POISON_PTR ((void *)0xdeadbeef) extern int _starpu_silent; char *starpu_getenv(const char *str); /** If the environment variable \c str is defined and its value is contained in the array \c strings, return the array position. Raise an error if the environment variable \c str is defined with a value not in \c strings Return \c defvalue if the environment variable \c str is not defined. */ int starpu_get_env_string_var_default(const char *str, const char *strings[], int defvalue); /** If the environment variable \c str is defined with a well-defined size value, return the value as a size in bytes. Expected size qualifiers are b, B, k, K, m, M, g, G. The default qualifier is K. If the environment variable \c str is not defined or is empty, return \c defval Raise an error if the value of the environment variable \c str is not well-defined. */ int starpu_get_env_size_default(const char *str, int defval); /** Return the integer value of the environment variable named \p str. Return 0 otherwise (the variable does not exist or has a non-integer value). */ 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 *pcheck; val = strtol(strval, &pcheck, 10); if (*pcheck) { 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 *pcheck; val = strtof(strval, &pcheck); if (*pcheck) { 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; } } /** Execute the given function \p func on a subset of workers. When calling this method, the offloaded function \p func is executed by every StarPU worker that are eligible to 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 \p func has been executed on every appropriate processing units, and thus may not be called from a callback function for instance. */ void starpu_execute_on_each_worker(void (*func)(void *), void *arg, uint32_t where); /** Same as starpu_execute_on_each_worker(), except that the task name is specified in the argument \p name. */ void starpu_execute_on_each_worker_ex(void (*func)(void *), void *arg, uint32_t where, const char *name); /** 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. */ void starpu_execute_on_specific_workers(void (*func)(void*), void *arg, unsigned num_workers, unsigned *workers, const char *name); /** Return the current date in micro-seconds. */ double starpu_timing_now(void); /** 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. */ 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); /** Call hwloc-ps to display binding of each processus and thread running on the machine.
Use the environment variable \ref STARPU_DISPLAY_BINDINGS to automatically call this function at the beginning of the execution of StarPU. */ void starpu_display_bindings(void); /** If \c hwloc is used, convert the given \p logical_index of a PU to the OS index of this PU. If \c hwloc is not used, return \p logical_index. */ int starpu_get_pu_os_index(unsigned logical_index); #ifdef STARPU_HAVE_HWLOC /** Get the hwloc topology used by StarPU. One can use this pointer to get information about topology, but not to change settings related to topology. */ hwloc_topology_t starpu_get_hwloc_topology(void); #endif /** @} */ #ifdef __cplusplus } #endif #endif // __STARPU_HELPER_H__ starpu-1.3.9+dfsg/include/starpu_mic.h000066400000000000000000000031451413463044200177270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_MIC_Extensions MIC Extensions @{ */ /** Type for MIC function symbols */ typedef void *starpu_mic_func_symbol_t; /** Initiate a lookup on each MIC device to find the address of the function named \p func_name, store it in the global array kernels and return the index in the array through \p symbol. */ int starpu_mic_register_kernel(starpu_mic_func_symbol_t *symbol, const char *func_name); /** If successfull, 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_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.3.9+dfsg/include/starpu_mod.f90000066400000000000000000000102131413463044200200770ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/include/starpu_mpi_ms.h000066400000000000000000000023511413463044200204410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_MS_H__ #define __STARPU_MPI_MS_H__ #include #ifdef STARPU_USE_MPI_MASTER_SLAVE #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Master_Slave Master Slave Extension @{ */ typedef void *starpu_mpi_ms_func_symbol_t; int starpu_mpi_ms_register_kernel(starpu_mpi_ms_func_symbol_t *symbol, const char *func_name); starpu_mpi_ms_kernel_t starpu_mpi_ms_get_kernel(starpu_mpi_ms_func_symbol_t symbol); /** @} */ #ifdef __cplusplus } #endif #endif /* STARPU_USE_MPI_MASTER_SLAVE */ #endif /* __STARPU_MPI_MS_H__ */ starpu-1.3.9+dfsg/include/starpu_opencl.h000066400000000000000000000302741413463044200204420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #ifndef CL_TARGET_OPENCL_VERSION #define CL_TARGET_OPENCL_VERSION 100 #endif #ifdef __APPLE__ #include #else #include #endif #include #ifdef __cplusplus extern "C" { #endif /** @defgroup API_OpenCL_Extensions OpenCL Extensions @{ */ /** Store the OpenCL programs as compiled for the different OpenCL devices. */ struct starpu_opencl_program { /** Store each program for each OpenCL device. */ cl_program programs[STARPU_MAXOPENCLDEVS]; }; /** @name Writing OpenCL kernels @{ */ /** Return the OpenCL context of the device designated by \p devid in \p context. */ void starpu_opencl_get_context(int devid, cl_context *context); /** Return the cl_device_id corresponding to \p devid in \p device. */ void starpu_opencl_get_device(int devid, cl_device_id *device); /** Return the command queue of the device designated by \p devid into \p queue. */ void starpu_opencl_get_queue(int devid, cl_command_queue *queue); /** Return the context of the current worker. */ void starpu_opencl_get_current_context(cl_context *context); /** Return the computation kernel command queue of the current worker. */ void starpu_opencl_get_current_queue(cl_command_queue *queue); /** Set 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. Return the number of arguments that were successfully set. In case of failure, return the id of the argument that could not be set and \p err is set to the error returned by OpenCL. Otherwise, return 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 */ int starpu_opencl_set_kernel_args(cl_int *err, cl_kernel *kernel, ...); /** @} */ /** @name Compiling OpenCL kernels 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). @{ */ /** 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. */ void starpu_opencl_load_program_source(const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source); /** Similar to function starpu_opencl_load_program_source() but allocate the buffers \p located_file_name, \p located_dir_name and \p 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); /** Compile the OpenCL kernel stored in the file \p source_file_name with the given options \p build_options and store 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. */ int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char *build_options); /** Compile the OpenCL kernel in the string \p opencl_program_source with the given options \p build_options and store 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. */ int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char *build_options); /** 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_\. */ int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs); /** Compile an OpenCL source code stored in a file. */ int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options); /** Compile an OpenCL source code stored in a string. */ int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options); /** Unload an OpenCL compiled code. */ int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs); /** @} */ /** @name Loading OpenCL kernels @{ */ /** 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. */ int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid); /** Release the given \p kernel, to be called after kernel execution. */ int starpu_opencl_release_kernel(cl_kernel kernel); /** @} */ /** @name OpenCL Statistics @{ */ /** Collect statistics on a kernel execution. After termination of the kernels, the OpenCL codelet should call this function with the event returned by \c clEnqueueNDRangeKernel(), to let StarPU collect statistics about the kernel execution (used cycles, consumed energy). */ int starpu_opencl_collect_stats(cl_event event); /** @} */ /** @name OpenCL Utilities @{ */ /** Return the error message in English corresponding to \p status, an OpenCL error code. */ const char *starpu_opencl_error_string(cl_int status); /** Given a valid error status, print the corresponding error message on \c stdout, along with the function name \p func, the filename \p file, the line number \p line and the message \p msg. */ void starpu_opencl_display_error(const char *func, const char *file, int line, const char *msg, cl_int status); /** Call the function starpu_opencl_display_error() with the error \p status, the current function name, current file and line number, and a empty message. */ #define STARPU_OPENCL_DISPLAY_ERROR(status) starpu_opencl_display_error(__starpu_func__, __FILE__, __LINE__, NULL, status) /** Call the function starpu_opencl_display_error() and abort. */ 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); } /** Call the function starpu_opencl_report_error() with the error \p status, the current function name, current file and line number, and a empty message. */ #define STARPU_OPENCL_REPORT_ERROR(status) starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, NULL, status) /** Call the function starpu_opencl_report_error() with \p msg and \p status, the current function name, current file and line number. */ #define STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status) starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, msg, status) /** Allocate \p size bytes of memory, stored in \p addr. \p flags must be a valid combination of \c cl_mem_flags values. */ cl_int starpu_opencl_allocate_memory(int devid, cl_mem *addr, size_t size, cl_mem_flags flags); /** 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. */ 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); /** 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. */ 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); /** 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. */ 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); /** 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. */ 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.3.9+dfsg/include/starpu_openmp.h000066400000000000000000001127631413463044200204640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_OpenMP_Runtime_Support OpenMP Runtime Support @brief This section describes the interface provided for implementing OpenMP runtimes on top of StarPU. @{ */ #if defined STARPU_OPENMP /** Opaque Simple Lock object (\anchor 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() */ typedef struct { void *internal; /**< opaque pointer for internal use */ } starpu_omp_lock_t; /** Opaque Nestable Lock object (\anchor 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() */ typedef struct { void *internal; /**< opaque pointer for internal use */ } starpu_omp_nest_lock_t; /** Set of constants for selecting the for loop iteration scheduling algorithm (\anchor OMPFor) as defined by the OpenMP specification. \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_sched_value { starpu_omp_sched_undefined = 0, /**< Undefined iteration scheduling algorithm. */ starpu_omp_sched_static = 1, /**< \b Static iteration scheduling algorithm.*/ starpu_omp_sched_dynamic = 2, /**< \b Dynamic iteration scheduling algorithm.*/ starpu_omp_sched_guided = 3, /**< \b Guided iteration scheduling algorithm.*/ starpu_omp_sched_auto = 4, /**< \b Automatically choosen iteration scheduling algorithm.*/ starpu_omp_sched_runtime = 5 /**< Choice of iteration scheduling algorithm deferred at \b runtime.*/ }; /** Set of constants for selecting the processor binding method, as defined in the OpenMP specification. \sa starpu_omp_get_proc_bind() */ enum starpu_omp_proc_bind_value { starpu_omp_proc_bind_undefined = -1, /**< Undefined processor binding method.*/ starpu_omp_proc_bind_false = 0, /**< Team threads may be moved between places at any time.*/ starpu_omp_proc_bind_true = 1, /**< Team threads may not be moved between places.*/ starpu_omp_proc_bind_master = 2, /**< Assign every thread in the team to the same place as the \b master thread.*/ starpu_omp_proc_bind_close = 3, /**< Assign every thread in the team to a place \b close to the parent thread.*/ starpu_omp_proc_bind_spread = 4 /**< Assign team threads as a sparse distribution over the selected places.*/ }; /** Set of attributes used for creating a new parallel region. \sa starpu_omp_parallel_region() */ struct starpu_omp_parallel_region_attr { /** ::starpu_codelet (\ref API_Codelet_And_Tasks) to use for the parallel region implicit tasks. The codelet must provide a CPU implementation function. */ struct starpu_codelet cl; /** Array of zero or more ::starpu_data_handle_t data handle to be passed to the parallel region implicit tasks. */ starpu_data_handle_t *handles; /** Optional pointer to an inline argument to be passed to the region implicit tasks. */ void *cl_arg; /** Size of the optional inline argument to be passed to the region implicit tasks, or 0 if unused. */ size_t cl_arg_size; /** Boolean indicating whether the optional inline argument should be automatically freed (true), or not (false). */ unsigned cl_arg_free; /** Boolean indicating whether the \b if clause of the corresponding pragma omp parallel is true or false. */ int if_clause; /** 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. */ int num_threads; }; /** Set of attributes used for creating a new task region. \sa starpu_omp_task_region() */ struct starpu_omp_task_region_attr { /** ::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. */ struct starpu_codelet cl; /** Array of zero or more ::starpu_data_handle_t data handle to be passed to the task region explicit tasks. */ starpu_data_handle_t *handles; /** Optional pointer to an inline argument to be passed to the region implicit tasks. */ void *cl_arg; /** Size of the optional inline argument to be passed to the region implicit tasks, or 0 if unused. */ size_t cl_arg_size; /** Boolean indicating whether the optional inline argument should be automatically freed (true), or not (false). */ unsigned cl_arg_free; int priority; /** Boolean indicating whether the \b if clause of the corresponding pragma omp task is true or false. */ int if_clause; /** Boolean indicating whether the \b final clause of the corresponding pragma omp task is true or false. */ int final_clause; /** Boolean indicating whether the \b untied clause of the corresponding pragma omp task is true or false. */ int untied_clause; /** Boolean indicating whether the \b mergeable clause of the corresponding pragma omp task is true or false. */ int mergeable_clause; /** taskloop attribute */ int is_loop; int nogroup_clause; int collapse; int num_tasks; unsigned long long nb_iterations; unsigned long long grainsize; unsigned long long begin_i; unsigned long long end_i; unsigned long long chunk; }; #ifdef __cplusplus extern "C" { #define __STARPU_OMP_NOTHROW throw () #else #define __STARPU_OMP_NOTHROW __attribute__((__nothrow__)) #endif /** @name Initialisation @{ */ /** Initialize StarPU and its OpenMP Runtime support. */ extern int starpu_omp_init(void) __STARPU_OMP_NOTHROW; /** Shutdown StarPU and its OpenMP Runtime support. */ extern void starpu_omp_shutdown(void) __STARPU_OMP_NOTHROW; /** @} */ /** @name Parallel \anchor ORS_Parallel @{ */ /** Generate 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. */ extern void starpu_omp_parallel_region(const struct starpu_omp_parallel_region_attr *attr) __STARPU_OMP_NOTHROW; /** Execute 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. */ extern void starpu_omp_master(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW; /** Determine 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. */ extern int starpu_omp_master_inline(void) __STARPU_OMP_NOTHROW; /** @} */ /** @name Synchronization \anchor ORS_Synchronization @{ */ /** Wait 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. */ extern void starpu_omp_barrier(void) __STARPU_OMP_NOTHROW; /** Wait 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. */ extern void starpu_omp_critical(void (*f)(void *arg), void *arg, const char *name) __STARPU_OMP_NOTHROW; /** Wait 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. */ extern void starpu_omp_critical_inline_begin(const char *name) __STARPU_OMP_NOTHROW; /** End 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. */ extern void starpu_omp_critical_inline_end(const char *name) __STARPU_OMP_NOTHROW; /** @} */ /** @name Worksharing \anchor ORS_Worksharing @{ */ /** Ensure 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. */ extern void starpu_omp_single(void (*f)(void *arg), void *arg, int nowait) __STARPU_OMP_NOTHROW; /** Decide 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. */ extern int starpu_omp_single_inline(void) __STARPU_OMP_NOTHROW; /** Execute \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 */ 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; /** Elect 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 */ extern void *starpu_omp_single_copyprivate_inline_begin(void *data) __STARPU_OMP_NOTHROW; /** Complete the execution of a single section and return 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 */ extern void starpu_omp_single_copyprivate_inline_end(void) __STARPU_OMP_NOTHROW; /** Execute 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. */ 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; /** Decide 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 */ 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; /** Decide 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 */ 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; /** Alternative implementation of a parallel loop. Differ 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 */ 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; /** 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 */ 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; /** 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 */ 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; /** Ensure 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. */ extern void starpu_omp_ordered(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW; /** Wait 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. */ extern void starpu_omp_ordered_inline_begin(void) __STARPU_OMP_NOTHROW; /** Notify 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. */ extern void starpu_omp_ordered_inline_end(void) __STARPU_OMP_NOTHROW; /** Ensure 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. */ extern void starpu_omp_sections(unsigned long long nb_sections, void (**section_f)(void *arg), void **section_arg, int nowait) __STARPU_OMP_NOTHROW; /** Alternative implementation of sections. Differ 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 */ 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; /** @} */ /** @name Task \anchor ORS_Task @{ */ /** Generate 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. */ extern void starpu_omp_task_region(const struct starpu_omp_task_region_attr *attr) __STARPU_OMP_NOTHROW; /** Wait 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. */ extern void starpu_omp_taskwait(void) __STARPU_OMP_NOTHROW; /** Launch 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 */ extern void starpu_omp_taskgroup(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW; /** Launch 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 */ extern void starpu_omp_taskgroup_inline_begin(void) __STARPU_OMP_NOTHROW; /** 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_begin */ extern void starpu_omp_taskgroup_inline_end(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_taskloop_inline_begin(struct starpu_omp_task_region_attr *attr) __STARPU_OMP_NOTHROW; extern void starpu_omp_taskloop_inline_end(const struct starpu_omp_task_region_attr *attr) __STARPU_OMP_NOTHROW; /** @} */ /** @name API \anchor ORS_API @{ */ /** Set 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 */ extern void starpu_omp_set_num_threads(int threads) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_num_threads() __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_thread_num() __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_max_threads() __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_num_procs(void) __STARPU_OMP_NOTHROW; /** Return 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. */ extern int starpu_omp_in_parallel(void) __STARPU_OMP_NOTHROW; /** Enable (1) or disable (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 */ extern void starpu_omp_set_dynamic(int dynamic_threads) __STARPU_OMP_NOTHROW; /** Return the state of dynamic thread number adjustment. \return !0 if dynamic thread number adjustment is enabled. \return 0 otherwise. \sa starpu_omp_set_dynamic */ extern int starpu_omp_get_dynamic(void) __STARPU_OMP_NOTHROW; /** Enable (1) or disable (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 */ extern void starpu_omp_set_nested(int nested) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_nested(void) __STARPU_OMP_NOTHROW; /** Return the state of the cancel ICVS var. */ extern int starpu_omp_get_cancellation(void) __STARPU_OMP_NOTHROW; /** Set 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 */ extern void starpu_omp_set_schedule(enum starpu_omp_sched_value kind, int modifier) __STARPU_OMP_NOTHROW; /** Return the current selected default loop scheduler. \return the kind and the modifier of the current default loop scheduler. \sa starpu_omp_set_schedule */ extern void starpu_omp_get_schedule(enum starpu_omp_sched_value *kind, int *modifier) __STARPU_OMP_NOTHROW; /** Return the number of StarPU CPU workers. \return the number of StarPU CPU workers. */ extern int starpu_omp_get_thread_limit(void) __STARPU_OMP_NOTHROW; /** Set 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 */ extern void starpu_omp_set_max_active_levels(int max_levels) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_max_active_levels(void) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_level(void) __STARPU_OMP_NOTHROW; /** Return the number of the ancestor of the current parallel section. \return the number of the ancestor of the current parallel section. */ extern int starpu_omp_get_ancestor_thread_num(int level) __STARPU_OMP_NOTHROW; /** Return the size of the team of the current parallel section. \return the size of the team of the current parallel section. */ extern int starpu_omp_get_team_size(int level) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_active_level(void) __STARPU_OMP_NOTHROW; /** Check whether the current task is final or not. \return !0 if called from a final task. \return 0 otherwise. */ extern int starpu_omp_in_final(void) __STARPU_OMP_NOTHROW; /** Return the proc_bind setting of the current parallel region. \return the proc_bind setting of the current parallel region. */ extern enum starpu_omp_proc_bind_value starpu_omp_get_proc_bind(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_num_places(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_place_num_procs(int place_num) __STARPU_OMP_NOTHROW; extern void starpu_omp_get_place_proc_ids(int place_num, int *ids) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_place_num(void) __STARPU_OMP_NOTHROW; extern int starpu_omp_get_partition_num_places(void) __STARPU_OMP_NOTHROW; extern void starpu_omp_get_partition_place_nums(int *place_nums) __STARPU_OMP_NOTHROW; /** Set 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 */ extern void starpu_omp_set_default_device(int device_num) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_default_device(void) __STARPU_OMP_NOTHROW; /** Return the number of the devices. \return the number of the devices. */ extern int starpu_omp_get_num_devices(void) __STARPU_OMP_NOTHROW; /** Return 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 */ extern int starpu_omp_get_num_teams(void) __STARPU_OMP_NOTHROW; /** Return the team number of the calling thread. \return the team number of the calling thread. \sa starpu_omp_get_num_teams */ extern int starpu_omp_get_team_num(void) __STARPU_OMP_NOTHROW; /** Check whether the current device is the initial device or not. */ extern int starpu_omp_is_initial_device(void) __STARPU_OMP_NOTHROW; /** */ extern int starpu_omp_get_initial_device(void) __STARPU_OMP_NOTHROW; /** Return the maximum value that can be specified in the priority clause. \return !0 if called from the host device. \return 0 otherwise. \sa starpu_omp_set_default_device \sa starpu_omp_get_default_device */ extern int starpu_omp_get_max_task_priority(void) __STARPU_OMP_NOTHROW; /** Initialize an opaque lock object. \sa starpu_omp_destroy_lock \sa starpu_omp_set_lock \sa starpu_omp_unset_lock \sa starpu_omp_test_lock */ extern void starpu_omp_init_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; /** Destroy an opaque lock object. \sa starpu_omp_init_lock \sa starpu_omp_set_lock \sa starpu_omp_unset_lock \sa starpu_omp_test_lock */ extern void starpu_omp_destroy_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; /** Lock 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 */ extern void starpu_omp_set_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; /** Unlock 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 */ extern void starpu_omp_unset_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; /** Unblockingly attempt to lock a lock object and return 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 */ extern int starpu_omp_test_lock(starpu_omp_lock_t *lock) __STARPU_OMP_NOTHROW; /** Initialize 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 */ extern void starpu_omp_init_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; /** Destroy 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 */ extern void starpu_omp_destroy_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; /** Lock 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 */ extern void starpu_omp_set_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; /** Unlock 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 */ extern void starpu_omp_unset_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; /** Unblocking attempt 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 */ extern int starpu_omp_test_nest_lock(starpu_omp_nest_lock_t *lock) __STARPU_OMP_NOTHROW; /** Implement the entry point of a fallback global atomic region. Block until it succeeds in acquiring exclusive access to the global atomic region. \sa starpu_omp_atomic_fallback_inline_end */ extern void starpu_omp_atomic_fallback_inline_begin(void) __STARPU_OMP_NOTHROW; /** Implement the exit point of a fallback global atomic region. Release the exclusive access to the global atomic region. \sa starpu_omp_atomic_fallback_inline_begin */ extern void starpu_omp_atomic_fallback_inline_end(void) __STARPU_OMP_NOTHROW; /** Return the elapsed wallclock time in seconds. \return the elapsed wallclock time in seconds. \sa starpu_omp_get_wtick */ extern double starpu_omp_get_wtime(void) __STARPU_OMP_NOTHROW; /** Return 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 */ extern double starpu_omp_get_wtick(void) __STARPU_OMP_NOTHROW; /** Enable 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 */ 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.3.9+dfsg/include/starpu_perfmodel.h000066400000000000000000000366041413463044200211420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Performance_Model Performance Model @{ */ struct starpu_task; struct starpu_data_descr; #define STARPU_NARCH STARPU_ANY_WORKER /** todo */ struct starpu_perfmodel_device { enum starpu_worker_archtype type; /**< type of the device */ int devid; /**< identifier of the precise device */ int ncores; /**< number of execution in parallel, minus 1 */ }; /** todo */ struct starpu_perfmodel_arch { int ndevices; /**< number of the devices for the given arch */ struct starpu_perfmodel_device *devices; /**< list of the devices for the given arch */ }; struct starpu_perfmodel_history_entry { double mean; /**< mean_n = 1/n sum */ double deviation; /**< n dev_n = sum2 - 1/n (sum)^2 */ double sum; /**< sum of samples (in µs) */ double sum2; /**< sum of samples^2 */ unsigned nsample; /**< number of samples */ unsigned nerror; uint32_t footprint; /**< data footprint */ size_t size; /**< in bytes */ double flops; /**< Provided by the application */ double duration; starpu_tag_t tag; double *parameters; }; struct starpu_perfmodel_history_list { struct starpu_perfmodel_history_list *next; struct starpu_perfmodel_history_entry *entry; }; /** todo */ struct starpu_perfmodel_regression_model { double sumlny; /**< sum of ln(measured) */ double sumlnx; /**< sum of ln(size) */ double sumlnx2; /**< sum of ln(size)^2 */ unsigned long minx; /**< minimum size */ unsigned long maxx; /**< maximum size */ double sumlnxlny; /**< sum of ln(size)*ln(measured) */ double alpha; /**< estimated = alpha * size ^ beta */ double beta; /**< estimated = alpha * size ^ beta */ unsigned valid; /**< whether the linear regression model is valid (i.e. enough measures) */ double a; /**< estimated = a size ^b + c */ double b; /**< estimated = a size ^b + c */ double c; /**< estimated = a size ^b + c */ unsigned nl_valid; /**< whether the non-linear regression model is valid (i.e. enough measures) */ unsigned nsample; /**< number of sample values for non-linear regression */ double *coeff; /**< list of computed coefficients for multiple linear regression model */ unsigned ncoeff; /**< number of coefficients for multiple linear regression model */ unsigned multi_valid; /**< whether the multiple linear regression model is valid */ }; 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); /** information about the performance model of a given arch. */ struct starpu_perfmodel_per_arch { /** 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. */ starpu_perfmodel_per_arch_cost_function cost_function; /** Same as in structure starpu_perfmodel, but per-arch, in case it depends on the architecture-specific implementation. */ starpu_perfmodel_per_arch_size_base size_base; /** \private The history of performance measurements. */ struct starpu_perfmodel_history_table *history; /** \private Used by ::STARPU_HISTORY_BASED, ::STARPU_NL_REGRESSION_BASED and ::STARPU_MULTIPLE_REGRESSION_BASED, records all execution history measures. */ struct starpu_perfmodel_history_list *list; /** \private Used by ::STARPU_REGRESSION_BASED, ::STARPU_NL_REGRESSION_BASED and ::STARPU_MULTIPLE_REGRESSION_BASED, contains the estimated factors of the regression. */ struct starpu_perfmodel_regression_model regression; char debug_path[256]; }; /** todo */ enum starpu_perfmodel_type { STARPU_PERFMODEL_INVALID=0, STARPU_PER_ARCH, /**< Application-provided per-arch cost model function */ STARPU_COMMON, /**< Application-provided common cost model function, with per-arch factor */ STARPU_HISTORY_BASED, /**< Automatic history-based cost model */ STARPU_REGRESSION_BASED, /**< Automatic linear regression-based cost model (alpha * size ^ beta) */ STARPU_NL_REGRESSION_BASED, /**< Automatic non-linear regression-based cost model (a * size ^ b + c) */ STARPU_MULTIPLE_REGRESSION_BASED /**< Automatic multiple linear regression-based cost model. Application provides parameters, their combinations and exponents. */ }; struct _starpu_perfmodel_state; typedef struct _starpu_perfmodel_state* starpu_perfmodel_state_t; /** Contain 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. */ struct starpu_perfmodel { /** 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_MULTIPLE_REGRESSION_BASED: Need to provide fields starpu_perfmodel::nparameters (number of different parameters), starpu_perfmodel::ncombinations (number of parameters combinations-tuples) and table starpu_perfmodel::combinations which defines exponents of the equation. Function cl_perf_func also needs to define how to extract parameters from the task.
  • ::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.
*/ enum starpu_perfmodel_type type; /** Used by ::STARPU_COMMON. Take a task and implementation number, and must return a task duration estimation in micro-seconds. */ double (*cost_function)(struct starpu_task *, unsigned nimpl); /** Used by ::STARPU_COMMON. Take a task, an arch and implementation number, and must return a task duration estimation in micro-seconds on that arch. */ double (*arch_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch * arch, unsigned nimpl); /** Used by ::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED and ::STARPU_NL_REGRESSION_BASED. If not NULL, take a task and implementation number, and return the size to be used as index to distinguish histories and as a base for regressions. */ size_t (*size_base)(struct starpu_task *, unsigned nimpl); /** Used by ::STARPU_HISTORY_BASED. If not NULL, take a task and return the footprint to be used as index to distinguish histories. The default is to use the starpu_task_data_footprint() function. */ uint32_t (*footprint)(struct starpu_task *); /** 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. */ const char *symbol; /** \private Whether the performance model is already loaded from the disk. */ unsigned is_loaded; /** \private */ unsigned benchmarking; /** \private */ unsigned is_init; void (*parameters)(struct starpu_task * task, double *parameters); /** \private Names of parameters used for multiple linear regression models (M, N, K) */ const char **parameters_names; /** \private Number of parameters used for multiple linear regression models */ unsigned nparameters; /** \private Table of combinations of parameters (and the exponents) used for multiple linear regression models */ unsigned **combinations; /** \private Number of combination of parameters used for multiple linear regression models */ unsigned ncombinations; /** \private */ starpu_perfmodel_state_t state; }; /** Initialize the \p model performance model structure. This is automatically called when e.g. submitting a task using a codelet using this performance model. */ void starpu_perfmodel_init(struct starpu_perfmodel *model); /** Load the performance model found in the file named \p filename. \p model has to be completely zero, and will be filled with the information stored in the given file. */ int starpu_perfmodel_load_file(const char *filename, struct starpu_perfmodel *model); /** Load a given performance model. \p model has to be completely zero, and will be filled with the information stored in $STARPU_HOME/.starpu. The function is intended to be used by external tools that want to read the performance model files. */ int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model); /** Unload \p model which has been previously loaded through the function starpu_perfmodel_load_symbol() */ int starpu_perfmodel_unload_model(struct starpu_perfmodel *model); /** Fills \p path (supposed to be \p maxlen long) with the full path to the performance model file for symbol \p symbol. This path can later on be used for instance with starpu_perfmodel_load_file() . */ void starpu_perfmodel_get_model_path(const char *symbol, char *path, size_t maxlen); /** Dump performance model \p model to output stream \p output, in XML format. */ void starpu_perfmodel_dump_xml(FILE *output, struct starpu_perfmodel *model); /** Free internal memory used for sampling 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. */ void starpu_perfmodel_free_sampling(void); /** Return the architecture type of the worker \p workerid. */ struct starpu_perfmodel_arch *starpu_worker_get_perf_archtype(int workerid, unsigned sched_ctx_id); int starpu_perfmodel_get_narch_combs(void); 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, ...); /** Return the path to the debugging information for the performance model. */ 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); /** Return the architecture name for \p arch */ void starpu_perfmodel_get_arch_name(struct starpu_perfmodel_arch *arch, char *archname, size_t maxlen, unsigned nimpl); /** Return the estimated time of a task with the given model and the given footprint. */ double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, uint32_t footprint); /** If starpu_init() is not used, starpu_perfmodel_initialize() should be used called calling starpu_perfmodel_* functions. */ void starpu_perfmodel_initialize(void); /** Print a list of all performance models on \p output */ 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); /** Feed 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. An example of use can be seen in \ref PerformanceModelExample. */ void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned cpuid, unsigned nimpl, double measured); /** Print the directory name storing performance models on \p output */ void starpu_perfmodel_directory(FILE *output); /** Print a matrix of bus bandwidths on \p f. */ void starpu_bus_print_bandwidth(FILE *f); /** Print the affinity devices on \p f. */ void starpu_bus_print_affinity(FILE *f); /** Print on \p f the name of the files containing the matrix of bus bandwidths, the affinity devices and the latency. */ void starpu_bus_print_filenames(FILE *f); /** Return the bandwidth of data transfer between two memory nodes */ double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node); /** Return the latency of data transfer between two memory nodes */ double starpu_transfer_latency(unsigned src_node, unsigned dst_node); /** Return the estimated time to transfer a given size between two memory nodes. */ double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size); /** Performance model which just always return 1µs. */ extern struct starpu_perfmodel starpu_perfmodel_nop; /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_PERFMODEL_H__ */ starpu-1.3.9+dfsg/include/starpu_profiling.h000066400000000000000000000227071413463044200211550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Profiling Profiling @{ */ /** Used when calling the function starpu_profiling_status_set() to disable profiling. */ #define STARPU_PROFILING_DISABLE 0 /** Used when calling the function starpu_profiling_status_set() to enable profiling. */ #define STARPU_PROFILING_ENABLE 1 /** Information about the execution of a task. It is accessible from the field starpu_task::profiling_info if profiling was enabled. */ struct starpu_profiling_task_info { /** Date of task submission (relative to the initialization of StarPU). */ struct timespec submit_time; /** Time when the task was submitted to the scheduler. */ struct timespec push_start_time; /** Time when the scheduler finished with the task submission. */ struct timespec push_end_time; /** Time when the scheduler started to be requested for a task, and eventually gave that task. */ struct timespec pop_start_time; /** Time when the scheduler finished providing the task for execution. */ struct timespec pop_end_time; /** Time when the worker started fetching input data. */ struct timespec acquire_data_start_time; /** Time when the worker finished fetching input data. */ struct timespec acquire_data_end_time; /** Date of task execution beginning (relative to the initialization of StarPU). */ struct timespec start_time; /** Date of task execution termination (relative to the initialization of StarPU). */ struct timespec end_time; /** Time when the worker started releasing data. */ struct timespec release_data_start_time; /** Time when the worker finished releasing data. */ struct timespec release_data_end_time; /** Time when the worker started the application callback for the task. */ struct timespec callback_start_time; /** Time when the worker finished the application callback for the task. */ struct timespec callback_end_time; /* TODO add expected length, expected start/end ? */ /** Identifier of the worker which has executed the task. */ int workerid; /** Number of cycles used by the task, only available in the MoviSim */ uint64_t used_cycles; /** Number of cycles stalled within the task, only available in the MoviSim */ uint64_t stall_cycles; /** Energy consumed by the task, in Joules */ double energy_consumed; }; /** Profiling information associated to a worker. The timing is provided since the previous call to starpu_profiling_worker_get_info() */ struct starpu_profiling_worker_info { /** Starting date for the reported profiling measurements. */ struct timespec start_time; /** Duration of the profiling measurement interval. */ struct timespec total_time; /** Time spent by the worker to execute tasks during the profiling measurement interval. */ struct timespec executing_time; /** Time spent idling by the worker during the profiling measurement interval. */ struct timespec sleeping_time; /** Number of tasks executed by the worker during the profiling measurement interval. */ int executed_tasks; /** Number of cycles used by the worker, only available in the MoviSim */ uint64_t used_cycles; /** Number of cycles stalled within the worker, only available in the MoviSim */ uint64_t stall_cycles; /** Energy consumed by the worker, in Joules */ double energy_consumed; double flops; }; struct starpu_profiling_bus_info { /** Time of bus profiling startup. */ struct timespec start_time; /** Total time of bus profiling. */ struct timespec total_time; /** Number of bytes transferred during profiling. */ int long long transferred_bytes; /** Number of transfers during profiling. */ int transfer_count; }; /** Reset performance counters and enable profiling if the environment variable \ref STARPU_PROFILING is set to a positive value. */ void starpu_profiling_init(void); /** Set the ID used for profiling trace filename. Has to be called before starpu_init(). */ void starpu_profiling_set_id(int new_id); /** Set the profiling status. Profiling is activated by passing \ref STARPU_PROFILING_ENABLE in \p 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. */ int starpu_profiling_status_set(int status); /** Return the current profiling status or a negative value in case there was an error. */ 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 /** 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. */ int starpu_profiling_worker_get_info(int workerid, struct starpu_profiling_worker_info *worker_info); /** Return the number of buses in the machine */ int starpu_bus_get_count(void); /** Return the identifier of the bus between \p src and \p dst */ int starpu_bus_get_id(int src, int dst); /** Return the source point of bus \p busid */ int starpu_bus_get_src(int busid); /** Return the destination point of bus \p busid */ int starpu_bus_get_dst(int busid); void starpu_bus_set_direct(int busid, int direct); int starpu_bus_get_direct(int busid); void starpu_bus_set_ngpus(int busid, int ngpus); int starpu_bus_get_ngpus(int busid); /** See _starpu_profiling_bus_helper_display_summary in src/profiling/profiling_helpers.c for a usage example. Note that calling starpu_bus_get_profiling_info() resets the counters to zero. */ 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; } #define STARPU_NS_PER_S 1000000000 /* 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 >= STARPU_NS_PER_S) { ++(result)->tv_sec; result->tv_nsec -= STARPU_NS_PER_S; } } /* 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 >= STARPU_NS_PER_S) { ++(result)->tv_sec; result->tv_nsec -= STARPU_NS_PER_S; } } /* 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 += STARPU_NS_PER_S; } } #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)) /** Return the time elapsed between \p start and \p end in microseconds. */ double starpu_timing_timespec_delay_us(struct timespec *start, struct timespec *end); /** Convert the given timespec \p ts into microseconds */ double starpu_timing_timespec_to_us(struct timespec *ts); /** Display statistics about the bus on \c stderr. if the environment variable \ref STARPU_BUS_STATS is defined. The function is called automatically by starpu_shutdown(). */ void starpu_profiling_bus_helper_display_summary(void); /** Display statistic about the workers on \c stderr if the environment variable \ref STARPU_WORKER_STATS is defined. The function is called automatically by starpu_shutdown(). */ void starpu_profiling_worker_helper_display_summary(void); /** 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). */ void starpu_data_display_memory_stats(); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_PROFILING_H__ */ starpu-1.3.9+dfsg/include/starpu_rand.h000066400000000000000000000052521413463044200201040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Random_Functions Random Functions @{ */ #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.3.9+dfsg/include/starpu_sched_component.h000066400000000000000000000762101413463044200223320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2017 Arthur Chevalier * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Modularized_Scheduler Modularized Scheduler Interface @{ */ /** flags for starpu_sched_component::properties */ enum starpu_sched_component_properties { /** indicate that all workers have the same starpu_worker_archtype */ STARPU_SCHED_COMPONENT_HOMOGENEOUS = (1<<0), /** indicate that all workers have the same memory component */ STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE = (1<<1) }; /** indicate if component is homogeneous */ #define STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component) ((component)->properties & STARPU_SCHED_COMPONENT_HOMOGENEOUS) /** indicate if all workers have the same memory component */ #define STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component) ((component)->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE) /** Structure for 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 by \c sched_ctx_id. They embed there specialised method in a pseudo object-style, so calls are like component->push_task(component,task) */ struct starpu_sched_component { /** The tree containing the component*/ struct starpu_sched_tree *tree; /** set of underlying workers */ struct starpu_bitmap *workers; /** subset of starpu_sched_component::workers that is currently available in the context The push method should take this value into account, it 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 */ struct starpu_bitmap *workers_in_ctx; /** private data */ void *data; char *name; /** number of compoments's children */ unsigned nchildren; /** vector of component's children */ struct starpu_sched_component **children; /** number of component's parents */ unsigned nparents; /** vector of component's parents */ struct starpu_sched_component **parents; /** add a child to component */ void (*add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child); /** remove a child from component */ 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); /** 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). */ int (*push_task)(struct starpu_sched_component *, struct starpu_task *); /** 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 should be executable by the caller */ struct starpu_task *(*pull_task)(struct starpu_sched_component *from, struct starpu_sched_component *to); /** 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. This should return 1 if some tasks could be pushed 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. */ int (*can_push)(struct starpu_sched_component *from, struct starpu_sched_component *to); /** 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. This should return 1 if some some container or worker could (or will) pull some tasks. The basic implementation of this function is a recursive call to its children, until at least one worker have been woken up. */ int (*can_pull)(struct starpu_sched_component *component); int (*notify)(struct starpu_sched_component* component, int message_ID, void* arg); /** 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)) */ double (*estimated_load)(struct starpu_sched_component *component); /** return the time when a worker will enter in starvation. This function is relevant only if the task->predicted member has been set. */ double (*estimated_end)(struct starpu_sched_component *component); /** called by starpu_sched_component_destroy. Should free data allocated during creation */ void (*deinit_data)(struct starpu_sched_component *component); /** this function is called for each component when workers are added or removed from a context */ void (*notify_change_workers)(struct starpu_sched_component *component); int properties; #ifdef STARPU_HAVE_HWLOC /** 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 */ hwloc_obj_t obj; #else void *obj; #endif }; /** The actual scheduler */ struct starpu_sched_tree { /** entry module of the scheduler */ struct starpu_sched_component *root; /** set of workers available in this context, this value is used to mask workers in modules */ struct starpu_bitmap *workers; /** context id of the scheduler */ unsigned sched_ctx_id; /** lock used to protect the scheduler, it is taken in read mode pushing a task and in write mode for adding or removing workers */ starpu_pthread_mutex_t lock; }; void starpu_initialize_prio_center_policy(unsigned sched_ctx_id); /** @name Scheduling Tree API @{ */ /** create a empty initialized starpu_sched_tree */ struct starpu_sched_tree *starpu_sched_tree_create(unsigned sched_ctx_id) STARPU_ATTRIBUTE_MALLOC; /** destroy tree and free all non shared component in it. */ void starpu_sched_tree_destroy(struct starpu_sched_tree *tree); /** calls starpu_sched_tree_destroy, ready for use for starpu_sched_policy::deinit_sched field. */ void starpu_sched_tree_deinitialize(unsigned sched_ctx_id); struct starpu_sched_tree *starpu_sched_tree_get(unsigned sched_ctx_id); /** recursively set all starpu_sched_component::workers, do not take into account shared parts (except workers). */ void starpu_sched_tree_update_workers(struct starpu_sched_tree *t); /** recursively set all starpu_sched_component::workers_in_ctx, do not take into account shared parts (except workers) */ void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t); /** compatibility with starpu_sched_policy interface */ int starpu_sched_tree_push_task(struct starpu_task *task); /** compatibility with starpu_sched_policy interface */ struct starpu_task *starpu_sched_tree_pop_task(unsigned sched_ctx); /** Push a task to a component. This is a helper for component->push_task(component, task) plus tracing. */ int starpu_sched_component_push_task(struct starpu_sched_component *from, struct starpu_sched_component *to, struct starpu_task *task); /** Pull a task from a component. This is a helper for component->pull_task(component) plus tracing. */ struct starpu_task *starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to); struct starpu_task* starpu_sched_component_pump_to(struct starpu_sched_component *component, struct starpu_sched_component *to, int* success); struct starpu_task* starpu_sched_component_pump_downstream(struct starpu_sched_component *component, int* success); int starpu_sched_component_send_can_push_to_parents(struct starpu_sched_component * component); /** compatibility with starpu_sched_policy interface */ void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers); /** compatibility with starpu_sched_policy interface */ void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers); /** Attach component \p child to parent \p parent. Some component may accept only one child, others accept several (e.g. MCT) */ void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child); /** @} */ /** @name Generic Scheduling Component API @{ */ typedef struct starpu_sched_component * (*starpu_sched_component_create_t)(struct starpu_sched_tree *tree, void *data); /** 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 minimum 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 */ struct starpu_sched_component *starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) STARPU_ATTRIBUTE_MALLOC; /** 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 */ void starpu_sched_component_destroy(struct starpu_sched_component *component); /** recursively destroy non shared parts of a \p component 's tree */ void starpu_sched_component_destroy_rec(struct starpu_sched_component *component); void starpu_sched_component_add_child(struct starpu_sched_component* component, struct starpu_sched_component * child); /** return true iff \p component can execute \p task, this function take into account the workers available in the scheduling context */ int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, struct starpu_task *task); /** 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. */ int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length); /** return the average time to transfer \p task data to underlying \p component workers. */ 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); /** @} */ /** @name Worker Component API @{ */ /** return the struct starpu_sched_component corresponding to \p workerid. Undefined if \p workerid is not a valid workerid */ struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid); struct starpu_sched_component *starpu_sched_component_worker_new(unsigned sched_ctx, int workerid); /** Create a combined worker that pushes tasks in parallel to workers \p workers (size \p nworkers). */ struct starpu_sched_component *starpu_sched_component_parallel_worker_create(struct starpu_sched_tree *tree, unsigned nworkers, unsigned *workers); /** return the workerid of \p worker_component, undefined if starpu_sched_component_is_worker(worker_component) == 0 */ int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component); /** return true iff \p component is a worker component */ int starpu_sched_component_is_worker(struct starpu_sched_component *component); /** return true iff \p component is a simple worker component */ int starpu_sched_component_is_simple_worker(struct starpu_sched_component *component); /** return true iff \p component is a combined worker component */ int starpu_sched_component_is_combined_worker(struct starpu_sched_component *component); /** compatibility with starpu_sched_policy interface update predictions for workers */ void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id); /** compatibility with starpu_sched_policy interface */ void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id); /** @} */ /** @name Flow-control Fifo Component API @{ */ /** default function for the pull component method, just call pull of parents until one of them returns a task */ struct starpu_task * starpu_sched_component_parents_pull_task(struct starpu_sched_component * component, struct starpu_sched_component * to); /** default function for the can_push component method, just call can_push of parents until one of them returns non-zero */ int starpu_sched_component_can_push(struct starpu_sched_component * component, struct starpu_sched_component * to); /** default function for the can_pull component method, just call can_pull of children until one of them returns non-zero */ int starpu_sched_component_can_pull(struct starpu_sched_component * component); /** function for the can_pull component method, call can_pull of all children */ int starpu_sched_component_can_pull_all(struct starpu_sched_component * component); /** default function for the estimated_load component method, just sum up the loads of the children of the component. */ double starpu_sched_component_estimated_load(struct starpu_sched_component * component); /** function that can be used for the estimated_end component method, compute the minimum completion time of the children. */ double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component); /** function that can be used for the estimated_end component method, compute the minimum completion time of the children, and add to it an estimation of how existing queued work, plus the exp_len work, can be completed. This is typically used instead of starpu_sched_component_estimated_end_min when the component contains a queue of tasks, which thus needs to be added to the estimations. */ double starpu_sched_component_estimated_end_min_add(struct starpu_sched_component * component, double exp_len); /** default function for the estimated_end component method, compute the average completion time of the children. */ 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; int ready; }; /** 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. */ 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; /** return true iff \p component is a fifo component */ int starpu_sched_component_is_fifo(struct starpu_sched_component *component); /** @} */ /** @name Flow-control Prio Component API @{ */ struct starpu_sched_component_prio_data { unsigned ntasks_threshold; double exp_len_threshold; int ready; }; 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); /** @} */ /** @name Resource-mapping Work-Stealing Component API @{ */ /** 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. */ struct starpu_sched_component *starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; /** return true iff \p component is a work stealing component */ int starpu_sched_component_is_work_stealing(struct starpu_sched_component *component); /** 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. */ int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task); /** @} */ /** @name Resource-mapping Random Component API @{ */ /** create a component that perform a random scheduling */ struct starpu_sched_component *starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; /** return true iff \p component is a random component */ int starpu_sched_component_is_random(struct starpu_sched_component *); /** @} */ /** @name Resource-mapping Eager Component API @{ */ struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_eager(struct starpu_sched_component *); /** @} */ /** @name Resource-mapping Eager Prio Component API @{ */ struct starpu_sched_component *starpu_sched_component_eager_prio_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_eager_prio(struct starpu_sched_component *); /** @} */ /** @name Resource-mapping Eager-Calibration Component API @{ */ struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *); /** @} */ /** @name Resource-mapping MCT Component API @{ */ struct starpu_sched_component_mct_data { double alpha; double beta; double _gamma; double idle_power; }; /** create a component with mct_data paremeters. the mct component doesnt do anything but pushing tasks on no_perf_model_component and calibrating_component */ 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); /** @} */ /** @name Resource-mapping Heft Component API @{ */ 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); /** @} */ /** @name Resource-mapping Heteroprio Component API @{ */ struct starpu_sched_component_heteroprio_data { struct starpu_sched_component_mct_data *mct; unsigned batch; }; struct starpu_sched_component * starpu_sched_component_heteroprio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_heteroprio_data * params) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_heteroprio(struct starpu_sched_component *component); /** @} */ /** @name Special-purpose Best_Implementation Component API @{ */ /** 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. */ struct starpu_sched_component *starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; /** @} */ /** @name Special-purpose Perfmodel_Select Component API @{ */ 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); /** @} */ /** @name Staged pull Component API @{ */ struct starpu_sched_component * starpu_sched_component_stage_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_stage(struct starpu_sched_component *component); /** @} */ /** @name User-choice push Component API @{ */ struct starpu_sched_component * starpu_sched_component_userchoice_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC; int starpu_sched_component_is_userchoice(struct starpu_sched_component *component); /** @} */ /** @name Recipe Component API @{ */ /** parameters for starpu_sched_component_composed_component_create */ struct starpu_sched_component_composed_recipe; /** return an empty recipe for a composed component, it should not be used without modification */ struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC; /** return a recipe to build a composed component with a \p create_component */ 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; /** add \p create_component under all previous components in 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); /** destroy composed_sched_component, this should be done after starpu_sched_component_composed_component_create was called */ void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *); /** 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 *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 /** 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. */ struct starpu_sched_component_specs { /** 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 */ struct starpu_sched_component_composed_recipe *hwloc_machine_composed_sched_component; /** the composed component to put for each memory component */ struct starpu_sched_component_composed_recipe *hwloc_component_composed_sched_component; /** the composed component to put for each socket */ struct starpu_sched_component_composed_recipe *hwloc_socket_composed_sched_component; /** the composed component to put for each cache */ struct starpu_sched_component_composed_recipe *hwloc_cache_composed_sched_component; /** 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 */ struct starpu_sched_component_composed_recipe *(*worker_composed_sched_component)(enum starpu_worker_archtype archtype); /** 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 */ int mix_heterogeneous_workers; }; /** build a scheduler for \p sched_ctx_id according to \p s and the hwloc topology of the machine. */ struct starpu_sched_tree *starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs s); #endif /* STARPU_HAVE_HWLOC */ /** @name Basic API @{ */ #define STARPU_SCHED_SIMPLE_DECIDE_MASK (3<<0) /** Request to create downstream queues per worker, i.e. the scheduling decision-making component will choose exactly which workers tasks should got to. */ #define STARPU_SCHED_SIMPLE_DECIDE_WORKERS (1<<0) /** Request to create downstream queues per memory nodes, i.e. the scheduling decision-making component will choose which memory node tasks will go to. */ #define STARPU_SCHED_SIMPLE_DECIDE_MEMNODES (2<<0) /** Request to create downstream queues per computation arch, i.e. the scheduling decision-making component will choose whether tasks go to CPUs, or CUDA, or OpenCL, etc. */ #define STARPU_SCHED_SIMPLE_DECIDE_ARCHS (3<<0) /** Request to create the scheduling decision-making component even if there is only one available choice. This is useful for instance when the decision-making component will store tasks itself (and not use STARPU_SCHED_SIMPLE_FIFO_ABOVE) to decide in which order tasks should be passed below. */ #define STARPU_SCHED_SIMPLE_DECIDE_ALWAYS (1<<3) /** Request to add a perfmodel selector above the scheduling decision-making component. That way, only tasks with a calibrated performance model will be given to the component, other tasks will go to an eager branch that will distributed tasks so that their performance models will get calibrated. In other words, this is needed when using a component which needs performance models for tasks. */ #define STARPU_SCHED_SIMPLE_PERFMODEL (1<<4) /** Request that a component be added just above workers, that chooses the best task implementation. */ #define STARPU_SCHED_SIMPLE_IMPL (1<<5) /** Request to create a fifo above the scheduling decision-making component, otherwise tasks will be pushed directly to the component. This is useful to store tasks if there is a fifo below which limits the number of tasks to be scheduld in advance. The scheduling decision-making component can also store tasks itself, in which case this flag is not useful. */ #define STARPU_SCHED_SIMPLE_FIFO_ABOVE (1<<6) /** Request that the fifo above be sorted by priorities */ #define STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO (1<<7) /** Request to create fifos below the scheduling decision-making component, otherwise tasks will be pulled directly from workers. This is useful to be able to schedule a (tunable) small number of tasks in advance only. */ #define STARPU_SCHED_SIMPLE_FIFOS_BELOW (1<<8) /** Request that the fifos below be sorted by priorities */ #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO (1<<9) /** Request that the fifos below be pulled rather ready tasks */ #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY (1<<10) /** Request that work between workers using the same fifo below be distributed using a work stealing component. */ #define STARPU_SCHED_SIMPLE_WS_BELOW (1<<11) /** Request to not only choose between simple workers, but also choose between combined workers. */ #define STARPU_SCHED_SIMPLE_COMBINED_WORKERS (1<<12) /** Request to prepend a component before the decision component. This should be used alone and followed by the component creation function pointer and its data. */ #define STARPU_SCHED_SIMPLE_PRE_DECISION (1<<14) /** Create a simple modular scheduler tree around a scheduling decision-making component \p component. The details of what should be built around \p component is described by \p flags. The different STARPU_SCHED_SIMPL_DECIDE_* flags are mutually exclusive. \p data is passed to the \p create_decision_component function when creating the decision component. */ void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id); /** Create a simple modular scheduler tree around several scheduling decision-making components. The parameters are similar to starpu_sched_component_initialize_simple_scheduler, but per scheduling decision, for instance: starpu_sched_component_initialize_simple_schedulers(sched_ctx_id, 2, create1, data1, flags1, create2, data2, flags2); The different flags parameters must be coherent: same decision flags. They must not include the perfmodel flag (not supported yet). */ void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id, unsigned ndecisions, ...); /** @} */ #define STARPU_COMPONENT_MUTEX_LOCK(m) \ do \ { \ const int _relaxed_state = starpu_worker_get_relax_state(); \ if (!_relaxed_state) \ starpu_worker_relax_on(); \ STARPU_PTHREAD_MUTEX_LOCK((m)); \ if (!_relaxed_state) \ starpu_worker_relax_off(); \ } \ while(0) #define STARPU_COMPONENT_MUTEX_TRYLOCK(m) STARPU_PTHREAD_MUTEX_TRYLOCK((m)) #define STARPU_COMPONENT_MUTEX_UNLOCK(m) STARPU_PTHREAD_MUTEX_UNLOCK((m)) /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_SCHED_COMPONENT_H__ */ starpu-1.3.9+dfsg/include/starpu_sched_ctx.h000066400000000000000000000355041413463044200211270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * Copyright (C) 2017 Arthur Chevalier * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @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. @{ */ /** @name Scheduling Contexts Basic API @{ */ /** Used when calling starpu_sched_ctx_create() to specify a name for a scheduling policy */ #define STARPU_SCHED_CTX_POLICY_NAME (1<<16) /** Used when calling starpu_sched_ctx_create() to specify a pointer to a scheduling policy */ #define STARPU_SCHED_CTX_POLICY_STRUCT (2<<16) /** Used when calling starpu_sched_ctx_create() to specify a minimum scheduler priority value. */ #define STARPU_SCHED_CTX_POLICY_MIN_PRIO (3<<16) /** Used when calling starpu_sched_ctx_create() to specify a maximum scheduler priority value. */ #define STARPU_SCHED_CTX_POLICY_MAX_PRIO (4<<16) #define STARPU_SCHED_CTX_HIERARCHY_LEVEL (5<<16) #define STARPU_SCHED_CTX_NESTED (6<<16) /** Used when calling starpu_sched_ctx_create() to specify ??? */ #define STARPU_SCHED_CTX_AWAKE_WORKERS (7<<16) /** Used when calling starpu_sched_ctx_create() to specify a function pointer allowing to initialize the scheduling policy. */ #define STARPU_SCHED_CTX_POLICY_INIT (8<<16) /** Used when calling starpu_sched_ctx_create() to specify a pointer to some user data related to the context being created. */ #define STARPU_SCHED_CTX_USER_DATA (9<<16) /** Used when calling starpu_sched_ctx_create() in order to create a context on the NVIDIA GPU to specify the number of SMs the context should have */ #define STARPU_SCHED_CTX_CUDA_NSMS (10<<16) /** Used when calling starpu_sched_ctx_create() to specify a list of sub contexts of the current context. */ #define STARPU_SCHED_CTX_SUB_CTXS (11<<16) /** Create a scheduling context with the given parameters (see below) and assign 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 ::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.
  • ::STARPU_SCHED_CTX_POLICY_INIT, followed by a function pointer (ie. void init_sched(void)) allowing to initialize the scheduling policy.
  • ::STARPU_SCHED_CTX_USER_DATA, followed by a pointer to a custom user data structure, to be retrieved by \ref starpu_sched_ctx_get_user_data().
*/ unsigned starpu_sched_ctx_create(int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name, ...); /** Create a context indicating an approximate interval of resources */ 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); /** Execute the callback whenever the last task of the context finished executing, it is called with the parameters \p sched_ctx and any other parameter needed by the application (packed in \p args) */ void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args); /** Add dynamically the workers in \p workerids_ctx to the context \p sched_ctx_id. The last argument cannot be greater than ::STARPU_NMAX_SCHED_CTXS. */ void starpu_sched_ctx_add_workers(int *workerids_ctx, unsigned nworkers_ctx, unsigned sched_ctx_id); /** Remove the workers in \p workerids_ctx from the context \p sched_ctx_id. The last argument cannot be greater than ::STARPU_NMAX_SCHED_CTXS. */ void starpu_sched_ctx_remove_workers(int *workerids_ctx, unsigned nworkers_ctx, unsigned sched_ctx_id); /** Print on the file \p f the worker names belonging to the context \p sched_ctx_id */ void starpu_sched_ctx_display_workers(unsigned sched_ctx_id, FILE *f); /** Delete scheduling context \p sched_ctx_id and transfer remaining workers to the inheritor scheduling context. */ void starpu_sched_ctx_delete(unsigned sched_ctx_id); /** Indicate that the context \p inheritor will inherit the resources of the context \p sched_ctx_id when \p sched_ctx_id will be deleted. */ 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); /** Set the scheduling context the subsequent tasks will be submitted to */ void starpu_sched_ctx_set_context(unsigned *sched_ctx_id); /** 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(). */ unsigned starpu_sched_ctx_get_context(void); /** Stop submitting tasks from the empty context list until the next time the context has time to check the empty context list */ void starpu_sched_ctx_stop_task_submission(void); /** Indicate starpu that the application finished submitting to this context in order to move the workers to the inheritor as soon as possible. */ void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id); /** Return the list of workers in the array \p workerids, the return 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) */ unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids); /** Return the list of workers in the array \p workerids, the return 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(). */ unsigned starpu_sched_ctx_get_workers_list_raw(unsigned sched_ctx_id, int **workerids); /** Return the number of workers managed by the specified context (Usually needed to verify if it manages any workers or if it should be blocked) */ unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id); /** Return the number of workers shared by two contexts. */ unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2); /** Return 1 if the worker belongs to the context and 0 otherwise */ 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); /** 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(). */ unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id); unsigned starpu_sched_ctx_get_ctx_for_task(struct starpu_task *task); /** Check if a worker is shared between several contexts */ unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid); /** Return the user data pointer associated to the scheduling context. */ void *starpu_sched_ctx_get_user_data(unsigned sched_ctx_id); void starpu_sched_ctx_set_user_data(unsigned sched_ctx_id, void* user_data); /** Allocate the scheduling policy data (private information of the scheduler like queues, variables, additional condition variables) the context */ void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void *policy_data); /** Return the scheduling policy data (private information of the scheduler) of the contexts previously assigned to. */ void *starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id); struct starpu_sched_policy *starpu_sched_ctx_get_sched_policy(unsigned sched_ctx_id); /** Execute any parallel code on the workers of the sched_ctx (workers are blocked) */ 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_list_task_counters_increment(unsigned sched_ctx_id, int workerid); void starpu_sched_ctx_list_task_counters_decrement(unsigned sched_ctx_id, int workerid); void starpu_sched_ctx_list_task_counters_reset(unsigned sched_ctx_id, int workerid); void starpu_sched_ctx_list_task_counters_increment_all_ctx_locked(struct starpu_task *task, unsigned sched_ctx_id); void starpu_sched_ctx_list_task_counters_decrement_all_ctx_locked(struct starpu_task *task, unsigned sched_ctx_id); void starpu_sched_ctx_list_task_counters_reset_all(struct starpu_task *task, unsigned sched_ctx_id); void starpu_sched_ctx_set_priority(int *workers, int nworkers, unsigned sched_ctx_id, 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); /** Return the context id of masterid if it master of a context. If not, return ::STARPU_NMAX_SCHED_CTXS. */ unsigned starpu_sched_ctx_master_get_context(int masterid); void starpu_sched_ctx_revert_task_counters_ctx_locked(unsigned sched_ctx_id, double flops); void starpu_sched_ctx_move_task_to_ctx_locked(struct starpu_task *task, unsigned sched_ctx, unsigned with_repush); int starpu_sched_ctx_get_worker_rank(unsigned sched_ctx_id); void (*starpu_sched_ctx_get_sched_policy_init(unsigned sched_ctx_id))(unsigned); unsigned starpu_sched_ctx_has_starpu_scheduler(unsigned sched_ctx_id, unsigned *awake_workers); int starpu_sched_ctx_get_stream_worker(unsigned sub_ctx); int starpu_sched_ctx_get_nsms(unsigned sched_ctx); void starpu_sched_ctx_get_sms_interval(int stream_workerid, int *start, int *end); /** @} */ /** @name Scheduling Context Priorities @{ */ /** Return the current minimum priority level supported by the scheduling policy of the given scheduler context. */ int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id); /** Return the current maximum priority level supported by the scheduling policy of the given scheduler context. */ int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id); /** Define 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. */ int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio); /** Define 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. */ 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); /** Provided for legacy reasons. */ #define STARPU_MIN_PRIO (starpu_sched_get_min_priority()) /** Provided for legacy reasons. */ #define STARPU_MAX_PRIO (starpu_sched_get_max_priority()) /** By convention, the default priority level should be 0 so that we can statically allocate tasks with a default priority. */ #define STARPU_DEFAULT_PRIO 0 /** @} */ /** @name Scheduling Context Worker Collection @{ */ /** Create a worker collection of the type indicated by the last parameter for the context specified through the first parameter. */ struct starpu_worker_collection *starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type type) STARPU_ATTRIBUTE_MALLOC; /** Delete the worker collection of the specified scheduling context */ void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id); /** Return the worker collection managed by the indicated context */ struct starpu_worker_collection *starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id); /** @} */ /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_SCHED_CTX_H__ */ starpu-1.3.9+dfsg/include/starpu_sched_ctx_hypervisor.h000066400000000000000000000057441413463044200234240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_Scheduling_Contexts @{ */ /** @name Scheduling Context Link with Hypervisor @{ */ /** Performance counters used by the starpu to indicate the hypervisor how the application and the resources are executing. */ struct starpu_sched_ctx_performance_counters { /** Inform the hypervisor for how long a worker has been idle in the specified context */ void (*notify_idle_cycle)(unsigned sched_ctx_id, int worker, double idle_time); /** Inform the hypervisor that a task executing a specified number of instructions has been poped from the worker */ void (*notify_poped_task)(unsigned sched_ctx_id, int worker); /** Notify the hypervisor that a task has been scheduled on the queue of the worker corresponding to the specified context */ void (*notify_pushed_task)(unsigned sched_ctx_id, int worker); /** Notify the hypervisor that a task has just been executed */ void (*notify_post_exec_task)(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops); /** Notify the hypervisor that a task has just been submitted */ 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); /** Notify the hypervisor that the context was deleted */ void (*notify_delete_context)(unsigned sched_ctx); }; /** Indicate to starpu the pointer to the performance counter */ void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void *perf_counters); /** Callback that lets the scheduling policy tell the hypervisor that a task was pushed on a worker */ void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id); /** Allow the hypervisor to let starpu know it's initialised */ void starpu_sched_ctx_notify_hypervisor_exists(void); /** Ask starpu if it is informed if the hypervisor is initialised */ 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.3.9+dfsg/include/starpu_scheduler.h000066400000000000000000000375021413463044200211410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @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. @{ */ struct starpu_task; /** Contain 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 the worker is idle. The scheduler here gives back the task to the core. It must not access this task any more
  • 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 completes 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 completes the task computation.
*/ struct starpu_sched_policy { /** Initialize the scheduling policy, called before any other method. */ void (*init_sched)(unsigned sched_ctx_id); /** Cleanup the scheduling policy */ void (*deinit_sched)(unsigned sched_ctx_id); /** Insert a task into the scheduler, called when the task becomes ready for execution. This must call starpu_push_task_end() once it has effectively pushed the task to a queue (to note the time when this was done in the task), but before releasing mutexes (so that the task hasn't been already taken by a worker). */ int (*push_task)(struct starpu_task *); double (*simulate_push_task)(struct starpu_task *); /** 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. */ void (*push_task_notify)(struct starpu_task *, int workerid, int perf_workerid, 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. */ struct starpu_task *(*pop_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. */ struct starpu_task *(*pop_every_task)(unsigned sched_ctx_id); /** Optional field. This method is called when a task is submitted. */ void (*submit_hook)(struct starpu_task *task); /** Optional field. This method is called every time a task is starting. */ void (*pre_exec_hook)(struct starpu_task *, unsigned sched_ctx_id); /** Optional field. This method is called every time a task has been executed. */ void (*post_exec_hook)(struct starpu_task *, 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. */ void (*do_schedule)(unsigned sched_ctx_id); /** Initialize scheduling structures corresponding to each worker used by the policy. */ void (*add_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers); /** Deinitialize scheduling structures corresponding to each worker used by the policy. */ void (*remove_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers); /** Optional field. Name of the policy. */ const char *policy_name; /** Optional field. Human readable description of the policy. */ const char *policy_description; enum starpu_worker_collection_type worker_type; }; /** Return an NULL-terminated array of all the predefined scheduling policies. */ struct starpu_sched_policy **starpu_sched_get_predefined_policies(); /** 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. */ 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); /** TODO: check if this is correct Return the current minimum priority level supported by the scheduling policy */ int starpu_sched_get_min_priority(void); /** TODO: check if this is correct Return the current maximum priority level supported by the scheduling policy */ int starpu_sched_get_max_priority(void); /** TODO: check if this is correct Define 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. */ int starpu_sched_set_min_priority(int min_prio); /** TODO: check if this is correct Define 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. */ int starpu_sched_set_max_priority(int max_prio); /** 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. */ int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl); /** Check if the worker specified by workerid can execute the codelet and return 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. */ int starpu_worker_can_execute_task_impl(unsigned workerid, struct starpu_task *task, unsigned *impl_mask); /** Check if the worker specified by workerid can execute the codelet and return 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. */ int starpu_worker_can_execute_task_first_impl(unsigned workerid, struct starpu_task *task, unsigned *nimpl); /** 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. */ int starpu_push_local_task(int workerid, struct starpu_task *task, int back); /** Must be called by a scheduler to notify that the given task has just been pushed. */ int starpu_push_task_end(struct starpu_task *task); /** Whether \ref STARPU_PREFETCH was set */ int starpu_get_prefetch_flag(void); /** Prefetch data for a given p task on a given p node with a given priority */ int starpu_prefetch_task_input_on_node_prio(struct starpu_task *task, unsigned node, int prio); /** Prefetch data for a given p task on a given p node */ int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node); /** Prefetch data for a given p task on a given p node when the bus is idle with a given priority */ int starpu_idle_prefetch_task_input_on_node_prio(struct starpu_task *task, unsigned node, int prio); /** Prefetch data for a given p task on a given p node when the bus is idle */ int starpu_idle_prefetch_task_input_on_node(struct starpu_task *task, unsigned node); /** Prefetch data for a given p task on a given p worker with a given priority */ int starpu_prefetch_task_input_for_prio(struct starpu_task *task, unsigned worker, int prio); /** Prefetch data for a given p task on a given p worker */ int starpu_prefetch_task_input_for(struct starpu_task *task, unsigned worker); /** Prefetch data for a given p task on a given p worker when the bus is idle with a given priority */ int starpu_idle_prefetch_task_input_for_prio(struct starpu_task *task, unsigned worker, int prio); /** Prefetch data for a given p task on a given p worker when the bus is idle */ int starpu_idle_prefetch_task_input_for(struct starpu_task *task, unsigned worker); /** Return the footprint for a given task, taking into account user-provided perfmodel footprint or size_base functions. */ uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); /** Return the raw footprint for the data of a given task (without taking into account user-provided functions). */ uint32_t starpu_task_data_footprint(struct starpu_task *task); /** Return expected task duration in micro-seconds. */ double starpu_task_expected_length(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); /** Return an estimated speedup factor relative to CPU speed */ double starpu_worker_get_relative_speedup(struct starpu_perfmodel_arch *perf_arch); /** Return expected data transfer time in micro-seconds for the given \p memory_node. Prefer using starpu_task_expected_data_transfer_time_for() which is more precise. */ double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task); /** Return expected data transfer time in micro-seconds for the given \p worker. */ double starpu_task_expected_data_transfer_time_for(struct starpu_task *task, unsigned worker); /** Predict the transfer time (in micro-seconds) to move \p 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); /** Return expected energy consumption in J */ double starpu_task_expected_energy(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); /** Return expected conversion time in ms (multiformat interface only) */ double starpu_task_expected_conversion_time(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl); typedef void (*starpu_notify_ready_soon_func)(void *data, struct starpu_task *task, double delay); /** Register a callback to be called when it is determined when a task will be ready an estimated amount of time from now, because its last dependency has just started and we know how long it will take. */ void starpu_task_notify_ready_soon_register(starpu_notify_ready_soon_func f, void *data); /** 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 */ void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id); void starpu_sched_task_break(struct starpu_task *task); /** @name Worker operations @{ */ /** Wake up \p workerid while temporarily entering the current worker relax state if needed during the waiting process. Return 1 if \p workerid has been woken up or its state_keep_awake flag has been set to \c 1, and \c 0 otherwise (if \p workerid was not in the STATE_SLEEPING or in the STATE_SCHEDULING). */ int starpu_wake_worker_relax(int workerid); /** Must be called to wake up a worker that is sleeping on the cond. Return 0 whenever the worker is not in a sleeping state or has the state_keep_awake flag on. */ int starpu_wake_worker_no_relax(int workerid); /** Version of starpu_wake_worker_no_relax() which assumes that the sched mutex is locked */ int starpu_wake_worker_locked(int workerid); /** Light version of starpu_wake_worker_relax() which, when possible, speculatively set keep_awake on the target worker without waiting for the worker to enter the relax state. */ int starpu_wake_worker_relax_light(int workerid); /** @} */ /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_SCHEDULER_H__ */ starpu-1.3.9+dfsg/include/starpu_simgrid_wrap.h000066400000000000000000000016031413463044200216430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/include/starpu_sink.h000066400000000000000000000015601413463044200201220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @defgroup API_Sink Sink @{ */ void starpu_sink_common_worker(int argc, char **argv); /** @} */ #endif /* __STARPU_SINK_H__ */ starpu-1.3.9+dfsg/include/starpu_stdlib.h000066400000000000000000000220011413463044200204300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Standard_Memory_Library Standard Memory Library @{ */ /** Value passed to the function starpu_malloc_flags() to indicate the memory allocation should be pinned. */ #define STARPU_MALLOC_PINNED ((1ULL)<<1) /** 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. */ #define STARPU_MALLOC_COUNT ((1ULL)<<2) /** 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 \ref STARPU_MINIMUM_AVAILABLE_MEM, \ref STARPU_TARGET_AVAILABLE_MEM, \ref STARPU_MINIMUM_CLEAN_BUFFERS, and \ref STARPU_TARGET_CLEAN_BUFFERS 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. */ #define STARPU_MALLOC_NORECLAIM ((1ULL)<<3) /** 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. */ #define STARPU_MEMORY_WAIT ((1ULL)<<4) /** 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. */ #define STARPU_MEMORY_OVERFLOW ((1ULL)<<5) /** 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. */ #define STARPU_MALLOC_SIMULATION_FOLDED ((1ULL)<<6) /** @deprecated Equivalent to starpu_malloc(). This macro is provided to avoid breaking old codes. */ #define starpu_data_malloc_pinned_if_possible starpu_malloc /** @deprecated Equivalent to starpu_free(). This macro is provided to avoid breaking old codes. */ #define starpu_data_free_pinned_if_possible starpu_free /** Set an alignment constraints for starpu_malloc() allocations. \p align must be a power of two. This is for instance called automatically by the OpenCL driver to specify its own alignment constraints. */ void starpu_malloc_set_align(size_t align); /** Allocate data of the given size \p dim in main memory, and return 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. */ int starpu_malloc(void **A, size_t dim); /** Free memory which has previously been allocated with starpu_malloc(). */ int starpu_free(void *A); /** Perform a memory allocation based on the constraints defined by the given flag. */ int starpu_malloc_flags(void **A, size_t dim, int flags); /** Free memory by specifying its size. The given flags should be consistent with the ones given to starpu_malloc_flags() when allocating the memory. */ int starpu_free_flags(void *A, size_t dim, int flags); typedef int (*starpu_malloc_hook)(unsigned dst_node, void **A, size_t dim, int flags); typedef int (*starpu_free_hook)(unsigned dst_node, void *A, size_t dim, int flags); /** Set allocation functions to be used by StarPU. By default, StarPU will use \c malloc() (or \c cudaHostAlloc() if CUDA GPUs are used) for all its data handle allocations. The application can specify another allocation primitive by calling this. The malloc_hook should pass the allocated pointer through the \c A parameter, and return 0 on success. On allocation failure, it should return -ENOMEM. The \c flags parameter contains ::STARPU_MALLOC_PINNED if the memory should be pinned by the hook for GPU transfer efficiency. The hook can use starpu_memory_pin() to achieve this. The \c dst_node parameter is the starpu memory node, one can convert it to an hwloc logical id with starpu_memory_nodes_numa_id_to_hwloclogid() or to an OS NUMA number with starpu_memory_nodes_numa_devid_to_id(). */ void starpu_malloc_set_hooks(starpu_malloc_hook malloc_hook, starpu_free_hook free_hook); /** Pin 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. Return 0 on success, -1 on error. */ int starpu_memory_pin(void *addr, size_t size); /** Unpin the given memory area previously pinned with starpu_memory_pin(). Return 0 on success, -1 on error. */ int starpu_memory_unpin(void *addr, size_t size); /** 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. */ starpu_ssize_t starpu_memory_get_total(unsigned node); /** 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. */ starpu_ssize_t starpu_memory_get_available(unsigned node); /** Return the amount of total memory on all memory nodes for whose a memory limit is defined (see Section \ref HowToLimitMemoryPerNode). */ starpu_ssize_t starpu_memory_get_total_all_nodes(void); /** Return the amount of available memory on all memory nodes for whose a memory limit is defined (see Section \ref HowToLimitMemoryPerNode). */ starpu_ssize_t starpu_memory_get_available_all_nodes(void); /** 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, return -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. */ int starpu_memory_allocate(unsigned node, size_t size, int flags); /** 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. */ void starpu_memory_deallocate(unsigned node, size_t size); /** 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. */ void starpu_memory_wait_available(unsigned node, size_t size); void starpu_sleep(float nb_sec); void starpu_usleep(float nb_micro_sec); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_STDLIB_H__ */ starpu-1.3.9+dfsg/include/starpu_task.h000066400000000000000000001563541413463044200201340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS # include #endif #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Codelet_And_Tasks Codelet And Tasks @brief This section describes the interface to manipulate codelets and tasks. @{ */ /** To be 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. */ #define STARPU_NOWHERE ((1ULL)<<0) /** To be used when setting the field starpu_codelet::where (or starpu_task::where) to specify the codelet (or the task) may be executed on a CPU processing unit. */ #define STARPU_CPU ((1ULL)<<1) /** To be used when setting the field starpu_codelet::where (or starpu_task::where) to specify the codelet (or the task) may be executed on a CUDA processing unit. */ #define STARPU_CUDA ((1ULL)<<3) /** To be used when setting the field starpu_codelet::where (or starpu_task::where) to specify the codelet (or the task) may be executed on a OpenCL processing unit. */ #define STARPU_OPENCL ((1ULL)<<6) /** To be used when setting the field starpu_codelet::where (or starpu_task::where) to specify the codelet (or the task) may be executed on a MIC processing unit. */ #define STARPU_MIC ((1ULL)<<7) /** To be used when setting the field starpu_codelet::where (or starpu_task::where) to specify the codelet (or the task) may be executed on a MPI Slave processing unit. */ #define STARPU_MPI_MS ((1ULL)<<9) /** Value to be set in starpu_codelet::flags to execute the codelet functions even in simgrid mode. */ #define STARPU_CODELET_SIMGRID_EXECUTE (1<<0) /** Value to be set in starpu_codelet::flags to execute the codelet functions even in simgrid mode, and later inject the measured timing inside the simulation. */ #define STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT (1<<1) /** Value to be set in starpu_codelet::flags to make starpu_task_submit() not submit automatic asynchronous partitioning/unpartitioning. */ #define STARPU_CODELET_NOPLANS (1<<2) /** Value to be set in starpu_codelet::cuda_flags to allow asynchronous CUDA kernel execution. */ #define STARPU_CUDA_ASYNC (1<<0) /** Value to be set in starpu_codelet::opencl_flags to allow asynchronous OpenCL kernel execution. */ #define STARPU_OPENCL_ASYNC (1<<0) /** To be used when the RAM memory node is specified. */ #define STARPU_MAIN_RAM 0 /** Describe the type of parallel task. See \ref ParallelTasks for details. */ enum starpu_codelet_type { STARPU_SEQ = 0, /**< (default) for classical sequential tasks. */ STARPU_SPMD, /**< 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. */ STARPU_FORKJOIN /**< 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 { STARPU_TASK_INIT, /**< The task has just been initialized. */ #define STARPU_TASK_INIT 0 #define STARPU_TASK_INVALID STARPU_TASK_INIT /**< old name for STARPU_TASK_INIT */ STARPU_TASK_BLOCKED, /**< The task has just been submitted, and its dependencies has not been checked yet. */ STARPU_TASK_READY, /**< The task is ready for execution. */ STARPU_TASK_RUNNING, /**< The task is running on some worker. */ STARPU_TASK_FINISHED, /**< The task is finished executing. */ STARPU_TASK_BLOCKED_ON_TAG, /**< The task is waiting for a tag. */ STARPU_TASK_BLOCKED_ON_TASK, /**< The task is waiting for a task. */ STARPU_TASK_BLOCKED_ON_DATA, /**< The task is waiting for some data. */ STARPU_TASK_STOPPED /**< The task is stopped. */ }; /** CPU implementation of a codelet. */ typedef void (*starpu_cpu_func_t)(void **, void*); /** CUDA implementation of a codelet. */ typedef void (*starpu_cuda_func_t)(void **, void*); /** OpenCL implementation of a codelet. */ typedef void (*starpu_opencl_func_t)(void **, void*); /** MIC implementation of a codelet. */ typedef void (*starpu_mic_kernel_t)(void **, void*); /** MIC kernel for a codelet */ typedef starpu_mic_kernel_t (*starpu_mic_func_t)(void); /** MPI Master Slave kernel for a codelet */ typedef void (*starpu_mpi_ms_kernel_t)(void **, void*); /** MPI Master Slave implementation of a codelet. */ typedef starpu_mpi_ms_kernel_t (*starpu_mpi_ms_func_t)(void); /** @deprecated 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. */ #define STARPU_MULTIPLE_CPU_IMPLEMENTATIONS ((starpu_cpu_func_t) -1) /** @deprecated 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. */ #define STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS ((starpu_cuda_func_t) -1) /** @deprecated 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. */ #define STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS ((starpu_opencl_func_t) -1) /** Value to set in starpu_codelet::nbuffers to specify that the codelet can accept a variable number of buffers, specified in starpu_task::nbuffers. */ #define STARPU_VARIABLE_NBUFFERS (-1) /** Value to be set in the field starpu_codelet::nodes to request StarPU to put the data in CPU-accessible memory (and let StarPU choose the NUMA node). */ #define STARPU_SPECIFIC_NODE_LOCAL (-1) #define STARPU_SPECIFIC_NODE_CPU (-2) #define STARPU_SPECIFIC_NODE_SLOW (-3) #define STARPU_SPECIFIC_NODE_FAST (-4) struct starpu_task; /** 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. */ struct starpu_codelet { /** 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. */ uint32_t where; /** Define a function which should return 1 if the worker designated by \p workerid can execute the \p nimpl -th implementation of \p task, 0 otherwise. */ int (*can_execute)(unsigned workerid, struct starpu_task *task, unsigned nimpl); /** 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. */ enum starpu_codelet_type type; /** 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. */ int max_parallelism; /** @deprecated Optional field which has been made deprecated. One should use instead the field starpu_codelet::cpu_funcs. */ starpu_cpu_func_t cpu_func STARPU_DEPRECATED; /** @deprecated Optional field which has been made deprecated. One should use instead the starpu_codelet::cuda_funcs field. */ starpu_cuda_func_t cuda_func STARPU_DEPRECATED; /** @deprecated Optional field which has been made deprecated. One should use instead the starpu_codelet::opencl_funcs field. */ starpu_opencl_func_t opencl_func STARPU_DEPRECATED; /** 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 tarpu_codelet::cpu_funcs is ignored if ::STARPU_CPU does not appear in the field starpu_codelet::where, it must be non-NULL otherwise. */ starpu_cpu_func_t cpu_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. */ starpu_cuda_func_t cuda_funcs[STARPU_MAXIMPLEMENTATIONS]; /** Optional array of flags for CUDA execution. They specify some semantic details about CUDA kernel execution, such as asynchronous execution. */ char cuda_flags[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. */ starpu_opencl_func_t opencl_funcs[STARPU_MAXIMPLEMENTATIONS]; /** Optional array of flags for OpenCL execution. They specify some semantic details about OpenCL kernel execution, such as asynchronous execution. */ char opencl_flags[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. */ starpu_mic_func_t mic_funcs[STARPU_MAXIMPLEMENTATIONS]; /** Optional array of function pointers to a function which returns the MPI Master Slave implementation of the codelet. The functions prototype must be: \code{.c} starpu_mpi_ms_kernel_t mpi_ms_func(struct starpu_codelet *cl, unsigned nimpl) \endcode If the field starpu_codelet::where is set, then the field starpu_codelet::mpi_ms_funcs is ignored if ::STARPU_MPI_MS 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. */ starpu_mpi_ms_func_t mpi_ms_funcs[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 for StarPU to simply look up the MIC function implementation through its name. */ const char *cpu_funcs_name[STARPU_MAXIMPLEMENTATIONS]; /** 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 \ref 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. */ int nbuffers; /** 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". */ enum starpu_data_access_mode modes[STARPU_NMAXBUFS]; /** 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. */ enum starpu_data_access_mode *dyn_modes; /** 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). */ unsigned specific_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, and should not exceed \ref STARPU_NMAXBUFS. */ int 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. 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. */ int *dyn_nodes; /** 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. */ struct starpu_perfmodel *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::symbol is not set. In the case of parallel codelets, this has to account for all processing units involved in the parallel execution. */ struct starpu_perfmodel *energy_model; /** 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). */ unsigned long per_worker_stats[STARPU_NMAXWORKERS]; /** Optional name of the codelet. This can be useful for debugging purposes. */ const char *name; /** Optional color of the codelet. This can be useful for debugging purposes. */ unsigned color; /** 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. If the task defines a callback, the codelet callback is not called, unless called within the task callback function. 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. */ void (*callback_func)(void *); /** Various flags for the codelet. */ int flags; /** Whether _starpu_codelet_check_deprecated_fields was already done or not. */ int checked; }; /** Describe a data handle along with an access mode. */ struct starpu_data_descr { starpu_data_handle_t handle; /**< data */ enum starpu_data_access_mode mode; /**< access mode */ }; /** Describe 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(). */ struct starpu_task { /** Optional name of the task. This can be useful for debugging purposes. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_NAME followed by the const char *. */ const char *name; /** 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. */ struct starpu_codelet *cl; /** When set, specify where the task is allowed to be executed. When unset, take the value of starpu_codelet::where. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_EXECUTE_WHERE followed by an unsigned long long. */ int32_t where; /** Specify the number of buffers. This is only used when starpu_codelet::nbuffers is \ref STARPU_VARIABLE_NBUFFERS. With starpu_task_insert() and alike this is automatically computed when using ::STARPU_DATA_ARRAY and alike. */ int nbuffers; /* Keep dyn_handles, dyn_interfaces and dyn_modes before the * equivalent static arrays, so we can detect dyn_handles * being NULL while nbuffers being bigger that STARPU_NMAXBUFS * (otherwise the overflow would put a non-NULL) */ /** Array of ::starpu_data_handle_t. Specify 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 below. With starpu_task_insert() and alike this is automatically filled when using ::STARPU_DATA_ARRAY and alike. */ starpu_data_handle_t *dyn_handles; /** Array of 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. This is filled by StarPU. */ void **dyn_interfaces; /** Used only when starpu_codelet::nbuffers is \ref STARPU_VARIABLE_NBUFFERS. Array of ::starpu_data_access_mode which 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 below. With starpu_task_insert() and alike this is automatically filled when using ::STARPU_DATA_MODE_ARRAY and alike. */ enum starpu_data_access_mode *dyn_modes; /** Array of ::starpu_data_handle_t. Specify 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". With starpu_task_insert() and alike this is automatically filled when using ::STARPU_R and alike. */ starpu_data_handle_t handles[STARPU_NMAXBUFS]; /** Array of Data pointers to the memory node where execution will happen, managed by the DSM. This is filled by StarPU. */ void *interfaces[STARPU_NMAXBUFS]; /** Used only when starpu_codelet::nbuffers is \ref STARPU_VARIABLE_NBUFFERS. Array of ::starpu_data_access_mode which 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". With starpu_task_insert() and alike this is automatically filled when using ::STARPU_DATA_MODE_ARRAY and alike. */ enum starpu_data_access_mode modes[STARPU_NMAXBUFS]; /** Optional pointer to an array of characters which allows to define the sequential consistency for each handle for the current task. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_HANDLES_SEQUENTIAL_CONSISTENCY followed by an unsigned char * */ unsigned char *handles_sequential_consistency; /** 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 . With starpu_task_insert() and alike this can be specified thanks to ::STARPU_CL_ARGS followed by a void* and a size_t. */ void *cl_arg; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_CL_ARGS followed by a void* and a size_t. */ size_t cl_arg_size; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_CALLBACK followed by the function pointer, or thanks to ::STARPU_CALLBACK_WITH_ARG (or ::STARPU_CALLBACK_WITH_ARG_NFREE) followed by the function pointer and the argument. */ void (*callback_func)(void *); /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_CALLBACK_ARG followed by the argument pointer, or thanks to ::STARPU_CALLBACK_WITH_ARG or ::STARPU_CALLBACK_WITH_ARG_NFREE followed by the function pointer and the argument. */ void *callback_arg; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_PROLOGUE_CALLBACK followed by the function pointer. */ void (*prologue_callback_func)(void *); /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_PROLOGUE_CALLBACK_ARG followed by the argument */ void *prologue_callback_arg; /** 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 is pop-ed from the scheduler, just before getting executed. The callback is passed the value contained in the starpu_task::prologue_callback_pop_arg field. No callback is executed if the field is set to NULL. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_PROLOGUE_CALLBACK_POP followed by the function pointer. */ void (*prologue_callback_pop_func)(void *); /** Optional field, the default value is NULL. This is the pointer passed to the prologue_callback_pop function. This field is ignored if the field starpu_task::prologue_callback_pop_func is set to NULL. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_PROLOGUE_CALLBACK_POP_ARG followed by the argument. */ void *prologue_callback_pop_arg; /** Optional field. Contain the tag associated to the task if the field starpu_task::use_tag is set, ignored otherwise. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_TAG followed by a starpu_tag_t. */ starpu_tag_t tag_id; /** 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, where the codelet does not execute in the same memory space as the main thread. With starpu_task_insert() and alike this is set to 1 when using ::STARPU_CL_ARGS. */ unsigned cl_arg_free:1; /** 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. With starpu_task_insert() and alike, this is set to 1 when using ::STARPU_CALLBACK_ARG or ::STARPU_CALLBACK_WITH_ARG, or set to 0 when using ::STARPU_CALLBACK_ARG_NFREE */ unsigned callback_arg_free:1; /** 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. With starpu_task_insert() and alike this is set to 1 when using ::STARPU_PROLOGUE_CALLBACK_ARG, or set to 0 when using ::STARPU_PROLOGUE_CALLBACK_ARG_NFREE */ unsigned prologue_callback_arg_free:1; /** Optional field. In case starpu_task::prologue_callback_pop_arg was allocated by the application through malloc(), setting starpu_task::prologue_callback_pop_arg_free to 1 makes StarPU automatically call free(prologue_callback_pop_arg) when destroying the task. With starpu_task_insert() and alike this is set to 1 when using ::STARPU_PROLOGUE_CALLBACK_POP_ARG, or set to 0 when using ::STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE */ unsigned prologue_callback_pop_arg_free:1; /** 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. With starpu_task_insert() and alike this is set to 1 when using ::STARPU_TAG. */ unsigned use_tag:1; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_SEQUENTIAL_CONSISTENCY followed by an unsigned. */ unsigned sequential_consistency:1; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_TASK_SYNCHRONOUS followed an int. */ unsigned synchronous:1; /** 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. With starpu_task_insert() and alike this is set to 1 when using ::STARPU_EXECUTE_ON_WORKER. */ unsigned execute_on_a_specific_worker:1; /** 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. With starpu_task_insert() and alike this is set to 1. */ unsigned detach:1; /** 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. With starpu_task_insert() and alike this is set to 1. */ unsigned destroy:1; /** 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. With starpu_task_insert() and alike this is set to 0. */ unsigned regenerate:1; /** do not allocate a submitorder id for this task With starpu_task_insert() and alike this can be specified thanks to ::STARPU_TASK_NO_SUBMITORDER followed by an unsigned. */ unsigned no_submitorder:1; /** @private This is only used for tasks that use multiformat handle. This should only be used by StarPU. */ unsigned char mf_skip; /** Whether the scheduler has pushed the task on some queue Set by StarPU. */ unsigned char scheduled; /** Whether the scheduler has prefetched the task's data Set by StarPU. */ unsigned char prefetched; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_EXECUTE_ON_WORKER followed by an int. */ unsigned workerid; /** 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_WORKER_ORDER followed by an unsigned. */ unsigned workerorder; /** Optional field. If the field starpu_task::workerids_len is different from 0, this field indicates an array of bits (stored as uint32_t values) which indicate the set of workers which are allowed to execute the task. starpu_task::workerid takes precedence over this. With starpu_task_insert() and alike, this can be specified along the field workerids_len thanks to ::STARPU_TASK_WORKERIDS followed by a number of workers and an array of bits which size is the number of workers. */ uint32_t *workerids; /** Optional field. This provides the number of uint32_t values in the starpu_task::workerids array. With starpu_task_insert() and alike, this can be specified along the field workerids thanks to ::STARPU_TASK_WORKERIDS followed by a number of workers and an array of bits which size is the number of workers. */ unsigned workerids_len; /** 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 return 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. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_PRIORITY followed by an unsigned long long. */ int priority; /** Current state of the task. Set by StarPU. */ enum starpu_task_status status; /** @private This field is set when initializing a task. The function starpu_task_submit() will fail if the field does not have the correct value. This will hence avoid submitting tasks which have not been properly initialised. */ int magic; /** Allow to get the type of task, for filtering out tasks in profiling outputs, whether it is really internal to StarPU (::STARPU_TASK_TYPE_INTERNAL), a data acquisition synchronization task (::STARPU_TASK_TYPE_DATA_ACQUIRE), or a normal task (::STARPU_TASK_TYPE_NORMAL) Set by StarPU. */ unsigned type; /** color of the task to be used in dag.dot. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_TASK_COLOR followed by an int. */ unsigned color; /** Scheduling context. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_SCHED_CTX followed by an unsigned. */ unsigned sched_ctx; /** Help the hypervisor monitor the execution of this task. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_HYPERVISOR_TAG followed by an int. */ int hypervisor_tag; /** TODO: related with sched contexts and parallel tasks With starpu_task_insert() and alike this can be specified thanks to ::STARPU_POSSIBLY_PARALLEL followed by an unsigned. */ unsigned possibly_parallel; /** Optional field. The bundle that includes this task. If no bundle is used, this should be NULL. */ starpu_task_bundle_t bundle; /** Optional field. Profiling information for the task. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_TASK_PROFILING_INFO followed by a pointer to the appropriate struct. */ struct starpu_profiling_task_info *profiling_info; /** The application can set this to the number of floating points operations that the task will have to achieve. StarPU will measure the time that the task takes, and divide the two to get the GFlop/s achieved by the task. This will allow getting GFlops/s curves from the tool starpu_perfmodel_plot, and is useful for the hypervisor load balancing. With starpu_task_insert() and alike this can be specified thanks to ::STARPU_FLOPS followed by a double. */ double flops; /** Output field. Predicted duration of the task. This field is only set if the scheduling strategy uses performance models. Set by StarPU. */ double predicted; /** Output field. Predicted data transfer duration for the task in microseconds. This field is only valid if the scheduling strategy uses performance models. Set by StarPU. */ double predicted_transfer; double predicted_start; /** @private A pointer to the previous task. This should only be used by StarPU schedulers. */ struct starpu_task *prev; /** @private A pointer to the next task. This should only be used by StarPU schedulers. */ struct starpu_task *next; /** @private This is private to StarPU, do not modify. */ void *starpu_private; #ifdef STARPU_OPENMP /** @private This is private to StarPU, do not modify. */ struct starpu_omp_task *omp_task; #else void *omp_task; #endif /** @private This is private to StarPU, do not modify. */ unsigned nb_termination_call_required; /** This field is managed by the scheduler, is it allowed to do whatever with it. Typically, some area would be allocated on push, and released on pop. With starpu_task_insert() and alike this is set when using ::STARPU_TASK_SCHED_DATA. */ void *sched_data; }; /** To be used in the starpu_task::type field, for normal application tasks. */ #define STARPU_TASK_TYPE_NORMAL 0 /** To be used in the starpu_task::type field, for StarPU-internal tasks. */ #define STARPU_TASK_TYPE_INTERNAL (1<<0) /** To be used in the starpu_task::type field, for StarPU-internal data acquisition tasks. */ #define STARPU_TASK_TYPE_DATA_ACQUIRE (1<<1) /** Value to be used to initialize statically allocated tasks. This is equivalent to initializing a structure starpu_task with the function starpu_task_init(). */ /* Note: remember to update starpu_task_init as well */ #define STARPU_TASK_INITIALIZER \ { \ .cl = NULL, \ .where = -1, \ .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_INIT, \ .profiling_info = NULL, \ .predicted = NAN, \ .predicted_transfer = NAN, \ .predicted_start = NAN, \ .starpu_private = NULL, \ .magic = 42, \ .type = 0, \ .color = 0, \ .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 \ } /** Return the number of buffers for \p task, i.e. starpu_codelet::nbuffers, or starpu_task::nbuffers if the former is \ref STARPU_VARIABLE_NBUFFERS. */ #define STARPU_TASK_GET_NBUFFERS(task) ((unsigned)((task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS ? ((task)->nbuffers) : ((task)->cl->nbuffers))) /** Return the \p i -th data handle of \p task. If \p 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) */ #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) /** Set the \p i -th data handle of \p task with \p handle. If \p 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) */ #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) /** Return the access mode of the \p i -th data handle of \p codelet. If \p 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) */ #define STARPU_CODELET_GET_MODE(codelet, i) \ (((codelet)->dyn_modes) ? (codelet)->dyn_modes[i] : (assert(i < STARPU_NMAXBUFS), (codelet)->modes[i])) /** Set the access mode of the \p i -th data handle of \p codelet. If \p 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) */ #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) /** Return the access mode of the \p i -th data handle of \p task. If \p 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) */ #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) ) /** Set the access mode of the \p i -th data handle of \p task. If \p 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) */ #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) /** Return the target node of the \p i -th data handle of \p codelet. If \p node is defined with a static or dynamic number of handles, will either return the \p i -th element of the field starpu_codelet::nodes or the \p i -th element of the field starpu_codelet::dyn_nodes (see \ref SettingManyDataHandlesForATask) */ #define STARPU_CODELET_GET_NODE(codelet, i) (((codelet)->dyn_nodes) ? (codelet)->dyn_nodes[i] : (codelet)->nodes[i]) /** Set the target node of the \p i -th data handle of \p codelet. If \p codelet is defined with a static or dynamic number of handles, will either set the \p i -th element of the field starpu_codelet::nodes or the \p i -th element of the field starpu_codelet::dyn_nodes (see \ref SettingManyDataHandlesForATask) */ #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) /** Initialize \p 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. */ void starpu_task_init(struct starpu_task *task); /** Release all the structures automatically allocated to execute \p 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). */ void starpu_task_clean(struct starpu_task *task); /** 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(). */ struct starpu_task *starpu_task_create(void) STARPU_ATTRIBUTE_MALLOC; /** Free the resource allocated during starpu_task_create() and associated with \p task. This function is 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. */ void starpu_task_destroy(struct starpu_task *task); /** Submit \p 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. */ int starpu_task_submit(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; /** Submit \p task to the context \p sched_ctx_id. By default, starpu_task_submit() submits the task to a global context that is created automatically by StarPU. */ 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; /** Block 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. */ int starpu_task_wait(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT; /** Allow to wait for an array of tasks. Upon successful completion, this function returns 0. Otherwise, -EINVAL indicates that one of the tasks was either synchronous or detached. */ int starpu_task_wait_array(struct starpu_task **tasks, unsigned nb_tasks) STARPU_WARN_UNUSED_RESULT; /** Block until all the tasks that were submitted (to the current context or the global one if there is no current context) are terminated. It does not destroy these tasks. */ int starpu_task_wait_for_all(void); /** Block until there are \p n submitted tasks left (to the current context or the global one if there is no current context) to be executed. It does not destroy these tasks. */ int starpu_task_wait_for_n_submitted(unsigned n); /** Wait until all the tasks that were already submitted to the context \p sched_ctx_id have been terminated. */ int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx_id); /** Wait until there are \p n tasks submitted left to be executed that were already submitted to the context \p sched_ctx_id. */ int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx_id, unsigned n); /** Wait until there is no more ready task. */ int starpu_task_wait_for_no_ready(void); /** Return the number of submitted tasks which are ready for execution are already executing. It thus does not include tasks waiting for dependencies. */ int starpu_task_nready(void); /** Return the number of submitted tasks which have not completed yet. */ int starpu_task_nsubmitted(void); /** Set 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. */ void starpu_iteration_push(unsigned long iteration); /** Drop 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. */ void starpu_iteration_pop(void); void starpu_do_schedule(void); /** 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++. */ void starpu_codelet_init(struct starpu_codelet *cl); /** Output on \c stderr some statistics on the codelet \p cl. */ void starpu_codelet_display_stats(struct starpu_codelet *cl); /** Return 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. */ struct starpu_task *starpu_task_get_current(void); /** Return the memory node number of parameter \p i of the task currently executed, or -1 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. Usually, the returned memory node number is simply the memory node for the current worker. That may however be different when using e.g. starpu_codelet::specific_nodes. */ int starpu_task_get_current_data_node(unsigned i); /** Return the name of the performance model of \p task. */ const char *starpu_task_get_model_name(struct starpu_task *task); /** Return the name of \p task, i.e. either its starpu_task::name field, or the name of the corresponding performance model. */ const char *starpu_task_get_name(struct starpu_task *task); /** Allocate a task structure which is the exact duplicate of \p task. */ struct starpu_task *starpu_task_dup(struct starpu_task *task); /** This function should be called by schedulers to specify the codelet implementation to be executed when executing \p task. */ void starpu_task_set_implementation(struct starpu_task *task, unsigned impl); /** Return the codelet implementation to be executed when executing \p task. */ unsigned starpu_task_get_implementation(struct starpu_task *task); /** Create and submit an empty task that unlocks a tag once all its dependencies are fulfilled. */ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg); /** Create and submit an empty task with the given callback */ void starpu_create_callback_task(void (*callback)(void *), void *callback_arg); /** Set the function to call when the watchdog detects that StarPU has not finished any task for STARPU_WATCHDOG_TIMEOUT seconds */ void starpu_task_watchdog_set_hook(void (*hook)(void *), void *hook_arg); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_H__ */ starpu-1.3.9+dfsg/include/starpu_task_bundle.h000066400000000000000000000065001413463044200214500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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_TASK_BUNDLE_H__ #define __STARPU_TASK_BUNDLE_H__ #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Task_Bundles Task Bundles @{ */ struct starpu_task; struct starpu_perfmodel_arch; /** 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. */ typedef struct _starpu_task_bundle *starpu_task_bundle_t; /** Factory function creating and initializing \p bundle, when the call returns, memory needed is allocated and \p bundle is ready to use. */ void starpu_task_bundle_create(starpu_task_bundle_t *bundle); /** 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. */ int starpu_task_bundle_insert(starpu_task_bundle_t bundle, struct starpu_task *task); /** 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. */ int starpu_task_bundle_remove(starpu_task_bundle_t bundle, struct starpu_task *task); /** 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. */ void starpu_task_bundle_close(starpu_task_bundle_t bundle); /** Return the expected duration of \p bundle in micro-seconds. */ double starpu_task_bundle_expected_length(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch *arch, unsigned nimpl); /** Return the time (in micro-seconds) expected to transfer all data used within \p bundle. */ double starpu_task_bundle_expected_data_transfer_time(starpu_task_bundle_t bundle, unsigned memory_node); /** Return the expected energy consumption of \p bundle in J. */ double starpu_task_bundle_expected_energy(starpu_task_bundle_t bundle, struct starpu_perfmodel_arch *arch, unsigned nimpl); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_BUNDLE_H__ */ starpu-1.3.9+dfsg/include/starpu_task_dep.h000066400000000000000000000224511413463044200207520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_DEP_H__ #define __STARPU_TASK_DEP_H__ #include #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Explicit_Dependencies 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. */ void starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); /** Declare task dependencies between a \p task and an series of \p ndeps tasks, similarly to starpu_task_declare_deps_array(), but the tasks are passed after \p ndeps, which indicates how many tasks \p task shall be made to depend on. If \p ndeps is 0, no dependency is added. */ void starpu_task_declare_deps(struct starpu_task *task, unsigned ndeps, ...); /** Declare task end dependencies between a \p task and an array of tasks of length \p ndeps. \p task will appear as terminated not only when \p task is termination, but also when the tasks of \p task_array have terminated. This function must be called prior to the termination 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 terminated 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_end_deps_array() several times on the same task, in this case, the dependencies are added. It is currently not implemented to have redundancy in the task dependencies. */ void starpu_task_declare_end_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); /** Declare task end dependencies between a \p task and an series of \p ndeps tasks, similarly to starpu_task_declare_end_deps_array(), but the tasks are passed after \p ndeps, which indicates how many tasks \p task 's termination shall be made to depend on. If \p ndeps is 0, no dependency is added. */ void starpu_task_declare_end_deps(struct starpu_task *task, unsigned ndeps, ...); /** Fill \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. */ int starpu_task_get_task_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); /** Behave 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. */ int starpu_task_get_task_scheduled_succs(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]); /** Add \p nb_deps end dependencies to the task \p t. This means the task will not terminate until the required number of calls to the function starpu_task_end_dep_release() has been made. */ void starpu_task_end_dep_add(struct starpu_task *t, int nb_deps); /** Unlock 1 end dependency to the task \p t. This function must be called after starpu_task_end_dep_add(). */ void starpu_task_end_dep_release(struct starpu_task *t); /** Define 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. */ typedef uint64_t starpu_tag_t; /** 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 */ void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...); /** Similar to starpu_tag_declare_deps(), except that its does not take a variable number of arguments but an \p 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 */ void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array); /** Block 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). */ int starpu_tag_wait(starpu_tag_t id); /** Similar to starpu_tag_wait() except that it blocks until all the \p ntags tags contained in the array \p id are terminated. */ int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id); /** 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. */ void starpu_tag_restart(starpu_tag_t id); /** Release 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. */ void starpu_tag_remove(starpu_tag_t id); /** Explicitly unlock 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(). */ void starpu_tag_notify_from_apps(starpu_tag_t id); /** Atomically call starpu_tag_notify_from_apps() and starpu_tag_restart() on tag \p id. This is useful with cyclic graphs, when we want to safely trigger its startup. */ void starpu_tag_notify_restart_from_apps(starpu_tag_t id); struct starpu_task *starpu_tag_get_task(starpu_tag_t id); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_DEP_H__ */ starpu-1.3.9+dfsg/include/starpu_task_list.h000066400000000000000000000066571413463044200211670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Task_Lists Task Lists @{ */ /* NOTE: this needs to have at least the same size as lists in src/common/list.h */ #ifdef BUILDING_STARPU #define STARPU_TASK_LIST_INLINE extern inline #else /** Store a double-chained list of tasks */ struct starpu_task_list { struct starpu_task *head; /**< head of the list */ struct starpu_task *tail; /**< tail of the list */ }; #define STARPU_TASK_LIST_INLINE extern #endif /** Initialize a list structure */ STARPU_TASK_LIST_INLINE void starpu_task_list_init(struct starpu_task_list *list); /** Push \p task at the front of \p list */ STARPU_TASK_LIST_INLINE void starpu_task_list_push_front(struct starpu_task_list *list, struct starpu_task *task); /** Push \p task at the back of \p list */ STARPU_TASK_LIST_INLINE void starpu_task_list_push_back(struct starpu_task_list *list, struct starpu_task *task); /** Get the front of \p list (without removing it) */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_front(const struct starpu_task_list *list); /** Get the back of \p list (without removing it) */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_back(const struct starpu_task_list *list); /** Test if \p list is empty */ STARPU_TASK_LIST_INLINE int starpu_task_list_empty(const struct starpu_task_list *list); /** Remove \p task from \p list */ STARPU_TASK_LIST_INLINE void starpu_task_list_erase(struct starpu_task_list *list, struct starpu_task *task); /** Remove the element at the front of \p list */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_pop_front(struct starpu_task_list *list); /** Remove the element at the back of \p list */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_pop_back(struct starpu_task_list *list); /** Get the first task of \p list. */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_begin(const struct starpu_task_list *list); /** Get the end of \p list. */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_end(const struct starpu_task_list *list STARPU_ATTRIBUTE_UNUSED); /** Get the next task of \p list. This is not erase-safe. */ STARPU_TASK_LIST_INLINE struct starpu_task *starpu_task_list_next(const struct starpu_task *task); /** Test whether the given task \p look is contained in the \p list. */ STARPU_TASK_LIST_INLINE int starpu_task_list_ismember(const struct starpu_task_list *list, const struct starpu_task *look); STARPU_TASK_LIST_INLINE void starpu_task_list_move(struct starpu_task_list *ldst, struct starpu_task_list *lsrc); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_LIST_H__ */ starpu-1.3.9+dfsg/include/starpu_task_util.h000066400000000000000000000432071413463044200211610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Insert_Task Task Insert Utility @{ */ /* 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 and mpi/src/starpu_mpi_task_insert_fortran.c */ #define STARPU_MODE_SHIFT 17 /** Used when calling starpu_task_insert(), must be followed by a pointer to a constant value and the size of the constant */ #define STARPU_VALUE (1<MUST
explicitly cast into double, otherwise parameter passing will not work. */ #define STARPU_FLOPS (12<
  • ::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, ::STARPU_CL_ARGS_NFREE, ::STARPU_TASK_DEPS_ARRAY, ::STARPU_TASK_COLOR, ::STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, ::STARPU_TASK_SYNCHRONOUS, ::STARPU_TASK_END_DEP 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. */ int starpu_task_insert(struct starpu_codelet *cl, ...); /** Similar to starpu_task_insert(). Kept to avoid breaking old codes. */ int starpu_insert_task(struct starpu_codelet *cl, ...); /** Assuming that there are already \p current_buffer data handles passed to the task, and if *allocated_buffers is not 0, the task->dyn_handles array has size \p *allocated_buffers, this function makes room for \p room other data handles, allocating or reallocating task->dyn_handles as necessary and updating \p *allocated_buffers accordingly. One can thus start with *allocated_buffers equal to 0 and current_buffer equal to 0, then make room by calling this function, then store handles with STARPU_TASK_SET_HANDLE(), make room again with this function, store yet more handles, etc. */ void starpu_task_insert_data_make_room(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int current_buffer, int room); /** Store data handle \p handle into task \p task with mode \p arg_type, updating \p *allocated_buffers and \p *current_buffer accordingly. */ void starpu_task_insert_data_process_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int arg_type, starpu_data_handle_t handle); /** Store \p nb_handles data handles \p handles into task \p task, updating \p *allocated_buffers and \p *current_buffer accordingly. */ void starpu_task_insert_data_process_array_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int nb_handles, starpu_data_handle_t *handles); /** Store \p nb_descrs data handles described by \p descrs into task \p task, updating \p *allocated_buffers and \p *current_buffer accordingly. */ void starpu_task_insert_data_process_mode_array_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int nb_descrs, struct starpu_data_descr *descrs); /** 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(). Instead of calling starpu_codelet_pack_args(), one can also call starpu_codelet_pack_arg_init(), then starpu_codelet_pack_arg() for each data, then starpu_codelet_pack_arg_fini(). */ void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...); struct starpu_codelet_pack_arg_data { char *arg_buffer; size_t arg_buffer_size; size_t current_offset; int nargs; }; /** Initialize struct starpu_codelet_pack_arg before calling starpu_codelet_pack_arg() and starpu_codelet_pack_arg_fini(). This will simply initialize the content of the structure. */ void starpu_codelet_pack_arg_init(struct starpu_codelet_pack_arg_data *state); /** Pack one argument into struct starpu_codelet_pack_arg \p state. That structure has to be initialized before with starpu_codelet_pack_arg_init(), and after all starpu_codelet_pack_arg() calls performed, starpu_codelet_pack_arg_fini() has to be used to get the \p cl_arg and \p cl_arg_size to be put in the task. */ void starpu_codelet_pack_arg(struct starpu_codelet_pack_arg_data *state, const void *ptr, size_t ptr_size); /** Finish packing data, after calling starpu_codelet_pack_arg_init() once and starpu_codelet_pack_arg() several times. */ void starpu_codelet_pack_arg_fini(struct starpu_codelet_pack_arg_data *state, void **cl_arg, size_t *cl_arg_size); /** 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. */ void starpu_codelet_unpack_args(void *cl_arg, ...); /** Similar to starpu_codelet_unpack_args(), but if any parameter is 0, copy the part of \p cl_arg that has not been read in \p buffer which can then be used in a later call to one of the unpack functions. */ void starpu_codelet_unpack_args_and_copyleft(void *cl_arg, void *buffer, size_t buffer_size, ...); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_TASK_UTIL_H__ */ starpu-1.3.9+dfsg/include/starpu_thread.h000066400000000000000000000417461413463044200204370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ // The documentation for this file is in doc/doxygen/chapters/api/threads.doxy #ifndef __STARPU_THREAD_H__ #define __STARPU_THREAD_H__ #include #include #ifdef STARPU_SIMGRID #include #ifdef STARPU_HAVE_SIMGRID_MUTEX_H #include #include #elif defined(STARPU_HAVE_XBT_SYNCHRO_H) #include #else #include #endif #ifdef STARPU_HAVE_SIMGRID_ACTOR_H #include #endif #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_MUTEX_H #include #endif #ifdef STARPU_HAVE_SIMGRID_COND_H #include #endif #ifdef STARPU_HAVE_SIMGRID_BARRIER_H #include #endif #ifdef STARPU_HAVE_SIMGRID_HOST_H #include #endif #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #elif defined(STARPU_HAVE_MSG_MSG_H) #include #endif #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) #include #include #endif #include #ifdef __cplusplus extern "C" { #endif /* * Encapsulation of the pthread_create function. */ #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_SIMGRID_ACTOR_H typedef sg_actor_t starpu_pthread_t; #else typedef msg_process_t starpu_pthread_t; #endif typedef int starpu_pthread_attr_t; #ifdef STARPU_HAVE_SIMGRID_ACTOR_H typedef sg_host_t starpu_sg_host_t; #else typedef msg_host_t starpu_sg_host_t; #endif int starpu_pthread_equal(starpu_pthread_t t1, starpu_pthread_t t2); starpu_pthread_t starpu_pthread_self(void); int starpu_pthread_create_on(const char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg, starpu_sg_host_t host); int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); starpu_pthread_t _starpu_simgrid_actor_create(const char *name, xbt_main_func_t code, starpu_sg_host_t host, int argc, char *argv[]); 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_equal pthread_equal #define starpu_pthread_self pthread_self #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 #ifdef STARPU_HAVE_SIMGRID_MUTEX_H typedef sg_mutex_t starpu_pthread_mutex_t; #else typedef xbt_mutex_t starpu_pthread_mutex_t; #endif 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 #ifdef STARPU_HAVE_SIMGRID_COND_H typedef sg_cond_t starpu_pthread_cond_t; #else typedef xbt_cond_t starpu_pthread_cond_t; #endif 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 #ifdef STARPU_HAVE_SIMGRID_MUTEX_H typedef sg_mutex_t starpu_pthread_rwlock_t; #else typedef xbt_mutex_t starpu_pthread_rwlock_t; #endif 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_HAVE_SIMGRID_BARRIER_H) || defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) || defined(xbt_barrier_init)) #ifdef STARPU_HAVE_SIMGRID_BARRIER_H typedef sg_bar_t starpu_pthread_barrier_t; #else typedef xbt_bar_t starpu_pthread_barrier_t; #endif typedef int starpu_pthread_barrierattr_t; #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1 #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 */ /* * Simgrid-specific register/wait synchronization * * Producers create a "queue" object, and when they have produced something, * they call either queue_signal or queue_broadcast in order to wake either one * or all consumers waiting on the queue. * * starpu_pthread_queue_init(&global_queue1->queue); * while (1) { * element = compute(); * push(element, global_queue1); * starpu_pthread_queue_signal(global_queue1); * } * starpu_pthread_queue_destroy(&global_queue1->queue); * * Consumers create a "wait" object, then queue_register on as many queues they * want. In their consumption loop, they wait_reset, then test for availibility * on all producers, and if none was available, call wait_wait to actually wait * for producers. On termination, consumers have to queue_unregister before * destroying the "wait" object: * * starpu_pthread_wait_t wait; * * starpu_pthread_wait_init(&wait); * starpu_pthread_queue_register(&wait, &global_queue1->queue); * starpu_pthread_queue_register(&wait, &global_queue2->queue); * * while (1) { * int sleep = 1; * starpu_pthread_wait_reset(&wait); * if (global_queue1->navailable) * { * work(global_queue1); * sleep = 0; * } * if (global_queue2->navailable) * { * work(global_queue2); * sleep = 0; * } * if (sleep) * starpu_pthread_wait_wait(&wait); * } * starpu_pthread_queue_unregister(&wait, &global_queue1->queue); * starpu_pthread_queue_unregister(&wait, &global_queue2->queue); * starpu_pthread_wait_destroy(&wait); */ #ifdef STARPU_SIMGRID typedef struct { starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; unsigned block; } starpu_pthread_wait_t; typedef struct { starpu_pthread_mutex_t mutex; starpu_pthread_wait_t **queue; unsigned allocqueue; unsigned nqueue; } starpu_pthread_queue_t; int starpu_pthread_queue_init(starpu_pthread_queue_t *q); int starpu_pthread_queue_signal(starpu_pthread_queue_t *q); int starpu_pthread_queue_broadcast(starpu_pthread_queue_t *q); int starpu_pthread_queue_destroy(starpu_pthread_queue_t *q); int starpu_pthread_wait_init(starpu_pthread_wait_t *w); int starpu_pthread_queue_register(starpu_pthread_wait_t *w, starpu_pthread_queue_t *q); int starpu_pthread_queue_unregister(starpu_pthread_wait_t *w, starpu_pthread_queue_t *q); int starpu_pthread_wait_reset(starpu_pthread_wait_t *w); int starpu_pthread_wait_wait(starpu_pthread_wait_t *w); int starpu_pthread_wait_timedwait(starpu_pthread_wait_t *w, const struct timespec *abstime); int starpu_pthread_wait_destroy(starpu_pthread_wait_t *w); #endif /* * Encapsulation of the semaphore functions. */ #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H typedef sg_sem_t starpu_sem_t; #else typedef msg_sem_t starpu_sem_t; #endif int starpu_sem_destroy(starpu_sem_t *); int starpu_sem_getvalue(starpu_sem_t *, int *); int starpu_sem_init(starpu_sem_t *, int, unsigned); int starpu_sem_post(starpu_sem_t *); int starpu_sem_trywait(starpu_sem_t *); int starpu_sem_wait(starpu_sem_t *); #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */ typedef sem_t starpu_sem_t; #define starpu_sem_destroy sem_destroy #define starpu_sem_getvalue sem_getvalue #define starpu_sem_init sem_init #define starpu_sem_post sem_post int starpu_sem_trywait(starpu_sem_t *); int starpu_sem_wait(starpu_sem_t *); #endif #ifdef __cplusplus } #endif #endif /* __STARPU_THREAD_H__ */ starpu-1.3.9+dfsg/include/starpu_thread_util.h000066400000000000000000000427061413463044200214710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ // The documentation for this file is in doc/doxygen/chapters/api/threads.doxy #ifndef __STARPU_THREAD_UTIL_H__ #define __STARPU_THREAD_UTIL_H__ #include #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) #define STARPU_PTHREAD_JOIN(thread, retval) do { \ int p_ret = starpu_pthread_join((thread), (retval)); \ if (STARPU_UNLIKELY(p_ret != 0)) { \ fprintf(stderr, \ "%s:%d starpu_pthread_join: %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_sched: %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_sched: %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_sched: %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) /* pthread_cond_timedwait not yet available on windows, but we don't run simgrid there anyway */ #ifdef STARPU_SIMGRID #define STARPU_PTHREAD_COND_TIMEDWAIT(cond, mutex, abstime) \ _starpu_pthread_cond_timedwait(cond, mutex, abstime, __FILE__, __LINE__) static STARPU_INLINE int _starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime, char *file, int line) { int p_ret = starpu_pthread_cond_timedwait(cond, mutex, abstime); if (STARPU_UNLIKELY(p_ret != 0 && p_ret != ETIMEDOUT)) { fprintf(stderr, "%s:%d starpu_pthread_cond_timedwait: %s\n", file, line, strerror(p_ret)); STARPU_ABORT(); } return p_ret; } #endif /* * 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.3.9+dfsg/include/starpu_tree.h000066400000000000000000000031231413463044200201120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_Tree Tree @brief This section describes the tree facilities provided by StarPU. @{ */ 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.3.9+dfsg/include/starpu_util.h000066400000000000000000000531011413463044200201310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include #ifdef __GLIBC__ #include #endif #ifdef STARPU_SIMGRID_MC #include #endif #ifdef __cplusplus extern "C" { #endif /** @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. @{ */ /** Return true (non-zero) if GCC version \p maj.\p min or later is being used (macro taken from glibc.) */ #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 /** When building with a GNU C Compiler, allow programmers to mark an expression as unlikely. */ #ifdef __GNUC__ # define STARPU_UNLIKELY(expr) (__builtin_expect(!!(expr),0)) #else # define STARPU_UNLIKELY(expr) (expr) #endif /** When building with a GNU C Compiler, allow programmers to mark an expression as likely. */ #ifdef __GNUC__ # define STARPU_LIKELY(expr) (__builtin_expect(!!(expr),1)) #else # define STARPU_LIKELY(expr) (expr) #endif /** When building with a GNU C Compiler, defined to __attribute__((unused)) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_UNUSED __attribute__((unused)) #else # define STARPU_ATTRIBUTE_UNUSED #endif /** When building with a GNU C Compiler, defined to __attribute__((noreturn)) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_NORETURN __attribute__((noreturn)) #else # define STARPU_ATTRIBUTE_NORETURN #endif /** When building with a GNU C Compiler, defined to __attribute__((visibility ("internal"))) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_INTERNAL __attribute__ ((visibility ("internal"))) #else # define STARPU_ATTRIBUTE_INTERNAL #endif /** When building with a GNU C Compiler, defined to __attribute__((malloc)) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_MALLOC __attribute__((malloc)) #else # define STARPU_ATTRIBUTE_MALLOC #endif /** When building with a GNU C Compiler, defined to __attribute__((warn_unused_result)) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #else # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT #endif /** When building with a GNU C Compiler, defined to __attribute__((pure)) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_PURE __attribute__((pure)) #else # define STARPU_ATTRIBUTE_PURE #endif /** When building with a GNU C Compiler, defined to__attribute__((aligned(size))) */ #ifdef __GNUC__ # define STARPU_ATTRIBUTE_ALIGNED(size) __attribute__((aligned(size))) #else # define STARPU_ATTRIBUTE_ALIGNED(size) #endif #ifdef __GNUC__ # define STARPU_ATTRIBUTE_FORMAT(type, string, first) __attribute__((format(type, string, first))) #else # 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_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_SIMGRID_MC #define STARPU_SIMGRID_ASSERT(x) MC_assert(!!(x)) #else #define STARPU_SIMGRID_ASSERT(x) #endif /** Unless StarPU has been configured with the option \ref enable-fast "--enable-fast", this macro will abort if the expression \p x is false. */ #ifdef STARPU_NO_ASSERT #define STARPU_ASSERT(x) do { if (0) { (void) (x); } } while(0) #else # if defined(__CUDACC__) || defined(STARPU_HAVE_WINDOWS) # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); STARPU_SIMGRID_ASSERT(x); *(int*)NULL = 0; } } while(0) # else # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); STARPU_SIMGRID_ASSERT(x); assert(x); } } while (0) # endif #endif #ifdef STARPU_NO_ASSERT #define STARPU_ASSERT_ACCESSIBLE(x) do { if (0) { (void) (x); } } while(0) #else #define STARPU_ASSERT_ACCESSIBLE(ptr) do { volatile char __c STARPU_ATTRIBUTE_UNUSED = *(char*) (ptr); } while(0) #endif /** Unless StarPU has been configured with the option \ref enable-fast "--enable-fast", this macro will abort if the expression \p x is false. The string \p msg will be displayed. */ #ifdef STARPU_NO_ASSERT #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_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__); STARPU_SIMGRID_ASSERT(x); *(int*)NULL = 0; }} while(0) # else # 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__); STARPU_SIMGRID_ASSERT(x); assert(x); } } while(0) # endif #endif #ifdef __APPLE_CC__ # ifdef __clang_analyzer__ # define _starpu_abort() exit(42) # else # define _starpu_abort() *(volatile int*)NULL = 0 # endif #else # define _starpu_abort() abort() #endif /** Abort the program. */ #define STARPU_ABORT() do { \ STARPU_DUMP_BACKTRACE(); \ fprintf(stderr, "[starpu][abort][%s()@%s:%d]\n", __starpu_func__, __FILE__, __LINE__); \ _starpu_abort(); \ } while(0) /** Print the string '[starpu][abort][name of the calling function:name of the file:line in the file]' followed by the given string \p msg and abort the program */ #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(_MSC_VER) #undef STARPU_HAVE_STRERROR_R #endif #if defined(STARPU_HAVE_STRERROR_R) #if (! defined(__GLIBC__) || !__GLIBC__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && (! defined(_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-1); \ _user_buf[_user_buflen-1] = '\0'; \ } \ } \ } \ while (0) #endif /* strerror_r ABI version */ #endif /* STARPU_HAVE_STRERROR_R */ /** Abort the program (after displaying \p message) if \p err has a value which is not 0. */ #if defined(STARPU_HAVE_STRERROR_R) # 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(); }} #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(); }} #endif /** Abort the program (after displaying \p message) if \p err is different from \p value. */ #if defined(STARPU_HAVE_STRERROR_R) # 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_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 /* Note: do not use _starpu_cmpxchg / _starpu_xchg / _starpu_cmpxchgl / * _starpu_xchgl / _starpu_cmpxchg64 / _starpu_xchg64, which only * assembly-hand-written fallbacks used when building with an old gcc. * Rather use STARPU_VAL_COMPARE_AND_SWAP and STARPU_VAL_EXCHANGE available on * all platforms with a recent-enough gcc */ #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; } #define STARPU_HAVE_CMPXCHG 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 static __starpu_inline uint32_t _starpu_cmpxchg32(uint32_t *ptr, uint32_t old, uint32_t next) { __asm__ __volatile__("lock cmpxchgl %2,%1": "+a" (old), "+m" (*ptr) : "q" (next) : "memory"); return old; } #define STARPU_HAVE_CMPXCHG32 static __starpu_inline uint32_t _starpu_xchg32(uint32_t *ptr, uint32_t next) { /* Note: xchg is always locked already */ __asm__ __volatile__("xchgl %1,%0": "+m" (*ptr), "+q" (next) : : "memory"); return next; } #define STARPU_HAVE_XCHG32 #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; } #define STARPU_HAVE_CMPXCHGL 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; } #define STARPU_HAVE_CMPXCHGL 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 #if defined(__i386__) static __starpu_inline uint64_t _starpu_cmpxchg64(uint64_t *ptr, uint64_t old, uint64_t next) { uint32_t next_hi = next >> 32; uint32_t next_lo = next & 0xfffffffful; __asm__ __volatile__("lock cmpxchg8b %1": "+A" (old), "+m" (*ptr) : "c" (next_hi), "b" (next_lo) : "memory"); return old; } #define STARPU_HAVE_CMPXCHG64 #endif #if defined(__x86_64__) static __starpu_inline uint64_t _starpu_cmpxchg64(uint64_t *ptr, uint64_t old, uint64_t next) { __asm__ __volatile__("lock cmpxchgq %2,%1": "+a" (old), "+m" (*ptr) : "q" (next) : "memory"); return old; } #define STARPU_HAVE_CMPXCHG64 static __starpu_inline uint64_t _starpu_xchg64(uint64_t *ptr, uint64_t next) { /* Note: xchg is always locked already */ __asm__ __volatile__("xchgq %1,%0": "+m" (*ptr), "+q" (next) : : "memory"); return next; } #define STARPU_HAVE_XCHG64 #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; \ } #define STARPU_ATOMIC_SOMETHING64(name,expr) \ static __starpu_inline uint64_t starpu_atomic_##name##64(uint64_t *ptr, uint64_t value) \ { \ uint64_t old, next; \ while (1) \ { \ old = *ptr; \ next = expr; \ if (_starpu_cmpxchg64(ptr, old, next) == old) \ break; \ }; \ return expr; \ } /* Returns the new value */ #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)) #define STARPU_ATOMIC_ADD64(ptr, value) (__sync_fetch_and_add ((ptr), (value)) + (value)) #else #if defined(STARPU_HAVE_CMPXCHG) STARPU_ATOMIC_SOMETHING(add, old + value) #define STARPU_ATOMIC_ADD(ptr, value) starpu_atomic_add(ptr, value) #endif #if defined(STARPU_HAVE_CMPXCHGL) STARPU_ATOMIC_SOMETHINGL(add, old + value) #define STARPU_ATOMIC_ADDL(ptr, value) starpu_atomic_addl(ptr, value) #endif #if defined(STARPU_HAVE_CMPXCHG64) STARPU_ATOMIC_SOMETHING64(add, old + value) #define STARPU_ATOMIC_ADD64(ptr, value) starpu_atomic_add64(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))) #define STARPU_ATOMIC_OR64(ptr, value) (__sync_fetch_and_or ((ptr), (value))) #else #if defined(STARPU_HAVE_CMPXCHG) STARPU_ATOMIC_SOMETHING(or, old | value) #define STARPU_ATOMIC_OR(ptr, value) starpu_atomic_or(ptr, value) #endif #if defined(STARPU_HAVE_CMPXCHGL) STARPU_ATOMIC_SOMETHINGL(or, old | value) #define STARPU_ATOMIC_ORL(ptr, value) starpu_atomic_orl(ptr, value) #endif #if defined(STARPU_HAVE_CMPXCHG64) STARPU_ATOMIC_SOMETHING64(or, old | value) #define STARPU_ATOMIC_OR64(ptr, value) starpu_atomic_or64(ptr, value) #endif #endif /* Try to replace `old' with `value' at `ptr'. Returns true iff the swap was successful. */ #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))) #define STARPU_BOOL_COMPARE_AND_SWAP32(ptr, old, value) STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) #define STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) #else #ifdef STARPU_HAVE_CMPXCHG #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (_starpu_cmpxchg((ptr), (old), (value)) == (old)) #endif #ifdef STARPU_HAVE_CMPXCHG32 #define STARPU_BOOL_COMPARE_AND_SWAP32(ptr, old, value) (_starpu_cmpxchg32((ptr), (old), (value)) == (old)) #endif #ifdef STARPU_HAVE_CMPXCHG64 #define STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) (_starpu_cmpxchg64((ptr), (old), (value)) == (old)) #endif #endif #if UINTPTR_MAX == UINT64_MAX #define STARPU_BOOL_COMPARE_AND_SWAP_PTR(ptr, old, value) STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) #else #define STARPU_BOOL_COMPARE_AND_SWAP_PTR(ptr, old, value) STARPU_BOOL_COMPARE_AND_SWAP32(ptr, old, value) #endif /* Try to replace `old' with `value' at `ptr'. Returns the value actually seen at `ptr'. */ #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))) #define STARPU_VAL_COMPARE_AND_SWAP32(ptr, old, value) STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) #define STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) #else #ifdef STARPU_HAVE_CMPXCHG #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) (_starpu_cmpxchg((ptr), (old), (value))) #endif #ifdef STARPU_HAVE_CMPXCHG32 #define STARPU_VAL_COMPARE_AND_SWAP32(ptr, old, value) (_starpu_cmpxchg32((ptr), (old), (value))) #endif #ifdef STARPU_HAVE_CMPXCHG64 #define STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) (_starpu_cmpxchg64((ptr), (old), (value))) #endif #endif #if UINTPTR_MAX == UINT64_MAX #define STARPU_VAL_COMPARE_AND_SWAP_PTR(ptr, old, value) STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) #else #define STARPU_VAL_COMPARE_AND_SWAP_PTR(ptr, old, value) STARPU_VAL_COMPARE_AND_SWAP32(ptr, old, value) #endif #ifdef STARPU_HAVE_ATOMIC_EXCHANGE_N #define STARPU_VAL_EXCHANGE(ptr, value) (__atomic_exchange_n((ptr), (value), __ATOMIC_SEQ_CST)) #define STARPU_VAL_EXCHANGEL(ptr, value) STARPU_VAL_EXCHANGE((ptr) (value)) #define STARPU_VAL_EXCHANGE32(ptr, value) STARPU_VAL_EXCHANGE((ptr) (value)) #define STARPU_VAL_EXCHANGE64(ptr, value) STARPU_VAL_EXCHANGE((ptr) (value)) #else #ifdef STARPU_HAVE_XCHG #define STARPU_VAL_EXCHANGE(ptr, value) (_starpu_xchg((ptr), (value))) #endif #ifdef STARPU_HAVE_XCHGL #define STARPU_VAL_EXCHANGEL(ptr, value) (_starpu_xchgl((ptr), (value))) #endif #ifdef STARPU_HAVE_XCHG32 #define STARPU_VAL_EXCHANGE32(ptr, value) (_starpu_xchg32((ptr), (value))) #endif #ifdef STARPU_HAVE_XCHG64 #define STARPU_VAL_EXCHANGE64(ptr, value) (_starpu_xchg64((ptr), (value))) #endif #endif /* Returns the previous value */ #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 /** This macro can be used to do a synchronization. */ #if defined(__x86_64__) #define STARPU_RMB() __asm__ __volatile__("lfence" ::: "memory") #elif defined(__aarch64__) #define STARPU_RMB() __asm__ __volatile__("dsb ld" ::: "memory") #else #define STARPU_RMB() STARPU_SYNCHRONIZE() #endif /** This macro can be used to do a synchronization. */ #if defined(__x86_64__) #define STARPU_WMB() __asm__ __volatile__("sfence" ::: "memory") #elif defined(__aarch64__) #define STARPU_WMB() __asm__ __volatile__("dsb st" ::: "memory") #else #define STARPU_WMB() STARPU_SYNCHRONIZE() #endif #if defined(__i386__) || defined(__x86_64__) #define STARPU_CACHELINE_SIZE 64 #elif defined(__ppc__) || defined(__ppc64__) || defined(__ia64__) #define STARPU_CACHELINE_SIZE 128 #elif defined(__s390__) || defined(__s390x__) #define STARPU_CACHELINE_SIZE 256 #else /* Conservative default */ #define STARPU_CACHELINE_SIZE 1024 #endif #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.3.9+dfsg/include/starpu_worker.h000066400000000000000000000414631413463044200204750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include #ifdef STARPU_HAVE_HWLOC #include #endif #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Workers_Properties Workers’ Properties @{ */ /** Memory node Type */ enum starpu_node_kind { STARPU_UNUSED=0, STARPU_CPU_RAM=1, STARPU_CUDA_RAM=2, STARPU_OPENCL_RAM=3, STARPU_DISK_RAM=4, STARPU_MIC_RAM=5, STARPU_MPI_MS_RAM=6 }; /** Worker Architecture Type The value 4 which was used by the driver SCC is no longer used as renumbering workers would make unusable old performance model files. */ enum starpu_worker_archtype { STARPU_CPU_WORKER=0, /**< CPU core */ STARPU_CUDA_WORKER=1, /**< NVIDIA CUDA device */ STARPU_OPENCL_WORKER=2, /**< OpenCL device */ STARPU_MIC_WORKER=3, /**< Intel MIC device */ STARPU_MPI_MS_WORKER=5, /**< MPI Slave device */ STARPU_ANY_WORKER=6 /**< any worker, used in the hypervisor */ }; /** Structure needed to iterate on the collection */ struct starpu_sched_ctx_iterator { /** The index of the current worker in the collection, needed when iterating on the collection. */ int cursor; void *value; void *possible_value; char visited[STARPU_NMAXWORKERS]; int possibly_parallel; }; /** Types of structures the worker collection can implement */ enum starpu_worker_collection_type { STARPU_WORKER_TREE, /**< The collection is a tree */ STARPU_WORKER_LIST /**< The collection is an array */ }; /** 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. */ struct starpu_worker_collection { /** The workerids managed by the collection */ int *workerids; void *collection_private; /** The number of workers in the collection */ unsigned nworkers; void *unblocked_workers; unsigned nunblocked_workers; void *masters; unsigned nmasters; char present[STARPU_NMAXWORKERS]; char is_unblocked[STARPU_NMAXWORKERS]; char is_master[STARPU_NMAXWORKERS]; /** The type of structure */ enum starpu_worker_collection_type type; /** Check if there is another element in collection */ unsigned (*has_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); /** Return the next element in the collection */ int (*get_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); /** Add a new element in the collection */ int (*add)(struct starpu_worker_collection *workers, int worker); /** Remove an element from the collection */ int (*remove)(struct starpu_worker_collection *workers, int worker); /** Initialize the collection */ void (*init)(struct starpu_worker_collection *workers); /** Deinitialize the colection */ void (*deinit)(struct starpu_worker_collection *workers); /** Initialize the cursor if there is one */ void (*init_iterator)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it); void (*init_iterator_for_parallel_tasks)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it, struct starpu_task *task); }; extern struct starpu_worker_collection starpu_worker_list; extern struct starpu_worker_collection starpu_worker_tree; /** Return the number of workers (i.e. processing units executing StarPU tasks). The return value should be at most \ref STARPU_NMAXWORKERS. */ unsigned starpu_worker_get_count(void); /** Return the number of CPUs controlled by StarPU. The return value should be at most \ref STARPU_MAXCPUS. */ unsigned starpu_cpu_worker_get_count(void); /** Return the number of CUDA devices controlled by StarPU. The return value should be at most \ref STARPU_MAXCUDADEVS. */ unsigned starpu_cuda_worker_get_count(void); /** Return the number of OpenCL devices controlled by StarPU. The return value should be at most \ref STARPU_MAXOPENCLDEVS. */ unsigned starpu_opencl_worker_get_count(void); /** Return the number of MIC workers controlled by StarPU. */ unsigned starpu_mic_worker_get_count(void); /** Return the number of MPI Master Slave workers controlled by StarPU. */ unsigned starpu_mpi_ms_worker_get_count(void); /** Return the number of MIC devices controlled by StarPU. The return value should be at most \ref STARPU_MAXMICDEVS. */ unsigned starpu_mic_device_get_count(void); /** Return the identifier of the current worker, i.e the one associated to the calling thread. The return value is either \c -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 \c 0 and starpu_worker_get_count() - \c 1. */ int starpu_worker_get_id(void); unsigned _starpu_worker_get_id_check(const char *f, int l); /** Similar to starpu_worker_get_id(), but abort when called from outside a worker (i.e. when starpu_worker_get_id() would return \c -1). */ 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); void starpu_sched_find_all_worker_combinations(void); /** Return the type of processing unit associated to the worker \p id. The worker identifier is a value returned by the function starpu_worker_get_id()). The return 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 return value for an invalid identifier is unspecified. */ enum starpu_worker_archtype starpu_worker_get_type(int id); /** Return the number of workers of \p type. A positive (or NULL) value is returned in case of success, -EINVAL indicates that \p type is not valid otherwise. */ int starpu_worker_get_count_by_type(enum starpu_worker_archtype type); /** Get the list of identifiers of workers of \p type. Fill the array \p workerids with the identifiers of the \p workers. The argument \p maxsize indicates the size of the array \p workerids. The return 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. */ unsigned starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, unsigned maxsize); /** Return the identifier of the \p num -th worker that has the specified \p type. If there is no such worker, -1 is returned. */ int starpu_worker_get_by_type(enum starpu_worker_archtype type, int num); /** Return the identifier of the worker that has the specified \p type and device id \p devid (which may not be the n-th, if some devices are skipped for instance). If there is no such worker, \c -1 is returned. */ int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid); /** Get the name of the worker \p id. StarPU associates a unique human readable string to each processing unit. This function copies at most the \p maxlen first bytes of the unique string associated to the worker \p id into the \p 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. */ void starpu_worker_get_name(int id, char *dst, size_t maxlen); /** Display on \p output the list (if any) of all the workers of the given \p type. */ void starpu_worker_display_names(FILE *output, enum starpu_worker_archtype type); /** Return the device id of the worker \p id. 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 \c 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. */ 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_blocked_in_parallel(int workerid); unsigned starpu_worker_is_slave_somewhere(int workerid); /** Return worker \p type as a string. */ char *starpu_worker_get_type_as_string(enum starpu_worker_archtype type); int starpu_bindid_get_workerids(int bindid, int **workerids); int starpu_worker_get_devids(enum starpu_worker_archtype type, int *devids, int num); int starpu_worker_get_stream_workerids(unsigned devid, int *workerids, enum starpu_worker_archtype type); unsigned starpu_worker_get_sched_ctx_id_stream(unsigned stream_workerid); #ifdef STARPU_HAVE_HWLOC /** If StarPU was compiled with \c hwloc support, return a duplicate of the \c hwloc cpuset associated with the worker \p workerid. The returned cpuset is obtained from a \c hwloc_bitmap_dup() function call. It must be freed by the caller using \c hwloc_bitmap_free(). */ hwloc_cpuset_t starpu_worker_get_hwloc_cpuset(int workerid); /** If StarPU was compiled with \c hwloc support, return the \c hwloc object corresponding to the worker \p workerid. */ hwloc_obj_t starpu_worker_get_hwloc_obj(int workerid); #endif int starpu_memory_node_get_devid(unsigned node); /** Return the memory node associated to the current worker */ unsigned starpu_worker_get_local_memory_node(void); /** Return the identifier of the memory node associated to the worker identified by \p workerid. */ unsigned starpu_worker_get_memory_node(unsigned workerid); /** Return the number of memory nodes */ unsigned starpu_memory_nodes_get_count(void); /** Return in \p name the name of a memory node (NUMA 0, CUDA 0, etc.) \p size is the size of the \p name array. */ int starpu_memory_node_get_name(unsigned node, char *name, size_t size); /** Return the number of NUMA nodes used by StarPU */ int starpu_memory_nodes_get_numa_count(void); /** Return the identifier of the memory node associated to the NUMA node identified by \p osid by the Operating System. */ int starpu_memory_nodes_numa_id_to_devid(int osid); /** Return the Operating System identifier of the memory node whose StarPU identifier is \p id. */ int starpu_memory_nodes_numa_devid_to_id(unsigned id); /** Return the type of \p 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. */ enum starpu_node_kind starpu_node_get_kind(unsigned node); /** @name Scheduling operations @{ */ /** Return \c !0 if current worker has a scheduling operation in progress, and \c 0 otherwise. */ int starpu_worker_sched_op_pending(void); /** Allow other threads and workers to temporarily observe the current worker state, even though it is performing a scheduling operation. Must be called by a worker before performing a potentially blocking call such as acquiring a mutex other than its own sched_mutex. This function increases \c state_relax_refcnt from the current worker. No more than UINT_MAX-1 nested starpu_worker_relax_on() calls should performed on the same worker. This function is automatically called by starpu_worker_lock() to relax the caller worker state while attempting to lock the target worker. */ void starpu_worker_relax_on(void); /** Must be called after a potentially blocking call is complete, to restore the relax state in place before the corresponding starpu_worker_relax_on(). Decreases \c state_relax_refcnt. Calls to starpu_worker_relax_on() and starpu_worker_relax_off() must be properly paired. This function is automatically called by starpu_worker_unlock() after the target worker has been unlocked. */ void starpu_worker_relax_off(void); /** Return \c !0 if the current worker \c state_relax_refcnt!=0 and \c 0 otherwise. */ int starpu_worker_get_relax_state(void); /** Acquire the sched mutex of \p workerid. If the caller is a worker, distinct from \p workerid, the caller worker automatically enters a relax state while acquiring the target worker lock. */ void starpu_worker_lock(int workerid); /** Attempt to acquire the sched mutex of \p workerid. Returns \c 0 if successful, \c !0 if \p workerid sched mutex is held or the corresponding worker is not in a relax state. If the caller is a worker, distinct from \p workerid, the caller worker automatically enters relax state if successfully acquiring the target worker lock. */ int starpu_worker_trylock(int workerid); /** Release the previously acquired sched mutex of \p workerid. Restore the relax state of the caller worker if needed. */ void starpu_worker_unlock(int workerid); /** Acquire the current worker sched mutex. */ void starpu_worker_lock_self(void); /** Release the current worker sched mutex. */ void starpu_worker_unlock_self(void); #ifdef STARPU_WORKER_CALLBACKS /** If StarPU was compiled with blocking drivers support and worker callbacks support enabled, allow to specify an external resource manager callback to be notified about workers going to sleep. */ void starpu_worker_set_going_to_sleep_callback(void (*callback)(unsigned workerid)); /** If StarPU was compiled with blocking drivers support and worker callbacks support enabled, allow to specify an external resource manager callback to be notified about workers waking-up. */ void starpu_worker_set_waking_up_callback(void (*callback)(unsigned workerid)); #endif /** @} */ /** @} */ /** @defgroup API_Parallel_Tasks Parallel Tasks @{ */ /** Return the number of different combined workers. */ unsigned starpu_combined_worker_get_count(void); unsigned starpu_worker_is_combined_worker(int id); /** Return the identifier of the current combined worker. */ int starpu_combined_worker_get_id(void); /** 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. */ int starpu_combined_worker_get_size(void); /** Return the rank of the current thread within the combined worker. Can only be used in ::STARPU_SPMD parallel tasks, to know which part of the task to work on. */ int starpu_combined_worker_get_rank(void); /** Register a new combined worker and get its identifier */ int starpu_combined_worker_assign_workerid(int nworkers, int workerid_array[]); /** Get the description of a combined worker */ int starpu_combined_worker_get_description(int workerid, int *worker_size, int **combined_workerid); /** Variant of starpu_worker_can_execute_task() compatible with combined workers */ int starpu_combined_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl); /** Initialise the barrier for the parallel task, and dispatch the task between the different workers of the given combined worker. */ void starpu_parallel_task_barrier_init(struct starpu_task *task, int workerid); /** Initialise the barrier for the parallel task, to be pushed to \p worker_size workers (without having to explicit a given combined worker). */ void starpu_parallel_task_barrier_init_n(struct starpu_task *task, int worker_size); /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPU_WORKER_H__ */ starpu-1.3.9+dfsg/libstarpu.pc.in000066400000000000000000000023141413463044200167200ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.3.9+dfsg/m4/000077500000000000000000000000001413463044200143025ustar00rootroot00000000000000starpu-1.3.9+dfsg/m4/acinclude.m4000066400000000000000000000157321413463044200165030ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 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]) # 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]) # 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]) # 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]) # 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]) # Check whether the target supports __atomic_compare_exchange_n. AC_DEFUN([STARPU_CHECK_ATOMIC_COMPARE_EXCHANGE_N], [ AC_CACHE_CHECK([whether the target supports __atomic_compare_exchange_n], ac_cv_have_atomic_compare_exchange_n, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar, baz;], [baz = __atomic_compare_exchange_n(&foo, &bar, 1, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);])], [ac_cv_have_atomic_compare_exchange_n=yes], [ac_cv_have_atomic_compare_exchange_n=no])]) if test $ac_cv_have_atomic_compare_exchange_n = yes; then AC_DEFINE(STARPU_HAVE_ATOMIC_COMPARE_EXCHANGE_N, 1, [Define to 1 if the target supports __atomic_compare_exchange_n]) fi]) # Check whether the target supports __atomic_exchange_n. AC_DEFUN([STARPU_CHECK_ATOMIC_EXCHANGE_N], [ AC_CACHE_CHECK([whether the target supports __atomic_exchange_n], ac_cv_have_atomic_exchange_n, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __atomic_exchange_n(&foo, 1, __ATOMIC_SEQ_CST);])], [ac_cv_have_atomic_exchange_n=yes], [ac_cv_have_atomic_exchange_n=no])]) if test $ac_cv_have_atomic_exchange_n = yes; then AC_DEFINE(STARPU_HAVE_ATOMIC_EXCHANGE_N, 1, [Define to 1 if the target supports __atomic_exchange_n]) fi]) # Check whether the target supports __atomic_fetch_add. AC_DEFUN([STARPU_CHECK_ATOMIC_FETCH_ADD], [ AC_CACHE_CHECK([whether the target supports __atomic_fetch_add], ac_cv_have_atomic_fetch_add, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __atomic_fetch_add(&foo, 1, __ATOMIC_SEQ_CST);])], [ac_cv_have_atomic_fetch_add=yes], [ac_cv_have_atomic_fetch_add=no])]) if test $ac_cv_have_atomic_fetch_add = yes; then AC_DEFINE(STARPU_HAVE_ATOMIC_FETCH_ADD, 1, [Define to 1 if the target supports __atomic_fetch_add]) fi]) # Check whether the target supports __atomic_fetch_or. AC_DEFUN([STARPU_CHECK_ATOMIC_FETCH_OR], [ AC_CACHE_CHECK([whether the target supports __atomic_fetch_or], ac_cv_have_atomic_fetch_or, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __atomic_fetch_or(&foo, 1, __ATOMIC_SEQ_CST);])], [ac_cv_have_atomic_fetch_or=yes], [ac_cv_have_atomic_fetch_or=no])]) if test $ac_cv_have_atomic_fetch_or = yes; then AC_DEFINE(STARPU_HAVE_ATOMIC_FETCH_OR, 1, [Define to 1 if the target supports __atomic_fetch_or]) fi]) # Check whether the target supports __atomic_test_and_set. AC_DEFUN([STARPU_CHECK_ATOMIC_TEST_AND_SET], [ AC_CACHE_CHECK([whether the target supports __atomic_test_and_set], ac_cv_have_atomic_test_and_set, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __atomic_test_and_set(&foo, __ATOMIC_SEQ_CST);])], [ac_cv_have_atomic_test_and_set=yes], [ac_cv_have_atomic_test_and_set=no])]) if test $ac_cv_have_atomic_test_and_set = yes; then AC_DEFINE(STARPU_HAVE_ATOMIC_TEST_AND_SET, 1, [Define to 1 if the target supports __atomic_test_and_set]) fi]) # 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.3.9+dfsg/m4/ax_cxx_compile_stdcxx.m4000066400000000000000000000330001413463044200211370ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html # =========================================================================== # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and # CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) # or '14' (for the C++14 standard). # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The third argument, if specified 'mandatory' or if left unspecified, # indicates that baseline support for the specified C++ standard is # required and that the macro should error out if no mode with that # support is found. If specified 'optional', then configuration proceeds # regardless, after defining HAVE_CXX${VERSION} if and only if a # supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 4 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [], [$1], [14], [], [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], [$2], [noext], [], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [ax_cv_cxx_compile_cxx$1=yes], [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes fi m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++$1 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi]) m4_if([$2], [ext], [], [dnl if test x$ac_success = xno; then dnl HP's aCC needs +std=c++11 according to: dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf dnl Cray's crayCC needs "-h std=c++11" for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx$1_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) fi fi if test x$ac_success = xno; then HAVE_CXX$1=0 AC_MSG_NOTICE([No compiler with C++$1 support was found]) else HAVE_CXX$1=1 AC_DEFINE(HAVE_CXX$1,1, [define if the compiler supports basic C++$1 syntax]) fi AC_SUBST(HAVE_CXX$1) ]) dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 ) dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual void f() {} }; struct Derived : public Base { virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L ]]) dnl Tests for new features in C++14 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_seperators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L ]]) starpu-1.3.9+dfsg/m4/ax_dlb_callback_arg.m4000066400000000000000000000026231413463044200204450ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 whether DLB callbacks expect an user argument AC_DEFUN([AX_DLB_CALLBACK_ARG], [AC_MSG_CHECKING([whether DLB callbacks expect an user argument]) AC_CACHE_VAL(ac_cv_dlb_callback_arg,dnl [AC_TRY_COMPILE(dnl [#include dlb_handler_t dlb_handle; void _dlb_callback_disable_cpu(int cpuid, void *arg) { (void)cpuid; (void)arg; } void f(void) { (void)DLB_CallbackSet_sp(dlb_handle, dlb_callback_disable_cpu, (dlb_callback_t)_dlb_callback_disable_cpu, 0); } ],, ac_cv_dlb_callback_arg=yes, ac_cv_dlb_callback_arg=no) ])dnl AC_CACHE_VAL AC_MSG_RESULT([$ac_cv_dlb_callback_arg]) if test $ac_cv_dlb_callback_arg = yes; then AC_DEFINE(STARPURM_HAVE_DLB_CALLBACK_ARG,1,[Define to 1 if DLB callbacks expect an user argument]) fi ]) starpu-1.3.9+dfsg/m4/libs.m4000066400000000000000000000102511413463044200154740ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 # 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 C compiler support $1]) SAVED_CFLAGS="$CFLAGS" CFLAGS="$1" 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_CXXFLAG(flag) # ------------------------ # Check if the CFLAGS `flag' is supported by the compiler AC_DEFUN([IS_SUPPORTED_CXXFLAG], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([whether CXX compiler support $1]) SAVED_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$1" AC_LINK_IFELSE( AC_LANG_PROGRAM( [[]], [[AC_LANG_SOURCE([const char *hello = "Hello World";])]] ), [ m4_default_nblank([$2], [GLOBAL_AM_CFLAGS="$GLOBAL_AM_CXXFLAGS $1"]) AC_MSG_RESULT(yes) option_available=1 ], [ AC_MSG_RESULT(no) option_available=0 ] ) CXXFLAGS="$SAVED_CXXFLAGS" AC_LANG_POP([C++]) ]) # IS_SUPPORTED_FFLAG(flag) # ------------------------ # Check if the FFLAGS `flag' is supported by the compiler AC_DEFUN([IS_SUPPORTED_FFLAG], [ AC_LANG_PUSH([Fortran 77]) AC_MSG_CHECKING([whether Fortran 77 compiler support $1]) SAVED_FFLAGS="$FFLAGS" FFLAGS="$1" AC_LINK_IFELSE( AC_LANG_PROGRAM( [], [[AC_LANG_SOURCE([])]] ), [ m4_default_nblank([$2], [GLOBAL_AM_FFLAGS="$GLOBAL_AM_FFLAGS $1"]) AC_MSG_RESULT(yes) option_available=1 ], [ AC_MSG_RESULT(no) option_available=0 ] ) FFLAGS="$SAVED_FFLAGS" AC_LANG_POP([Fortran 77]) ]) # IS_SUPPORTED_FCFLAG(flag) # ------------------------ # Check if the FCLAGS `flag' is supported by the compiler AC_DEFUN([IS_SUPPORTED_FCFLAG], [ AC_LANG_PUSH([Fortran]) AC_MSG_CHECKING([whether Fortran compiler support $1]) SAVED_FCFLAGS="$FCFLAGS" FCFLAGS="$1" AC_LINK_IFELSE( AC_LANG_PROGRAM( [], [[AC_LANG_SOURCE([])]] ), [ m4_default_nblank([$2], [GLOBAL_AM_FCFLAGS="$GLOBAL_AM_FCFLAGS $1"]) AC_MSG_RESULT(yes) option_available=1 ], [ AC_MSG_RESULT(no) option_available=0 ] ) FCFLAGS="$SAVED_FCFLAGS" AC_LANG_POP([Fortran]) ]) starpu-1.3.9+dfsg/m4/libtool.m4000066400000000000000000011267711413463044200162270ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 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) 2014 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 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 this program. If not, see . ]) # serial 58 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.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK 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_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _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 m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that 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 set != "${COLLECT_NAMES+set}"; 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) 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 0 = "$lt_write_fail" && 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 yes = "$silent" && 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 that 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 # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _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 set != "${COLLECT_NAMES+set}"; 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) 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' 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 0 = "$_lt_result"; 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 cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cr 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 0 = "$_lt_result" && $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[[912]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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 set = "${lt_cv_aix_libpath+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 that will find a shell with a builtin # printf (that 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], [AS_HELP_STRING([--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 yes = "$GCC"; 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 where 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 no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode # options accordingly. 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 what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; 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* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. 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-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) 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-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) 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 yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. 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*|x86_64-*-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=cr} _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 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; 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 bitrig* | 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "[$]$2"; 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 yes = "[$]$2"; 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; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # 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 17 != "$i" # 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 yes = "$cross_compiling"; 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 -fvisibility=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 yes != "$enable_dlopen"; 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 ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) 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 no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && 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 yes = "$lt_cv_dlopen_self"; 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 no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 where 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 yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; 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 relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; 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_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _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 m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; 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` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac 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" elif test -n "$lt_multi_os_dir"; then 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 AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _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], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that 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 that 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 no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [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 # that 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. if ( 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* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 ;; os2*) 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 # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) 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 no != "$lt_cv_path_NM"; 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 -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) 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 one 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 yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; 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 if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # 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"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$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"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, # D for any global variable and I for any imported 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};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,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 $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && 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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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 yes = "$pipe_works"; 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_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _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_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; 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']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ia64 != "$host_cpu"; 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; 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']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ;; 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' case $cc_basename in 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' ;; esac ;; 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']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; 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' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _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' ;; tcc*) # Fabrice Bellard et al's Tiny 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)='-static' ;; 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 that 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/([^)]\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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 ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" 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' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; 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 yes = "$supports_anon_versioning"; 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 cannot *** 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 no = "$_LT_TAGVAR(ld_shlibs, $1)"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 _LT_TAGVAR(link_all_deplibs, $1)=no 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 ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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* | bitrig*) 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__`"; 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 _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' 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 shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes,yes = "$GCC,$enable_shared"; 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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); 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 yes != "$_lt_caught_CXX_error"; 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 yes = "$GXX"; 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 yes = "$GXX"; 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 yes = "$with_gnu_ld"; 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 ia64 = "$host_cpu"; 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive 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 if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$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 no = "$with_gnu_ld"; 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 yes = "$GXX"; then if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then if test no = "$with_gnu_ld"; 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 yes = "$supports_anon_versioning"; 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 ;; openbsd* | bitrig*) 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes != "$_lt_caught_CXX_error" 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 @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@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 x-L = "$p" || test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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)= ;; 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 no = "$F77"; 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 yes != "$_lt_disable_F77"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_F77" 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 no = "$FC"; 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 yes != "$_lt_disable_FC"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_FC" 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 set = "${GCJFLAGS+set}" || 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 10 -lt "$lt_ac_count" && 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], [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_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what 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.3.9+dfsg/m4/ltoptions.m4000066400000000000000000000342621413463044200166060ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 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 8 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_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _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_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _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=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.3.9+dfsg/m4/ltsugar.m4000066400000000000000000000104401413463044200162240ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 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.3.9+dfsg/m4/ltversion.m4000066400000000000000000000012731413463044200165740ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 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 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) starpu-1.3.9+dfsg/m4/lt~obsolete.m4000066400000000000000000000137741413463044200171320ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 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.3.9+dfsg/m4/pkg.m4000066400000000000000000000121451413463044200153300ustar00rootroot00000000000000# 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.3.9+dfsg/mic-configure000077500000000000000000000151031413463044200164370ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # 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:$MIC_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:$MIC_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 showfailed: @\$(MAKE) \$(MFLAGS) -C build_mic showfailed 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.3.pc" "${prefix}/mic/lib/pkgconfig/starpu-1.3-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 ] showfailed: @\$(MAKE) \$(MFLAGS) -C build_host showfailed @\$(MAKE) \$(MFLAGS) -C build_mic showfailed 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.3.pc" "${prefix}/mic/lib/pkgconfig/starpu-1.3-mic.pc" EOF fi starpu-1.3.9+dfsg/min-dgels/000077500000000000000000000000001413463044200156415ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/Makefile000066400000000000000000000020411413463044200172760ustar00rootroot00000000000000CC = gcc LD = /usr/bin/ld -m elf_x86_64 srcdir = . CLAPACK=base ADDITIONAL=additional all: mkdir -p build [ -d "$(CLAPACK)" ] || ( cp -a $(srcdir)/$(CLAPACK) . ; chmod -R +rwX $(CLAPACK) ) cd $(CLAPACK) && $(MAKE) blaslib CC="$(CC)" LD="$(LD)" cd $(CLAPACK) && $(MAKE) f2clib CC="$(CC)" LD="$(LD)" [ -d "$(ADDITIONAL)" ] || ( cp -a $(srcdir)/$(ADDITIONAL) . ; chmod -R +rwX $(ADDITIONAL) ) cd $(ADDITIONAL) && $(CC) -c -fPIC *.c && ar cr ../build/minlibdgels.a *.o && ranlib ../build/minlibdgels.a install: installcheck: uninstall: distuninstallcheck: dvi: clean: -cd $(CLAPACK) && $(MAKE) clean && rm -rf *~ -cd $(ADDITIONAL) && rm -rf *.o *~ rm -rf build *~ distclean: clean [ -f Makefile.in ] || rm -fr $(CLAPACK) $(ADDITIONAL) # This part is needed by StarPU STARPU_SRCDIR = . distdir: cp -fRp $(STARPU_SRCDIR)/* $(distdir) cd $(distdir) && make -f Makefile.in clean check: echo "No checks are implemented for min-dgels" recheck: echo "No checks are implemented for min-dgels" showfailed: @: showcheck: check showsuite: check starpu-1.3.9+dfsg/min-dgels/Makefile.in000066400000000000000000000020331413463044200177040ustar00rootroot00000000000000CC = @CC@ LD = @LD@ srcdir = @srcdir@ CLAPACK=base ADDITIONAL=additional all: mkdir -p build [ -d "$(CLAPACK)" ] || ( cp -a $(srcdir)/$(CLAPACK) . ; chmod -R +rwX $(CLAPACK) ) cd $(CLAPACK) && $(MAKE) blaslib CC="$(CC)" LD="$(LD)" cd $(CLAPACK) && $(MAKE) f2clib CC="$(CC)" LD="$(LD)" [ -d "$(ADDITIONAL)" ] || ( cp -a $(srcdir)/$(ADDITIONAL) . ; chmod -R +rwX $(ADDITIONAL) ) cd $(ADDITIONAL) && $(CC) -c -fPIC *.c && ar cr ../build/minlibdgels.a *.o && ranlib ../build/minlibdgels.a install: installcheck: uninstall: distuninstallcheck: dvi: clean: -cd $(CLAPACK) && $(MAKE) clean && rm -rf *~ -cd $(ADDITIONAL) && rm -rf *.o *~ rm -rf build *~ distclean: clean [ -f Makefile.in ] || rm -fr $(CLAPACK) $(ADDITIONAL) # This part is needed by StarPU STARPU_SRCDIR = @srcdir@ distdir: cp -fRp $(STARPU_SRCDIR)/* $(distdir) cd $(distdir) && make -f Makefile.in clean check: echo "No checks are implemented for min-dgels" recheck: echo "No checks are implemented for min-dgels" showfailed: @: showcheck: check showsuite: check starpu-1.3.9+dfsg/min-dgels/additional/000077500000000000000000000000001413463044200177515ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/additional/blaswrap.h000066400000000000000000000001741413463044200217370ustar00rootroot00000000000000/* CLAPACK 3.0 BLAS wrapper macros * Feb 5, 2000 */ #ifndef __BLASWRAP_H #define __BLASWRAP_H #endif /* __BLASWRAP_H */ starpu-1.3.9+dfsg/min-dgels/additional/clapack.h000066400000000000000000012720571413463044200215360ustar00rootroot00000000000000/* header file for clapack 3.2.1 */ #ifndef __CLAPACK_H #define __CLAPACK_H #ifdef __cplusplus extern "C" { #endif /* Subroutine */ int _starpu_caxpy_(integer *n, complex *ca, complex *cx, integer * incx, complex *cy, integer *incy); /* Subroutine */ int _starpu_ccopy_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy); /* Complex */ VOID _starpu_cdotc_(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy); /* Complex */ VOID _starpu_cdotu_(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy); /* Subroutine */ int _starpu_cgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, complex *alpha, complex *a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy); /* Subroutine */ int _starpu_cgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_cgemv_(char *trans, integer *m, integer *n, complex * alpha, complex *a, integer *lda, complex *x, integer *incx, complex * beta, complex *y, integer *incy); /* Subroutine */ int _starpu_cgerc_(integer *m, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *a, integer *lda); /* Subroutine */ int _starpu_cgeru_(integer *m, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *a, integer *lda); /* Subroutine */ int _starpu_chbmv_(char *uplo, integer *n, integer *k, complex * alpha, complex *a, integer *lda, complex *x, integer *incx, complex * beta, complex *y, integer *incy); /* Subroutine */ int _starpu_chemm_(char *side, char *uplo, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_chemv_(char *uplo, integer *n, complex *alpha, complex * a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy); /* Subroutine */ int _starpu_cher_(char *uplo, integer *n, real *alpha, complex *x, integer *incx, complex *a, integer *lda); /* Subroutine */ int _starpu_cher2_(char *uplo, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *a, integer *lda); /* Subroutine */ int _starpu_cher2k_(char *uplo, char *trans, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, real *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_cherk_(char *uplo, char *trans, integer *n, integer *k, real *alpha, complex *a, integer *lda, real *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_chpmv_(char *uplo, integer *n, complex *alpha, complex * ap, complex *x, integer *incx, complex *beta, complex *y, integer * incy); /* Subroutine */ int _starpu_chpr_(char *uplo, integer *n, real *alpha, complex *x, integer *incx, complex *ap); /* Subroutine */ int _starpu_chpr2_(char *uplo, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *ap); /* Subroutine */ int _starpu_crotg_(complex *ca, complex *cb, real *c__, complex *s); /* Subroutine */ int _starpu_cscal_(integer *n, complex *ca, complex *cx, integer * incx); /* Subroutine */ int _starpu__starpu_csrot_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy, real *c__, real *s); /* Subroutine */ int _starpu_csscal_(integer *n, real *sa, complex *cx, integer *incx); /* Subroutine */ int _starpu_cswap_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy); /* Subroutine */ int _starpu_csymm_(char *side, char *uplo, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_csyr2k_(char *uplo, char *trans, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_csyrk_(char *uplo, char *trans, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_ctbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, complex *a, integer *lda, complex *x, integer *incx); /* Subroutine */ int _starpu_ctbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, complex *a, integer *lda, complex *x, integer *incx); /* Subroutine */ int _starpu_ctpmv_(char *uplo, char *trans, char *diag, integer *n, complex *ap, complex *x, integer *incx); /* Subroutine */ int _starpu_ctpsv_(char *uplo, char *trans, char *diag, integer *n, complex *ap, complex *x, integer *incx); /* Subroutine */ int _starpu_ctrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_ctrmv_(char *uplo, char *trans, char *diag, integer *n, complex *a, integer *lda, complex *x, integer *incx); /* Subroutine */ int _starpu_ctrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_ctrsv_(char *uplo, char *trans, char *diag, integer *n, complex *a, integer *lda, complex *x, integer *incx); doublereal _starpu_dasum_(integer *n, doublereal *dx, integer *incx); /* Subroutine */ int _starpu_daxpy_(integer *n, doublereal *da, doublereal *dx, integer *incx, doublereal *dy, integer *incy); doublereal _starpu_dcabs1_(doublecomplex *z__); /* Subroutine */ int _starpu_dcopy_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy); doublereal _starpu_ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy); /* Subroutine */ int _starpu_dgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dgemv_(char *trans, integer *m, integer *n, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dger_(integer *m, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda); doublereal _starpu_dnrm2_(integer *n, doublereal *x, integer *incx); /* Subroutine */ int _starpu_drot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *c__, doublereal *s); /* Subroutine */ int _starpu_drotg_(doublereal *da, doublereal *db, doublereal *c__, doublereal *s); /* Subroutine */ int _starpu_drotm_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *dparam); /* Subroutine */ int _starpu_drotmg_(doublereal *dd1, doublereal *dd2, doublereal * dx1, doublereal *dy1, doublereal *dparam); /* Subroutine */ int _starpu_dsbmv_(char *uplo, integer *n, integer *k, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx); doublereal _starpu_dsdot_(integer *n, real *sx, integer *incx, real *sy, integer * incy); /* Subroutine */ int _starpu_dspmv_(char *uplo, integer *n, doublereal *alpha, doublereal *ap, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dspr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *ap); /* Subroutine */ int _starpu_dspr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *ap); /* Subroutine */ int _starpu_dswap_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy); /* Subroutine */ int _starpu_dsymm_(char *side, char *uplo, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dsymv_(char *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dsyr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *a, integer *lda); /* Subroutine */ int _starpu_dsyr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda); /* Subroutine */ int _starpu_dsyr2k_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dsyrk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dtbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublereal *a, integer *lda, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublereal *a, integer *lda, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtpmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *ap, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtpsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *ap, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dtrmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dtrsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx); doublereal _starpu_dzasum_(integer *n, doublecomplex *zx, integer *incx); doublereal _starpu_dznrm2_(integer *n, doublecomplex *x, integer *incx); integer _starpu_icamax_(integer *n, complex *cx, integer *incx); integer _starpu_idamax_(integer *n, doublereal *dx, integer *incx); integer _starpu_isamax_(integer *n, real *sx, integer *incx); integer _starpu_izamax_(integer *n, doublecomplex *zx, integer *incx); logical _starpu_lsame_(char *ca, char *cb); doublereal _starpu_sasum_(integer *n, real *sx, integer *incx); /* Subroutine */ int _starpu_saxpy_(integer *n, real *sa, real *sx, integer *incx, real *sy, integer *incy); doublereal _starpu_scabs1_(complex *z__); doublereal _starpu_scasum_(integer *n, complex *cx, integer *incx); doublereal _starpu_scnrm2_(integer *n, complex *x, integer *incx); /* Subroutine */ int _starpu_scopy_(integer *n, real *sx, integer *incx, real *sy, integer *incy); doublereal _starpu_sdot_(integer *n, real *sx, integer *incx, real *sy, integer *incy); doublereal _starpu_sdsdot_(integer *n, real *sb, real *sx, integer *incx, real *sy, integer *incy); /* Subroutine */ int _starpu_sgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, real *alpha, real *a, integer *lda, real *x, integer * incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * ldb, real *beta, real *c__, integer *ldc); /* Subroutine */ int _starpu_sgemv_(char *trans, integer *m, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sger_(integer *m, integer *n, real *alpha, real *x, integer *incx, real *y, integer *incy, real *a, integer *lda); doublereal _starpu_snrm2_(integer *n, real *x, integer *incx); /* Subroutine */ int _starpu_srot_(integer *n, real *sx, integer *incx, real *sy, integer *incy, real *c__, real *s); /* Subroutine */ int _starpu_srotg_(real *sa, real *sb, real *c__, real *s); /* Subroutine */ int _starpu_srotm_(integer *n, real *sx, integer *incx, real *sy, integer *incy, real *sparam); /* Subroutine */ int _starpu_srotmg_(real *sd1, real *sd2, real *sx1, real *sy1, real *sparam); /* Subroutine */ int _starpu_ssbmv_(char *uplo, integer *n, integer *k, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sscal_(integer *n, real *sa, real *sx, integer *incx); /* Subroutine */ int _starpu_sspmv_(char *uplo, integer *n, real *alpha, real *ap, real *x, integer *incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sspr_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *ap); /* Subroutine */ int _starpu_sspr2_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *y, integer *incy, real *ap); /* Subroutine */ int _starpu_sswap_(integer *n, real *sx, integer *incx, real *sy, integer *incy); /* Subroutine */ int _starpu_ssymm_(char *side, char *uplo, integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, real *c__, integer *ldc); /* Subroutine */ int _starpu_ssymv_(char *uplo, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer * incy); /* Subroutine */ int _starpu_ssyr_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *a, integer *lda); /* Subroutine */ int _starpu_ssyr2_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *y, integer *incy, real *a, integer *lda); /* Subroutine */ int _starpu_ssyr2k_(char *uplo, char *trans, integer *n, integer *k, real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, real *c__, integer *ldc); /* Subroutine */ int _starpu_ssyrk_(char *uplo, char *trans, integer *n, integer *k, real *alpha, real *a, integer *lda, real *beta, real *c__, integer * ldc); /* Subroutine */ int _starpu_stbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_stbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_stpmv_(char *uplo, char *trans, char *diag, integer *n, real *ap, real *x, integer *incx); /* Subroutine */ int _starpu_stpsv_(char *uplo, char *trans, char *diag, integer *n, real *ap, real *x, integer *incx); /* Subroutine */ int _starpu_strmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, integer *ldb); /* Subroutine */ int _starpu_strmv_(char *uplo, char *trans, char *diag, integer *n, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_strsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, integer *ldb); /* Subroutine */ int _starpu_strsv_(char *uplo, char *trans, char *diag, integer *n, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info); /* Subroutine */ int _starpu_xerbla_array__(char *srname_array__, integer * srname_len__, integer *info, ftnlen srname_array_len); /* Subroutine */ int _starpu_zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Subroutine */ int _starpu_zcopy_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Double Complex */ VOID _starpu_zdotc_(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Double Complex */ VOID _starpu_zdotu_(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Subroutine */ int _starpu_zdrot_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy, doublereal *c__, doublereal *s); /* Subroutine */ int _starpu_zdscal_(integer *n, doublereal *da, doublecomplex *zx, integer *incx); /* Subroutine */ int _starpu_zgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex * y, integer *incy); /* Subroutine */ int _starpu_zgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex * c__, integer *ldc); /* Subroutine */ int _starpu_zgemv_(char *trans, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * x, integer *incx, doublecomplex *beta, doublecomplex *y, integer * incy); /* Subroutine */ int _starpu_zgerc_(integer *m, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zgeru_(integer *m, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zhbmv_(char *uplo, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer * incx, doublecomplex *beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zhemm_(char *side, char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer * ldc); /* Subroutine */ int _starpu_zhemv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zher_(char *uplo, integer *n, doublereal *alpha, doublecomplex *x, integer *incx, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zher2_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zher2k_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublereal *beta, doublecomplex *c__, integer *ldc); /* Subroutine */ int _starpu_zherk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublecomplex *a, integer *lda, doublereal *beta, doublecomplex *c__, integer *ldc); /* Subroutine */ int _starpu_zhpmv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *ap, doublecomplex *x, integer *incx, doublecomplex * beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zhpr_(char *uplo, integer *n, doublereal *alpha, doublecomplex *x, integer *incx, doublecomplex *ap); /* Subroutine */ int _starpu_zhpr2_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *ap); /* Subroutine */ int _starpu_zrotg_(doublecomplex *ca, doublecomplex *cb, doublereal * c__, doublecomplex *s); /* Subroutine */ int _starpu_zscal_(integer *n, doublecomplex *za, doublecomplex *zx, integer *incx); /* Subroutine */ int _starpu_zswap_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Subroutine */ int _starpu_zsymm_(char *side, char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer * ldc); /* Subroutine */ int _starpu_zsyr2k_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer * ldc); /* Subroutine */ int _starpu_zsyrk_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * beta, doublecomplex *c__, integer *ldc); /* Subroutine */ int _starpu_ztbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztpmv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *ap, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztpsv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *ap, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_ztrmv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_ztrsv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_cbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, real *d__, real *e, complex *vt, integer *ldvt, complex *u, integer *ldu, complex *c__, integer *ldc, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, complex *ab, integer *ldab, real *d__, real *e, complex *q, integer *ldq, complex *pt, integer *ldpt, complex *c__, integer *ldc, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbcon_(char *norm, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbequ_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgbequb_(integer *m, integer *n, integer *kl, integer * ku, complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer * ldafb, integer *ipiv, complex *b, integer *ldb, complex *x, integer * ldx, real *ferr, real *berr, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex * afb, integer *ldafb, integer *ipiv, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, complex *ab, integer *ldab, integer *ipiv, complex *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_cgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex * afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbtf2_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgbtrf_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, complex *ab, integer *ldab, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *scale, integer *m, complex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_cgebal_(char *job, integer *n, complex *a, integer *lda, integer *ilo, integer *ihi, real *scale, integer *info); /* Subroutine */ int _starpu_cgebd2_(integer *m, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tauq, complex *taup, complex *work, integer *info); /* Subroutine */ int _starpu_cgebrd_(integer *m, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tauq, complex *taup, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgecon_(char *norm, integer *n, complex *a, integer *lda, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgeequ_(integer *m, integer *n, complex *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgeequb_(integer *m, integer *n, complex *a, integer * lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgees_(char *jobvs, char *sort, L_fp select, integer *n, complex *a, integer *lda, integer *sdim, complex *w, complex *vs, integer *ldvs, complex *work, integer *lwork, real *rwork, logical * bwork, integer *info); /* Subroutine */ int _starpu_cgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, complex *a, integer *lda, integer *sdim, complex * w, complex *vs, integer *ldvs, real *rconde, real *rcondv, complex * work, integer *lwork, real *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cgeev_(char *jobvl, char *jobvr, integer *n, complex *a, integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex *work, integer *lwork, real *rwork, integer * info); /* Subroutine */ int _starpu_cgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, complex *a, integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *ilo, integer *ihi, real *scale, real *abnrm, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgegs_(char *jobvsl, char *jobvsr, integer *n, complex * a, integer *lda, complex *b, integer *ldb, complex *alpha, complex * beta, complex *vsl, integer *ldvsl, complex *vsr, integer *ldvsr, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgegv_(char *jobvl, char *jobvr, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex * work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgehd2_(integer *n, integer *ilo, integer *ihi, complex * a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgehrd_(integer *n, integer *ilo, integer *ihi, complex * a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgelq2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgelqf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgels_(char *trans, integer *m, integer *n, integer * nrhs, complex *a, integer *lda, complex *b, integer *ldb, complex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgelsd_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, real *s, real *rcond, integer *rank, complex *work, integer *lwork, real *rwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_cgelss_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, real *s, real *rcond, integer *rank, complex *work, integer *lwork, real *rwork, integer * info); /* Subroutine */ int _starpu_cgelsx_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgelsy_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, complex *work, integer *lwork, real *rwork, integer * info); /* Subroutine */ int _starpu_cgeql2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgeqlf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgeqp3_(integer *m, integer *n, complex *a, integer *lda, integer *jpvt, complex *tau, complex *work, integer *lwork, real * rwork, integer *info); /* Subroutine */ int _starpu_cgeqpf_(integer *m, integer *n, complex *a, integer *lda, integer *jpvt, complex *tau, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgeqr2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgeqrf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgerfs_(char *trans, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgerq2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgerqf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgesc2_(integer *n, complex *a, integer *lda, complex * rhs, integer *ipiv, integer *jpiv, real *scale); /* Subroutine */ int _starpu_cgesdd_(char *jobz, integer *m, integer *n, complex *a, integer *lda, real *s, complex *u, integer *ldu, complex *vt, integer *ldvt, complex *work, integer *lwork, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_cgesv_(integer *n, integer *nrhs, complex *a, integer * lda, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgesvd_(char *jobu, char *jobvt, integer *m, integer *n, complex *a, integer *lda, real *s, complex *u, integer *ldu, complex * vt, integer *ldvt, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgesvx_(char *fact, char *trans, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgetc2_(integer *n, complex *a, integer *lda, integer * ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_cgetf2_(integer *m, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgetrf_(integer *m, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgetri_(integer *n, complex *a, integer *lda, integer * ipiv, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgetrs_(char *trans, integer *n, integer *nrhs, complex * a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_cggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *lscale, real *rscale, integer *m, complex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_cggbal_(char *job, integer *n, complex *a, integer *lda, complex *b, integer *ldb, integer *ilo, integer *ihi, real *lscale, real *rscale, real *work, integer *info); /* Subroutine */ int _starpu_cgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, complex *a, integer *lda, complex *b, integer * ldb, integer *sdim, complex *alpha, complex *beta, complex *vsl, integer *ldvsl, complex *vsr, integer *ldvsr, complex *work, integer * lwork, real *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, complex *a, integer *lda, complex *b, integer *ldb, integer *sdim, complex *alpha, complex *beta, complex * vsl, integer *ldvsl, complex *vsr, integer *ldvsr, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cggev_(char *jobvl, char *jobvr, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex * work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *vl, integer *ldvl, complex * vr, integer *ldvr, integer *ilo, integer *ihi, real *lscale, real * rscale, real *abnrm, real *bbnrm, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *iwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cggglm_(integer *n, integer *m, integer *p, complex *a, integer *lda, complex *b, integer *ldb, complex *d__, complex *x, complex *y, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, complex *a, integer *lda, complex *b, integer *ldb, complex *q, integer *ldq, complex *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_cgglse_(integer *m, integer *n, integer *p, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, complex *d__, complex *x, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cggqrf_(integer *n, integer *m, integer *p, complex *a, integer *lda, complex *taua, complex *b, integer *ldb, complex *taub, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cggrqf_(integer *m, integer *p, integer *n, complex *a, integer *lda, complex *taua, complex *b, integer *ldb, complex *taub, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, complex *a, integer * lda, complex *b, integer *ldb, real *alpha, real *beta, complex *u, integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, complex *work, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_cggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, complex *a, integer *lda, complex *b, integer *ldb, real *tola, real *tolb, integer *k, integer *l, complex *u, integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, integer *iwork, real *rwork, complex *tau, complex *work, integer * info); /* Subroutine */ int _starpu_cgtcon_(char *norm, integer *n, complex *dl, complex * d__, complex *du, complex *du2, integer *ipiv, real *anorm, real * rcond, complex *work, integer *info); /* Subroutine */ int _starpu_cgtrfs_(char *trans, integer *n, integer *nrhs, complex * dl, complex *d__, complex *du, complex *dlf, complex *df, complex * duf, complex *du2, integer *ipiv, complex *b, integer *ldb, complex * x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgtsv_(integer *n, integer *nrhs, complex *dl, complex * d__, complex *du, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, complex *dl, complex *d__, complex *du, complex *dlf, complex * df, complex *duf, complex *du2, integer *ipiv, complex *b, integer * ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgttrf_(integer *n, complex *dl, complex *d__, complex * du, complex *du2, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgttrs_(char *trans, integer *n, integer *nrhs, complex * dl, complex *d__, complex *du, complex *du2, integer *ipiv, complex * b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgtts2_(integer *itrans, integer *n, integer *nrhs, complex *dl, complex *d__, complex *du, complex *du2, integer *ipiv, complex *b, integer *ldb); /* Subroutine */ int _starpu_chbev_(char *jobz, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chbevd_(char *jobz, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, complex *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer * m, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_chbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, complex *x, integer *ldx, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, complex *q, integer *ldq, real *vl, real *vu, integer * il, integer *iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_chbtrd_(char *vect, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *d__, real *e, complex *q, integer * ldq, complex *work, integer *info); /* Subroutine */ int _starpu_checon_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, real *anorm, real *rcond, complex *work, integer * info); /* Subroutine */ int _starpu_cheequb_(char *uplo, integer *n, complex *a, integer * lda, real *s, real *scond, real *amax, complex *work, integer *info); /* Subroutine */ int _starpu_cheev_(char *jobz, char *uplo, integer *n, complex *a, integer *lda, real *w, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cheevd_(char *jobz, char *uplo, integer *n, complex *a, integer *lda, real *w, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_cheevr_(char *jobz, char *range, char *uplo, integer *n, complex *a, integer *lda, real *vl, real *vu, integer *il, integer * iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, integer *isuppz, complex *work, integer *lwork, real *rwork, integer * lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_cheevx_(char *jobz, char *range, char *uplo, integer *n, complex *a, integer *lda, real *vl, real *vu, integer *il, integer * iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_chegs2_(integer *itype, char *uplo, integer *n, complex * a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chegst_(integer *itype, char *uplo, integer *n, complex * a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chegv_(integer *itype, char *jobz, char *uplo, integer * n, complex *a, integer *lda, complex *b, integer *ldb, real *w, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_chegvd_(integer *itype, char *jobz, char *uplo, integer * n, complex *a, integer *lda, complex *b, integer *ldb, real *w, complex *work, integer *lwork, real *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chegvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, complex *a, integer *lda, complex *b, integer *ldb, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer * m, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_cherfs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cherfsx_(char *uplo, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chesv_(char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_chesvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_chesvxx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chetd2_(char *uplo, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tau, integer *info); /* Subroutine */ int _starpu_chetf2_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_chetrd_(char *uplo, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_chetrf_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_chetri_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_chetrs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_chfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, real *alpha, complex *a, integer *lda, real *beta, complex *c__); /* Subroutine */ int _starpu_chgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *t, integer *ldt, complex *alpha, complex *beta, complex *q, integer *ldq, complex *z__, integer *ldz, complex *work, integer *lwork, real * rwork, integer *info); /* Character */ VOID _starpu_chla_transtype__(char *ret_val, ftnlen ret_val_len, integer *trans); /* Subroutine */ int _starpu_chpcon_(char *uplo, integer *n, complex *ap, integer * ipiv, real *anorm, real *rcond, complex *work, integer *info); /* Subroutine */ int _starpu_chpev_(char *jobz, char *uplo, integer *n, complex *ap, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chpevd_(char *jobz, char *uplo, integer *n, complex *ap, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chpevx_(char *jobz, char *range, char *uplo, integer *n, complex *ap, real *vl, real *vu, integer *il, integer *iu, real * abstol, integer *m, real *w, complex *z__, integer *ldz, complex * work, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_chpgst_(integer *itype, char *uplo, integer *n, complex * ap, complex *bp, integer *info); /* Subroutine */ int _starpu_chpgv_(integer *itype, char *jobz, char *uplo, integer * n, complex *ap, complex *bp, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chpgvd_(integer *itype, char *jobz, char *uplo, integer * n, complex *ap, complex *bp, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chpgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, complex *ap, complex *bp, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, complex * z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_chprfs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *afp, integer *ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chpsv_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chpsvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *ap, complex *afp, integer *ipiv, complex *b, integer * ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chptrd_(char *uplo, integer *n, complex *ap, real *d__, real *e, complex *tau, integer *info); /* Subroutine */ int _starpu_chptrf_(char *uplo, integer *n, complex *ap, integer * ipiv, integer *info); /* Subroutine */ int _starpu_chptri_(char *uplo, integer *n, complex *ap, integer * ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_chptrs_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, complex *h__, integer *ldh, complex *w, complex * vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer * m, complex *work, real *rwork, integer *ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_chseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, complex *z__, integer *ldz, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, real *alpha, complex *ab, integer *ldab, complex *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_cla_gbrcond_c__(char *trans, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer * ipiv, real *c__, logical *capply, integer *info, complex *work, real * rwork, ftnlen trans_len); doublereal _starpu_cla_gbrcond_x__(char *trans, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer * ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_cla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer * ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex * y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex * y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info); doublereal _starpu_cla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, complex *ab, integer *ldab, complex *afb, integer *ldafb); /* Subroutine */ int _starpu_cla_geamv__(integer *trans, integer *m, integer *n, real *alpha, complex *a, integer *lda, complex *x, integer *incx, real * beta, real *y, integer *incy); doublereal _starpu_cla_gercond_c__(char *trans, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen trans_len); doublereal _starpu_cla_gercond_x__(char *trans, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_cla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer * ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info); /* Subroutine */ int _starpu_cla_heamv__(integer *uplo, integer *n, real *alpha, complex *a, integer *lda, complex *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_cla_hercond_c__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen uplo_len); doublereal _starpu_cla_hercond_x__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_herfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer * n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer *ithresh, real * rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_cla_herpvgrw__(char *uplo, integer *n, integer *info, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *work, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_lin_berr__(integer *n, integer *nz, integer *nrhs, complex *res, real *ayb, real *berr); doublereal _starpu_cla_porcond_c__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen uplo_len); doublereal _starpu_cla_porcond_x__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, complex *x, integer *info, complex *work, real *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer *n_norms__, real * errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_cla_porpvgrw__(char *uplo, integer *ncols, complex *a, integer * lda, complex *af, integer *ldaf, real *work, ftnlen uplo_len); doublereal _starpu_cla_rpvgrw__(integer *n, integer *ncols, complex *a, integer *lda, complex *af, integer *ldaf); /* Subroutine */ int _starpu_cla_syamv__(integer *uplo, integer *n, real *alpha, complex *a, integer *lda, complex *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_cla_syrcond_c__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen uplo_len); doublereal _starpu_cla_syrcond_x__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer * n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer *ithresh, real * rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_cla_syrpvgrw__(char *uplo, integer *n, integer *info, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *work, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_wwaddw__(integer *n, complex *x, complex *y, complex *w); /* Subroutine */ int _starpu_clabrd_(integer *m, integer *n, integer *nb, complex *a, integer *lda, real *d__, real *e, complex *tauq, complex *taup, complex *x, integer *ldx, complex *y, integer *ldy); /* Subroutine */ int _starpu_clacgv_(integer *n, complex *x, integer *incx); /* Subroutine */ int _starpu_clacn2_(integer *n, complex *v, complex *x, real *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_clacon_(integer *n, complex *v, complex *x, real *est, integer *kase); /* Subroutine */ int _starpu_clacp2_(char *uplo, integer *m, integer *n, real *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_clacpy_(char *uplo, integer *m, integer *n, complex *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_clacrm_(integer *m, integer *n, complex *a, integer *lda, real *b, integer *ldb, complex *c__, integer *ldc, real *rwork); /* Subroutine */ int _starpu_clacrt_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy, complex *c__, complex *s); /* Complex */ VOID _starpu_cladiv_(complex * ret_val, complex *x, complex *y); /* Subroutine */ int _starpu_claed0_(integer *qsiz, integer *n, real *d__, real *e, complex *q, integer *ldq, complex *qstore, integer *ldqs, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_claed7_(integer *n, integer *cutpnt, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, real *d__, complex * q, integer *ldq, real *rho, integer *indxq, real *qstore, integer * qptr, integer *prmptr, integer *perm, integer *givptr, integer * givcol, real *givnum, complex *work, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_claed8_(integer *k, integer *n, integer *qsiz, complex * q, integer *ldq, real *d__, real *rho, integer *cutpnt, real *z__, real *dlamda, complex *q2, integer *ldq2, real *w, integer *indxp, integer *indx, integer *indxq, integer *perm, integer *givptr, integer *givcol, real *givnum, integer *info); /* Subroutine */ int _starpu_claein_(logical *rightv, logical *noinit, integer *n, complex *h__, integer *ldh, complex *w, complex *v, complex *b, integer *ldb, real *rwork, real *eps3, real *smlnum, integer *info); /* Subroutine */ int _starpu_claesy_(complex *a, complex *b, complex *c__, complex * rt1, complex *rt2, complex *evscal, complex *cs1, complex *sn1); /* Subroutine */ int _starpu_claev2_(complex *a, complex *b, complex *c__, real *rt1, real *rt2, real *cs1, complex *sn1); /* Subroutine */ int _starpu_clag2z_(integer *m, integer *n, complex *sa, integer * ldsa, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_clags2_(logical *upper, real *a1, complex *a2, real *a3, real *b1, complex *b2, real *b3, real *csu, complex *snu, real *csv, complex *snv, real *csq, complex *snq); /* Subroutine */ int _starpu_clagtm_(char *trans, integer *n, integer *nrhs, real * alpha, complex *dl, complex *d__, complex *du, complex *x, integer * ldx, real *beta, complex *b, integer *ldb); /* Subroutine */ int _starpu_clahef_(char *uplo, integer *n, integer *nb, integer *kb, complex *a, integer *lda, integer *ipiv, complex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_clahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * info); /* Subroutine */ int _starpu_clahr2_(integer *n, integer *k, integer *nb, complex *a, integer *lda, complex *tau, complex *t, integer *ldt, complex *y, integer *ldy); /* Subroutine */ int _starpu_clahrd_(integer *n, integer *k, integer *nb, complex *a, integer *lda, complex *tau, complex *t, integer *ldt, complex *y, integer *ldy); /* Subroutine */ int _starpu_claic1_(integer *job, integer *j, complex *x, real *sest, complex *w, complex *gamma, real *sestpr, complex *s, complex *c__); /* Subroutine */ int _starpu_clals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, complex *b, integer *ldb, complex *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * difl, real *difr, real *z__, integer *k, real *c__, real *s, real * rwork, integer *info); /* Subroutine */ int _starpu_clalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, complex *b, integer *ldb, complex *bx, integer *ldbx, real *u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real *z__, real *poles, integer *givptr, integer *givcol, integer * ldgcol, integer *perm, real *givnum, real *c__, real *s, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_clalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, real *d__, real *e, complex *b, integer *ldb, real *rcond, integer *rank, complex *work, real *rwork, integer *iwork, integer * info); doublereal _starpu_clangb_(char *norm, integer *n, integer *kl, integer *ku, complex * ab, integer *ldab, real *work); doublereal _starpu_clange_(char *norm, integer *m, integer *n, complex *a, integer * lda, real *work); doublereal _starpu_clangt_(char *norm, integer *n, complex *dl, complex *d__, complex *du); doublereal _starpu_clanhb_(char *norm, char *uplo, integer *n, integer *k, complex * ab, integer *ldab, real *work); doublereal _starpu_clanhe_(char *norm, char *uplo, integer *n, complex *a, integer * lda, real *work); doublereal _starpu_clanhf_(char *norm, char *transr, char *uplo, integer *n, complex * a, real *work); doublereal _starpu_clanhp_(char *norm, char *uplo, integer *n, complex *ap, real * work); doublereal _starpu_clanhs_(char *norm, integer *n, complex *a, integer *lda, real * work); doublereal _starpu_clanht_(char *norm, integer *n, real *d__, complex *e); doublereal _starpu_clansb_(char *norm, char *uplo, integer *n, integer *k, complex * ab, integer *ldab, real *work); doublereal _starpu_clansp_(char *norm, char *uplo, integer *n, complex *ap, real * work); doublereal _starpu_clansy_(char *norm, char *uplo, integer *n, complex *a, integer * lda, real *work); doublereal _starpu_clantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, complex *ab, integer *ldab, real *work); doublereal _starpu_clantp_(char *norm, char *uplo, char *diag, integer *n, complex * ap, real *work); doublereal _starpu_clantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, complex *a, integer *lda, real *work); /* Subroutine */ int _starpu_clapll_(integer *n, complex *x, integer *incx, complex * y, integer *incy, real *ssmin); /* Subroutine */ int _starpu_clapmt_(logical *forwrd, integer *m, integer *n, complex *x, integer *ldx, integer *k); /* Subroutine */ int _starpu_claqgb_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char *equed); /* Subroutine */ int _starpu_claqge_(integer *m, integer *n, complex *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * equed); /* Subroutine */ int _starpu_claqhb_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqhe_(char *uplo, integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqhp_(char *uplo, integer *n, complex *ap, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqp2_(integer *m, integer *n, integer *offset, complex *a, integer *lda, integer *jpvt, complex *tau, real *vn1, real *vn2, complex *work); /* Subroutine */ int _starpu_claqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, complex *a, integer *lda, integer *jpvt, complex * tau, real *vn1, real *vn2, complex *auxv, complex *f, integer *ldf); /* Subroutine */ int _starpu_claqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, integer *iloz, integer *ihiz, complex *z__, integer *ldz, complex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_claqr1_(integer *n, complex *h__, integer *ldh, complex * s1, complex *s2, complex *v); /* Subroutine */ int _starpu_claqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * ns, integer *nd, complex *sh, complex *v, integer *ldv, integer *nh, complex *t, integer *ldt, integer *nv, complex *wv, integer *ldwv, complex *work, integer *lwork); /* Subroutine */ int _starpu_claqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * ns, integer *nd, complex *sh, complex *v, integer *ldv, integer *nh, complex *t, integer *ldt, integer *nv, complex *wv, integer *ldwv, complex *work, integer *lwork); /* Subroutine */ int _starpu_claqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, integer *iloz, integer *ihiz, complex *z__, integer *ldz, complex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_claqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, complex *s, complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex * z__, integer *ldz, complex *v, integer *ldv, complex *u, integer *ldu, integer *nv, complex *wv, integer *ldwv, integer *nh, complex *wh, integer *ldwh); /* Subroutine */ int _starpu_claqsb_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqsp_(char *uplo, integer *n, complex *ap, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqsy_(char *uplo, integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_clar1v_(integer *n, integer *b1, integer *bn, real * lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * gaptol, complex *z__, logical *wantnc, integer *negcnt, real *ztz, real *mingma, integer *r__, integer *isuppz, real *nrminv, real * resid, real *rqcorr, real *work); /* Subroutine */ int _starpu_clar2v_(integer *n, complex *x, complex *y, complex *z__, integer *incx, real *c__, complex *s, integer *incc); /* Subroutine */ int _starpu_clarcm_(integer *m, integer *n, real *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, real *rwork); /* Subroutine */ int _starpu_clarf_(char *side, integer *m, integer *n, complex *v, integer *incv, complex *tau, complex *c__, integer *ldc, complex * work); /* Subroutine */ int _starpu_clarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, complex *v, integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, integer *ldwork); /* Subroutine */ int _starpu_clarfg_(integer *n, complex *alpha, complex *x, integer * incx, complex *tau); /* Subroutine */ int _starpu_clarfp_(integer *n, complex *alpha, complex *x, integer * incx, complex *tau); /* Subroutine */ int _starpu_clarft_(char *direct, char *storev, integer *n, integer * k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt); /* Subroutine */ int _starpu_clarfx_(char *side, integer *m, integer *n, complex *v, complex *tau, complex *c__, integer *ldc, complex *work); /* Subroutine */ int _starpu_clargv_(integer *n, complex *x, integer *incx, complex * y, integer *incy, real *c__, integer *incc); /* Subroutine */ int _starpu_clarnv_(integer *idist, integer *iseed, integer *n, complex *x); /* Subroutine */ int _starpu_clarrv_(integer *n, real *vl, real *vu, real *d__, real * l, real *pivmin, integer *isplit, integer *m, integer *dol, integer * dou, real *minrgp, real *rtol1, real *rtol2, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, real *gers, complex * z__, integer *ldz, integer *isuppz, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_clarscl2_(integer *m, integer *n, real *d__, complex *x, integer *ldx); /* Subroutine */ int _starpu_clartg_(complex *f, complex *g, real *cs, complex *sn, complex *r__); /* Subroutine */ int _starpu_clartv_(integer *n, complex *x, integer *incx, complex * y, integer *incy, real *c__, complex *s, integer *incc); /* Subroutine */ int _starpu_clarz_(char *side, integer *m, integer *n, integer *l, complex *v, integer *incv, complex *tau, complex *c__, integer *ldc, complex *work); /* Subroutine */ int _starpu_clarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, complex *v, integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, integer *ldwork); /* Subroutine */ int _starpu_clarzt_(char *direct, char *storev, integer *n, integer * k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt); /* Subroutine */ int _starpu_clascl_(char *type__, integer *kl, integer *ku, real * cfrom, real *cto, integer *m, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_clascl2_(integer *m, integer *n, real *d__, complex *x, integer *ldx); /* Subroutine */ int _starpu_claset_(char *uplo, integer *m, integer *n, complex * alpha, complex *beta, complex *a, integer *lda); /* Subroutine */ int _starpu_clasr_(char *side, char *pivot, char *direct, integer *m, integer *n, real *c__, real *s, complex *a, integer *lda); /* Subroutine */ int _starpu_classq_(integer *n, complex *x, integer *incx, real * scale, real *sumsq); /* Subroutine */ int _starpu_claswp_(integer *n, complex *a, integer *lda, integer * k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_clasyf_(char *uplo, integer *n, integer *nb, integer *kb, complex *a, integer *lda, integer *ipiv, complex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_clatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, complex *ab, integer *ldab, complex * x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_clatdf_(integer *ijob, integer *n, complex *z__, integer *ldz, complex *rhs, real *rdsum, real *rdscal, integer *ipiv, integer *jpiv); /* Subroutine */ int _starpu_clatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, complex *ap, complex *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_clatrd_(char *uplo, integer *n, integer *nb, complex *a, integer *lda, real *e, complex *tau, complex *w, integer *ldw); /* Subroutine */ int _starpu_clatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, complex *a, integer *lda, complex *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_clatrz_(integer *m, integer *n, integer *l, complex *a, integer *lda, complex *tau, complex *work); /* Subroutine */ int _starpu_clatzm_(char *side, integer *m, integer *n, complex *v, integer *incv, complex *tau, complex *c1, complex *c2, integer *ldc, complex *work); /* Subroutine */ int _starpu_clauu2_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_clauum_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpbcon_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpbequ_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real * berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpbstf_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_cpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_cpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer * ldafb, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpbtf2_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_cpbtrf_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_cpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_cpftrf_(char *transr, char *uplo, integer *n, complex *a, integer *info); /* Subroutine */ int _starpu_cpftri_(char *transr, char *uplo, integer *n, complex *a, integer *info); /* Subroutine */ int _starpu_cpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, complex *a, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cpocon_(char *uplo, integer *n, complex *a, integer *lda, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpoequ_(integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cpoequb_(integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cporfs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real * err_bnds_comp__, integer *nparams, real *params, complex *work, real * rwork, integer *info); /* Subroutine */ int _starpu_cposv_(char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cposvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, char * equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, char * equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpotf2_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpotrf_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpotri_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpotrs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cppcon_(char *uplo, integer *n, complex *ap, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cppequ_(char *uplo, integer *n, complex *ap, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cpprfs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *afp, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cppsv_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *ap, complex *afp, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpptrf_(char *uplo, integer *n, complex *ap, integer * info); /* Subroutine */ int _starpu_cpptri_(char *uplo, integer *n, complex *ap, integer * info); /* Subroutine */ int _starpu_cpptrs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cpstf2_(char *uplo, integer *n, complex *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_cpstrf_(char *uplo, integer *n, complex *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_cptcon_(integer *n, real *d__, complex *e, real *anorm, real *rcond, real *rwork, integer *info); /* Subroutine */ int _starpu_cpteqr_(char *compz, integer *n, real *d__, real *e, complex *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_cptrfs_(char *uplo, integer *n, integer *nrhs, real *d__, complex *e, real *df, complex *ef, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cptsv_(integer *n, integer *nrhs, real *d__, complex *e, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cptsvx_(char *fact, integer *n, integer *nrhs, real *d__, complex *e, real *df, complex *ef, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpttrf_(integer *n, real *d__, complex *e, integer *info); /* Subroutine */ int _starpu_cpttrs_(char *uplo, integer *n, integer *nrhs, real *d__, complex *e, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cptts2_(integer *iuplo, integer *n, integer *nrhs, real * d__, complex *e, complex *b, integer *ldb); /* Subroutine */ int _starpu_crot_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy, real *c__, complex *s); /* Subroutine */ int _starpu_cspcon_(char *uplo, integer *n, complex *ap, integer * ipiv, real *anorm, real *rcond, complex *work, integer *info); /* Subroutine */ int _starpu_cspmv_(char *uplo, integer *n, complex *alpha, complex * ap, complex *x, integer *incx, complex *beta, complex *y, integer * incy); /* Subroutine */ int _starpu_cspr_(char *uplo, integer *n, complex *alpha, complex *x, integer *incx, complex *ap); /* Subroutine */ int _starpu_csprfs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *afp, integer *ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cspsv_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *ap, complex *afp, integer *ipiv, complex *b, integer * ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csptrf_(char *uplo, integer *n, complex *ap, integer * ipiv, integer *info); /* Subroutine */ int _starpu_csptri_(char *uplo, integer *n, complex *ap, integer * ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_csptrs_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu__starpu_csrscl_(integer *n, real *sa, complex *sx, integer *incx); /* Subroutine */ int _starpu_cstedc_(char *compz, integer *n, real *d__, real *e, complex *z__, integer *ldz, complex *work, integer *lwork, real * rwork, integer *lrwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_cstegr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, integer *isuppz, real *work, integer *lwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_cstein_(integer *n, real *d__, real *e, integer *m, real *w, integer *iblock, integer *isplit, complex *z__, integer *ldz, real *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_cstemr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, integer *m, real *w, complex *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, real *work, integer *lwork, integer *iwork, integer * liwork, integer *info); /* Subroutine */ int _starpu_csteqr_(char *compz, integer *n, real *d__, real *e, complex *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_csycon_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, real *anorm, real *rcond, complex *work, integer * info); /* Subroutine */ int _starpu_csyequb_(char *uplo, integer *n, complex *a, integer * lda, real *s, real *scond, real *amax, complex *work, integer *info); /* Subroutine */ int _starpu_csymv_(char *uplo, integer *n, complex *alpha, complex * a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy); /* Subroutine */ int _starpu_csyr_(char *uplo, integer *n, complex *alpha, complex *x, integer *incx, complex *a, integer *lda); /* Subroutine */ int _starpu_csyrfs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csysv_(char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_csysvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_csysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csytf2_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_csytrf_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_csytri_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_csytrs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_ctbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, complex *ab, integer *ldab, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ctfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, complex *alpha, complex *a, complex *b, integer *ldb); /* Subroutine */ int _starpu_ctftri_(char *transr, char *uplo, char *diag, integer *n, complex *a, integer *info); /* Subroutine */ int _starpu_ctfttp_(char *transr, char *uplo, integer *n, complex * arf, complex *ap, integer *info); /* Subroutine */ int _starpu_ctfttr_(char *transr, char *uplo, integer *n, complex * arf, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctgevc_(char *side, char *howmny, logical *select, integer *n, complex *s, integer *lds, complex *p, integer *ldp, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer *m, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctgex2_(logical *wantq, logical *wantz, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *q, integer *ldq, complex *z__, integer *ldz, integer *j1, integer *info); /* Subroutine */ int _starpu_ctgexc_(logical *wantq, logical *wantz, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *q, integer *ldq, complex *z__, integer *ldz, integer *ifst, integer * ilst, integer *info); /* Subroutine */ int _starpu_ctgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *q, integer *ldq, complex *z__, integer *ldz, integer *m, real *pl, real *pr, real * dif, complex *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ctgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, complex *a, integer * lda, complex *b, integer *ldb, real *tola, real *tolb, real *alpha, real *beta, complex *u, integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, complex *work, integer *ncycle, integer * info); /* Subroutine */ int _starpu_ctgsna_(char *job, char *howmny, logical *select, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *vl, integer *ldvl, complex *vr, integer *ldvr, real *s, real *dif, integer *mm, integer *m, complex *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ctgsy2_(char *trans, integer *ijob, integer *m, integer * n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, complex *d__, integer *ldd, complex *e, integer *lde, complex *f, integer *ldf, real *scale, real *rdsum, real *rdscal, integer *info); /* Subroutine */ int _starpu_ctgsyl_(char *trans, integer *ijob, integer *m, integer * n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, complex *d__, integer *ldd, complex *e, integer *lde, complex *f, integer *ldf, real *scale, real *dif, complex *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ctpcon_(char *norm, char *uplo, char *diag, integer *n, complex *ap, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *ap, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctptri_(char *uplo, char *diag, integer *n, complex *ap, integer *info); /* Subroutine */ int _starpu_ctptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *ap, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ctpttf_(char *transr, char *uplo, integer *n, complex * ap, complex *arf, integer *info); /* Subroutine */ int _starpu_ctpttr_(char *uplo, integer *n, complex *ap, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctrcon_(char *norm, char *uplo, char *diag, integer *n, complex *a, integer *lda, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrevc_(char *side, char *howmny, logical *select, integer *n, complex *t, integer *ldt, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer *m, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrexc_(char *compq, integer *n, complex *t, integer * ldt, complex *q, integer *ldq, integer *ifst, integer *ilst, integer * info); /* Subroutine */ int _starpu_ctrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrsen_(char *job, char *compq, logical *select, integer *n, complex *t, integer *ldt, complex *q, integer *ldq, complex *w, integer *m, real *s, real *sep, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ctrsna_(char *job, char *howmny, logical *select, integer *n, complex *t, integer *ldt, complex *vl, integer *ldvl, complex *vr, integer *ldvr, real *s, real *sep, integer *mm, integer * m, complex *work, integer *ldwork, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, real *scale, integer *info); /* Subroutine */ int _starpu_ctrti2_(char *uplo, char *diag, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctrtri_(char *uplo, char *diag, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ctrttf_(char *transr, char *uplo, integer *n, complex *a, integer *lda, complex *arf, integer *info); /* Subroutine */ int _starpu_ctrttp_(char *uplo, integer *n, complex *a, integer *lda, complex *ap, integer *info); /* Subroutine */ int _starpu_ctzrqf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, integer *info); /* Subroutine */ int _starpu_ctzrzf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cung2l_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cung2r_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cungbr_(char *vect, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunghr_(integer *n, integer *ilo, integer *ihi, complex * a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cungl2_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cunglq_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungql_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungqr_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungr2_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cungrq_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungtr_(char *uplo, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunm2l_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunm2r_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cunmhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cunml2_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmlq_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmql_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmqr_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmr2_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmrq_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cunmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cupgtr_(char *uplo, integer *n, complex *ap, complex * tau, complex *q, integer *ldq, complex *work, integer *info); /* Subroutine */ int _starpu_cupmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, complex *ap, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_dbdsdc_(char *uplo, char *compq, integer *n, doublereal * d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *q, integer *iq, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_ddisna_(char *job, integer *m, integer *n, doublereal * d__, doublereal *sep, integer *info); /* Subroutine */ int _starpu_dgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal * d__, doublereal *e, doublereal *q, integer *ldq, doublereal *pt, integer *ldpt, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgbcon_(char *norm, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbequ_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info); /* Subroutine */ int _starpu_dgbequb_(integer *m, integer *n, integer *kl, integer * ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info); /* Subroutine */ int _starpu_dgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbtf2_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgbtrf_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *scale, integer *m, doublereal *v, integer * ldv, integer *info); /* Subroutine */ int _starpu_dgebal_(char *job, integer *n, doublereal *a, integer * lda, integer *ilo, integer *ihi, doublereal *scale, integer *info); /* Subroutine */ int _starpu_dgebd2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgebrd_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgecon_(char *norm, integer *n, doublereal *a, integer * lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgeequ_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dgeequb_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dgees_(char *jobvs, char *sort, L_fp select, integer *n, doublereal *a, integer *lda, integer *sdim, doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, doublereal *work, integer *lwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, doublereal *a, integer *lda, integer *sdim, doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, doublereal *rconde, doublereal *rcondv, doublereal *work, integer * lwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dgeev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublereal *a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgegs_(char *jobvsl, char *jobvsr, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgegv_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgehd2_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgehrd_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgejsv_(char *joba, char *jobu, char *jobv, char *jobr, char *jobt, char *jobp, integer *m, integer *n, doublereal *a, integer *lda, doublereal *sva, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgelq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgelqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgels_(char *trans, integer *m, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgelsd_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgelss_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgelsx_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * info); /* Subroutine */ int _starpu_dgelsy_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_dgeql2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgeqlf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgeqp3_(integer *m, integer *n, doublereal *a, integer * lda, integer *jpvt, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgeqpf_(integer *m, integer *n, doublereal *a, integer * lda, integer *jpvt, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgeqr2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgeqrf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgerfs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgerq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgerqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgesc2_(integer *n, doublereal *a, integer *lda, doublereal *rhs, integer *ipiv, integer *jpiv, doublereal *scale); /* Subroutine */ int _starpu_dgesdd_(char *jobz, integer *m, integer *n, doublereal * a, integer *lda, doublereal *s, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgesvj_(char *joba, char *jobu, char *jobv, integer *m, integer *n, doublereal *a, integer *lda, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgesvx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgetc2_(integer *n, doublereal *a, integer *lda, integer *ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_dgetf2_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgetri_(integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgetrs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_dggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, doublereal *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_dggbal_(char *job, integer *n, doublereal *a, integer * lda, doublereal *b, integer *ldb, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *work, integer * info); /* Subroutine */ int _starpu_dgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, integer *lwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *rconde, doublereal * rcondv, doublereal *work, integer *lwork, integer *iwork, integer * liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dggev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * rcondv, doublereal *work, integer *lwork, integer *iwork, logical * bwork, integer *info); /* Subroutine */ int _starpu_dggglm_(integer *n, integer *m, integer *p, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *d__, doublereal *x, doublereal *y, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *q, integer *ldq, doublereal *z__, integer * ldz, integer *info); /* Subroutine */ int _starpu_dgglse_(integer *m, integer *n, integer *p, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, doublereal *d__, doublereal *x, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggqrf_(integer *n, integer *m, integer *p, doublereal * a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, doublereal *taub, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggrqf_(integer *m, integer *p, integer *n, doublereal * a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, doublereal *taub, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer *ldq, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *tola, doublereal *tolb, integer *k, integer *l, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer *ldq, integer *iwork, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgsvj0_(char *jobv, integer *m, integer *n, doublereal * a, integer *lda, doublereal *d__, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *eps, doublereal *sfmin, doublereal *tol, integer *nsweep, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgsvj1_(char *jobv, integer *m, integer *n, integer *n1, doublereal *a, integer *lda, doublereal *d__, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *eps, doublereal *sfmin, doublereal *tol, integer *nsweep, doublereal *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_dgtcon_(char *norm, integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgtrfs_(char *trans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_dgtsv_(integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal * dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgttrf_(integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgttrs_(char *trans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgtts2_(integer *itrans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dhgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *t, integer *ldt, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dhsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer * ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_dhseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); logical _starpu_disnan_(doublereal *din); /* Subroutine */ int _starpu_dla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublereal *ab, integer * ldab, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_dla_gbrcond__(char *trans, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_dla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal * y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info); doublereal _starpu_dla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb); /* Subroutine */ int _starpu_dla_geamv__(integer *trans, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_dla_gercond__(char *trans, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_dla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer * ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal * dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info); /* Subroutine */ int _starpu_dla_lin_berr__(integer *n, integer *nz, integer *nrhs, doublereal *res, doublereal *ayb, doublereal *berr); doublereal _starpu_dla_porcond__(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_dla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal * af, integer *ldaf, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal * y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_dla_porpvgrw__(char *uplo, integer *ncols, doublereal *a, integer * lda, doublereal *af, integer *ldaf, doublereal *work, ftnlen uplo_len); doublereal _starpu_dla_rpvgrw__(integer *n, integer *ncols, doublereal *a, integer * lda, doublereal *af, integer *ldaf); /* Subroutine */ int _starpu_dla_syamv__(integer *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_dla_syrcond__(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_dla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal * af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal * berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal * errs_c__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_dla_syrpvgrw__(char *uplo, integer *n, integer *info, doublereal * a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len); /* Subroutine */ int _starpu_dla_wwaddw__(integer *n, doublereal *x, doublereal *y, doublereal *w); /* Subroutine */ int _starpu_dlabad_(doublereal *small, doublereal *large); /* Subroutine */ int _starpu_dlabrd_(integer *m, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer *ldy); /* Subroutine */ int _starpu_dlacn2_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_dlacon_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase); /* Subroutine */ int _starpu_dlacpy_(char *uplo, integer *m, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dladiv_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p, doublereal *q); /* Subroutine */ int _starpu_dlae2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2); /* Subroutine */ int _starpu_dlaebz_(integer *ijob, integer *nitmax, integer *n, integer *mmax, integer *minp, integer *nbmin, doublereal *abstol, doublereal *reltol, doublereal *pivmin, doublereal *d__, doublereal * e, doublereal *e2, integer *nval, doublereal *ab, doublereal *c__, integer *mout, integer *nab, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed0_(integer *icompq, integer *qsiz, integer *n, doublereal *d__, doublereal *e, doublereal *q, integer *ldq, doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed1_(integer *n, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed2_(integer *k, integer *n, integer *n1, doublereal * d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, integer *indx, integer *indxc, integer *indxp, integer *coltyp, integer *info); /* Subroutine */ int _starpu_dlaed3_(integer *k, integer *n, integer *n1, doublereal * d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, doublereal *q2, integer *indx, integer *ctot, doublereal *w, doublereal *s, integer *info); /* Subroutine */ int _starpu_dlaed4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, integer *info); /* Subroutine */ int _starpu_dlaed5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam); /* Subroutine */ int _starpu_dlaed6_(integer *kniter, logical *orgati, doublereal * rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * tau, integer *info); /* Subroutine */ int _starpu_dlaed7_(integer *icompq, integer *n, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed8_(integer *icompq, integer *k, integer *n, integer *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer *indx, integer *info); /* Subroutine */ int _starpu_dlaed9_(integer *k, integer *kstart, integer *kstop, integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, integer *info); /* Subroutine */ int _starpu_dlaeda_(integer *n, integer *tlvls, integer *curlvl, integer *curpbm, integer *prmptr, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, doublereal *z__, doublereal *ztemp, integer *info); /* Subroutine */ int _starpu_dlaein_(logical *rightv, logical *noinit, integer *n, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *vr, doublereal *vi, doublereal *b, integer *ldb, doublereal *work, doublereal *eps3, doublereal *smlnum, doublereal * bignum, integer *info); /* Subroutine */ int _starpu_dlaev2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1); /* Subroutine */ int _starpu_dlaexc_(logical *wantq, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, integer *j1, integer *n1, integer *n2, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlag2_(doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *safmin, doublereal *scale1, doublereal * scale2, doublereal *wr1, doublereal *wr2, doublereal *wi); /* Subroutine */ int _starpu_dlag2s_(integer *m, integer *n, doublereal *a, integer * lda, real *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_dlags2_(logical *upper, doublereal *a1, doublereal *a2, doublereal *a3, doublereal *b1, doublereal *b2, doublereal *b3, doublereal *csu, doublereal *snu, doublereal *csv, doublereal *snv, doublereal *csq, doublereal *snq); /* Subroutine */ int _starpu_dlagtf_(integer *n, doublereal *a, doublereal *lambda, doublereal *b, doublereal *c__, doublereal *tol, doublereal *d__, integer *in, integer *info); /* Subroutine */ int _starpu_dlagtm_(char *trans, integer *n, integer *nrhs, doublereal *alpha, doublereal *dl, doublereal *d__, doublereal *du, doublereal *x, integer *ldx, doublereal *beta, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dlagts_(integer *job, integer *n, doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, integer *in, doublereal *y, doublereal *tol, integer *info); /* Subroutine */ int _starpu_dlagv2_(doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *csl, doublereal *snl, doublereal *csr, doublereal * snr); /* Subroutine */ int _starpu_dlahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_dlahr2_(integer *n, integer *k, integer *nb, doublereal * a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, doublereal *y, integer *ldy); /* Subroutine */ int _starpu_dlahrd_(integer *n, integer *k, integer *nb, doublereal * a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, doublereal *y, integer *ldy); /* Subroutine */ int _starpu_dlaic1_(integer *job, integer *j, doublereal *x, doublereal *sest, doublereal *w, doublereal *gamma, doublereal * sestpr, doublereal *s, doublereal *c__); logical _starpu_dlaisnan_(doublereal *din1, doublereal *din2); /* Subroutine */ int _starpu_dlaln2_(logical *ltrans, integer *na, integer *nw, doublereal *smin, doublereal *ca, doublereal *a, integer *lda, doublereal *d1, doublereal *d2, doublereal *b, integer *ldb, doublereal *wr, doublereal *wi, doublereal *x, integer *ldx, doublereal *scale, doublereal *xnorm, integer *info); /* Subroutine */ int _starpu_dlals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * k, doublereal *c__, doublereal *s, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal * poles, integer *givptr, integer *givcol, integer *ldgcol, integer * perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, doublereal *rcond, integer *rank, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlamrg_(integer *n1, integer *n2, doublereal *a, integer *dtrd1, integer *dtrd2, integer *index); integer _starpu_dlaneg_(integer *n, doublereal *d__, doublereal *lld, doublereal * sigma, doublereal *pivmin, integer *r__); doublereal _starpu_dlangb_(char *norm, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *work); doublereal _starpu_dlange_(char *norm, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work); doublereal _starpu_dlangt_(char *norm, integer *n, doublereal *dl, doublereal *d__, doublereal *du); doublereal _starpu_dlanhs_(char *norm, integer *n, doublereal *a, integer *lda, doublereal *work); doublereal _starpu_dlansb_(char *norm, char *uplo, integer *n, integer *k, doublereal *ab, integer *ldab, doublereal *work); doublereal _starpu_dlansf_(char *norm, char *transr, char *uplo, integer *n, doublereal *a, doublereal *work); doublereal _starpu_dlansp_(char *norm, char *uplo, integer *n, doublereal *ap, doublereal *work); doublereal _starpu_dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e); doublereal _starpu_dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *work); doublereal _starpu_dlantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, doublereal *ab, integer *ldab, doublereal *work); doublereal _starpu_dlantp_(char *norm, char *uplo, char *diag, integer *n, doublereal *ap, doublereal *work); doublereal _starpu_dlantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work); /* Subroutine */ int _starpu_dlanv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *rt1r, doublereal *rt1i, doublereal *rt2r, doublereal *rt2i, doublereal *cs, doublereal *sn); /* Subroutine */ int _starpu_dlapll_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *ssmin); /* Subroutine */ int _starpu_dlapmt_(logical *forwrd, integer *m, integer *n, doublereal *x, integer *ldx, integer *k); doublereal _starpu_dlapy2_(doublereal *x, doublereal *y); doublereal _starpu_dlapy3_(doublereal *x, doublereal *y, doublereal *z__); /* Subroutine */ int _starpu_dlaqgb_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqge_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqp2_(integer *m, integer *n, integer *offset, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *work); /* Subroutine */ int _starpu_dlaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *auxv, doublereal *f, integer *ldf); /* Subroutine */ int _starpu_dlaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dlaqr1_(integer *n, doublereal *h__, integer *ldh, doublereal *sr1, doublereal *si1, doublereal *sr2, doublereal *si2, doublereal *v); /* Subroutine */ int _starpu_dlaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork); /* Subroutine */ int _starpu_dlaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork); /* Subroutine */ int _starpu_dlaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dlaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, doublereal *sr, doublereal *si, doublereal *h__, integer *ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *v, integer * ldv, doublereal *u, integer *ldu, integer *nv, doublereal *wv, integer *ldwv, integer *nh, doublereal *wh, integer *ldwh); /* Subroutine */ int _starpu_dlaqsb_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqsp_(char *uplo, integer *n, doublereal *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqsy_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqtr_(logical *ltran, logical *lreal, integer *n, doublereal *t, integer *ldt, doublereal *b, doublereal *w, doublereal *scale, doublereal *x, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlar1v_(integer *n, integer *b1, integer *bn, doublereal *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * lld, doublereal *pivmin, doublereal *gaptol, doublereal *z__, logical *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, doublereal *rqcorr, doublereal *work); /* Subroutine */ int _starpu_dlar2v_(integer *n, doublereal *x, doublereal *y, doublereal *z__, integer *incx, doublereal *c__, doublereal *s, integer *incc); /* Subroutine */ int _starpu_dlarf_(char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, doublereal *v, integer * ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, doublereal *work, integer *ldwork); /* Subroutine */ int _starpu_dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau); /* Subroutine */ int _starpu_dlarfp_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau); /* Subroutine */ int _starpu_dlarft_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt); /* Subroutine */ int _starpu_dlarfx_(char *side, integer *m, integer *n, doublereal * v, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlargv_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *c__, integer *incc); /* Subroutine */ int _starpu_dlarnv_(integer *idist, integer *iseed, integer *n, doublereal *x); /* Subroutine */ int _starpu_dlarra_(integer *n, doublereal *d__, doublereal *e, doublereal *e2, doublereal *spltol, doublereal *tnrm, integer *nsplit, integer *isplit, integer *info); /* Subroutine */ int _starpu_dlarrb_(integer *n, doublereal *d__, doublereal *lld, integer *ifirst, integer *ilast, doublereal *rtol1, doublereal *rtol2, integer *offset, doublereal *w, doublereal *wgap, doublereal *werr, doublereal *work, integer *iwork, doublereal *pivmin, doublereal * spdiam, integer *twist, integer *info); /* Subroutine */ int _starpu_dlarrc_(char *jobt, integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *e, doublereal *pivmin, integer *eigcnt, integer *lcnt, integer *rcnt, integer *info); /* Subroutine */ int _starpu_dlarrd_(char *range, char *order, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *gers, doublereal *reltol, doublereal *d__, doublereal *e, doublereal *e2, doublereal *pivmin, integer *nsplit, integer *isplit, integer *m, doublereal *w, doublereal *werr, doublereal *wl, doublereal *wu, integer *iblock, integer *indexw, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlarre_(char *range, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *d__, doublereal *e, doublereal *e2, doublereal *rtol1, doublereal *rtol2, doublereal * spltol, integer *nsplit, integer *isplit, integer *m, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublereal *pivmin, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dlarrf_(integer *n, doublereal *d__, doublereal *l, doublereal *ld, integer *clstrt, integer *clend, doublereal *w, doublereal *wgap, doublereal *werr, doublereal *spdiam, doublereal * clgapl, doublereal *clgapr, doublereal *pivmin, doublereal *sigma, doublereal *dplus, doublereal *lplus, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlarrj_(integer *n, doublereal *d__, doublereal *e2, integer *ifirst, integer *ilast, doublereal *rtol, integer *offset, doublereal *w, doublereal *werr, doublereal *work, integer *iwork, doublereal *pivmin, doublereal *spdiam, integer *info); /* Subroutine */ int _starpu_dlarrk_(integer *n, integer *iw, doublereal *gl, doublereal *gu, doublereal *d__, doublereal *e2, doublereal *pivmin, doublereal *reltol, doublereal *w, doublereal *werr, integer *info); /* Subroutine */ int _starpu_dlarrr_(integer *n, doublereal *d__, doublereal *e, integer *info); /* Subroutine */ int _starpu_dlarrv_(integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, integer *m, integer *dol, integer *dou, doublereal *minrgp, doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlarscl2_(integer *m, integer *n, doublereal *d__, doublereal *x, integer *ldx); /* Subroutine */ int _starpu_dlartg_(doublereal *f, doublereal *g, doublereal *cs, doublereal *sn, doublereal *r__); /* Subroutine */ int _starpu_dlartv_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *c__, doublereal *s, integer *incc); /* Subroutine */ int _starpu_dlaruv_(integer *iseed, integer *n, doublereal *x); /* Subroutine */ int _starpu_dlarz_(char *side, integer *m, integer *n, integer *l, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, doublereal *v, integer *ldv, doublereal *t, integer *ldt, doublereal *c__, integer * ldc, doublereal *work, integer *ldwork); /* Subroutine */ int _starpu_dlarzt_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt); /* Subroutine */ int _starpu_dlas2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax); /* Subroutine */ int _starpu_dlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_dlascl2_(integer *m, integer *n, doublereal *d__, doublereal *x, integer *ldx); /* Subroutine */ int _starpu_dlasd0_(integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer * ldvt, integer *smlsiz, integer *iwork, doublereal *work, integer * info); /* Subroutine */ int _starpu_dlasd1_(integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, integer *idxq, integer * iwork, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasd2_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, doublereal *alpha, doublereal * beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *dsigma, doublereal *u2, integer *ldu2, doublereal *vt2, integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer * idxq, integer *coltyp, integer *info); /* Subroutine */ int _starpu_dlasd3_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *q, integer *ldq, doublereal *dsigma, doublereal *u, integer *ldu, doublereal *u2, integer *ldu2, doublereal *vt, integer *ldvt, doublereal *vt2, integer *ldvt2, integer *idxc, integer *ctot, doublereal *z__, integer *info); /* Subroutine */ int _starpu_dlasd4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal * sigma, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasd5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * work); /* Subroutine */ int _starpu_dlasd6_(integer *icompq, integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlasd7_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *c__, doublereal *s, integer *info); /* Subroutine */ int _starpu_dlasd8_(integer *icompq, integer *k, doublereal *d__, doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * work, integer *info); /* Subroutine */ int _starpu_dlasda_(integer *icompq, integer *smlsiz, integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlasdq_(char *uplo, integer *sqre, integer *n, integer * ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasdt_(integer *n, integer *lvl, integer *nd, integer * inode, integer *ndiml, integer *ndimr, integer *msub); /* Subroutine */ int _starpu_dlaset_(char *uplo, integer *m, integer *n, doublereal * alpha, doublereal *beta, doublereal *a, integer *lda); /* Subroutine */ int _starpu_dlasq1_(integer *n, doublereal *d__, doublereal *e, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasq2_(integer *n, doublereal *z__, integer *info); /* Subroutine */ int _starpu_dlasq3_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, doublereal *tau); /* Subroutine */ int _starpu_dlasq4_(integer *i0, integer *n0, doublereal *z__, integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *tau, integer *ttype, doublereal *g); /* Subroutine */ int _starpu_dlasq5_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *tau, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2, logical *ieee); /* Subroutine */ int _starpu_dlasq6_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2); /* Subroutine */ int _starpu_dlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * lda); /* Subroutine */ int _starpu_dlasrt_(char *id, integer *n, doublereal *d__, integer * info); /* Subroutine */ int _starpu_dlassq_(integer *n, doublereal *x, integer *incx, doublereal *scale, doublereal *sumsq); /* Subroutine */ int _starpu_dlasv2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * csr, doublereal *snl, doublereal *csl); /* Subroutine */ int _starpu_dlaswp_(integer *n, doublereal *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_dlasy2_(logical *ltranl, logical *ltranr, integer *isgn, integer *n1, integer *n2, doublereal *tl, integer *ldtl, doublereal * tr, integer *ldtr, doublereal *b, integer *ldb, doublereal *scale, doublereal *x, integer *ldx, doublereal *xnorm, integer *info); /* Subroutine */ int _starpu_dlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublereal *a, integer *lda, integer *ipiv, doublereal *w, integer * ldw, integer *info); /* Subroutine */ int _starpu_dlat2s_(char *uplo, integer *n, doublereal *a, integer * lda, real *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_dlatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_dlatdf_(integer *ijob, integer *n, doublereal *z__, integer *ldz, doublereal *rhs, doublereal *rdsum, doublereal *rdscal, integer *ipiv, integer *jpiv); /* Subroutine */ int _starpu_dlatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublereal *ap, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_dlatrd_(char *uplo, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, integer *ldw); /* Subroutine */ int _starpu_dlatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublereal *a, integer *lda, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_dlatrz_(integer *m, integer *n, integer *l, doublereal * a, integer *lda, doublereal *tau, doublereal *work); /* Subroutine */ int _starpu_dlatzm_(char *side, integer *m, integer *n, doublereal * v, integer *incv, doublereal *tau, doublereal *c1, doublereal *c2, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlauu2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dlauum_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dopgtr_(char *uplo, integer *n, doublereal *ap, doublereal *tau, doublereal *q, integer *ldq, doublereal *work, integer *info); /* Subroutine */ int _starpu_dopmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *ap, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorg2l_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorg2r_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorgbr_(char *vect, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorghr_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgl2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorglq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgql_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgqr_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgr2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorgrq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgtr_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal * tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormql_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormr2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormrq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dpbcon_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *anorm, doublereal *rcond, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dpbequ_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_dpbstf_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_dpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, char *equed, doublereal *s, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dpbtf2_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_dpbtrf_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_dpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpftrf_(char *transr, char *uplo, integer *n, doublereal *a, integer *info); /* Subroutine */ int _starpu_dpftri_(char *transr, char *uplo, integer *n, doublereal *a, integer *info); /* Subroutine */ int _starpu_dpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, doublereal *a, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpocon_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dpoequ_(integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dpoequb_(integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dporfs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_dporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dposvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal * berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal * berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dpotf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dpotrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dpotri_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dpotrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dppcon_(char *uplo, integer *n, doublereal *ap, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dppequ_(char *uplo, integer *n, doublereal *ap, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dpprfs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *afp, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dppsv_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *ap, doublereal *afp, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dpptrf_(char *uplo, integer *n, doublereal *ap, integer * info); /* Subroutine */ int _starpu_dpptri_(char *uplo, integer *n, doublereal *ap, integer * info); /* Subroutine */ int _starpu_dpptrs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpstf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_dpstrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_dptcon_(integer *n, doublereal *d__, doublereal *e, doublereal *anorm, doublereal *rcond, doublereal *work, integer *info); /* Subroutine */ int _starpu_dpteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dptrfs_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *info); /* Subroutine */ int _starpu_dptsv_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dptsvx_(char *fact, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * info); /* Subroutine */ int _starpu_dpttrf_(integer *n, doublereal *d__, doublereal *e, integer *info); /* Subroutine */ int _starpu_dpttrs_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dptts2_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_drscl_(integer *n, doublereal *sa, doublereal *sx, integer *incx); /* Subroutine */ int _starpu_dsbev_(char *jobz, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsbevd_(char *jobz, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *q, integer * ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *x, integer *ldx, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal * bb, integer *ldbb, doublereal *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsbtrd_(char *vect, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *d__, doublereal *e, doublereal *q, integer *ldq, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c__); /* Subroutine */ int _starpu__starpu_dsgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *work, real *swork, integer *iter, integer *info); /* Subroutine */ int _starpu_dspcon_(char *uplo, integer *n, doublereal *ap, integer * ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dspev_(char *jobz, char *uplo, integer *n, doublereal * ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dspevd_(char *jobz, char *uplo, integer *n, doublereal * ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dspevx_(char *jobz, char *range, char *uplo, integer *n, doublereal *ap, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dspgst_(integer *itype, char *uplo, integer *n, doublereal *ap, doublereal *bp, integer *info); /* Subroutine */ int _starpu_dspgv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dspgvd_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dspgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublereal *ap, doublereal *bp, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu__starpu_dsposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *work, real *swork, integer *iter, integer *info); /* Subroutine */ int _starpu_dsprfs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dspsv_(char *uplo, integer *n, integer *nrhs, doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsptrd_(char *uplo, integer *n, doublereal *ap, doublereal *d__, doublereal *e, doublereal *tau, integer *info); /* Subroutine */ int _starpu_dsptrf_(char *uplo, integer *n, doublereal *ap, integer * ipiv, integer *info); /* Subroutine */ int _starpu_dsptri_(char *uplo, integer *n, doublereal *ap, integer * ipiv, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsptrs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dstebz_(char *range, char *order, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, doublereal *d__, doublereal *e, integer *m, integer *nsplit, doublereal *w, integer *iblock, integer *isplit, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstegr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstein_(integer *n, doublereal *d__, doublereal *e, integer *m, doublereal *w, integer *iblock, integer *isplit, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dstemr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsterf_(integer *n, doublereal *d__, doublereal *e, integer *info); /* Subroutine */ int _starpu_dstev_(char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dstevd_(char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstevr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstevx_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsycon_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsyequb_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *s, doublereal *scond, doublereal *amax, doublereal * work, integer *info); /* Subroutine */ int _starpu_dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsyevd_(char *jobz, char *uplo, integer *n, doublereal * a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsyevr_(char *jobz, char *range, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsyevx_(char *jobz, char *range, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsygs2_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dsygst_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dsygv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsygvd_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsygvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsyrfs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsysv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsysvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *s, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal * rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal * err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsytd2_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info); /* Subroutine */ int _starpu_dsytf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dsytrd_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsytrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsytri_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsytrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_dtbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dtfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dtftri_(char *transr, char *uplo, char *diag, integer *n, doublereal *a, integer *info); /* Subroutine */ int _starpu_dtfttp_(char *transr, char *uplo, integer *n, doublereal *arf, doublereal *ap, integer *info); /* Subroutine */ int _starpu_dtfttr_(char *transr, char *uplo, integer *n, doublereal *arf, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtgevc_(char *side, char *howmny, logical *select, integer *n, doublereal *s, integer *lds, doublereal *p, integer *ldp, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer *info); /* Subroutine */ int _starpu_dtgex2_(logical *wantq, logical *wantz, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * q, integer *ldq, doublereal *z__, integer *ldz, integer *j1, integer * n1, integer *n2, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dtgexc_(logical *wantq, logical *wantz, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * q, integer *ldq, doublereal *z__, integer *ldz, integer *ifst, integer *ilst, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dtgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, doublereal *a, integer *lda, doublereal * b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, integer *m, doublereal *pl, doublereal *pr, doublereal *dif, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dtgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *tola, doublereal *tolb, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer * ldq, doublereal *work, integer *ncycle, integer *info); /* Subroutine */ int _starpu_dtgsna_(char *job, char *howmny, logical *select, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *dif, integer *mm, integer *m, doublereal * work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtgsy2_(char *trans, integer *ijob, integer *m, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * scale, doublereal *rdsum, doublereal *rdscal, integer *iwork, integer *pq, integer *info); /* Subroutine */ int _starpu_dtgsyl_(char *trans, integer *ijob, integer *m, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * scale, doublereal *dif, doublereal *work, integer *lwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_dtpcon_(char *norm, char *uplo, char *diag, integer *n, doublereal *ap, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtptri_(char *uplo, char *diag, integer *n, doublereal * ap, integer *info); /* Subroutine */ int _starpu_dtptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dtpttf_(char *transr, char *uplo, integer *n, doublereal *ap, doublereal *arf, integer *info); /* Subroutine */ int _starpu_dtpttr_(char *uplo, integer *n, doublereal *ap, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtrcon_(char *norm, char *uplo, char *diag, integer *n, doublereal *a, integer *lda, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtrevc_(char *side, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer *info); /* Subroutine */ int _starpu_dtrexc_(char *compq, integer *n, doublereal *t, integer * ldt, doublereal *q, integer *ldq, integer *ifst, integer *ilst, doublereal *work, integer *info); /* Subroutine */ int _starpu_dtrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtrsen_(char *job, char *compq, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, doublereal *wr, doublereal *wi, integer *m, doublereal *s, doublereal *sep, doublereal *work, integer *lwork, integer *iwork, integer * liwork, integer *info); /* Subroutine */ int _starpu_dtrsna_(char *job, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *sep, integer *mm, integer *m, doublereal *work, integer *ldwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_dtrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, doublereal *a, integer *lda, doublereal *b, integer * ldb, doublereal *c__, integer *ldc, doublereal *scale, integer *info); /* Subroutine */ int _starpu_dtrti2_(char *uplo, char *diag, integer *n, doublereal * a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtrtri_(char *uplo, char *diag, integer *n, doublereal * a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_dtrttf_(char *transr, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *arf, integer *info); /* Subroutine */ int _starpu_dtrttp_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *ap, integer *info); /* Subroutine */ int _starpu_dtzrqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, integer *info); /* Subroutine */ int _starpu_dtzrzf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); doublereal _starpu_dzsum1_(integer *n, doublecomplex *cx, integer *incx); integer _starpu_icmax1_(integer *n, complex *cx, integer *incx); integer _starpu_ieeeck_(integer *ispec, real *zero, real *one); integer _starpu_ilaclc_(integer *m, integer *n, complex *a, integer *lda); integer _starpu_ilaclr_(integer *m, integer *n, complex *a, integer *lda); integer _starpu_iladiag_(char *diag); integer _starpu_iladlc_(integer *m, integer *n, doublereal *a, integer *lda); integer _starpu_iladlr_(integer *m, integer *n, doublereal *a, integer *lda); integer _starpu_ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, integer *n4); integer _starpu_ilaprec_(char *prec); integer _starpu_ilaslc_(integer *m, integer *n, real *a, integer *lda); integer _starpu_ilaslr_(integer *m, integer *n, real *a, integer *lda); integer _starpu_ilatrans_(char *trans); integer _starpu_ilauplo_(char *uplo); /* Subroutine */ int _starpu_ilaver_(integer *vers_major__, integer *vers_minor__, integer *vers_patch__); integer _starpu_ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda); integer _starpu_ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda); integer _starpu_iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer *ilo, integer *ihi, integer *lwork); integer _starpu_izmax1_(integer *n, doublecomplex *cx, integer *incx); logical _starpu_lsamen_(integer *n, char *ca, char *cb); integer _starpu_smaxloc_(real *a, integer *dimm); /* Subroutine */ int _starpu_sbdsdc_(char *uplo, char *compq, integer *n, real *d__, real *e, real *u, integer *ldu, real *vt, integer *ldvt, real *q, integer *iq, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, real *d__, real *e, real *vt, integer *ldvt, real * u, integer *ldu, real *c__, integer *ldc, real *work, integer *info); doublereal _starpu_scsum1_(integer *n, complex *cx, integer *incx); /* Subroutine */ int _starpu_sdisna_(char *job, integer *m, integer *n, real *d__, real *sep, integer *info); /* Subroutine */ int _starpu_sgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, real *ab, integer *ldab, real *d__, real * e, real *q, integer *ldq, real *pt, integer *ldpt, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sgbcon_(char *norm, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbequ_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real * colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgbequb_(integer *m, integer *n, integer *kl, integer * ku, real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real * ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, real *ab, integer *ldab, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real * rpvgrw, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbtf2_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgbtrf_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, real *ab, integer *ldab, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *scale, integer *m, real *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_sgebal_(char *job, integer *n, real *a, integer *lda, integer *ilo, integer *ihi, real *scale, integer *info); /* Subroutine */ int _starpu_sgebd2_(integer *m, integer *n, real *a, integer *lda, real *d__, real *e, real *tauq, real *taup, real *work, integer *info); /* Subroutine */ int _starpu_sgebrd_(integer *m, integer *n, real *a, integer *lda, real *d__, real *e, real *tauq, real *taup, real *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_sgecon_(char *norm, integer *n, real *a, integer *lda, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgeequ_(integer *m, integer *n, real *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgeequb_(integer *m, integer *n, real *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgees_(char *jobvs, char *sort, L_fp select, integer *n, real *a, integer *lda, integer *sdim, real *wr, real *wi, real *vs, integer *ldvs, real *work, integer *lwork, logical *bwork, integer * info); /* Subroutine */ int _starpu_sgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, real *a, integer *lda, integer *sdim, real *wr, real *wi, real *vs, integer *ldvs, real *rconde, real *rcondv, real * work, integer *lwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sgeev_(char *jobvl, char *jobvr, integer *n, real *a, integer *lda, real *wr, real *wi, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, real *a, integer *lda, real *wr, real *wi, real * vl, integer *ldvl, real *vr, integer *ldvr, integer *ilo, integer * ihi, real *scale, real *abnrm, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgegs_(char *jobvsl, char *jobvsr, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgegv_(char *jobvl, char *jobvr, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgehd2_(integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgehrd_(integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgejsv_(char *joba, char *jobu, char *jobv, char *jobr, char *jobt, char *jobp, integer *m, integer *n, real *a, integer *lda, real *sva, real *u, integer *ldu, real *v, integer *ldv, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgelq2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgelqf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgels_(char *trans, integer *m, integer *n, integer * nrhs, real *a, integer *lda, real *b, integer *ldb, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgelsd_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *s, real *rcond, integer * rank, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgelss_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *s, real *rcond, integer * rank, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgelsx_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, real *work, integer *info); /* Subroutine */ int _starpu_sgelsy_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeql2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgeqlf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeqp3_(integer *m, integer *n, real *a, integer *lda, integer *jpvt, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeqpf_(integer *m, integer *n, real *a, integer *lda, integer *jpvt, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgeqr2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgeqrf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgerfs_(char *trans, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgerq2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgerqf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgesc2_(integer *n, real *a, integer *lda, real *rhs, integer *ipiv, integer *jpiv, real *scale); /* Subroutine */ int _starpu_sgesdd_(char *jobz, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgesv_(integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgesvd_(char *jobu, char *jobvt, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgesvj_(char *joba, char *jobu, char *jobv, integer *m, integer *n, real *a, integer *lda, real *sva, integer *mv, real *v, integer *ldv, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgesvx_(char *fact, char *trans, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgetc2_(integer *n, real *a, integer *lda, integer *ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_sgetf2_(integer *m, integer *n, real *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgetrf_(integer *m, integer *n, real *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgetri_(integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgetrs_(char *trans, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *lscale, real *rscale, integer *m, real *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_sggbal_(char *job, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *ilo, integer *ihi, real *lscale, real *rscale, real *work, integer *info); /* Subroutine */ int _starpu_sgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *sdim, real *alphar, real *alphai, real *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real *work, integer *lwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *sdim, real *alphar, real *alphai, real *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, integer * liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sggev_(char *jobvl, char *jobvr, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *ilo, integer *ihi, real *lscale, real *rscale, real *abnrm, real *bbnrm, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sggglm_(integer *n, integer *m, integer *p, real *a, integer *lda, real *b, integer *ldb, real *d__, real *x, real *y, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, real *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_sgglse_(integer *m, integer *n, integer *p, real *a, integer *lda, real *b, integer *ldb, real *c__, real *d__, real *x, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggqrf_(integer *n, integer *m, integer *p, real *a, integer *lda, real *taua, real *b, integer *ldb, real *taub, real * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggrqf_(integer *m, integer *p, integer *n, real *a, integer *lda, real *taua, real *b, integer *ldb, real *taub, real * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, real *a, integer *lda, real *b, integer *ldb, real *alpha, real *beta, real *u, integer * ldu, real *v, integer *ldv, real *q, integer *ldq, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, real *a, integer *lda, real *b, integer *ldb, real *tola, real *tolb, integer *k, integer *l, real *u, integer *ldu, real *v, integer *ldv, real *q, integer *ldq, integer *iwork, real * tau, real *work, integer *info); /* Subroutine */ int _starpu_sgsvj0_(char *jobv, integer *m, integer *n, real *a, integer *lda, real *d__, real *sva, integer *mv, real *v, integer * ldv, real *eps, real *sfmin, real *tol, integer *nsweep, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgsvj1_(char *jobv, integer *m, integer *n, integer *n1, real *a, integer *lda, real *d__, real *sva, integer *mv, real *v, integer *ldv, real *eps, real *sfmin, real *tol, integer *nsweep, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgtcon_(char *norm, integer *n, real *dl, real *d__, real *du, real *du2, integer *ipiv, real *anorm, real *rcond, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgtrfs_(char *trans, integer *n, integer *nrhs, real *dl, real *d__, real *du, real *dlf, real *df, real *duf, real *du2, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real * ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgtsv_(integer *n, integer *nrhs, real *dl, real *d__, real *du, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, real *dl, real *d__, real *du, real *dlf, real *df, real *duf, real *du2, integer *ipiv, real *b, integer *ldb, real *x, integer * ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgttrf_(integer *n, real *dl, real *d__, real *du, real * du2, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgttrs_(char *trans, integer *n, integer *nrhs, real *dl, real *d__, real *du, real *du2, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgtts2_(integer *itrans, integer *n, integer *nrhs, real *dl, real *d__, real *du, real *du2, integer *ipiv, real *b, integer * ldb); /* Subroutine */ int _starpu_shgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *t, integer *ldt, real *alphar, real *alphai, real *beta, real *q, integer *ldq, real *z__, integer *ldz, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_shsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, real *h__, integer *ldh, real *wr, real *wi, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real *work, integer *ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_shseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real *wi, real *z__, integer *ldz, real *work, integer *lwork, integer *info); logical _starpu_sisnan_(real *sin__); /* Subroutine */ int _starpu_sla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, real *alpha, real *ab, integer *ldab, real * x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_sla_gbrcond__(char *trans, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, integer *cmode, real *c__, integer *info, real *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_sla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, logical *colequ, real *c__, real *b, integer *ldb, real *y, integer * ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real * errs_c__, real *res, real *ayb, real *dy, real *y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical * ignore_cwise__, integer *info); doublereal _starpu_sla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, real *ab, integer *ldab, real *afb, integer *ldafb); /* Subroutine */ int _starpu_sla_geamv__(integer *trans, integer *m, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_sla_gercond__(char *trans, integer *n, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, integer *cmode, real *c__, integer *info, real *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_sla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, real *a, integer *lda, real * af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, real *b, integer *ldb, real *y, integer *ldy, real *berr_out__, integer * n_norms__, real *errs_n__, real *errs_c__, real *res, real *ayb, real *dy, real *y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info); /* Subroutine */ int _starpu_sla_lin_berr__(integer *n, integer *nz, integer *nrhs, real *res, real *ayb, real *berr); doublereal _starpu_sla_porcond__(char *uplo, integer *n, real *a, integer *lda, real * af, integer *ldaf, integer *cmode, real *c__, integer *info, real * work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_sla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer * ldaf, logical *colequ, real *c__, real *b, integer *ldb, real *y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, real *res, real *ayb, real *dy, real *y_tail__, real * rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_sla_porpvgrw__(char *uplo, integer *ncols, real *a, integer *lda, real *af, integer *ldaf, real *work, ftnlen uplo_len); doublereal _starpu_sla_rpvgrw__(integer *n, integer *ncols, real *a, integer *lda, real *af, integer *ldaf); /* Subroutine */ int _starpu_sla_syamv__(integer *uplo, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_sla_syrcond__(char *uplo, integer *n, real *a, integer *lda, real * af, integer *ldaf, integer *ipiv, integer *cmode, real *c__, integer * info, real *work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_sla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer * ldaf, integer *ipiv, logical *colequ, real *c__, real *b, integer * ldb, real *y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, real *res, real *ayb, real *dy, real * y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_sla_syrpvgrw__(char *uplo, integer *n, integer *info, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *work, ftnlen uplo_len); /* Subroutine */ int _starpu_sla_wwaddw__(integer *n, real *x, real *y, real *w); /* Subroutine */ int _starpu_slabad_(real *small, real *large); /* Subroutine */ int _starpu_slabrd_(integer *m, integer *n, integer *nb, real *a, integer *lda, real *d__, real *e, real *tauq, real *taup, real *x, integer *ldx, real *y, integer *ldy); /* Subroutine */ int _starpu_slacn2_(integer *n, real *v, real *x, integer *isgn, real *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_slacon_(integer *n, real *v, real *x, integer *isgn, real *est, integer *kase); /* Subroutine */ int _starpu_slacpy_(char *uplo, integer *m, integer *n, real *a, integer *lda, real *b, integer *ldb); /* Subroutine */ int _starpu_sladiv_(real *a, real *b, real *c__, real *d__, real *p, real *q); /* Subroutine */ int _starpu_slae2_(real *a, real *b, real *c__, real *rt1, real *rt2); /* Subroutine */ int _starpu_slaebz_(integer *ijob, integer *nitmax, integer *n, integer *mmax, integer *minp, integer *nbmin, real *abstol, real * reltol, real *pivmin, real *d__, real *e, real *e2, integer *nval, real *ab, real *c__, integer *mout, integer *nab, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slaed0_(integer *icompq, integer *qsiz, integer *n, real *d__, real *e, real *q, integer *ldq, real *qstore, integer *ldqs, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slaed1_(integer *n, real *d__, real *q, integer *ldq, integer *indxq, real *rho, integer *cutpnt, real *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_slaed2_(integer *k, integer *n, integer *n1, real *d__, real *q, integer *ldq, integer *indxq, real *rho, real *z__, real * dlamda, real *w, real *q2, integer *indx, integer *indxc, integer * indxp, integer *coltyp, integer *info); /* Subroutine */ int _starpu_slaed3_(integer *k, integer *n, integer *n1, real *d__, real *q, integer *ldq, real *rho, real *dlamda, real *q2, integer * indx, integer *ctot, real *w, real *s, integer *info); /* Subroutine */ int _starpu_slaed4_(integer *n, integer *i__, real *d__, real *z__, real *delta, real *rho, real *dlam, integer *info); /* Subroutine */ int _starpu_slaed5_(integer *i__, real *d__, real *z__, real *delta, real *rho, real *dlam); /* Subroutine */ int _starpu_slaed6_(integer *kniter, logical *orgati, real *rho, real *d__, real *z__, real *finit, real *tau, integer *info); /* Subroutine */ int _starpu_slaed7_(integer *icompq, integer *n, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, real *d__, real *q, integer *ldq, integer *indxq, real *rho, integer *cutpnt, real * qstore, integer *qptr, integer *prmptr, integer *perm, integer * givptr, integer *givcol, real *givnum, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slaed8_(integer *icompq, integer *k, integer *n, integer *qsiz, real *d__, real *q, integer *ldq, integer *indxq, real *rho, integer *cutpnt, real *z__, real *dlamda, real *q2, integer *ldq2, real *w, integer *perm, integer *givptr, integer *givcol, real * givnum, integer *indxp, integer *indx, integer *info); /* Subroutine */ int _starpu_slaed9_(integer *k, integer *kstart, integer *kstop, integer *n, real *d__, real *q, integer *ldq, real *rho, real *dlamda, real *w, real *s, integer *lds, integer *info); /* Subroutine */ int _starpu_slaeda_(integer *n, integer *tlvls, integer *curlvl, integer *curpbm, integer *prmptr, integer *perm, integer *givptr, integer *givcol, real *givnum, real *q, integer *qptr, real *z__, real *ztemp, integer *info); /* Subroutine */ int _starpu_slaein_(logical *rightv, logical *noinit, integer *n, real *h__, integer *ldh, real *wr, real *wi, real *vr, real *vi, real *b, integer *ldb, real *work, real *eps3, real *smlnum, real *bignum, integer *info); /* Subroutine */ int _starpu_slaev2_(real *a, real *b, real *c__, real *rt1, real * rt2, real *cs1, real *sn1); /* Subroutine */ int _starpu_slaexc_(logical *wantq, integer *n, real *t, integer * ldt, real *q, integer *ldq, integer *j1, integer *n1, integer *n2, real *work, integer *info); /* Subroutine */ int _starpu_slag2_(real *a, integer *lda, real *b, integer *ldb, real *safmin, real *scale1, real *scale2, real *wr1, real *wr2, real * wi); /* Subroutine */ int _starpu_slag2d_(integer *m, integer *n, real *sa, integer *ldsa, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_slags2_(logical *upper, real *a1, real *a2, real *a3, real *b1, real *b2, real *b3, real *csu, real *snu, real *csv, real * snv, real *csq, real *snq); /* Subroutine */ int _starpu_slagtf_(integer *n, real *a, real *lambda, real *b, real *c__, real *tol, real *d__, integer *in, integer *info); /* Subroutine */ int _starpu_slagtm_(char *trans, integer *n, integer *nrhs, real * alpha, real *dl, real *d__, real *du, real *x, integer *ldx, real * beta, real *b, integer *ldb); /* Subroutine */ int _starpu_slagts_(integer *job, integer *n, real *a, real *b, real *c__, real *d__, integer *in, real *y, real *tol, integer *info); /* Subroutine */ int _starpu_slagv2_(real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *csl, real *snl, real * csr, real *snr); /* Subroutine */ int _starpu_slahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer * info); /* Subroutine */ int _starpu_slahr2_(integer *n, integer *k, integer *nb, real *a, integer *lda, real *tau, real *t, integer *ldt, real *y, integer *ldy); /* Subroutine */ int _starpu_slahrd_(integer *n, integer *k, integer *nb, real *a, integer *lda, real *tau, real *t, integer *ldt, real *y, integer *ldy); /* Subroutine */ int _starpu_slaic1_(integer *job, integer *j, real *x, real *sest, real *w, real *gamma, real *sestpr, real *s, real *c__); logical _starpu_slaisnan_(real *sin1, real *sin2); /* Subroutine */ int _starpu_slaln2_(logical *ltrans, integer *na, integer *nw, real * smin, real *ca, real *a, integer *lda, real *d1, real *d2, real *b, integer *ldb, real *wr, real *wi, real *x, integer *ldx, real *scale, real *xnorm, integer *info); /* Subroutine */ int _starpu_slals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, real *b, integer *ldb, real *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * difl, real *difr, real *z__, integer *k, real *c__, real *s, real * work, integer *info); /* Subroutine */ int _starpu_slalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, real *b, integer *ldb, real *bx, integer *ldbx, real * u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real * z__, real *poles, integer *givptr, integer *givcol, integer *ldgcol, integer *perm, real *givnum, real *c__, real *s, real *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_slalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb, real *rcond, integer *rank, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slamrg_(integer *n1, integer *n2, real *a, integer * strd1, integer *strd2, integer *index); integer _starpu_slaneg_(integer *n, real *d__, real *lld, real *sigma, real *pivmin, integer *r__); doublereal _starpu_slangb_(char *norm, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *work); doublereal _starpu_slange_(char *norm, integer *m, integer *n, real *a, integer *lda, real *work); doublereal _starpu_slangt_(char *norm, integer *n, real *dl, real *d__, real *du); doublereal _starpu_slanhs_(char *norm, integer *n, real *a, integer *lda, real *work); doublereal _starpu_slansb_(char *norm, char *uplo, integer *n, integer *k, real *ab, integer *ldab, real *work); doublereal _starpu_slansf_(char *norm, char *transr, char *uplo, integer *n, real *a, real *work); doublereal _starpu_slansp_(char *norm, char *uplo, integer *n, real *ap, real *work); doublereal _starpu_slanst_(char *norm, integer *n, real *d__, real *e); doublereal _starpu_slansy_(char *norm, char *uplo, integer *n, real *a, integer *lda, real *work); doublereal _starpu_slantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, real *ab, integer *ldab, real *work); doublereal _starpu_slantp_(char *norm, char *uplo, char *diag, integer *n, real *ap, real *work); doublereal _starpu_slantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, real *a, integer *lda, real *work); /* Subroutine */ int _starpu_slanv2_(real *a, real *b, real *c__, real *d__, real * rt1r, real *rt1i, real *rt2r, real *rt2i, real *cs, real *sn); /* Subroutine */ int _starpu_slapll_(integer *n, real *x, integer *incx, real *y, integer *incy, real *ssmin); /* Subroutine */ int _starpu_slapmt_(logical *forwrd, integer *m, integer *n, real *x, integer *ldx, integer *k); doublereal _starpu_slapy2_(real *x, real *y); doublereal _starpu_slapy3_(real *x, real *y, real *z__); /* Subroutine */ int _starpu_slaqgb_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real * colcnd, real *amax, char *equed); /* Subroutine */ int _starpu_slaqge_(integer *m, integer *n, real *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * equed); /* Subroutine */ int _starpu_slaqp2_(integer *m, integer *n, integer *offset, real *a, integer *lda, integer *jpvt, real *tau, real *vn1, real *vn2, real * work); /* Subroutine */ int _starpu_slaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, real *a, integer *lda, integer *jpvt, real *tau, real *vn1, real *vn2, real *auxv, real *f, integer *ldf); /* Subroutine */ int _starpu_slaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_slaqr1_(integer *n, real *h__, integer *ldh, real *sr1, real *si1, real *sr2, real *si2, real *v); /* Subroutine */ int _starpu_slaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, real *h__, integer *ldh, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer *ns, integer *nd, real *sr, real *si, real *v, integer *ldv, integer *nh, real *t, integer *ldt, integer *nv, real *wv, integer *ldwv, real * work, integer *lwork); /* Subroutine */ int _starpu_slaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, real *h__, integer *ldh, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer *ns, integer *nd, real *sr, real *si, real *v, integer *ldv, integer *nh, real *t, integer *ldt, integer *nv, real *wv, integer *ldwv, real * work, integer *lwork); /* Subroutine */ int _starpu_slaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_slaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, real *sr, real *si, real *h__, integer *ldh, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *v, integer *ldv, real *u, integer *ldu, integer *nv, real *wv, integer *ldwv, integer *nh, real *wh, integer * ldwh); /* Subroutine */ int _starpu_slaqsb_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_slaqsp_(char *uplo, integer *n, real *ap, real *s, real * scond, real *amax, char *equed); /* Subroutine */ int _starpu_slaqsy_(char *uplo, integer *n, real *a, integer *lda, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_slaqtr_(logical *ltran, logical *lreal, integer *n, real *t, integer *ldt, real *b, real *w, real *scale, real *x, real *work, integer *info); /* Subroutine */ int _starpu_slar1v_(integer *n, integer *b1, integer *bn, real * lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * gaptol, real *z__, logical *wantnc, integer *negcnt, real *ztz, real * mingma, integer *r__, integer *isuppz, real *nrminv, real *resid, real *rqcorr, real *work); /* Subroutine */ int _starpu_slar2v_(integer *n, real *x, real *y, real *z__, integer *incx, real *c__, real *s, integer *incc); /* Subroutine */ int _starpu_slarf_(char *side, integer *m, integer *n, real *v, integer *incv, real *tau, real *c__, integer *ldc, real *work); /* Subroutine */ int _starpu_slarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, real *v, integer *ldv, real *t, integer *ldt, real *c__, integer *ldc, real *work, integer * ldwork); /* Subroutine */ int _starpu_slarfg_(integer *n, real *alpha, real *x, integer *incx, real *tau); /* Subroutine */ int _starpu_slarfp_(integer *n, real *alpha, real *x, integer *incx, real *tau); /* Subroutine */ int _starpu_slarft_(char *direct, char *storev, integer *n, integer * k, real *v, integer *ldv, real *tau, real *t, integer *ldt); /* Subroutine */ int _starpu_slarfx_(char *side, integer *m, integer *n, real *v, real *tau, real *c__, integer *ldc, real *work); /* Subroutine */ int _starpu_slargv_(integer *n, real *x, integer *incx, real *y, integer *incy, real *c__, integer *incc); /* Subroutine */ int _starpu_slarnv_(integer *idist, integer *iseed, integer *n, real *x); /* Subroutine */ int _starpu_slarra_(integer *n, real *d__, real *e, real *e2, real * spltol, real *tnrm, integer *nsplit, integer *isplit, integer *info); /* Subroutine */ int _starpu_slarrb_(integer *n, real *d__, real *lld, integer * ifirst, integer *ilast, real *rtol1, real *rtol2, integer *offset, real *w, real *wgap, real *werr, real *work, integer *iwork, real * pivmin, real *spdiam, integer *twist, integer *info); /* Subroutine */ int _starpu_slarrc_(char *jobt, integer *n, real *vl, real *vu, real *d__, real *e, real *pivmin, integer *eigcnt, integer *lcnt, integer * rcnt, integer *info); /* Subroutine */ int _starpu_slarrd_(char *range, char *order, integer *n, real *vl, real *vu, integer *il, integer *iu, real *gers, real *reltol, real * d__, real *e, real *e2, real *pivmin, integer *nsplit, integer * isplit, integer *m, real *w, real *werr, real *wl, real *wu, integer * iblock, integer *indexw, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slarre_(char *range, integer *n, real *vl, real *vu, integer *il, integer *iu, real *d__, real *e, real *e2, real *rtol1, real *rtol2, real *spltol, integer *nsplit, integer *isplit, integer * m, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, real *gers, real *pivmin, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slarrf_(integer *n, real *d__, real *l, real *ld, integer *clstrt, integer *clend, real *w, real *wgap, real *werr, real *spdiam, real *clgapl, real *clgapr, real *pivmin, real *sigma, real *dplus, real *lplus, real *work, integer *info); /* Subroutine */ int _starpu_slarrj_(integer *n, real *d__, real *e2, integer *ifirst, integer *ilast, real *rtol, integer *offset, real *w, real *werr, real *work, integer *iwork, real *pivmin, real *spdiam, integer *info); /* Subroutine */ int _starpu_slarrk_(integer *n, integer *iw, real *gl, real *gu, real *d__, real *e2, real *pivmin, real *reltol, real *w, real *werr, integer *info); /* Subroutine */ int _starpu_slarrr_(integer *n, real *d__, real *e, integer *info); /* Subroutine */ int _starpu_slarrv_(integer *n, real *vl, real *vu, real *d__, real * l, real *pivmin, integer *isplit, integer *m, integer *dol, integer * dou, real *minrgp, real *rtol1, real *rtol2, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, real *gers, real *z__, integer *ldz, integer *isuppz, real *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_slarscl2_(integer *m, integer *n, real *d__, real *x, integer *ldx); /* Subroutine */ int _starpu_slartg_(real *f, real *g, real *cs, real *sn, real *r__); /* Subroutine */ int _starpu_slartv_(integer *n, real *x, integer *incx, real *y, integer *incy, real *c__, real *s, integer *incc); /* Subroutine */ int _starpu_slaruv_(integer *iseed, integer *n, real *x); /* Subroutine */ int _starpu_slarz_(char *side, integer *m, integer *n, integer *l, real *v, integer *incv, real *tau, real *c__, integer *ldc, real * work); /* Subroutine */ int _starpu_slarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, real *v, integer *ldv, real *t, integer *ldt, real *c__, integer *ldc, real * work, integer *ldwork); /* Subroutine */ int _starpu_slarzt_(char *direct, char *storev, integer *n, integer * k, real *v, integer *ldv, real *tau, real *t, integer *ldt); /* Subroutine */ int _starpu_slas2_(real *f, real *g, real *h__, real *ssmin, real * ssmax); /* Subroutine */ int _starpu_slascl_(char *type__, integer *kl, integer *ku, real * cfrom, real *cto, integer *m, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_slascl2_(integer *m, integer *n, real *d__, real *x, integer *ldx); /* Subroutine */ int _starpu_slasd0_(integer *n, integer *sqre, real *d__, real *e, real *u, integer *ldu, real *vt, integer *ldvt, integer *smlsiz, integer *iwork, real *work, integer *info); /* Subroutine */ int _starpu_slasd1_(integer *nl, integer *nr, integer *sqre, real * d__, real *alpha, real *beta, real *u, integer *ldu, real *vt, integer *ldvt, integer *idxq, integer *iwork, real *work, integer * info); /* Subroutine */ int _starpu_slasd2_(integer *nl, integer *nr, integer *sqre, integer *k, real *d__, real *z__, real *alpha, real *beta, real *u, integer * ldu, real *vt, integer *ldvt, real *dsigma, real *u2, integer *ldu2, real *vt2, integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer *idxq, integer *coltyp, integer *info); /* Subroutine */ int _starpu_slasd3_(integer *nl, integer *nr, integer *sqre, integer *k, real *d__, real *q, integer *ldq, real *dsigma, real *u, integer * ldu, real *u2, integer *ldu2, real *vt, integer *ldvt, real *vt2, integer *ldvt2, integer *idxc, integer *ctot, real *z__, integer * info); /* Subroutine */ int _starpu_slasd4_(integer *n, integer *i__, real *d__, real *z__, real *delta, real *rho, real *sigma, real *work, integer *info); /* Subroutine */ int _starpu_slasd5_(integer *i__, real *d__, real *z__, real *delta, real *rho, real *dsigma, real *work); /* Subroutine */ int _starpu_slasd6_(integer *icompq, integer *nl, integer *nr, integer *sqre, real *d__, real *vf, real *vl, real *alpha, real *beta, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * difl, real *difr, real *z__, integer *k, real *c__, real *s, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slasd7_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *k, real *d__, real *z__, real *zw, real *vf, real *vfw, real *vl, real *vlw, real *alpha, real *beta, real *dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, integer * givptr, integer *givcol, integer *ldgcol, real *givnum, integer * ldgnum, real *c__, real *s, integer *info); /* Subroutine */ int _starpu_slasd8_(integer *icompq, integer *k, real *d__, real * z__, real *vf, real *vl, real *difl, real *difr, integer *lddifr, real *dsigma, real *work, integer *info); /* Subroutine */ int _starpu_slasda_(integer *icompq, integer *smlsiz, integer *n, integer *sqre, real *d__, real *e, real *u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real *z__, real *poles, integer * givptr, integer *givcol, integer *ldgcol, integer *perm, real *givnum, real *c__, real *s, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slasdq_(char *uplo, integer *sqre, integer *n, integer * ncvt, integer *nru, integer *ncc, real *d__, real *e, real *vt, integer *ldvt, real *u, integer *ldu, real *c__, integer *ldc, real * work, integer *info); /* Subroutine */ int _starpu_slasdt_(integer *n, integer *lvl, integer *nd, integer * inode, integer *ndiml, integer *ndimr, integer *msub); /* Subroutine */ int _starpu_slaset_(char *uplo, integer *m, integer *n, real *alpha, real *beta, real *a, integer *lda); /* Subroutine */ int _starpu_slasq1_(integer *n, real *d__, real *e, real *work, integer *info); /* Subroutine */ int _starpu_slasq2_(integer *n, real *z__, integer *info); /* Subroutine */ int _starpu_slasq3_(integer *i0, integer *n0, real *z__, integer *pp, real *dmin__, real *sigma, real *desig, real *qmax, integer *nfail, integer *iter, integer *ndiv, logical *ieee, integer *ttype, real * dmin1, real *dmin2, real *dn, real *dn1, real *dn2, real *g, real * tau); /* Subroutine */ int _starpu_slasq4_(integer *i0, integer *n0, real *z__, integer *pp, integer *n0in, real *dmin__, real *dmin1, real *dmin2, real *dn, real *dn1, real *dn2, real *tau, integer *ttype, real *g); /* Subroutine */ int _starpu_slasq5_(integer *i0, integer *n0, real *z__, integer *pp, real *tau, real *dmin__, real *dmin1, real *dmin2, real *dn, real * dnm1, real *dnm2, logical *ieee); /* Subroutine */ int _starpu_slasq6_(integer *i0, integer *n0, real *z__, integer *pp, real *dmin__, real *dmin1, real *dmin2, real *dn, real *dnm1, real * dnm2); /* Subroutine */ int _starpu_slasr_(char *side, char *pivot, char *direct, integer *m, integer *n, real *c__, real *s, real *a, integer *lda); /* Subroutine */ int _starpu_slasrt_(char *id, integer *n, real *d__, integer *info); /* Subroutine */ int _starpu_slassq_(integer *n, real *x, integer *incx, real *scale, real *sumsq); /* Subroutine */ int _starpu_slasv2_(real *f, real *g, real *h__, real *ssmin, real * ssmax, real *snr, real *csr, real *snl, real *csl); /* Subroutine */ int _starpu_slaswp_(integer *n, real *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_slasy2_(logical *ltranl, logical *ltranr, integer *isgn, integer *n1, integer *n2, real *tl, integer *ldtl, real *tr, integer * ldtr, real *b, integer *ldb, real *scale, real *x, integer *ldx, real *xnorm, integer *info); /* Subroutine */ int _starpu_slasyf_(char *uplo, integer *n, integer *nb, integer *kb, real *a, integer *lda, integer *ipiv, real *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_slatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, real *ab, integer *ldab, real *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_slatdf_(integer *ijob, integer *n, real *z__, integer * ldz, real *rhs, real *rdsum, real *rdscal, integer *ipiv, integer * jpiv); /* Subroutine */ int _starpu_slatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, real *ap, real *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_slatrd_(char *uplo, integer *n, integer *nb, real *a, integer *lda, real *e, real *tau, real *w, integer *ldw); /* Subroutine */ int _starpu_slatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, real *a, integer *lda, real *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_slatrz_(integer *m, integer *n, integer *l, real *a, integer *lda, real *tau, real *work); /* Subroutine */ int _starpu_slatzm_(char *side, integer *m, integer *n, real *v, integer *incv, real *tau, real *c1, real *c2, integer *ldc, real * work); /* Subroutine */ int _starpu_slauu2_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_slauum_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_sopgtr_(char *uplo, integer *n, real *ap, real *tau, real *q, integer *ldq, real *work, integer *info); /* Subroutine */ int _starpu_sopmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, real *ap, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sorg2l_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorg2r_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorgbr_(char *vect, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorghr_(integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgl2_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorglq_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgql_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgqr_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgr2_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorgrq_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgtr_(char *uplo, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorm2l_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real * c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorml2_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormlq_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormql_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormqr_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormr2_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormrq_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormtr_(char *side, char *uplo, char *trans, integer *m, integer *n, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_spbcon_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spbequ_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_spbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spbstf_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_spbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spbtf2_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_spbtrf_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_spbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spftrf_(char *transr, char *uplo, integer *n, real *a, integer *info); /* Subroutine */ int _starpu_spftri_(char *transr, char *uplo, integer *n, real *a, integer *info); /* Subroutine */ int _starpu_spftrs_(char *transr, char *uplo, integer *n, integer * nrhs, real *a, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spocon_(char *uplo, integer *n, real *a, integer *lda, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spoequ_(integer *n, real *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_spoequb_(integer *n, real *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_sporfs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer *ldaf, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, real *s, real * b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, real *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_sposv_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sposvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spotf2_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_spotrf_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_spotri_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_spotrs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sppcon_(char *uplo, integer *n, real *ap, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sppequ_(char *uplo, integer *n, real *ap, real *s, real * scond, real *amax, integer *info); /* Subroutine */ int _starpu_spprfs_(char *uplo, integer *n, integer *nrhs, real *ap, real *afp, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sppsv_(char *uplo, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *ap, real *afp, char *equed, real *s, real *b, integer * ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spptrf_(char *uplo, integer *n, real *ap, integer *info); /* Subroutine */ int _starpu_spptri_(char *uplo, integer *n, real *ap, integer *info); /* Subroutine */ int _starpu_spptrs_(char *uplo, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spstf2_(char *uplo, integer *n, real *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_spstrf_(char *uplo, integer *n, real *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_sptcon_(integer *n, real *d__, real *e, real *anorm, real *rcond, real *work, integer *info); /* Subroutine */ int _starpu_spteqr_(char *compz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sptrfs_(integer *n, integer *nrhs, real *d__, real *e, real *df, real *ef, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *info); /* Subroutine */ int _starpu_sptsv_(integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sptsvx_(char *fact, integer *n, integer *nrhs, real *d__, real *e, real *df, real *ef, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *info); /* Subroutine */ int _starpu_spttrf_(integer *n, real *d__, real *e, integer *info); /* Subroutine */ int _starpu_spttrs_(integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sptts2_(integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb); /* Subroutine */ int _starpu_srscl_(integer *n, real *sa, real *sx, integer *incx); /* Subroutine */ int _starpu_ssbev_(char *jobz, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_ssbevd_(char *jobz, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real * w, real *z__, integer *ldz, real *work, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_ssbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * x, integer *ldx, real *work, integer *info); /* Subroutine */ int _starpu_ssbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_ssbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * w, real *z__, integer *ldz, real *work, integer *lwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer * ldbb, real *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssbtrd_(char *vect, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *d__, real *e, real *q, integer *ldq, real *work, integer *info); /* Subroutine */ int _starpu_ssfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, real *alpha, real *a, integer *lda, real *beta, real * c__); /* Subroutine */ int _starpu_sspcon_(char *uplo, integer *n, real *ap, integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sspev_(char *jobz, char *uplo, integer *n, real *ap, real *w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sspevd_(char *jobz, char *uplo, integer *n, real *ap, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sspevx_(char *jobz, char *range, char *uplo, integer *n, real *ap, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer * iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_sspgst_(integer *itype, char *uplo, integer *n, real *ap, real *bp, integer *info); /* Subroutine */ int _starpu_sspgv_(integer *itype, char *jobz, char *uplo, integer * n, real *ap, real *bp, real *w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sspgvd_(integer *itype, char *jobz, char *uplo, integer * n, real *ap, real *bp, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sspgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, real *ap, real *bp, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer * ldz, real *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssprfs_(char *uplo, integer *n, integer *nrhs, real *ap, real *afp, integer *ipiv, real *b, integer *ldb, real *x, integer * ldx, real *ferr, real *berr, real *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_sspsv_(char *uplo, integer *n, integer *nrhs, real *ap, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *ap, real *afp, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssptrd_(char *uplo, integer *n, real *ap, real *d__, real *e, real *tau, integer *info); /* Subroutine */ int _starpu_ssptrf_(char *uplo, integer *n, real *ap, integer *ipiv, integer *info); /* Subroutine */ int _starpu_ssptri_(char *uplo, integer *n, real *ap, integer *ipiv, real *work, integer *info); /* Subroutine */ int _starpu_ssptrs_(char *uplo, integer *n, integer *nrhs, real *ap, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sstebz_(char *range, char *order, integer *n, real *vl, real *vu, integer *il, integer *iu, real *abstol, real *d__, real *e, integer *m, integer *nsplit, real *w, integer *iblock, integer * isplit, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sstedc_(char *compz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstegr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, integer *isuppz, real * work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstein_(integer *n, real *d__, real *e, integer *m, real *w, integer *iblock, integer *isplit, real *z__, integer *ldz, real * work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_sstemr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, integer *m, real *w, real *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, real *work, integer *lwork, integer *iwork, integer * liwork, integer *info); /* Subroutine */ int _starpu_ssteqr_(char *compz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_ssterf_(integer *n, real *d__, real *e, integer *info); /* Subroutine */ int _starpu_sstev_(char *jobz, integer *n, real *d__, real *e, real * z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sstevd_(char *jobz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstevr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, integer *isuppz, real * work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstevx_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer * iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssycon_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssyequb_(char *uplo, integer *n, real *a, integer *lda, real *s, real *scond, real *amax, real *work, integer *info); /* Subroutine */ int _starpu_ssyev_(char *jobz, char *uplo, integer *n, real *a, integer *lda, real *w, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssyevd_(char *jobz, char *uplo, integer *n, real *a, integer *lda, real *w, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssyevr_(char *jobz, char *range, char *uplo, integer *n, real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, integer * isuppz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssyevx_(char *jobz, char *range, char *uplo, integer *n, real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real * work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssygs2_(integer *itype, char *uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ssygst_(integer *itype, char *uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ssygv_(integer *itype, char *jobz, char *uplo, integer * n, real *a, integer *lda, real *b, integer *ldb, real *w, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssygvd_(integer *itype, char *jobz, char *uplo, integer * n, real *a, integer *lda, real *b, integer *ldb, real *w, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssygvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, real * vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssyrfs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real * err_bnds_comp__, integer *nparams, real *params, real *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_ssysv_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssysvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *lwork, integer *iwork, integer * info); /* Subroutine */ int _starpu_ssysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssytd2_(char *uplo, integer *n, real *a, integer *lda, real *d__, real *e, real *tau, integer *info); /* Subroutine */ int _starpu_ssytf2_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_ssytrd_(char *uplo, integer *n, real *a, integer *lda, real *d__, real *e, real *tau, real *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_ssytrf_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssytri_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *info); /* Subroutine */ int _starpu_ssytrs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_stbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, real *ab, integer *ldab, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_stfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, real *alpha, real *a, real *b, integer *ldb); /* Subroutine */ int _starpu_stftri_(char *transr, char *uplo, char *diag, integer *n, real *a, integer *info); /* Subroutine */ int _starpu_stfttp_(char *transr, char *uplo, integer *n, real *arf, real *ap, integer *info); /* Subroutine */ int _starpu_stfttr_(char *transr, char *uplo, integer *n, real *arf, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_stgevc_(char *side, char *howmny, logical *select, integer *n, real *s, integer *lds, real *p, integer *ldp, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real *work, integer *info); /* Subroutine */ int _starpu_stgex2_(logical *wantq, logical *wantz, integer *n, real *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real * z__, integer *ldz, integer *j1, integer *n1, integer *n2, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_stgexc_(logical *wantq, logical *wantz, integer *n, real *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real * z__, integer *ldz, integer *ifst, integer *ilst, real *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_stgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, real *a, integer *lda, real *b, integer * ldb, real *alphar, real *alphai, real *beta, real *q, integer *ldq, real *z__, integer *ldz, integer *m, real *pl, real *pr, real *dif, real *work, integer *lwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_stgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, real *a, integer *lda, real *b, integer *ldb, real *tola, real *tolb, real *alpha, real * beta, real *u, integer *ldu, real *v, integer *ldv, real *q, integer * ldq, real *work, integer *ncycle, integer *info); /* Subroutine */ int _starpu_stgsna_(char *job, char *howmny, logical *select, integer *n, real *a, integer *lda, real *b, integer *ldb, real *vl, integer *ldvl, real *vr, integer *ldvr, real *s, real *dif, integer * mm, integer *m, real *work, integer *lwork, integer *iwork, integer * info); /* Subroutine */ int _starpu_stgsy2_(char *trans, integer *ijob, integer *m, integer * n, real *a, integer *lda, real *b, integer *ldb, real *c__, integer * ldc, real *d__, integer *ldd, real *e, integer *lde, real *f, integer *ldf, real *scale, real *rdsum, real *rdscal, integer *iwork, integer *pq, integer *info); /* Subroutine */ int _starpu_stgsyl_(char *trans, integer *ijob, integer *m, integer * n, real *a, integer *lda, real *b, integer *ldb, real *c__, integer * ldc, real *d__, integer *ldd, real *e, integer *lde, real *f, integer *ldf, real *scale, real *dif, real *work, integer *lwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_stpcon_(char *norm, char *uplo, char *diag, integer *n, real *ap, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stptri_(char *uplo, char *diag, integer *n, real *ap, integer *info); /* Subroutine */ int _starpu_stptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_stpttf_(char *transr, char *uplo, integer *n, real *ap, real *arf, integer *info); /* Subroutine */ int _starpu_stpttr_(char *uplo, integer *n, real *ap, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_strcon_(char *norm, char *uplo, char *diag, integer *n, real *a, integer *lda, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_strevc_(char *side, char *howmny, logical *select, integer *n, real *t, integer *ldt, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real *work, integer *info); /* Subroutine */ int _starpu_strexc_(char *compq, integer *n, real *t, integer *ldt, real *q, integer *ldq, integer *ifst, integer *ilst, real *work, integer *info); /* Subroutine */ int _starpu_strrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_strsen_(char *job, char *compq, logical *select, integer *n, real *t, integer *ldt, real *q, integer *ldq, real *wr, real *wi, integer *m, real *s, real *sep, real *work, integer *lwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_strsna_(char *job, char *howmny, logical *select, integer *n, real *t, integer *ldt, real *vl, integer *ldvl, real *vr, integer *ldvr, real *s, real *sep, integer *mm, integer *m, real * work, integer *ldwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_strsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, real *a, integer *lda, real *b, integer *ldb, real * c__, integer *ldc, real *scale, integer *info); /* Subroutine */ int _starpu_strti2_(char *uplo, char *diag, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_strtri_(char *uplo, char *diag, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_strtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_strttf_(char *transr, char *uplo, integer *n, real *a, integer *lda, real *arf, integer *info); /* Subroutine */ int _starpu_strttp_(char *uplo, integer *n, real *a, integer *lda, real *ap, integer *info); /* Subroutine */ int _starpu_stzrqf_(integer *m, integer *n, real *a, integer *lda, real *tau, integer *info); /* Subroutine */ int _starpu_stzrzf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info); /* Subroutine */ int _starpu_xerbla_array__(char *srname_array__, integer * srname_len__, integer *info, ftnlen srname_array_len); /* Subroutine */ int _starpu_zbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, doublereal *d__, doublereal *e, doublecomplex *vt, integer *ldvt, doublecomplex *u, integer *ldu, doublecomplex *c__, integer *ldc, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zcgesv_(integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublecomplex *work, complex *swork, doublereal *rwork, integer *iter, integer *info); /* Subroutine */ int _starpu_zcposv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublecomplex *work, complex *swork, doublereal *rwork, integer *iter, integer *info); /* Subroutine */ int _starpu_zdrscl_(integer *n, doublereal *sa, doublecomplex *sx, integer *incx); /* Subroutine */ int _starpu_zgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *pt, integer *ldpt, doublecomplex *c__, integer *ldc, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbcon_(char *norm, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zgbequ_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info); /* Subroutine */ int _starpu_zgbequb_(integer *m, integer *n, integer *kl, integer * ku, doublecomplex *ab, integer *ldab, doublereal *r__, doublereal * c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex * afb, integer *ldafb, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, doublecomplex * b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbtf2_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgbtrf_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *scale, integer *m, doublecomplex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_zgebal_(char *job, integer *n, doublecomplex *a, integer *lda, integer *ilo, integer *ihi, doublereal *scale, integer *info); /* Subroutine */ int _starpu_zgebd2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, doublecomplex *taup, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgebrd_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, doublecomplex *taup, doublecomplex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_zgecon_(char *norm, integer *n, doublecomplex *a, integer *lda, doublereal *anorm, doublereal *rcond, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeequ_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zgeequb_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zgees_(char *jobvs, char *sort, L_fp select, integer *n, doublecomplex *a, integer *lda, integer *sdim, doublecomplex *w, doublecomplex *vs, integer *ldvs, doublecomplex *work, integer *lwork, doublereal *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, doublecomplex *a, integer *lda, integer *sdim, doublecomplex *w, doublecomplex *vs, integer *ldvs, doublereal * rconde, doublereal *rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zgeev_(char *jobvl, char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublecomplex *work, integer * lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgegs_(char *jobvsl, char *jobvsr, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublecomplex * work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgegv_(char *jobvl, char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgehd2_(integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zgehrd_(integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgelq2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgelqf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgels_(char *trans, integer *m, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgelsd_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *s, doublereal *rcond, integer *rank, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zgelss_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *s, doublereal *rcond, integer *rank, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgelsx_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *jpvt, doublereal *rcond, integer *rank, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgelsy_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *jpvt, doublereal *rcond, integer *rank, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeql2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgeqlf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgeqp3_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeqpf_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeqr2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgeqrf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgerfs_(char *trans, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublereal *r__, doublereal *c__, doublecomplex * b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgerq2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgerqf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgesc2_(integer *n, doublecomplex *a, integer *lda, doublecomplex *rhs, integer *ipiv, integer *jpiv, doublereal *scale); /* Subroutine */ int _starpu_zgesdd_(char *jobz, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zgesv_(integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_zgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgesvx_(char *fact, char *trans, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgetc2_(integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_zgetf2_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgetrf_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgetri_(integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgetrs_(char *trans, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, doublecomplex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_zggbal_(char *job, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *work, integer * info); /* Subroutine */ int _starpu_zgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *sdim, doublecomplex *alpha, doublecomplex * beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublecomplex *work, integer *lwork, doublereal *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *sdim, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublereal *rconde, doublereal * rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zggev_(char *jobvl, char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zggglm_(integer *n, integer *m, integer *p, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *d__, doublecomplex *x, doublecomplex *y, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_zgglse_(integer *m, integer *n, integer *p, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, doublecomplex *d__, doublecomplex *x, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zggqrf_(integer *n, integer *m, integer *p, doublecomplex *a, integer *lda, doublecomplex *taua, doublecomplex *b, integer *ldb, doublecomplex *taub, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zggrqf_(integer *m, integer *p, integer *n, doublecomplex *a, integer *lda, doublecomplex *taua, doublecomplex *b, integer *ldb, doublecomplex *taub, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *alpha, doublereal *beta, doublecomplex *u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, integer *ldq, doublecomplex *work, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *tola, doublereal *tolb, integer *k, integer *l, doublecomplex *u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, integer *ldq, integer *iwork, doublereal * rwork, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgtcon_(char *norm, integer *n, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer * ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgtrfs_(char *trans, integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *dlf, doublecomplex *df, doublecomplex *duf, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgtsv_(integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *dlf, doublecomplex *df, doublecomplex *duf, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zgttrf_(integer *n, doublecomplex *dl, doublecomplex * d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, integer * info); /* Subroutine */ int _starpu_zgttrs_(char *trans, integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgtts2_(integer *itrans, integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zhbev_(char *jobz, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhbevd_(char *jobz, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublecomplex *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zhbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublecomplex *x, integer *ldx, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublecomplex *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal * abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_zhbtrd_(char *vect, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zhecon_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zheequb_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zheev_(char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zheevd_(char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zheevr_(char *jobz, char *range, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal * w, doublecomplex *z__, integer *ldz, integer *isuppz, doublecomplex * work, integer *lwork, doublereal *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zheevx_(char *jobz, char *range, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal * w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer * lwork, doublereal *rwork, integer *iwork, integer *ifail, integer * info); /* Subroutine */ int _starpu_zhegs2_(integer *itype, char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhegst_(integer *itype, char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhegv_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhegvd_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhegvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zherfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zherfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhesv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zhesvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhesvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhetd2_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, integer *info); /* Subroutine */ int _starpu_zhetf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zhetrd_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zhetrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zhetri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zhetrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublecomplex *a, integer *lda, doublereal *beta, doublecomplex *c__); /* Subroutine */ int _starpu_zhgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *t, integer *ldt, doublecomplex *alpha, doublecomplex * beta, doublecomplex *q, integer *ldq, doublecomplex *z__, integer * ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zhpcon_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zhpev_(char *jobz, char *uplo, integer *n, doublecomplex *ap, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhpevd_(char *jobz, char *uplo, integer *n, doublecomplex *ap, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhpevx_(char *jobz, char *range, char *uplo, integer *n, doublecomplex *ap, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal * rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zhpgst_(integer *itype, char *uplo, integer *n, doublecomplex *ap, doublecomplex *bp, integer *info); /* Subroutine */ int _starpu_zhpgv_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *ap, doublecomplex *bp, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zhpgvd_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *ap, doublecomplex *bp, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal * rwork, integer *lrwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_zhpgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublecomplex *ap, doublecomplex *bp, doublereal * vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_zhprfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex * b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zhpsv_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhpsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhptrd_(char *uplo, integer *n, doublecomplex *ap, doublereal *d__, doublereal *e, doublecomplex *tau, integer *info); /* Subroutine */ int _starpu_zhptrf_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zhptri_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zhptrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, doublecomplex *h__, integer *ldh, doublecomplex * w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, integer *ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_zhseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublecomplex *ab, integer *ldab, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_gbrcond_c__(char *trans, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, doublereal *c__, logical *capply, integer *info, doublecomplex *work, doublereal *rwork, ftnlen trans_len); doublereal _starpu_zla_gbrcond_x__(char *trans, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, doublecomplex *x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_zla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info); doublereal _starpu_zla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer * ldafb); /* Subroutine */ int _starpu_zla_geamv__(integer *trans, integer *m, integer *n, doublereal *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_gercond_c__(char *trans, integer *n, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal * c__, logical *capply, integer *info, doublecomplex *work, doublereal * rwork, ftnlen trans_len); doublereal _starpu_zla_gercond_x__(char *trans, integer *n, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex * x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_zla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal * errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info); /* Subroutine */ int _starpu_zla_heamv__(integer *uplo, integer *n, doublereal *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_hercond_c__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *c__, logical *capply, integer *info, doublecomplex *work, doublereal * rwork, ftnlen uplo_len); doublereal _starpu_zla_hercond_x__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex * x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_herfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal * errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_zla_herpvgrw__(char *uplo, integer *n, integer *info, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_lin_berr__(integer *n, integer *nz, integer *nrhs, doublecomplex *res, doublereal *ayb, doublereal *berr); doublereal _starpu_zla_porcond_c__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, doublereal *c__, logical * capply, integer *info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); doublereal _starpu_zla_porcond_x__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, doublecomplex *x, integer * info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_zla_porpvgrw__(char *uplo, integer *ncols, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, doublereal *work, ftnlen uplo_len); doublereal _starpu_zla_rpvgrw__(integer *n, integer *ncols, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf); /* Subroutine */ int _starpu_zla_syamv__(integer *uplo, integer *n, doublereal *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_syrcond_c__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *c__, logical *capply, integer *info, doublecomplex *work, doublereal * rwork, ftnlen uplo_len); doublereal _starpu_zla_syrcond_x__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex * x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal * errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_zla_syrpvgrw__(char *uplo, integer *n, integer *info, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_wwaddw__(integer *n, doublecomplex *x, doublecomplex *y, doublecomplex *w); /* Subroutine */ int _starpu_zlabrd_(integer *m, integer *n, integer *nb, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, doublecomplex *taup, doublecomplex *x, integer * ldx, doublecomplex *y, integer *ldy); /* Subroutine */ int _starpu_zlacgv_(integer *n, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_zlacn2_(integer *n, doublecomplex *v, doublecomplex *x, doublereal *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_zlacon_(integer *n, doublecomplex *v, doublecomplex *x, doublereal *est, integer *kase); /* Subroutine */ int _starpu_zlacp2_(char *uplo, integer *m, integer *n, doublereal * a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zlacpy_(char *uplo, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zlacrm_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, integer *ldc, doublereal *rwork); /* Subroutine */ int _starpu_zlacrt_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy, doublecomplex *c__, doublecomplex * s); /* Double Complex */ VOID _starpu_zladiv_(doublecomplex * ret_val, doublecomplex *x, doublecomplex *y); /* Subroutine */ int _starpu_zlaed0_(integer *qsiz, integer *n, doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, integer *ldqs, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlaed7_(integer *n, integer *cutpnt, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * work, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlaed8_(integer *k, integer *n, integer *qsiz, doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, integer *indxq, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, integer *info); /* Subroutine */ int _starpu_zlaein_(logical *rightv, logical *noinit, integer *n, doublecomplex *h__, integer *ldh, doublecomplex *w, doublecomplex *v, doublecomplex *b, integer *ldb, doublereal *rwork, doublereal *eps3, doublereal *smlnum, integer *info); /* Subroutine */ int _starpu_zlaesy_(doublecomplex *a, doublecomplex *b, doublecomplex *c__, doublecomplex *rt1, doublecomplex *rt2, doublecomplex *evscal, doublecomplex *cs1, doublecomplex *sn1); /* Subroutine */ int _starpu_zlaev2_(doublecomplex *a, doublecomplex *b, doublecomplex *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, doublecomplex *sn1); /* Subroutine */ int _starpu_zlag2c_(integer *m, integer *n, doublecomplex *a, integer *lda, complex *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_zlags2_(logical *upper, doublereal *a1, doublecomplex * a2, doublereal *a3, doublereal *b1, doublecomplex *b2, doublereal *b3, doublereal *csu, doublecomplex *snu, doublereal *csv, doublecomplex * snv, doublereal *csq, doublecomplex *snq); /* Subroutine */ int _starpu_zlagtm_(char *trans, integer *n, integer *nrhs, doublereal *alpha, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *x, integer *ldx, doublereal *beta, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zlahef_(char *uplo, integer *n, integer *nb, integer *kb, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_zlahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_zlahr2_(integer *n, integer *k, integer *nb, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *t, integer *ldt, doublecomplex *y, integer *ldy); /* Subroutine */ int _starpu_zlahrd_(integer *n, integer *k, integer *nb, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *t, integer *ldt, doublecomplex *y, integer *ldy); /* Subroutine */ int _starpu_zlaic1_(integer *job, integer *j, doublecomplex *x, doublereal *sest, doublecomplex *w, doublecomplex *gamma, doublereal * sestpr, doublecomplex *s, doublecomplex *c__); /* Subroutine */ int _starpu_zlals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, doublecomplex *b, integer *ldb, doublecomplex *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *poles, doublereal *difl, doublereal *difr, doublereal * z__, integer *k, doublereal *c__, doublereal *s, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zlalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, doublecomplex *b, integer *ldb, doublecomplex *bx, integer *ldbx, doublereal *u, integer *ldu, doublereal *vt, integer * k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal * poles, integer *givptr, integer *givcol, integer *ldgcol, integer * perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublecomplex *b, integer *ldb, doublereal *rcond, integer *rank, doublecomplex *work, doublereal * rwork, integer *iwork, integer *info); doublereal _starpu_zlangb_(char *norm, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlange_(char *norm, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlangt_(char *norm, integer *n, doublecomplex *dl, doublecomplex * d__, doublecomplex *du); doublereal _starpu_zlanhb_(char *norm, char *uplo, integer *n, integer *k, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlanhf_(char *norm, char *transr, char *uplo, integer *n, doublecomplex *a, doublereal *work); doublereal _starpu_zlanhp_(char *norm, char *uplo, integer *n, doublecomplex *ap, doublereal *work); doublereal _starpu_zlanhs_(char *norm, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlanht_(char *norm, integer *n, doublereal *d__, doublecomplex *e); doublereal _starpu_zlansb_(char *norm, char *uplo, integer *n, integer *k, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlansp_(char *norm, char *uplo, integer *n, doublecomplex *ap, doublereal *work); doublereal _starpu_zlansy_(char *norm, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlantp_(char *norm, char *uplo, char *diag, integer *n, doublecomplex *ap, doublereal *work); doublereal _starpu_zlantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *work); /* Subroutine */ int _starpu_zlapll_(integer *n, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublereal *ssmin); /* Subroutine */ int _starpu_zlapmt_(logical *forwrd, integer *m, integer *n, doublecomplex *x, integer *ldx, integer *k); /* Subroutine */ int _starpu_zlaqgb_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqge_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqhb_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqhe_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqhp_(char *uplo, integer *n, doublecomplex *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqp2_(integer *m, integer *n, integer *offset, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublereal *vn1, doublereal *vn2, doublecomplex *work); /* Subroutine */ int _starpu_zlaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublereal *vn1, doublereal *vn2, doublecomplex * auxv, doublecomplex *f, integer *ldf); /* Subroutine */ int _starpu_zlaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zlaqr1_(integer *n, doublecomplex *h__, integer *ldh, doublecomplex *s1, doublecomplex *s2, doublecomplex *v); /* Subroutine */ int _starpu_zlaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublecomplex *h__, integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, integer *ns, integer *nd, doublecomplex *sh, doublecomplex *v, integer *ldv, integer *nh, doublecomplex *t, integer *ldt, integer *nv, doublecomplex *wv, integer *ldwv, doublecomplex *work, integer *lwork); /* Subroutine */ int _starpu_zlaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublecomplex *h__, integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, integer *ns, integer *nd, doublecomplex *sh, doublecomplex *v, integer *ldv, integer *nh, doublecomplex *t, integer *ldt, integer *nv, doublecomplex *wv, integer *ldwv, doublecomplex *work, integer *lwork); /* Subroutine */ int _starpu_zlaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zlaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, doublecomplex *s, doublecomplex *h__, integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *v, integer *ldv, doublecomplex *u, integer *ldu, integer *nv, doublecomplex *wv, integer *ldwv, integer *nh, doublecomplex *wh, integer *ldwh); /* Subroutine */ int _starpu_zlaqsb_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqsp_(char *uplo, integer *n, doublecomplex *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqsy_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlar1v_(integer *n, integer *b1, integer *bn, doublereal *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * lld, doublereal *pivmin, doublereal *gaptol, doublecomplex *z__, logical *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, doublereal *rqcorr, doublereal *work); /* Subroutine */ int _starpu_zlar2v_(integer *n, doublecomplex *x, doublecomplex *y, doublecomplex *z__, integer *incx, doublereal *c__, doublecomplex *s, integer *incc); /* Subroutine */ int _starpu_zlarcm_(integer *m, integer *n, doublereal *a, integer * lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublereal *rwork); /* Subroutine */ int _starpu_zlarf_(char *side, integer *m, integer *n, doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, doublecomplex *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * ldc, doublecomplex *work, integer *ldwork); /* Subroutine */ int _starpu_zlarfg_(integer *n, doublecomplex *alpha, doublecomplex * x, integer *incx, doublecomplex *tau); /* Subroutine */ int _starpu_zlarfp_(integer *n, doublecomplex *alpha, doublecomplex * x, integer *incx, doublecomplex *tau); /* Subroutine */ int _starpu_zlarft_(char *direct, char *storev, integer *n, integer * k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * t, integer *ldt); /* Subroutine */ int _starpu_zlarfx_(char *side, integer *m, integer *n, doublecomplex *v, doublecomplex *tau, doublecomplex *c__, integer * ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlargv_(integer *n, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublereal *c__, integer *incc); /* Subroutine */ int _starpu_zlarnv_(integer *idist, integer *iseed, integer *n, doublecomplex *x); /* Subroutine */ int _starpu_zlarrv_(integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, integer *m, integer *dol, integer *dou, doublereal *minrgp, doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublecomplex *z__, integer *ldz, integer *isuppz, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlarscl2_(integer *m, integer *n, doublereal *d__, doublecomplex *x, integer *ldx); /* Subroutine */ int _starpu_zlartg_(doublecomplex *f, doublecomplex *g, doublereal * cs, doublecomplex *sn, doublecomplex *r__); /* Subroutine */ int _starpu_zlartv_(integer *n, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublereal *c__, doublecomplex *s, integer *incc); /* Subroutine */ int _starpu_zlarz_(char *side, integer *m, integer *n, integer *l, doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex * c__, integer *ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, doublecomplex *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *ldwork); /* Subroutine */ int _starpu_zlarzt_(char *direct, char *storev, integer *n, integer * k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * t, integer *ldt); /* Subroutine */ int _starpu_zlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zlascl2_(integer *m, integer *n, doublereal *d__, doublecomplex *x, integer *ldx); /* Subroutine */ int _starpu_zlaset_(char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * lda); /* Subroutine */ int _starpu_zlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, doublereal *s, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zlassq_(integer *n, doublecomplex *x, integer *incx, doublereal *scale, doublereal *sumsq); /* Subroutine */ int _starpu_zlaswp_(integer *n, doublecomplex *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_zlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_zlat2c_(char *uplo, integer *n, doublecomplex *a, integer *lda, complex *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_zlatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublecomplex *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_zlatdf_(integer *ijob, integer *n, doublecomplex *z__, integer *ldz, doublecomplex *rhs, doublereal *rdsum, doublereal * rdscal, integer *ipiv, integer *jpiv); /* Subroutine */ int _starpu_zlatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublecomplex *ap, doublecomplex *x, doublereal * scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_zlatrd_(char *uplo, integer *n, integer *nb, doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, doublecomplex *w, integer *ldw); /* Subroutine */ int _starpu_zlatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_zlatrz_(integer *m, integer *n, integer *l, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work); /* Subroutine */ int _starpu_zlatzm_(char *side, integer *m, integer *n, doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex * c1, doublecomplex *c2, integer *ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlauu2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zlauum_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpbcon_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *anorm, doublereal * rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpbequ_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer * ldafb, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_zpbstf_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_zpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_zpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal * ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpbtf2_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_zpbtrf_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_zpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_zpftrf_(char *transr, char *uplo, integer *n, doublecomplex *a, integer *info); /* Subroutine */ int _starpu_zpftri_(char *transr, char *uplo, integer *n, doublecomplex *a, integer *info); /* Subroutine */ int _starpu_zpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, doublecomplex *a, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zpocon_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *anorm, doublereal *rcond, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpoequ_(integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zpoequb_(integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zporfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_zporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zposv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zposvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpotf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpotrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpotri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpotrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zppcon_(char *uplo, integer *n, doublecomplex *ap, doublereal *anorm, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zppequ_(char *uplo, integer *n, doublecomplex *ap, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zpprfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *afp, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zppsv_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *ap, doublecomplex *afp, char *equed, doublereal * s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpptrf_(char *uplo, integer *n, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_zpptri_(char *uplo, integer *n, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_zpptrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zpstf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_zpstrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_zptcon_(integer *n, doublereal *d__, doublecomplex *e, doublereal *anorm, doublereal *rcond, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zpteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_zptrfs_(char *uplo, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublereal *df, doublecomplex *ef, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_zptsv_(integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zptsvx_(char *fact, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublereal *df, doublecomplex *ef, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpttrf_(integer *n, doublereal *d__, doublecomplex *e, integer *info); /* Subroutine */ int _starpu_zpttrs_(char *uplo, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zptts2_(integer *iuplo, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zrot_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy, doublereal *c__, doublecomplex *s); /* Subroutine */ int _starpu_zspcon_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zspmv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *ap, doublecomplex *x, integer *incx, doublecomplex * beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zspr_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *ap); /* Subroutine */ int _starpu_zsprfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex * b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zspsv_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsptrf_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zsptri_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsptrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zstegr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zstein_(integer *n, doublereal *d__, doublereal *e, integer *m, doublereal *w, integer *iblock, integer *isplit, doublecomplex *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zstemr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, integer *m, doublereal *w, doublecomplex *z__, integer * ldz, integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_zsycon_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsyequb_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsymv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zsyr_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zsyrfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsysv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zsysvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsytf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zsytrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zsytri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsytrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_ztbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_ztftri_(char *transr, char *uplo, char *diag, integer *n, doublecomplex *a, integer *info); /* Subroutine */ int _starpu_ztfttp_(char *transr, char *uplo, integer *n, doublecomplex *arf, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_ztfttr_(char *transr, char *uplo, integer *n, doublecomplex *arf, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztgevc_(char *side, char *howmny, logical *select, integer *n, doublecomplex *s, integer *lds, doublecomplex *p, integer *ldp, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer * ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztgex2_(logical *wantq, logical *wantz, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, integer *j1, integer *info); /* Subroutine */ int _starpu_ztgexc_(logical *wantq, logical *wantz, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, integer *ifst, integer *ilst, integer *info); /* Subroutine */ int _starpu_ztgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex * beta, doublecomplex *q, integer *ldq, doublecomplex *z__, integer * ldz, integer *m, doublereal *pl, doublereal *pr, doublereal *dif, doublecomplex *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ztgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *tola, doublereal *tolb, doublereal *alpha, doublereal *beta, doublecomplex * u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, integer *ldq, doublecomplex *work, integer *ncycle, integer *info); /* Subroutine */ int _starpu_ztgsna_(char *job, char *howmny, logical *select, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer * ldvr, doublereal *s, doublereal *dif, integer *mm, integer *m, doublecomplex *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ztgsy2_(char *trans, integer *ijob, integer *m, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd, doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf, doublereal *scale, doublereal *rdsum, doublereal *rdscal, integer * info); /* Subroutine */ int _starpu_ztgsyl_(char *trans, integer *ijob, integer *m, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd, doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf, doublereal *scale, doublereal *dif, doublecomplex *work, integer * lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ztpcon_(char *norm, char *uplo, char *diag, integer *n, doublecomplex *ap, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztptri_(char *uplo, char *diag, integer *n, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_ztptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztpttf_(char *transr, char *uplo, integer *n, doublecomplex *ap, doublecomplex *arf, integer *info); /* Subroutine */ int _starpu_ztpttr_(char *uplo, integer *n, doublecomplex *ap, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztrcon_(char *norm, char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, doublereal *rcond, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztrevc_(char *side, char *howmny, logical *select, integer *n, doublecomplex *t, integer *ldt, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztrexc_(char *compq, integer *n, doublecomplex *t, integer *ldt, doublecomplex *q, integer *ldq, integer *ifst, integer * ilst, integer *info); /* Subroutine */ int _starpu_ztrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_ztrsen_(char *job, char *compq, logical *select, integer *n, doublecomplex *t, integer *ldt, doublecomplex *q, integer *ldq, doublecomplex *w, integer *m, doublereal *s, doublereal *sep, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ztrsna_(char *job, char *howmny, logical *select, integer *n, doublecomplex *t, integer *ldt, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublereal *s, doublereal *sep, integer *mm, integer *m, doublecomplex *work, integer *ldwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublereal *scale, integer *info); /* Subroutine */ int _starpu_ztrti2_(char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztrtri_(char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztrttf_(char *transr, char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *arf, integer *info); /* Subroutine */ int _starpu_ztrttp_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_ztzrqf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, integer *info); /* Subroutine */ int _starpu_ztzrzf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zung2l_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zung2r_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zungbr_(char *vect, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunghr_(integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungl2_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zunglq_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungql_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungqr_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungr2_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zungrq_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungtr_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunmbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zunmhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunmlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmql_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmr2_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunmr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * info); /* Subroutine */ int _starpu_zunmrq_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zunmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zupgtr_(char *uplo, integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *q, integer *ldq, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zupmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1); doublereal _starpu_dsecnd_(); /* Subroutine */ int _starpu_ilaver_(integer *vers_major__, integer *vers_minor__, integer *vers_patch__); logical _starpu_lsame_(char *ca, char *cb); doublereal _starpu_second_(); doublereal _starpu_slamch_(char *cmach); /* Subroutine */ int _starpu_slamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1); /* Subroutine */ int _starpu_slamc2_(integer *beta, integer *t, logical *rnd, real * eps, integer *emin, real *rmin, integer *emax, real *rmax); doublereal _starpu_slamc3_(real *a, real *b); /* Subroutine */ int _starpu_slamc4_(integer *emin, real *start, integer *base); /* Subroutine */ int _starpu_slamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, real *rmax); doublereal _starpu_dlamch_(char *cmach); /* Subroutine */ int _starpu_dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1); /* Subroutine */ int _starpu_dlamc2_(integer *beta, integer *t, logical *rnd, doublereal *eps, integer *emin, doublereal *rmin, integer *emax, doublereal *rmax); doublereal _starpu_dlamc3_(doublereal *a, doublereal *b); /* Subroutine */ int _starpu_dlamc4_(integer *emin, doublereal *start, integer *base); /* Subroutine */ int _starpu_dlamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, doublereal *rmax); integer _starpu_ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, integer *n4); #ifdef __cplusplus } #endif #endif /* __CLAPACK_H */ starpu-1.3.9+dfsg/min-dgels/additional/d_lg10.c000066400000000000000000000004431413463044200211640ustar00rootroot00000000000000#include "f2c.h" #define log10e 0.43429448190325182765 #ifdef KR_headers double log(); double d_lg10(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_lg10(doublereal *x) #endif { return( log10e * log(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/additional/d_sign.c000066400000000000000000000004121413463044200213550ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double d_sign(a,b) doublereal *a, *b; #else double d_sign(doublereal *a, doublereal *b) #endif { double x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/additional/dcopy.c000066400000000000000000000043511413463044200212360ustar00rootroot00000000000000/* dcopy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dcopy_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* copies a vector, x, to a vector, y. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dy[iy] = dx[ix]; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 7; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dy[i__] = dx[i__]; /* L30: */ } if (*n < 7) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 7) { dy[i__] = dx[i__]; dy[i__ + 1] = dx[i__ + 1]; dy[i__ + 2] = dx[i__ + 2]; dy[i__ + 3] = dx[i__ + 3]; dy[i__ + 4] = dx[i__ + 4]; dy[i__ + 5] = dx[i__ + 5]; dy[i__ + 6] = dx[i__ + 6]; /* L50: */ } return 0; } /* _starpu_dcopy_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgelq2.c000066400000000000000000000106351413463044200213000ustar00rootroot00000000000000/* dgelq2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgelq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, k; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELQ2 computes an LQ factorization of a real m by n matrix A: */ /* A = L * Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix A. */ /* On exit, the elements on and below the diagonal of the array */ /* contain the m by min(m,n) lower trapezoidal matrix L (L is */ /* lower triangular if m <= n); the elements above the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (M) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(k) . . . H(2) H(1), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELQ2", &i__1); return 0; } k = min(*m,*n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i,i+1:n) */ i__2 = *n - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfp_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n)* a_dim1] , lda, &tau[i__]); if (i__ < *m) { /* Apply H(i) to A(i+1:m,i:n) from the right */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__; i__3 = *n - i__ + 1; _starpu_dlarf_("Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[ i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1]); a[i__ + i__ * a_dim1] = aii; } /* L10: */ } return 0; /* End of DGELQ2 */ } /* _starpu_dgelq2_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgelqf.c000066400000000000000000000163741413463044200213720ustar00rootroot00000000000000/* dgelqf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgelqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dgelq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELQF computes an LQ factorization of a real M-by-N matrix A: */ /* A = L * Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the elements on and below the diagonal of the array */ /* contain the m-by-min(m,n) lower trapezoidal matrix L (L is */ /* lower triangular if m <= n); the elements above the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M). */ /* For optimum performance LWORK >= M*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(k) . . . H(2) H(1), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1); lwkopt = *m * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*m) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELQF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGELQF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGELQF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the LQ factorization of the current block */ /* A(i:i+ib-1,i:n) */ i__3 = *n - i__ + 1; _starpu_dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ 1], &iinfo); if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__3 = *n - i__ + 1; _starpu_dlarft_("Forward", "Rowwise", &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(i+ib:m,i:n) from the right */ i__3 = *m - i__ - ib + 1; i__4 = *n - i__ + 1; _starpu_dlarfb_("Right", "No transpose", "Forward", "Rowwise", &i__3, &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + 1], &ldwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; _starpu_dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] , &iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGELQF */ } /* _starpu_dgelqf_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgels.c000066400000000000000000000360611413463044200212210ustar00rootroot00000000000000/* dgels.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b33 = 0.; static integer c__0 = 0; /* Subroutine */ int _starpu_dgels_(char *trans, integer *m, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer i__, j, nb, mn; doublereal anrm, bnrm; integer brow; logical tpsd; integer iascl, ibscl; extern logical _starpu_lsame_(char *, char *); integer wsize; doublereal rwork[1]; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer scllen; doublereal bignum; extern /* Subroutine */ int _starpu_dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal smlnum; logical lquery; extern /* Subroutine */ int _starpu_dtrtrs_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELS solves overdetermined or underdetermined real linear systems */ /* involving an M-by-N matrix A, or its transpose, using a QR or LQ */ /* factorization of A. It is assumed that A has full rank. */ /* The following options are provided: */ /* 1. If TRANS = 'N' and m >= n: find the least squares solution of */ /* an overdetermined system, i.e., solve the least squares problem */ /* minimize || B - A*X ||. */ /* 2. If TRANS = 'N' and m < n: find the minimum norm solution of */ /* an underdetermined system A * X = B. */ /* 3. If TRANS = 'T' and m >= n: find the minimum norm solution of */ /* an undetermined system A**T * X = B. */ /* 4. If TRANS = 'T' and m < n: find the least squares solution of */ /* an overdetermined system, i.e., solve the least squares problem */ /* minimize || B - A**T * X ||. */ /* Several right hand side vectors b and solution vectors x can be */ /* handled in a single call; they are stored as the columns of the */ /* M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ /* matrix X. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* = 'N': the linear system involves A; */ /* = 'T': the linear system involves A**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of */ /* columns of the matrices B and X. NRHS >=0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if M >= N, A is overwritten by details of its QR */ /* factorization as returned by DGEQRF; */ /* if M < N, A is overwritten by details of its LQ */ /* factorization as returned by DGELQF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the matrix B of right hand side vectors, stored */ /* columnwise; B is M-by-NRHS if TRANS = 'N', or N-by-NRHS */ /* if TRANS = 'T'. */ /* On exit, if INFO = 0, B is overwritten by the solution */ /* vectors, stored columnwise: */ /* if TRANS = 'N' and m >= n, rows 1 to n of B contain the least */ /* squares solution vectors; the residual sum of squares for the */ /* solution in each column is given by the sum of squares of */ /* elements N+1 to M in that column; */ /* if TRANS = 'N' and m < n, rows 1 to N of B contain the */ /* minimum norm solution vectors; */ /* if TRANS = 'T' and m >= n, rows 1 to M of B contain the */ /* minimum norm solution vectors; */ /* if TRANS = 'T' and m < n, rows 1 to M of B contain the */ /* least squares solution vectors; the residual sum of squares */ /* for the solution in each column is given by the sum of */ /* squares of elements M+1 to N in that column. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= MAX(1,M,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* LWORK >= max( 1, MN + max( MN, NRHS ) ). */ /* For optimal performance, */ /* LWORK >= max( 1, MN + max( MN, NRHS )*NB ). */ /* where MN = min(M,N) and NB is the optimum block size. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of the */ /* triangular factor of A is zero, so that A does not have */ /* full rank; the least squares solution could not be */ /* computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --work; /* Function Body */ *info = 0; mn = min(*m,*n); lquery = *lwork == -1; if (! (_starpu_lsame_(trans, "N") || _starpu_lsame_(trans, "T"))) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*ldb < max(i__1,*n)) { *info = -8; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = mn + max(mn,*nrhs); if (*lwork < max(i__1,i__2) && ! lquery) { *info = -10; } } } /* Figure out optimal block size */ if (*info == 0 || *info == -10) { tpsd = TRUE_; if (_starpu_lsame_(trans, "N")) { tpsd = FALSE_; } if (*m >= *n) { nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); if (tpsd) { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMQR", "LN", m, nrhs, n, & c_n1); nb = max(i__1,i__2); } else { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMQR", "LT", m, nrhs, n, & c_n1); nb = max(i__1,i__2); } } else { nb = _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1); if (tpsd) { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMLQ", "LT", n, nrhs, m, & c_n1); nb = max(i__1,i__2); } else { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMLQ", "LN", n, nrhs, m, & c_n1); nb = max(i__1,i__2); } } /* Computing MAX */ i__1 = 1, i__2 = mn + max(mn,*nrhs) * nb; wsize = max(i__1,i__2); work[1] = (doublereal) wsize; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELS ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ /* Computing MIN */ i__1 = min(*m,*n); if (min(i__1,*nrhs) == 0) { i__1 = max(*m,*n); _starpu_dlaset_("Full", &i__1, nrhs, &c_b33, &c_b33, &b[b_offset], ldb); return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S") / _starpu_dlamch_("P"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Scale A, B if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, rwork); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b33, &c_b33, &b[b_offset], ldb); goto L50; } brow = *m; if (tpsd) { brow = *n; } bnrm = _starpu_dlange_("M", &brow, nrhs, &b[b_offset], ldb, rwork); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, &brow, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bignum, &brow, nrhs, &b[b_offset], ldb, info); ibscl = 2; } if (*m >= *n) { /* compute QR factorization of A */ i__1 = *lwork - mn; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[1], &work[mn + 1], &i__1, info) ; /* workspace at least N, optimally N*NB */ if (! tpsd) { /* Least-Squares Problem min || A * X - B || */ /* B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormqr_("Left", "Transpose", m, nrhs, n, &a[a_offset], lda, &work[ 1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ /* B(1:N,1:NRHS) := inv(R) * B(1:N,1:NRHS) */ _starpu_dtrtrs_("Upper", "No transpose", "Non-unit", n, nrhs, &a[a_offset] , lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } scllen = *n; } else { /* Overdetermined system of equations A' * X = B */ /* B(1:N,1:NRHS) := inv(R') * B(1:N,1:NRHS) */ _starpu_dtrtrs_("Upper", "Transpose", "Non-unit", n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } /* B(N+1:M,1:NRHS) = ZERO */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *n + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } /* B(1:M,1:NRHS) := Q(1:N,:) * B(1:N,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormqr_("Left", "No transpose", m, nrhs, n, &a[a_offset], lda, & work[1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ scllen = *m; } } else { /* Compute LQ factorization of A */ i__1 = *lwork - mn; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[1], &work[mn + 1], &i__1, info) ; /* workspace at least M, optimally M*NB. */ if (! tpsd) { /* underdetermined system of equations A * X = B */ /* B(1:M,1:NRHS) := inv(L) * B(1:M,1:NRHS) */ _starpu_dtrtrs_("Lower", "No transpose", "Non-unit", m, nrhs, &a[a_offset] , lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } /* B(M+1:N,1:NRHS) = 0 */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = *m + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L30: */ } /* L40: */ } /* B(1:N,1:NRHS) := Q(1:N,:)' * B(1:M,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormlq_("Left", "Transpose", n, nrhs, m, &a[a_offset], lda, &work[ 1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ scllen = *n; } else { /* overdetermined system min || A' * X - B || */ /* B(1:N,1:NRHS) := Q * B(1:N,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormlq_("Left", "No transpose", n, nrhs, m, &a[a_offset], lda, & work[1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ /* B(1:M,1:NRHS) := inv(L') * B(1:M,1:NRHS) */ _starpu_dtrtrs_("Lower", "Transpose", "Non-unit", m, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } scllen = *m; } } /* Undo scaling */ if (iascl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, &scllen, nrhs, &b[b_offset] , ldb, info); } else if (iascl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, &scllen, nrhs, &b[b_offset] , ldb, info); } if (ibscl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, &scllen, nrhs, &b[b_offset] , ldb, info); } else if (ibscl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &bnrm, &scllen, nrhs, &b[b_offset] , ldb, info); } L50: work[1] = (doublereal) wsize; return 0; /* End of DGELS */ } /* _starpu_dgels_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgemm.c000066400000000000000000000245261413463044200212170ustar00rootroot00000000000000/* dgemm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, info; logical nota, notb; doublereal temp; integer ncola; extern logical _starpu_lsame_(char *, char *); integer nrowa, nrowb; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEMM performs one of the matrix-matrix operations */ /* C := alpha*op( A )*op( B ) + beta*C, */ /* where op( X ) is one of */ /* op( X ) = X or op( X ) = X', */ /* alpha and beta are scalars, and A, B and C are matrices, with op( A ) */ /* an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. */ /* Arguments */ /* ========== */ /* TRANSA - CHARACTER*1. */ /* On entry, TRANSA specifies the form of op( A ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSA = 'N' or 'n', op( A ) = A. */ /* TRANSA = 'T' or 't', op( A ) = A'. */ /* TRANSA = 'C' or 'c', op( A ) = A'. */ /* Unchanged on exit. */ /* TRANSB - CHARACTER*1. */ /* On entry, TRANSB specifies the form of op( B ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSB = 'N' or 'n', op( B ) = B. */ /* TRANSB = 'T' or 't', op( B ) = B'. */ /* TRANSB = 'C' or 'c', op( B ) = B'. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix */ /* op( A ) and of the matrix C. M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix */ /* op( B ) and the number of columns of the matrix C. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry, K specifies the number of columns of the matrix */ /* op( A ) and the number of rows of the matrix op( B ). K must */ /* be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is */ /* k when TRANSA = 'N' or 'n', and is m otherwise. */ /* Before entry with TRANSA = 'N' or 'n', the leading m by k */ /* part of the array A must contain the matrix A, otherwise */ /* the leading k by m part of the array A must contain the */ /* matrix A. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When TRANSA = 'N' or 'n' then */ /* LDA must be at least max( 1, m ), otherwise LDA must be at */ /* least max( 1, k ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is */ /* n when TRANSB = 'N' or 'n', and is k otherwise. */ /* Before entry with TRANSB = 'N' or 'n', the leading k by n */ /* part of the array B must contain the matrix B, otherwise */ /* the leading n by k part of the array B must contain the */ /* matrix B. */ /* Unchanged on exit. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. When TRANSB = 'N' or 'n' then */ /* LDB must be at least max( 1, k ), otherwise LDB must be at */ /* least max( 1, n ). */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then C need not be set on input. */ /* Unchanged on exit. */ /* C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). */ /* Before entry, the leading m by n part of the array C must */ /* contain the matrix C, except when beta is zero, in which */ /* case C need not be set on entry. */ /* On exit, the array C is overwritten by the m by n matrix */ /* ( alpha*op( A )*op( B ) + beta*C ). */ /* LDC - INTEGER. */ /* On entry, LDC specifies the first dimension of C as declared */ /* in the calling (sub) program. LDC must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Set NOTA and NOTB as true if A and B respectively are not */ /* transposed and set NROWA, NCOLA and NROWB as the number of rows */ /* and columns of A and the number of rows of B respectively. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ nota = _starpu_lsame_(transa, "N"); notb = _starpu_lsame_(transb, "N"); if (nota) { nrowa = *m; ncola = *k; } else { nrowa = *k; ncola = *m; } if (notb) { nrowb = *k; } else { nrowb = *n; } /* Test the input parameters. */ info = 0; if (! nota && ! _starpu_lsame_(transa, "C") && ! _starpu_lsame_( transa, "T")) { info = 1; } else if (! notb && ! _starpu_lsame_(transb, "C") && ! _starpu_lsame_(transb, "T")) { info = 2; } else if (*m < 0) { info = 3; } else if (*n < 0) { info = 4; } else if (*k < 0) { info = 5; } else if (*lda < max(1,nrowa)) { info = 8; } else if (*ldb < max(1,nrowb)) { info = 10; } else if (*ldc < max(1,*m)) { info = 13; } if (info != 0) { _starpu_xerbla_("DGEMM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } /* And if alpha.eq.zero. */ if (*alpha == 0.) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ } /* L40: */ } } return 0; } /* Start the operations. */ if (notb) { if (nota) { /* Form C := alpha*A*B + beta*C. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L50: */ } } else if (*beta != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L60: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (b[l + j * b_dim1] != 0.) { temp = *alpha * b[l + j * b_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L70: */ } } /* L80: */ } /* L90: */ } } else { /* Form C := alpha*A'*B + beta*C */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; /* L100: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ i__ + j * c_dim1]; } /* L110: */ } /* L120: */ } } } else { if (nota) { /* Form C := alpha*A*B' + beta*C */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L130: */ } } else if (*beta != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L140: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (b[j + l * b_dim1] != 0.) { temp = *alpha * b[j + l * b_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L150: */ } } /* L160: */ } /* L170: */ } } else { /* Form C := alpha*A'*B' + beta*C */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; /* L180: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ i__ + j * c_dim1]; } /* L190: */ } /* L200: */ } } } return 0; /* End of DGEMM . */ } /* _starpu_dgemm_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgemv.c000066400000000000000000000170561413463044200212300ustar00rootroot00000000000000/* dgemv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgemv_(char *trans, integer *m, integer *n, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp; integer lenx, leny; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEMV performs one of the matrix-vector operations */ /* y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, */ /* where alpha and beta are scalars, x and y are vectors and A is an */ /* m by n matrix. */ /* Arguments */ /* ========== */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ /* TRANS = 'T' or 't' y := alpha*A'*x + beta*y. */ /* TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ /* Before entry with BETA non-zero, the incremented array Y */ /* must contain the vector y. On exit, Y is overwritten by the */ /* updated vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C") ) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; } else if (*lda < max(1,*m)) { info = 6; } else if (*incx == 0) { info = 8; } else if (*incy == 0) { info = 11; } if (info != 0) { _starpu_xerbla_("DGEMV ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set */ /* up the start points in X and Y. */ if (_starpu_lsame_(trans, "N")) { lenx = *n; leny = *m; } else { lenx = *m; leny = *n; } if (*incx > 0) { kx = 1; } else { kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (leny - 1) * *incy; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ /* First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; /* L20: */ } } } else { iy = ky; if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; /* L30: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } if (_starpu_lsame_(trans, "N")) { /* Form y := alpha*A*x + y. */ jx = kx; if (*incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { y[i__] += temp * a[i__ + j * a_dim1]; /* L50: */ } } jx += *incx; /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; iy = ky; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { y[iy] += temp * a[i__ + j * a_dim1]; iy += *incy; /* L70: */ } } jx += *incx; /* L80: */ } } } else { /* Form y := alpha*A'*x + y. */ jy = ky; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[i__]; /* L90: */ } y[jy] += *alpha * temp; jy += *incy; /* L100: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; ix = kx; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[ix]; ix += *incx; /* L110: */ } y[jy] += *alpha * temp; jy += *incy; /* L120: */ } } } return 0; /* End of DGEMV . */ } /* _starpu_dgemv_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgeqr2.c000066400000000000000000000107321413463044200213040ustar00rootroot00000000000000/* dgeqr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgeqr2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, k; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQR2 computes a QR factorization of a real m by n matrix A: */ /* A = Q * R. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(m,n) by n upper trapezoidal matrix R (R is */ /* upper triangular if m >= n); the elements below the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQR2", &i__1); return 0; } k = min(*m,*n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ i__2 = *m - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfp_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m)+ i__ * a_dim1] , &c__1, &tau[i__]); if (i__ < *n) { /* Apply H(i) to A(i:m,i+1:n) from the left */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__ + 1; i__3 = *n - i__; _starpu_dlarf_("Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[ i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1]); a[i__ + i__ * a_dim1] = aii; } /* L10: */ } return 0; /* End of DGEQR2 */ } /* _starpu_dgeqr2_ */ starpu-1.3.9+dfsg/min-dgels/additional/dgeqrf.c000066400000000000000000000164271413463044200213770ustar00rootroot00000000000000/* dgeqrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgeqrf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQRF computes a QR factorization of a real M-by-N matrix A: */ /* A = Q * R. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(M,N)-by-N upper trapezoidal matrix R (R is */ /* upper triangular if m >= n); the elements below the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of min(m,n) elementary reflectors (see Further */ /* Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* For optimum performance LWORK >= N*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*n) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQRF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGEQRF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGEQRF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the QR factorization of the current block */ /* A(i:m,i:i+ib-1) */ i__3 = *m - i__ + 1; _starpu_dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ 1], &iinfo); if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__3 = *m - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(i:m,i+ib:n) from the left */ i__3 = *m - i__ + 1; i__4 = *n - i__ - ib + 1; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__3, & i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + 1], &ldwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; _starpu_dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] , &iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGEQRF */ } /* _starpu_dgeqrf_ */ starpu-1.3.9+dfsg/min-dgels/additional/dger.c000066400000000000000000000116031413463044200210370ustar00rootroot00000000000000/* dger.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dger_(integer *m, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, jy, kx, info; doublereal temp; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGER performs the rank 1 operation */ /* A := alpha*x*y' + A, */ /* where alpha is a scalar, x is an m element vector, y is an n element */ /* vector and A is an m by n matrix. */ /* Arguments */ /* ========== */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the m */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the n */ /* element vector y. */ /* Unchanged on exit. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. On exit, A is */ /* overwritten by the updated matrix. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ info = 0; if (*m < 0) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*incy == 0) { info = 7; } else if (*lda < max(1,*m)) { info = 9; } if (info != 0) { _starpu_xerbla_("DGER ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0.) { return 0; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (*incy > 0) { jy = 1; } else { jy = 1 - (*n - 1) * *incy; } if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (y[jy] != 0.) { temp = *alpha * y[jy]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[i__] * temp; /* L10: */ } } jy += *incy; /* L20: */ } } else { if (*incx > 0) { kx = 1; } else { kx = 1 - (*m - 1) * *incx; } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (y[jy] != 0.) { temp = *alpha * y[jy]; ix = kx; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[ix] * temp; ix += *incx; /* L30: */ } } jy += *incy; /* L40: */ } } return 0; /* End of DGER . */ } /* _starpu_dger_ */ starpu-1.3.9+dfsg/min-dgels/additional/disnan.c000066400000000000000000000026311413463044200213730ustar00rootroot00000000000000/* disnan.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" logical _starpu_disnan_(doublereal *din) { /* System generated locals */ logical ret_val; /* Local variables */ extern logical _starpu_dlaisnan_(doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DISNAN returns .TRUE. if its argument is NaN, and .FALSE. */ /* otherwise. To be replaced by the Fortran 2003 intrinsic in the */ /* future. */ /* Arguments */ /* ========= */ /* DIN (input) DOUBLE PRECISION */ /* Input to test for NaN. */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ ret_val = _starpu_dlaisnan_(din, din); return ret_val; } /* _starpu_disnan_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlabad.c000066400000000000000000000046161413463044200213330ustar00rootroot00000000000000/* dlabad.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlabad_(doublereal *small, doublereal *large) { /* Builtin functions */ double d_lg10(doublereal *), sqrt(doublereal); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLABAD takes as input the values computed by DLAMCH for underflow and */ /* overflow, and returns the square root of each of these values if the */ /* log of LARGE is sufficiently large. This subroutine is intended to */ /* identify machines with a large exponent range, such as the Crays, and */ /* redefine the underflow and overflow limits to be the square roots of */ /* the values computed by DLAMCH. This subroutine is needed because */ /* DLAMCH does not compensate for poor arithmetic in the upper half of */ /* the exponent range, as is found on a Cray. */ /* Arguments */ /* ========= */ /* SMALL (input/output) DOUBLE PRECISION */ /* On entry, the underflow threshold as computed by DLAMCH. */ /* On exit, if LOG10(LARGE) is sufficiently large, the square */ /* root of SMALL, otherwise unchanged. */ /* LARGE (input/output) DOUBLE PRECISION */ /* On entry, the overflow threshold as computed by DLAMCH. */ /* On exit, if LOG10(LARGE) is sufficiently large, the square */ /* root of LARGE, otherwise unchanged. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* If it looks like we're on a Cray, take the square root of */ /* SMALL and LARGE to avoid overflow and underflow problems. */ if (d_lg10(large) > 2e3) { *small = sqrt(*small); *large = sqrt(*large); } return 0; /* End of DLABAD */ } /* _starpu_dlabad_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlaisnan.c000066400000000000000000000035401413463044200217100ustar00rootroot00000000000000/* dlaisnan.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" logical _starpu_dlaisnan_(doublereal *din1, doublereal *din2) { /* System generated locals */ logical ret_val; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is not for general use. It exists solely to avoid */ /* over-optimization in DISNAN. */ /* DLAISNAN checks for NaNs by comparing its two arguments for */ /* inequality. NaN is the only floating-point value where NaN != NaN */ /* returns .TRUE. To check for NaNs, pass the same variable as both */ /* arguments. */ /* A compiler must assume that the two arguments are */ /* not the same variable, and the test will not be optimized away. */ /* Interprocedural or whole-program optimization may delete this */ /* test. The ISNAN functions will be replaced by the correct */ /* Fortran 03 intrinsic once the intrinsic is widely available. */ /* Arguments */ /* ========= */ /* DIN1 (input) DOUBLE PRECISION */ /* DIN2 (input) DOUBLE PRECISION */ /* Two numbers to compare for inequality. */ /* ===================================================================== */ /* .. Executable Statements .. */ ret_val = *din1 != *din2; return ret_val; } /* _starpu_dlaisnan_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlamch.c000066400000000000000000000647461413463044200213660ustar00rootroot00000000000000/* dlamch.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b32 = 0.; doublereal _starpu_dlamch_(char *cmach) { /* Initialized data */ static logical first = TRUE_; /* System generated locals */ integer i__1; doublereal ret_val; /* Builtin functions */ double pow_di(doublereal *, integer *); /* Local variables */ static doublereal t; integer it; static doublereal rnd, eps, base; integer beta; static doublereal emin, prec, emax; integer imin, imax; logical lrnd; static doublereal rmin, rmax; doublereal rmach; extern logical _starpu_lsame_(char *, char *); doublereal small; static doublereal sfmin; extern /* Subroutine */ int _starpu_dlamc2_(integer *, integer *, logical *, doublereal *, integer *, doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMCH determines double precision machine parameters. */ /* Arguments */ /* ========= */ /* CMACH (input) CHARACTER*1 */ /* Specifies the value to be returned by DLAMCH: */ /* = 'E' or 'e', DLAMCH := eps */ /* = 'S' or 's , DLAMCH := sfmin */ /* = 'B' or 'b', DLAMCH := base */ /* = 'P' or 'p', DLAMCH := eps*base */ /* = 'N' or 'n', DLAMCH := t */ /* = 'R' or 'r', DLAMCH := rnd */ /* = 'M' or 'm', DLAMCH := emin */ /* = 'U' or 'u', DLAMCH := rmin */ /* = 'L' or 'l', DLAMCH := emax */ /* = 'O' or 'o', DLAMCH := rmax */ /* where */ /* eps = relative machine precision */ /* sfmin = safe minimum, such that 1/sfmin does not overflow */ /* base = base of the machine */ /* prec = eps*base */ /* t = number of (base) digits in the mantissa */ /* rnd = 1.0 when rounding occurs in addition, 0.0 otherwise */ /* emin = minimum exponent before (gradual) underflow */ /* rmin = underflow threshold - base**(emin-1) */ /* emax = largest exponent before overflow */ /* rmax = overflow threshold - (base**emax)*(1-eps) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Save statement .. */ /* .. */ /* .. Data statements .. */ /* .. */ /* .. Executable Statements .. */ if (first) { _starpu_dlamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax); base = (doublereal) beta; t = (doublereal) it; if (lrnd) { rnd = 1.; i__1 = 1 - it; eps = pow_di(&base, &i__1) / 2; } else { rnd = 0.; i__1 = 1 - it; eps = pow_di(&base, &i__1); } prec = eps * base; emin = (doublereal) imin; emax = (doublereal) imax; sfmin = rmin; small = 1. / rmax; if (small >= sfmin) { /* Use SMALL plus a bit, to avoid the possibility of rounding */ /* causing overflow when computing 1/sfmin. */ sfmin = small * (eps + 1.); } } if (_starpu_lsame_(cmach, "E")) { rmach = eps; } else if (_starpu_lsame_(cmach, "S")) { rmach = sfmin; } else if (_starpu_lsame_(cmach, "B")) { rmach = base; } else if (_starpu_lsame_(cmach, "P")) { rmach = prec; } else if (_starpu_lsame_(cmach, "N")) { rmach = t; } else if (_starpu_lsame_(cmach, "R")) { rmach = rnd; } else if (_starpu_lsame_(cmach, "M")) { rmach = emin; } else if (_starpu_lsame_(cmach, "U")) { rmach = rmin; } else if (_starpu_lsame_(cmach, "L")) { rmach = emax; } else if (_starpu_lsame_(cmach, "O")) { rmach = rmax; } ret_val = rmach; first = FALSE_; return ret_val; /* End of DLAMCH */ } /* _starpu_dlamch_ */ /* *********************************************************************** */ /* Subroutine */ int _starpu_dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1) { /* Initialized data */ static logical first = TRUE_; /* System generated locals */ doublereal d__1, d__2; /* Local variables */ doublereal a, b, c__, f, t1, t2; static integer lt; doublereal one, qtr; static logical lrnd; static integer lbeta; doublereal savec; extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); static logical lieee1; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMC1 determines the machine parameters given by BETA, T, RND, and */ /* IEEE1. */ /* Arguments */ /* ========= */ /* BETA (output) INTEGER */ /* The base of the machine. */ /* T (output) INTEGER */ /* The number of ( BETA ) digits in the mantissa. */ /* RND (output) LOGICAL */ /* Specifies whether proper rounding ( RND = .TRUE. ) or */ /* chopping ( RND = .FALSE. ) occurs in addition. This may not */ /* be a reliable guide to the way in which the machine performs */ /* its arithmetic. */ /* IEEE1 (output) LOGICAL */ /* Specifies whether rounding appears to be done in the IEEE */ /* 'round to nearest' style. */ /* Further Details */ /* =============== */ /* The routine is based on the routine ENVRON by Malcolm and */ /* incorporates suggestions by Gentleman and Marovich. See */ /* Malcolm M. A. (1972) Algorithms to reveal properties of */ /* floating-point arithmetic. Comms. of the ACM, 15, 949-951. */ /* Gentleman W. M. and Marovich S. B. (1974) More on algorithms */ /* that reveal properties of floating point arithmetic units. */ /* Comms. of the ACM, 17, 276-277. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Save statement .. */ /* .. */ /* .. Data statements .. */ /* .. */ /* .. Executable Statements .. */ if (first) { one = 1.; /* LBETA, LIEEE1, LT and LRND are the local values of BETA, */ /* IEEE1, T and RND. */ /* Throughout this routine we use the function DLAMC3 to ensure */ /* that relevant values are stored and not held in registers, or */ /* are not affected by optimizers. */ /* Compute a = 2.0**m with the smallest positive integer m such */ /* that */ /* fl( a + 1.0 ) = a. */ a = 1.; c__ = 1.; /* + WHILE( C.EQ.ONE )LOOP */ L10: if (c__ == one) { a *= 2; c__ = _starpu_dlamc3_(&a, &one); d__1 = -a; c__ = _starpu_dlamc3_(&c__, &d__1); goto L10; } /* + END WHILE */ /* Now compute b = 2.0**m with the smallest positive integer m */ /* such that */ /* fl( a + b ) .gt. a. */ b = 1.; c__ = _starpu_dlamc3_(&a, &b); /* + WHILE( C.EQ.A )LOOP */ L20: if (c__ == a) { b *= 2; c__ = _starpu_dlamc3_(&a, &b); goto L20; } /* + END WHILE */ /* Now compute the base. a and c are neighbouring floating point */ /* numbers in the interval ( beta**t, beta**( t + 1 ) ) and so */ /* their difference is beta. Adding 0.25 to c is to ensure that it */ /* is truncated to beta and not ( beta - 1 ). */ qtr = one / 4; savec = c__; d__1 = -a; c__ = _starpu_dlamc3_(&c__, &d__1); lbeta = (integer) (c__ + qtr); /* Now determine whether rounding or chopping occurs, by adding a */ /* bit less than beta/2 and a bit more than beta/2 to a. */ b = (doublereal) lbeta; d__1 = b / 2; d__2 = -b / 100; f = _starpu_dlamc3_(&d__1, &d__2); c__ = _starpu_dlamc3_(&f, &a); if (c__ == a) { lrnd = TRUE_; } else { lrnd = FALSE_; } d__1 = b / 2; d__2 = b / 100; f = _starpu_dlamc3_(&d__1, &d__2); c__ = _starpu_dlamc3_(&f, &a); if (lrnd && c__ == a) { lrnd = FALSE_; } /* Try and decide whether rounding is done in the IEEE 'round to */ /* nearest' style. B/2 is half a unit in the last place of the two */ /* numbers A and SAVEC. Furthermore, A is even, i.e. has last bit */ /* zero, and SAVEC is odd. Thus adding B/2 to A should not change */ /* A, but adding B/2 to SAVEC should change SAVEC. */ d__1 = b / 2; t1 = _starpu_dlamc3_(&d__1, &a); d__1 = b / 2; t2 = _starpu_dlamc3_(&d__1, &savec); lieee1 = t1 == a && t2 > savec && lrnd; /* Now find the mantissa, t. It should be the integer part of */ /* log to the base beta of a, however it is safer to determine t */ /* by powering. So we find t as the smallest positive integer for */ /* which */ /* fl( beta**t + 1.0 ) = 1.0. */ lt = 0; a = 1.; c__ = 1.; /* + WHILE( C.EQ.ONE )LOOP */ L30: if (c__ == one) { ++lt; a *= lbeta; c__ = _starpu_dlamc3_(&a, &one); d__1 = -a; c__ = _starpu_dlamc3_(&c__, &d__1); goto L30; } /* + END WHILE */ } *beta = lbeta; *t = lt; *rnd = lrnd; *ieee1 = lieee1; first = FALSE_; return 0; /* End of DLAMC1 */ } /* _starpu_dlamc1_ */ /* *********************************************************************** */ /* Subroutine */ int _starpu_dlamc2_(integer *beta, integer *t, logical *rnd, doublereal *eps, integer *emin, doublereal *rmin, integer *emax, doublereal *rmax) { /* Initialized data */ static logical first = TRUE_; static logical iwarn = FALSE_; /* Format strings */ static char fmt_9999[] = "(//\002 WARNING. The value EMIN may be incorre" "ct:-\002,\002 EMIN = \002,i8,/\002 If, after inspection, the va" "lue EMIN looks\002,\002 acceptable please comment out \002,/\002" " the IF block as marked within the code of routine\002,\002 DLAM" "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)"; /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ double pow_di(doublereal *, integer *); integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); /* Local variables */ doublereal a, b, c__; integer i__; static integer lt; doublereal one, two; logical ieee; doublereal half; logical lrnd; static doublereal leps; doublereal zero; static integer lbeta; doublereal rbase; static integer lemin, lemax; integer gnmin; doublereal small; integer gpmin; doublereal third; static doublereal lrmin, lrmax; doublereal sixth; extern /* Subroutine */ int _starpu_dlamc1_(integer *, integer *, logical *, logical *); extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); logical lieee1; extern /* Subroutine */ int _starpu_dlamc4_(integer *, doublereal *, integer *), _starpu_dlamc5_(integer *, integer *, integer *, logical *, integer *, doublereal *); integer ngnmin, ngpmin; /* Fortran I/O blocks */ static cilist io___58 = { 0, 6, 0, fmt_9999, 0 }; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMC2 determines the machine parameters specified in its argument */ /* list. */ /* Arguments */ /* ========= */ /* BETA (output) INTEGER */ /* The base of the machine. */ /* T (output) INTEGER */ /* The number of ( BETA ) digits in the mantissa. */ /* RND (output) LOGICAL */ /* Specifies whether proper rounding ( RND = .TRUE. ) or */ /* chopping ( RND = .FALSE. ) occurs in addition. This may not */ /* be a reliable guide to the way in which the machine performs */ /* its arithmetic. */ /* EPS (output) DOUBLE PRECISION */ /* The smallest positive number such that */ /* fl( 1.0 - EPS ) .LT. 1.0, */ /* where fl denotes the computed value. */ /* EMIN (output) INTEGER */ /* The minimum exponent before (gradual) underflow occurs. */ /* RMIN (output) DOUBLE PRECISION */ /* The smallest normalized number for the machine, given by */ /* BASE**( EMIN - 1 ), where BASE is the floating point value */ /* of BETA. */ /* EMAX (output) INTEGER */ /* The maximum exponent before overflow occurs. */ /* RMAX (output) DOUBLE PRECISION */ /* The largest positive number for the machine, given by */ /* BASE**EMAX * ( 1 - EPS ), where BASE is the floating point */ /* value of BETA. */ /* Further Details */ /* =============== */ /* The computation of EPS is based on a routine PARANOIA by */ /* W. Kahan of the University of California at Berkeley. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Save statement .. */ /* .. */ /* .. Data statements .. */ /* .. */ /* .. Executable Statements .. */ if (first) { zero = 0.; one = 1.; two = 2.; /* LBETA, LT, LRND, LEPS, LEMIN and LRMIN are the local values of */ /* BETA, T, RND, EPS, EMIN and RMIN. */ /* Throughout this routine we use the function DLAMC3 to ensure */ /* that relevant values are stored and not held in registers, or */ /* are not affected by optimizers. */ /* DLAMC1 returns the parameters LBETA, LT, LRND and LIEEE1. */ _starpu_dlamc1_(&lbeta, <, &lrnd, &lieee1); /* Start to find EPS. */ b = (doublereal) lbeta; i__1 = -lt; a = pow_di(&b, &i__1); leps = a; /* Try some tricks to see whether or not this is the correct EPS. */ b = two / 3; half = one / 2; d__1 = -half; sixth = _starpu_dlamc3_(&b, &d__1); third = _starpu_dlamc3_(&sixth, &sixth); d__1 = -half; b = _starpu_dlamc3_(&third, &d__1); b = _starpu_dlamc3_(&b, &sixth); b = abs(b); if (b < leps) { b = leps; } leps = 1.; /* + WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */ L10: if (leps > b && b > zero) { leps = b; d__1 = half * leps; /* Computing 5th power */ d__3 = two, d__4 = d__3, d__3 *= d__3; /* Computing 2nd power */ d__5 = leps; d__2 = d__4 * (d__3 * d__3) * (d__5 * d__5); c__ = _starpu_dlamc3_(&d__1, &d__2); d__1 = -c__; c__ = _starpu_dlamc3_(&half, &d__1); b = _starpu_dlamc3_(&half, &c__); d__1 = -b; c__ = _starpu_dlamc3_(&half, &d__1); b = _starpu_dlamc3_(&half, &c__); goto L10; } /* + END WHILE */ if (a < leps) { leps = a; } /* Computation of EPS complete. */ /* Now find EMIN. Let A = + or - 1, and + or - (1 + BASE**(-3)). */ /* Keep dividing A by BETA until (gradual) underflow occurs. This */ /* is detected when we cannot recover the previous A. */ rbase = one / lbeta; small = one; for (i__ = 1; i__ <= 3; ++i__) { d__1 = small * rbase; small = _starpu_dlamc3_(&d__1, &zero); /* L20: */ } a = _starpu_dlamc3_(&one, &small); _starpu_dlamc4_(&ngpmin, &one, &lbeta); d__1 = -one; _starpu_dlamc4_(&ngnmin, &d__1, &lbeta); _starpu_dlamc4_(&gpmin, &a, &lbeta); d__1 = -a; _starpu_dlamc4_(&gnmin, &d__1, &lbeta); ieee = FALSE_; if (ngpmin == ngnmin && gpmin == gnmin) { if (ngpmin == gpmin) { lemin = ngpmin; /* ( Non twos-complement machines, no gradual underflow; */ /* e.g., VAX ) */ } else if (gpmin - ngpmin == 3) { lemin = ngpmin - 1 + lt; ieee = TRUE_; /* ( Non twos-complement machines, with gradual underflow; */ /* e.g., IEEE standard followers ) */ } else { lemin = min(ngpmin,gpmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } } else if (ngpmin == gpmin && ngnmin == gnmin) { if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) { lemin = max(ngpmin,ngnmin); /* ( Twos-complement machines, no gradual underflow; */ /* e.g., CYBER 205 ) */ } else { lemin = min(ngpmin,ngnmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } } else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 && gpmin == gnmin) { if (gpmin - min(ngpmin,ngnmin) == 3) { lemin = max(ngpmin,ngnmin) - 1 + lt; /* ( Twos-complement machines with gradual underflow; */ /* no known machine ) */ } else { lemin = min(ngpmin,ngnmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } } else { /* Computing MIN */ i__1 = min(ngpmin,ngnmin), i__1 = min(i__1,gpmin); lemin = min(i__1,gnmin); /* ( A guess; no known machine ) */ iwarn = TRUE_; } first = FALSE_; /* ** */ /* Comment out this if block if EMIN is ok */ if (iwarn) { first = TRUE_; s_wsfe(&io___58); do_fio(&c__1, (char *)&lemin, (ftnlen)sizeof(integer)); e_wsfe(); } /* ** */ /* Assume IEEE arithmetic if we found denormalised numbers above, */ /* or if arithmetic seems to round in the IEEE style, determined */ /* in routine DLAMC1. A true IEEE machine should have both things */ /* true; however, faulty machines may have one or the other. */ ieee = ieee || lieee1; /* Compute RMIN by successive division by BETA. We could compute */ /* RMIN as BASE**( EMIN - 1 ), but some machines underflow during */ /* this computation. */ lrmin = 1.; i__1 = 1 - lemin; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = lrmin * rbase; lrmin = _starpu_dlamc3_(&d__1, &zero); /* L30: */ } /* Finally, call DLAMC5 to compute EMAX and RMAX. */ _starpu_dlamc5_(&lbeta, <, &lemin, &ieee, &lemax, &lrmax); } *beta = lbeta; *t = lt; *rnd = lrnd; *eps = leps; *emin = lemin; *rmin = lrmin; *emax = lemax; *rmax = lrmax; return 0; /* End of DLAMC2 */ } /* _starpu_dlamc2_ */ /* *********************************************************************** */ doublereal _starpu_dlamc3_(doublereal *a, doublereal *b) { /* System generated locals */ doublereal ret_val; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMC3 is intended to force A and B to be stored prior to doing */ /* the addition of A and B , for use in situations where optimizers */ /* might hold one of these in a register. */ /* Arguments */ /* ========= */ /* A (input) DOUBLE PRECISION */ /* B (input) DOUBLE PRECISION */ /* The values A and B. */ /* ===================================================================== */ /* .. Executable Statements .. */ ret_val = *a + *b; return ret_val; /* End of DLAMC3 */ } /* _starpu_dlamc3_ */ /* *********************************************************************** */ /* Subroutine */ int _starpu_dlamc4_(integer *emin, doublereal *start, integer *base) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ doublereal a; integer i__; doublereal b1, b2, c1, c2, d1, d2, one, zero, rbase; extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMC4 is a service routine for DLAMC2. */ /* Arguments */ /* ========= */ /* EMIN (output) INTEGER */ /* The minimum exponent before (gradual) underflow, computed by */ /* setting A = START and dividing by BASE until the previous A */ /* can not be recovered. */ /* START (input) DOUBLE PRECISION */ /* The starting point for determining EMIN. */ /* BASE (input) INTEGER */ /* The base of the machine. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ a = *start; one = 1.; rbase = one / *base; zero = 0.; *emin = 1; d__1 = a * rbase; b1 = _starpu_dlamc3_(&d__1, &zero); c1 = a; c2 = a; d1 = a; d2 = a; /* + WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. */ /* $ ( D1.EQ.A ).AND.( D2.EQ.A ) )LOOP */ L10: if (c1 == a && c2 == a && d1 == a && d2 == a) { --(*emin); a = b1; d__1 = a / *base; b1 = _starpu_dlamc3_(&d__1, &zero); d__1 = b1 * *base; c1 = _starpu_dlamc3_(&d__1, &zero); d1 = zero; i__1 = *base; for (i__ = 1; i__ <= i__1; ++i__) { d1 += b1; /* L20: */ } d__1 = a * rbase; b2 = _starpu_dlamc3_(&d__1, &zero); d__1 = b2 / rbase; c2 = _starpu_dlamc3_(&d__1, &zero); d2 = zero; i__1 = *base; for (i__ = 1; i__ <= i__1; ++i__) { d2 += b2; /* L30: */ } goto L10; } /* + END WHILE */ return 0; /* End of DLAMC4 */ } /* _starpu_dlamc4_ */ /* *********************************************************************** */ /* Subroutine */ int _starpu_dlamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, doublereal *rmax) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ integer i__; doublereal y, z__; integer try__, lexp; doublereal oldy; integer uexp, nbits; extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); doublereal recbas; integer exbits, expsum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMC5 attempts to compute RMAX, the largest machine floating-point */ /* number, without overflow. It assumes that EMAX + abs(EMIN) sum */ /* approximately to a power of 2. It will fail on machines where this */ /* assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */ /* EMAX = 28718). It will also fail if the value supplied for EMIN is */ /* too large (i.e. too close to zero), probably with overflow. */ /* Arguments */ /* ========= */ /* BETA (input) INTEGER */ /* The base of floating-point arithmetic. */ /* P (input) INTEGER */ /* The number of base BETA digits in the mantissa of a */ /* floating-point value. */ /* EMIN (input) INTEGER */ /* The minimum exponent before (gradual) underflow. */ /* IEEE (input) LOGICAL */ /* A logical flag specifying whether or not the arithmetic */ /* system is thought to comply with the IEEE standard. */ /* EMAX (output) INTEGER */ /* The largest exponent before overflow */ /* RMAX (output) DOUBLE PRECISION */ /* The largest machine floating-point number. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* First compute LEXP and UEXP, two powers of 2 that bound */ /* abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */ /* approximately to the bound that is closest to abs(EMIN). */ /* (EMAX is the exponent of the required number RMAX). */ lexp = 1; exbits = 1; L10: try__ = lexp << 1; if (try__ <= -(*emin)) { lexp = try__; ++exbits; goto L10; } if (lexp == -(*emin)) { uexp = lexp; } else { uexp = try__; ++exbits; } /* Now -LEXP is less than or equal to EMIN, and -UEXP is greater */ /* than or equal to EMIN. EXBITS is the number of bits needed to */ /* store the exponent. */ if (uexp + *emin > -lexp - *emin) { expsum = lexp << 1; } else { expsum = uexp << 1; } /* EXPSUM is the exponent range, approximately equal to */ /* EMAX - EMIN + 1 . */ *emax = expsum + *emin - 1; nbits = exbits + 1 + *p; /* NBITS is the total number of bits needed to store a */ /* floating-point number. */ if (nbits % 2 == 1 && *beta == 2) { /* Either there are an odd number of bits used to store a */ /* floating-point number, which is unlikely, or some bits are */ /* not used in the representation of numbers, which is possible, */ /* (e.g. Cray machines) or the mantissa has an implicit bit, */ /* (e.g. IEEE machines, Dec Vax machines), which is perhaps the */ /* most likely. We have to assume the last alternative. */ /* If this is true, then we need to reduce EMAX by one because */ /* there must be some way of representing zero in an implicit-bit */ /* system. On machines like Cray, we are reducing EMAX by one */ /* unnecessarily. */ --(*emax); } if (*ieee) { /* Assume we are on an IEEE machine which reserves one exponent */ /* for infinity and NaN. */ --(*emax); } /* Now create RMAX, the largest machine number, which should */ /* be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */ /* First compute 1.0 - BETA**(-P), being careful that the */ /* result is less than 1.0 . */ recbas = 1. / *beta; z__ = *beta - 1.; y = 0.; i__1 = *p; for (i__ = 1; i__ <= i__1; ++i__) { z__ *= recbas; if (y < 1.) { oldy = y; } y = _starpu_dlamc3_(&y, &z__); /* L20: */ } if (y >= 1.) { y = oldy; } /* Now multiply by BETA**EMAX to get RMAX. */ i__1 = *emax; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = y * *beta; y = _starpu_dlamc3_(&d__1, &c_b32); /* L30: */ } *rmax = y; return 0; /* End of DLAMC5 */ } /* _starpu_dlamc5_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlange.c000066400000000000000000000121061413463044200213470ustar00rootroot00000000000000/* dlange.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlange_(char *norm, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal sum, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANGE returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real matrix A. */ /* Description */ /* =========== */ /* DLANGE returns the value */ /* DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANGE as described */ /* above. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. When M = 0, */ /* DLANGE is set to zero. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. When N = 0, */ /* DLANGE is set to zero. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(M,1). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; /* Function Body */ if (min(*m,*n) == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L30: */ } value = max(value,sum); /* L40: */ } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L50: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L60: */ } /* L70: */ } value = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L80: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(m, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L90: */ } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANGE */ } /* _starpu_dlange_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlapy2.c000066400000000000000000000033661413463044200213200ustar00rootroot00000000000000/* dlapy2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dlapy2_(doublereal *x, doublereal *y) { /* System generated locals */ doublereal ret_val, d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal w, z__, xabs, yabs; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary */ /* overflow. */ /* Arguments */ /* ========= */ /* X (input) DOUBLE PRECISION */ /* Y (input) DOUBLE PRECISION */ /* X and Y specify the values x and y. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ xabs = abs(*x); yabs = abs(*y); w = max(xabs,yabs); z__ = min(xabs,yabs); if (z__ == 0.) { ret_val = w; } else { /* Computing 2nd power */ d__1 = z__ / w; ret_val = w * sqrt(d__1 * d__1 + 1.); } return ret_val; /* End of DLAPY2 */ } /* _starpu_dlapy2_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlarf.c000066400000000000000000000130411413463044200212040ustar00rootroot00000000000000/* dlarf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = 1.; static doublereal c_b5 = 0.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlarf_(char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work) { /* System generated locals */ integer c_dim1, c_offset; doublereal d__1; /* Local variables */ integer i__; logical applyleft; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer lastc, lastv; extern integer _starpu_iladlc_(integer *, integer *, doublereal *, integer *), _starpu_iladlr_(integer *, integer *, doublereal *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARF applies a real elementary reflector H to a real m by n matrix */ /* C, from either the left or the right. H is represented in the form */ /* H = I - tau * v * v' */ /* where tau is a real scalar and v is a real vector. */ /* If tau = 0, then H is taken to be the unit matrix. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': form H * C */ /* = 'R': form C * H */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* V (input) DOUBLE PRECISION array, dimension */ /* (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ /* or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ /* The vector v in the representation of H. V is not used if */ /* TAU = 0. */ /* INCV (input) INTEGER */ /* The increment between elements of v. INCV <> 0. */ /* TAU (input) DOUBLE PRECISION */ /* The value tau in the representation of H. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ /* or C * H if SIDE = 'R'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L' */ /* or (M) if SIDE = 'R' */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --v; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ applyleft = _starpu_lsame_(side, "L"); lastv = 0; lastc = 0; if (*tau != 0.) { /* Set up variables for scanning V. LASTV begins pointing to the end */ /* of V. */ if (applyleft) { lastv = *m; } else { lastv = *n; } if (*incv > 0) { i__ = (lastv - 1) * *incv + 1; } else { i__ = 1; } /* Look for the last non-zero row in V. */ while(lastv > 0 && v[i__] == 0.) { --lastv; i__ -= *incv; } if (applyleft) { /* Scan for the last non-zero column in C(1:lastv,:). */ lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); } else { /* Scan for the last non-zero row in C(:,1:lastv). */ lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); } } /* Note that lastc.eq.0 renders the BLAS operations null; no special */ /* case is needed at this level. */ if (applyleft) { /* Form H * C */ if (lastv > 0) { /* w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */ _starpu_dgemv_("Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, & v[1], incv, &c_b5, &work[1], &c__1); /* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */ d__1 = -(*tau); _starpu_dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[ c_offset], ldc); } } else { /* Form C * H */ if (lastv > 0) { /* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ _starpu_dgemv_("No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */ d__1 = -(*tau); _starpu_dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[ c_offset], ldc); } } return 0; /* End of DLARF */ } /* _starpu_dlarf_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlarfb.c000066400000000000000000000522171413463044200213560ustar00rootroot00000000000000/* dlarfb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b14 = 1.; static doublereal c_b25 = -1.; /* Subroutine */ int _starpu_dlarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, doublereal *v, integer * ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, doublereal *work, integer *ldwork) { /* System generated locals */ integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2; /* Local variables */ integer i__, j; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer lastc; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer lastv; extern integer _starpu_iladlc_(integer *, integer *, doublereal *, integer *), _starpu_iladlr_(integer *, integer *, doublereal *, integer *); char transt[1]; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFB applies a real block reflector H or its transpose H' to a */ /* real m by n matrix C, from either the left or the right. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply H or H' from the Left */ /* = 'R': apply H or H' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply H (No transpose) */ /* = 'T': apply H' (Transpose) */ /* DIRECT (input) CHARACTER*1 */ /* Indicates how H is formed from a product of elementary */ /* reflectors */ /* = 'F': H = H(1) H(2) . . . H(k) (Forward) */ /* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ /* STOREV (input) CHARACTER*1 */ /* Indicates how the vectors which define the elementary */ /* reflectors are stored: */ /* = 'C': Columnwise */ /* = 'R': Rowwise */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* K (input) INTEGER */ /* The order of the matrix T (= the number of elementary */ /* reflectors whose product defines the block reflector). */ /* V (input) DOUBLE PRECISION array, dimension */ /* (LDV,K) if STOREV = 'C' */ /* (LDV,M) if STOREV = 'R' and SIDE = 'L' */ /* (LDV,N) if STOREV = 'R' and SIDE = 'R' */ /* The matrix V. See further details. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. */ /* If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ /* if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ /* if STOREV = 'R', LDV >= K. */ /* T (input) DOUBLE PRECISION array, dimension (LDT,K) */ /* The triangular k by k matrix T in the representation of the */ /* block reflector. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= K. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDA >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) */ /* LDWORK (input) INTEGER */ /* The leading dimension of the array WORK. */ /* If SIDE = 'L', LDWORK >= max(1,N); */ /* if SIDE = 'R', LDWORK >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; work_dim1 = *ldwork; work_offset = 1 + work_dim1; work -= work_offset; /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } if (_starpu_lsame_(trans, "N")) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (_starpu_lsame_(storev, "C")) { if (_starpu_lsame_(direct, "F")) { /* Let V = ( V1 ) (first K rows) */ /* ( V2 ) */ /* where V1 is unit lower triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(m, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) */ /* W := C1' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); /* L10: */ } /* W := W * V1 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2'*V2 */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V * W' */ if (lastv > *k) { /* C2 := C2 - V2 * W' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &i__1, &lastc, k, & c_b25, &v[*k + 1 + v_dim1], ldv, &work[ work_offset], ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc); } /* W := W * V1' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L20: */ } /* L30: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(n, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ /* W := C1 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); /* L40: */ } /* W := W * V1 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2 * V2 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V' */ if (lastv > *k) { /* C2 := C2 - W * V2' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[*k + 1 + v_dim1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc); } /* W := W * V1' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L50: */ } /* L60: */ } } } else { /* Let V = ( V1 ) */ /* ( V2 ) (last K rows) */ /* where V2 is unit upper triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(m, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) */ /* W := C2' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[ j * work_dim1 + 1], &c__1); /* L70: */ } /* W := W * V2 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1'*V1 */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V * W' */ if (lastv > *k) { /* C1 := C1 - V1 * W' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &i__1, &lastc, k, & c_b25, &v[v_offset], ldv, &work[work_offset], ldwork, &c_b14, &c__[c_offset], ldc); } /* W := W * V2' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); /* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L80: */ } /* L90: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(n, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ /* W := C2 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, & work[j * work_dim1 + 1], &c__1); /* L100: */ } /* W := W * V2 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1 * V1 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V' */ if (lastv > *k) { /* C1 := C1 - W * V1' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc); } /* W := W * V2' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); /* C2 := C2 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1]; /* L110: */ } /* L120: */ } } } } else if (_starpu_lsame_(storev, "R")) { if (_starpu_lsame_(direct, "F")) { /* Let V = ( V1 V2 ) (V1: first K columns) */ /* where V1 is unit upper triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, m, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) */ /* W := C1' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); /* L130: */ } /* W := W * V1' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2'*V2' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V' * W' */ if (lastv > *k) { /* C2 := C2 - V2' * W' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[(*k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc); } /* W := W * V1 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L140: */ } /* L150: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, n, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V' = (C1*V1' + C2*V2') (stored in WORK) */ /* W := C1 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); /* L160: */ } /* W := W * V1' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2 * V2' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, k, &i__1, & c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V */ if (lastv > *k) { /* C2 := C2 - W * V2 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc); } /* W := W * V1 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L170: */ } /* L180: */ } } } else { /* Let V = ( V1 V2 ) (V2: last K columns) */ /* where V2 is unit lower triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, m, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) */ /* W := C2' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[ j * work_dim1 + 1], &c__1); /* L190: */ } /* W := W * V2' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1'*V1' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V' * W' */ if (lastv > *k) { /* C1 := C1 - V1' * W' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[v_offset], ldv, &work[work_offset], ldwork, & c_b14, &c__[c_offset], ldc); } /* W := W * V2 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); /* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L200: */ } /* L210: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, n, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V' = (C1*V1' + C2*V2') (stored in WORK) */ /* W := C2 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); /* L220: */ } /* W := W * V2' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1 * V1' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V */ if (lastv > *k) { /* C1 := C1 - W * V1 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc); } /* W := W * V2 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1]; /* L230: */ } /* L240: */ } } } } return 0; /* End of DLARFB */ } /* _starpu_dlarfb_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlarfg.c000066400000000000000000000103401413463044200213520ustar00rootroot00000000000000/* dlarfg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ integer j, knt; doublereal beta; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal xnorm; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); doublereal safmin, rsafmn; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFG generates a real elementary reflector H of order n, such */ /* that */ /* H * ( alpha ) = ( beta ), H' * H = I. */ /* ( x ) ( 0 ) */ /* where alpha and beta are scalars, and x is an (n-1)-element real */ /* vector. H is represented in the form */ /* H = I - tau * ( 1 ) * ( 1 v' ) , */ /* ( v ) */ /* where tau is a real scalar and v is a real (n-1)-element */ /* vector. */ /* If the elements of x are all zero, then tau = 0 and H is taken to be */ /* the unit matrix. */ /* Otherwise 1 <= tau <= 2. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the elementary reflector. */ /* ALPHA (input/output) DOUBLE PRECISION */ /* On entry, the value alpha. */ /* On exit, it is overwritten with the value beta. */ /* X (input/output) DOUBLE PRECISION array, dimension */ /* (1+(N-2)*abs(INCX)) */ /* On entry, the vector x. */ /* On exit, it is overwritten with the vector v. */ /* INCX (input) INTEGER */ /* The increment between elements of X. INCX > 0. */ /* TAU (output) DOUBLE PRECISION */ /* The value tau. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n <= 1) { *tau = 0.; return 0; } i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); if (xnorm == 0.) { /* H = I */ *tau = 0.; } else { /* general case */ d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = -d_sign(&d__1, alpha); safmin = _starpu_dlamch_("S") / _starpu_dlamch_("E"); knt = 0; if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ rsafmn = 1. / safmin; L10: ++knt; i__1 = *n - 1; _starpu_dscal_(&i__1, &rsafmn, &x[1], incx); beta *= rsafmn; *alpha *= rsafmn; if (abs(beta) < safmin) { goto L10; } /* New BETA is at most 1, at least SAFMIN */ i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = -d_sign(&d__1, alpha); } *tau = (beta - *alpha) / beta; i__1 = *n - 1; d__1 = 1. / (*alpha - beta); _starpu_dscal_(&i__1, &d__1, &x[1], incx); /* If ALPHA is subnormal, it may lose relative accuracy */ i__1 = knt; for (j = 1; j <= i__1; ++j) { beta *= safmin; /* L20: */ } *alpha = beta; } return 0; /* End of DLARFG */ } /* _starpu_dlarfg_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlarfp.c000066400000000000000000000116101413463044200213640ustar00rootroot00000000000000/* dlarfp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarfp_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ integer j, knt; doublereal beta; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal xnorm; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); doublereal safmin, rsafmn; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFP generates a real elementary reflector H of order n, such */ /* that */ /* H * ( alpha ) = ( beta ), H' * H = I. */ /* ( x ) ( 0 ) */ /* where alpha and beta are scalars, beta is non-negative, and x is */ /* an (n-1)-element real vector. H is represented in the form */ /* H = I - tau * ( 1 ) * ( 1 v' ) , */ /* ( v ) */ /* where tau is a real scalar and v is a real (n-1)-element */ /* vector. */ /* If the elements of x are all zero, then tau = 0 and H is taken to be */ /* the unit matrix. */ /* Otherwise 1 <= tau <= 2. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the elementary reflector. */ /* ALPHA (input/output) DOUBLE PRECISION */ /* On entry, the value alpha. */ /* On exit, it is overwritten with the value beta. */ /* X (input/output) DOUBLE PRECISION array, dimension */ /* (1+(N-2)*abs(INCX)) */ /* On entry, the vector x. */ /* On exit, it is overwritten with the vector v. */ /* INCX (input) INTEGER */ /* The increment between elements of X. INCX > 0. */ /* TAU (output) DOUBLE PRECISION */ /* The value tau. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n <= 0) { *tau = 0.; return 0; } i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); if (xnorm == 0.) { /* H = [+/-1, 0; I], sign chosen so ALPHA >= 0 */ if (*alpha >= 0.) { /* When TAU.eq.ZERO, the vector is special-cased to be */ /* all zeros in the application routines. We do not need */ /* to clear it. */ *tau = 0.; } else { /* However, the application routines rely on explicit */ /* zero checks when TAU.ne.ZERO, and we must clear X. */ *tau = 2.; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { x[(j - 1) * *incx + 1] = 0.; } *alpha = -(*alpha); } } else { /* general case */ d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = d_sign(&d__1, alpha); safmin = _starpu_dlamch_("S") / _starpu_dlamch_("E"); knt = 0; if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ rsafmn = 1. / safmin; L10: ++knt; i__1 = *n - 1; _starpu_dscal_(&i__1, &rsafmn, &x[1], incx); beta *= rsafmn; *alpha *= rsafmn; if (abs(beta) < safmin) { goto L10; } /* New BETA is at most 1, at least SAFMIN */ i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = d_sign(&d__1, alpha); } *alpha += beta; if (beta < 0.) { beta = -beta; *tau = -(*alpha) / beta; } else { *alpha = xnorm * (xnorm / *alpha); *tau = *alpha / beta; *alpha = -(*alpha); } i__1 = *n - 1; d__1 = 1. / *alpha; _starpu_dscal_(&i__1, &d__1, &x[1], incx); /* If BETA is subnormal, it may lose relative accuracy */ i__1 = knt; for (j = 1; j <= i__1; ++j) { beta *= safmin; /* L20: */ } *alpha = beta; } return 0; /* End of DLARFP */ } /* _starpu_dlarfp_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlarft.c000066400000000000000000000231411413463044200213720ustar00rootroot00000000000000/* dlarft.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = 0.; /* Subroutine */ int _starpu_dlarft_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt) { /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, prevlastv; doublereal vii; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer lastv; extern /* Subroutine */ int _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFT forms the triangular factor T of a real block reflector H */ /* of order n, which is defined as a product of k elementary reflectors. */ /* If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ /* If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ /* If STOREV = 'C', the vector which defines the elementary reflector */ /* H(i) is stored in the i-th column of the array V, and */ /* H = I - V * T * V' */ /* If STOREV = 'R', the vector which defines the elementary reflector */ /* H(i) is stored in the i-th row of the array V, and */ /* H = I - V' * T * V */ /* Arguments */ /* ========= */ /* DIRECT (input) CHARACTER*1 */ /* Specifies the order in which the elementary reflectors are */ /* multiplied to form the block reflector: */ /* = 'F': H = H(1) H(2) . . . H(k) (Forward) */ /* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ /* STOREV (input) CHARACTER*1 */ /* Specifies how the vectors which define the elementary */ /* reflectors are stored (see also Further Details): */ /* = 'C': columnwise */ /* = 'R': rowwise */ /* N (input) INTEGER */ /* The order of the block reflector H. N >= 0. */ /* K (input) INTEGER */ /* The order of the triangular factor T (= the number of */ /* elementary reflectors). K >= 1. */ /* V (input/output) DOUBLE PRECISION array, dimension */ /* (LDV,K) if STOREV = 'C' */ /* (LDV,N) if STOREV = 'R' */ /* The matrix V. See further details. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. */ /* If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i). */ /* T (output) DOUBLE PRECISION array, dimension (LDT,K) */ /* The k by k triangular factor T of the block reflector. */ /* If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ /* lower triangular. The rest of the array is not used. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= K. */ /* Further Details */ /* =============== */ /* The shape of the matrix V and the storage of the vectors which define */ /* the H(i) is best illustrated by the following example with n = 5 and */ /* k = 3. The elements equal to 1 are not stored; the corresponding */ /* array elements are modified but restored on exit. The rest of the */ /* array is not used. */ /* DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ /* V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ /* ( v1 1 ) ( 1 v2 v2 v2 ) */ /* ( v1 v2 1 ) ( 1 v3 v3 ) */ /* ( v1 v2 v3 ) */ /* ( v1 v2 v3 ) */ /* DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ /* V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ /* ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ /* ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ /* ( 1 v3 ) */ /* ( 1 ) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --tau; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; /* Function Body */ if (*n == 0) { return 0; } if (_starpu_lsame_(direct, "F")) { prevlastv = *n; i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { prevlastv = max(i__,prevlastv); if (tau[i__] == 0.) { /* H(i) = I */ i__2 = i__; for (j = 1; j <= i__2; ++j) { t[j + i__ * t_dim1] = 0.; /* L10: */ } } else { /* general case */ vii = v[i__ + i__ * v_dim1]; v[i__ + i__ * v_dim1] = 1.; if (_starpu_lsame_(storev, "C")) { /* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { if (v[lastv + i__ * v_dim1] != 0.) { break; } } j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */ i__2 = j - i__ + 1; i__3 = i__ - 1; d__1 = -tau[i__]; _starpu_dgemv_("Transpose", &i__2, &i__3, &d__1, &v[i__ + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1, &c_b8, &t[ i__ * t_dim1 + 1], &c__1); } else { /* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { if (v[i__ + lastv * v_dim1] != 0.) { break; } } j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */ i__2 = i__ - 1; i__3 = j - i__ + 1; d__1 = -tau[i__]; _starpu_dgemv_("No transpose", &i__2, &i__3, &d__1, &v[i__ * v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, & c_b8, &t[i__ * t_dim1 + 1], &c__1); } v[i__ + i__ * v_dim1] = vii; /* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ i__2 = i__ - 1; _starpu_dtrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[ t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1); t[i__ + i__ * t_dim1] = tau[i__]; if (i__ > 1) { prevlastv = max(prevlastv,lastv); } else { prevlastv = lastv; } } /* L20: */ } } else { prevlastv = 1; for (i__ = *k; i__ >= 1; --i__) { if (tau[i__] == 0.) { /* H(i) = I */ i__1 = *k; for (j = i__; j <= i__1; ++j) { t[j + i__ * t_dim1] = 0.; /* L30: */ } } else { /* general case */ if (i__ < *k) { if (_starpu_lsame_(storev, "C")) { vii = v[*n - *k + i__ + i__ * v_dim1]; v[*n - *k + i__ + i__ * v_dim1] = 1.; /* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { if (v[lastv + i__ * v_dim1] != 0.) { break; } } j = max(lastv,prevlastv); /* T(i+1:k,i) := */ /* - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */ i__1 = *n - *k + i__ - j + 1; i__2 = *k - i__; d__1 = -tau[i__]; _starpu_dgemv_("Transpose", &i__1, &i__2, &d__1, &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], & c__1, &c_b8, &t[i__ + 1 + i__ * t_dim1], & c__1); v[*n - *k + i__ + i__ * v_dim1] = vii; } else { vii = v[i__ + (*n - *k + i__) * v_dim1]; v[i__ + (*n - *k + i__) * v_dim1] = 1.; /* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { if (v[i__ + lastv * v_dim1] != 0.) { break; } } j = max(lastv,prevlastv); /* T(i+1:k,i) := */ /* - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */ i__1 = *k - i__; i__2 = *n - *k + i__ - j + 1; d__1 = -tau[i__]; _starpu_dgemv_("No transpose", &i__1, &i__2, &d__1, &v[i__ + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], ldv, &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1); v[i__ + (*n - *k + i__) * v_dim1] = vii; } /* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ i__1 = *k - i__; _starpu_dtrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * t_dim1], &c__1) ; if (i__ > 1) { prevlastv = min(prevlastv,lastv); } else { prevlastv = lastv; } } t[i__ + i__ * t_dim1] = tau[i__]; } /* L40: */ } } return 0; /* End of DLARFT */ } /* _starpu_dlarft_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlascl.c000066400000000000000000000212241413463044200213600ustar00rootroot00000000000000/* dlascl.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublereal *a, integer *lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, k1, k2, k3, k4; doublereal mul, cto1; logical done; doublereal ctoc; extern logical _starpu_lsame_(char *, char *); integer itype; doublereal cfrom1; extern doublereal _starpu_dlamch_(char *); doublereal cfromc; extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASCL multiplies the M by N real matrix A by the real scalar */ /* CTO/CFROM. This is done without over/underflow as long as the final */ /* result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ /* A may be full, upper triangular, lower triangular, upper Hessenberg, */ /* or banded. */ /* Arguments */ /* ========= */ /* TYPE (input) CHARACTER*1 */ /* TYPE indices the storage type of the input matrix. */ /* = 'G': A is a full matrix. */ /* = 'L': A is a lower triangular matrix. */ /* = 'U': A is an upper triangular matrix. */ /* = 'H': A is an upper Hessenberg matrix. */ /* = 'B': A is a symmetric band matrix with lower bandwidth KL */ /* and upper bandwidth KU and with the only the lower */ /* half stored. */ /* = 'Q': A is a symmetric band matrix with lower bandwidth KL */ /* and upper bandwidth KU and with the only the upper */ /* half stored. */ /* = 'Z': A is a band matrix with lower bandwidth KL and upper */ /* bandwidth KU. */ /* KL (input) INTEGER */ /* The lower bandwidth of A. Referenced only if TYPE = 'B', */ /* 'Q' or 'Z'. */ /* KU (input) INTEGER */ /* The upper bandwidth of A. Referenced only if TYPE = 'B', */ /* 'Q' or 'Z'. */ /* CFROM (input) DOUBLE PRECISION */ /* CTO (input) DOUBLE PRECISION */ /* The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ /* without over/underflow if the final result CTO*A(I,J)/CFROM */ /* can be represented without over/underflow. CFROM must be */ /* nonzero. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* The matrix to be multiplied by CTO/CFROM. See TYPE for the */ /* storage type. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* INFO (output) INTEGER */ /* 0 - successful exit */ /* <0 - if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; if (_starpu_lsame_(type__, "G")) { itype = 0; } else if (_starpu_lsame_(type__, "L")) { itype = 1; } else if (_starpu_lsame_(type__, "U")) { itype = 2; } else if (_starpu_lsame_(type__, "H")) { itype = 3; } else if (_starpu_lsame_(type__, "B")) { itype = 4; } else if (_starpu_lsame_(type__, "Q")) { itype = 5; } else if (_starpu_lsame_(type__, "Z")) { itype = 6; } else { itype = -1; } if (itype == -1) { *info = -1; } else if (*cfrom == 0. || _starpu_disnan_(cfrom)) { *info = -4; } else if (_starpu_disnan_(cto)) { *info = -5; } else if (*m < 0) { *info = -6; } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { *info = -7; } else if (itype <= 3 && *lda < max(1,*m)) { *info = -9; } else if (itype >= 4) { /* Computing MAX */ i__1 = *m - 1; if (*kl < 0 || *kl > max(i__1,0)) { *info = -2; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = *n - 1; if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && *kl != *ku) { *info = -3; } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { *info = -9; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASCL", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *m == 0) { return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; cfromc = *cfrom; ctoc = *cto; L10: cfrom1 = cfromc * smlnum; if (cfrom1 == cfromc) { /* CFROMC is an inf. Multiply by a correctly signed zero for */ /* finite CTOC, or a NaN if CTOC is infinite. */ mul = ctoc / cfromc; done = TRUE_; cto1 = ctoc; } else { cto1 = ctoc / bignum; if (cto1 == ctoc) { /* CTOC is either 0 or an inf. In both cases, CTOC itself */ /* serves as the correct multiplication factor. */ mul = ctoc; done = TRUE_; cfromc = 1.; } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { mul = smlnum; done = FALSE_; cfromc = cfrom1; } else if (abs(cto1) > abs(cfromc)) { mul = bignum; done = FALSE_; ctoc = cto1; } else { mul = ctoc / cfromc; done = TRUE_; } } if (itype == 0) { /* Full matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L20: */ } /* L30: */ } } else if (itype == 1) { /* Lower triangular matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L40: */ } /* L50: */ } } else if (itype == 2) { /* Upper triangular matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(j,*m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L60: */ } /* L70: */ } } else if (itype == 3) { /* Upper Hessenberg matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = j + 1; i__2 = min(i__3,*m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L80: */ } /* L90: */ } } else if (itype == 4) { /* Lower half of a symmetric band matrix */ k3 = *kl + 1; k4 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = k3, i__4 = k4 - j; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L100: */ } /* L110: */ } } else if (itype == 5) { /* Upper half of a symmetric band matrix */ k1 = *ku + 2; k3 = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = k1 - j; i__3 = k3; for (i__ = max(i__2,1); i__ <= i__3; ++i__) { a[i__ + j * a_dim1] *= mul; /* L120: */ } /* L130: */ } } else if (itype == 6) { /* Band matrix */ k1 = *kl + *ku + 2; k2 = *kl + 1; k3 = (*kl << 1) + *ku + 1; k4 = *kl + *ku + 1 + *m; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__3 = k1 - j; /* Computing MIN */ i__4 = k3, i__5 = k4 - j; i__2 = min(i__4,i__5); for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L140: */ } /* L150: */ } } if (! done) { goto L10; } return 0; /* End of DLASCL */ } /* _starpu_dlascl_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlaset.c000066400000000000000000000101001413463044200213610ustar00rootroot00000000000000/* dlaset.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaset_(char *uplo, integer *m, integer *n, doublereal * alpha, doublereal *beta, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern logical _starpu_lsame_(char *, char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASET initializes an m-by-n matrix A to BETA on the diagonal and */ /* ALPHA on the offdiagonals. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies the part of the matrix A to be set. */ /* = 'U': Upper triangular part is set; the strictly lower */ /* triangular part of A is not changed. */ /* = 'L': Lower triangular part is set; the strictly upper */ /* triangular part of A is not changed. */ /* Otherwise: All of the matrix A is set. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* ALPHA (input) DOUBLE PRECISION */ /* The constant to which the offdiagonal elements are to be set. */ /* BETA (input) DOUBLE PRECISION */ /* The constant to which the diagonal elements are to be set. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On exit, the leading m-by-n submatrix of A is set as follows: */ /* if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n, */ /* if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n, */ /* otherwise, A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j, */ /* and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (_starpu_lsame_(uplo, "U")) { /* Set the strictly upper triangular or trapezoidal part of the */ /* array to ALPHA. */ i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing MIN */ i__3 = j - 1; i__2 = min(i__3,*m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(uplo, "L")) { /* Set the strictly lower triangular or trapezoidal part of the */ /* array to ALPHA. */ i__1 = min(*m,*n); for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; /* L30: */ } /* L40: */ } } else { /* Set the leading m-by-n submatrix to ALPHA. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; /* L50: */ } /* L60: */ } } /* Set the first min(M,N) diagonal elements to BETA. */ i__1 = min(*m,*n); for (i__ = 1; i__ <= i__1; ++i__) { a[i__ + i__ * a_dim1] = *beta; /* L70: */ } return 0; /* End of DLASET */ } /* _starpu_dlaset_ */ starpu-1.3.9+dfsg/min-dgels/additional/dlassq.c000066400000000000000000000064141413463044200214110ustar00rootroot00000000000000/* dlassq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlassq_(integer *n, doublereal *x, integer *incx, doublereal *scale, doublereal *sumsq) { /* System generated locals */ integer i__1, i__2; doublereal d__1; /* Local variables */ integer ix; doublereal absxi; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASSQ returns the values scl and smsq such that */ /* ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ /* where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is */ /* assumed to be non-negative and scl returns the value */ /* scl = max( scale, abs( x( i ) ) ). */ /* scale and sumsq must be supplied in SCALE and SUMSQ and */ /* scl and smsq are overwritten on SCALE and SUMSQ respectively. */ /* The routine makes only one pass through the vector x. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of elements to be used from the vector X. */ /* X (input) DOUBLE PRECISION array, dimension (N) */ /* The vector for which a scaled sum of squares is computed. */ /* x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ /* INCX (input) INTEGER */ /* The increment between successive values of the vector X. */ /* INCX > 0. */ /* SCALE (input/output) DOUBLE PRECISION */ /* On entry, the value scale in the equation above. */ /* On exit, SCALE is overwritten with scl , the scaling factor */ /* for the sum of squares. */ /* SUMSQ (input/output) DOUBLE PRECISION */ /* On entry, the value sumsq in the equation above. */ /* On exit, SUMSQ is overwritten with smsq , the basic sum of */ /* squares from which scl has been factored out. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n > 0) { i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { if (x[ix] != 0.) { absxi = (d__1 = x[ix], abs(d__1)); if (*scale < absxi) { /* Computing 2nd power */ d__1 = *scale / absxi; *sumsq = *sumsq * (d__1 * d__1) + 1; *scale = absxi; } else { /* Computing 2nd power */ d__1 = absxi / *scale; *sumsq += d__1 * d__1; } } /* L10: */ } } return 0; /* End of DLASSQ */ } /* _starpu_dlassq_ */ starpu-1.3.9+dfsg/min-dgels/additional/dnrm2.c000066400000000000000000000042701413463044200211420ustar00rootroot00000000000000/* dnrm2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dnrm2_(integer *n, doublereal *x, integer *incx) { /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer ix; doublereal ssq, norm, scale, absxi; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DNRM2 returns the euclidean norm of a vector via the function */ /* name, so that */ /* DNRM2 := sqrt( x'*x ) */ /* -- This version written on 25-October-1982. */ /* Modified on 14-October-1993 to inline the call to DLASSQ. */ /* Sven Hammarling, Nag Ltd. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n < 1 || *incx < 1) { norm = 0.; } else if (*n == 1) { norm = abs(x[1]); } else { scale = 0.; ssq = 1.; /* The following loop is equivalent to this call to the LAPACK */ /* auxiliary routine: */ /* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) */ i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { if (x[ix] != 0.) { absxi = (d__1 = x[ix], abs(d__1)); if (scale < absxi) { /* Computing 2nd power */ d__1 = scale / absxi; ssq = ssq * (d__1 * d__1) + 1.; scale = absxi; } else { /* Computing 2nd power */ d__1 = absxi / scale; ssq += d__1 * d__1; } } /* L10: */ } norm = scale * sqrt(ssq); } ret_val = norm; return ret_val; /* End of DNRM2. */ } /* _starpu_dnrm2_ */ starpu-1.3.9+dfsg/min-dgels/additional/dorm2r.c000066400000000000000000000141501413463044200213230ustar00rootroot00000000000000/* dorm2r.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORM2R overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,K) */ /* The i-th column must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGEQRF in the first k columns of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If SIDE = 'L', LDA >= max(1,M); */ /* if SIDE = 'R', LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQRF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORM2R", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; _starpu_dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ ic + jc * c_dim1], ldc, &work[1]); a[i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; /* End of DORM2R */ } /* _starpu_dorm2r_ */ starpu-1.3.9+dfsg/min-dgels/additional/dorml2.c000066400000000000000000000141061413463044200213160ustar00rootroot00000000000000/* dorml2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dorml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORML2 overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGELQF in the first k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGELQF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORML2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && notran || ! left && ! notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; _starpu_dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ ic + jc * c_dim1], ldc, &work[1]); a[i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; /* End of DORML2 */ } /* _starpu_dorml2_ */ starpu-1.3.9+dfsg/min-dgels/additional/dormlq.c000066400000000000000000000225331413463044200214200ustar00rootroot00000000000000/* dormlq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dorml2_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical notran; integer ldwork; char transt[1]; integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMLQ overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGELQF in the first k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGELQF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { /* Determine the block size. NB may be at most NBMAX, where NBMAX */ /* is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMLQ", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMLQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMLQ", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && notran || ! left && ! notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = nq - i__ + 1; _starpu_dlarft_("Forward", "Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ _starpu_dlarfb_(side, transt, "Forward", "Rowwise", &mi, &ni, &ib, &a[i__ + i__ * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMLQ */ } /* _starpu_dormlq_ */ starpu-1.3.9+dfsg/min-dgels/additional/dormqr.c000066400000000000000000000223061413463044200214240ustar00rootroot00000000000000/* dormqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dorm2r_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical notran; integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMQR overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,K) */ /* The i-th column must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGEQRF in the first k columns of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If SIDE = 'L', LDA >= max(1,M); */ /* if SIDE = 'R', LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQRF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { /* Determine the block size. NB may be at most NBMAX, where NBMAX */ /* is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMQR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMQR", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = nq - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], t, &c__65) ; if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ _starpu_dlarfb_(side, trans, "Forward", "Columnwise", &mi, &ni, &ib, &a[ i__ + i__ * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMQR */ } /* _starpu_dormqr_ */ starpu-1.3.9+dfsg/min-dgels/additional/dscal.c000066400000000000000000000041561413463044200212110ustar00rootroot00000000000000/* dscal.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, m, mp1, nincx; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* * */ /* scales a vector by a constant. */ /* uses unrolled loops for increment equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 3/93 to return if incx .le. 0. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dx; /* Function Body */ if (*n <= 0 || *incx <= 0) { return 0; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ nincx = *n * *incx; i__1 = nincx; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { dx[i__] = *da * dx[i__]; /* L10: */ } return 0; /* code for increment equal to 1 */ /* clean-up loop */ L20: m = *n % 5; if (m == 0) { goto L40; } i__2 = m; for (i__ = 1; i__ <= i__2; ++i__) { dx[i__] = *da * dx[i__]; /* L30: */ } if (*n < 5) { return 0; } L40: mp1 = m + 1; i__2 = *n; for (i__ = mp1; i__ <= i__2; i__ += 5) { dx[i__] = *da * dx[i__]; dx[i__ + 1] = *da * dx[i__ + 1]; dx[i__ + 2] = *da * dx[i__ + 2]; dx[i__ + 3] = *da * dx[i__ + 3]; dx[i__ + 4] = *da * dx[i__ + 4]; /* L50: */ } return 0; } /* _starpu_dscal_ */ starpu-1.3.9+dfsg/min-dgels/additional/dtrmm.c000066400000000000000000000265551413463044200212550ustar00rootroot00000000000000/* dtrmm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, k, info; doublereal temp; logical lside; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRMM performs one of the matrix-matrix operations */ /* B := alpha*op( A )*B, or B := alpha*B*op( A ), */ /* where alpha is a scalar, B is an m by n matrix, A is a unit, or */ /* non-unit, upper or lower triangular matrix and op( A ) is one of */ /* op( A ) = A or op( A ) = A'. */ /* Arguments */ /* ========== */ /* SIDE - CHARACTER*1. */ /* On entry, SIDE specifies whether op( A ) multiplies B from */ /* the left or right as follows: */ /* SIDE = 'L' or 'l' B := alpha*op( A )*B. */ /* SIDE = 'R' or 'r' B := alpha*B*op( A ). */ /* Unchanged on exit. */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix A is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANSA - CHARACTER*1. */ /* On entry, TRANSA specifies the form of op( A ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSA = 'N' or 'n' op( A ) = A. */ /* TRANSA = 'T' or 't' op( A ) = A'. */ /* TRANSA = 'C' or 'c' op( A ) = A'. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit triangular */ /* as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of B. M must be at */ /* least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of B. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. When alpha is */ /* zero then A is not referenced and B need not be set before */ /* entry. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m */ /* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ /* Before entry with UPLO = 'U' or 'u', the leading k by k */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading k by k */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When SIDE = 'L' or 'l' then */ /* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ /* then LDA must be at least max( 1, n ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */ /* Before entry, the leading m by n part of the array B must */ /* contain the matrix B, and on exit is overwritten by the */ /* transformed matrix. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. LDB must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ lside = _starpu_lsame_(side, "L"); if (lside) { nrowa = *m; } else { nrowa = *n; } nounit = _starpu_lsame_(diag, "N"); upper = _starpu_lsame_(uplo, "U"); info = 0; if (! lside && ! _starpu_lsame_(side, "R")) { info = 1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 2; } else if (! _starpu_lsame_(transa, "N") && ! _starpu_lsame_(transa, "T") && ! _starpu_lsame_(transa, "C")) { info = 3; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; } else if (*lda < max(1,nrowa)) { info = 9; } else if (*ldb < max(1,*m)) { info = 11; } if (info != 0) { _starpu_xerbla_("DTRMM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } return 0; } /* Start the operations. */ if (lside) { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*A*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (k = 1; k <= i__2; ++k) { if (b[k + j * b_dim1] != 0.) { temp = *alpha * b[k + j * b_dim1]; i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1]; /* L30: */ } if (nounit) { temp *= a[k + k * a_dim1]; } b[k + j * b_dim1] = temp; } /* L40: */ } /* L50: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (k = *m; k >= 1; --k) { if (b[k + j * b_dim1] != 0.) { temp = *alpha * b[k + j * b_dim1]; b[k + j * b_dim1] = temp; if (nounit) { b[k + j * b_dim1] *= a[k + k * a_dim1]; } i__2 = *m; for (i__ = k + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1]; /* L60: */ } } /* L70: */ } /* L80: */ } } } else { /* Form B := alpha*A'*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp = b[i__ + j * b_dim1]; if (nounit) { temp *= a[i__ + i__ * a_dim1]; } i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L90: */ } b[i__ + j * b_dim1] = *alpha * temp; /* L100: */ } /* L110: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = b[i__ + j * b_dim1]; if (nounit) { temp *= a[i__ + i__ * a_dim1]; } i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L120: */ } b[i__ + j * b_dim1] = *alpha * temp; /* L130: */ } /* L140: */ } } } } else { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*B*A. */ if (upper) { for (j = *n; j >= 1; --j) { temp = *alpha; if (nounit) { temp *= a[j + j * a_dim1]; } i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L150: */ } i__1 = j - 1; for (k = 1; k <= i__1; ++k) { if (a[k + j * a_dim1] != 0.) { temp = *alpha * a[k + j * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L160: */ } } /* L170: */ } /* L180: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = *alpha; if (nounit) { temp *= a[j + j * a_dim1]; } i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L190: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { if (a[k + j * a_dim1] != 0.) { temp = *alpha * a[k + j * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L200: */ } } /* L210: */ } /* L220: */ } } } else { /* Form B := alpha*B*A'. */ if (upper) { i__1 = *n; for (k = 1; k <= i__1; ++k) { i__2 = k - 1; for (j = 1; j <= i__2; ++j) { if (a[j + k * a_dim1] != 0.) { temp = *alpha * a[j + k * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L230: */ } } /* L240: */ } temp = *alpha; if (nounit) { temp *= a[k + k * a_dim1]; } if (temp != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L250: */ } } /* L260: */ } } else { for (k = *n; k >= 1; --k) { i__1 = *n; for (j = k + 1; j <= i__1; ++j) { if (a[j + k * a_dim1] != 0.) { temp = *alpha * a[j + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L270: */ } } /* L280: */ } temp = *alpha; if (nounit) { temp *= a[k + k * a_dim1]; } if (temp != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L290: */ } } /* L300: */ } } } } return 0; /* End of DTRMM . */ } /* _starpu_dtrmm_ */ starpu-1.3.9+dfsg/min-dgels/additional/dtrmv.c000066400000000000000000000205511413463044200212540ustar00rootroot00000000000000/* dtrmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRMV performs one of the matrix-vector operations */ /* x := A*x, or x := A'*x, */ /* where x is an n element vector and A is an n by n unit, or non-unit, */ /* upper or lower triangular matrix. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' x := A*x. */ /* TRANS = 'T' or 't' x := A'*x. */ /* TRANS = 'C' or 'c' x := A'*x. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. On exit, X is overwritten with the */ /* tranformed vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,*n)) { info = 6; } else if (*incx == 0) { info = 8; } if (info != 0) { _starpu_xerbla_("DTRMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (_starpu_lsame_(trans, "N")) { /* Form x := A*x. */ if (_starpu_lsame_(uplo, "U")) { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = x[j]; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[i__] += temp * a[i__ + j * a_dim1]; /* L10: */ } if (nounit) { x[j] *= a[j + j * a_dim1]; } } /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[ix] += temp * a[i__ + j * a_dim1]; ix += *incx; /* L30: */ } if (nounit) { x[jx] *= a[j + j * a_dim1]; } } jx += *incx; /* L40: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { temp = x[j]; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[i__] += temp * a[i__ + j * a_dim1]; /* L50: */ } if (nounit) { x[j] *= a[j + j * a_dim1]; } } /* L60: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[ix] += temp * a[i__ + j * a_dim1]; ix -= *incx; /* L70: */ } if (nounit) { x[jx] *= a[j + j * a_dim1]; } } jx -= *incx; /* L80: */ } } } } else { /* Form x := A'*x. */ if (_starpu_lsame_(uplo, "U")) { if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; if (nounit) { temp *= a[j + j * a_dim1]; } for (i__ = j - 1; i__ >= 1; --i__) { temp += a[i__ + j * a_dim1] * x[i__]; /* L90: */ } x[j] = temp; /* L100: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = jx; if (nounit) { temp *= a[j + j * a_dim1]; } for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; temp += a[i__ + j * a_dim1] * x[ix]; /* L110: */ } x[jx] = temp; jx -= *incx; /* L120: */ } } } else { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; if (nounit) { temp *= a[j + j * a_dim1]; } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[i__]; /* L130: */ } x[j] = temp; /* L140: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = jx; if (nounit) { temp *= a[j + j * a_dim1]; } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; temp += a[i__ + j * a_dim1] * x[ix]; /* L150: */ } x[jx] = temp; jx += *incx; /* L160: */ } } } } return 0; /* End of DTRMV . */ } /* _starpu_dtrmv_ */ starpu-1.3.9+dfsg/min-dgels/additional/dtrsm.c000066400000000000000000000301641413463044200212520ustar00rootroot00000000000000/* dtrsm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, k, info; doublereal temp; logical lside; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRSM solves one of the matrix equations */ /* op( A )*X = alpha*B, or X*op( A ) = alpha*B, */ /* where alpha is a scalar, X and B are m by n matrices, A is a unit, or */ /* non-unit, upper or lower triangular matrix and op( A ) is one of */ /* op( A ) = A or op( A ) = A'. */ /* The matrix X is overwritten on B. */ /* Arguments */ /* ========== */ /* SIDE - CHARACTER*1. */ /* On entry, SIDE specifies whether op( A ) appears on the left */ /* or right of X as follows: */ /* SIDE = 'L' or 'l' op( A )*X = alpha*B. */ /* SIDE = 'R' or 'r' X*op( A ) = alpha*B. */ /* Unchanged on exit. */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix A is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANSA - CHARACTER*1. */ /* On entry, TRANSA specifies the form of op( A ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSA = 'N' or 'n' op( A ) = A. */ /* TRANSA = 'T' or 't' op( A ) = A'. */ /* TRANSA = 'C' or 'c' op( A ) = A'. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit triangular */ /* as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of B. M must be at */ /* least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of B. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. When alpha is */ /* zero then A is not referenced and B need not be set before */ /* entry. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m */ /* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ /* Before entry with UPLO = 'U' or 'u', the leading k by k */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading k by k */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When SIDE = 'L' or 'l' then */ /* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ /* then LDA must be at least max( 1, n ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */ /* Before entry, the leading m by n part of the array B must */ /* contain the right-hand side matrix B, and on exit is */ /* overwritten by the solution matrix X. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. LDB must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ lside = _starpu_lsame_(side, "L"); if (lside) { nrowa = *m; } else { nrowa = *n; } nounit = _starpu_lsame_(diag, "N"); upper = _starpu_lsame_(uplo, "U"); info = 0; if (! lside && ! _starpu_lsame_(side, "R")) { info = 1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 2; } else if (! _starpu_lsame_(transa, "N") && ! _starpu_lsame_(transa, "T") && ! _starpu_lsame_(transa, "C")) { info = 3; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; } else if (*lda < max(1,nrowa)) { info = 9; } else if (*ldb < max(1,*m)) { info = 11; } if (info != 0) { _starpu_xerbla_("DTRSM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } return 0; } /* Start the operations. */ if (lside) { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*inv( A )*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L30: */ } } for (k = *m; k >= 1; --k) { if (b[k + j * b_dim1] != 0.) { if (nounit) { b[k + j * b_dim1] /= a[k + k * a_dim1]; } i__2 = k - 1; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ i__ + k * a_dim1]; /* L40: */ } } /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L70: */ } } i__2 = *m; for (k = 1; k <= i__2; ++k) { if (b[k + j * b_dim1] != 0.) { if (nounit) { b[k + j * b_dim1] /= a[k + k * a_dim1]; } i__3 = *m; for (i__ = k + 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ i__ + k * a_dim1]; /* L80: */ } } /* L90: */ } /* L100: */ } } } else { /* Form B := alpha*inv( A' )*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = *alpha * b[i__ + j * b_dim1]; i__3 = i__ - 1; for (k = 1; k <= i__3; ++k) { temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L110: */ } if (nounit) { temp /= a[i__ + i__ * a_dim1]; } b[i__ + j * b_dim1] = temp; /* L120: */ } /* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp = *alpha * b[i__ + j * b_dim1]; i__2 = *m; for (k = i__ + 1; k <= i__2; ++k) { temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L140: */ } if (nounit) { temp /= a[i__ + i__ * a_dim1]; } b[i__ + j * b_dim1] = temp; /* L150: */ } /* L160: */ } } } } else { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*B*inv( A ). */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L170: */ } } i__2 = j - 1; for (k = 1; k <= i__2; ++k) { if (a[k + j * a_dim1] != 0.) { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ i__ + k * b_dim1]; /* L180: */ } } /* L190: */ } if (nounit) { temp = 1. / a[j + j * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L200: */ } } /* L210: */ } } else { for (j = *n; j >= 1; --j) { if (*alpha != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L220: */ } } i__1 = *n; for (k = j + 1; k <= i__1; ++k) { if (a[k + j * a_dim1] != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ i__ + k * b_dim1]; /* L230: */ } } /* L240: */ } if (nounit) { temp = 1. / a[j + j * a_dim1]; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L250: */ } } /* L260: */ } } } else { /* Form B := alpha*B*inv( A' ). */ if (upper) { for (k = *n; k >= 1; --k) { if (nounit) { temp = 1. / a[k + k * a_dim1]; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L270: */ } } i__1 = k - 1; for (j = 1; j <= i__1; ++j) { if (a[j + k * a_dim1] != 0.) { temp = a[j + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= temp * b[i__ + k * b_dim1]; /* L280: */ } } /* L290: */ } if (*alpha != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] ; /* L300: */ } } /* L310: */ } } else { i__1 = *n; for (k = 1; k <= i__1; ++k) { if (nounit) { temp = 1. / a[k + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L320: */ } } i__2 = *n; for (j = k + 1; j <= i__2; ++j) { if (a[j + k * a_dim1] != 0.) { temp = a[j + k * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] -= temp * b[i__ + k * b_dim1]; /* L330: */ } } /* L340: */ } if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] ; /* L350: */ } } /* L360: */ } } } } return 0; /* End of DTRSM . */ } /* _starpu_dtrsm_ */ starpu-1.3.9+dfsg/min-dgels/additional/dtrtrs.c000066400000000000000000000126071413463044200214450ustar00rootroot00000000000000/* dtrtrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b12 = 1.; /* Subroutine */ int _starpu_dtrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_( char *, integer *); logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRTRS solves a triangular system of the form */ /* A * X = B or A**T * X = B, */ /* where A is a triangular matrix of order N, and B is an N-by-NRHS */ /* matrix. A check is made to verify that A is nonsingular. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of the array A contains the upper */ /* triangular matrix, and the strictly lower triangular part of */ /* A is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of the array A contains the lower triangular */ /* matrix, and the strictly upper triangular part of A is not */ /* referenced. If DIAG = 'U', the diagonal elements of A are */ /* also not referenced and are assumed to be 1. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, if INFO = 0, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of A is zero, */ /* indicating that the matrix is singular and the solutions */ /* X have not been computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; nounit = _starpu_lsame_(diag, "N"); if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check for singularity. */ if (nounit) { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (a[*info + *info * a_dim1] == 0.) { return 0; } /* L10: */ } } *info = 0; /* Solve A * x = b or A' * x = b. */ _starpu_dtrsm_("Left", uplo, trans, diag, n, nrhs, &c_b12, &a[a_offset], lda, &b[ b_offset], ldb); return 0; /* End of DTRTRS */ } /* _starpu_dtrtrs_ */ starpu-1.3.9+dfsg/min-dgels/additional/f2c.h000066400000000000000000000111201413463044200205670ustar00rootroot00000000000000/* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE typedef long int integer; typedef unsigned long int uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef double doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef long int logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; #ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ typedef long long longint; /* system-dependent */ typedef unsigned long long ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef long int flag; typedef long int ftnlen; typedef long int ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; int nvars; }; typedef struct Namelist Namelist; #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ int (*S_fp)(...); #else typedef int /* Unknown procedure type */ (*U_fp)(); typedef shortint (*J_fp)(); typedef integer (*I_fp)(); typedef real (*R_fp)(); typedef doublereal (*D_fp)(), (*E_fp)(); typedef /* Complex */ VOID (*C_fp)(); typedef /* Double Complex */ VOID (*Z_fp)(); typedef logical (*L_fp)(); typedef shortlogical (*K_fp)(); typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* double complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif starpu-1.3.9+dfsg/min-dgels/additional/fio.h000066400000000000000000000055731413463044200207110ustar00rootroot00000000000000#ifndef SYSDEP_H_INCLUDED #include "sysdep1.h" #endif #include "stdio.h" #include "errno.h" #ifndef NULL /* ANSI C */ #include "stddef.h" #endif #ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif #ifndef FOPEN #define FOPEN fopen #endif #ifndef FREOPEN #define FREOPEN freopen #endif #ifndef FSEEK #define FSEEK fseek #endif #ifndef FSTAT #define FSTAT fstat #endif #ifndef FTELL #define FTELL ftell #endif #ifndef OFF_T #define OFF_T long #endif #ifndef STAT_ST #define STAT_ST stat #endif #ifndef STAT #define STAT stat #endif #ifdef MSDOS #ifndef NON_UNIX_STDIO #define NON_UNIX_STDIO #endif #endif #ifdef UIOLEN_int typedef int uiolen; #else typedef long uiolen; #endif /*units*/ typedef struct { FILE *ufd; /*0=unconnected*/ char *ufnm; #ifndef MSDOS long uinode; int udev; #endif int url; /*0=sequential*/ flag useek; /*true=can backspace, use dir, ...*/ flag ufmt; flag urw; /* (1 for can read) | (2 for can write) */ flag ublnk; flag uend; flag uwrt; /*last io was write*/ flag uscrtch; } unit; #undef Void #ifdef KR_headers #define Void /*void*/ extern int (*f__getn)(); /* for formatted input */ extern void (*f__putn)(); /* for formatted output */ extern void x_putc(); extern long f__inode(); extern VOID sig_die(); extern int (*f__donewrec)(), t_putc(), x_wSL(); extern int c_sfe(), err__fl(), xrd_SL(), f__putbuf(); #else #define Void void #ifdef __cplusplus extern "C" { #endif extern int (*f__getn)(void); /* for formatted input */ extern void (*f__putn)(int); /* for formatted output */ extern void x_putc(int); extern long f__inode(char*,int*); extern void sig_die(const char*,int); extern void f__fatal(int, const char*); extern int t_runc(alist*); extern int f__nowreading(unit*), f__nowwriting(unit*); extern int fk_open(int,int,ftnint); extern int en_fio(void); extern void f_init(void); extern int (*f__donewrec)(void), t_putc(int), x_wSL(void); extern void b_char(const char*,char*,ftnlen), g_char(const char*,ftnlen,char*); extern int c_sfe(cilist*), z_rnew(void); extern int err__fl(int,int,const char*); extern int xrd_SL(void); extern int f__putbuf(int); #endif extern flag f__init; extern cilist *f__elist; /*active external io list*/ extern flag f__reading,f__external,f__sequential,f__formatted; extern int (*f__doend)(Void); extern FILE *f__cf; /*current file*/ extern unit *f__curunit; /*current unit*/ extern unit f__units[]; #define err(f,m,s) {if(f) errno= m; else f__fatal(m,s); return(m);} #define errfl(f,m,s) return err__fl((int)f,m,s) /*Table sizes*/ #define MXUNIT 100 extern int f__recpos; /*position in current record*/ extern OFF_T f__cursor; /* offset to move to */ extern OFF_T f__hiwater; /* so TL doesn't confuse us */ #ifdef __cplusplus } #endif #define WRITE 1 #define READ 2 #define SEQ 3 #define DIR 4 #define FMT 5 #define UNF 6 #define EXT 7 #define INT 8 #define buf_end(x) (x->_flag & _IONBF ? x->_ptr : x->_base + BUFSIZ) starpu-1.3.9+dfsg/min-dgels/additional/fmt.c000066400000000000000000000205661413463044200207140ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif #define skip(s) while(*s==' ') s++ #ifdef interdata #define SYLMX 300 #endif #ifdef pdp11 #define SYLMX 300 #endif #ifdef vax #define SYLMX 300 #endif #ifndef SYLMX #define SYLMX 300 #endif #define GLITCH '\2' /* special quote character for stu */ extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/ static struct syl f__syl[SYLMX]; int f__parenlvl,f__pc,f__revloc; #ifdef KR_headers #define Const /*nothing*/ #else #define Const const #endif static #ifdef KR_headers char *ap_end(s) char *s; #else const char *ap_end(const char *s) #endif { char quote; quote= *s++; for(;*s;s++) { if(*s!=quote) continue; if(*++s!=quote) return(s); } if(f__elist->cierr) { errno = 100; return(NULL); } f__fatal(100, "bad string"); /*NOTREACHED*/ return 0; } static int #ifdef KR_headers op_gen(a,b,c,d) #else op_gen(int a, int b, int c, int d) #endif { struct syl *p= &f__syl[f__pc]; if(f__pc>=SYLMX) { fprintf(stderr,"format too complicated:\n"); sig_die(f__fmtbuf, 1); } p->op=a; p->p1=b; p->p2.i[0]=c; p->p2.i[1]=d; return(f__pc++); } #ifdef KR_headers static char *f_list(); static char *gt_num(s,n,n1) char *s; int *n, n1; #else static const char *f_list(const char*); static const char *gt_num(const char *s, int *n, int n1) #endif { int m=0,f__cnt=0; char c; for(c= *s;;c = *s) { if(c==' ') { s++; continue; } if(c>'9' || c<'0') break; m=10*m+c-'0'; f__cnt++; s++; } if(f__cnt==0) { if (!n1) s = 0; *n=n1; } else *n=m; return(s); } static #ifdef KR_headers char *f_s(s,curloc) char *s; #else const char *f_s(const char *s, int curloc) #endif { skip(s); if(*s++!='(') { return(NULL); } if(f__parenlvl++ ==1) f__revloc=curloc; if(op_gen(RET1,curloc,0,0)<0 || (s=f_list(s))==NULL) { return(NULL); } skip(s); return(s); } static int #ifdef KR_headers ne_d(s,p) char *s,**p; #else ne_d(const char *s, const char **p) #endif { int n,x,sign=0; struct syl *sp; switch(*s) { default: return(0); case ':': (void) op_gen(COLON,0,0,0); break; case '$': (void) op_gen(NONL, 0, 0, 0); break; case 'B': case 'b': if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0); else (void) op_gen(BN,0,0,0); break; case 'S': case 's': if(*(s+1)=='s' || *(s+1) == 'S') { x=SS; s++; } else if(*(s+1)=='p' || *(s+1) == 'P') { x=SP; s++; } else x=S; (void) op_gen(x,0,0,0); break; case '/': (void) op_gen(SLASH,0,0,0); break; case '-': sign=1; case '+': s++; /*OUTRAGEOUS CODING TRICK*/ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!(s=gt_num(s,&n,0))) { bad: *p = 0; return 1; } switch(*s) { default: return(0); case 'P': case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break; case 'X': case 'x': (void) op_gen(X,n,0,0); break; case 'H': case 'h': sp = &f__syl[op_gen(H,n,0,0)]; sp->p2.s = (char*)s + 1; s+=n; break; } break; case GLITCH: case '"': case '\'': sp = &f__syl[op_gen(APOS,0,0,0)]; sp->p2.s = (char*)s; if((*p = ap_end(s)) == NULL) return(0); return(1); case 'T': case 't': if(*(s+1)=='l' || *(s+1) == 'L') { x=TL; s++; } else if(*(s+1)=='r'|| *(s+1) == 'R') { x=TR; s++; } else x=T; if (!(s=gt_num(s+1,&n,0))) goto bad; s--; (void) op_gen(x,n,0,0); break; case 'X': case 'x': (void) op_gen(X,1,0,0); break; case 'P': case 'p': (void) op_gen(P,1,0,0); break; } s++; *p=s; return(1); } static int #ifdef KR_headers e_d(s,p) char *s,**p; #else e_d(const char *s, const char **p) #endif { int i,im,n,w,d,e,found=0,x=0; Const char *sv=s; s=gt_num(s,&n,1); (void) op_gen(STACK,n,0,0); switch(*s++) { default: break; case 'E': case 'e': x=1; case 'G': case 'g': found=1; if (!(s=gt_num(s,&w,0))) { bad: *p = 0; return 1; } if(w==0) break; if(*s=='.') { if (!(s=gt_num(s+1,&d,0))) goto bad; } else d=0; if(*s!='E' && *s != 'e') (void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */ else { if (!(s=gt_num(s+1,&e,0))) goto bad; (void) op_gen(x==1?EE:GE,w,d,e); } break; case 'O': case 'o': i = O; im = OM; goto finish_I; case 'Z': case 'z': i = Z; im = ZM; goto finish_I; case 'L': case 'l': found=1; if (!(s=gt_num(s,&w,0))) goto bad; if(w==0) break; (void) op_gen(L,w,0,0); break; case 'A': case 'a': found=1; skip(s); if(*s>='0' && *s<='9') { s=gt_num(s,&w,1); if(w==0) break; (void) op_gen(AW,w,0,0); break; } (void) op_gen(A,0,0,0); break; case 'F': case 'f': if (!(s=gt_num(s,&w,0))) goto bad; found=1; if(w==0) break; if(*s=='.') { if (!(s=gt_num(s+1,&d,0))) goto bad; } else d=0; (void) op_gen(F,w,d,0); break; case 'D': case 'd': found=1; if (!(s=gt_num(s,&w,0))) goto bad; if(w==0) break; if(*s=='.') { if (!(s=gt_num(s+1,&d,0))) goto bad; } else d=0; (void) op_gen(D,w,d,0); break; case 'I': case 'i': i = I; im = IM; finish_I: if (!(s=gt_num(s,&w,0))) goto bad; found=1; if(w==0) break; if(*s!='.') { (void) op_gen(i,w,0,0); break; } if (!(s=gt_num(s+1,&d,0))) goto bad; (void) op_gen(im,w,d,0); break; } if(found==0) { f__pc--; /*unSTACK*/ *p=sv; return(0); } *p=s; return(1); } static #ifdef KR_headers char *i_tem(s) char *s; #else const char *i_tem(const char *s) #endif { const char *t; int n,curloc; if(*s==')') return(s); if(ne_d(s,&t)) return(t); if(e_d(s,&t)) return(t); s=gt_num(s,&n,1); if((curloc=op_gen(STACK,n,0,0))<0) return(NULL); return(f_s(s,curloc)); } static #ifdef KR_headers char *f_list(s) char *s; #else const char *f_list(const char *s) #endif { for(;*s!=0;) { skip(s); if((s=i_tem(s))==NULL) return(NULL); skip(s); if(*s==',') s++; else if(*s==')') { if(--f__parenlvl==0) { (void) op_gen(REVERT,f__revloc,0,0); return(++s); } (void) op_gen(GOTO,0,0,0); return(++s); } } return(NULL); } int #ifdef KR_headers pars_f(s) char *s; #else pars_f(const char *s) #endif { f__parenlvl=f__revloc=f__pc=0; if(f_s(s,0) == NULL) { return(-1); } return(0); } #define STKSZ 10 int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp; flag f__workdone, f__nonl; static int #ifdef KR_headers type_f(n) #else type_f(int n) #endif { switch(n) { default: return(n); case RET1: return(RET1); case REVERT: return(REVERT); case GOTO: return(GOTO); case STACK: return(STACK); case X: case SLASH: case APOS: case H: case T: case TL: case TR: return(NED); case F: case I: case IM: case A: case AW: case O: case OM: case L: case E: case EE: case D: case G: case GE: case Z: case ZM: return(ED); } } #ifdef KR_headers integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; #else integer do_fio(ftnint *number, char *ptr, ftnlen len) #endif { struct syl *p; int n,i; for(i=0;i<*number;i++,ptr+=len) { loop: switch(type_f((p= &f__syl[f__pc])->op)) { default: fprintf(stderr,"unknown code in do_fio: %d\n%s\n", p->op,f__fmtbuf); err(f__elist->cierr,100,"do_fio"); case NED: if((*f__doned)(p)) { f__pc++; goto loop; } f__pc++; continue; case ED: if(f__cnt[f__cp]<=0) { f__cp--; f__pc++; goto loop; } if(ptr==NULL) return((*f__doend)()); f__cnt[f__cp]--; f__workdone=1; if((n=(*f__doed)(p,ptr,len))>0) errfl(f__elist->cierr,errno,"fmt"); if(n<0) err(f__elist->ciend,(EOF),"fmt"); continue; case STACK: f__cnt[++f__cp]=p->p1; f__pc++; goto loop; case RET1: f__ret[++f__rp]=p->p1; f__pc++; goto loop; case GOTO: if(--f__cnt[f__cp]<=0) { f__cp--; f__rp--; f__pc++; goto loop; } f__pc=1+f__ret[f__rp--]; goto loop; case REVERT: f__rp=f__cp=0; f__pc = p->p1; if(ptr==NULL) return((*f__doend)()); if(!f__workdone) return(0); if((n=(*f__dorevert)()) != 0) return(n); goto loop; case COLON: if(ptr==NULL) return((*f__doend)()); f__pc++; goto loop; case NONL: f__nonl = 1; f__pc++; goto loop; case S: case SS: f__cplus=0; f__pc++; goto loop; case SP: f__cplus = 1; f__pc++; goto loop; case P: f__scale=p->p1; f__pc++; goto loop; case BN: f__cblank=0; f__pc++; goto loop; case BZ: f__cblank=1; f__pc++; goto loop; } } return(0); } int en_fio(Void) { ftnint one=1; return(do_fio(&one,(char *)NULL,(ftnint)0)); } VOID fmt_bg(Void) { f__workdone=f__cp=f__rp=f__pc=f__cursor=0; f__cnt[0]=f__ret[0]=0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/additional/fmt.h000066400000000000000000000037261413463044200207200ustar00rootroot00000000000000struct syl { int op; int p1; union { int i[2]; char *s;} p2; }; #define RET1 1 #define REVERT 2 #define GOTO 3 #define X 4 #define SLASH 5 #define STACK 6 #define I 7 #define ED 8 #define NED 9 #define IM 10 #define APOS 11 #define H 12 #define TL 13 #define TR 14 #define T 15 #define COLON 16 #define S 17 #define SP 18 #define SS 19 #define P 20 #define BN 21 #define BZ 22 #define F 23 #define E 24 #define EE 25 #define D 26 #define G 27 #define GE 28 #define L 29 #define A 30 #define AW 31 #define O 32 #define NONL 33 #define OM 34 #define Z 35 #define ZM 36 typedef union { real pf; doublereal pd; } ufloat; typedef union { short is; #ifndef KR_headers signed #endif char ic; integer il; #ifdef Allow_TYQUAD longint ili; #endif } Uint; #ifdef KR_headers extern int (*f__doed)(),(*f__doned)(); extern int (*f__dorevert)(); extern int rd_ed(),rd_ned(); extern int w_ed(),w_ned(); extern int signbit_f2c(); extern char *f__fmtbuf; #else #ifdef __cplusplus extern "C" { #define Cextern extern "C" #else #define Cextern extern #endif extern const char *f__fmtbuf; extern int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*); extern int (*f__dorevert)(void); extern void fmt_bg(void); extern int pars_f(const char*); extern int rd_ed(struct syl*, char*, ftnlen),rd_ned(struct syl*); extern int signbit_f2c(double*); extern int w_ed(struct syl*, char*, ftnlen),w_ned(struct syl*); extern int wrt_E(ufloat*, int, int, int, ftnlen); extern int wrt_F(ufloat*, int, int, ftnlen); extern int wrt_L(Uint*, int, ftnlen); #endif extern int f__pc,f__parenlvl,f__revloc; extern flag f__cblank,f__cplus,f__workdone, f__nonl; extern int f__scale; #ifdef __cplusplus } #endif #define GET(x) if((x=(*f__getn)())<0) return(x) #define VAL(x) (x!='\n'?x:' ') #define PUT(x) (*f__putn)(x) #undef TYQUAD #ifndef Allow_TYQUAD #undef longint #define longint long #else #define TYQUAD 14 #endif #ifdef KR_headers extern char *f__icvt(); #else Cextern char *f__icvt(longint, int*, int*, int); #endif starpu-1.3.9+dfsg/min-dgels/additional/ieeeck.c000066400000000000000000000065711413463044200213530ustar00rootroot00000000000000/* ieeeck.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ieeeck_(integer *ispec, real *zero, real *one) { /* System generated locals */ integer ret_val; /* Local variables */ real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, newzro; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* IEEECK is called from the ILAENV to verify that Infinity and */ /* possibly NaN arithmetic is safe (i.e. will not trap). */ /* Arguments */ /* ========= */ /* ISPEC (input) INTEGER */ /* Specifies whether to test just for inifinity arithmetic */ /* or whether to test for infinity and NaN arithmetic. */ /* = 0: Verify infinity arithmetic only. */ /* = 1: Verify infinity and NaN arithmetic. */ /* ZERO (input) REAL */ /* Must contain the value 0.0 */ /* This is passed to prevent the compiler from optimizing */ /* away this code. */ /* ONE (input) REAL */ /* Must contain the value 1.0 */ /* This is passed to prevent the compiler from optimizing */ /* away this code. */ /* RETURN VALUE: INTEGER */ /* = 0: Arithmetic failed to produce the correct answers */ /* = 1: Arithmetic produced the correct answers */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ ret_val = 1; posinf = *one / *zero; if (posinf <= *one) { ret_val = 0; return ret_val; } neginf = -(*one) / *zero; if (neginf >= *zero) { ret_val = 0; return ret_val; } negzro = *one / (neginf + *one); if (negzro != *zero) { ret_val = 0; return ret_val; } neginf = *one / negzro; if (neginf >= *zero) { ret_val = 0; return ret_val; } newzro = negzro + *zero; if (newzro != *zero) { ret_val = 0; return ret_val; } posinf = *one / newzro; if (posinf <= *one) { ret_val = 0; return ret_val; } neginf *= posinf; if (neginf >= *zero) { ret_val = 0; return ret_val; } posinf *= posinf; if (posinf <= *one) { ret_val = 0; return ret_val; } /* Return if we were only asked to check infinity arithmetic */ if (*ispec == 0) { return ret_val; } nan1 = posinf + neginf; nan2 = posinf / neginf; nan3 = posinf / posinf; nan4 = posinf * *zero; nan5 = neginf * negzro; nan6 = nan5 * 0.f; if (nan1 == nan1) { ret_val = 0; return ret_val; } if (nan2 == nan2) { ret_val = 0; return ret_val; } if (nan3 == nan3) { ret_val = 0; return ret_val; } if (nan4 == nan4) { ret_val = 0; return ret_val; } if (nan5 == nan5) { ret_val = 0; return ret_val; } if (nan6 == nan6) { ret_val = 0; return ret_val; } return ret_val; } /* _starpu_ieeeck_ */ starpu-1.3.9+dfsg/min-dgels/additional/iladlc.c000066400000000000000000000046141413463044200213520ustar00rootroot00000000000000/* iladlc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iladlc_(integer *m, integer *n, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; /* Local variables */ integer i__; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILADLC scans A for its last non-zero column. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*n == 0) { ret_val = *n; } else if (a[*n * a_dim1 + 1] != 0. || a[*m + *n * a_dim1] != 0.) { ret_val = *n; } else { /* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (a[i__ + ret_val * a_dim1] != 0.) { return ret_val; } } } } return ret_val; } /* _starpu_iladlc_ */ starpu-1.3.9+dfsg/min-dgels/additional/iladlr.c000066400000000000000000000046011413463044200213650ustar00rootroot00000000000000/* iladlr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iladlr_(integer *m, integer *n, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; /* Local variables */ integer i__, j; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILADLR scans A for its last non-zero row. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*m == 0) { ret_val = *m; } else if (a[*m + a_dim1] != 0. || a[*m + *n * a_dim1] != 0.) { ret_val = *m; } else { /* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { if (a[i__ + j * a_dim1] != 0.) { break; } } ret_val = max(ret_val,i__); } } return ret_val; } /* _starpu_iladlr_ */ starpu-1.3.9+dfsg/min-dgels/additional/ilaenv.c000066400000000000000000000467721413463044200214130ustar00rootroot00000000000000/* ilaenv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" #include "string.h" /* Table of constant values */ static integer c__1 = 1; static real c_b163 = 0.f; static real c_b164 = 1.f; static integer c__0 = 0; integer _starpu_ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, integer *n4) { /* System generated locals */ integer ret_val; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer s_cmp(char *, char *, ftnlen, ftnlen); /* Local variables */ integer i__; char c1[1], c2[1], c3[1], c4[1]; integer ic, nb, iz, nx; logical cname; integer nbmin; logical sname; extern integer _starpu_ieeeck_(integer *, real *, real *); char subnam[1]; extern integer _starpu_iparmq_(integer *, char *, char *, integer *, integer *, integer *, integer *); ftnlen name_len, opts_len; name_len = strlen (name__); opts_len = strlen (opts); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILAENV is called from the LAPACK routines to choose problem-dependent */ /* parameters for the local environment. See ISPEC for a description of */ /* the parameters. */ /* ILAENV returns an INTEGER */ /* if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC */ /* if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value. */ /* This version provides a set of parameters which should give good, */ /* but not optimal, performance on many of the currently available */ /* computers. Users are encouraged to modify this subroutine to set */ /* the tuning parameters for their particular machine using the option */ /* and problem size information in the arguments. */ /* This routine will not function correctly if it is converted to all */ /* lower case. Converting it to all upper case is allowed. */ /* Arguments */ /* ========= */ /* ISPEC (input) INTEGER */ /* Specifies the parameter to be returned as the value of */ /* ILAENV. */ /* = 1: the optimal blocksize; if this value is 1, an unblocked */ /* algorithm will give the best performance. */ /* = 2: the minimum block size for which the block routine */ /* should be used; if the usable block size is less than */ /* this value, an unblocked routine should be used. */ /* = 3: the crossover point (in a block routine, for N less */ /* than this value, an unblocked routine should be used) */ /* = 4: the number of shifts, used in the nonsymmetric */ /* eigenvalue routines (DEPRECATED) */ /* = 5: the minimum column dimension for blocking to be used; */ /* rectangular blocks must have dimension at least k by m, */ /* where k is given by ILAENV(2,...) and m by ILAENV(5,...) */ /* = 6: the crossover point for the SVD (when reducing an m by n */ /* matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds */ /* this value, a QR factorization is used first to reduce */ /* the matrix to a triangular form.) */ /* = 7: the number of processors */ /* = 8: the crossover point for the multishift QR method */ /* for nonsymmetric eigenvalue problems (DEPRECATED) */ /* = 9: maximum size of the subproblems at the bottom of the */ /* computation tree in the divide-and-conquer algorithm */ /* (used by xGELSD and xGESDD) */ /* =10: ieee NaN arithmetic can be trusted not to trap */ /* =11: infinity arithmetic can be trusted not to trap */ /* 12 <= ISPEC <= 16: */ /* xHSEQR or one of its subroutines, */ /* see IPARMQ for detailed explanation */ /* NAME (input) CHARACTER*(*) */ /* The name of the calling subroutine, in either upper case or */ /* lower case. */ /* OPTS (input) CHARACTER*(*) */ /* The character options to the subroutine NAME, concatenated */ /* into a single character string. For example, UPLO = 'U', */ /* TRANS = 'T', and DIAG = 'N' for a triangular routine would */ /* be specified as OPTS = 'UTN'. */ /* N1 (input) INTEGER */ /* N2 (input) INTEGER */ /* N3 (input) INTEGER */ /* N4 (input) INTEGER */ /* Problem dimensions for the subroutine NAME; these may not all */ /* be required. */ /* Further Details */ /* =============== */ /* The following conventions have been used when calling ILAENV from the */ /* LAPACK routines: */ /* 1) OPTS is a concatenation of all of the character options to */ /* subroutine NAME, in the same order that they appear in the */ /* argument list for NAME, even if they are not used in determining */ /* the value of the parameter specified by ISPEC. */ /* 2) The problem dimensions N1, N2, N3, N4 are specified in the order */ /* that they appear in the argument list for NAME. N1 is used */ /* first, N2 second, and so on, and unused problem dimensions are */ /* passed a value of -1. */ /* 3) The parameter value returned by ILAENV is checked for validity in */ /* the calling subroutine. For example, ILAENV is used to retrieve */ /* the optimal blocksize for STRTRI as follows: */ /* NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) */ /* IF( NB.LE.1 ) NB = MAX( 1, N ) */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ switch (*ispec) { case 1: goto L10; case 2: goto L10; case 3: goto L10; case 4: goto L80; case 5: goto L90; case 6: goto L100; case 7: goto L110; case 8: goto L120; case 9: goto L130; case 10: goto L140; case 11: goto L150; case 12: goto L160; case 13: goto L160; case 14: goto L160; case 15: goto L160; case 16: goto L160; } /* Invalid value for ISPEC */ ret_val = -1; return ret_val; L10: /* Convert NAME to upper case if the first character is lower case. */ ret_val = 1; s_copy(subnam, name__, (ftnlen)1, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { /* ASCII character set */ if (ic >= 97 && ic <= 122) { *(unsigned char *)subnam = (char) (ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 97 && ic <= 122) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); } /* L20: */ } } } else if (iz == 233 || iz == 169) { /* EBCDIC character set */ if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { *(unsigned char *)subnam = (char) (ic + 64); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); } /* L30: */ } } } else if (iz == 218 || iz == 250) { /* Prime machines: ASCII+128 */ if (ic >= 225 && ic <= 250) { *(unsigned char *)subnam = (char) (ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 225 && ic <= 250) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); } /* L40: */ } } } *(unsigned char *)c1 = *(unsigned char *)subnam; sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; if (! (cname || sname)) { return ret_val; } s_copy(c2, subnam + 1, (ftnlen)1, (ftnlen)2); s_copy(c3, subnam + 3, (ftnlen)1, (ftnlen)3); s_copy(c4, c3 + 1, (ftnlen)1, (ftnlen)2); switch (*ispec) { case 1: goto L50; case 2: goto L60; case 3: goto L70; } L50: /* ISPEC = 1: block size */ /* In these examples, separate code is provided for setting NB for */ /* real and complex. We assume that NB will take the same value in */ /* single or double precision. */ nb = 1; if (s_cmp(c2, "GE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } else if (s_cmp(c3, "QRF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "RQF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) 1, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "HRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "BRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "TRI", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "PO", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "SY", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } else if (sname && s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nb = 32; } else if (sname && s_cmp(c3, "GST", (ftnlen)1, (ftnlen)3) == 0) { nb = 64; } } else if (cname && s_cmp(c2, "HE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { nb = 64; } else if (s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nb = 32; } else if (s_cmp(c3, "GST", (ftnlen)1, (ftnlen)3) == 0) { nb = 64; } } else if (sname && s_cmp(c2, "OR", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } } else if (s_cmp(c2, "GB", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { if (*n4 <= 64) { nb = 1; } else { nb = 32; } } else { if (*n4 <= 64) { nb = 1; } else { nb = 32; } } } } else if (s_cmp(c2, "PB", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { if (*n2 <= 64) { nb = 1; } else { nb = 32; } } else { if (*n2 <= 64) { nb = 1; } else { nb = 32; } } } } else if (s_cmp(c2, "TR", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRI", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "LA", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "UUM", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (sname && s_cmp(c2, "ST", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "EBZ", (ftnlen)1, (ftnlen)3) == 0) { nb = 1; } } ret_val = nb; return ret_val; L60: /* ISPEC = 2: minimum block size */ nbmin = 2; if (s_cmp(c2, "GE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "QRF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)1, ( ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "HRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "BRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "TRI", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } } else if (s_cmp(c2, "SY", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 8; } else { nbmin = 8; } } else if (sname && s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nbmin = 2; } } else if (cname && s_cmp(c2, "HE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nbmin = 2; } } else if (sname && s_cmp(c2, "OR", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } } ret_val = nbmin; return ret_val; L70: /* ISPEC = 3: crossover point */ nx = 0; if (s_cmp(c2, "GE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "QRF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)1, ( ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } else if (s_cmp(c3, "HRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } else if (s_cmp(c3, "BRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } } else if (s_cmp(c2, "SY", (ftnlen)1, (ftnlen)2) == 0) { if (sname && s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nx = 32; } } else if (cname && s_cmp(c2, "HE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nx = 32; } } else if (sname && s_cmp(c2, "OR", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nx = 128; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nx = 128; } } } ret_val = nx; return ret_val; L80: /* ISPEC = 4: number of shifts (used by xHSEQR) */ ret_val = 6; return ret_val; L90: /* ISPEC = 5: minimum column dimension (not used) */ ret_val = 2; return ret_val; L100: /* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); return ret_val; L110: /* ISPEC = 7: number of processors (not used) */ ret_val = 1; return ret_val; L120: /* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ ret_val = 50; return ret_val; L130: /* ISPEC = 9: maximum size of the subproblems at the bottom of the */ /* computation tree in the divide-and-conquer algorithm */ /* (used by xGELSD and xGESDD) */ ret_val = 25; return ret_val; L140: /* ISPEC = 10: ieee NaN arithmetic can be trusted not to trap */ /* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = _starpu_ieeeck_(&c__1, &c_b163, &c_b164); } return ret_val; L150: /* ISPEC = 11: infinity arithmetic can be trusted not to trap */ /* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = _starpu_ieeeck_(&c__0, &c_b163, &c_b164); } return ret_val; L160: /* 12 <= ISPEC <= 16: xHSEQR or one of its subroutines. */ ret_val = _starpu_iparmq_(ispec, name__, opts, n1, n2, n3, n4) ; return ret_val; /* End of ILAENV */ } /* _starpu_ilaenv_ */ starpu-1.3.9+dfsg/min-dgels/additional/iparmq.c000066400000000000000000000241731413463044200214150ustar00rootroot00000000000000/* iparmq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer *ilo, integer *ihi, integer *lwork) { /* System generated locals */ integer ret_val, i__1, i__2; real r__1; /* Builtin functions */ double log(doublereal); integer i_nint(real *); /* Local variables */ integer nh, ns; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* Purpose */ /* ======= */ /* This program sets problem and machine dependent parameters */ /* useful for xHSEQR and its subroutines. It is called whenever */ /* ILAENV is called with 12 <= ISPEC <= 16 */ /* Arguments */ /* ========= */ /* ISPEC (input) integer scalar */ /* ISPEC specifies which tunable parameter IPARMQ should */ /* return. */ /* ISPEC=12: (INMIN) Matrices of order nmin or less */ /* are sent directly to xLAHQR, the implicit */ /* double shift QR algorithm. NMIN must be */ /* at least 11. */ /* ISPEC=13: (INWIN) Size of the deflation window. */ /* This is best set greater than or equal to */ /* the number of simultaneous shifts NS. */ /* Larger matrices benefit from larger deflation */ /* windows. */ /* ISPEC=14: (INIBL) Determines when to stop nibbling and */ /* invest in an (expensive) multi-shift QR sweep. */ /* If the aggressive early deflation subroutine */ /* finds LD converged eigenvalues from an order */ /* NW deflation window and LD.GT.(NW*NIBBLE)/100, */ /* then the next QR sweep is skipped and early */ /* deflation is applied immediately to the */ /* remaining active diagonal block. Setting */ /* IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a */ /* multi-shift QR sweep whenever early deflation */ /* finds a converged eigenvalue. Setting */ /* IPARMQ(ISPEC=14) greater than or equal to 100 */ /* prevents TTQRE from skipping a multi-shift */ /* QR sweep. */ /* ISPEC=15: (NSHFTS) The number of simultaneous shifts in */ /* a multi-shift QR iteration. */ /* ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the */ /* following meanings. */ /* 0: During the multi-shift QR sweep, */ /* xLAQR5 does not accumulate reflections and */ /* does not use matrix-matrix multiply to */ /* update the far-from-diagonal matrix */ /* entries. */ /* 1: During the multi-shift QR sweep, */ /* xLAQR5 and/or xLAQRaccumulates reflections and uses */ /* matrix-matrix multiply to update the */ /* far-from-diagonal matrix entries. */ /* 2: During the multi-shift QR sweep. */ /* xLAQR5 accumulates reflections and takes */ /* advantage of 2-by-2 block structure during */ /* matrix-matrix multiplies. */ /* (If xTRMM is slower than xGEMM, then */ /* IPARMQ(ISPEC=16)=1 may be more efficient than */ /* IPARMQ(ISPEC=16)=2 despite the greater level of */ /* arithmetic work implied by the latter choice.) */ /* NAME (input) character string */ /* Name of the calling subroutine */ /* OPTS (input) character string */ /* This is a concatenation of the string arguments to */ /* TTQRE. */ /* N (input) integer scalar */ /* N is the order of the Hessenberg matrix H. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that H is already upper triangular */ /* in rows and columns 1:ILO-1 and IHI+1:N. */ /* LWORK (input) integer scalar */ /* The amount of workspace available. */ /* Further Details */ /* =============== */ /* Little is known about how best to choose these parameters. */ /* It is possible to use different values of the parameters */ /* for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR. */ /* It is probably best to choose different parameters for */ /* different matrices and different parameters at different */ /* times during the iteration, but this has not been */ /* implemented --- yet. */ /* The best choices of most of the parameters depend */ /* in an ill-understood way on the relative execution */ /* rate of xLAQR3 and xLAQR5 and on the nature of each */ /* particular eigenvalue problem. Experiment may be the */ /* only practical way to determine which choices are most */ /* effective. */ /* Following is a list of default values supplied by IPARMQ. */ /* These defaults may be adjusted in order to attain better */ /* performance in any particular computational environment. */ /* IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point. */ /* Default: 75. (Must be at least 11.) */ /* IPARMQ(ISPEC=13) Recommended deflation window size. */ /* This depends on ILO, IHI and NS, the */ /* number of simultaneous shifts returned */ /* by IPARMQ(ISPEC=15). The default for */ /* (IHI-ILO+1).LE.500 is NS. The default */ /* for (IHI-ILO+1).GT.500 is 3*NS/2. */ /* IPARMQ(ISPEC=14) Nibble crossover point. Default: 14. */ /* IPARMQ(ISPEC=15) Number of simultaneous shifts, NS. */ /* a multi-shift QR iteration. */ /* If IHI-ILO+1 is ... */ /* greater than ...but less ... the */ /* or equal to ... than default is */ /* 0 30 NS = 2+ */ /* 30 60 NS = 4+ */ /* 60 150 NS = 10 */ /* 150 590 NS = ** */ /* 590 3000 NS = 64 */ /* 3000 6000 NS = 128 */ /* 6000 infinity NS = 256 */ /* (+) By default matrices of this order are */ /* passed to the implicit double shift routine */ /* xLAHQR. See IPARMQ(ISPEC=12) above. These */ /* values of NS are used only in case of a rare */ /* xLAHQR failure. */ /* (**) The asterisks (**) indicate an ad-hoc */ /* function increasing from 10 to 64. */ /* IPARMQ(ISPEC=16) Select structured matrix multiply. */ /* (See ISPEC=16 above for details.) */ /* Default: 3. */ /* ================================================================ */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ if (*ispec == 15 || *ispec == 13 || *ispec == 16) { /* ==== Set the number simultaneous shifts ==== */ nh = *ihi - *ilo + 1; ns = 2; if (nh >= 30) { ns = 4; } if (nh >= 60) { ns = 10; } if (nh >= 150) { /* Computing MAX */ r__1 = log((real) nh) / log(2.f); i__1 = 10, i__2 = nh / i_nint(&r__1); ns = max(i__1,i__2); } if (nh >= 590) { ns = 64; } if (nh >= 3000) { ns = 128; } if (nh >= 6000) { ns = 256; } /* Computing MAX */ i__1 = 2, i__2 = ns - ns % 2; ns = max(i__1,i__2); } if (*ispec == 12) { /* ===== Matrices of order smaller than NMIN get sent */ /* . to xLAHQR, the classic double shift algorithm. */ /* . This must be at least 11. ==== */ ret_val = 75; } else if (*ispec == 14) { /* ==== INIBL: skip a multi-shift qr iteration and */ /* . whenever aggressive early deflation finds */ /* . at least (NIBBLE*(window size)/100) deflations. ==== */ ret_val = 14; } else if (*ispec == 15) { /* ==== NSHFTS: The number of simultaneous shifts ===== */ ret_val = ns; } else if (*ispec == 13) { /* ==== NW: deflation window size. ==== */ if (nh <= 500) { ret_val = ns; } else { ret_val = ns * 3 / 2; } } else if (*ispec == 16) { /* ==== IACC22: Whether to accumulate reflections */ /* . before updating the far-from-diagonal elements */ /* . and whether to use 2-by-2 block structure while */ /* . doing it. A small amount of work could be saved */ /* . by making this choice dependent also upon the */ /* . NH=IHI-ILO+1. */ ret_val = 0; if (ns >= 14) { ret_val = 1; } if (ns >= 14) { ret_val = 2; } } else { /* ===== invalid value of ispec ===== */ ret_val = -1; } /* ==== End of IPARMQ ==== */ return ret_val; } /* _starpu_iparmq_ */ starpu-1.3.9+dfsg/min-dgels/additional/lsame.c000066400000000000000000000056461413463044200212310ustar00rootroot00000000000000/* lsame.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" logical _starpu_lsame_(char *ca, char *cb) { /* System generated locals */ logical ret_val; /* Local variables */ integer inta, intb, zcode; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* LSAME returns .TRUE. if CA is the same letter as CB regardless of */ /* case. */ /* Arguments */ /* ========= */ /* CA (input) CHARACTER*1 */ /* CB (input) CHARACTER*1 */ /* CA and CB specify the single characters to be compared. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Test if the characters are equal */ ret_val = *(unsigned char *)ca == *(unsigned char *)cb; if (ret_val) { return ret_val; } /* Now test for equivalence if both characters are alphabetic. */ zcode = 'Z'; /* Use 'Z' rather than 'A' so that ASCII can be detected on Prime */ /* machines, on which ICHAR returns a value with bit 8 set. */ /* ICHAR('A') on Prime machines returns 193 which is the same as */ /* ICHAR('A') on an EBCDIC machine. */ inta = *(unsigned char *)ca; intb = *(unsigned char *)cb; if (zcode == 90 || zcode == 122) { /* ASCII is assumed - ZCODE is the ASCII code of either lower or */ /* upper case 'Z'. */ if (inta >= 97 && inta <= 122) { inta += -32; } if (intb >= 97 && intb <= 122) { intb += -32; } } else if (zcode == 233 || zcode == 169) { /* EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or */ /* upper case 'Z'. */ if (inta >= 129 && inta <= 137 || inta >= 145 && inta <= 153 || inta >= 162 && inta <= 169) { inta += 64; } if (intb >= 129 && intb <= 137 || intb >= 145 && intb <= 153 || intb >= 162 && intb <= 169) { intb += 64; } } else if (zcode == 218 || zcode == 250) { /* ASCII is assumed, on Prime machines - ZCODE is the ASCII code */ /* plus 128 of either lower or upper case 'Z'. */ if (inta >= 225 && inta <= 250) { inta += -32; } if (intb >= 225 && intb <= 250) { intb += -32; } } ret_val = inta == intb; /* RETURN */ /* End of LSAME */ return ret_val; } /* _starpu_lsame_ */ starpu-1.3.9+dfsg/min-dgels/additional/mindgels.h000066400000000000000000000003571413463044200217310ustar00rootroot00000000000000#ifndef DGELS_H #define DGELS_H #include "f2c.h" int _starpu_dgels_(char *trans, integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); #endif starpu-1.3.9+dfsg/min-dgels/additional/pow_di.c000066400000000000000000000007001413463044200213730ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double pow_di(ap, bp) doublereal *ap; integer *bp; #else double pow_di(doublereal *ap, integer *bp) #endif { double pow, x; integer n; unsigned long u; pow = 1; x = *ap; n = *bp; if(n != 0) { if(n < 0) { n = -n; x = 1/x; } for(u = n; ; ) { if(u & 01) pow *= x; if(u >>= 1) x *= x; else break; } } return(pow); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/additional/s_cat.c000066400000000000000000000026621413463044200212140ustar00rootroot00000000000000/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the * target of a concatenation to appear on its right-hand side (contrary * to the Fortran 77 Standard, but in accordance with Fortran 90). */ #include "f2c.h" #ifndef NO_OVERWRITE #include "stdio.h" #undef abs #ifdef KR_headers extern char *F77_aloc(); extern void free(); extern void exit_(); #else #undef min #undef max #include "stdlib.h" extern #ifdef __cplusplus "C" #endif char *F77_aloc(ftnlen, const char*); #endif #include "string.h" #endif /* NO_OVERWRITE */ #ifdef __cplusplus extern "C" { #endif VOID #ifdef KR_headers s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnint rnp[], *np; ftnlen ll; #else s_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) #endif { ftnlen i, nc; char *rp; ftnlen n = *np; #ifndef NO_OVERWRITE ftnlen L, m; char *lp0, *lp1; lp0 = 0; lp1 = lp; L = ll; i = 0; while(i < n) { rp = rpp[i]; m = rnp[i++]; if (rp >= lp1 || rp + m <= lp) { if ((L -= m) <= 0) { n = i; break; } lp1 += m; continue; } lp0 = lp; lp = lp1 = F77_aloc(L = ll, "s_cat"); break; } lp1 = lp; #endif /* NO_OVERWRITE */ for(i = 0 ; i < n ; ++i) { nc = ll; if(rnp[i] < nc) nc = rnp[i]; ll -= nc; rp = rpp[i]; while(--nc >= 0) *lp++ = *rp++; } while(--ll >= 0) *lp++ = ' '; #ifndef NO_OVERWRITE if (lp0) { memcpy(lp0, lp1, L); free(lp1); } #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/additional/sysdep1.h000066400000000000000000000022621413463044200215140ustar00rootroot00000000000000#ifndef SYSDEP_H_INCLUDED #define SYSDEP_H_INCLUDED #undef USE_LARGEFILE #ifndef NO_LONG_LONG #ifdef __sun__ #define USE_LARGEFILE #define OFF_T off64_t #endif #ifdef __linux__ #define USE_LARGEFILE #define OFF_T __off64_t #endif #ifdef _AIX43 #define _LARGE_FILES #define _LARGE_FILE_API #define USE_LARGEFILE #endif /*_AIX43*/ #ifdef __hpux #define _FILE64 #define _LARGEFILE64_SOURCE #define USE_LARGEFILE #endif /*__hpux*/ #ifdef __sgi #define USE_LARGEFILE #endif /*__sgi*/ #ifdef __FreeBSD__ #define OFF_T off_t #define FSEEK fseeko #define FTELL ftello #endif #ifdef USE_LARGEFILE #ifndef OFF_T #define OFF_T off64_t #endif #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #define FOPEN fopen64 #define FREOPEN freopen64 #define FSEEK fseeko64 #define FSTAT fstat64 #define FTELL ftello64 #define FTRUNCATE ftruncate64 #define STAT stat64 #define STAT_ST stat64 #endif /*USE_LARGEFILE*/ #endif /*NO_LONG_LONG*/ #ifndef NON_UNIX_STDIO #ifndef USE_LARGEFILE #define _INCLUDE_POSIX_SOURCE /* for HP-UX */ #define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ #include "sys/types.h" #include "sys/stat.h" #endif #endif #endif /*SYSDEP_H_INCLUDED*/ starpu-1.3.9+dfsg/min-dgels/additional/wsfe.c000066400000000000000000000024001413463044200210550ustar00rootroot00000000000000/*write sequential formatted external*/ #include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif int x_wSL(Void) { int n = f__putbuf('\n'); f__hiwater = f__recpos = f__cursor = 0; return(n == 0); } static int xw_end(Void) { int n; if(f__nonl) { f__putbuf(n = 0); fflush(f__cf); } else n = f__putbuf('\n'); f__hiwater = f__recpos = f__cursor = 0; return n; } static int xw_rev(Void) { int n = 0; if(f__workdone) { n = f__putbuf('\n'); f__workdone = 0; } f__hiwater = f__recpos = f__cursor = 0; return n; } #ifdef KR_headers integer s_wsfe(a) cilist *a; /*start*/ #else integer s_wsfe(cilist *a) /*start*/ #endif { int n; if(!f__init) f_init(); f__reading=0; f__sequential=1; f__formatted=1; f__external=1; if(n=c_sfe(a)) return(n); f__elist=a; f__hiwater = f__cursor=f__recpos=0; f__nonl = 0; f__scale=0; f__fmtbuf=a->cifmt; f__cf=f__curunit->ufd; if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio"); f__putn= x_putc; f__doed= w_ed; f__doned= w_ned; f__doend=xw_end; f__dorevert=xw_rev; f__donewrec=x_wSL; fmt_bg(); f__cplus=0; f__cblank=f__curunit->ublnk; if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr,errno,"write start"); return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/additional/xerbla.c000066400000000000000000000034261413463044200213770ustar00rootroot00000000000000/* xerbla.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" #include "stdio.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info) { /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* XERBLA is an error handler for the LAPACK routines. */ /* It is called by an LAPACK routine if an input parameter has an */ /* invalid value. A message is printed and execution stops. */ /* Installers may consider modifying the STOP statement in order to */ /* call system-specific exception-handling facilities. */ /* Arguments */ /* ========= */ /* SRNAME (input) CHARACTER*(*) */ /* The name of the routine which called XERBLA. */ /* INFO (input) INTEGER */ /* The position of the invalid parameter in the parameter list */ /* of the calling routine. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ printf("** On entry to %s, parameter number %ld had an illegal value\n", srname, *info); /* End of XERBLA */ return 0; } /* _starpu_xerbla_ */ starpu-1.3.9+dfsg/min-dgels/base/000077500000000000000000000000001413463044200165535ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/BLAS/000077500000000000000000000000001413463044200172745ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/000077500000000000000000000000001413463044200177235ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/Makefile000066400000000000000000000074371413463044200213760ustar00rootroot00000000000000TOPDIR=../.. include $(TOPDIR)/make.inc ####################################################################### # This is the makefile to create a library for the BLAS. # The files are grouped as follows: # # SBLAS1 -- Single precision real BLAS routines # CBLAS1 -- Single precision complex BLAS routines # DBLAS1 -- Double precision real BLAS routines # ZBLAS1 -- Double precision complex BLAS routines # # CB1AUX -- Real BLAS routines called by complex routines # ZB1AUX -- D.P. real BLAS routines called by d.p. complex # routines # # ALLBLAS -- Auxiliary routines for Level 2 and 3 BLAS # # SBLAS2 -- Single precision real BLAS2 routines # CBLAS2 -- Single precision complex BLAS2 routines # DBLAS2 -- Double precision real BLAS2 routines # ZBLAS2 -- Double precision complex BLAS2 routines # # SBLAS3 -- Single precision real BLAS3 routines # CBLAS3 -- Single precision complex BLAS3 routines # DBLAS3 -- Double precision real BLAS3 routines # ZBLAS3 -- Double precision complex BLAS3 routines # # The library can be set up to include routines for any combination # of the four precisions. To create or add to the library, enter make # followed by one or more of the precisions desired. Some examples: # make single # make single complex # make single double complex complex16 # Note that these commands are not safe for parallel builds. # # Alternatively, the commands # make all # or # make # without any arguments creates a library of all four precisions. # The name of the library is held in BLASLIB, which is set in the # top-level make.inc # # To remove the object files after the library is created, enter # make clean # To force the source files to be recompiled, enter, for example, # make single FRC=FRC # #--------------------------------------------------------------------- # # Edward Anderson, University of Tennessee # March 26, 1990 # Susan Ostrouchov, Last updated September 30, 1994 # ejr, May 2006. # ####################################################################### all: $(BLASLIB) #--------------------------------------------------------- # Comment out the next 6 definitions if you already have # the Level 1 BLAS. #--------------------------------------------------------- DBLAS1 = idamax.o dasum.o daxpy.o dcopy.o ddot.o dnrm2.o \ drot.o drotg.o dscal.o dsdot.o dswap.o drotmg.o drotm.o $(DBLAS1): $(FRC) #--------------------------------------------------------------------- # The following line defines auxiliary routines needed by both the # Level 2 and Level 3 BLAS. Comment it out only if you already have # both the Level 2 and 3 BLAS. #--------------------------------------------------------------------- ALLBLAS = lsame.o xerbla.o xerbla_array.o $(ALLBLAS) : $(FRC) #--------------------------------------------------------- # Comment out the next 4 definitions if you already have # the Level 2 BLAS. #--------------------------------------------------------- DBLAS2 = dgemv.o dgbmv.o dsymv.o dsbmv.o dspmv.o \ dtrmv.o dtbmv.o dtpmv.o dtrsv.o dtbsv.o dtpsv.o \ dger.o dsyr.o dspr.o dsyr2.o dspr2.o $(DBLAS2): $(FRC) #--------------------------------------------------------- # Comment out the next 4 definitions if you already have # the Level 3 BLAS. #--------------------------------------------------------- DBLAS3 = dgemm.o dsymm.o dsyrk.o dsyr2k.o dtrmm.o dtrsm.o $(DBLAS3): $(FRC) ALLOBJ= $(DBLAS1) $(DBLAS2) $(DBLAS3) $(ALLBLAS) $(BLASLIB): $(ALLOBJ) $(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ) $(RANLIB) $@ double: $(DBLAS1) $(ALLBLAS) $(DBLAS2) $(DBLAS3) $(ARCH) $(ARCHFLAGS) $(BLASLIB) $(DBLAS1) $(ALLBLAS) \ $(DBLAS2) $(DBLAS3) $(RANLIB) $(BLASLIB) FRC: @FRC=$(FRC) clean: rm -f *.o .c.o: $(CC) $(CFLAGS) -c $< -o $@ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dasum.c000066400000000000000000000044621413463044200212060ustar00rootroot00000000000000/* dasum.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dasum_(integer *n, doublereal *dx, integer *incx) { /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ integer i__, m, mp1; doublereal dtemp; integer nincx; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* takes the sum of the absolute values. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 3/93 to return if incx .le. 0. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dx; /* Function Body */ ret_val = 0.; dtemp = 0.; if (*n <= 0 || *incx <= 0) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ nincx = *n * *incx; i__1 = nincx; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { dtemp += (d__1 = dx[i__], abs(d__1)); /* L10: */ } ret_val = dtemp; return ret_val; /* code for increment equal to 1 */ /* clean-up loop */ L20: m = *n % 6; if (m == 0) { goto L40; } i__2 = m; for (i__ = 1; i__ <= i__2; ++i__) { dtemp += (d__1 = dx[i__], abs(d__1)); /* L30: */ } if (*n < 6) { goto L60; } L40: mp1 = m + 1; i__2 = *n; for (i__ = mp1; i__ <= i__2; i__ += 6) { dtemp = dtemp + (d__1 = dx[i__], abs(d__1)) + (d__2 = dx[i__ + 1], abs(d__2)) + (d__3 = dx[i__ + 2], abs(d__3)) + (d__4 = dx[i__ + 3], abs(d__4)) + (d__5 = dx[i__ + 4], abs(d__5)) + (d__6 = dx[i__ + 5], abs(d__6)); /* L50: */ } L60: ret_val = dtemp; return ret_val; } /* _starpu_dasum_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/daxpy.c000066400000000000000000000043701413463044200212200ustar00rootroot00000000000000/* daxpy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_daxpy_(integer *n, doublereal *da, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* constant times a vector plus a vector. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*da == 0.) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dy[iy] += *da * dx[ix]; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 4; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dy[i__] += *da * dx[i__]; /* L30: */ } if (*n < 4) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 4) { dy[i__] += *da * dx[i__]; dy[i__ + 1] += *da * dx[i__ + 1]; dy[i__ + 2] += *da * dx[i__ + 2]; dy[i__ + 3] += *da * dx[i__ + 3]; /* L50: */ } return 0; } /* _starpu_daxpy_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dcabs1.c000066400000000000000000000017511413463044200212300ustar00rootroot00000000000000/* dcabs1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dcabs1_(doublecomplex *z__) { /* System generated locals */ doublereal ret_val, d__1, d__2; /* Builtin functions */ double d_imag(doublecomplex *); /* .. Scalar Arguments .. */ /* .. */ /* .. */ /* Purpose */ /* ======= */ /* DCABS1 computes absolute value of a double complex number */ /* .. Intrinsic Functions .. */ ret_val = (d__1 = z__->r, abs(d__1)) + (d__2 = d_imag(z__), abs(d__2)); return ret_val; } /* _starpu_dcabs1_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dcopy.c000066400000000000000000000043511413463044200212100ustar00rootroot00000000000000/* dcopy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dcopy_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* copies a vector, x, to a vector, y. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dy[iy] = dx[ix]; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 7; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dy[i__] = dx[i__]; /* L30: */ } if (*n < 7) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 7) { dy[i__] = dx[i__]; dy[i__ + 1] = dx[i__ + 1]; dy[i__ + 2] = dx[i__ + 2]; dy[i__ + 3] = dx[i__ + 3]; dy[i__ + 4] = dx[i__ + 4]; dy[i__ + 5] = dx[i__ + 5]; dy[i__ + 6] = dx[i__ + 6]; /* L50: */ } return 0; } /* _starpu_dcopy_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/ddot.c000066400000000000000000000045371413463044200210320ustar00rootroot00000000000000/* ddot.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; doublereal ret_val; /* Local variables */ integer i__, m, ix, iy, mp1; doublereal dtemp; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* forms the dot product of two vectors. */ /* uses unrolled loops for increments equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ ret_val = 0.; dtemp = 0.; if (*n <= 0) { return ret_val; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments */ /* not equal to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp += dx[ix] * dy[iy]; ix += *incx; iy += *incy; /* L10: */ } ret_val = dtemp; return ret_val; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 5; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dtemp += dx[i__] * dy[i__]; /* L30: */ } if (*n < 5) { goto L60; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 5) { dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[ i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ + 4] * dy[i__ + 4]; /* L50: */ } L60: ret_val = dtemp; return ret_val; } /* _starpu_ddot_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dgbmv.c000066400000000000000000000232451413463044200211740ustar00rootroot00000000000000/* dgbmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; /* Local variables */ integer i__, j, k, ix, iy, jx, jy, kx, ky, kup1, info; doublereal temp; integer lenx, leny; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBMV performs one of the matrix-vector operations */ /* y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, */ /* where alpha and beta are scalars, x and y are vectors and A is an */ /* m by n band matrix, with kl sub-diagonals and ku super-diagonals. */ /* Arguments */ /* ========== */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ /* TRANS = 'T' or 't' y := alpha*A'*x + beta*y. */ /* TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* KL - INTEGER. */ /* On entry, KL specifies the number of sub-diagonals of the */ /* matrix A. KL must satisfy 0 .le. KL. */ /* Unchanged on exit. */ /* KU - INTEGER. */ /* On entry, KU specifies the number of super-diagonals of the */ /* matrix A. KU must satisfy 0 .le. KU. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry, the leading ( kl + ku + 1 ) by n part of the */ /* array A must contain the matrix of coefficients, supplied */ /* column by column, with the leading diagonal of the matrix in */ /* row ( ku + 1 ) of the array, the first super-diagonal */ /* starting at position 2 in row ku, the first sub-diagonal */ /* starting at position 1 in row ( ku + 2 ), and so on. */ /* Elements in the array A that do not correspond to elements */ /* in the band matrix (such as the top left ku by ku triangle) */ /* are not referenced. */ /* The following program segment will transfer a band matrix */ /* from conventional full matrix storage to band storage: */ /* DO 20, J = 1, N */ /* K = KU + 1 - J */ /* DO 10, I = MAX( 1, J - KU ), MIN( M, J + KL ) */ /* A( K + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* ( kl + ku + 1 ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ /* Before entry, the incremented array Y must contain the */ /* vector y. On exit, Y is overwritten by the updated vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C") ) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; } else if (*kl < 0) { info = 4; } else if (*ku < 0) { info = 5; } else if (*lda < *kl + *ku + 1) { info = 8; } else if (*incx == 0) { info = 10; } else if (*incy == 0) { info = 13; } if (info != 0) { _starpu_xerbla_("DGBMV ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set */ /* up the start points in X and Y. */ if (_starpu_lsame_(trans, "N")) { lenx = *n; leny = *m; } else { lenx = *m; leny = *n; } if (*incx > 0) { kx = 1; } else { kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (leny - 1) * *incy; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through the band part of A. */ /* First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; /* L20: */ } } } else { iy = ky; if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; /* L30: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } kup1 = *ku + 1; if (_starpu_lsame_(trans, "N")) { /* Form y := alpha*A*x + y. */ jx = kx; if (*incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; k = kup1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__4 = min(i__5,i__6); for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { y[i__] += temp * a[k + i__ + j * a_dim1]; /* L50: */ } } jx += *incx; /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; iy = ky; k = kup1 - j; /* Computing MAX */ i__4 = 1, i__2 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__3 = min(i__5,i__6); for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { y[iy] += temp * a[k + i__ + j * a_dim1]; iy += *incy; /* L70: */ } } jx += *incx; if (j > *ku) { ky += *incy; } /* L80: */ } } } else { /* Form y := alpha*A'*x + y. */ jy = ky; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; k = kup1 - j; /* Computing MAX */ i__3 = 1, i__4 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__2 = min(i__5,i__6); for (i__ = max(i__3,i__4); i__ <= i__2; ++i__) { temp += a[k + i__ + j * a_dim1] * x[i__]; /* L90: */ } y[jy] += *alpha * temp; jy += *incy; /* L100: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; ix = kx; k = kup1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__4 = min(i__5,i__6); for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { temp += a[k + i__ + j * a_dim1] * x[ix]; ix += *incx; /* L110: */ } y[jy] += *alpha * temp; jy += *incy; if (j > *ku) { kx += *incx; } /* L120: */ } } } return 0; /* End of DGBMV . */ } /* _starpu_dgbmv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dgemm.c000066400000000000000000000245261413463044200211710ustar00rootroot00000000000000/* dgemm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, info; logical nota, notb; doublereal temp; integer ncola; extern logical _starpu_lsame_(char *, char *); integer nrowa, nrowb; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEMM performs one of the matrix-matrix operations */ /* C := alpha*op( A )*op( B ) + beta*C, */ /* where op( X ) is one of */ /* op( X ) = X or op( X ) = X', */ /* alpha and beta are scalars, and A, B and C are matrices, with op( A ) */ /* an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. */ /* Arguments */ /* ========== */ /* TRANSA - CHARACTER*1. */ /* On entry, TRANSA specifies the form of op( A ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSA = 'N' or 'n', op( A ) = A. */ /* TRANSA = 'T' or 't', op( A ) = A'. */ /* TRANSA = 'C' or 'c', op( A ) = A'. */ /* Unchanged on exit. */ /* TRANSB - CHARACTER*1. */ /* On entry, TRANSB specifies the form of op( B ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSB = 'N' or 'n', op( B ) = B. */ /* TRANSB = 'T' or 't', op( B ) = B'. */ /* TRANSB = 'C' or 'c', op( B ) = B'. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix */ /* op( A ) and of the matrix C. M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix */ /* op( B ) and the number of columns of the matrix C. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry, K specifies the number of columns of the matrix */ /* op( A ) and the number of rows of the matrix op( B ). K must */ /* be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is */ /* k when TRANSA = 'N' or 'n', and is m otherwise. */ /* Before entry with TRANSA = 'N' or 'n', the leading m by k */ /* part of the array A must contain the matrix A, otherwise */ /* the leading k by m part of the array A must contain the */ /* matrix A. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When TRANSA = 'N' or 'n' then */ /* LDA must be at least max( 1, m ), otherwise LDA must be at */ /* least max( 1, k ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is */ /* n when TRANSB = 'N' or 'n', and is k otherwise. */ /* Before entry with TRANSB = 'N' or 'n', the leading k by n */ /* part of the array B must contain the matrix B, otherwise */ /* the leading n by k part of the array B must contain the */ /* matrix B. */ /* Unchanged on exit. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. When TRANSB = 'N' or 'n' then */ /* LDB must be at least max( 1, k ), otherwise LDB must be at */ /* least max( 1, n ). */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then C need not be set on input. */ /* Unchanged on exit. */ /* C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). */ /* Before entry, the leading m by n part of the array C must */ /* contain the matrix C, except when beta is zero, in which */ /* case C need not be set on entry. */ /* On exit, the array C is overwritten by the m by n matrix */ /* ( alpha*op( A )*op( B ) + beta*C ). */ /* LDC - INTEGER. */ /* On entry, LDC specifies the first dimension of C as declared */ /* in the calling (sub) program. LDC must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Set NOTA and NOTB as true if A and B respectively are not */ /* transposed and set NROWA, NCOLA and NROWB as the number of rows */ /* and columns of A and the number of rows of B respectively. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ nota = _starpu_lsame_(transa, "N"); notb = _starpu_lsame_(transb, "N"); if (nota) { nrowa = *m; ncola = *k; } else { nrowa = *k; ncola = *m; } if (notb) { nrowb = *k; } else { nrowb = *n; } /* Test the input parameters. */ info = 0; if (! nota && ! _starpu_lsame_(transa, "C") && ! _starpu_lsame_( transa, "T")) { info = 1; } else if (! notb && ! _starpu_lsame_(transb, "C") && ! _starpu_lsame_(transb, "T")) { info = 2; } else if (*m < 0) { info = 3; } else if (*n < 0) { info = 4; } else if (*k < 0) { info = 5; } else if (*lda < max(1,nrowa)) { info = 8; } else if (*ldb < max(1,nrowb)) { info = 10; } else if (*ldc < max(1,*m)) { info = 13; } if (info != 0) { _starpu_xerbla_("DGEMM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } /* And if alpha.eq.zero. */ if (*alpha == 0.) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ } /* L40: */ } } return 0; } /* Start the operations. */ if (notb) { if (nota) { /* Form C := alpha*A*B + beta*C. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L50: */ } } else if (*beta != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L60: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (b[l + j * b_dim1] != 0.) { temp = *alpha * b[l + j * b_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L70: */ } } /* L80: */ } /* L90: */ } } else { /* Form C := alpha*A'*B + beta*C */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; /* L100: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ i__ + j * c_dim1]; } /* L110: */ } /* L120: */ } } } else { if (nota) { /* Form C := alpha*A*B' + beta*C */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L130: */ } } else if (*beta != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L140: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (b[j + l * b_dim1] != 0.) { temp = *alpha * b[j + l * b_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L150: */ } } /* L160: */ } /* L170: */ } } else { /* Form C := alpha*A'*B' + beta*C */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; /* L180: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ i__ + j * c_dim1]; } /* L190: */ } /* L200: */ } } } return 0; /* End of DGEMM . */ } /* _starpu_dgemm_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dgemv.c000066400000000000000000000170561413463044200212020ustar00rootroot00000000000000/* dgemv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgemv_(char *trans, integer *m, integer *n, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp; integer lenx, leny; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEMV performs one of the matrix-vector operations */ /* y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, */ /* where alpha and beta are scalars, x and y are vectors and A is an */ /* m by n matrix. */ /* Arguments */ /* ========== */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ /* TRANS = 'T' or 't' y := alpha*A'*x + beta*y. */ /* TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ /* Before entry with BETA non-zero, the incremented array Y */ /* must contain the vector y. On exit, Y is overwritten by the */ /* updated vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C") ) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; } else if (*lda < max(1,*m)) { info = 6; } else if (*incx == 0) { info = 8; } else if (*incy == 0) { info = 11; } if (info != 0) { _starpu_xerbla_("DGEMV ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set */ /* up the start points in X and Y. */ if (_starpu_lsame_(trans, "N")) { lenx = *n; leny = *m; } else { lenx = *m; leny = *n; } if (*incx > 0) { kx = 1; } else { kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (leny - 1) * *incy; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ /* First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; /* L20: */ } } } else { iy = ky; if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; /* L30: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } if (_starpu_lsame_(trans, "N")) { /* Form y := alpha*A*x + y. */ jx = kx; if (*incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { y[i__] += temp * a[i__ + j * a_dim1]; /* L50: */ } } jx += *incx; /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; iy = ky; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { y[iy] += temp * a[i__ + j * a_dim1]; iy += *incy; /* L70: */ } } jx += *incx; /* L80: */ } } } else { /* Form y := alpha*A'*x + y. */ jy = ky; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[i__]; /* L90: */ } y[jy] += *alpha * temp; jy += *incy; /* L100: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = 0.; ix = kx; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[ix]; ix += *incx; /* L110: */ } y[jy] += *alpha * temp; jy += *incy; /* L120: */ } } } return 0; /* End of DGEMV . */ } /* _starpu_dgemv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dger.c000066400000000000000000000116031413463044200210110ustar00rootroot00000000000000/* dger.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dger_(integer *m, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, jy, kx, info; doublereal temp; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGER performs the rank 1 operation */ /* A := alpha*x*y' + A, */ /* where alpha is a scalar, x is an m element vector, y is an n element */ /* vector and A is an m by n matrix. */ /* Arguments */ /* ========== */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the m */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the n */ /* element vector y. */ /* Unchanged on exit. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. On exit, A is */ /* overwritten by the updated matrix. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ info = 0; if (*m < 0) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*incy == 0) { info = 7; } else if (*lda < max(1,*m)) { info = 9; } if (info != 0) { _starpu_xerbla_("DGER ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0.) { return 0; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (*incy > 0) { jy = 1; } else { jy = 1 - (*n - 1) * *incy; } if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (y[jy] != 0.) { temp = *alpha * y[jy]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[i__] * temp; /* L10: */ } } jy += *incy; /* L20: */ } } else { if (*incx > 0) { kx = 1; } else { kx = 1 - (*m - 1) * *incx; } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (y[jy] != 0.) { temp = *alpha * y[jy]; ix = kx; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[ix] * temp; ix += *incx; /* L30: */ } } jy += *incy; /* L40: */ } } return 0; /* End of DGER . */ } /* _starpu_dger_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dnrm2.c000066400000000000000000000042701413463044200211140ustar00rootroot00000000000000/* dnrm2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dnrm2_(integer *n, doublereal *x, integer *incx) { /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer ix; doublereal ssq, norm, scale, absxi; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DNRM2 returns the euclidean norm of a vector via the function */ /* name, so that */ /* DNRM2 := sqrt( x'*x ) */ /* -- This version written on 25-October-1982. */ /* Modified on 14-October-1993 to inline the call to DLASSQ. */ /* Sven Hammarling, Nag Ltd. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n < 1 || *incx < 1) { norm = 0.; } else if (*n == 1) { norm = abs(x[1]); } else { scale = 0.; ssq = 1.; /* The following loop is equivalent to this call to the LAPACK */ /* auxiliary routine: */ /* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) */ i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { if (x[ix] != 0.) { absxi = (d__1 = x[ix], abs(d__1)); if (scale < absxi) { /* Computing 2nd power */ d__1 = scale / absxi; ssq = ssq * (d__1 * d__1) + 1.; scale = absxi; } else { /* Computing 2nd power */ d__1 = absxi / scale; ssq += d__1 * d__1; } } /* L10: */ } norm = scale * sqrt(ssq); } ret_val = norm; return ret_val; /* End of DNRM2. */ } /* _starpu_dnrm2_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/drot.c000066400000000000000000000036461413463044200210500ustar00rootroot00000000000000/* drot.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_drot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *c__, doublereal *s) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, ix, iy; doublereal dtemp; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* applies a plane rotation. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments not equal */ /* to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = *c__ * dx[ix] + *s * dy[iy]; dy[iy] = *c__ * dy[iy] - *s * dx[ix]; dx[ix] = dtemp; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ L20: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = *c__ * dx[i__] + *s * dy[i__]; dy[i__] = *c__ * dy[i__] - *s * dx[i__]; dx[i__] = dtemp; /* L30: */ } return 0; } /* _starpu_drot_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/drotg.c000066400000000000000000000034001413463044200212030ustar00rootroot00000000000000/* drotg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = 1.; /* Subroutine */ int _starpu_drotg_(doublereal *da, doublereal *db, doublereal *c__, doublereal *s) { /* System generated locals */ doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal r__, z__, roe, scale; /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* construct givens plane rotation. */ /* jack dongarra, linpack, 3/11/78. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ roe = *db; if (abs(*da) > abs(*db)) { roe = *da; } scale = abs(*da) + abs(*db); if (scale != 0.) { goto L10; } *c__ = 1.; *s = 0.; r__ = 0.; z__ = 0.; goto L20; L10: /* Computing 2nd power */ d__1 = *da / scale; /* Computing 2nd power */ d__2 = *db / scale; r__ = scale * sqrt(d__1 * d__1 + d__2 * d__2); r__ = d_sign(&c_b4, &roe) * r__; *c__ = *da / r__; *s = *db / r__; z__ = 1.; if (abs(*da) > abs(*db)) { z__ = *s; } if (abs(*db) >= abs(*da) && *c__ != 0.) { z__ = 1. / *c__; } L20: *da = r__; *db = z__; return 0; } /* _starpu_drotg_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/drotm.c000066400000000000000000000116071413463044200212210ustar00rootroot00000000000000/* drotm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_drotm_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *dparam) { /* Initialized data */ static doublereal zero = 0.; static doublereal two = 2.; /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__; doublereal w, z__; integer kx, ky; doublereal dh11, dh12, dh21, dh22, dflag; integer nsteps; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX */ /* (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN */ /* (DY**T) */ /* DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE */ /* LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY. */ /* WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */ /* DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0 */ /* (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0) */ /* H=( ) ( ) ( ) ( ) */ /* (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0). */ /* SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* number of elements in input vector(s) */ /* DX (input/output) DOUBLE PRECISION array, dimension N */ /* double precision vector with N elements */ /* INCX (input) INTEGER */ /* storage spacing between elements of DX */ /* DY (input/output) DOUBLE PRECISION array, dimension N */ /* double precision vector with N elements */ /* INCY (input) INTEGER */ /* storage spacing between elements of DY */ /* DPARAM (input/output) DOUBLE PRECISION array, dimension 5 */ /* DPARAM(1)=DFLAG */ /* DPARAM(2)=DH11 */ /* DPARAM(3)=DH21 */ /* DPARAM(4)=DH12 */ /* DPARAM(5)=DH22 */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --dparam; --dy; --dx; /* Function Body */ /* .. */ dflag = dparam[1]; if (*n <= 0 || dflag + two == zero) { goto L140; } if (! (*incx == *incy && *incx > 0)) { goto L70; } nsteps = *n * *incx; if (dflag < 0.) { goto L50; } else if (dflag == 0) { goto L10; } else { goto L30; } L10: dh12 = dparam[4]; dh21 = dparam[3]; i__1 = nsteps; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { w = dx[i__]; z__ = dy[i__]; dx[i__] = w + z__ * dh12; dy[i__] = w * dh21 + z__; /* L20: */ } goto L140; L30: dh11 = dparam[2]; dh22 = dparam[5]; i__2 = nsteps; i__1 = *incx; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { w = dx[i__]; z__ = dy[i__]; dx[i__] = w * dh11 + z__; dy[i__] = -w + dh22 * z__; /* L40: */ } goto L140; L50: dh11 = dparam[2]; dh12 = dparam[4]; dh21 = dparam[3]; dh22 = dparam[5]; i__1 = nsteps; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { w = dx[i__]; z__ = dy[i__]; dx[i__] = w * dh11 + z__ * dh12; dy[i__] = w * dh21 + z__ * dh22; /* L60: */ } goto L140; L70: kx = 1; ky = 1; if (*incx < 0) { kx = (1 - *n) * *incx + 1; } if (*incy < 0) { ky = (1 - *n) * *incy + 1; } if (dflag < 0.) { goto L120; } else if (dflag == 0) { goto L80; } else { goto L100; } L80: dh12 = dparam[4]; dh21 = dparam[3]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { w = dx[kx]; z__ = dy[ky]; dx[kx] = w + z__ * dh12; dy[ky] = w * dh21 + z__; kx += *incx; ky += *incy; /* L90: */ } goto L140; L100: dh11 = dparam[2]; dh22 = dparam[5]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { w = dx[kx]; z__ = dy[ky]; dx[kx] = w * dh11 + z__; dy[ky] = -w + dh22 * z__; kx += *incx; ky += *incy; /* L110: */ } goto L140; L120: dh11 = dparam[2]; dh12 = dparam[4]; dh21 = dparam[3]; dh22 = dparam[5]; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { w = dx[kx]; z__ = dy[ky]; dx[kx] = w * dh11 + z__ * dh12; dy[ky] = w * dh21 + z__ * dh22; kx += *incx; ky += *incy; /* L130: */ } L140: return 0; } /* _starpu_drotm_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/drotmg.c000066400000000000000000000141201413463044200213610ustar00rootroot00000000000000/* drotmg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_drotmg_(doublereal *dd1, doublereal *dd2, doublereal * dx1, doublereal *dy1, doublereal *dparam) { /* Initialized data */ static doublereal zero = 0.; static doublereal one = 1.; static doublereal two = 2.; static doublereal gam = 4096.; static doublereal gamsq = 16777216.; static doublereal rgamsq = 5.9604645e-8; /* Format strings */ static char fmt_120[] = ""; static char fmt_150[] = ""; static char fmt_180[] = ""; static char fmt_210[] = ""; /* System generated locals */ doublereal d__1; /* Local variables */ doublereal du, dp1, dp2, dq1, dq2, dh11, dh12, dh21, dh22; integer igo; doublereal dflag, dtemp; /* Assigned format variables */ static char *igo_fmt; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS */ /* THE SECOND COMPONENT OF THE 2-VECTOR (DSQRT(DD1)*DX1,DSQRT(DD2)* */ /* DY2)**T. */ /* WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */ /* DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0 */ /* (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0) */ /* H=( ) ( ) ( ) ( ) */ /* (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0). */ /* LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22 */ /* RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE */ /* VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.) */ /* THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE */ /* INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE */ /* OF DD1 AND DD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM. */ /* Arguments */ /* ========= */ /* DD1 (input/output) DOUBLE PRECISION */ /* DD2 (input/output) DOUBLE PRECISION */ /* DX1 (input/output) DOUBLE PRECISION */ /* DY1 (input) DOUBLE PRECISION */ /* DPARAM (input/output) DOUBLE PRECISION array, dimension 5 */ /* DPARAM(1)=DFLAG */ /* DPARAM(2)=DH11 */ /* DPARAM(3)=DH21 */ /* DPARAM(4)=DH12 */ /* DPARAM(5)=DH22 */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --dparam; /* Function Body */ /* .. */ if (! (*dd1 < zero)) { goto L10; } /* GO ZERO-H-D-AND-DX1.. */ goto L60; L10: /* CASE-DD1-NONNEGATIVE */ dp2 = *dd2 * *dy1; if (! (dp2 == zero)) { goto L20; } dflag = -two; goto L260; /* REGULAR-CASE.. */ L20: dp1 = *dd1 * *dx1; dq2 = dp2 * *dy1; dq1 = dp1 * *dx1; if (! (abs(dq1) > abs(dq2))) { goto L40; } dh21 = -(*dy1) / *dx1; dh12 = dp2 / dp1; du = one - dh12 * dh21; if (! (du <= zero)) { goto L30; } /* GO ZERO-H-D-AND-DX1.. */ goto L60; L30: dflag = zero; *dd1 /= du; *dd2 /= du; *dx1 *= du; /* GO SCALE-CHECK.. */ goto L100; L40: if (! (dq2 < zero)) { goto L50; } /* GO ZERO-H-D-AND-DX1.. */ goto L60; L50: dflag = one; dh11 = dp1 / dp2; dh22 = *dx1 / *dy1; du = one + dh11 * dh22; dtemp = *dd2 / du; *dd2 = *dd1 / du; *dd1 = dtemp; *dx1 = *dy1 * du; /* GO SCALE-CHECK */ goto L100; /* PROCEDURE..ZERO-H-D-AND-DX1.. */ L60: dflag = -one; dh11 = zero; dh12 = zero; dh21 = zero; dh22 = zero; *dd1 = zero; *dd2 = zero; *dx1 = zero; /* RETURN.. */ goto L220; /* PROCEDURE..FIX-H.. */ L70: if (! (dflag >= zero)) { goto L90; } if (! (dflag == zero)) { goto L80; } dh11 = one; dh22 = one; dflag = -one; goto L90; L80: dh21 = -one; dh12 = one; dflag = -one; L90: switch (igo) { case 0: goto L120; case 1: goto L150; case 2: goto L180; case 3: goto L210; } /* PROCEDURE..SCALE-CHECK */ L100: L110: if (! (*dd1 <= rgamsq)) { goto L130; } if (*dd1 == zero) { goto L160; } igo = 0; igo_fmt = fmt_120; /* FIX-H.. */ goto L70; L120: /* Computing 2nd power */ d__1 = gam; *dd1 *= d__1 * d__1; *dx1 /= gam; dh11 /= gam; dh12 /= gam; goto L110; L130: L140: if (! (*dd1 >= gamsq)) { goto L160; } igo = 1; igo_fmt = fmt_150; /* FIX-H.. */ goto L70; L150: /* Computing 2nd power */ d__1 = gam; *dd1 /= d__1 * d__1; *dx1 *= gam; dh11 *= gam; dh12 *= gam; goto L140; L160: L170: if (! (abs(*dd2) <= rgamsq)) { goto L190; } if (*dd2 == zero) { goto L220; } igo = 2; igo_fmt = fmt_180; /* FIX-H.. */ goto L70; L180: /* Computing 2nd power */ d__1 = gam; *dd2 *= d__1 * d__1; dh21 /= gam; dh22 /= gam; goto L170; L190: L200: if (! (abs(*dd2) >= gamsq)) { goto L220; } igo = 3; igo_fmt = fmt_210; /* FIX-H.. */ goto L70; L210: /* Computing 2nd power */ d__1 = gam; *dd2 /= d__1 * d__1; dh21 *= gam; dh22 *= gam; goto L200; L220: if (dflag < 0.) { goto L250; } else if (dflag == 0) { goto L230; } else { goto L240; } L230: dparam[3] = dh21; dparam[4] = dh12; goto L260; L240: dparam[2] = dh11; dparam[5] = dh22; goto L260; L250: dparam[2] = dh11; dparam[3] = dh21; dparam[4] = dh12; dparam[5] = dh22; L260: dparam[1] = dflag; return 0; } /* _starpu_drotmg_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsbmv.c000066400000000000000000000235201413463044200212040ustar00rootroot00000000000000/* dsbmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsbmv_(char *uplo, integer *n, integer *k, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); integer kplus1; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBMV performs the matrix-vector operation */ /* y := alpha*A*x + beta*y, */ /* where alpha and beta are scalars, x and y are n element vectors and */ /* A is an n by n symmetric band matrix, with k super-diagonals. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the band matrix A is being supplied as */ /* follows: */ /* UPLO = 'U' or 'u' The upper triangular part of A is */ /* being supplied. */ /* UPLO = 'L' or 'l' The lower triangular part of A is */ /* being supplied. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry, K specifies the number of super-diagonals of the */ /* matrix A. K must satisfy 0 .le. K. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) */ /* by n part of the array A must contain the upper triangular */ /* band part of the symmetric matrix, supplied column by */ /* column, with the leading diagonal of the matrix in row */ /* ( k + 1 ) of the array, the first super-diagonal starting at */ /* position 2 in row k, and so on. The top left k by k triangle */ /* of the array A is not referenced. */ /* The following program segment will transfer the upper */ /* triangular part of a symmetric band matrix from conventional */ /* full matrix storage to band storage: */ /* DO 20, J = 1, N */ /* M = K + 1 - J */ /* DO 10, I = MAX( 1, J - K ), J */ /* A( M + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) */ /* by n part of the array A must contain the lower triangular */ /* band part of the symmetric matrix, supplied column by */ /* column, with the leading diagonal of the matrix in row 1 of */ /* the array, the first sub-diagonal starting at position 1 in */ /* row 2, and so on. The bottom right k by k triangle of the */ /* array A is not referenced. */ /* The following program segment will transfer the lower */ /* triangular part of a symmetric band matrix from conventional */ /* full matrix storage to band storage: */ /* DO 20, J = 1, N */ /* M = 1 - J */ /* DO 10, I = J, MIN( N, J + K ) */ /* A( M + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* ( k + 1 ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the */ /* vector y. On exit, Y is overwritten by the updated vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*k < 0) { info = 3; } else if (*lda < *k + 1) { info = 6; } else if (*incx == 0) { info = 8; } else if (*incy == 0) { info = 11; } if (info != 0) { _starpu_xerbla_("DSBMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } /* Start the operations. In this version the elements of the array A */ /* are accessed sequentially with one pass through A. */ /* First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; /* L20: */ } } } else { iy = ky; if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; /* L30: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } if (_starpu_lsame_(uplo, "U")) { /* Form y when upper triangle of A is stored. */ kplus1 = *k + 1; if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[j]; temp2 = 0.; l = kplus1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *k; i__4 = j - 1; for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { y[i__] += temp1 * a[l + i__ + j * a_dim1]; temp2 += a[l + i__ + j * a_dim1] * x[i__]; /* L50: */ } y[j] = y[j] + temp1 * a[kplus1 + j * a_dim1] + *alpha * temp2; /* L60: */ } } else { jx = kx; jy = ky; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[jx]; temp2 = 0.; ix = kx; iy = ky; l = kplus1 - j; /* Computing MAX */ i__4 = 1, i__2 = j - *k; i__3 = j - 1; for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { y[iy] += temp1 * a[l + i__ + j * a_dim1]; temp2 += a[l + i__ + j * a_dim1] * x[ix]; ix += *incx; iy += *incy; /* L70: */ } y[jy] = y[jy] + temp1 * a[kplus1 + j * a_dim1] + *alpha * temp2; jx += *incx; jy += *incy; if (j > *k) { kx += *incx; ky += *incy; } /* L80: */ } } } else { /* Form y when lower triangle of A is stored. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[j]; temp2 = 0.; y[j] += temp1 * a[j * a_dim1 + 1]; l = 1 - j; /* Computing MIN */ i__4 = *n, i__2 = j + *k; i__3 = min(i__4,i__2); for (i__ = j + 1; i__ <= i__3; ++i__) { y[i__] += temp1 * a[l + i__ + j * a_dim1]; temp2 += a[l + i__ + j * a_dim1] * x[i__]; /* L90: */ } y[j] += *alpha * temp2; /* L100: */ } } else { jx = kx; jy = ky; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[jx]; temp2 = 0.; y[jy] += temp1 * a[j * a_dim1 + 1]; l = 1 - j; ix = jx; iy = jy; /* Computing MIN */ i__4 = *n, i__2 = j + *k; i__3 = min(i__4,i__2); for (i__ = j + 1; i__ <= i__3; ++i__) { ix += *incx; iy += *incy; y[iy] += temp1 * a[l + i__ + j * a_dim1]; temp2 += a[l + i__ + j * a_dim1] * x[ix]; /* L110: */ } y[jy] += *alpha * temp2; jx += *incx; jy += *incy; /* L120: */ } } } return 0; /* End of DSBMV . */ } /* _starpu_dsbmv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dscal.c000066400000000000000000000041561413463044200211630ustar00rootroot00000000000000/* dscal.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, m, mp1, nincx; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* * */ /* scales a vector by a constant. */ /* uses unrolled loops for increment equal to one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 3/93 to return if incx .le. 0. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dx; /* Function Body */ if (*n <= 0 || *incx <= 0) { return 0; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ nincx = *n * *incx; i__1 = nincx; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { dx[i__] = *da * dx[i__]; /* L10: */ } return 0; /* code for increment equal to 1 */ /* clean-up loop */ L20: m = *n % 5; if (m == 0) { goto L40; } i__2 = m; for (i__ = 1; i__ <= i__2; ++i__) { dx[i__] = *da * dx[i__]; /* L30: */ } if (*n < 5) { return 0; } L40: mp1 = m + 1; i__2 = *n; for (i__ = mp1; i__ <= i__2; i__ += 5) { dx[i__] = *da * dx[i__]; dx[i__ + 1] = *da * dx[i__ + 1]; dx[i__ + 2] = *da * dx[i__ + 2]; dx[i__ + 3] = *da * dx[i__ + 3]; dx[i__ + 4] = *da * dx[i__ + 4]; /* L50: */ } return 0; } /* _starpu_dscal_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsdot.c000066400000000000000000000071511413463044200212100ustar00rootroot00000000000000/* dsdot.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dsdot_(integer *n, real *sx, integer *incx, real *sy, integer * incy) { /* System generated locals */ integer i__1, i__2; doublereal ret_val; /* Local variables */ integer i__, ns, kx, ky; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* AUTHORS */ /* ======= */ /* Lawson, C. L., (JPL), Hanson, R. J., (SNLA), */ /* Kincaid, D. R., (U. of Texas), Krogh, F. T., (JPL) */ /* Purpose */ /* ======= */ /* Compute the inner product of two vectors with extended */ /* precision accumulation and result. */ /* Returns D.P. dot product accumulated in D.P., for S.P. SX and SY */ /* DSDOT = sum for I = 0 to N-1 of SX(LX+I*INCX) * SY(LY+I*INCY), */ /* where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is */ /* defined in a similar way using INCY. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* number of elements in input vector(s) */ /* SX (input) REAL array, dimension(N) */ /* single precision vector with N elements */ /* INCX (input) INTEGER */ /* storage spacing between elements of SX */ /* SY (input) REAL array, dimension(N) */ /* single precision vector with N elements */ /* INCY (input) INTEGER */ /* storage spacing between elements of SY */ /* DSDOT (output) DOUBLE PRECISION */ /* DSDOT double precision dot product (zero if N.LE.0) */ /* REFERENCES */ /* ========== */ /* C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T. */ /* Krogh, Basic linear algebra subprograms for Fortran */ /* usage, Algorithm No. 539, Transactions on Mathematical */ /* Software 5, 3 (September 1979), pp. 308-323. */ /* REVISION HISTORY (YYMMDD) */ /* ========================== */ /* 791001 DATE WRITTEN */ /* 890831 Modified array declarations. (WRB) */ /* 890831 REVISION DATE from Version 3.2 */ /* 891214 Prologue converted to Version 4.0 format. (BAB) */ /* 920310 Corrected definition of LX in DESCRIPTION. (WRB) */ /* 920501 Reformatted the REFERENCES section. (WRB) */ /* 070118 Reformat to LAPACK style (JL) */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --sy; --sx; /* Function Body */ ret_val = 0.; if (*n <= 0) { return ret_val; } if (*incx == *incy && *incx > 0) { goto L20; } /* Code for unequal or nonpositive increments. */ kx = 1; ky = 1; if (*incx < 0) { kx = (1 - *n) * *incx + 1; } if (*incy < 0) { ky = (1 - *n) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ret_val += (doublereal) sx[kx] * (doublereal) sy[ky]; kx += *incx; ky += *incy; /* L10: */ } return ret_val; /* Code for equal, positive, non-unit increments. */ L20: ns = *n * *incx; i__1 = ns; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { ret_val += (doublereal) sx[i__] * (doublereal) sy[i__]; /* L30: */ } return ret_val; } /* _starpu_dsdot_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dspmv.c000066400000000000000000000173411413463044200212260ustar00rootroot00000000000000/* dspmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dspmv_(char *uplo, integer *n, doublereal *alpha, doublereal *ap, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j, k, kk, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPMV performs the matrix-vector operation */ /* y := alpha*A*x + beta*y, */ /* where alpha and beta are scalars, x and y are n element vectors and */ /* A is an n by n symmetric matrix, supplied in packed form. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the matrix A is supplied in the packed */ /* array AP as follows: */ /* UPLO = 'U' or 'u' The upper triangular part of A is */ /* supplied in AP. */ /* UPLO = 'L' or 'l' The lower triangular part of A is */ /* supplied in AP. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* AP - DOUBLE PRECISION array of DIMENSION at least */ /* ( ( n*( n + 1 ) )/2 ). */ /* Before entry with UPLO = 'U' or 'u', the array AP must */ /* contain the upper triangular part of the symmetric matrix */ /* packed sequentially, column by column, so that AP( 1 ) */ /* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */ /* and a( 2, 2 ) respectively, and so on. */ /* Before entry with UPLO = 'L' or 'l', the array AP must */ /* contain the lower triangular part of the symmetric matrix */ /* packed sequentially, column by column, so that AP( 1 ) */ /* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */ /* and a( 3, 1 ) respectively, and so on. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the n */ /* element vector y. On exit, Y is overwritten by the updated */ /* vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --y; --x; --ap; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 6; } else if (*incy == 0) { info = 9; } if (info != 0) { _starpu_xerbla_("DSPMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } /* Start the operations. In this version the elements of the array AP */ /* are accessed sequentially with one pass through AP. */ /* First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; /* L20: */ } } } else { iy = ky; if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; /* L30: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } kk = 1; if (_starpu_lsame_(uplo, "U")) { /* Form y when AP contains the upper triangle. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[j]; temp2 = 0.; k = kk; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { y[i__] += temp1 * ap[k]; temp2 += ap[k] * x[i__]; ++k; /* L50: */ } y[j] = y[j] + temp1 * ap[kk + j - 1] + *alpha * temp2; kk += j; /* L60: */ } } else { jx = kx; jy = ky; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[jx]; temp2 = 0.; ix = kx; iy = ky; i__2 = kk + j - 2; for (k = kk; k <= i__2; ++k) { y[iy] += temp1 * ap[k]; temp2 += ap[k] * x[ix]; ix += *incx; iy += *incy; /* L70: */ } y[jy] = y[jy] + temp1 * ap[kk + j - 1] + *alpha * temp2; jx += *incx; jy += *incy; kk += j; /* L80: */ } } } else { /* Form y when AP contains the lower triangle. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[j]; temp2 = 0.; y[j] += temp1 * ap[kk]; k = kk + 1; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { y[i__] += temp1 * ap[k]; temp2 += ap[k] * x[i__]; ++k; /* L90: */ } y[j] += *alpha * temp2; kk += *n - j + 1; /* L100: */ } } else { jx = kx; jy = ky; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[jx]; temp2 = 0.; y[jy] += temp1 * ap[kk]; ix = jx; iy = jy; i__2 = kk + *n - j; for (k = kk + 1; k <= i__2; ++k) { ix += *incx; iy += *incy; y[iy] += temp1 * ap[k]; temp2 += ap[k] * x[ix]; /* L110: */ } y[jy] += *alpha * temp2; jx += *incx; jy += *incy; kk += *n - j + 1; /* L120: */ } } } return 0; /* End of DSPMV . */ } /* _starpu_dspmv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dspr.c000066400000000000000000000140741413463044200210450ustar00rootroot00000000000000/* dspr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dspr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *ap) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPR performs the symmetric rank 1 operation */ /* A := alpha*x*x' + A, */ /* where alpha is a real scalar, x is an n element vector and A is an */ /* n by n symmetric matrix, supplied in packed form. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the matrix A is supplied in the packed */ /* array AP as follows: */ /* UPLO = 'U' or 'u' The upper triangular part of A is */ /* supplied in AP. */ /* UPLO = 'L' or 'l' The lower triangular part of A is */ /* supplied in AP. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* AP - DOUBLE PRECISION array of DIMENSION at least */ /* ( ( n*( n + 1 ) )/2 ). */ /* Before entry with UPLO = 'U' or 'u', the array AP must */ /* contain the upper triangular part of the symmetric matrix */ /* packed sequentially, column by column, so that AP( 1 ) */ /* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */ /* and a( 2, 2 ) respectively, and so on. On exit, the array */ /* AP is overwritten by the upper triangular part of the */ /* updated matrix. */ /* Before entry with UPLO = 'L' or 'l', the array AP must */ /* contain the lower triangular part of the symmetric matrix */ /* packed sequentially, column by column, so that AP( 1 ) */ /* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */ /* and a( 3, 1 ) respectively, and so on. On exit, the array */ /* AP is overwritten by the lower triangular part of the */ /* updated matrix. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } if (info != 0) { _starpu_xerbla_("DSPR ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { return 0; } /* Set the start point in X if the increment is not unity. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of the array AP */ /* are accessed sequentially with one pass through AP. */ kk = 1; if (_starpu_lsame_(uplo, "U")) { /* Form A when upper triangle is stored in AP. */ if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = *alpha * x[j]; k = kk; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ap[k] += x[i__] * temp; ++k; /* L10: */ } } kk += j; /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; ix = kx; i__2 = kk + j - 1; for (k = kk; k <= i__2; ++k) { ap[k] += x[ix] * temp; ix += *incx; /* L30: */ } } jx += *incx; kk += j; /* L40: */ } } } else { /* Form A when lower triangle is stored in AP. */ if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = *alpha * x[j]; k = kk; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { ap[k] += x[i__] * temp; ++k; /* L50: */ } } kk = kk + *n - j + 1; /* L60: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; ix = jx; i__2 = kk + *n - j; for (k = kk; k <= i__2; ++k) { ap[k] += x[ix] * temp; ix += *incx; /* L70: */ } } jx += *incx; kk = kk + *n - j + 1; /* L80: */ } } } return 0; /* End of DSPR . */ } /* _starpu_dspr_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dspr2.c000066400000000000000000000161421413463044200211250ustar00rootroot00000000000000/* dspr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dspr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *ap) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j, k, kk, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPR2 performs the symmetric rank 2 operation */ /* A := alpha*x*y' + alpha*y*x' + A, */ /* where alpha is a scalar, x and y are n element vectors and A is an */ /* n by n symmetric matrix, supplied in packed form. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the matrix A is supplied in the packed */ /* array AP as follows: */ /* UPLO = 'U' or 'u' The upper triangular part of A is */ /* supplied in AP. */ /* UPLO = 'L' or 'l' The lower triangular part of A is */ /* supplied in AP. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the n */ /* element vector y. */ /* Unchanged on exit. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* AP - DOUBLE PRECISION array of DIMENSION at least */ /* ( ( n*( n + 1 ) )/2 ). */ /* Before entry with UPLO = 'U' or 'u', the array AP must */ /* contain the upper triangular part of the symmetric matrix */ /* packed sequentially, column by column, so that AP( 1 ) */ /* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */ /* and a( 2, 2 ) respectively, and so on. On exit, the array */ /* AP is overwritten by the upper triangular part of the */ /* updated matrix. */ /* Before entry with UPLO = 'L' or 'l', the array AP must */ /* contain the lower triangular part of the symmetric matrix */ /* packed sequentially, column by column, so that AP( 1 ) */ /* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */ /* and a( 3, 1 ) respectively, and so on. On exit, the array */ /* AP is overwritten by the lower triangular part of the */ /* updated matrix. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --y; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*incy == 0) { info = 7; } if (info != 0) { _starpu_xerbla_("DSPR2 ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { return 0; } /* Set up the start points in X and Y if the increments are not both */ /* unity. */ if (*incx != 1 || *incy != 1) { if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } jx = kx; jy = ky; } /* Start the operations. In this version the elements of the array AP */ /* are accessed sequentially with one pass through AP. */ kk = 1; if (_starpu_lsame_(uplo, "U")) { /* Form A when upper triangle is stored in AP. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0. || y[j] != 0.) { temp1 = *alpha * y[j]; temp2 = *alpha * x[j]; k = kk; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ap[k] = ap[k] + x[i__] * temp1 + y[i__] * temp2; ++k; /* L10: */ } } kk += j; /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0. || y[jy] != 0.) { temp1 = *alpha * y[jy]; temp2 = *alpha * x[jx]; ix = kx; iy = ky; i__2 = kk + j - 1; for (k = kk; k <= i__2; ++k) { ap[k] = ap[k] + x[ix] * temp1 + y[iy] * temp2; ix += *incx; iy += *incy; /* L30: */ } } jx += *incx; jy += *incy; kk += j; /* L40: */ } } } else { /* Form A when lower triangle is stored in AP. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0. || y[j] != 0.) { temp1 = *alpha * y[j]; temp2 = *alpha * x[j]; k = kk; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { ap[k] = ap[k] + x[i__] * temp1 + y[i__] * temp2; ++k; /* L50: */ } } kk = kk + *n - j + 1; /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0. || y[jy] != 0.) { temp1 = *alpha * y[jy]; temp2 = *alpha * x[jx]; ix = jx; iy = jy; i__2 = kk + *n - j; for (k = kk; k <= i__2; ++k) { ap[k] = ap[k] + x[ix] * temp1 + y[iy] * temp2; ix += *incx; iy += *incy; /* L70: */ } } jx += *incx; jy += *incy; kk = kk + *n - j + 1; /* L80: */ } } } return 0; /* End of DSPR2 . */ } /* _starpu_dspr2_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dswap.c000066400000000000000000000045001413463044200212040ustar00rootroot00000000000000/* dswap.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dswap_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, m, ix, iy, mp1; doublereal dtemp; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* interchanges two vectors. */ /* uses unrolled loops for increments equal one. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; } /* code for unequal increments or equal increments not equal */ /* to 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = dx[ix]; dx[ix] = dy[iy]; dy[iy] = dtemp; ix += *incx; iy += *incy; /* L10: */ } return 0; /* code for both increments equal to 1 */ /* clean-up loop */ L20: m = *n % 3; if (m == 0) { goto L40; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = dx[i__]; dx[i__] = dy[i__]; dy[i__] = dtemp; /* L30: */ } if (*n < 3) { return 0; } L40: mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 3) { dtemp = dx[i__]; dx[i__] = dy[i__]; dy[i__] = dtemp; dtemp = dx[i__ + 1]; dx[i__ + 1] = dy[i__ + 1]; dy[i__ + 1] = dtemp; dtemp = dx[i__ + 2]; dx[i__ + 2] = dy[i__ + 2]; dy[i__ + 2] = dtemp; /* L50: */ } return 0; } /* _starpu_dswap_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsymm.c000066400000000000000000000247611413463044200212320ustar00rootroot00000000000000/* dsymm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsymm_(char *side, char *uplo, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, k, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYMM performs one of the matrix-matrix operations */ /* C := alpha*A*B + beta*C, */ /* or */ /* C := alpha*B*A + beta*C, */ /* where alpha and beta are scalars, A is a symmetric matrix and B and */ /* C are m by n matrices. */ /* Arguments */ /* ========== */ /* SIDE - CHARACTER*1. */ /* On entry, SIDE specifies whether the symmetric matrix A */ /* appears on the left or right in the operation as follows: */ /* SIDE = 'L' or 'l' C := alpha*A*B + beta*C, */ /* SIDE = 'R' or 'r' C := alpha*B*A + beta*C, */ /* Unchanged on exit. */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the symmetric matrix A is to be */ /* referenced as follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of the */ /* symmetric matrix is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of the */ /* symmetric matrix is to be referenced. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of the matrix C. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix C. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is */ /* m when SIDE = 'L' or 'l' and is n otherwise. */ /* Before entry with SIDE = 'L' or 'l', the m by m part of */ /* the array A must contain the symmetric matrix, such that */ /* when UPLO = 'U' or 'u', the leading m by m upper triangular */ /* part of the array A must contain the upper triangular part */ /* of the symmetric matrix and the strictly lower triangular */ /* part of A is not referenced, and when UPLO = 'L' or 'l', */ /* the leading m by m lower triangular part of the array A */ /* must contain the lower triangular part of the symmetric */ /* matrix and the strictly upper triangular part of A is not */ /* referenced. */ /* Before entry with SIDE = 'R' or 'r', the n by n part of */ /* the array A must contain the symmetric matrix, such that */ /* when UPLO = 'U' or 'u', the leading n by n upper triangular */ /* part of the array A must contain the upper triangular part */ /* of the symmetric matrix and the strictly lower triangular */ /* part of A is not referenced, and when UPLO = 'L' or 'l', */ /* the leading n by n lower triangular part of the array A */ /* must contain the lower triangular part of the symmetric */ /* matrix and the strictly upper triangular part of A is not */ /* referenced. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When SIDE = 'L' or 'l' then */ /* LDA must be at least max( 1, m ), otherwise LDA must be at */ /* least max( 1, n ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */ /* Before entry, the leading m by n part of the array B must */ /* contain the matrix B. */ /* Unchanged on exit. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. LDB must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then C need not be set on input. */ /* Unchanged on exit. */ /* C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). */ /* Before entry, the leading m by n part of the array C must */ /* contain the matrix C, except when beta is zero, in which */ /* case C need not be set on entry. */ /* On exit, the array C is overwritten by the m by n updated */ /* matrix. */ /* LDC - INTEGER. */ /* On entry, LDC specifies the first dimension of C as declared */ /* in the calling (sub) program. LDC must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Set NROWA as the number of rows of A. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ if (_starpu_lsame_(side, "L")) { nrowa = *m; } else { nrowa = *n; } upper = _starpu_lsame_(uplo, "U"); /* Test the input parameters. */ info = 0; if (! _starpu_lsame_(side, "L") && ! _starpu_lsame_(side, "R")) { info = 1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 2; } else if (*m < 0) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,nrowa)) { info = 7; } else if (*ldb < max(1,*m)) { info = 9; } else if (*ldc < max(1,*m)) { info = 12; } if (info != 0) { _starpu_xerbla_("DSYMM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ } /* L40: */ } } return 0; } /* Start the operations. */ if (_starpu_lsame_(side, "L")) { /* Form C := alpha*A*B + beta*C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp1 = *alpha * b[i__ + j * b_dim1]; temp2 = 0.; i__3 = i__ - 1; for (k = 1; k <= i__3; ++k) { c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; /* L50: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } else { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } /* L60: */ } /* L70: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp1 = *alpha * b[i__ + j * b_dim1]; temp2 = 0.; i__2 = *m; for (k = i__ + 1; k <= i__2; ++k) { c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; /* L80: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } else { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } /* L90: */ } /* L100: */ } } } else { /* Form C := alpha*B*A + beta*C. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * a[j + j * a_dim1]; if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; /* L110: */ } } else { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + temp1 * b[i__ + j * b_dim1]; /* L120: */ } } i__2 = j - 1; for (k = 1; k <= i__2; ++k) { if (upper) { temp1 = *alpha * a[k + j * a_dim1]; } else { temp1 = *alpha * a[j + k * a_dim1]; } i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; /* L130: */ } /* L140: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { if (upper) { temp1 = *alpha * a[j + k * a_dim1]; } else { temp1 = *alpha * a[k + j * a_dim1]; } i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; /* L150: */ } /* L160: */ } /* L170: */ } } return 0; /* End of DSYMM . */ } /* _starpu_dsymm_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsymv.c000066400000000000000000000177441413463044200212460ustar00rootroot00000000000000/* dsymv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsymv_(char *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYMV performs the matrix-vector operation */ /* y := alpha*A*x + beta*y, */ /* where alpha and beta are scalars, x and y are n element vectors and */ /* A is an n by n symmetric matrix. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array A is to be referenced as */ /* follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of A */ /* is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of A */ /* is to be referenced. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array A must contain the upper */ /* triangular part of the symmetric matrix and the strictly */ /* lower triangular part of A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array A must contain the lower */ /* triangular part of the symmetric matrix and the strictly */ /* upper triangular part of A is not referenced. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the n */ /* element vector y. On exit, Y is overwritten by the updated */ /* vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*lda < max(1,*n)) { info = 5; } else if (*incx == 0) { info = 7; } else if (*incy == 0) { info = 10; } if (info != 0) { _starpu_xerbla_("DSYMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through the triangular part */ /* of A. */ /* First form y := beta*y. */ if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; /* L20: */ } } } else { iy = ky; if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; /* L30: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; /* L40: */ } } } } if (*alpha == 0.) { return 0; } if (_starpu_lsame_(uplo, "U")) { /* Form y when A is stored in upper triangle. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[j]; temp2 = 0.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { y[i__] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[i__]; /* L50: */ } y[j] = y[j] + temp1 * a[j + j * a_dim1] + *alpha * temp2; /* L60: */ } } else { jx = kx; jy = ky; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[jx]; temp2 = 0.; ix = kx; iy = ky; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { y[iy] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[ix]; ix += *incx; iy += *incy; /* L70: */ } y[jy] = y[jy] + temp1 * a[j + j * a_dim1] + *alpha * temp2; jx += *incx; jy += *incy; /* L80: */ } } } else { /* Form y when A is stored in lower triangle. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[j]; temp2 = 0.; y[j] += temp1 * a[j + j * a_dim1]; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { y[i__] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[i__]; /* L90: */ } y[j] += *alpha * temp2; /* L100: */ } } else { jx = kx; jy = ky; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * x[jx]; temp2 = 0.; y[jy] += temp1 * a[j + j * a_dim1]; ix = jx; iy = jy; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; iy += *incy; y[iy] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[ix]; /* L110: */ } y[jy] += *alpha * temp2; jx += *incx; jy += *incy; /* L120: */ } } } return 0; /* End of DSYMV . */ } /* _starpu_dsymv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsyr.c000066400000000000000000000144251413463044200210560ustar00rootroot00000000000000/* dsyr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsyr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYR performs the symmetric rank 1 operation */ /* A := alpha*x*x' + A, */ /* where alpha is a real scalar, x is an n element vector and A is an */ /* n by n symmetric matrix. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array A is to be referenced as */ /* follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of A */ /* is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of A */ /* is to be referenced. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array A must contain the upper */ /* triangular part of the symmetric matrix and the strictly */ /* lower triangular part of A is not referenced. On exit, the */ /* upper triangular part of the array A is overwritten by the */ /* upper triangular part of the updated matrix. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array A must contain the lower */ /* triangular part of the symmetric matrix and the strictly */ /* upper triangular part of A is not referenced. On exit, the */ /* lower triangular part of the array A is overwritten by the */ /* lower triangular part of the updated matrix. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --x; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*lda < max(1,*n)) { info = 7; } if (info != 0) { _starpu_xerbla_("DSYR ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { return 0; } /* Set the start point in X if the increment is not unity. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through the triangular part */ /* of A. */ if (_starpu_lsame_(uplo, "U")) { /* Form A when A is stored in upper triangle. */ if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = *alpha * x[j]; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[i__] * temp; /* L10: */ } } /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; ix = kx; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[ix] * temp; ix += *incx; /* L30: */ } } jx += *incx; /* L40: */ } } } else { /* Form A when A is stored in lower triangle. */ if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = *alpha * x[j]; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[i__] * temp; /* L50: */ } } /* L60: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = *alpha * x[jx]; ix = jx; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[ix] * temp; ix += *incx; /* L70: */ } } jx += *incx; /* L80: */ } } } return 0; /* End of DSYR . */ } /* _starpu_dsyr_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsyr2.c000066400000000000000000000166201413463044200211370ustar00rootroot00000000000000/* dsyr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsyr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYR2 performs the symmetric rank 2 operation */ /* A := alpha*x*y' + alpha*y*x' + A, */ /* where alpha is a scalar, x and y are n element vectors and A is an n */ /* by n symmetric matrix. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array A is to be referenced as */ /* follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of A */ /* is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of A */ /* is to be referenced. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ). */ /* Before entry, the incremented array Y must contain the n */ /* element vector y. */ /* Unchanged on exit. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array A must contain the upper */ /* triangular part of the symmetric matrix and the strictly */ /* lower triangular part of A is not referenced. On exit, the */ /* upper triangular part of the array A is overwritten by the */ /* upper triangular part of the updated matrix. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array A must contain the lower */ /* triangular part of the symmetric matrix and the strictly */ /* upper triangular part of A is not referenced. On exit, the */ /* lower triangular part of the array A is overwritten by the */ /* lower triangular part of the updated matrix. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (*n < 0) { info = 2; } else if (*incx == 0) { info = 5; } else if (*incy == 0) { info = 7; } else if (*lda < max(1,*n)) { info = 9; } if (info != 0) { _starpu_xerbla_("DSYR2 ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { return 0; } /* Set up the start points in X and Y if the increments are not both */ /* unity. */ if (*incx != 1 || *incy != 1) { if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } jx = kx; jy = ky; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through the triangular part */ /* of A. */ if (_starpu_lsame_(uplo, "U")) { /* Form A when A is stored in the upper triangle. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0. || y[j] != 0.) { temp1 = *alpha * y[j]; temp2 = *alpha * x[j]; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * temp1 + y[i__] * temp2; /* L10: */ } } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0. || y[jy] != 0.) { temp1 = *alpha * y[jy]; temp2 = *alpha * x[jx]; ix = kx; iy = ky; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * temp1 + y[iy] * temp2; ix += *incx; iy += *incy; /* L30: */ } } jx += *incx; jy += *incy; /* L40: */ } } } else { /* Form A when A is stored in the lower triangle. */ if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0. || y[j] != 0.) { temp1 = *alpha * y[j]; temp2 = *alpha * x[j]; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * temp1 + y[i__] * temp2; /* L50: */ } } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0. || y[jy] != 0.) { temp1 = *alpha * y[jy]; temp2 = *alpha * x[jx]; ix = jx; iy = jy; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * temp1 + y[iy] * temp2; ix += *incx; iy += *incy; /* L70: */ } } jx += *incx; jy += *incy; /* L80: */ } } } return 0; /* End of DSYR2 . */ } /* _starpu_dsyr2_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsyr2k.c000066400000000000000000000266371413463044200213230ustar00rootroot00000000000000/* dsyr2k.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsyr2k_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, info; doublereal temp1, temp2; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYR2K performs one of the symmetric rank 2k operations */ /* C := alpha*A*B' + alpha*B*A' + beta*C, */ /* or */ /* C := alpha*A'*B + alpha*B'*A + beta*C, */ /* where alpha and beta are scalars, C is an n by n symmetric matrix */ /* and A and B are n by k matrices in the first case and k by n */ /* matrices in the second case. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array C is to be referenced as */ /* follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of C */ /* is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of C */ /* is to be referenced. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' C := alpha*A*B' + alpha*B*A' + */ /* beta*C. */ /* TRANS = 'T' or 't' C := alpha*A'*B + alpha*B'*A + */ /* beta*C. */ /* TRANS = 'C' or 'c' C := alpha*A'*B + alpha*B'*A + */ /* beta*C. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix C. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry with TRANS = 'N' or 'n', K specifies the number */ /* of columns of the matrices A and B, and on entry with */ /* TRANS = 'T' or 't' or 'C' or 'c', K specifies the number */ /* of rows of the matrices A and B. K must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is */ /* k when TRANS = 'N' or 'n', and is n otherwise. */ /* Before entry with TRANS = 'N' or 'n', the leading n by k */ /* part of the array A must contain the matrix A, otherwise */ /* the leading k by n part of the array A must contain the */ /* matrix A. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When TRANS = 'N' or 'n' */ /* then LDA must be at least max( 1, n ), otherwise LDA must */ /* be at least max( 1, k ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is */ /* k when TRANS = 'N' or 'n', and is n otherwise. */ /* Before entry with TRANS = 'N' or 'n', the leading n by k */ /* part of the array B must contain the matrix B, otherwise */ /* the leading k by n part of the array B must contain the */ /* matrix B. */ /* Unchanged on exit. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. When TRANS = 'N' or 'n' */ /* then LDB must be at least max( 1, n ), otherwise LDB must */ /* be at least max( 1, k ). */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. */ /* Unchanged on exit. */ /* C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array C must contain the upper */ /* triangular part of the symmetric matrix and the strictly */ /* lower triangular part of C is not referenced. On exit, the */ /* upper triangular part of the array C is overwritten by the */ /* upper triangular part of the updated matrix. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array C must contain the lower */ /* triangular part of the symmetric matrix and the strictly */ /* upper triangular part of C is not referenced. On exit, the */ /* lower triangular part of the array C is overwritten by the */ /* lower triangular part of the updated matrix. */ /* LDC - INTEGER. */ /* On entry, LDC specifies the first dimension of C as declared */ /* in the calling (sub) program. LDC must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ if (_starpu_lsame_(trans, "N")) { nrowa = *n; } else { nrowa = *k; } upper = _starpu_lsame_(uplo, "U"); info = 0; if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; } else if (*lda < max(1,nrowa)) { info = 7; } else if (*ldb < max(1,nrowa)) { info = 9; } else if (*ldc < max(1,*n)) { info = 12; } if (info != 0) { _starpu_xerbla_("DSYR2K", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { if (upper) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ } /* L40: */ } } } else { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L70: */ } /* L80: */ } } } return 0; } /* Start the operations. */ if (_starpu_lsame_(trans, "N")) { /* Form C := alpha*A*B' + alpha*B*A' + C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L90: */ } } else if (*beta != 1.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L100: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { temp1 = *alpha * b[j + l * b_dim1]; temp2 = *alpha * a[j + l * a_dim1]; i__3 = j; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ i__ + l * a_dim1] * temp1 + b[i__ + l * b_dim1] * temp2; /* L110: */ } } /* L120: */ } /* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L140: */ } } else if (*beta != 1.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L150: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { temp1 = *alpha * b[j + l * b_dim1]; temp2 = *alpha * a[j + l * a_dim1]; i__3 = *n; for (i__ = j; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ i__ + l * a_dim1] * temp1 + b[i__ + l * b_dim1] * temp2; /* L160: */ } } /* L170: */ } /* L180: */ } } } else { /* Form C := alpha*A'*B + alpha*B'*A + C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { temp1 = 0.; temp2 = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; /* L190: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * temp2; } else { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + *alpha * temp1 + *alpha * temp2; } /* L200: */ } /* L210: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { temp1 = 0.; temp2 = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; /* L220: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * temp2; } else { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + *alpha * temp1 + *alpha * temp2; } /* L230: */ } /* L240: */ } } } return 0; /* End of DSYR2K. */ } /* _starpu_dsyr2k_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dsyrk.c000066400000000000000000000234241413463044200212300ustar00rootroot00000000000000/* dsyrk.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsyrk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c__, integer *ldc) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYRK performs one of the symmetric rank k operations */ /* C := alpha*A*A' + beta*C, */ /* or */ /* C := alpha*A'*A + beta*C, */ /* where alpha and beta are scalars, C is an n by n symmetric matrix */ /* and A is an n by k matrix in the first case and a k by n matrix */ /* in the second case. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array C is to be referenced as */ /* follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of C */ /* is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of C */ /* is to be referenced. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. */ /* TRANS = 'T' or 't' C := alpha*A'*A + beta*C. */ /* TRANS = 'C' or 'c' C := alpha*A'*A + beta*C. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix C. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry with TRANS = 'N' or 'n', K specifies the number */ /* of columns of the matrix A, and on entry with */ /* TRANS = 'T' or 't' or 'C' or 'c', K specifies the number */ /* of rows of the matrix A. K must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is */ /* k when TRANS = 'N' or 'n', and is n otherwise. */ /* Before entry with TRANS = 'N' or 'n', the leading n by k */ /* part of the array A must contain the matrix A, otherwise */ /* the leading k by n part of the array A must contain the */ /* matrix A. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When TRANS = 'N' or 'n' */ /* then LDA must be at least max( 1, n ), otherwise LDA must */ /* be at least max( 1, k ). */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. */ /* Unchanged on exit. */ /* C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array C must contain the upper */ /* triangular part of the symmetric matrix and the strictly */ /* lower triangular part of C is not referenced. On exit, the */ /* upper triangular part of the array C is overwritten by the */ /* upper triangular part of the updated matrix. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array C must contain the lower */ /* triangular part of the symmetric matrix and the strictly */ /* upper triangular part of C is not referenced. On exit, the */ /* lower triangular part of the array C is overwritten by the */ /* lower triangular part of the updated matrix. */ /* LDC - INTEGER. */ /* On entry, LDC specifies the first dimension of C as declared */ /* in the calling (sub) program. LDC must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ if (_starpu_lsame_(trans, "N")) { nrowa = *n; } else { nrowa = *k; } upper = _starpu_lsame_(uplo, "U"); info = 0; if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; } else if (*lda < max(1,nrowa)) { info = 7; } else if (*ldc < max(1,*n)) { info = 10; } if (info != 0) { _starpu_xerbla_("DSYRK ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { if (upper) { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ } /* L40: */ } } } else { if (*beta == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L70: */ } /* L80: */ } } } return 0; } /* Start the operations. */ if (_starpu_lsame_(trans, "N")) { /* Form C := alpha*A*A' + beta*C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L90: */ } } else if (*beta != 1.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L100: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (a[j + l * a_dim1] != 0.) { temp = *alpha * a[j + l * a_dim1]; i__3 = j; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L110: */ } } /* L120: */ } /* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; /* L140: */ } } else if (*beta != 1.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L150: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { if (a[j + l * a_dim1] != 0.) { temp = *alpha * a[j + l * a_dim1]; i__3 = *n; for (i__ = j; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L160: */ } } /* L170: */ } /* L180: */ } } } else { /* Form C := alpha*A'*A + beta*C. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { temp = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; /* L190: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ i__ + j * c_dim1]; } /* L200: */ } /* L210: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { temp = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; /* L220: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ i__ + j * c_dim1]; } /* L230: */ } /* L240: */ } } } return 0; /* End of DSYRK . */ } /* _starpu_dsyrk_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtbmv.c000066400000000000000000000261051413463044200212070ustar00rootroot00000000000000/* dtbmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); integer kplus1; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTBMV performs one of the matrix-vector operations */ /* x := A*x, or x := A'*x, */ /* where x is an n element vector and A is an n by n unit, or non-unit, */ /* upper or lower triangular band matrix, with ( k + 1 ) diagonals. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' x := A*x. */ /* TRANS = 'T' or 't' x := A'*x. */ /* TRANS = 'C' or 'c' x := A'*x. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry with UPLO = 'U' or 'u', K specifies the number of */ /* super-diagonals of the matrix A. */ /* On entry with UPLO = 'L' or 'l', K specifies the number of */ /* sub-diagonals of the matrix A. */ /* K must satisfy 0 .le. K. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) */ /* by n part of the array A must contain the upper triangular */ /* band part of the matrix of coefficients, supplied column by */ /* column, with the leading diagonal of the matrix in row */ /* ( k + 1 ) of the array, the first super-diagonal starting at */ /* position 2 in row k, and so on. The top left k by k triangle */ /* of the array A is not referenced. */ /* The following program segment will transfer an upper */ /* triangular band matrix from conventional full matrix storage */ /* to band storage: */ /* DO 20, J = 1, N */ /* M = K + 1 - J */ /* DO 10, I = MAX( 1, J - K ), J */ /* A( M + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) */ /* by n part of the array A must contain the lower triangular */ /* band part of the matrix of coefficients, supplied column by */ /* column, with the leading diagonal of the matrix in row 1 of */ /* the array, the first sub-diagonal starting at position 1 in */ /* row 2, and so on. The bottom right k by k triangle of the */ /* array A is not referenced. */ /* The following program segment will transfer a lower */ /* triangular band matrix from conventional full matrix storage */ /* to band storage: */ /* DO 20, J = 1, N */ /* M = 1 - J */ /* DO 10, I = J, MIN( N, J + K ) */ /* A( M + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Note that when DIAG = 'U' or 'u' the elements of the array A */ /* corresponding to the diagonal elements of the matrix are not */ /* referenced, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* ( k + 1 ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. On exit, X is overwritten with the */ /* tranformed vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*k < 0) { info = 5; } else if (*lda < *k + 1) { info = 7; } else if (*incx == 0) { info = 9; } if (info != 0) { _starpu_xerbla_("DTBMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (_starpu_lsame_(trans, "N")) { /* Form x := A*x. */ if (_starpu_lsame_(uplo, "U")) { kplus1 = *k + 1; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = x[j]; l = kplus1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *k; i__4 = j - 1; for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { x[i__] += temp * a[l + i__ + j * a_dim1]; /* L10: */ } if (nounit) { x[j] *= a[kplus1 + j * a_dim1]; } } /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; l = kplus1 - j; /* Computing MAX */ i__4 = 1, i__2 = j - *k; i__3 = j - 1; for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { x[ix] += temp * a[l + i__ + j * a_dim1]; ix += *incx; /* L30: */ } if (nounit) { x[jx] *= a[kplus1 + j * a_dim1]; } } jx += *incx; if (j > *k) { kx += *incx; } /* L40: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { temp = x[j]; l = 1 - j; /* Computing MIN */ i__1 = *n, i__3 = j + *k; i__4 = j + 1; for (i__ = min(i__1,i__3); i__ >= i__4; --i__) { x[i__] += temp * a[l + i__ + j * a_dim1]; /* L50: */ } if (nounit) { x[j] *= a[j * a_dim1 + 1]; } } /* L60: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; l = 1 - j; /* Computing MIN */ i__4 = *n, i__1 = j + *k; i__3 = j + 1; for (i__ = min(i__4,i__1); i__ >= i__3; --i__) { x[ix] += temp * a[l + i__ + j * a_dim1]; ix -= *incx; /* L70: */ } if (nounit) { x[jx] *= a[j * a_dim1 + 1]; } } jx -= *incx; if (*n - j >= *k) { kx -= *incx; } /* L80: */ } } } } else { /* Form x := A'*x. */ if (_starpu_lsame_(uplo, "U")) { kplus1 = *k + 1; if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; l = kplus1 - j; if (nounit) { temp *= a[kplus1 + j * a_dim1]; } /* Computing MAX */ i__4 = 1, i__1 = j - *k; i__3 = max(i__4,i__1); for (i__ = j - 1; i__ >= i__3; --i__) { temp += a[l + i__ + j * a_dim1] * x[i__]; /* L90: */ } x[j] = temp; /* L100: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { temp = x[jx]; kx -= *incx; ix = kx; l = kplus1 - j; if (nounit) { temp *= a[kplus1 + j * a_dim1]; } /* Computing MAX */ i__4 = 1, i__1 = j - *k; i__3 = max(i__4,i__1); for (i__ = j - 1; i__ >= i__3; --i__) { temp += a[l + i__ + j * a_dim1] * x[ix]; ix -= *incx; /* L110: */ } x[jx] = temp; jx -= *incx; /* L120: */ } } } else { if (*incx == 1) { i__3 = *n; for (j = 1; j <= i__3; ++j) { temp = x[j]; l = 1 - j; if (nounit) { temp *= a[j * a_dim1 + 1]; } /* Computing MIN */ i__1 = *n, i__2 = j + *k; i__4 = min(i__1,i__2); for (i__ = j + 1; i__ <= i__4; ++i__) { temp += a[l + i__ + j * a_dim1] * x[i__]; /* L130: */ } x[j] = temp; /* L140: */ } } else { jx = kx; i__3 = *n; for (j = 1; j <= i__3; ++j) { temp = x[jx]; kx += *incx; ix = kx; l = 1 - j; if (nounit) { temp *= a[j * a_dim1 + 1]; } /* Computing MIN */ i__1 = *n, i__2 = j + *k; i__4 = min(i__1,i__2); for (i__ = j + 1; i__ <= i__4; ++i__) { temp += a[l + i__ + j * a_dim1] * x[ix]; ix += *incx; /* L150: */ } x[jx] = temp; jx += *incx; /* L160: */ } } } } return 0; /* End of DTBMV . */ } /* _starpu_dtbmv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtbsv.c000066400000000000000000000263601413463044200212200ustar00rootroot00000000000000/* dtbsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); integer kplus1; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTBSV solves one of the systems of equations */ /* A*x = b, or A'*x = b, */ /* where b and x are n element vectors and A is an n by n unit, or */ /* non-unit, upper or lower triangular band matrix, with ( k + 1 ) */ /* diagonals. */ /* No test for singularity or near-singularity is included in this */ /* routine. Such tests must be performed before calling this routine. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the equations to be solved as */ /* follows: */ /* TRANS = 'N' or 'n' A*x = b. */ /* TRANS = 'T' or 't' A'*x = b. */ /* TRANS = 'C' or 'c' A'*x = b. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* K - INTEGER. */ /* On entry with UPLO = 'U' or 'u', K specifies the number of */ /* super-diagonals of the matrix A. */ /* On entry with UPLO = 'L' or 'l', K specifies the number of */ /* sub-diagonals of the matrix A. */ /* K must satisfy 0 .le. K. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) */ /* by n part of the array A must contain the upper triangular */ /* band part of the matrix of coefficients, supplied column by */ /* column, with the leading diagonal of the matrix in row */ /* ( k + 1 ) of the array, the first super-diagonal starting at */ /* position 2 in row k, and so on. The top left k by k triangle */ /* of the array A is not referenced. */ /* The following program segment will transfer an upper */ /* triangular band matrix from conventional full matrix storage */ /* to band storage: */ /* DO 20, J = 1, N */ /* M = K + 1 - J */ /* DO 10, I = MAX( 1, J - K ), J */ /* A( M + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) */ /* by n part of the array A must contain the lower triangular */ /* band part of the matrix of coefficients, supplied column by */ /* column, with the leading diagonal of the matrix in row 1 of */ /* the array, the first sub-diagonal starting at position 1 in */ /* row 2, and so on. The bottom right k by k triangle of the */ /* array A is not referenced. */ /* The following program segment will transfer a lower */ /* triangular band matrix from conventional full matrix storage */ /* to band storage: */ /* DO 20, J = 1, N */ /* M = 1 - J */ /* DO 10, I = J, MIN( N, J + K ) */ /* A( M + I, J ) = matrix( I, J ) */ /* 10 CONTINUE */ /* 20 CONTINUE */ /* Note that when DIAG = 'U' or 'u' the elements of the array A */ /* corresponding to the diagonal elements of the matrix are not */ /* referenced, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* ( k + 1 ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element right-hand side vector b. On exit, X is overwritten */ /* with the solution vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*k < 0) { info = 5; } else if (*lda < *k + 1) { info = 7; } else if (*incx == 0) { info = 9; } if (info != 0) { _starpu_xerbla_("DTBSV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are */ /* accessed by sequentially with one pass through A. */ if (_starpu_lsame_(trans, "N")) { /* Form x := inv( A )*x. */ if (_starpu_lsame_(uplo, "U")) { kplus1 = *k + 1; if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { l = kplus1 - j; if (nounit) { x[j] /= a[kplus1 + j * a_dim1]; } temp = x[j]; /* Computing MAX */ i__2 = 1, i__3 = j - *k; i__1 = max(i__2,i__3); for (i__ = j - 1; i__ >= i__1; --i__) { x[i__] -= temp * a[l + i__ + j * a_dim1]; /* L10: */ } } /* L20: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { kx -= *incx; if (x[jx] != 0.) { ix = kx; l = kplus1 - j; if (nounit) { x[jx] /= a[kplus1 + j * a_dim1]; } temp = x[jx]; /* Computing MAX */ i__2 = 1, i__3 = j - *k; i__1 = max(i__2,i__3); for (i__ = j - 1; i__ >= i__1; --i__) { x[ix] -= temp * a[l + i__ + j * a_dim1]; ix -= *incx; /* L30: */ } } jx -= *incx; /* L40: */ } } } else { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { l = 1 - j; if (nounit) { x[j] /= a[j * a_dim1 + 1]; } temp = x[j]; /* Computing MIN */ i__3 = *n, i__4 = j + *k; i__2 = min(i__3,i__4); for (i__ = j + 1; i__ <= i__2; ++i__) { x[i__] -= temp * a[l + i__ + j * a_dim1]; /* L50: */ } } /* L60: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { kx += *incx; if (x[jx] != 0.) { ix = kx; l = 1 - j; if (nounit) { x[jx] /= a[j * a_dim1 + 1]; } temp = x[jx]; /* Computing MIN */ i__3 = *n, i__4 = j + *k; i__2 = min(i__3,i__4); for (i__ = j + 1; i__ <= i__2; ++i__) { x[ix] -= temp * a[l + i__ + j * a_dim1]; ix += *incx; /* L70: */ } } jx += *incx; /* L80: */ } } } } else { /* Form x := inv( A')*x. */ if (_starpu_lsame_(uplo, "U")) { kplus1 = *k + 1; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; l = kplus1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *k; i__4 = j - 1; for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { temp -= a[l + i__ + j * a_dim1] * x[i__]; /* L90: */ } if (nounit) { temp /= a[kplus1 + j * a_dim1]; } x[j] = temp; /* L100: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = kx; l = kplus1 - j; /* Computing MAX */ i__4 = 1, i__2 = j - *k; i__3 = j - 1; for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { temp -= a[l + i__ + j * a_dim1] * x[ix]; ix += *incx; /* L110: */ } if (nounit) { temp /= a[kplus1 + j * a_dim1]; } x[jx] = temp; jx += *incx; if (j > *k) { kx += *incx; } /* L120: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; l = 1 - j; /* Computing MIN */ i__1 = *n, i__3 = j + *k; i__4 = j + 1; for (i__ = min(i__1,i__3); i__ >= i__4; --i__) { temp -= a[l + i__ + j * a_dim1] * x[i__]; /* L130: */ } if (nounit) { temp /= a[j * a_dim1 + 1]; } x[j] = temp; /* L140: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = kx; l = 1 - j; /* Computing MIN */ i__4 = *n, i__1 = j + *k; i__3 = j + 1; for (i__ = min(i__4,i__1); i__ >= i__3; --i__) { temp -= a[l + i__ + j * a_dim1] * x[ix]; ix -= *incx; /* L150: */ } if (nounit) { temp /= a[j * a_dim1 + 1]; } x[jx] = temp; jx -= *incx; if (*n - j >= *k) { kx -= *incx; } /* L160: */ } } } } return 0; /* End of DTBSV . */ } /* _starpu_dtbsv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtpmv.c000066400000000000000000000205231413463044200212230ustar00rootroot00000000000000/* dtpmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtpmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *ap, doublereal *x, integer *incx) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPMV performs one of the matrix-vector operations */ /* x := A*x, or x := A'*x, */ /* where x is an n element vector and A is an n by n unit, or non-unit, */ /* upper or lower triangular matrix, supplied in packed form. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' x := A*x. */ /* TRANS = 'T' or 't' x := A'*x. */ /* TRANS = 'C' or 'c' x := A'*x. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* AP - DOUBLE PRECISION array of DIMENSION at least */ /* ( ( n*( n + 1 ) )/2 ). */ /* Before entry with UPLO = 'U' or 'u', the array AP must */ /* contain the upper triangular matrix packed sequentially, */ /* column by column, so that AP( 1 ) contains a( 1, 1 ), */ /* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) */ /* respectively, and so on. */ /* Before entry with UPLO = 'L' or 'l', the array AP must */ /* contain the lower triangular matrix packed sequentially, */ /* column by column, so that AP( 1 ) contains a( 1, 1 ), */ /* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) */ /* respectively, and so on. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced, but are assumed to be unity. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. On exit, X is overwritten with the */ /* tranformed vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --x; --ap; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*incx == 0) { info = 7; } if (info != 0) { _starpu_xerbla_("DTPMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of AP are */ /* accessed sequentially with one pass through AP. */ if (_starpu_lsame_(trans, "N")) { /* Form x:= A*x. */ if (_starpu_lsame_(uplo, "U")) { kk = 1; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = x[j]; k = kk; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[i__] += temp * ap[k]; ++k; /* L10: */ } if (nounit) { x[j] *= ap[kk + j - 1]; } } kk += j; /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__2 = kk + j - 2; for (k = kk; k <= i__2; ++k) { x[ix] += temp * ap[k]; ix += *incx; /* L30: */ } if (nounit) { x[jx] *= ap[kk + j - 1]; } } jx += *incx; kk += j; /* L40: */ } } } else { kk = *n * (*n + 1) / 2; if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { temp = x[j]; k = kk; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[i__] += temp * ap[k]; --k; /* L50: */ } if (nounit) { x[j] *= ap[kk - *n + j]; } } kk -= *n - j + 1; /* L60: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__1 = kk - (*n - (j + 1)); for (k = kk; k >= i__1; --k) { x[ix] += temp * ap[k]; ix -= *incx; /* L70: */ } if (nounit) { x[jx] *= ap[kk - *n + j]; } } jx -= *incx; kk -= *n - j + 1; /* L80: */ } } } } else { /* Form x := A'*x. */ if (_starpu_lsame_(uplo, "U")) { kk = *n * (*n + 1) / 2; if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; if (nounit) { temp *= ap[kk]; } k = kk - 1; for (i__ = j - 1; i__ >= 1; --i__) { temp += ap[k] * x[i__]; --k; /* L90: */ } x[j] = temp; kk -= j; /* L100: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = jx; if (nounit) { temp *= ap[kk]; } i__1 = kk - j + 1; for (k = kk - 1; k >= i__1; --k) { ix -= *incx; temp += ap[k] * x[ix]; /* L110: */ } x[jx] = temp; jx -= *incx; kk -= j; /* L120: */ } } } else { kk = 1; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; if (nounit) { temp *= ap[kk]; } k = kk + 1; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { temp += ap[k] * x[i__]; ++k; /* L130: */ } x[j] = temp; kk += *n - j + 1; /* L140: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = jx; if (nounit) { temp *= ap[kk]; } i__2 = kk + *n - j; for (k = kk + 1; k <= i__2; ++k) { ix += *incx; temp += ap[k] * x[ix]; /* L150: */ } x[jx] = temp; jx += *incx; kk += *n - j + 1; /* L160: */ } } } } return 0; /* End of DTPMV . */ } /* _starpu_dtpmv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtpsv.c000066400000000000000000000207731413463044200212400ustar00rootroot00000000000000/* dtpsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtpsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *ap, doublereal *x, integer *incx) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPSV solves one of the systems of equations */ /* A*x = b, or A'*x = b, */ /* where b and x are n element vectors and A is an n by n unit, or */ /* non-unit, upper or lower triangular matrix, supplied in packed form. */ /* No test for singularity or near-singularity is included in this */ /* routine. Such tests must be performed before calling this routine. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the equations to be solved as */ /* follows: */ /* TRANS = 'N' or 'n' A*x = b. */ /* TRANS = 'T' or 't' A'*x = b. */ /* TRANS = 'C' or 'c' A'*x = b. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* AP - DOUBLE PRECISION array of DIMENSION at least */ /* ( ( n*( n + 1 ) )/2 ). */ /* Before entry with UPLO = 'U' or 'u', the array AP must */ /* contain the upper triangular matrix packed sequentially, */ /* column by column, so that AP( 1 ) contains a( 1, 1 ), */ /* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) */ /* respectively, and so on. */ /* Before entry with UPLO = 'L' or 'l', the array AP must */ /* contain the lower triangular matrix packed sequentially, */ /* column by column, so that AP( 1 ) contains a( 1, 1 ), */ /* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) */ /* respectively, and so on. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced, but are assumed to be unity. */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element right-hand side vector b. On exit, X is overwritten */ /* with the solution vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ --x; --ap; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*incx == 0) { info = 7; } if (info != 0) { _starpu_xerbla_("DTPSV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of AP are */ /* accessed sequentially with one pass through AP. */ if (_starpu_lsame_(trans, "N")) { /* Form x := inv( A )*x. */ if (_starpu_lsame_(uplo, "U")) { kk = *n * (*n + 1) / 2; if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { if (nounit) { x[j] /= ap[kk]; } temp = x[j]; k = kk - 1; for (i__ = j - 1; i__ >= 1; --i__) { x[i__] -= temp * ap[k]; --k; /* L10: */ } } kk -= j; /* L20: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { if (nounit) { x[jx] /= ap[kk]; } temp = x[jx]; ix = jx; i__1 = kk - j + 1; for (k = kk - 1; k >= i__1; --k) { ix -= *incx; x[ix] -= temp * ap[k]; /* L30: */ } } jx -= *incx; kk -= j; /* L40: */ } } } else { kk = 1; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { if (nounit) { x[j] /= ap[kk]; } temp = x[j]; k = kk + 1; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { x[i__] -= temp * ap[k]; ++k; /* L50: */ } } kk += *n - j + 1; /* L60: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { if (nounit) { x[jx] /= ap[kk]; } temp = x[jx]; ix = jx; i__2 = kk + *n - j; for (k = kk + 1; k <= i__2; ++k) { ix += *incx; x[ix] -= temp * ap[k]; /* L70: */ } } jx += *incx; kk += *n - j + 1; /* L80: */ } } } } else { /* Form x := inv( A' )*x. */ if (_starpu_lsame_(uplo, "U")) { kk = 1; if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; k = kk; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { temp -= ap[k] * x[i__]; ++k; /* L90: */ } if (nounit) { temp /= ap[kk + j - 1]; } x[j] = temp; kk += j; /* L100: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = kx; i__2 = kk + j - 2; for (k = kk; k <= i__2; ++k) { temp -= ap[k] * x[ix]; ix += *incx; /* L110: */ } if (nounit) { temp /= ap[kk + j - 1]; } x[jx] = temp; jx += *incx; kk += j; /* L120: */ } } } else { kk = *n * (*n + 1) / 2; if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; k = kk; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { temp -= ap[k] * x[i__]; --k; /* L130: */ } if (nounit) { temp /= ap[kk - *n + j]; } x[j] = temp; kk -= *n - j + 1; /* L140: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = kx; i__1 = kk - (*n - (j + 1)); for (k = kk; k >= i__1; --k) { temp -= ap[k] * x[ix]; ix -= *incx; /* L150: */ } if (nounit) { temp /= ap[kk - *n + j]; } x[jx] = temp; jx -= *incx; kk -= *n - j + 1; /* L160: */ } } } } return 0; /* End of DTPSV . */ } /* _starpu_dtpsv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtrmm.c000066400000000000000000000265551413463044200212270ustar00rootroot00000000000000/* dtrmm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, k, info; doublereal temp; logical lside; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRMM performs one of the matrix-matrix operations */ /* B := alpha*op( A )*B, or B := alpha*B*op( A ), */ /* where alpha is a scalar, B is an m by n matrix, A is a unit, or */ /* non-unit, upper or lower triangular matrix and op( A ) is one of */ /* op( A ) = A or op( A ) = A'. */ /* Arguments */ /* ========== */ /* SIDE - CHARACTER*1. */ /* On entry, SIDE specifies whether op( A ) multiplies B from */ /* the left or right as follows: */ /* SIDE = 'L' or 'l' B := alpha*op( A )*B. */ /* SIDE = 'R' or 'r' B := alpha*B*op( A ). */ /* Unchanged on exit. */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix A is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANSA - CHARACTER*1. */ /* On entry, TRANSA specifies the form of op( A ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSA = 'N' or 'n' op( A ) = A. */ /* TRANSA = 'T' or 't' op( A ) = A'. */ /* TRANSA = 'C' or 'c' op( A ) = A'. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit triangular */ /* as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of B. M must be at */ /* least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of B. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. When alpha is */ /* zero then A is not referenced and B need not be set before */ /* entry. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m */ /* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ /* Before entry with UPLO = 'U' or 'u', the leading k by k */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading k by k */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When SIDE = 'L' or 'l' then */ /* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ /* then LDA must be at least max( 1, n ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */ /* Before entry, the leading m by n part of the array B must */ /* contain the matrix B, and on exit is overwritten by the */ /* transformed matrix. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. LDB must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ lside = _starpu_lsame_(side, "L"); if (lside) { nrowa = *m; } else { nrowa = *n; } nounit = _starpu_lsame_(diag, "N"); upper = _starpu_lsame_(uplo, "U"); info = 0; if (! lside && ! _starpu_lsame_(side, "R")) { info = 1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 2; } else if (! _starpu_lsame_(transa, "N") && ! _starpu_lsame_(transa, "T") && ! _starpu_lsame_(transa, "C")) { info = 3; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; } else if (*lda < max(1,nrowa)) { info = 9; } else if (*ldb < max(1,*m)) { info = 11; } if (info != 0) { _starpu_xerbla_("DTRMM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } return 0; } /* Start the operations. */ if (lside) { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*A*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (k = 1; k <= i__2; ++k) { if (b[k + j * b_dim1] != 0.) { temp = *alpha * b[k + j * b_dim1]; i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1]; /* L30: */ } if (nounit) { temp *= a[k + k * a_dim1]; } b[k + j * b_dim1] = temp; } /* L40: */ } /* L50: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (k = *m; k >= 1; --k) { if (b[k + j * b_dim1] != 0.) { temp = *alpha * b[k + j * b_dim1]; b[k + j * b_dim1] = temp; if (nounit) { b[k + j * b_dim1] *= a[k + k * a_dim1]; } i__2 = *m; for (i__ = k + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1]; /* L60: */ } } /* L70: */ } /* L80: */ } } } else { /* Form B := alpha*A'*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp = b[i__ + j * b_dim1]; if (nounit) { temp *= a[i__ + i__ * a_dim1]; } i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L90: */ } b[i__ + j * b_dim1] = *alpha * temp; /* L100: */ } /* L110: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = b[i__ + j * b_dim1]; if (nounit) { temp *= a[i__ + i__ * a_dim1]; } i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L120: */ } b[i__ + j * b_dim1] = *alpha * temp; /* L130: */ } /* L140: */ } } } } else { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*B*A. */ if (upper) { for (j = *n; j >= 1; --j) { temp = *alpha; if (nounit) { temp *= a[j + j * a_dim1]; } i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L150: */ } i__1 = j - 1; for (k = 1; k <= i__1; ++k) { if (a[k + j * a_dim1] != 0.) { temp = *alpha * a[k + j * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L160: */ } } /* L170: */ } /* L180: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = *alpha; if (nounit) { temp *= a[j + j * a_dim1]; } i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L190: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { if (a[k + j * a_dim1] != 0.) { temp = *alpha * a[k + j * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L200: */ } } /* L210: */ } /* L220: */ } } } else { /* Form B := alpha*B*A'. */ if (upper) { i__1 = *n; for (k = 1; k <= i__1; ++k) { i__2 = k - 1; for (j = 1; j <= i__2; ++j) { if (a[j + k * a_dim1] != 0.) { temp = *alpha * a[j + k * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L230: */ } } /* L240: */ } temp = *alpha; if (nounit) { temp *= a[k + k * a_dim1]; } if (temp != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L250: */ } } /* L260: */ } } else { for (k = *n; k >= 1; --k) { i__1 = *n; for (j = k + 1; j <= i__1; ++j) { if (a[j + k * a_dim1] != 0.) { temp = *alpha * a[j + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; /* L270: */ } } /* L280: */ } temp = *alpha; if (nounit) { temp *= a[k + k * a_dim1]; } if (temp != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L290: */ } } /* L300: */ } } } } return 0; /* End of DTRMM . */ } /* _starpu_dtrmm_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtrmv.c000066400000000000000000000205511413463044200212260ustar00rootroot00000000000000/* dtrmv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRMV performs one of the matrix-vector operations */ /* x := A*x, or x := A'*x, */ /* where x is an n element vector and A is an n by n unit, or non-unit, */ /* upper or lower triangular matrix. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' x := A*x. */ /* TRANS = 'T' or 't' x := A'*x. */ /* TRANS = 'C' or 'c' x := A'*x. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element vector x. On exit, X is overwritten with the */ /* tranformed vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,*n)) { info = 6; } else if (*incx == 0) { info = 8; } if (info != 0) { _starpu_xerbla_("DTRMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (_starpu_lsame_(trans, "N")) { /* Form x := A*x. */ if (_starpu_lsame_(uplo, "U")) { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { temp = x[j]; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[i__] += temp * a[i__ + j * a_dim1]; /* L10: */ } if (nounit) { x[j] *= a[j + j * a_dim1]; } } /* L20: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[ix] += temp * a[i__ + j * a_dim1]; ix += *incx; /* L30: */ } if (nounit) { x[jx] *= a[j + j * a_dim1]; } } jx += *incx; /* L40: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { temp = x[j]; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[i__] += temp * a[i__ + j * a_dim1]; /* L50: */ } if (nounit) { x[j] *= a[j + j * a_dim1]; } } /* L60: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { temp = x[jx]; ix = kx; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[ix] += temp * a[i__ + j * a_dim1]; ix -= *incx; /* L70: */ } if (nounit) { x[jx] *= a[j + j * a_dim1]; } } jx -= *incx; /* L80: */ } } } } else { /* Form x := A'*x. */ if (_starpu_lsame_(uplo, "U")) { if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; if (nounit) { temp *= a[j + j * a_dim1]; } for (i__ = j - 1; i__ >= 1; --i__) { temp += a[i__ + j * a_dim1] * x[i__]; /* L90: */ } x[j] = temp; /* L100: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = jx; if (nounit) { temp *= a[j + j * a_dim1]; } for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; temp += a[i__ + j * a_dim1] * x[ix]; /* L110: */ } x[jx] = temp; jx -= *incx; /* L120: */ } } } else { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; if (nounit) { temp *= a[j + j * a_dim1]; } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[i__]; /* L130: */ } x[j] = temp; /* L140: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = jx; if (nounit) { temp *= a[j + j * a_dim1]; } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; temp += a[i__ + j * a_dim1] * x[ix]; /* L150: */ } x[jx] = temp; jx += *incx; /* L160: */ } } } } return 0; /* End of DTRMV . */ } /* _starpu_dtrmv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtrsm.c000066400000000000000000000301641413463044200212240ustar00rootroot00000000000000/* dtrsm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, k, info; doublereal temp; logical lside; extern logical _starpu_lsame_(char *, char *); integer nrowa; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRSM solves one of the matrix equations */ /* op( A )*X = alpha*B, or X*op( A ) = alpha*B, */ /* where alpha is a scalar, X and B are m by n matrices, A is a unit, or */ /* non-unit, upper or lower triangular matrix and op( A ) is one of */ /* op( A ) = A or op( A ) = A'. */ /* The matrix X is overwritten on B. */ /* Arguments */ /* ========== */ /* SIDE - CHARACTER*1. */ /* On entry, SIDE specifies whether op( A ) appears on the left */ /* or right of X as follows: */ /* SIDE = 'L' or 'l' op( A )*X = alpha*B. */ /* SIDE = 'R' or 'r' X*op( A ) = alpha*B. */ /* Unchanged on exit. */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix A is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANSA - CHARACTER*1. */ /* On entry, TRANSA specifies the form of op( A ) to be used in */ /* the matrix multiplication as follows: */ /* TRANSA = 'N' or 'n' op( A ) = A. */ /* TRANSA = 'T' or 't' op( A ) = A'. */ /* TRANSA = 'C' or 'c' op( A ) = A'. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit triangular */ /* as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* M - INTEGER. */ /* On entry, M specifies the number of rows of B. M must be at */ /* least zero. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of B. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. When alpha is */ /* zero then A is not referenced and B need not be set before */ /* entry. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m */ /* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ /* Before entry with UPLO = 'U' or 'u', the leading k by k */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading k by k */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When SIDE = 'L' or 'l' then */ /* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ /* then LDA must be at least max( 1, n ). */ /* Unchanged on exit. */ /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */ /* Before entry, the leading m by n part of the array B must */ /* contain the right-hand side matrix B, and on exit is */ /* overwritten by the solution matrix X. */ /* LDB - INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. LDB must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Level 3 Blas routine. */ /* -- Written on 8-February-1989. */ /* Jack Dongarra, Argonne National Laboratory. */ /* Iain Duff, AERE Harwell. */ /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ /* Sven Hammarling, Numerical Algorithms Group Ltd. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ lside = _starpu_lsame_(side, "L"); if (lside) { nrowa = *m; } else { nrowa = *n; } nounit = _starpu_lsame_(diag, "N"); upper = _starpu_lsame_(uplo, "U"); info = 0; if (! lside && ! _starpu_lsame_(side, "R")) { info = 1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { info = 2; } else if (! _starpu_lsame_(transa, "N") && ! _starpu_lsame_(transa, "T") && ! _starpu_lsame_(transa, "C")) { info = 3; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; } else if (*lda < max(1,nrowa)) { info = 9; } else if (*ldb < max(1,*m)) { info = 11; } if (info != 0) { _starpu_xerbla_("DTRSM ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } return 0; } /* Start the operations. */ if (lside) { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*inv( A )*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L30: */ } } for (k = *m; k >= 1; --k) { if (b[k + j * b_dim1] != 0.) { if (nounit) { b[k + j * b_dim1] /= a[k + k * a_dim1]; } i__2 = k - 1; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ i__ + k * a_dim1]; /* L40: */ } } /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L70: */ } } i__2 = *m; for (k = 1; k <= i__2; ++k) { if (b[k + j * b_dim1] != 0.) { if (nounit) { b[k + j * b_dim1] /= a[k + k * a_dim1]; } i__3 = *m; for (i__ = k + 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ i__ + k * a_dim1]; /* L80: */ } } /* L90: */ } /* L100: */ } } } else { /* Form B := alpha*inv( A' )*B. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = *alpha * b[i__ + j * b_dim1]; i__3 = i__ - 1; for (k = 1; k <= i__3; ++k) { temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L110: */ } if (nounit) { temp /= a[i__ + i__ * a_dim1]; } b[i__ + j * b_dim1] = temp; /* L120: */ } /* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { temp = *alpha * b[i__ + j * b_dim1]; i__2 = *m; for (k = i__ + 1; k <= i__2; ++k) { temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L140: */ } if (nounit) { temp /= a[i__ + i__ * a_dim1]; } b[i__ + j * b_dim1] = temp; /* L150: */ } /* L160: */ } } } } else { if (_starpu_lsame_(transa, "N")) { /* Form B := alpha*B*inv( A ). */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L170: */ } } i__2 = j - 1; for (k = 1; k <= i__2; ++k) { if (a[k + j * a_dim1] != 0.) { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ i__ + k * b_dim1]; /* L180: */ } } /* L190: */ } if (nounit) { temp = 1. / a[j + j * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L200: */ } } /* L210: */ } } else { for (j = *n; j >= 1; --j) { if (*alpha != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] ; /* L220: */ } } i__1 = *n; for (k = j + 1; k <= i__1; ++k) { if (a[k + j * a_dim1] != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ i__ + k * b_dim1]; /* L230: */ } } /* L240: */ } if (nounit) { temp = 1. / a[j + j * a_dim1]; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L250: */ } } /* L260: */ } } } else { /* Form B := alpha*B*inv( A' ). */ if (upper) { for (k = *n; k >= 1; --k) { if (nounit) { temp = 1. / a[k + k * a_dim1]; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L270: */ } } i__1 = k - 1; for (j = 1; j <= i__1; ++j) { if (a[j + k * a_dim1] != 0.) { temp = a[j + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= temp * b[i__ + k * b_dim1]; /* L280: */ } } /* L290: */ } if (*alpha != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] ; /* L300: */ } } /* L310: */ } } else { i__1 = *n; for (k = 1; k <= i__1; ++k) { if (nounit) { temp = 1. / a[k + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L320: */ } } i__2 = *n; for (j = k + 1; j <= i__2; ++j) { if (a[j + k * a_dim1] != 0.) { temp = a[j + k * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { b[i__ + j * b_dim1] -= temp * b[i__ + k * b_dim1]; /* L330: */ } } /* L340: */ } if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] ; /* L350: */ } } /* L360: */ } } } } return 0; /* End of DTRSM . */ } /* _starpu_dtrsm_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dtrsv.c000066400000000000000000000210231413463044200212270ustar00rootroot00000000000000/* dtrsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, ix, jx, kx, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRSV solves one of the systems of equations */ /* A*x = b, or A'*x = b, */ /* where b and x are n element vectors and A is an n by n unit, or */ /* non-unit, upper or lower triangular matrix. */ /* No test for singularity or near-singularity is included in this */ /* routine. Such tests must be performed before calling this routine. */ /* Arguments */ /* ========== */ /* UPLO - CHARACTER*1. */ /* On entry, UPLO specifies whether the matrix is an upper or */ /* lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ /* Unchanged on exit. */ /* TRANS - CHARACTER*1. */ /* On entry, TRANS specifies the equations to be solved as */ /* follows: */ /* TRANS = 'N' or 'n' A*x = b. */ /* TRANS = 'T' or 't' A'*x = b. */ /* TRANS = 'C' or 'c' A'*x = b. */ /* Unchanged on exit. */ /* DIAG - CHARACTER*1. */ /* On entry, DIAG specifies whether or not A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the order of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry with UPLO = 'U' or 'u', the leading n by n */ /* upper triangular part of the array A must contain the upper */ /* triangular matrix and the strictly lower triangular part of */ /* A is not referenced. */ /* Before entry with UPLO = 'L' or 'l', the leading n by n */ /* lower triangular part of the array A must contain the lower */ /* triangular matrix and the strictly upper triangular part of */ /* A is not referenced. */ /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ /* A are not referenced either, but are assumed to be unity. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of dimension at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ). */ /* Before entry, the incremented array X must contain the n */ /* element right-hand side vector b. On exit, X is overwritten */ /* with the solution vector x. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; /* Function Body */ info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { info = 1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { info = 2; } else if (! _starpu_lsame_(diag, "U") && ! _starpu_lsame_(diag, "N")) { info = 3; } else if (*n < 0) { info = 4; } else if (*lda < max(1,*n)) { info = 6; } else if (*incx == 0) { info = 8; } if (info != 0) { _starpu_xerbla_("DTRSV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } nounit = _starpu_lsame_(diag, "N"); /* Set up the start point in X if the increment is not unity. This */ /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (_starpu_lsame_(trans, "N")) { /* Form x := inv( A )*x. */ if (_starpu_lsame_(uplo, "U")) { if (*incx == 1) { for (j = *n; j >= 1; --j) { if (x[j] != 0.) { if (nounit) { x[j] /= a[j + j * a_dim1]; } temp = x[j]; for (i__ = j - 1; i__ >= 1; --i__) { x[i__] -= temp * a[i__ + j * a_dim1]; /* L10: */ } } /* L20: */ } } else { jx = kx + (*n - 1) * *incx; for (j = *n; j >= 1; --j) { if (x[jx] != 0.) { if (nounit) { x[jx] /= a[j + j * a_dim1]; } temp = x[jx]; ix = jx; for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; x[ix] -= temp * a[i__ + j * a_dim1]; /* L30: */ } } jx -= *incx; /* L40: */ } } } else { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[j] != 0.) { if (nounit) { x[j] /= a[j + j * a_dim1]; } temp = x[j]; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { x[i__] -= temp * a[i__ + j * a_dim1]; /* L50: */ } } /* L60: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (x[jx] != 0.) { if (nounit) { x[jx] /= a[j + j * a_dim1]; } temp = x[jx]; ix = jx; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; x[ix] -= temp * a[i__ + j * a_dim1]; /* L70: */ } } jx += *incx; /* L80: */ } } } } else { /* Form x := inv( A' )*x. */ if (_starpu_lsame_(uplo, "U")) { if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { temp -= a[i__ + j * a_dim1] * x[i__]; /* L90: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[j] = temp; /* L100: */ } } else { jx = kx; i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[jx]; ix = kx; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { temp -= a[i__ + j * a_dim1] * x[ix]; ix += *incx; /* L110: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[jx] = temp; jx += *incx; /* L120: */ } } } else { if (*incx == 1) { for (j = *n; j >= 1; --j) { temp = x[j]; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { temp -= a[i__ + j * a_dim1] * x[i__]; /* L130: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[j] = temp; /* L140: */ } } else { kx += (*n - 1) * *incx; jx = kx; for (j = *n; j >= 1; --j) { temp = x[jx]; ix = kx; i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { temp -= a[i__ + j * a_dim1] * x[ix]; ix -= *incx; /* L150: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[jx] = temp; jx -= *incx; /* L160: */ } } } } return 0; /* End of DTRSV . */ } /* _starpu_dtrsv_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dzasum.c000066400000000000000000000034631413463044200214000ustar00rootroot00000000000000/* dzasum.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dzasum_(integer *n, doublecomplex *zx, integer *incx) { /* System generated locals */ integer i__1; doublereal ret_val; /* Local variables */ integer i__, ix; doublereal stemp; extern doublereal _starpu_dcabs1_(doublecomplex *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* takes the sum of the absolute values. */ /* jack dongarra, 3/11/78. */ /* modified 3/93 to return if incx .le. 0. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* Parameter adjustments */ --zx; /* Function Body */ ret_val = 0.; stemp = 0.; if (*n <= 0 || *incx <= 0) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ ix = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { stemp += _starpu_dcabs1_(&zx[ix]); ix += *incx; /* L10: */ } ret_val = stemp; return ret_val; /* code for increment equal to 1 */ L20: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { stemp += _starpu_dcabs1_(&zx[i__]); /* L30: */ } ret_val = stemp; return ret_val; } /* _starpu_dzasum_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/dznrm2.c000066400000000000000000000050231413463044200213030ustar00rootroot00000000000000/* dznrm2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dznrm2_(integer *n, doublecomplex *x, integer *incx) { /* System generated locals */ integer i__1, i__2, i__3; doublereal ret_val, d__1; /* Builtin functions */ double d_imag(doublecomplex *), sqrt(doublereal); /* Local variables */ integer ix; doublereal ssq, temp, norm, scale; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DZNRM2 returns the euclidean norm of a vector via the function */ /* name, so that */ /* DZNRM2 := sqrt( conjg( x' )*x ) */ /* -- This version written on 25-October-1982. */ /* Modified on 14-October-1993 to inline the call to ZLASSQ. */ /* Sven Hammarling, Nag Ltd. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n < 1 || *incx < 1) { norm = 0.; } else { scale = 0.; ssq = 1.; /* The following loop is equivalent to this call to the LAPACK */ /* auxiliary routine: */ /* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) */ i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { i__3 = ix; if (x[i__3].r != 0.) { i__3 = ix; temp = (d__1 = x[i__3].r, abs(d__1)); if (scale < temp) { /* Computing 2nd power */ d__1 = scale / temp; ssq = ssq * (d__1 * d__1) + 1.; scale = temp; } else { /* Computing 2nd power */ d__1 = temp / scale; ssq += d__1 * d__1; } } if (d_imag(&x[ix]) != 0.) { temp = (d__1 = d_imag(&x[ix]), abs(d__1)); if (scale < temp) { /* Computing 2nd power */ d__1 = scale / temp; ssq = ssq * (d__1 * d__1) + 1.; scale = temp; } else { /* Computing 2nd power */ d__1 = temp / scale; ssq += d__1 * d__1; } } /* L10: */ } norm = scale * sqrt(ssq); } ret_val = norm; return ret_val; /* End of DZNRM2. */ } /* _starpu_dznrm2_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/idamax.c000066400000000000000000000037741413463044200213450ustar00rootroot00000000000000/* idamax.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_idamax_(integer *n, doublereal *dx, integer *incx) { /* System generated locals */ integer ret_val, i__1; doublereal d__1; /* Local variables */ integer i__, ix; doublereal dmax__; /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* finds the index of element having max. absolute value. */ /* jack dongarra, linpack, 3/11/78. */ /* modified 3/93 to return if incx .le. 0. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* Parameter adjustments */ --dx; /* Function Body */ ret_val = 0; if (*n < 1 || *incx <= 0) { return ret_val; } ret_val = 1; if (*n == 1) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ ix = 1; dmax__ = abs(dx[1]); ix += *incx; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if ((d__1 = dx[ix], abs(d__1)) <= dmax__) { goto L5; } ret_val = i__; dmax__ = (d__1 = dx[ix], abs(d__1)); L5: ix += *incx; /* L10: */ } return ret_val; /* code for increment equal to 1 */ L20: dmax__ = abs(dx[1]); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if ((d__1 = dx[i__], abs(d__1)) <= dmax__) { goto L30; } ret_val = i__; dmax__ = (d__1 = dx[i__], abs(d__1)); L30: ; } return ret_val; } /* _starpu_idamax_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/izamax.c000066400000000000000000000040341413463044200213610ustar00rootroot00000000000000/* izamax.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_izamax_(integer *n, doublecomplex *zx, integer *incx) { /* System generated locals */ integer ret_val, i__1; /* Local variables */ integer i__, ix; doublereal smax; extern doublereal _starpu_dcabs1_(doublecomplex *); /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* finds the index of element having max. absolute value. */ /* jack dongarra, 1/15/85. */ /* modified 3/93 to return if incx .le. 0. */ /* modified 12/3/93, array(1) declarations changed to array(*) */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* Parameter adjustments */ --zx; /* Function Body */ ret_val = 0; if (*n < 1 || *incx <= 0) { return ret_val; } ret_val = 1; if (*n == 1) { return ret_val; } if (*incx == 1) { goto L20; } /* code for increment not equal to 1 */ ix = 1; smax = _starpu_dcabs1_(&zx[1]); ix += *incx; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (_starpu_dcabs1_(&zx[ix]) <= smax) { goto L5; } ret_val = i__; smax = _starpu_dcabs1_(&zx[ix]); L5: ix += *incx; /* L10: */ } return ret_val; /* code for increment equal to 1 */ L20: smax = _starpu_dcabs1_(&zx[1]); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (_starpu_dcabs1_(&zx[i__]) <= smax) { goto L30; } ret_val = i__; smax = _starpu_dcabs1_(&zx[i__]); L30: ; } return ret_val; } /* _starpu_izamax_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/lsame.c000066400000000000000000000056011413463044200211720ustar00rootroot00000000000000/* lsame.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" logical _starpu_lsame_(char *ca, char *cb) { /* System generated locals */ logical ret_val; /* Local variables */ integer inta, intb, zcode; /* -- LAPACK auxiliary routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* LSAME returns .TRUE. if CA is the same letter as CB regardless of */ /* case. */ /* Arguments */ /* ========= */ /* CA (input) CHARACTER*1 */ /* CB (input) CHARACTER*1 */ /* CA and CB specify the single characters to be compared. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* Test if the characters are equal */ ret_val = *(unsigned char *)ca == *(unsigned char *)cb; if (ret_val) { return ret_val; } /* Now test for equivalence if both characters are alphabetic. */ zcode = 'Z'; /* Use 'Z' rather than 'A' so that ASCII can be detected on Prime */ /* machines, on which ICHAR returns a value with bit 8 set. */ /* ICHAR('A') on Prime machines returns 193 which is the same as */ /* ICHAR('A') on an EBCDIC machine. */ inta = *(unsigned char *)ca; intb = *(unsigned char *)cb; if (zcode == 90 || zcode == 122) { /* ASCII is assumed - ZCODE is the ASCII code of either lower or */ /* upper case 'Z'. */ if (inta >= 97 && inta <= 122) { inta += -32; } if (intb >= 97 && intb <= 122) { intb += -32; } } else if (zcode == 233 || zcode == 169) { /* EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or */ /* upper case 'Z'. */ if (inta >= 129 && inta <= 137 || inta >= 145 && inta <= 153 || inta >= 162 && inta <= 169) { inta += 64; } if (intb >= 129 && intb <= 137 || intb >= 145 && intb <= 153 || intb >= 162 && intb <= 169) { intb += 64; } } else if (zcode == 218 || zcode == 250) { /* ASCII is assumed, on Prime machines - ZCODE is the ASCII code */ /* plus 128 of either lower or upper case 'Z'. */ if (inta >= 225 && inta <= 250) { inta += -32; } if (intb >= 225 && intb <= 250) { intb += -32; } } ret_val = inta == intb; /* RETURN */ /* End of LSAME */ return ret_val; } /* _starpu_lsame_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/xerbla.c000066400000000000000000000043151413463044200213470ustar00rootroot00000000000000/* xerbla.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" #include "stdio.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info) { /* Format strings */ static char fmt_9999[] = "(\002 ** On entry to \002,a,\002 parameter num" "ber \002,i2,\002 had \002,\002an illegal value\002)"; /* Builtin functions */ integer s_wsfe(cilist *), i_len_trim(char *, ftnlen), do_fio(integer *, char *, ftnlen), e_wsfe(void); /* Subroutine */ int s_stop(char *, ftnlen); /* Fortran I/O blocks */ static cilist io___1 = { 0, 6, 0, fmt_9999, 0 }; /* -- LAPACK auxiliary routine (preliminary version) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* XERBLA is an error handler for the LAPACK routines. */ /* It is called by an LAPACK routine if an input parameter has an */ /* invalid value. A message is printed and execution stops. */ /* Installers may consider modifying the STOP statement in order to */ /* call system-specific exception-handling facilities. */ /* Arguments */ /* ========= */ /* SRNAME (input) CHARACTER*(*) */ /* The name of the routine which called XERBLA. */ /* INFO (input) INTEGER */ /* The position of the invalid parameter in the parameter list */ /* of the calling routine. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ printf("** On entry to %s, parameter number %ld had an illegal value\n", srname, *info); /* End of XERBLA */ return 0; } /* _starpu_xerbla_ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/SRC/xerbla_array.c000066400000000000000000000064361413463044200225530ustar00rootroot00000000000000/* _starpu_xerbla_array.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_xerbla_array__(char *srname_array__, integer * srname_len__, integer *info, ftnlen srname_array_len) { /* System generated locals */ integer i__1, i__2, i__3; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer i_len(char *, ftnlen); /* Local variables */ integer i__; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); char srname[32]; /* -- LAPACK auxiliary routine (version 3.0) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ /* September 19, 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* XERBLA_ARRAY assists other languages in calling XERBLA, the LAPACK */ /* and BLAS error handler. Rather than taking a Fortran string argument */ /* as the function's name, XERBLA_ARRAY takes an array of single */ /* characters along with the array's length. XERBLA_ARRAY then copies */ /* up to 32 characters of that array into a Fortran string and passes */ /* that to XERBLA. If called with a non-positive SRNAME_LEN, */ /* XERBLA_ARRAY will call XERBLA with a string of all blank characters. */ /* Say some macro or other device makes XERBLA_ARRAY available to C99 */ /* by a name lapack_xerbla and with a common Fortran calling convention. */ /* Then a C99 program could invoke XERBLA via: */ /* { */ /* int flen = strlen(__func__); */ /* lapack_xerbla(__func__, &flen, &info); */ /* } */ /* Providing XERBLA_ARRAY is not necessary for intercepting LAPACK */ /* errors. XERBLA_ARRAY calls XERBLA. */ /* Arguments */ /* ========= */ /* SRNAME_ARRAY (input) CHARACTER(1) array, dimension (SRNAME_LEN) */ /* The name of the routine which called XERBLA_ARRAY. */ /* SRNAME_LEN (input) INTEGER */ /* The length of the name in SRNAME_ARRAY. */ /* INFO (input) INTEGER */ /* The position of the invalid parameter in the parameter list */ /* of the calling routine. */ /* ===================================================================== */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --srname_array__; /* Function Body */ s_copy(srname, "", (ftnlen)32, (ftnlen)0); /* Computing MIN */ i__2 = *srname_len__, i__3 = i_len(srname, (ftnlen)32); i__1 = min(i__2,i__3); for (i__ = 1; i__ <= i__1; ++i__) { *(unsigned char *)&srname[i__ - 1] = *(unsigned char *)& srname_array__[i__]; } _starpu_xerbla_(srname, info); return 0; } /* _starpu_xerbla_array__ */ starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/000077500000000000000000000000001413463044200200455ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/Makefile000066400000000000000000000007751413463044200215160ustar00rootroot00000000000000TOPDIR=../.. include $(TOPDIR)/make.inc ####################################################################### # This is the makefile to create a wrapper for the CBLAS. ####################################################################### all: libcblaswr.a libcblaswr.a: cblaswr.o $(ARCH) $(ARCHFLAGS) libcblaswr.a cblaswr.o $(RANLIB) libcblaswr.a libfblaswr.a: fblaswr.o $(ARCH) $(ARCHFLAGS) libfblaswr.a fblaswr.o $(RANLIB) libfblaswr.a clean: rm -f *.o *.a .c.o: $(CC) $(CFLAGS) -c $*.c starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/README000066400000000000000000000024271413463044200207320ustar00rootroot00000000000000f2c'd BLAS wrapper The f2c translated BLAS interfaces used by CLAPACK (and other f2c'd codes) unfortunately often don't quite match the Fortran interfaces on various platforms. Consequently, it is difficult to use f2c'd codes with high performance BLAS routines, which may substantially impede the performance of these codes. These simple wrappers provide a way around this difficulty by providing f2c style interfaces (preceded with "f2c_" to avoid name collisions) that call through to an underlying CBLAS or F77 BLAS. f2c.h: The f2c header file blaswrap.h: A header file to be included in f2c codes that will use the wrapper. Just #include it at the top of an f2c generated file. cblaswr.c: A wrapper around the CBLAS interface. This interface is provided, for instance, by ATLAS (see www.netlib.org/atlas) fblaswr.c: A sample wrapper around a conventional Fortran BLAS interface. This works on a Sun platform, but will require substantial tinkering on platforms with different Fortran calling conventions. cblas.h: A header file for the CBLAS interface. fblaswr.h: A header file for the (Sun-style) Fortran BLAS interface [cz]rotg.c: Complex Givens rotation routines. For some reason, C interfaces to these routines were not specified in the CBLAS interface. starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/cblas.h000066400000000000000000000777531413463044200213250ustar00rootroot00000000000000#ifndef CBLAS_H #define CBLAS_H #include #define CBLAS_INDEX size_t enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102}; enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113}; enum CBLAS_UPLO {CblasUpper=121, CblasLower=122}; enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132}; enum CBLAS_SIDE {CblasLeft=141, CblasRight=142}; int cblas_errprn(int ierr, int info, char *form, ...); /* * =========================================================================== * Prototypes for level 1 BLAS functions (complex are recast as routines) * =========================================================================== */ float cblas_sdsdot(const int N, const float alpha, const float *X, const int incX, const float *Y, const int incY); double cblas_dsdot(const int N, const float *X, const int incX, const float *Y, const int incY); float cblas_sdot(const int N, const float *X, const int incX, const float *Y, const int incY); double cblas_ddot(const int N, const double *X, const int incX, const double *Y, const int incY); /* * Functions having prefixes Z and C only */ void _starpu_cblas_cdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu); void _starpu_cblas_cdotc_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotc); void _starpu_cblas_zdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu); void _starpu_cblas_zdotc_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotc); /* * Functions having prefixes S D SC DZ */ float cblas_snrm2(const int N, const float *X, const int incX); float cblas_sasum(const int N, const float *X, const int incX); double cblas_dnrm2(const int N, const double *X, const int incX); double cblas_dasum(const int N, const double *X, const int incX); float cblas_scnrm2(const int N, const void *X, const int incX); float cblas_scasum(const int N, const void *X, const int incX); double cblas_dznrm2(const int N, const void *X, const int incX); double cblas_dzasum(const int N, const void *X, const int incX); /* * Functions having standard 4 prefixes (S D C Z) */ CBLAS_INDEX cblas_isamax(const int N, const float *X, const int incX); CBLAS_INDEX cblas_idamax(const int N, const double *X, const int incX); CBLAS_INDEX cblas_icamax(const int N, const void *X, const int incX); CBLAS_INDEX cblas_izamax(const int N, const void *X, const int incX); /* * =========================================================================== * Prototypes for level 0 BLAS routines * =========================================================================== */ void cblas_srotg(float a, float b, float c, float s); void cblas_crotg(complex a, complex b, complex c, float s); void cblas_drotg(double a, double b, double c, double s); void cblas_zrotg(doublecomplex a, doublecomplex b, doublecomplex c, double s); /* * =========================================================================== * Prototypes for level 1 BLAS routines * =========================================================================== */ /* * Routines with standard 4 prefixes (s, d, c, z) */ void cblas_sswap(const int N, float *X, const int incX, float *Y, const int incY); void cblas_scopy(const int N, const float *X, const int incX, float *Y, const int incY); void cblas_saxpy(const int N, const float alpha, const float *X, const int incX, float *Y, const int incY); void cblas_dswap(const int N, double *X, const int incX, double *Y, const int incY); void cblas_dcopy(const int N, const double *X, const int incX, double *Y, const int incY); void cblas_daxpy(const int N, const double alpha, const double *X, const int incX, double *Y, const int incY); void cblas_cswap(const int N, void *X, const int incX, void *Y, const int incY); void cblas_ccopy(const int N, const void *X, const int incX, void *Y, const int incY); void cblas_caxpy(const int N, const void *alpha, const void *X, const int incX, void *Y, const int incY); void cblas_zswap(const int N, void *X, const int incX, void *Y, const int incY); void cblas_zcopy(const int N, const void *X, const int incX, void *Y, const int incY); void cblas_zaxpy(const int N, const void *alpha, const void *X, const int incX, void *Y, const int incY); /* * Routines with S and D prefix only */ void cblas_srotmg(float *d1, float *d2, float *b1, const float b2, float *P); void cblas_srot(const int N, float *X, const int incX, float *Y, const int incY, const float c, const float s); void cblas_srotm(const int N, float *X, const int incX, float *Y, const int incY, const float *P); void cblas_drotmg(double *d1, double *d2, double *b1, const double b2, double *P); void cblas_drot(const int N, double *X, const int incX, double *Y, const int incY, const double c, const double s); void cblas_drotm(const int N, double *X, const int incX, double *Y, const int incY, const double *P); /* * Routines with S D C Z CS and ZD prefixes */ void cblas_sscal(const int N, const float alpha, float *X, const int incX); void cblas_dscal(const int N, const double alpha, double *X, const int incX); void cblas_cscal(const int N, const void *alpha, void *X, const int incX); void cblas_zscal(const int N, const void *alpha, void *X, const int incX); void cblas_csscal(const int N, const float alpha, void *X, const int incX); void cblas_zdscal(const int N, const double alpha, void *X, const int incX); /* * =========================================================================== * Prototypes for level 2 BLAS * =========================================================================== */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ void cblas_sgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 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); void cblas_sgbmv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const int KL, const int KU, const float alpha, const float *A, const int lda, const float *X, const int incX, const float beta, float *Y, const int incY); void cblas_strmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const float *A, const int lda, float *X, const int incX); void cblas_stbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const float *A, const int lda, float *X, const int incX); void cblas_stpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const float *Ap, float *X, const int incX); void cblas_strsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const float *A, const int lda, float *X, const int incX); void cblas_stbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const float *A, const int lda, float *X, const int incX); void cblas_stpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const float *Ap, float *X, const int incX); void cblas_dgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 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); void cblas_dgbmv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const int KL, const int KU, const double alpha, const double *A, const int lda, const double *X, const int incX, const double beta, double *Y, const int incY); void cblas_dtrmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const double *A, const int lda, double *X, const int incX); void cblas_dtbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const double *A, const int lda, double *X, const int incX); void cblas_dtpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const double *Ap, double *X, const int incX); void cblas_dtrsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const double *A, const int lda, double *X, const int incX); void cblas_dtbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const double *A, const int lda, double *X, const int incX); void cblas_dtpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const double *Ap, double *X, const int incX); void cblas_cgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_cgbmv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const int KL, const int KU, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_ctrmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *A, const int lda, void *X, const int incX); void cblas_ctbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const void *A, const int lda, void *X, const int incX); void cblas_ctpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *Ap, void *X, const int incX); void cblas_ctrsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *A, const int lda, void *X, const int incX); void cblas_ctbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const void *A, const int lda, void *X, const int incX); void cblas_ctpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *Ap, void *X, const int incX); void cblas_zgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_zgbmv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const int KL, const int KU, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_ztrmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *A, const int lda, void *X, const int incX); void cblas_ztbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const void *A, const int lda, void *X, const int incX); void cblas_ztpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *Ap, void *X, const int incX); void cblas_ztrsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *A, const int lda, void *X, const int incX); void cblas_ztbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const int K, const void *A, const int lda, void *X, const int incX); void cblas_ztpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *Ap, void *X, const int incX); /* * Routines with S and D prefixes only */ void cblas_ssymv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, 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); void cblas_ssbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int K, const float alpha, const float *A, const int lda, const float *X, const int incX, const float beta, float *Y, const int incY); void cblas_sspmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const float *Ap, const float *X, const int incX, const float beta, float *Y, const int incY); void cblas_sger(const enum CBLAS_ORDER Order, 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 cblas_ssyr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const float *X, const int incX, float *A, const int lda); void cblas_sspr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const float *X, const int incX, float *Ap); void cblas_ssyr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const float *X, const int incX, const float *Y, const int incY, float *A, const int lda); void cblas_sspr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const float *X, const int incX, const float *Y, const int incY, float *A); void cblas_dsymv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, 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); void cblas_dsbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int K, const double alpha, const double *A, const int lda, const double *X, const int incX, const double beta, double *Y, const int incY); void cblas_dspmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const double *Ap, const double *X, const int incX, const double beta, double *Y, const int incY); void cblas_dger(const enum CBLAS_ORDER Order, 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 cblas_dsyr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const double *X, const int incX, double *A, const int lda); void cblas_dspr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const double *X, const int incX, double *Ap); void cblas_dsyr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const double *X, const int incX, const double *Y, const int incY, double *A, const int lda); void cblas_dspr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const double *X, const int incX, const double *Y, const int incY, double *A); /* * Routines with C and Z prefixes only */ void cblas_chemv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_chbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int K, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_chpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *Ap, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_cgeru(const enum CBLAS_ORDER Order, const int M, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *A, const int lda); void cblas_cgerc(const enum CBLAS_ORDER Order, const int M, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *A, const int lda); void cblas_cher(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const void *X, const int incX, void *A, const int lda); void cblas_chpr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const float alpha, const void *X, const int incX, void *A); void cblas_cher2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *A, const int lda); void cblas_chpr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *Ap); void cblas_zhemv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_zhbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int K, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_zhpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *Ap, const void *X, const int incX, const void *beta, void *Y, const int incY); void cblas_zgeru(const enum CBLAS_ORDER Order, const int M, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *A, const int lda); void cblas_zgerc(const enum CBLAS_ORDER Order, const int M, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *A, const int lda); void cblas_zher(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const void *X, const int incX, void *A, const int lda); void cblas_zhpr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const double alpha, const void *X, const int incX, void *A); void cblas_zher2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *A, const int lda); void cblas_zhpr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const void *alpha, const void *X, const int incX, const void *Y, const int incY, void *Ap); /* * =========================================================================== * Prototypes for level 3 BLAS * =========================================================================== */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE 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); void cblas_ssymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const int M, const int N, const float alpha, const float *A, const int lda, const float *B, const int ldb, const float beta, float *C, const int ldc); void cblas_ssyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE 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 cblas_ssyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, 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); void cblas_strmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const float alpha, const float *A, const int lda, float *B, const int ldb); void cblas_strsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const float alpha, const float *A, const int lda, float *B, const int ldb); void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE 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); void cblas_dsymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const int M, const int N, const double alpha, const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc); void cblas_dsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const double alpha, const double *A, const int lda, const double beta, double *C, const int ldc); void cblas_dsyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, 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); void cblas_dtrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const double alpha, const double *A, const int lda, double *B, const int ldb); void cblas_dtrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const double alpha, const double *A, const int lda, double *B, const int ldb); void cblas_cgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_csymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const int M, const int N, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_csyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const void *alpha, const void *A, const int lda, const void *beta, void *C, const int ldc); void cblas_csyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_ctrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const void *alpha, const void *A, const int lda, void *B, const int ldb); void cblas_ctrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const void *alpha, const void *A, const int lda, void *B, const int ldb); void cblas_zgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_zsymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const int M, const int N, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_zsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const void *alpha, const void *A, const int lda, const void *beta, void *C, const int ldc); void cblas_zsyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_ztrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const void *alpha, const void *A, const int lda, void *B, const int ldb); void cblas_ztrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int M, const int N, const void *alpha, const void *A, const int lda, void *B, const int ldb); /* * Routines with prefixes C and Z only */ void cblas_chemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const int M, const int N, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const float alpha, const void *A, const int lda, const float beta, void *C, const int ldc); void cblas_cher2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const float beta, void *C, const int ldc); void cblas_zhemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const int M, const int N, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const double alpha, const void *A, const int lda, const double beta, void *C, const int ldc); void cblas_zher2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const double beta, void *C, const int ldc); int cblas_errprn(int ierr, int info, char *form, ...); #endif starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/cblaswr.c000066400000000000000000001225031413463044200216510ustar00rootroot00000000000000#include "f2c.h" #include "cblas.h" /* #define CBLAS_INDEX size_t enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102}; enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113}; enum CBLAS_UPLO {CblasUpper=121, CblasLower=122}; enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132}; enum CBLAS_SIDE {CblasLeft=141, CblasRight=142}; */ #define CVT_TRANSPOSE(c) \ (((c) == 'N' || (c) == 'n') ? CblasNoTrans : \ ((c) == 'T' || (c) == 't') ? CblasTrans : \ ((c) == 'C' || (c) == 'c') ? CblasConjTrans : \ -1) #define CVT_UPLO(c) \ (((c) == 'U' || (c) == 'u') ? CblasUpper : \ ((c) == 'L' || (c) == 'l') ? CblasLower : \ -1) #define CVT_DIAG(c) \ (((c) == 'U' || (c) == 'u') ? CblasUnit : \ ((c) == 'N' || (c) == 'n') ? CblasNonUnit : \ -1) #define CVT_SIDE(c) \ (((c) == 'L' || (c) == 'l') ? CblasLeft : \ ((c) == 'R' || (c) == 'r') ? CblasRight : \ -1) /* * =========================================================================== * Prototypes for level 1 BLAS functions (complex are recast as routines) * =========================================================================== */ doublereal f2c_sdot(integer* N, real* X, integer* incX, real* Y, integer* incY) { return cblas_sdot(*N, X, *incX, Y, *incY); } doublereal f2c_ddot(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY) { return cblas_ddot(*N, X, *incX, Y, *incY); } /* * Functions having prefixes Z and C only */ void f2c_cdotu(complex* retval, integer* N, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_cblas_cdotu_sub(*N, X, *incX, Y, *incY, retval); } void f2c_cdotc(complex* retval, integer* N, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_cblas_cdotc_sub(*N, X, *incX, Y, *incY, retval); } void f2c_zdotu(doublecomplex* retval, integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_cblas_zdotu_sub(*N, X, *incX, Y, *incY, retval); } void f2c_zdotc(doublecomplex* retval, integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_cblas_zdotc_sub(*N, X, *incX, Y, *incY, retval); } /* * Functions having prefixes S D SC DZ */ doublereal f2c_snrm2(integer* N, real* X, integer* incX) { return cblas_snrm2(*N, X, *incX); } doublereal f2c_sasum(integer* N, real* X, integer* incX) { return cblas_sasum(*N, X, *incX); } doublereal f2c_dnrm2(integer* N, doublereal* X, integer* incX) { return cblas_dnrm2(*N, X, *incX); } doublereal f2c_dasum(integer* N, doublereal* X, integer* incX) { return cblas_dasum(*N, X, *incX); } doublereal f2c_scnrm2(integer* N, complex* X, integer* incX) { return cblas_scnrm2(*N, X, *incX); } doublereal f2c_scasum(integer* N, complex* X, integer* incX) { return cblas_scasum(*N, X, *incX); } doublereal f2c_dznrm2(integer* N, doublecomplex* X, integer* incX) { return cblas_dznrm2(*N, X, *incX); } doublereal f2c_dzasum(integer* N, doublecomplex* X, integer* incX) { return cblas_dzasum(*N, X, *incX); } /* * Functions having standard 4 prefixes (S D C Z) */ integer f2c_isamax(integer* N, real* X, integer* incX) { if (*N == 0) return 0; return (integer) cblas_isamax(*N, X, *incX) + 1; } integer f2c_idamax(integer* N, doublereal* X, integer* incX) { if (*N == 0) return 0; return (integer) cblas_idamax(*N, X, *incX) + 1; } integer f2c_icamax(integer* N, complex* X, integer* incX) { if (*N == 0) return 0; return (integer) cblas_icamax(*N, X, *incX) + 1; } integer f2c_izamax(integer* N, doublecomplex* X, integer* incX) { if (*N == 0) return 0; return (integer) cblas_izamax(*N, X, *incX) + 1; } /* * =========================================================================== * Prototypes for level 0 BLAS routines * =========================================================================== */ int f2c_srotg(real* a, real* b, real* c, real* s) { cblas_srotg(*a, *b, *c, *s); return 0; } int f2c_crotg(complex* CA, complex* CB, complex* C, real* S) { cblas_crotg(*CA, *CB, *C, *S); return 0; } int f2c_drotg(doublereal* a, doublereal* b, doublereal* c, doublereal* s) { cblas_drotg(*a, *b, *c, *s); return 0; } int f2c_zrotg(doublecomplex* CA, doublecomplex* CB, doublecomplex* C, doublereal* S) { cblas_zrotg(*CA, *CB, *C, *S); return 0; } /* * =========================================================================== * Prototypes for level 1 BLAS routines * =========================================================================== */ /* * Routines with standard 4 prefixes (s, d, c, z) */ int f2c_sswap(integer* N, real* X, integer* incX, real* Y, integer* incY) { cblas_sswap(*N, X, *incX, Y, *incY); return 0; } int f2c_scopy(integer* N, real* X, integer* incX, real* Y, integer* incY) { cblas_scopy(*N, X, *incX, Y, *incY); return 0; } int f2c_saxpy(integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY) { cblas_saxpy(*N, *alpha, X, *incX, Y, *incY); return 0; } int f2c_dswap(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY) { cblas_dswap(*N, X, *incX, Y, *incY); return 0; } int f2c_dcopy(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY) { cblas_dcopy(*N, X, *incX, Y, *incY); return 0; } int f2c_daxpy(integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY) { cblas_daxpy(*N, *alpha, X, *incX, Y, *incY); return 0; } int f2c_cswap(integer* N, complex* X, integer* incX, complex* Y, integer* incY) { cblas_cswap(*N, X, *incX, Y, *incY); return 0; } int f2c_ccopy(integer* N, complex* X, integer* incX, complex* Y, integer* incY) { cblas_ccopy(*N, X, *incX, Y, *incY); return 0; } int f2c_caxpy(integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY) { cblas_caxpy(*N, alpha, X, *incX, Y, *incY); return 0; } int f2c_zswap(integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { cblas_zswap(*N, X, *incX, Y, *incY); return 0; } int f2c_zcopy(integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { cblas_zcopy(*N, X, *incX, Y, *incY); return 0; } int f2c_zaxpy(integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { cblas_zaxpy(*N, alpha, X, *incX, Y, *incY); return 0; } /* * Routines with S and D prefix only */ int f2c_srot(integer* N, real* X, integer* incX, real* Y, integer* incY, real* c, real* s) { cblas_srot(*N, X, *incX, Y, *incY, *c, *s); return 0; } int f2c_drot(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* c, doublereal* s) { cblas_drot(*N, X, *incX, Y, *incY, *c, *s); return 0; } /* * Routines with S D C Z CS and ZD prefixes */ int f2c_sscal(integer* N, real* alpha, real* X, integer* incX) { cblas_sscal(*N, *alpha, X, *incX); return 0; } int f2c_dscal(integer* N, doublereal* alpha, doublereal* X, integer* incX) { cblas_dscal(*N, *alpha, X, *incX); return 0; } int f2c_cscal(integer* N, complex* alpha, complex* X, integer* incX) { cblas_cscal(*N, alpha, X, *incX); return 0; } int f2c_zscal(integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX) { cblas_zscal(*N, alpha, X, *incX); return 0; } int f2c_csscal(integer* N, real* alpha, complex* X, integer* incX) { cblas_csscal(*N, *alpha, X, *incX); return 0; } int f2c_zdscal(integer* N, doublereal* alpha, doublecomplex* X, integer* incX) { cblas_zdscal(*N, *alpha, X, *incX); return 0; } /* * =========================================================================== * Prototypes for level 2 BLAS * =========================================================================== */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ int f2c_sgemv(char* trans, integer* M, integer* N, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY) { cblas_sgemv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_sgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, real *alpha, real *A, integer *lda, real *X, integer *incX, real *beta, real *Y, integer *incY) { cblas_sgbmv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, *KL, *KU, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_strmv(char* uplo, char *trans, char* diag, integer *N, real *A, integer *lda, real *X, integer *incX) { cblas_strmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_stbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, real* A, integer* lda, real* X, integer* incX) { cblas_stbmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_stpmv(char* uplo, char* trans, char* diag, integer* N, real* Ap, real* X, integer* incX) { cblas_stpmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_strsv(char* uplo, char* trans, char* diag, integer* N, real* A, integer* lda, real* X, integer* incX) { cblas_strsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_stbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, real* A, integer* lda, real* X, integer* incX) { cblas_stbsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_stpsv(char* uplo, char* trans, char* diag, integer* N, real* Ap, real* X, integer* incX) { cblas_stpsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_dgemv(char* trans, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { cblas_dgemv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_dgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, doublereal *alpha, doublereal *A, integer *lda, doublereal *X, integer *incX, doublereal *beta, doublereal *Y, integer *incY) { cblas_dgbmv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, *KL, *KU, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_dtrmv(char* uplo, char *trans, char* diag, integer *N, doublereal *A, integer *lda, doublereal *X, integer *incX) { cblas_dtrmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_dtbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublereal* A, integer* lda, doublereal* X, integer* incX) { cblas_dtbmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_dtpmv(char* uplo, char* trans, char* diag, integer* N, doublereal* Ap, doublereal* X, integer* incX) { cblas_dtpmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_dtrsv(char* uplo, char* trans, char* diag, integer* N, doublereal* A, integer* lda, doublereal* X, integer* incX) { cblas_dtrsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_dtbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublereal* A, integer* lda, doublereal* X, integer* incX) { cblas_dtbsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_dtpsv(char* uplo, char* trans, char* diag, integer* N, doublereal* Ap, doublereal* X, integer* incX) { cblas_dtpsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_cgemv(char* trans, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { cblas_cgemv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_cgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, complex *alpha, complex *A, integer *lda, complex *X, integer *incX, complex *beta, complex *Y, integer *incY) { cblas_cgbmv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, *KL, *KU, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_ctrmv(char* uplo, char *trans, char* diag, integer *N, complex *A, integer *lda, complex *X, integer *incX) { cblas_ctrmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_ctbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, complex* A, integer* lda, complex* X, integer* incX) { cblas_ctbmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_ctpmv(char* uplo, char* trans, char* diag, integer* N, complex* Ap, complex* X, integer* incX) { cblas_ctpmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_ctrsv(char* uplo, char* trans, char* diag, integer* N, complex* A, integer* lda, complex* X, integer* incX) { cblas_ctrsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_ctbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, complex* A, integer* lda, complex* X, integer* incX) { cblas_ctbsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_ctpsv(char* uplo, char* trans, char* diag, integer* N, complex* Ap, complex* X, integer* incX) { cblas_ctpsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_zgemv(char* trans, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { cblas_zgemv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_zgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, doublecomplex *alpha, doublecomplex *A, integer *lda, doublecomplex *X, integer *incX, doublecomplex *beta, doublecomplex *Y, integer *incY) { cblas_zgbmv(CblasColMajor, CVT_TRANSPOSE(*trans), *M, *N, *KL, *KU, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_ztrmv(char* uplo, char *trans, char* diag, integer *N, doublecomplex *A, integer *lda, doublecomplex *X, integer *incX) { cblas_ztrmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_ztbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX) { cblas_ztbmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_ztpmv(char* uplo, char* trans, char* diag, integer* N, doublecomplex* Ap, doublecomplex* X, integer* incX) { cblas_ztpmv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } int f2c_ztrsv(char* uplo, char* trans, char* diag, integer* N, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX) { cblas_ztrsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, A, *lda, X, *incX); return 0; } int f2c_ztbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX) { cblas_ztbsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, *K, A, *lda, X, *incX); return 0; } int f2c_ztpsv(char* uplo, char* trans, char* diag, integer* N, doublecomplex* Ap, doublecomplex* X, integer* incX) { cblas_ztpsv(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *N, Ap, X, *incX); return 0; } /* * Routines with S and D prefixes only */ int f2c_ssymv(char* uplo, integer* N, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY) { cblas_ssymv(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_ssbmv(char* uplo, integer* N, integer* K, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY) { cblas_ssbmv(CblasColMajor, CVT_UPLO(*uplo), *N, *K, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_sspmv(char* uplo, integer* N, real* alpha, real* Ap, real* X, integer* incX, real* beta, real* Y, integer* incY) { cblas_sspmv(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, Ap, X, *incX, *beta, Y, *incY); return 0; } int f2c_sger(integer* M, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A, integer* lda) { cblas_sger(CblasColMajor, *M, *N, *alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_ssyr(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* A, integer* lda) { cblas_ssyr(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, A, *lda); return 0; } int f2c_sspr(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Ap) { cblas_sspr(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Ap); return 0; } int f2c_ssyr2(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A, integer* lda) { cblas_ssyr2(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_sspr2(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A) { cblas_sspr2(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Y, *incY, A); return 0; } int f2c_dsymv(char* uplo, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { cblas_dsymv(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_dsbmv(char* uplo, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { cblas_dsbmv(CblasColMajor, CVT_UPLO(*uplo), *N, *K, *alpha, A, *lda, X, *incX, *beta, Y, *incY); return 0; } int f2c_dspmv(char* uplo, integer* N, doublereal* alpha, doublereal* Ap, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { cblas_dspmv(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, Ap, X, *incX, *beta, Y, *incY); return 0; } int f2c_dger(integer* M, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A, integer* lda) { cblas_dger(CblasColMajor, *M, *N, *alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_dsyr(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* A, integer* lda) { cblas_dsyr(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, A, *lda); return 0; } int f2c_dspr(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Ap) { cblas_dspr(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Ap); return 0; } int f2c_dsyr2(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A, integer* lda) { cblas_dsyr2(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_dspr2(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A) { cblas_dspr2(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Y, *incY, A); return 0; } /* * Routines with C and Z prefixes only */ int f2c_chemv(char* uplo, integer* N, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { cblas_chemv(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_chbmv(char* uplo, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { cblas_chbmv(CblasColMajor, CVT_UPLO(*uplo), *N, *K, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_chpmv(char* uplo, integer* N, complex* alpha, complex* Ap, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { cblas_chpmv(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, Ap, X, *incX, beta, Y, *incY); return 0; } int f2c_cgeru(integer* M, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda) { cblas_cgeru(CblasColMajor, *M, *N, alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_cgerc(integer* M, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda) { cblas_cgerc(CblasColMajor, *M, *N, alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_cher(char* uplo, integer* N, real* alpha, complex* X, integer* incX, complex* A, integer* lda) { cblas_cher(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, A, *lda); return 0; } int f2c_chpr(char* uplo, integer* N, real* alpha, complex* X, integer* incX, complex* Ap) { cblas_chpr(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Ap); return 0; } int f2c_cher2(char* uplo, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda) { cblas_cher2(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_chpr2(char* uplo, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* Ap) { cblas_chpr2(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, X, *incX, Y, *incY, Ap); return 0; } int f2c_zhemv(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { cblas_zhemv(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_zhbmv(char* uplo, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { cblas_zhbmv(CblasColMajor, CVT_UPLO(*uplo), *N, *K, alpha, A, *lda, X, *incX, beta, Y, *incY); return 0; } int f2c_zhpmv(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* Ap, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { cblas_zhpmv(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, Ap, X, *incX, beta, Y, *incY); return 0; } int f2c_zgeru(integer* M, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda) { cblas_zgeru(CblasColMajor, *M, *N, alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_zgerc(integer* M, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda) { cblas_zgerc(CblasColMajor, *M, *N, alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_zher(char* uplo, integer* N, doublereal* alpha, doublecomplex* X, integer* incX, doublecomplex* A, integer* lda) { cblas_zher(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, A, *lda); return 0; } int f2c_zhpr(char* uplo, integer* N, doublereal* alpha, doublecomplex* X, integer* incX, doublecomplex* Ap) { cblas_zhpr(CblasColMajor, CVT_UPLO(*uplo), *N, *alpha, X, *incX, Ap); return 0; } int f2c_zher2(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda) { cblas_zher2(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, X, *incX, Y, *incY, A, *lda); return 0; } int f2c_zhpr2(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* Ap) { cblas_zhpr2(CblasColMajor, CVT_UPLO(*uplo), *N, alpha, X, *incX, Y, *incY, Ap); return 0; } /* * =========================================================================== * Prototypes for level 3 BLAS * =========================================================================== */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ int f2c_sgemm(char* transA, char* transB, integer* M, integer* N, integer* K, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc) { cblas_sgemm(CblasColMajor, CVT_TRANSPOSE(*transA), CVT_TRANSPOSE(*transB), *M, *N, *K, *alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_ssymm(char* side, char* uplo, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc) { cblas_ssymm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), *M, *N, *alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_ssyrk(char* uplo, char* trans, integer* N, integer* K, real* alpha, real* A, integer* lda, real* beta, real* C, integer* ldc) { cblas_ssyrk(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, *alpha, A, *lda, *beta, C, *ldc); return 0; } int f2c_ssyr2k(char* uplo, char* trans, integer* N, integer* K, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc) { cblas_ssyr2k(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, *alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_strmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb) { cblas_strmm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, *alpha, A, *lda, B, *ldb); return 0; } int f2c_strsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb) { cblas_strsm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, *alpha, A, *lda, B, *ldb); return 0; } int f2c_dgemm(char* transA, char* transB, integer* M, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc) { cblas_dgemm(CblasColMajor, CVT_TRANSPOSE(*transA), CVT_TRANSPOSE(*transB), *M, *N, *K, *alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_dsymm(char* side, char* uplo, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc) { cblas_dsymm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), *M, *N, *alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_dsyrk(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* beta, doublereal* C, integer* ldc) { cblas_dsyrk(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, *alpha, A, *lda, *beta, C, *ldc); return 0; } int f2c_dsyr2k(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc) { cblas_dsyr2k(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, *alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_dtrmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb) { cblas_dtrmm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, *alpha, A, *lda, B, *ldb); return 0; } int f2c_dtrsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb) { cblas_dtrsm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, *alpha, A, *lda, B, *ldb); return 0; } int f2c_cgemm(char* transA, char* transB, integer* M, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { cblas_cgemm(CblasColMajor, CVT_TRANSPOSE(*transA), CVT_TRANSPOSE(*transB), *M, *N, *K, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_csymm(char* side, char* uplo, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { cblas_csymm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), *M, *N, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_csyrk(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* beta, complex* C, integer* ldc) { cblas_csyrk(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, alpha, A, *lda, beta, C, *ldc); return 0; } int f2c_csyr2k(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { cblas_csyr2k(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_ctrmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb) { cblas_ctrmm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, alpha, A, *lda, B, *ldb); return 0; } int f2c_ctrsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb) { cblas_ctrsm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, alpha, A, *lda, B, *ldb); return 0; } int f2c_zgemm(char* transA, char* transB, integer* M, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { cblas_zgemm(CblasColMajor, CVT_TRANSPOSE(*transA), CVT_TRANSPOSE(*transB), *M, *N, *K, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_zsymm(char* side, char* uplo, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { cblas_zsymm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), *M, *N, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_zsyrk(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* beta, doublecomplex* C, integer* ldc) { cblas_zsyrk(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, alpha, A, *lda, beta, C, *ldc); return 0; } int f2c_zsyr2k(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { cblas_zsyr2k(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_ztrmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb) { cblas_ztrmm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, alpha, A, *lda, B, *ldb); return 0; } int f2c_ztrsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb) { cblas_ztrsm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), CVT_DIAG(*diag), *M, *N, alpha, A, *lda, B, *ldb); return 0; } /* * Routines with prefixes C and Z only */ int f2c_chemm(char* side, char* uplo, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { cblas_chemm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), *M, *N, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_cherk(char* uplo, char* trans, integer* N, integer* K, real* alpha, complex* A, integer* lda, real* beta, complex* C, integer* ldc) { cblas_cherk(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, *alpha, A, *lda, *beta, C, *ldc); return 0; } int f2c_cher2k(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, real* beta, complex* C, integer* ldc) { cblas_cher2k(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } int f2c_zhemm(char* side, char* uplo, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { cblas_zhemm(CblasColMajor, CVT_SIDE(*side), CVT_UPLO(*uplo), *M, *N, alpha, A, *lda, B, *ldb, beta, C, *ldc); return 0; } int f2c_zherk(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublecomplex* A, integer* lda, doublereal* beta, doublecomplex* C, integer* ldc) { cblas_zherk(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, *alpha, A, *lda, *beta, C, *ldc); return 0; } int f2c_zher2k(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublereal* beta, doublecomplex* C, integer* ldc) { cblas_zher2k(CblasColMajor, CVT_UPLO(*uplo), CVT_TRANSPOSE(*trans), *N, *K, alpha, A, *lda, B, *ldb, *beta, C, *ldc); return 0; } starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/fblaswr.c000066400000000000000000001044341413463044200216570ustar00rootroot00000000000000#include "f2c.h" #include "fblaswr.h" /* * =========================================================================== * Prototypes for level 1 BLAS functions (complex are recast as routines) * =========================================================================== */ doublereal f2c_sdot(integer* N, real* X, integer* incX, real* Y, integer* incY) { return _starpu_sdot_(N, X, incX, Y, incY); } doublereal f2c_ddot(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY) { return _starpu_ddot_(N, X, incX, Y, incY); } /* * Functions having prefixes Z and C only */ void f2c_cdotu(complex* retval, integer* N, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_cdotu_(retval, N, X, incX, Y, incY); } void f2c_cdotc(complex* retval, integer* N, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_cdotc_(retval, N, X, incX, Y, incY); } void f2c_zdotu(doublecomplex* retval, integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_zdotu_(retval, N, X, incX, Y, incY); } void f2c_zdotc(doublecomplex* retval, integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_zdotc_(retval, N, X, incX, Y, incY); } /* * Functions having prefixes S D SC DZ */ doublereal f2c_snrm2(integer* N, real* X, integer* incX) { return _starpu_snrm2_(N, X, incX); } doublereal f2c_sasum(integer* N, real* X, integer* incX) { return _starpu_sasum_(N, X, incX); } doublereal f2c_dnrm2(integer* N, doublereal* X, integer* incX) { return _starpu_dnrm2_(N, X, incX); } doublereal f2c_dasum(integer* N, doublereal* X, integer* incX) { return _starpu_dasum_(N, X, incX); } doublereal f2c_scnrm2(integer* N, complex* X, integer* incX) { return _starpu_scnrm2_(N, X, incX); } doublereal f2c_scasum(integer* N, complex* X, integer* incX) { return _starpu_scasum_(N, X, incX); } doublereal f2c_dznrm2(integer* N, doublecomplex* X, integer* incX) { return _starpu_dznrm2_(N, X, incX); } doublereal f2c_dzasum(integer* N, doublecomplex* X, integer* incX) { return _starpu_dzasum_(N, X, incX); } /* * Functions having standard 4 prefixes (S D C Z) */ integer f2c_isamax(integer* N, real* X, integer* incX) { return _starpu_isamax_(N, X, incX); } integer f2c_idamax(integer* N, doublereal* X, integer* incX) { return _starpu_idamax_(N, X, incX); } integer f2c_icamax(integer* N, complex* X, integer* incX) { return _starpu_icamax_(N, X, incX); } integer f2c_izamax(integer* N, doublecomplex* X, integer* incX) { return _starpu_izamax_(N, X, incX); } /* * =========================================================================== * Prototypes for level 0 BLAS routines * =========================================================================== */ int f2c_srotg(real* a, real* b, real* c, real* s) { _starpu_srotg_(a, b, c, s); return 0; } int f2c_crotg(complex* CA, complex* CB, complex* C, real* S) { _starpu_crotg_(CA, CB, C, S); return 0; } int f2c_drotg(doublereal* a, doublereal* b, doublereal* c, doublereal* s) { _starpu_drotg_(a, b, c, s); return 0; } int f2c_zrotg(doublecomplex* CA, doublecomplex* CB, doublecomplex* C, doublereal* S) { _starpu_zrotg_(CA, CB, C, S); return 0; } /* * =========================================================================== * Prototypes for level 1 BLAS routines * =========================================================================== */ /* * Routines with standard 4 prefixes (s, d, c, z) */ int f2c_sswap(integer* N, real* X, integer* incX, real* Y, integer* incY) { _starpu_sswap_(N, X, incX, Y, incY); return 0; } int f2c_scopy(integer* N, real* X, integer* incX, real* Y, integer* incY) { _starpu_scopy_(N, X, incX, Y, incY); return 0; } int f2c_saxpy(integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY) { _starpu_saxpy_(N, alpha, X, incX, Y, incY); return 0; } int f2c_dswap(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY) { _starpu_dswap_(N, X, incX, Y, incY); return 0; } int f2c_dcopy(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY) { _starpu_dcopy_(N, X, incX, Y, incY); return 0; } int f2c_daxpy(integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY) { _starpu_daxpy_(N, alpha, X, incX, Y, incY); return 0; } int f2c_cswap(integer* N, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_cswap_(N, X, incX, Y, incY); return 0; } int f2c_ccopy(integer* N, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_ccopy_(N, X, incX, Y, incY); return 0; } int f2c_caxpy(integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY) { _starpu_caxpy_(N, alpha, X, incX, Y, incY); return 0; } int f2c_zswap(integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_zswap_(N, X, incX, Y, incY); return 0; } int f2c_zcopy(integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_zcopy_(N, X, incX, Y, incY); return 0; } int f2c_zaxpy(integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY) { _starpu_zaxpy_(N, alpha, X, incX, Y, incY); return 0; } /* * Routines with S and D prefix only */ int f2c_srot(integer* N, real* X, integer* incX, real* Y, integer* incY, real* c, real* s) { _starpu_srot_(N, X, incX, Y, incY, c, s); return 0; } int f2c_drot(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* c, doublereal* s) { _starpu_drot_(N, X, incX, Y, incY, c, s); return 0; } /* * Routines with S D C Z CS and ZD prefixes */ int f2c_sscal(integer* N, real* alpha, real* X, integer* incX) { _starpu_sscal_(N, alpha, X, incX); return 0; } int f2c_dscal(integer* N, doublereal* alpha, doublereal* X, integer* incX) { _starpu_dscal_(N, alpha, X, incX); return 0; } int f2c_cscal(integer* N, complex* alpha, complex* X, integer* incX) { _starpu_cscal_(N, alpha, X, incX); return 0; } int f2c_zscal(integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX) { _starpu_zscal_(N, alpha, X, incX); return 0; } int f2c_csscal(integer* N, real* alpha, complex* X, integer* incX) { _starpu_csscal_(N, alpha, X, incX); return 0; } int f2c_zdscal(integer* N, doublereal* alpha, doublecomplex* X, integer* incX) { _starpu_zdscal_(N, alpha, X, incX); return 0; } /* * =========================================================================== * Prototypes for level 2 BLAS * =========================================================================== */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ int f2c_sgemv(char* trans, integer* M, integer* N, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY) { _starpu_sgemv_(trans, M, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_sgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, real *alpha, real *A, integer *lda, real *X, integer *incX, real *beta, real *Y, integer *incY) { _starpu_sgbmv_(trans, M, N, KL, KU, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_strmv(char* uplo, char *trans, char* diag, integer *N, real *A, integer *lda, real *X, integer *incX) { _starpu_strmv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_stbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, real* A, integer* lda, real* X, integer* incX) { _starpu_stbmv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_stpmv(char* uplo, char* trans, char* diag, integer* N, real* Ap, real* X, integer* incX) { _starpu_stpmv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_strsv(char* uplo, char* trans, char* diag, integer* N, real* A, integer* lda, real* X, integer* incX) { _starpu_strsv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_stbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, real* A, integer* lda, real* X, integer* incX) { _starpu_stbsv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_stpsv(char* uplo, char* trans, char* diag, integer* N, real* Ap, real* X, integer* incX) { _starpu_stpsv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_dgemv(char* trans, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { _starpu_dgemv_(trans, M, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_dgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, doublereal *alpha, doublereal *A, integer *lda, doublereal *X, integer *incX, doublereal *beta, doublereal *Y, integer *incY) { _starpu_dgbmv_(trans, M, N, KL, KU, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_dtrmv(char* uplo, char *trans, char* diag, integer *N, doublereal *A, integer *lda, doublereal *X, integer *incX) { _starpu_dtrmv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_dtbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublereal* A, integer* lda, doublereal* X, integer* incX) { _starpu_dtbmv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_dtpmv(char* uplo, char* trans, char* diag, integer* N, doublereal* Ap, doublereal* X, integer* incX) { _starpu_dtpmv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_dtrsv(char* uplo, char* trans, char* diag, integer* N, doublereal* A, integer* lda, doublereal* X, integer* incX) { _starpu_dtrsv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_dtbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublereal* A, integer* lda, doublereal* X, integer* incX) { _starpu_dtbsv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_dtpsv(char* uplo, char* trans, char* diag, integer* N, doublereal* Ap, doublereal* X, integer* incX) { _starpu_dtpsv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_cgemv(char* trans, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { _starpu_cgemv_(trans, M, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_cgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, complex *alpha, complex *A, integer *lda, complex *X, integer *incX, complex *beta, complex *Y, integer *incY) { _starpu_cgbmv_(trans, M, N, KL, KU, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_ctrmv(char* uplo, char *trans, char* diag, integer *N, complex *A, integer *lda, complex *X, integer *incX) { _starpu_ctrmv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_ctbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, complex* A, integer* lda, complex* X, integer* incX) { _starpu_ctbmv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_ctpmv(char* uplo, char* trans, char* diag, integer* N, complex* Ap, complex* X, integer* incX) { _starpu_ctpmv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_ctrsv(char* uplo, char* trans, char* diag, integer* N, complex* A, integer* lda, complex* X, integer* incX) { _starpu_ctrsv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_ctbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, complex* A, integer* lda, complex* X, integer* incX) { _starpu_ctbsv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_ctpsv(char* uplo, char* trans, char* diag, integer* N, complex* Ap, complex* X, integer* incX) { _starpu_ctpsv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_zgemv(char* trans, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { _starpu_zgemv_(trans, M, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_zgbmv(char *trans, integer *M, integer *N, integer *KL, integer *KU, doublecomplex *alpha, doublecomplex *A, integer *lda, doublecomplex *X, integer *incX, doublecomplex *beta, doublecomplex *Y, integer *incY) { _starpu_zgbmv_(trans, M, N, KL, KU, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_ztrmv(char* uplo, char *trans, char* diag, integer *N, doublecomplex *A, integer *lda, doublecomplex *X, integer *incX) { _starpu_ztrmv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_ztbmv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX) { _starpu_ztbmv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_ztpmv(char* uplo, char* trans, char* diag, integer* N, doublecomplex* Ap, doublecomplex* X, integer* incX) { _starpu_ztpmv_(uplo, trans, diag, N, Ap, X, incX); return 0; } int f2c_ztrsv(char* uplo, char* trans, char* diag, integer* N, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX) { _starpu_ztrsv_(uplo, trans, diag, N, A, lda, X, incX); return 0; } int f2c_ztbsv(char* uplo, char* trans, char* diag, integer* N, integer* K, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX) { _starpu_ztbsv_(uplo, trans, diag, N, K, A, lda, X, incX); return 0; } int f2c_ztpsv(char* uplo, char* trans, char* diag, integer* N, doublecomplex* Ap, doublecomplex* X, integer* incX) { _starpu_ztpsv_(uplo, trans, diag, N, Ap, X, incX); return 0; } /* * Routines with S and D prefixes only */ int f2c_ssymv(char* uplo, integer* N, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY) { _starpu_ssymv_(uplo, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_ssbmv(char* uplo, integer* N, integer* K, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY) { _starpu_ssbmv_(uplo, N, K, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_sspmv(char* uplo, integer* N, real* alpha, real* Ap, real* X, integer* incX, real* beta, real* Y, integer* incY) { _starpu_sspmv_(uplo, N, alpha, Ap, X, incX, beta, Y, incY); return 0; } int f2c_sger(integer* M, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A, integer* lda) { _starpu_sger_(M, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_ssyr(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* A, integer* lda) { _starpu_ssyr_(uplo, N, alpha, X, incX, A, lda); return 0; } int f2c_sspr(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Ap) { _starpu_sspr_(uplo, N, alpha, X, incX, Ap); return 0; } int f2c_ssyr2(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A, integer* lda) { _starpu_ssyr2_(uplo, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_sspr2(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A) { _starpu_sspr2_(uplo, N, alpha, X, incX, Y, incY, A); return 0; } int f2c_dsymv(char* uplo, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { _starpu_dsymv_(uplo, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_dsbmv(char* uplo, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { _starpu_dsbmv_(uplo, N, K, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_dspmv(char* uplo, integer* N, doublereal* alpha, doublereal* Ap, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY) { _starpu_dspmv_(uplo, N, alpha, Ap, X, incX, beta, Y, incY); return 0; } int f2c_dger(integer* M, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A, integer* lda) { _starpu_dger_(M, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_dsyr(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* A, integer* lda) { _starpu_dsyr_(uplo, N, alpha, X, incX, A, lda); return 0; } int f2c_dspr(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Ap) { _starpu_dspr_(uplo, N, alpha, X, incX, Ap); return 0; } int f2c_dsyr2(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A, integer* lda) { _starpu_dsyr2_(uplo, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_dspr2(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A) { _starpu_dspr2_(uplo, N, alpha, X, incX, Y, incY, A); return 0; } /* * Routines with C and Z prefixes only */ int f2c_chemv(char* uplo, integer* N, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { _starpu_chemv_(uplo, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_chbmv(char* uplo, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { _starpu_chbmv_(uplo, N, K, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_chpmv(char* uplo, integer* N, complex* alpha, complex* Ap, complex* X, integer* incX, complex* beta, complex* Y, integer* incY) { _starpu_chpmv_(uplo, N, alpha, Ap, X, incX, beta, Y, incY); return 0; } int f2c_cgeru(integer* M, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda) { _starpu_cgeru_(M, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_cgerc(integer* M, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda) { _starpu_cgerc_(M, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_cher(char* uplo, integer* N, real* alpha, complex* X, integer* incX, complex* A, integer* lda) { _starpu_cher_(uplo, N, alpha, X, incX, A, lda); return 0; } int f2c_chpr(char* uplo, integer* N, real* alpha, complex* X, integer* incX, complex* Ap) { _starpu_chpr_(uplo, N, alpha, X, incX, Ap); return 0; } int f2c_cher2(char* uplo, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda) { _starpu_cher2_(uplo, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_chpr2(char* uplo, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* Ap) { _starpu_chpr2_(uplo, N, alpha, X, incX, Y, incY, Ap); return 0; } int f2c_zhemv(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { _starpu_zhemv_(uplo, N, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_zhbmv(char* uplo, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { _starpu_zhbmv_(uplo, N, K, alpha, A, lda, X, incX, beta, Y, incY); return 0; } int f2c_zhpmv(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* Ap, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY) { _starpu_zhpmv_(uplo, N, alpha, Ap, X, incX, beta, Y, incY); return 0; } int f2c_zgeru(integer* M, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda) { _starpu_zgeru_(M, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_zgerc(integer* M, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda) { _starpu_zgerc_(M, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_zher(char* uplo, integer* N, doublereal* alpha, doublecomplex* X, integer* incX, doublecomplex* A, integer* lda) { _starpu_zher_(uplo, N, alpha, X, incX, A, lda); return 0; } int f2c_zhpr(char* uplo, integer* N, doublereal* alpha, doublecomplex* X, integer* incX, doublecomplex* Ap) { _starpu_zhpr_(uplo, N, alpha, X, incX, Ap); return 0; } int f2c_zher2(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda) { _starpu_zher2_(uplo, N, alpha, X, incX, Y, incY, A, lda); return 0; } int f2c_zhpr2(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* Ap) { _starpu_zhpr2_(uplo, N, alpha, X, incX, Y, incY, Ap); return 0; } /* * =========================================================================== * Prototypes for level 3 BLAS * =========================================================================== */ /* * Routines with standard 4 prefixes (S, D, C, Z) */ int f2c_sgemm(char* transA, char* transB, integer* M, integer* N, integer* K, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc) { _starpu_sgemm_(transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_ssymm(char* side, char* uplo, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc) { _starpu_ssymm_(side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_ssyrk(char* uplo, char* trans, integer* N, integer* K, real* alpha, real* A, integer* lda, real* beta, real* C, integer* ldc) { _starpu_ssyrk_(uplo, trans, N, K, alpha, A, lda, beta, C, ldc); return 0; } int f2c_ssyr2k(char* uplo, char* trans, integer* N, integer* K, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc) { _starpu_ssyr2k_(uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_strmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb) { _starpu_strmm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_strsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb) { _starpu_strsm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_dgemm(char* transA, char* transB, integer* M, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc) { _starpu_dgemm_(transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_dsymm(char* side, char* uplo, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc) { _starpu_dsymm_(side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_dsyrk(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* beta, doublereal* C, integer* ldc) { _starpu_dsyrk_(uplo, trans, N, K, alpha, A, lda, beta, C, ldc); return 0; } int f2c_dsyr2k(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc) { _starpu_dsyr2k_(uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_dtrmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb) { _starpu_dtrmm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_dtrsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb) { _starpu_dtrsm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_cgemm(char* transA, char* transB, integer* M, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { _starpu_cgemm_(transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_csymm(char* side, char* uplo, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { _starpu_csymm_(side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_csyrk(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* beta, complex* C, integer* ldc) { _starpu_csyrk_(uplo, trans, N, K, alpha, A, lda, beta, C, ldc); return 0; } int f2c_csyr2k(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { _starpu_csyr2k_(uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_ctrmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb) { _starpu_ctrmm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_ctrsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb) { _starpu_ctrsm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_zgemm(char* transA, char* transB, integer* M, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { _starpu_zgemm_(transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_zsymm(char* side, char* uplo, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { _starpu_zsymm_(side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_zsyrk(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* beta, doublecomplex* C, integer* ldc) { _starpu_zsyrk_(uplo, trans, N, K, alpha, A, lda, beta, C, ldc); return 0; } int f2c_zsyr2k(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { _starpu_zsyr2k_(uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_ztrmm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb) { _starpu_ztrmm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } int f2c_ztrsm(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb) { _starpu_ztrsm_(side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb); return 0; } /* * Routines with prefixes C and Z only */ int f2c_chemm(char* side, char* uplo, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc) { _starpu_chemm_(side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_cherk(char* uplo, char* trans, integer* N, integer* K, real* alpha, complex* A, integer* lda, real* beta, complex* C, integer* ldc) { _starpu_cherk_(uplo, trans, N, K, alpha, A, lda, beta, C, ldc); return 0; } int f2c_cher2k(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, real* beta, complex* C, integer* ldc) { _starpu_cher2k_(uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_zhemm(char* side, char* uplo, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc) { _starpu_zhemm_(side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } int f2c_zherk(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublecomplex* A, integer* lda, doublereal* beta, doublecomplex* C, integer* ldc) { _starpu_zherk_(uplo, trans, N, K, alpha, A, lda, beta, C, ldc); return 0; } int f2c_zher2k(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublereal* beta, doublecomplex* C, integer* ldc) { _starpu_zher2k_(uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc); return 0; } starpu-1.3.9+dfsg/min-dgels/base/BLAS/WRAP/fblaswr.h000066400000000000000000000517421413463044200216670ustar00rootroot00000000000000real _starpu_sdot_(integer* N, real* X, integer* incX, real* Y, integer* incY); doublereal _starpu_ddot_(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY); void _starpu_cdotu_(complex* retval, integer* N, complex* X, integer* incX, complex* Y, integer* incY); void _starpu_cdotc_(complex* retval, integer* N, complex* X, integer* incX, complex* Y, integer* incY); void _starpu_zdotu_(doublecomplex* retval, integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY); void _starpu_zdotc_(doublecomplex* retval, integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY); real _starpu_snrm2_(integer* N, real* X, integer* incX); real _starpu_sasum_(integer* N, real* X, integer* incX); doublereal _starpu_dnrm2_(integer* N, doublereal* X, integer* incX); doublereal _starpu_dasum_(integer* N, doublereal* X, integer* incX); real _starpu_scnrm2_(integer* N, complex* X, integer* incX); real _starpu_scasum_(integer* N, complex* X, integer* incX); doublereal _starpu_dznrm2_(integer* N, doublecomplex* X, integer* incX); doublereal _starpu_dzasum_(integer* N, doublecomplex* X, integer* incX); integer _starpu_isamax_(integer* N, real* X, integer* incX); integer _starpu_idamax_(integer* N, doublereal* X, integer* incX); integer _starpu_icamax_(integer* N, complex* X, integer* incX); integer _starpu_izamax_(integer* N, doublecomplex* X, integer* incX); int _starpu_sswap_(integer* N, real* X, integer* incX, real* Y, integer* incY); int _starpu_scopy_(integer* N, real* X, integer* incX, real* Y, integer* incY); int _starpu_saxpy_(integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY); int _starpu_dswap_(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY); int _starpu_dcopy_(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY); int _starpu_daxpy_(integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY); int _starpu_cswap_(integer* N, complex* X, integer* incX, complex* Y, integer* incY); int _starpu_ccopy_(integer* N, complex* X, integer* incX, complex* Y, integer* incY); int _starpu_caxpy_(integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY); int _starpu_zswap_(integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY); int _starpu_zcopy_(integer* N, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY); int _starpu_zaxpy_(integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY); int _starpu_srotg_(real* a, real* b, real* c, real* s); int _starpu_srot_(integer* N, real* X, integer* incX, real* Y, integer* incY, real* c, real* s); int _starpu_crotg_(complex* a, complex* b, complex* c, complex* s); int _starpu_drotg_(doublereal* a, doublereal* b, doublereal* c, doublereal* s); int _starpu_drot_(integer* N, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* c, doublereal* s); int _starpu_zrotg_(doublecomplex* a, doublecomplex* b, doublecomplex* c, doublecomplex* s); int _starpu_sscal_(integer* N, real* alpha, real* X, integer* incX); int _starpu_dscal_(integer* N, doublereal* alpha, doublereal* X, integer* incX); int _starpu_cscal_(integer* N, complex* alpha, complex* X, integer* incX); int _starpu_zscal_(integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX); int _starpu_csscal_(integer* N, real* alpha, complex* X, integer* incX); int _starpu_zdscal_(integer* N, doublereal* alpha, doublecomplex* X, integer* incX); int _starpu_sgemv_(char* trans, integer* M, integer* N, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY); int _starpu_sgbmv_(char *trans, integer *M, integer *N, integer *KL, integer *KU, real *alpha, real *A, integer *lda, real *X, integer *incX, real *beta, real *Y, integer *incY); int _starpu_strmv_(char* uplo, char *trans, char* diag, integer *N, real *A, integer *lda, real *X, integer *incX); int _starpu_stbmv_(char* uplo, char* trans, char* diag, integer* N, integer* K, real* A, integer* lda, real* X, integer* incX); int _starpu_stpmv_(char* uplo, char* trans, char* diag, integer* N, real* Ap, real* X, integer* incX); int _starpu_strsv_(char* uplo, char* trans, char* diag, integer* N, real* A, integer* lda, real* X, integer* incX); int _starpu_stbsv_(char* uplo, char* trans, char* diag, integer* N, integer* K, real* A, integer* lda, real* X, integer* incX); int _starpu_stpsv_(char* uplo, char* trans, char* diag, integer* N, real* Ap, real* X, integer* incX); int _starpu_dgemv_(char* trans, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY); int _starpu_dgbmv_(char *trans, integer *M, integer *N, integer *KL, integer *KU, doublereal *alpha, doublereal *A, integer *lda, doublereal *X, integer *incX, doublereal *beta, doublereal *Y, integer *incY); int _starpu_dtrmv_(char* uplo, char *trans, char* diag, integer *N, doublereal *A, integer *lda, doublereal *X, integer *incX); int _starpu_dtbmv_(char* uplo, char* trans, char* diag, integer* N, integer* K, doublereal* A, integer* lda, doublereal* X, integer* incX); int _starpu_dtpmv_(char* uplo, char* trans, char* diag, integer* N, doublereal* Ap, doublereal* X, integer* incX); int _starpu_dtrsv_(char* uplo, char* trans, char* diag, integer* N, doublereal* A, integer* lda, doublereal* X, integer* incX); int _starpu_dtbsv_(char* uplo, char* trans, char* diag, integer* N, integer* K, doublereal* A, integer* lda, doublereal* X, integer* incX); int _starpu_dtpsv_(char* uplo, char* trans, char* diag, integer* N, doublereal* Ap, doublereal* X, integer* incX); int _starpu_cgemv_(char* trans, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY); int _starpu_cgbmv_(char *trans, integer *M, integer *N, integer *KL, integer *KU, complex *alpha, complex *A, integer *lda, complex *X, integer *incX, complex *beta, complex *Y, integer *incY); int _starpu_ctrmv_(char* uplo, char *trans, char* diag, integer *N, complex *A, integer *lda, complex *X, integer *incX); int _starpu_ctbmv_(char* uplo, char* trans, char* diag, integer* N, integer* K, complex* A, integer* lda, complex* X, integer* incX); int _starpu_ctpmv_(char* uplo, char* trans, char* diag, integer* N, complex* Ap, complex* X, integer* incX); int _starpu_ctrsv_(char* uplo, char* trans, char* diag, integer* N, complex* A, integer* lda, complex* X, integer* incX); int _starpu_ctbsv_(char* uplo, char* trans, char* diag, integer* N, integer* K, complex* A, integer* lda, complex* X, integer* incX); int _starpu_ctpsv_(char* uplo, char* trans, char* diag, integer* N, complex* Ap, complex* X, integer* incX); int _starpu_zgemv_(char* trans, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY); int _starpu_zgbmv_(char *trans, integer *M, integer *N, integer *KL, integer *KU, doublecomplex *alpha, doublecomplex *A, integer *lda, doublecomplex *X, integer *incX, doublecomplex *beta, doublecomplex *Y, integer *incY); int _starpu_ztrmv_(char* uplo, char *trans, char* diag, integer *N, doublecomplex *A, integer *lda, doublecomplex *X, integer *incX); int _starpu_ztbmv_(char* uplo, char* trans, char* diag, integer* N, integer* K, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX); void _starpu_ztpmv_(char* uplo, char* trans, char* diag, integer* N, doublecomplex* Ap, doublecomplex* X, integer* incX); int _starpu_ztrsv_(char* uplo, char* trans, char* diag, integer* N, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX); int _starpu_ztbsv_(char* uplo, char* trans, char* diag, integer* N, integer* K, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX); int _starpu_ztpsv_(char* uplo, char* trans, char* diag, integer* N, doublecomplex* Ap, doublecomplex* X, integer* incX); int _starpu_ssymv_(char* uplo, integer* N, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY); int _starpu_ssbmv_(char* uplo, integer* N, integer* K, real* alpha, real* A, integer* lda, real* X, integer* incX, real* beta, real* Y, integer* incY); int _starpu_sspmv_(char* uplo, integer* N, real* alpha, real* Ap, real* X, integer* incX, real* beta, real* Y, integer* incY); int _starpu_sger_(integer* M, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A, integer* lda); int _starpu_ssyr_(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* A, integer* lda); int _starpu_sspr_(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Ap); int _starpu_ssyr2_(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A, integer* lda); int _starpu_sspr2_(char* uplo, integer* N, real* alpha, real* X, integer* incX, real* Y, integer* incY, real* A); int _starpu_dsymv_(char* uplo, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY); int _starpu_dsbmv_(char* uplo, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY); int _starpu_dspmv_(char* uplo, integer* N, doublereal* alpha, doublereal* Ap, doublereal* X, integer* incX, doublereal* beta, doublereal* Y, integer* incY); int _starpu_dger_(integer* M, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A, integer* lda); int _starpu_dsyr_(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* A, integer* lda); int _starpu_dspr_(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Ap); int _starpu_dsyr2_(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A, integer* lda); int _starpu_dspr2_(char* uplo, integer* N, doublereal* alpha, doublereal* X, integer* incX, doublereal* Y, integer* incY, doublereal* A); int _starpu_chemv_(char* uplo, integer* N, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY); int _starpu_chbmv_(char* uplo, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* X, integer* incX, complex* beta, complex* Y, integer* incY); int _starpu_chpmv_(char* uplo, integer* N, complex* alpha, complex* Ap, complex* X, integer* incX, complex* beta, complex* Y, integer* incY); int _starpu_cgeru_(integer* M, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda); int _starpu_cgerc_(integer* M, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda); int _starpu_cher_(char* uplo, integer* N, real* alpha, complex* X, integer* incX, complex* A, integer* lda); int _starpu_chpr_(char* uplo, integer* N, real* alpha, complex* X, integer* incX, complex* Ap); int _starpu_cher2_(char* uplo, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* A, integer* lda); int _starpu_chpr2_(char* uplo, integer* N, complex* alpha, complex* X, integer* incX, complex* Y, integer* incY, complex* Ap); int _starpu_zhemv_(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY); int _starpu_zhbmv_(char* uplo, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY); int _starpu_zhpmv_(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* Ap, doublecomplex* X, integer* incX, doublecomplex* beta, doublecomplex* Y, integer* incY); int _starpu_zgeru_(integer* M, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda); int _starpu_zgerc_(integer* M, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda); int _starpu_zher_(char* uplo, integer* N, doublereal* alpha, doublecomplex* X, integer* incX, doublecomplex* A, integer* lda); int _starpu_zhpr_(char* uplo, integer* N, doublereal* alpha, doublecomplex* X, integer* incX, doublecomplex* Ap); int _starpu_zher2_(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* A, integer* lda); int _starpu_zhpr2_(char* uplo, integer* N, doublecomplex* alpha, doublecomplex* X, integer* incX, doublecomplex* Y, integer* incY, doublecomplex* Ap); int _starpu_sgemm_(char* transA, char* transB, integer* M, integer* N, integer* K, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc); int _starpu_ssymm_(char* side, char* uplo, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc); int _starpu_ssyrk_(char* uplo, char* trans, integer* N, integer* K, real* alpha, real* A, integer* lda, real* beta, real* C, integer* ldc); int _starpu_ssyr2k_(char* uplo, char* trans, integer* N, integer* K, real* alpha, real* A, integer* lda, real* B, integer* ldb, real* beta, real* C, integer* ldc); int _starpu_strmm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb); int _starpu_strsm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, real* alpha, real* A, integer* lda, real* B, integer* ldb); int _starpu_dgemm_(char* transA, char* transB, integer* M, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc); int _starpu_dsymm_(char* side, char* uplo, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc); int _starpu_dsyrk_(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* beta, doublereal* C, integer* ldc); int _starpu_dsyr2k_(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb, doublereal* beta, doublereal* C, integer* ldc); int _starpu_dtrmm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb); int _starpu_dtrsm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublereal* alpha, doublereal* A, integer* lda, doublereal* B, integer* ldb); int _starpu_cgemm_(char* transA, char* transB, integer* M, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc); int _starpu_csymm_(char* side, char* uplo, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc); int _starpu_csyrk_(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* beta, complex* C, integer* ldc); int _starpu_csyr2k_(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc); int _starpu_ctrmm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb); int _starpu_ctrsm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb); int _starpu_zgemm_(char* transA, char* transB, integer* M, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc); int _starpu_zsymm_(char* side, char* uplo, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc); int _starpu_zsyrk_(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* beta, doublecomplex* C, integer* ldc); int _starpu_zsyr2k_(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc); int _starpu_ztrmm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb); int _starpu_ztrsm_(char* side, char* uplo, char* trans, char* diag, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb); int _starpu_chemm_(char* side, char* uplo, integer* M, integer* N, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, complex* beta, complex* C, integer* ldc); int _starpu_cherk_(char* uplo, char* trans, integer* N, integer* K, real* alpha, complex* A, integer* lda, real* beta, complex* C, integer* ldc); int _starpu_cher2k_(char* uplo, char* trans, integer* N, integer* K, complex* alpha, complex* A, integer* lda, complex* B, integer* ldb, real* beta, complex* C, integer* ldc); int _starpu_zhemm_(char* side, char* uplo, integer* M, integer* N, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublecomplex* beta, doublecomplex* C, integer* ldc); int _starpu_zherk_(char* uplo, char* trans, integer* N, integer* K, doublereal* alpha, doublecomplex* A, integer* lda, doublereal* beta, doublecomplex* C, integer* ldc); int _starpu_zher2k_(char* uplo, char* trans, integer* N, integer* K, doublecomplex* alpha, doublecomplex* A, integer* lda, doublecomplex* B, integer* ldb, doublereal* beta, doublecomplex* C, integer* ldc); starpu-1.3.9+dfsg/min-dgels/base/BLAS/dblat2.in000066400000000000000000000026721413463044200210030ustar00rootroot00000000000000'dblat2.out' NAME OF SUMMARY OUTPUT FILE 6 UNIT NUMBER OF SUMMARY FILE 'DBLAT2.SNAP' NAME OF SNAPSHOT OUTPUT FILE -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0) F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD. F LOGICAL FLAG, T TO STOP ON FAILURES. T LOGICAL FLAG, T TO TEST ERROR EXITS. 16.0 THRESHOLD VALUE OF TEST RATIO 6 NUMBER OF VALUES OF N 0 1 2 3 5 9 VALUES OF N 4 NUMBER OF VALUES OF K 0 1 2 4 VALUES OF K 4 NUMBER OF VALUES OF INCX AND INCY 1 2 -1 -2 VALUES OF INCX AND INCY 3 NUMBER OF VALUES OF ALPHA 0.0 1.0 0.7 VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA 0.0 1.0 0.9 VALUES OF BETA DGEMV T PUT F FOR NO TEST. SAME COLUMNS. DGBMV T PUT F FOR NO TEST. SAME COLUMNS. DSYMV T PUT F FOR NO TEST. SAME COLUMNS. DSBMV T PUT F FOR NO TEST. SAME COLUMNS. DSPMV T PUT F FOR NO TEST. SAME COLUMNS. DTRMV T PUT F FOR NO TEST. SAME COLUMNS. DTBMV T PUT F FOR NO TEST. SAME COLUMNS. DTPMV T PUT F FOR NO TEST. SAME COLUMNS. DTRSV T PUT F FOR NO TEST. SAME COLUMNS. DTBSV T PUT F FOR NO TEST. SAME COLUMNS. DTPSV T PUT F FOR NO TEST. SAME COLUMNS. DGER T PUT F FOR NO TEST. SAME COLUMNS. DSYR T PUT F FOR NO TEST. SAME COLUMNS. DSPR T PUT F FOR NO TEST. SAME COLUMNS. DSYR2 T PUT F FOR NO TEST. SAME COLUMNS. DSPR2 T PUT F FOR NO TEST. SAME COLUMNS. starpu-1.3.9+dfsg/min-dgels/base/BLAS/dblat3.in000066400000000000000000000015621413463044200210010ustar00rootroot00000000000000'dblat3.out' NAME OF SUMMARY OUTPUT FILE 6 UNIT NUMBER OF SUMMARY FILE 'DBLAT3.SNAP' NAME OF SNAPSHOT OUTPUT FILE -1 UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0) F LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD. F LOGICAL FLAG, T TO STOP ON FAILURES. T LOGICAL FLAG, T TO TEST ERROR EXITS. 16.0 THRESHOLD VALUE OF TEST RATIO 6 NUMBER OF VALUES OF N 0 1 2 3 5 9 VALUES OF N 3 NUMBER OF VALUES OF ALPHA 0.0 1.0 0.7 VALUES OF ALPHA 3 NUMBER OF VALUES OF BETA 0.0 1.0 1.3 VALUES OF BETA DGEMM T PUT F FOR NO TEST. SAME COLUMNS. DSYMM T PUT F FOR NO TEST. SAME COLUMNS. DTRMM T PUT F FOR NO TEST. SAME COLUMNS. DTRSM T PUT F FOR NO TEST. SAME COLUMNS. DSYRK T PUT F FOR NO TEST. SAME COLUMNS. DSYR2K T PUT F FOR NO TEST. SAME COLUMNS. starpu-1.3.9+dfsg/min-dgels/base/COPYING000066400000000000000000000031071413463044200176070ustar00rootroot00000000000000Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. $COPYRIGHT$ Additional copyrights may follow $HEADER$ 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 listed in this license in the documentation and/or other materials provided with the distribution. - Neither the name of the copyright holders 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 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. starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/000077500000000000000000000000001413463044200175775ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/000077500000000000000000000000001413463044200207405ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/Makefile000066400000000000000000000160201413463044200223770ustar00rootroot00000000000000 TOPDIR=../.. include $(TOPDIR)/make.inc # Unix makefile: see README. # For C++, first "make hadd". # If your compiler does not recognize ANSI C, add # -DKR_headers # to the CFLAGS = line below. # On Sun and other BSD systems that do not provide an ANSI sprintf, add # -DUSE_STRLEN # to the CFLAGS = line below. # On Linux systems, add # -DNON_UNIX_STDIO # to the CFLAGS = line below. For libf2c.so under Linux, also add # -fPIC # to the CFLAGS = line below. .SUFFIXES: .c .o # compile, then strip unnecessary symbols .c.o: $(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c $(LD) -r -x -o $*.xxx $*.o mv $*.xxx $*.o ## Under Solaris (and other systems that do not understand ld -x), ## omit -x in the ld line above. ## If your system does not have the ld command, comment out ## or remove both the ld and mv lines above. MISC = f77vers.o i77vers.o main.o s_rnge.o abort_.o exit_.o getarg_.o iargc_.o\ getenv_.o signal_.o s_stop.o s_paus.o system_.o cabs.o ctype.o\ derf_.o derfc_.o erf_.o erfc_.o sig_die.o uninit.o POW = pow_ci.o pow_dd.o pow_di.o pow_hh.o pow_ii.o pow_ri.o pow_zi.o pow_zz.o CX = c_abs.o c_cos.o c_div.o c_exp.o c_log.o c_sin.o c_sqrt.o DCX = z_abs.o z_cos.o z_div.o z_exp.o z_log.o z_sin.o z_sqrt.o REAL = r_abs.o r_acos.o r_asin.o r_atan.o r_atn2.o r_cnjg.o r_cos.o\ r_cosh.o r_dim.o r_exp.o r_imag.o r_int.o\ r_lg10.o r_log.o r_mod.o r_nint.o r_sign.o\ r_sin.o r_sinh.o r_sqrt.o r_tan.o r_tanh.o DBL = d_abs.o d_acos.o d_asin.o d_atan.o d_atn2.o\ d_cnjg.o d_cos.o d_cosh.o d_dim.o d_exp.o\ d_imag.o d_int.o d_lg10.o d_log.o d_mod.o\ d_nint.o d_prod.o d_sign.o d_sin.o d_sinh.o\ d_sqrt.o d_tan.o d_tanh.o INT = i_abs.o i_dim.o i_dnnt.o i_indx.o i_len.o i_len_trim.o i_mod.o i_nint.o i_sign.o\ lbitbits.o lbitshft.o i_ceiling.o HALF = h_abs.o h_dim.o h_dnnt.o h_indx.o h_len.o h_mod.o h_nint.o h_sign.o CMP = l_ge.o l_gt.o l_le.o l_lt.o hl_ge.o hl_gt.o hl_le.o hl_lt.o EFL = ef1asc_.o ef1cmc_.o CHAR = f77_aloc.o s_cat.o s_cmp.o s_copy.o I77 = backspac.o close.o dfe.o dolio.o due.o endfile.o err.o\ fmt.o fmtlib.o ftell_.o iio.o ilnw.o inquire.o lread.o lwrite.o\ open.o rdfmt.o rewind.o rsfe.o rsli.o rsne.o sfe.o sue.o\ typesize.o uio.o util.o wref.o wrtfmt.o wsfe.o wsle.o wsne.o xwsne.o QINT = pow_qq.o qbitbits.o qbitshft.o ftell64_.o TIME = dtime_.o etime_.o # If you get an error compiling dtime_.c or etime_.c, try adding # -DUSE_CLOCK to the CFLAGS assignment above; if that does not work, # omit $(TIME) from OFILES = assignment below. # To get signed zeros in write statements on IEEE-arithmetic systems, # add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.o # to the end of the OFILES = assignment below. # For INTEGER*8 support (which requires system-dependent adjustments to # f2c.h), add $(QINT) to the OFILES = assignment below... OFILES = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \ $(HALF) $(CMP) $(EFL) $(CHAR) $(I77) $(TIME) all: f2c.h signal1.h sysdep1.h libminf2c.a libminf2c.a: $(OFILES) $(ARCH) $(ARCHFLAGS) $(F2CLIB) $? $(RANLIB) $(F2CLIB) ## Shared-library variant: the following rule works on Linux ## systems. Details are system-dependent. Under Linux, -fPIC ## must appear in the CFLAGS assignment when making libf2c.so. ## Under Solaris, use -Kpic in CFLAGS and use "ld -G" instead ## of "cc -shared". libf2c.so: $(OFILES) $(CC) -shared -o libf2c.so $(OFILES) ### If your system lacks ranlib, you don't need it; see README. f77vers.o: f77vers.c $(CC) -c f77vers.c i77vers.o: i77vers.c $(CC) -c i77vers.c # To get an "f2c.h" for use with "f2c -C++", first "make hadd" hadd: f2c.h0 f2ch.add cat f2c.h0 f2ch.add >f2c.h # For use with "f2c" and "f2c -A": f2c.h: f2c.h0 cp f2c.h0 f2c.h # You may need to adjust signal1.h and sysdep1.h suitably for your system... signal1.h: signal1.h0 cp signal1.h0 signal1.h sysdep1.h: sysdep1.h0 cp sysdep1.h0 sysdep1.h # If your system lacks onexit() and you are not using an # ANSI C compiler, then you should uncomment the following # two lines (for compiling main.o): #main.o: main.c # $(CC) -c -DNO_ONEXIT -DSkip_f2c_Undefs main.c # On at least some Sun systems, it is more appropriate to # uncomment the following two lines: #main.o: main.c # $(CC) -c -Donexit=on_exit -DSkip_f2c_Undefs main.c clean: rm -f libminf2c.a *.o arith.h signal1.h sysdep1.h backspac.o: fio.h close.o: fio.h dfe.o: fio.h dfe.o: fmt.h due.o: fio.h endfile.o: fio.h rawio.h err.o: fio.h rawio.h fmt.o: fio.h fmt.o: fmt.h iio.o: fio.h iio.o: fmt.h ilnw.o: fio.h ilnw.o: lio.h inquire.o: fio.h lread.o: fio.h lread.o: fmt.h lread.o: lio.h lread.o: fp.h lwrite.o: fio.h lwrite.o: fmt.h lwrite.o: lio.h open.o: fio.h rawio.h rdfmt.o: fio.h rdfmt.o: fmt.h rdfmt.o: fp.h rewind.o: fio.h rsfe.o: fio.h rsfe.o: fmt.h rsli.o: fio.h rsli.o: lio.h rsne.o: fio.h rsne.o: lio.h sfe.o: fio.h signbit.o: arith.h sue.o: fio.h uio.o: fio.h uninit.o: arith.h util.o: fio.h wref.o: fio.h wref.o: fmt.h wref.o: fp.h wrtfmt.o: fio.h wrtfmt.o: fmt.h wsfe.o: fio.h wsfe.o: fmt.h wsle.o: fio.h wsle.o: fmt.h wsle.o: lio.h wsne.o: fio.h wsne.o: lio.h xwsne.o: fio.h xwsne.o: lio.h xwsne.o: fmt.h main.o: signal1.h signal_.o: signal1.h s_paus.o: signal1.h err.o: sysdep1.h fio.h: sysdep1.h util.c: sysdep1.h arith.h: arithchk.c $(CC) $(CFLAGS) -DNO_FPINIT arithchk.c -lm ||\ $(CC) -DNO_LONG_LONG $(CFLAGS) -DNO_FPINIT arithchk.c -lm ./a.out >arith.h rm -f a.out arithchk.o check: xsum Notice README abort_.c arithchk.c backspac.c c_abs.c c_cos.c \ c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c close.c comptry.bat \ ctype.c ctype.h \ d_abs.c d_acos.c d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c \ d_dim.c d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c \ d_nint.c d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c \ d_tanh.c derf_.c derfc_.c dfe.c dolio.c dtime_.c due.c ef1asc_.c \ ef1cmc_.c endfile.c erf_.c erfc_.c err.c etime_.c exit_.c f2c.h0 \ f2ch.add f77_aloc.c f77vers.c fio.h fmt.c fmt.h fmtlib.c \ fp.h ftell_.c ftell64_.c i_ceiling.c \ getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \ h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ i77vers.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_len_trim.c i_mod.c \ i_nint.c i_sign.c iargc_.c iio.c ilnw.c inquire.c l_ge.c l_gt.c \ l_le.c l_lt.c lbitbits.c lbitshft.c libf2c.lbc libf2c.sy lio.h \ lread.c lwrite.c main.c makefile.sy makefile.u makefile.vc \ makefile.wat math.hvc mkfile.plan9 open.c pow_ci.c pow_dd.c \ pow_di.c pow_hh.c pow_ii.c pow_qq.c pow_ri.c pow_zi.c pow_zz.c \ qbitbits.c qbitshft.c r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \ r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \ r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \ r_tan.c r_tanh.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c \ s_cat.c s_cmp.c s_copy.c s_paus.c s_rnge.c s_stop.c scomptry.bat sfe.c \ sig_die.c signal1.h0 signal_.c signbit.c sue.c sysdep1.h0 system_.c \ typesize.c \ uio.c uninit.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c xwsne.c \ z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >xsum1.out cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/Notice000066400000000000000000000022741413463044200221110ustar00rootroot00000000000000/**************************************************************** Copyright 1990 - 1997 by AT&T, Lucent Technologies and Bellcore. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the names of AT&T, Bell Laboratories, Lucent or Bellcore or any of their entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. AT&T, Lucent and Bellcore disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall AT&T, Lucent or Bellcore be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. ****************************************************************/ starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/README000066400000000000000000000407541413463044200216320ustar00rootroot00000000000000As shipped, "makefile" is a copy of "makefile.u", a Unix makefile. Variants for other systems have names of the form makefile.* and have initial comments saying how to invoke them. You may wish to copy one of the other makefile.* files to makefile. If you use a C++ compiler, first say make hadd to create a suitable f2c.h from f2c.h0 and f2ch.add. Otherwise, make f2c.h will just copy f2c.h0 to f2c.h . If your compiler does not recognize ANSI C headers, compile with KR_headers defined: either add -DKR_headers to the definition of CFLAGS in the makefile, or insert #define KR_headers at the top of f2c.h . If your system lacks onexit() and you are not using an ANSI C compiler, then you should compile main.c with NO_ONEXIT defined. See the comments about onexit in makefile.u. If your system has a double drem() function such that drem(a,b) is the IEEE remainder function (with double a, b), then you may wish to compile r_mod.c and d_mod.c with IEEE_drem defined. To check for transmission errors, issue the command make check or make -f makefile.u check This assumes you have the xsum program whose source, xsum.c, is distributed as part of "all from f2c/src", and that it is installed somewhere in your search path. If you do not have xsum, you can obtain xsum.c by sending the following E-mail message to netlib@netlib.bell-labs.com send xsum.c from f2c/src For convenience, the f2c.h0 in this directory is a copy of netlib's "f2c.h from f2c". It is best to install f2c.h in a standard place, so "include f2c.h" will work in any directory without further ado. Beware that the makefiles do not cause recompilation when f2c.h is changed. On machines, such as those using a DEC Alpha processor, on which sizeof(short) == 2, sizeof(int) == sizeof(float) == 4, and sizeof(long) == sizeof(double) == 8, it suffices to modify f2c.h by removing the first occurrence of "long " on each line containing "long ". On Unix systems, you can do this by issuing the commands mv f2c.h f2c.h0 sed 's/long int /int /' f2c.h0 >f2c.h On such machines, one can enable INTEGER*8 by uncommenting the typedefs of longint and ulongint in f2c.h and adjusting them, so they read typedef long longint; typedef unsigned long ulongint; and by compiling libf2c with -DAllow_TYQUAD, as discussed below. Most of the routines in libf2c are support routines for Fortran intrinsic functions or for operations that f2c chooses not to do "in line". There are a few exceptions, summarized below -- functions and subroutines that appear to your program as ordinary external Fortran routines. If you use the REAL valued functions listed below (ERF, ERFC, DTIME, and ETIME) with "f2c -R", then you need to compile the corresponding source files with -DREAL=float. To do this, it is perhaps simplest to add "-DREAL=float" to CFLAGS in the makefile. 1. CALL ABORT prints a message and causes a core dump. 2. ERF(r) and DERF(d) and the REAL and DOUBLE PRECISION error functions (with x REAL and d DOUBLE PRECISION); DERF must be declared DOUBLE PRECISION in your program. Both ERF and DERF assume your C library provides the underlying erf() function (which not all systems do). 3. ERFC(r) and DERFC(d) are the complementary error functions: ERFC(r) = 1 - ERF(r) and DERFC(d) = 1.d0 - DERFC(d) (except that their results may be more accurate than explicitly evaluating the above formulae would give). Again, ERFC and r are REAL, and DERFC and d are DOUBLE PRECISION (and must be declared as such in your program), and ERFC and DERFC rely on your system's erfc(). 4. CALL GETARG(n,s), where n is an INTEGER and s is a CHARACTER variable, sets s to the n-th command-line argument (or to all blanks if there are fewer than n command-line arguments); CALL GETARG(0,s) sets s to the name of the program (on systems that support this feature). See IARGC below. 5. CALL GETENV(name, value), where name and value are of type CHARACTER, sets value to the environment value, $name, of name (or to blanks if $name has not been set). 6. NARGS = IARGC() sets NARGS to the number of command-line arguments (an INTEGER value). 7. CALL SIGNAL(n,func), where n is an INTEGER and func is an EXTERNAL procedure, arranges for func to be invoked when n occurs (on systems where this makes sense). If your compiler complains about the signal calls in main.c, s_paus.c, and signal_.c, you may need to adjust signal1.h suitably. See the comments in signal1.h. 8. ETIME(ARR) and DTIME(ARR) are REAL functions that return execution times. ARR is declared REAL ARR(2). The elapsed user and system CPU times are stored in ARR(1) and ARR(2), respectively. ETIME returns the total elapsed CPU time, i.e., ARR(1) + ARR(2). DTIME returns total elapsed CPU time since the previous call on DTIME. 9. CALL SYSTEM(cmd), where cmd is of type CHARACTER, passes cmd to the system's command processor (on systems where this can be done). 10. CALL FLUSH flushes all buffers. 11. FTELL(i) is an INTEGER function that returns the current offset of Fortran unit i (or -1 if unit i is not open). 12. CALL FSEEK(i, offset, whence, *errlab) attemps to move Fortran unit i to the specified offset: absolute offset if whence = 0; relative to the current offset if whence = 1; relative to the end of the file if whence = 2. It branches to label errlab if unit i is not open or if the call otherwise fails. The routines whose objects are makefile.u's $(I77) are for I/O. The following comments apply to them. If your system lacks /usr/include/local.h , then you should create an appropriate local.h in this directory. An appropriate local.h may simply be empty, or it may #define VAX or #define CRAY (or whatever else you must do to make fp.h work right). Alternatively, edit fp.h to suite your machine. If your system lacks /usr/include/fcntl.h , then you should simply create an empty fcntl.h in this directory. If your compiler then complains about creat and open not having a prototype, compile with OPEN_DECL defined. On many systems, open and creat are declared in fcntl.h . If your system's sprintf does not work the way ANSI C specifies -- specifically, if it does not return the number of characters transmitted -- then insert the line #define USE_STRLEN at the end of fmt.h . This is necessary with at least some versions of Sun software. In particular, if you get a warning about an improper pointer/integer combination in compiling wref.c, then you need to compile with -DUSE_STRLEN . If your system's fopen does not like the ANSI binary reading and writing modes "rb" and "wb", then you should compile open.c with NON_ANSI_RW_MODES #defined. If you get error messages about references to cf->_ptr and cf->_base when compiling wrtfmt.c and wsfe.c or to stderr->_flag when compiling err.c, then insert the line #define NON_UNIX_STDIO at the beginning of fio.h, and recompile everything (or at least those modules that contain NON_UNIX_STDIO). Unformatted sequential records consist of a length of record contents, the record contents themselves, and the length of record contents again (for backspace). Prior to 17 Oct. 1991, the length was of type int; now it is of type long, but you can change it back to int by inserting #define UIOLEN_int at the beginning of fio.h. This affects only sue.c and uio.c . If you have a really ancient K&R C compiler that does not understand void, add -Dvoid=int to the definition of CFLAGS in the makefile. On VAX, Cray, or Research Tenth-Edition Unix systems, you may need to add -DVAX, -DCRAY, or -DV10 (respectively) to CFLAGS to make fp.h work correctly. Alternatively, you may need to edit fp.h to suit your machine. If your compiler complains about the signal calls in main.c, s_paus.c, and signal_.c, you may need to adjust signal1.h suitably. See the comments in signal1.h. You may need to supply the following non-ANSI routines: fstat(int fileds, struct stat *buf) is similar to stat(char *name, struct stat *buf), except that the first argument, fileds, is the file descriptor returned by open rather than the name of the file. fstat is used in the system-dependent routine canseek (in the libf2c source file err.c), which is supposed to return 1 if it's possible to issue seeks on the file in question, 0 if it's not; you may need to suitably modify err.c . On non-UNIX systems, you can avoid references to fstat and stat by compiling with NON_UNIX_STDIO defined; in that case, you may need to supply access(char *Name,0), which is supposed to return 0 if file Name exists, nonzero otherwise. char * mktemp(char *buf) is supposed to replace the 6 trailing X's in buf with a unique number and then return buf. The idea is to get a unique name for a temporary file. On non-UNIX systems, you may need to change a few other, e.g.: the form of name computed by mktemp() in endfile.c and open.c; the use of the open(), close(), and creat() system calls in endfile.c, err.c, open.c; and the modes in calls on fopen() and fdopen() (and perhaps the use of fdopen() itself -- it's supposed to return a FILE* corresponding to a given an integer file descriptor) in err.c and open.c (component ufmt of struct unit is 1 for formatted I/O -- text mode on some systems -- and 0 for unformatted I/O -- binary mode on some systems). Compiling with -DNON_UNIX_STDIO omits all references to creat() and almost all references to open() and close(), the exception being in the function f__isdev() (in open.c). If you wish to use translated Fortran that has funny notions of record length for direct unformatted I/O (i.e., that assumes RECL= values in OPEN statements are not bytes but rather counts of some other units -- e.g., 4-character words for VMS), then you should insert an appropriate #define for url_Adjust at the beginning of open.c . For VMS Fortran, for example, #define url_Adjust(x) x *= 4 would suffice. By default, Fortran I/O units 5, 6, and 0 are pre-connected to stdin, stdout, and stderr, respectively. You can change this behavior by changing f_init() in err.c to suit your needs. Note that f2c assumes READ(*... means READ(5... and WRITE(*... means WRITE(6... . Moreover, an OPEN(n,... statement that does not specify a file name (and does not specify STATUS='SCRATCH') assumes FILE='fort.n' . You can change this by editing open.c and endfile.c suitably. Unless you adjust the "#define MXUNIT" line in fio.h, Fortran units 0, 1, ..., 99 are available, i.e., the highest allowed unit number is MXUNIT - 1. Lines protected from compilation by #ifdef Allow_TYQUAD are for a possible extension to 64-bit integers in which integer = int = 32 bits and longint = long = 64 bits. The makefile does not attempt to compile pow_qq.c, qbitbits.c, and qbitshft.c, which are meant for use with INTEGER*8. To use INTEGER*8, you must modify f2c.h to declare longint and ulongint appropriately; then add $(QINT) to the end of the makefile's dependency list for libf2c.a (if makefile is a copy of makefile.u; for the PC makefiles, add pow_qq.obj qbitbits.obj qbitshft.obj to the library's dependency list and adjust libf2c.lbc or libf2c.sy accordingly). Also add -DAllow_TYQUAD to the makefile's CFLAGS assignment. To make longint and ulongint available, it may suffice to add -DINTEGER_STAR_8 to the CFLAGS assignment. Following Fortran 90, s_cat.c and s_copy.c allow the target of a (character string) assignment to be appear on its right-hand, at the cost of some extra overhead for all run-time concatenations. If you prefer the extra efficiency that comes with the Fortran 77 requirement that the left-hand side of a character assignment not be involved in the right-hand side, compile s_cat.c and s_copy.c with -DNO_OVERWRITE . Extensions (Feb. 1993) to NAMELIST processing: 1. Reading a ? instead of &name (the start of a namelist) causes the namelist being sought to be written to stdout (unit 6); to omit this feature, compile rsne.c with -DNo_Namelist_Questions. 2. Reading the wrong namelist name now leads to an error message and an attempt to skip input until the right namelist name is found; to omit this feature, compile rsne.c with -DNo_Bad_Namelist_Skip. 3. Namelist writes now insert newlines before each variable; to omit this feature, compile xwsne.c with -DNo_Extra_Namelist_Newlines. 4. (Sept. 1995) When looking for the &name that starts namelist input, lines whose first non-blank character is something other than &, $, or ? are treated as comment lines and ignored, unless rsne.c is compiled with -DNo_Namelist_Comments. Nonstandard extension (Feb. 1993) to open: for sequential files, ACCESS='APPEND' (or access='anything else starting with "A" or "a"') causes the file to be positioned at end-of-file, so a write will append to the file. Some buggy Fortran programs use unformatted direct I/O to write an incomplete record and later read more from that record than they have written. For records other than the last, the unwritten portion of the record reads as binary zeros. The last record is a special case: attempting to read more from it than was written gives end-of-file -- which may help one find a bug. Some other Fortran I/O libraries treat the last record no differently than others and thus give no help in finding the bug of reading more than was written. If you wish to have this behavior, compile uio.c with -DPad_UDread . If you want to be able to catch write failures (e.g., due to a disk being full) with an ERR= specifier, compile dfe.c, due.c, sfe.c, sue.c, and wsle.c with -DALWAYS_FLUSH. This will lead to slower execution and more I/O, but should make ERR= work as expected, provided fflush returns an error return when its physical write fails. Carriage controls are meant to be interpreted by the UNIX col program (or a similar program). Sometimes it's convenient to use only ' ' as the carriage control character (normal single spacing). If you compile lwrite.c and wsfe.c with -DOMIT_BLANK_CC, formatted external output lines will have an initial ' ' quietly omitted, making use of the col program unnecessary with output that only has ' ' for carriage control. The Fortran 77 Standard leaves it up to the implementation whether formatted writes of floating-point numbers of absolute value < 1 have a zero before the decimal point. By default, libI77 omits such superfluous zeros, but you can cause them to appear by compiling lwrite.c, wref.c, and wrtfmt.c with -DWANT_LEAD_0 . If your (Unix) system lacks a ranlib command, you don't need it. Either comment out the makefile's ranlib invocation, or install a harmless "ranlib" command somewhere in your PATH, such as the one-line shell script exit 0 or (on some systems) exec /usr/bin/ar lts $1 >/dev/null By default, the routines that implement complex and double complex division, c_div.c and z_div.c, call sig_die to print an error message and exit if they see a divisor of 0, as this is sometimes helpful for debugging. On systems with IEEE arithmetic, compiling c_div.c and z_div.c with -DIEEE_COMPLEX_DIVIDE causes them instead to set both the real and imaginary parts of the result to +INFINITY if the numerator is nonzero, or to NaN if it vanishes. Nowadays most Unix and Linux systems have function int ftruncate(int fildes, off_t len); defined in system header file unistd.h that adjusts the length of file descriptor fildes to length len. Unless endfile.c is compiled with -DNO_TRUNCATE, endfile.c #includes "unistd.h" and calls ftruncate() if necessary to shorten files. If your system lacks ftruncate(), compile endfile.c with -DNO_TRUNCATE to make endfile.c use the older and more portable scheme of shortening a file by copying to a temporary file and back again. The initializations for "f2c -trapuv" are done by _uninit_f2c(), whose source is uninit.c, introduced June 2001. On IEEE-arithmetic systems, _uninit_f2c should initialize floating-point variables to signaling NaNs and, at its first invocation, should enable the invalid operation exception. Alas, the rules for distinguishing signaling from quiet NaNs were not specified in the IEEE P754 standard, nor were the precise means of enabling and disabling IEEE-arithmetic exceptions, and these details are thus system dependent. There are #ifdef's in uninit.c that specify them for some popular systems. If yours is not one of these systems, it may take some detective work to discover the appropriate details for your system. Sometimes it helps to look in the standard include directories for header files with relevant-sounding names, such as ieeefp.h, nan.h, or trap.h, and it may be simplest to run experiments to see what distinguishes a signaling from a quiet NaN. (If x is initialized to a signaling NaN and the invalid operation exception is masked off, as it should be by default on IEEE-arithmetic systems, then computing, say, y = x + 1 will yield a quiet NaN.) starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/abort_.c000066400000000000000000000004601413463044200223520ustar00rootroot00000000000000#include "stdio.h" #include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern VOID sig_die(); int abort_() #else extern void sig_die(const char*,int); int abort_(void) #endif { sig_die("Fortran abort routine called", 1); return 0; /* not reached */ } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/arithchk.c000066400000000000000000000120701413463044200227010ustar00rootroot00000000000000/**************************************************************** Copyright (C) 1997, 1998, 2000 Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ /* Try to deduce arith.h from arithmetic properties. */ #include #include #include #ifdef NO_FPINIT #define fpinit_ASL() #else #ifndef KR_headers extern #ifdef __cplusplus "C" #endif void fpinit_ASL(void); #endif /*KR_headers*/ #endif /*NO_FPINIT*/ static int dalign; typedef struct Akind { char *name; int kind; } Akind; static Akind IEEE_8087 = { "IEEE_8087", 1 }, IEEE_MC68k = { "IEEE_MC68k", 2 }, IBM = { "IBM", 3 }, VAX = { "VAX", 4 }, CRAY = { "CRAY", 5}; static double t_nan; static Akind * Lcheck(void) { union { double d; long L[2]; } u; struct { double d; long L; } x[2]; if (sizeof(x) > 2*(sizeof(double) + sizeof(long))) dalign = 1; u.L[0] = u.L[1] = 0; u.d = 1e13; if (u.L[0] == 1117925532 && u.L[1] == -448790528) return &IEEE_MC68k; if (u.L[1] == 1117925532 && u.L[0] == -448790528) return &IEEE_8087; if (u.L[0] == -2065213935 && u.L[1] == 10752) return &VAX; if (u.L[0] == 1267827943 && u.L[1] == 704643072) return &IBM; return 0; } static Akind * icheck(void) { union { double d; int L[2]; } u; struct { double d; int L; } x[2]; if (sizeof(x) > 2*(sizeof(double) + sizeof(int))) dalign = 1; u.L[0] = u.L[1] = 0; u.d = 1e13; if (u.L[0] == 1117925532 && u.L[1] == -448790528) return &IEEE_MC68k; if (u.L[1] == 1117925532 && u.L[0] == -448790528) return &IEEE_8087; if (u.L[0] == -2065213935 && u.L[1] == 10752) return &VAX; if (u.L[0] == 1267827943 && u.L[1] == 704643072) return &IBM; return 0; } char *emptyfmt = ""; /* avoid possible warning message with printf("") */ static Akind * ccheck(void) { union { double d; long L; } u; long Cray1; /* Cray1 = 4617762693716115456 -- without overflow on non-Crays */ Cray1 = printf("%s",emptyfmt) < 0 ? 0 : 4617762; if (printf(emptyfmt, Cray1) >= 0) Cray1 = 1000000*Cray1 + 693716; if (printf(emptyfmt, Cray1) >= 0) Cray1 = 1000000*Cray1 + 115456; u.d = 1e13; if (u.L == Cray1) return &CRAY; return 0; } static int fzcheck(void) { double a, b; int i; a = 1.; b = .1; for(i = 155;; b *= b, i >>= 1) { if (i & 1) { a *= b; if (i == 1) break; } } b = a * a; return b == 0.; } static int need_nancheck(void) { double t; errno = 0; t = log(t_nan); if (errno == 0) return 1; errno = 0; t = sqrt(t_nan); return errno == 0; } void get_nanbits(unsigned int *b, int k) { union { double d; unsigned int z[2]; } u, u1, u2; k = 2 - k; u1.z[k] = u2.z[k] = 0x7ff00000; u1.z[1-k] = u2.z[1-k] = 0; u.d = u1.d - u2.d; /* Infinity - Infinity */ b[0] = u.z[0]; b[1] = u.z[1]; } int main(void) { FILE *f; Akind *a = 0; int Ldef = 0; unsigned int nanbits[2]; fpinit_ASL(); #ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */ f = fopen("arith.h", "w"); if (!f) { printf("Cannot open arith.h\n"); return 1; } #else f = stdout; #endif if (sizeof(double) == 2*sizeof(long)) a = Lcheck(); else if (sizeof(double) == 2*sizeof(int)) { Ldef = 1; a = icheck(); } else if (sizeof(double) == sizeof(long)) a = ccheck(); if (a) { fprintf(f, "#define %s\n#define Arith_Kind_ASL %d\n", a->name, a->kind); if (Ldef) fprintf(f, "#define Long int\n#define Intcast (int)(long)\n"); if (dalign) fprintf(f, "#define Double_Align\n"); if (sizeof(char*) == 8) fprintf(f, "#define X64_bit_pointers\n"); #ifndef NO_LONG_LONG if (sizeof(long long) < 8) #endif fprintf(f, "#define NO_LONG_LONG\n"); if (a->kind <= 2) { if (fzcheck()) fprintf(f, "#define Sudden_Underflow\n"); t_nan = -a->kind; if (need_nancheck()) fprintf(f, "#define NANCHECK\n"); if (sizeof(double) == 2*sizeof(unsigned int)) { get_nanbits(nanbits, a->kind); fprintf(f, "#define QNaN0 0x%x\n", nanbits[0]); fprintf(f, "#define QNaN1 0x%x\n", nanbits[1]); } } return 0; } fprintf(f, "/* Unknown arithmetic */\n"); return 1; } #ifdef __sun #ifdef __i386 /* kludge for Intel Solaris */ void fpsetprec(int x) { } #endif #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/backspac.c000066400000000000000000000025171413463044200226600ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer f_back(a) alist *a; #else integer f_back(alist *a) #endif { unit *b; OFF_T v, w, x, y, z; uiolen n; FILE *f; f__curunit = b = &f__units[a->aunit]; /* curunit for error messages */ if(a->aunit >= MXUNIT || a->aunit < 0) err(a->aerr,101,"backspace") if(b->useek==0) err(a->aerr,106,"backspace") if(b->ufd == NULL) { fk_open(1, 1, a->aunit); return(0); } if(b->uend==1) { b->uend=0; return(0); } if(b->uwrt) { t_runc(a); if (f__nowreading(b)) err(a->aerr,errno,"backspace") } f = b->ufd; /* may have changed in t_runc() */ if(b->url>0) { x=FTELL(f); y = x % b->url; if(y == 0) x--; x /= b->url; x *= b->url; (void) FSEEK(f,x,SEEK_SET); return(0); } if(b->ufmt==0) { FSEEK(f,-(OFF_T)sizeof(uiolen),SEEK_CUR); if(fread((char *)&n,sizeof(uiolen),1,f)); return (1); FSEEK(f,-(OFF_T)n-2*sizeof(uiolen),SEEK_CUR); return(0); } w = x = FTELL(f); z = 0; loop: while(x) { x -= x < 64 ? x : 64; FSEEK(f,x,SEEK_SET); for(y = x; y < w; y++) { if (getc(f) != '\n') continue; v = FTELL(f); if (v == w) { if (z) goto break2; goto loop; } z = v; } err(a->aerr,(EOF),"backspace") } break2: FSEEK(f, z, SEEK_SET); return 0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_abs.c000066400000000000000000000004201413463044200221470ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern double f__cabs(); double c_abs(z) complex *z; #else extern double f__cabs(double, double); double c_abs(complex *z) #endif { return( f__cabs( z->r, z->i ) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_cos.c000066400000000000000000000005421413463044200221730ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers extern double sin(), cos(), sinh(), cosh(); VOID c_cos(r, z) complex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif void c_cos(complex *r, complex *z) #endif { double zi = z->i, zr = z->r; r->r = cos(zr) * cosh(zi); r->i = - sin(zr) * sinh(zi); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_div.c000066400000000000000000000016501413463044200221720ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern VOID sig_die(); VOID c_div(c, a, b) complex *a, *b, *c; #else extern void sig_die(const char*,int); void c_div(complex *c, complex *a, complex *b) #endif { double ratio, den; double abr, abi, cr; if( (abr = b->r) < 0.) abr = - abr; if( (abi = b->i) < 0.) abi = - abi; if( abr <= abi ) { if(abi == 0) { #ifdef IEEE_COMPLEX_DIVIDE float af, bf; af = bf = abr; if (a->i != 0 || a->r != 0) af = 1.; c->i = c->r = af / bf; return; #else sig_die("complex division by zero", 1); #endif } ratio = (double)b->r / b->i ; den = b->i * (1 + ratio*ratio); cr = (a->r*ratio + a->i) / den; c->i = (a->i*ratio - a->r) / den; } else { ratio = (double)b->i / b->r ; den = b->r * (1 + ratio*ratio); cr = (a->r + a->i*ratio) / den; c->i = (a->i - a->r*ratio) / den; } c->r = cr; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_exp.c000066400000000000000000000005351413463044200222050ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers extern double exp(), cos(), sin(); VOID c_exp(r, z) complex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif void c_exp(complex *r, complex *z) #endif { double expx, zi = z->i; expx = exp(z->r); r->r = expx * cos(zi); r->i = expx * sin(zi); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_log.c000066400000000000000000000006001413463044200221630ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers extern double log(), f__cabs(), atan2(); VOID c_log(r, z) complex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif extern double f__cabs(double, double); void c_log(complex *r, complex *z) #endif { double zi, zr; r->i = atan2(zi = z->i, zr = z->r); r->r = log( f__cabs(zr, zi) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_sin.c000066400000000000000000000005361413463044200222030ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers extern double sin(), cos(), sinh(), cosh(); VOID c_sin(r, z) complex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif void c_sin(complex *r, complex *z) #endif { double zi = z->i, zr = z->r; r->r = sin(zr) * cosh(zi); r->i = cos(zr) * sinh(zi); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/c_sqrt.c000066400000000000000000000011351413463044200223770ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers extern double sqrt(), f__cabs(); VOID c_sqrt(r, z) complex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif extern double f__cabs(double, double); void c_sqrt(complex *r, complex *z) #endif { double mag, t; double zi = z->i, zr = z->r; if( (mag = f__cabs(zr, zi)) == 0.) r->r = r->i = 0.; else if(zr > 0) { r->r = t = sqrt(0.5 * (mag + zr) ); t = zi / t; r->i = 0.5 * t; } else { t = sqrt(0.5 * (mag - zr) ); if(zi < 0) t = -t; r->i = t; t = zi / t; r->r = 0.5 * t; } } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/cabs.c000066400000000000000000000007561413463044200220240ustar00rootroot00000000000000#ifdef KR_headers extern double sqrt(); double f__cabs(real, imag) double real, imag; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double f__cabs(double real, double imag) #endif { double temp; if(real < 0) real = -real; if(imag < 0) imag = -imag; if(imag > real){ temp = real; real = imag; imag = temp; } if((real+imag) == real) return(real); temp = imag/real; temp = real*sqrt(1.0 + temp*temp); /*overflow!!*/ return(temp); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/close.c000066400000000000000000000025611413463044200222150ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef KR_headers integer f_clos(a) cllist *a; #else #undef abs #undef min #undef max #include "stdlib.h" #ifdef NON_UNIX_STDIO #ifndef unlink #define unlink remove #endif #else #ifdef MSDOS #include "io.h" #else #ifdef __cplusplus extern "C" int unlink(const char*); #else extern int unlink(const char*); #endif #endif #endif #ifdef __cplusplus extern "C" { #endif integer f_clos(cllist *a) #endif { unit *b; if(a->cunit >= MXUNIT) return(0); b= &f__units[a->cunit]; if(b->ufd==NULL) goto done; if (b->uscrtch == 1) goto Delete; if (!a->csta) goto Keep; switch(*a->csta) { default: Keep: case 'k': case 'K': if(b->uwrt == 1) t_runc((alist *)a); if(b->ufnm) { fclose(b->ufd); free(b->ufnm); } break; case 'd': case 'D': Delete: fclose(b->ufd); if(b->ufnm) { unlink(b->ufnm); /*SYSDEP*/ free(b->ufnm); } } b->ufd=NULL; done: b->uend=0; b->ufnm=NULL; return(0); } void #ifdef KR_headers f_exit() #else f_exit(void) #endif { int i; static cllist xx; if (!xx.cerr) { xx.cerr=1; xx.csta=NULL; for(i=0;i #else /*{*/ #ifndef My_ctype_DEF extern char My_ctype[]; #else /*{*/ char My_ctype[264] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; #endif /*}*/ #define isdigit(x) (My_ctype[(x)+8] & 1) #define isspace(x) (My_ctype[(x)+8] & 2) #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_abs.c000066400000000000000000000003321413463044200221520ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double d_abs(x) doublereal *x; #else double d_abs(doublereal *x) #endif { if(*x >= 0) return(*x); return(- *x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_acos.c000066400000000000000000000003651413463044200223400ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double acos(); double d_acos(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_acos(doublereal *x) #endif { return( acos(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_asin.c000066400000000000000000000003651413463044200223450ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double asin(); double d_asin(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_asin(doublereal *x) #endif { return( asin(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_atan.c000066400000000000000000000003651413463044200223360ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double atan(); double d_atan(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_atan(doublereal *x) #endif { return( atan(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_atn2.c000066400000000000000000000004171413463044200222550ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double atan2(); double d_atn2(x,y) doublereal *x, *y; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_atn2(doublereal *x, doublereal *y) #endif { return( atan2(*x,*y) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_cnjg.c000066400000000000000000000003771413463044200223370ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif VOID #ifdef KR_headers d_cnjg(r, z) doublecomplex *r, *z; #else d_cnjg(doublecomplex *r, doublecomplex *z) #endif { doublereal zi = z->i; r->r = z->r; r->i = -zi; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_cos.c000066400000000000000000000003611413463044200221730ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double cos(); double d_cos(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_cos(doublereal *x) #endif { return( cos(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_cosh.c000066400000000000000000000003651413463044200223470ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double cosh(); double d_cosh(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_cosh(doublereal *x) #endif { return( cosh(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_dim.c000066400000000000000000000003501413463044200221560ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double d_dim(a,b) doublereal *a, *b; #else double d_dim(doublereal *a, doublereal *b) #endif { return( *a > *b ? *a - *b : 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_exp.c000066400000000000000000000003611413463044200222030ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double exp(); double d_exp(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_exp(doublereal *x) #endif { return( exp(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_imag.c000066400000000000000000000003111413463044200223170ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double d_imag(z) doublecomplex *z; #else double d_imag(doublecomplex *z) #endif { return(z->i); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_int.c000066400000000000000000000004151413463044200222010ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); double d_int(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_int(doublereal *x) #endif { return( (*x>0) ? floor(*x) : -floor(- *x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_lg10.c000066400000000000000000000004431413463044200221530ustar00rootroot00000000000000#include "f2c.h" #define log10e 0.43429448190325182765 #ifdef KR_headers double log(); double d_lg10(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_lg10(doublereal *x) #endif { return( log10e * log(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_log.c000066400000000000000000000003611413463044200221700ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double log(); double d_log(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_log(doublereal *x) #endif { return( log(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_mod.c000066400000000000000000000012601413463044200221650ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers #ifdef IEEE_drem double drem(); #else double floor(); #endif double d_mod(x,y) doublereal *x, *y; #else #ifdef IEEE_drem double drem(double, double); #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif #endif double d_mod(doublereal *x, doublereal *y) #endif { #ifdef IEEE_drem double xa, ya, z; if ((ya = *y) < 0.) ya = -ya; z = drem(xa = *x, ya); if (xa > 0) { if (z < 0) z += ya; } else if (z > 0) z -= ya; return z; #else double quotient; if( (quotient = *x / *y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(*x - (*y) * quotient ); #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_nint.c000066400000000000000000000004311413463044200223550ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); double d_nint(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_nint(doublereal *x) #endif { return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_prod.c000066400000000000000000000003171413463044200223540ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double d_prod(x,y) real *x, *y; #else double d_prod(real *x, real *y) #endif { return( (*x) * (*y) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_sign.c000066400000000000000000000004121413463044200223440ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double d_sign(a,b) doublereal *a, *b; #else double d_sign(doublereal *a, doublereal *b) #endif { double x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_sin.c000066400000000000000000000003611413463044200222000ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sin(); double d_sin(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_sin(doublereal *x) #endif { return( sin(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_sinh.c000066400000000000000000000003651413463044200223540ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sinh(); double d_sinh(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_sinh(doublereal *x) #endif { return( sinh(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_sqrt.c000066400000000000000000000003651413463044200224040ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sqrt(); double d_sqrt(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_sqrt(doublereal *x) #endif { return( sqrt(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_tan.c000066400000000000000000000003611413463044200221710ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double tan(); double d_tan(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_tan(doublereal *x) #endif { return( tan(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/d_tanh.c000066400000000000000000000003651413463044200223450ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double tanh(); double d_tanh(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double d_tanh(doublereal *x) #endif { return( tanh(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/derf_.c000066400000000000000000000003571413463044200221700ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double erf(); double derf_(x) doublereal *x; #else extern double erf(double); double derf_(doublereal *x) #endif { return( erf(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/derfc_.c000066400000000000000000000003751413463044200223330ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern double erfc(); double derfc_(x) doublereal *x; #else extern double erfc(double); double derfc_(doublereal *x) #endif { return( erfc(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/dfe.c000066400000000000000000000051001413463044200216360ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif int y_rsk(Void) { if(f__curunit->uend || f__curunit->url <= f__recpos || f__curunit->url == 1) return 0; do { getc(f__cf); } while(++f__recpos < f__curunit->url); return 0; } int y_getc(Void) { int ch; if(f__curunit->uend) return(-1); if((ch=getc(f__cf))!=EOF) { f__recpos++; if(f__curunit->url>=f__recpos || f__curunit->url==1) return(ch); else return(' '); } if(feof(f__cf)) { f__curunit->uend=1; errno=0; return(-1); } err(f__elist->cierr,errno,"readingd"); } static int y_rev(Void) { if (f__recpos < f__hiwater) f__recpos = f__hiwater; if (f__curunit->url > 1) while(f__recpos < f__curunit->url) (*f__putn)(' '); if (f__recpos) f__putbuf(0); f__recpos = 0; return(0); } static int y_err(Void) { err(f__elist->cierr, 110, "dfe"); } static int y_newrec(Void) { y_rev(); f__hiwater = f__cursor = 0; return(1); } int #ifdef KR_headers c_dfe(a) cilist *a; #else c_dfe(cilist *a) #endif { f__sequential=0; f__formatted=f__external=1; f__elist=a; f__cursor=f__scale=f__recpos=0; f__curunit = &f__units[a->ciunit]; if(a->ciunit>MXUNIT || a->ciunit<0) err(a->cierr,101,"startchk"); if(f__curunit->ufd==NULL && fk_open(DIR,FMT,a->ciunit)) err(a->cierr,104,"dfe"); f__cf=f__curunit->ufd; if(!f__curunit->ufmt) err(a->cierr,102,"dfe") if(!f__curunit->useek) err(a->cierr,104,"dfe") f__fmtbuf=a->cifmt; if(a->cirec <= 0) err(a->cierr,130,"dfe") FSEEK(f__cf,(OFF_T)f__curunit->url * (a->cirec-1),SEEK_SET); f__curunit->uend = 0; return(0); } #ifdef KR_headers integer s_rdfe(a) cilist *a; #else integer s_rdfe(cilist *a) #endif { int n; if(!f__init) f_init(); f__reading=1; if(n=c_dfe(a))return(n); if(f__curunit->uwrt && f__nowreading(f__curunit)) err(a->cierr,errno,"read start"); f__getn = y_getc; f__doed = rd_ed; f__doned = rd_ned; f__dorevert = f__donewrec = y_err; f__doend = y_rsk; if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"read start"); fmt_bg(); return(0); } #ifdef KR_headers integer s_wdfe(a) cilist *a; #else integer s_wdfe(cilist *a) #endif { int n; if(!f__init) f_init(); f__reading=0; if(n=c_dfe(a)) return(n); if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr,errno,"startwrt"); f__putn = x_putc; f__doed = w_ed; f__doned= w_ned; f__dorevert = y_err; f__donewrec = y_newrec; f__doend = y_rev; if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startwrt"); fmt_bg(); return(0); } integer e_rdfe(Void) { en_fio(); return 0; } integer e_wdfe(Void) { return en_fio(); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/dolio.c000066400000000000000000000007271413463044200222200ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern int (*f__lioproc)(); integer do_lio(type,number,ptr,len) ftnint *number,*type; char *ptr; ftnlen len; #else extern int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint); integer do_lio(ftnint *type, ftnint *number, char *ptr, ftnlen len) #endif { return((*f__lioproc)(number,ptr,len,*type)); } #ifdef __cplusplus } #endif #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/dtime_.c000066400000000000000000000017141413463044200223500ustar00rootroot00000000000000#include "time.h" #ifdef MSDOS #undef USE_CLOCK #define USE_CLOCK #endif #ifndef REAL #define REAL double #endif #ifndef USE_CLOCK #define _INCLUDE_POSIX_SOURCE /* for HP-UX */ #define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ #include "sys/types.h" #include "sys/times.h" #ifdef __cplusplus extern "C" { #endif #endif #undef Hz #ifdef CLK_TCK #define Hz CLK_TCK #else #ifdef HZ #define Hz HZ #else #define Hz 60 #endif #endif REAL #ifdef KR_headers dtime_(tarray) float *tarray; #else dtime_(float *tarray) #endif { #ifdef USE_CLOCK #ifndef CLOCKS_PER_SECOND #define CLOCKS_PER_SECOND Hz #endif static double t0; double t = clock(); tarray[1] = 0; tarray[0] = (t - t0) / CLOCKS_PER_SECOND; t0 = t; return tarray[0]; #else struct tms t; static struct tms t0; times(&t); tarray[0] = (double)(t.tms_utime - t0.tms_utime) / Hz; tarray[1] = (double)(t.tms_stime - t0.tms_stime) / Hz; t0 = t; return tarray[0] + tarray[1]; #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/due.c000066400000000000000000000031301413463044200216560ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif int #ifdef KR_headers c_due(a) cilist *a; #else c_due(cilist *a) #endif { if(!f__init) f_init(); f__sequential=f__formatted=f__recpos=0; f__external=1; f__curunit = &f__units[a->ciunit]; if(a->ciunit>=MXUNIT || a->ciunit<0) err(a->cierr,101,"startio"); f__elist=a; if(f__curunit->ufd==NULL && fk_open(DIR,UNF,a->ciunit) ) err(a->cierr,104,"due"); f__cf=f__curunit->ufd; if(f__curunit->ufmt) err(a->cierr,102,"cdue") if(!f__curunit->useek) err(a->cierr,104,"cdue") if(f__curunit->ufd==NULL) err(a->cierr,114,"cdue") if(a->cirec <= 0) err(a->cierr,130,"due") FSEEK(f__cf,(OFF_T)(a->cirec-1)*f__curunit->url,SEEK_SET); f__curunit->uend = 0; return(0); } #ifdef KR_headers integer s_rdue(a) cilist *a; #else integer s_rdue(cilist *a) #endif { int n; f__reading=1; if(n=c_due(a)) return(n); if(f__curunit->uwrt && f__nowreading(f__curunit)) err(a->cierr,errno,"read start"); return(0); } #ifdef KR_headers integer s_wdue(a) cilist *a; #else integer s_wdue(cilist *a) #endif { int n; f__reading=0; if(n=c_due(a)) return(n); if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr,errno,"write start"); return(0); } integer e_rdue(Void) { if(f__curunit->url==1 || f__recpos==f__curunit->url) return(0); FSEEK(f__cf,(OFF_T)(f__curunit->url-f__recpos),SEEK_CUR); if(FTELL(f__cf)%f__curunit->url) err(f__elist->cierr,200,"syserr"); return(0); } integer e_wdue(Void) { #ifdef ALWAYS_FLUSH if (fflush(f__cf)) err(f__elist->cierr,errno,"write end"); #endif return(e_rdue()); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/ef1asc_.c000066400000000000000000000010111413463044200223760ustar00rootroot00000000000000/* EFL support routine to copy string b to string a */ #include "f2c.h" #ifdef __cplusplus extern "C" { #endif #define M ( (long) (sizeof(long) - 1) ) #define EVEN(x) ( ( (x)+ M) & (~M) ) #ifdef KR_headers extern VOID s_copy(); ef1asc_(a, la, b, lb) ftnint *a, *b; ftnlen *la, *lb; #else extern void s_copy(char*,char*,ftnlen,ftnlen); int ef1asc_(ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb) #endif { s_copy( (char *)a, (char *)b, EVEN(*la), *lb ); return 0; /* ignored return value */ } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/ef1cmc_.c000066400000000000000000000006731413463044200224070ustar00rootroot00000000000000/* EFL support routine to compare two character strings */ #include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); integer _starpu_ef1cmc_(a, la, b, lb) ftnint *a, *b; ftnlen *la, *lb; #else extern integer s_cmp(char*,char*,ftnlen,ftnlen); integer _starpu_ef1cmc_(ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb) #endif { return( s_cmp( (char *)a, (char *)b, *la, *lb) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/endfile.c000066400000000000000000000054261413463044200225210ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" /* Compile this with -DNO_TRUNCATE if unistd.h does not exist or */ /* if it does not define int truncate(const char *name, off_t). */ #ifdef MSDOS #undef NO_TRUNCATE #define NO_TRUNCATE #endif #ifndef NO_TRUNCATE #include "unistd.h" #endif #ifdef KR_headers extern char *strcpy(); extern FILE *tmpfile(); #else #undef abs #undef min #undef max #include "stdlib.h" #include "string.h" #ifdef __cplusplus extern "C" { #endif #endif extern char *f__r_mode[], *f__w_mode[]; #ifdef KR_headers integer f_end(a) alist *a; #else integer f_end(alist *a) #endif { unit *b; FILE *tf; if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile"); b = &f__units[a->aunit]; if(b->ufd==NULL) { char nbuf[10]; sprintf(nbuf,"fort.%ld",(long)a->aunit); if (tf = FOPEN(nbuf, f__w_mode[0])) fclose(tf); return(0); } b->uend=1; return(b->useek ? t_runc(a) : 0); } #ifdef NO_TRUNCATE static int #ifdef KR_headers copy(from, len, to) FILE *from, *to; register long len; #else copy(FILE *from, register long len, FILE *to) #endif { int len1; char buf[BUFSIZ]; while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) { if (!fwrite(buf, len1, 1, to)) return 1; if ((len -= len1) <= 0) break; } return 0; } #endif /* NO_TRUNCATE */ int #ifdef KR_headers t_runc(a) alist *a; #else t_runc(alist *a) #endif { OFF_T loc, len; unit *b; int rc; FILE *bf; #ifdef NO_TRUNCATE FILE *tf; #endif b = &f__units[a->aunit]; if(b->url) return(0); /*don't truncate direct files*/ loc=FTELL(bf = b->ufd); FSEEK(bf,(OFF_T)0,SEEK_END); len=FTELL(bf); if (loc >= len || b->useek == 0) return(0); #ifdef NO_TRUNCATE if (b->ufnm == NULL) return 0; rc = 0; fclose(b->ufd); if (!loc) { if (!(bf = FOPEN(b->ufnm, f__w_mode[b->ufmt]))) rc = 1; if (b->uwrt) b->uwrt = 1; goto done; } if (!(bf = FOPEN(b->ufnm, f__r_mode[0])) || !(tf = tmpfile())) { #ifdef NON_UNIX_STDIO bad: #endif rc = 1; goto done; } if (copy(bf, (long)loc, tf)) { bad1: rc = 1; goto done1; } if (!(bf = FREOPEN(b->ufnm, f__w_mode[0], bf))) goto bad1; rewind(tf); if (copy(tf, (long)loc, bf)) goto bad1; b->uwrt = 1; b->urw = 2; #ifdef NON_UNIX_STDIO if (b->ufmt) { fclose(bf); if (!(bf = FOPEN(b->ufnm, f__w_mode[3]))) goto bad; FSEEK(bf,(OFF_T)0,SEEK_END); b->urw = 3; } #endif done1: fclose(tf); done: f__cf = b->ufd = bf; #else /* NO_TRUNCATE */ if (b->urw & 2) fflush(b->ufd); /* necessary on some Linux systems */ #ifndef FTRUNCATE #define FTRUNCATE ftruncate #endif rc = FTRUNCATE(fileno(b->ufd), loc); /* The following FSEEK is unnecessary on some systems, */ /* but should be harmless. */ FSEEK(b->ufd, (OFF_T)0, SEEK_END); #endif /* NO_TRUNCATE */ if (rc) err(a->aerr,111,"endfile"); return 0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/erf_.c000066400000000000000000000004161413463044200220200ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifndef REAL #define REAL double #endif #ifdef KR_headers double erf(); REAL erf_(x) real *x; #else extern double erf(double); REAL erf_(real *x) #endif { return( erf((double)*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/erfc_.c000066400000000000000000000004231413463044200221610ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifndef REAL #define REAL double #endif #ifdef KR_headers double erfc(); REAL erfc_(x) real *x; #else extern double erfc(double); REAL erfc_(real *x) #endif { return( erfc((double)*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/err.c000066400000000000000000000144521413463044200217020ustar00rootroot00000000000000#include "sysdep1.h" /* here to get stat64 on some badly designed Linux systems */ #include "f2c.h" #ifdef KR_headers #define Const /*nothing*/ extern char *malloc(); #else #define Const const #undef abs #undef min #undef max #include "stdlib.h" #endif #include "fio.h" #include "fmt.h" /* for struct syl */ /* Compile this with -DNO_ISATTY if unistd.h does not exist or */ /* if it does not define int isatty(int). */ #ifdef NO_ISATTY #define isatty(x) 0 #else #include #endif #ifdef __cplusplus extern "C" { #endif /*global definitions*/ unit f__units[MXUNIT]; /*unit table*/ flag f__init; /*0 on entry, 1 after initializations*/ cilist *f__elist; /*active external io list*/ icilist *f__svic; /*active internal io list*/ flag f__reading; /*1 if reading, 0 if writing*/ flag f__cplus,f__cblank; Const char *f__fmtbuf; flag f__external; /*1 if external io, 0 if internal */ #ifdef KR_headers int (*f__doed)(),(*f__doned)(); int (*f__doend)(),(*f__donewrec)(),(*f__dorevert)(); int (*f__getn)(); /* for formatted input */ void (*f__putn)(); /* for formatted output */ #else int (*f__getn)(void); /* for formatted input */ void (*f__putn)(int); /* for formatted output */ int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*); int (*f__dorevert)(void),(*f__donewrec)(void),(*f__doend)(void); #endif flag f__sequential; /*1 if sequential io, 0 if direct*/ flag f__formatted; /*1 if formatted io, 0 if unformatted*/ FILE *f__cf; /*current file*/ unit *f__curunit; /*current unit*/ int f__recpos; /*place in current record*/ OFF_T f__cursor, f__hiwater; int f__scale; char *f__icptr; /*error messages*/ Const char *F_err[] = { "error in format", /* 100 */ "illegal unit number", /* 101 */ "formatted io not allowed", /* 102 */ "unformatted io not allowed", /* 103 */ "direct io not allowed", /* 104 */ "sequential io not allowed", /* 105 */ "can't backspace file", /* 106 */ "null file name", /* 107 */ "can't stat file", /* 108 */ "unit not connected", /* 109 */ "off end of record", /* 110 */ "truncation failed in endfile", /* 111 */ "incomprehensible list input", /* 112 */ "out of free space", /* 113 */ "unit not connected", /* 114 */ "read unexpected character", /* 115 */ "bad logical input field", /* 116 */ "bad variable type", /* 117 */ "bad namelist name", /* 118 */ "variable not in namelist", /* 119 */ "no end record", /* 120 */ "variable count incorrect", /* 121 */ "subscript for scalar variable", /* 122 */ "invalid array section", /* 123 */ "substring out of bounds", /* 124 */ "subscript out of bounds", /* 125 */ "can't read file", /* 126 */ "can't write file", /* 127 */ "'new' file exists", /* 128 */ "can't append to file", /* 129 */ "non-positive record number", /* 130 */ "nmLbuf overflow" /* 131 */ }; #define MAXERR (sizeof(F_err)/sizeof(char *)+100) int #ifdef KR_headers f__canseek(f) FILE *f; /*SYSDEP*/ #else f__canseek(FILE *f) /*SYSDEP*/ #endif { #ifdef NON_UNIX_STDIO return !isatty(fileno(f)); #else struct STAT_ST x; if (FSTAT(fileno(f),&x) < 0) return(0); #ifdef S_IFMT switch(x.st_mode & S_IFMT) { case S_IFDIR: case S_IFREG: if(x.st_nlink > 0) /* !pipe */ return(1); else return(0); case S_IFCHR: if(isatty(fileno(f))) return(0); return(1); #ifdef S_IFBLK case S_IFBLK: return(1); #endif } #else #ifdef S_ISDIR /* POSIX version */ if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) { if(x.st_nlink > 0) /* !pipe */ return(1); else return(0); } if (S_ISCHR(x.st_mode)) { if(isatty(fileno(f))) return(0); return(1); } if (S_ISBLK(x.st_mode)) return(1); #else Help! How does fstat work on this system? #endif #endif return(0); /* who knows what it is? */ #endif } void #ifdef KR_headers f__fatal(n,s) char *s; #else f__fatal(int n, const char *s) #endif { if(n<100 && n>=0) perror(s); /*SYSDEP*/ else if(n >= (int)MAXERR || n < -1) { fprintf(stderr,"%s: illegal error number %d\n",s,n); } else if(n == -1) fprintf(stderr,"%s: end of file\n",s); else fprintf(stderr,"%s: %s\n",s,F_err[n-100]); if (f__curunit) { fprintf(stderr,"apparent state: unit %d ", (int)(f__curunit-f__units)); fprintf(stderr, f__curunit->ufnm ? "named %s\n" : "(unnamed)\n", f__curunit->ufnm); } else fprintf(stderr,"apparent state: internal I/O\n"); if (f__fmtbuf) fprintf(stderr,"last format: %s\n",f__fmtbuf); fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing", f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted", f__external?"external":"internal"); sig_die(" IO", 1); } /*initialization routine*/ VOID f_init(Void) { unit *p; f__init=1; p= &f__units[0]; p->ufd=stderr; p->useek=f__canseek(stderr); p->ufmt=1; p->uwrt=1; p = &f__units[5]; p->ufd=stdin; p->useek=f__canseek(stdin); p->ufmt=1; p->uwrt=0; p= &f__units[6]; p->ufd=stdout; p->useek=f__canseek(stdout); p->ufmt=1; p->uwrt=1; } int #ifdef KR_headers f__nowreading(x) unit *x; #else f__nowreading(unit *x) #endif { OFF_T loc; int ufmt, urw; extern char *f__r_mode[], *f__w_mode[]; if (x->urw & 1) goto done; if (!x->ufnm) goto cantread; ufmt = x->url ? 0 : x->ufmt; loc = FTELL(x->ufd); urw = 3; if (!FREOPEN(x->ufnm, f__w_mode[ufmt|2], x->ufd)) { urw = 1; if(!FREOPEN(x->ufnm, f__r_mode[ufmt], x->ufd)) { cantread: errno = 126; return 1; } } FSEEK(x->ufd,loc,SEEK_SET); x->urw = urw; done: x->uwrt = 0; return 0; } int #ifdef KR_headers f__nowwriting(x) unit *x; #else f__nowwriting(unit *x) #endif { OFF_T loc; int ufmt; extern char *f__w_mode[]; if (x->urw & 2) { if (x->urw & 1) FSEEK(x->ufd, (OFF_T)0, SEEK_CUR); goto done; } if (!x->ufnm) goto cantwrite; ufmt = x->url ? 0 : x->ufmt; if (x->uwrt == 3) { /* just did write, rewind */ if (!(f__cf = x->ufd = FREOPEN(x->ufnm,f__w_mode[ufmt],x->ufd))) goto cantwrite; x->urw = 2; } else { loc=FTELL(x->ufd); if (!(f__cf = x->ufd = FREOPEN(x->ufnm, f__w_mode[ufmt | 2], x->ufd))) { x->ufd = NULL; cantwrite: errno = 127; return(1); } x->urw = 3; FSEEK(x->ufd,loc,SEEK_SET); } done: x->uwrt = 1; return 0; } int #ifdef KR_headers err__fl(f, m, s) int f, m; char *s; #else err__fl(int f, int m, const char *s) #endif { if (!f) f__fatal(m, s); if (f__doend) (*f__doend)(); return errno = m; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/etime_.c000066400000000000000000000015071413463044200223510ustar00rootroot00000000000000#include "time.h" #ifdef MSDOS #undef USE_CLOCK #define USE_CLOCK #endif #ifndef REAL #define REAL double #endif #ifndef USE_CLOCK #define _INCLUDE_POSIX_SOURCE /* for HP-UX */ #define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ #include "sys/types.h" #include "sys/times.h" #ifdef __cplusplus extern "C" { #endif #endif #undef Hz #ifdef CLK_TCK #define Hz CLK_TCK #else #ifdef HZ #define Hz HZ #else #define Hz 60 #endif #endif REAL #ifdef KR_headers etime_(tarray) float *tarray; #else etime_(float *tarray) #endif { #ifdef USE_CLOCK #ifndef CLOCKS_PER_SECOND #define CLOCKS_PER_SECOND Hz #endif double t = clock(); tarray[1] = 0; return tarray[0] = t / CLOCKS_PER_SECOND; #else struct tms t; times(&t); return (tarray[0] = (double)t.tms_utime/Hz) + (tarray[1] = (double)t.tms_stime/Hz); #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/exit_.c000066400000000000000000000010371413463044200222150ustar00rootroot00000000000000/* This gives the effect of subroutine exit(rc) integer*4 rc stop end * with the added side effect of supplying rc as the program's exit code. */ #include "f2c.h" #undef abs #undef min #undef max #ifndef KR_headers #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus extern "C" { #endif extern void f_exit(void); #endif void #ifdef KR_headers exit_(rc) integer *rc; #else exit_(integer *rc) #endif { #ifdef NO_ONEXIT f_exit(); #endif exit(*rc); } #ifdef __cplusplus } #endif #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/f2c.h000066400000000000000000000111201413463044200215560ustar00rootroot00000000000000/* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE typedef long int integer; typedef unsigned long int uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef double doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef long int logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; #ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ typedef long long longint; /* system-dependent */ typedef unsigned long long ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef long int flag; typedef long int ftnlen; typedef long int ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; int nvars; }; typedef struct Namelist Namelist; #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ int (*S_fp)(...); #else typedef int /* Unknown procedure type */ (*U_fp)(); typedef shortint (*J_fp)(); typedef integer (*I_fp)(); typedef real (*R_fp)(); typedef doublereal (*D_fp)(), (*E_fp)(); typedef /* Complex */ VOID (*C_fp)(); typedef /* Double Complex */ VOID (*Z_fp)(); typedef logical (*L_fp)(); typedef shortlogical (*K_fp)(); typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* double complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/f2c.h0000066400000000000000000000111201413463044200216360ustar00rootroot00000000000000/* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE typedef long int integer; typedef unsigned long int uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef double doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef long int logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; #ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ typedef long long longint; /* system-dependent */ typedef unsigned long long ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef long int flag; typedef long int ftnlen; typedef long int ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; int nvars; }; typedef struct Namelist Namelist; #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ int (*S_fp)(...); #else typedef int /* Unknown procedure type */ (*U_fp)(); typedef shortint (*J_fp)(); typedef integer (*I_fp)(); typedef real (*R_fp)(); typedef doublereal (*D_fp)(), (*E_fp)(); typedef /* Complex */ VOID (*C_fp)(); typedef /* Double Complex */ VOID (*Z_fp)(); typedef logical (*L_fp)(); typedef shortlogical (*K_fp)(); typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* double complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/f2ch.add000066400000000000000000000136641413463044200222460ustar00rootroot00000000000000/* If you are using a C++ compiler, append the following to f2c.h for compiling libF77 and libI77. */ #ifdef __cplusplus extern "C" { extern int abort_(void); extern double c_abs(complex *); extern void c_cos(complex *, complex *); extern void c_div(complex *, complex *, complex *); extern void c_exp(complex *, complex *); extern void c_log(complex *, complex *); extern void c_sin(complex *, complex *); extern void c_sqrt(complex *, complex *); extern double d_abs(double *); extern double d_acos(double *); extern double d_asin(double *); extern double d_atan(double *); extern double d_atn2(double *, double *); extern void d_cnjg(doublecomplex *, doublecomplex *); extern double d_cos(double *); extern double d_cosh(double *); extern double d_dim(double *, double *); extern double d_exp(double *); extern double d_imag(doublecomplex *); extern double d_int(double *); extern double d_lg10(double *); extern double d_log(double *); extern double d_mod(double *, double *); extern double d_nint(double *); extern double d_prod(float *, float *); extern double d_sign(double *, double *); extern double d_sin(double *); extern double d_sinh(double *); extern double d_sqrt(double *); extern double d_tan(double *); extern double d_tanh(double *); extern double derf_(double *); extern double derfc_(double *); extern integer do_fio(ftnint *, char *, ftnlen); extern integer do_lio(ftnint *, ftnint *, char *, ftnlen); extern integer do_uio(ftnint *, char *, ftnlen); extern integer e_rdfe(void); extern integer e_rdue(void); extern integer e_rsfe(void); extern integer e_rsfi(void); extern integer e_rsle(void); extern integer e_rsli(void); extern integer e_rsue(void); extern integer e_wdfe(void); extern integer e_wdue(void); extern integer e_wsfe(void); extern integer e_wsfi(void); extern integer e_wsle(void); extern integer e_wsli(void); extern integer e_wsue(void); extern int ef1asc_(ftnint *, ftnlen *, ftnint *, ftnlen *); extern integer _starpu_ef1cmc_(ftnint *, ftnlen *, ftnint *, ftnlen *); extern double erf(double); extern double erf_(float *); extern double erfc(double); extern double erfc_(float *); extern integer f_back(alist *); extern integer f_clos(cllist *); extern integer f_end(alist *); extern void f_exit(void); extern integer f_inqu(inlist *); extern integer f_open(olist *); extern integer f_rew(alist *); extern int flush_(void); extern void getarg_(integer *, char *, ftnlen); extern void getenv_(char *, char *, ftnlen, ftnlen); extern short h_abs(short *); extern short h_dim(short *, short *); extern short h_dnnt(double *); extern short h_indx(char *, char *, ftnlen, ftnlen); extern short h_len(char *, ftnlen); extern short h_mod(short *, short *); extern short h_nint(float *); extern short h_sign(short *, short *); extern short hl_ge(char *, char *, ftnlen, ftnlen); extern short hl_gt(char *, char *, ftnlen, ftnlen); extern short hl_le(char *, char *, ftnlen, ftnlen); extern short hl_lt(char *, char *, ftnlen, ftnlen); extern integer i_abs(integer *); extern integer i_dim(integer *, integer *); extern integer i_dnnt(double *); extern integer i_indx(char *, char *, ftnlen, ftnlen); extern integer i_len(char *, ftnlen); extern integer i_mod(integer *, integer *); extern integer i_nint(float *); extern integer i_sign(integer *, integer *); extern integer iargc_(void); extern ftnlen l_ge(char *, char *, ftnlen, ftnlen); extern ftnlen l_gt(char *, char *, ftnlen, ftnlen); extern ftnlen l_le(char *, char *, ftnlen, ftnlen); extern ftnlen l_lt(char *, char *, ftnlen, ftnlen); extern void pow_ci(complex *, complex *, integer *); extern double pow_dd(double *, double *); extern double pow_di(double *, integer *); extern short pow_hh(short *, shortint *); extern integer pow_ii(integer *, integer *); extern double pow_ri(float *, integer *); extern void pow_zi(doublecomplex *, doublecomplex *, integer *); extern void pow_zz(doublecomplex *, doublecomplex *, doublecomplex *); extern double r_abs(float *); extern double r_acos(float *); extern double r_asin(float *); extern double r_atan(float *); extern double r_atn2(float *, float *); extern void r_cnjg(complex *, complex *); extern double r_cos(float *); extern double r_cosh(float *); extern double r_dim(float *, float *); extern double r_exp(float *); extern double r_imag(complex *); extern double r_int(float *); extern double r_lg10(float *); extern double r_log(float *); extern double r_mod(float *, float *); extern double r_nint(float *); extern double r_sign(float *, float *); extern double r_sin(float *); extern double r_sinh(float *); extern double r_sqrt(float *); extern double r_tan(float *); extern double r_tanh(float *); extern void s_cat(char *, char **, integer *, integer *, ftnlen); extern integer s_cmp(char *, char *, ftnlen, ftnlen); extern void s_copy(char *, char *, ftnlen, ftnlen); extern int s_paus(char *, ftnlen); extern integer s_rdfe(cilist *); extern integer s_rdue(cilist *); extern integer s_rnge(char *, integer, char *, integer); extern integer s_rsfe(cilist *); extern integer s_rsfi(icilist *); extern integer s_rsle(cilist *); extern integer s_rsli(icilist *); extern integer s_rsne(cilist *); extern integer s_rsni(icilist *); extern integer s_rsue(cilist *); extern int s_stop(char *, ftnlen); extern integer s_wdfe(cilist *); extern integer s_wdue(cilist *); extern integer s_wsfe(cilist *); extern integer s_wsfi(icilist *); extern integer s_wsle(cilist *); extern integer s_wsli(icilist *); extern integer s_wsne(cilist *); extern integer s_wsni(icilist *); extern integer s_wsue(cilist *); extern void sig_die(char *, int); extern integer signal_(integer *, void (*)(int)); extern integer system_(char *, ftnlen); extern double z_abs(doublecomplex *); extern void z_cos(doublecomplex *, doublecomplex *); extern void z_div(doublecomplex *, doublecomplex *, doublecomplex *); extern void z_exp(doublecomplex *, doublecomplex *); extern void z_log(doublecomplex *, doublecomplex *); extern void z_sin(doublecomplex *, doublecomplex *); extern void z_sqrt(doublecomplex *, doublecomplex *); } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/f77_aloc.c000066400000000000000000000012541413463044200225070ustar00rootroot00000000000000#include "f2c.h" #undef abs #undef min #undef max #include "stdio.h" static integer memfailure = 3; #ifdef KR_headers extern char *malloc(); extern void exit_(); char * F77_aloc(Len, whence) integer Len; char *whence; #else #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus extern "C" { #endif extern void exit_(integer*); #ifdef __cplusplus } #endif char * F77_aloc(integer Len, const char *whence) #endif { char *rv; unsigned int uLen = (unsigned int) Len; /* for K&R C */ if (!(rv = (char*)malloc(uLen))) { fprintf(stderr, "malloc(%u) failure in %s\n", uLen, whence); exit_(&memfailure); } return rv; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/f77vers.c000066400000000000000000000115051413463044200224110ustar00rootroot00000000000000 char _libf77_version_f2c[] = "\n@(#) LIBF77 VERSION (f2c) 20051004\n"; /* 2.00 11 June 1980. File version.c added to library. 2.01 31 May 1988. s_paus() flushes stderr; names of hl_* fixed [ d]erf[c ] added 8 Aug. 1989: #ifdefs for f2c -i2 added to s_cat.c 29 Nov. 1989: s_cmp returns long (for f2c) 30 Nov. 1989: arg types from f2c.h 12 Dec. 1989: s_rnge allows long names 19 Dec. 1989: getenv_ allows unsorted environment 28 Mar. 1990: add exit(0) to end of main() 2 Oct. 1990: test signal(...) == SIG_IGN rather than & 01 in main 17 Oct. 1990: abort() calls changed to sig_die(...,1) 22 Oct. 1990: separate sig_die from main 25 Apr. 1991: minor, theoretically invisible tweaks to s_cat, sig_die 31 May 1991: make system_ return status 18 Dec. 1991: change long to ftnlen (for -i2) many places 28 Feb. 1992: repair z_sqrt.c (scribbled on input, gave wrong answer) 18 July 1992: for n < 0, repair handling of 0**n in pow_[dr]i.c and m**n in pow_hh.c and pow_ii.c; catch SIGTRAP in main() for error msg before abort 23 July 1992: switch to ANSI prototypes unless KR_headers is #defined 23 Oct. 1992: fix botch in signal_.c (erroneous deref of 2nd arg); change Cabs to f__cabs. 12 March 1993: various tweaks for C++ 2 June 1994: adjust so abnormal terminations invoke f_exit just once 16 Sept. 1994: s_cmp: treat characters as unsigned in comparisons. 19 Sept. 1994: s_paus: flush after end of PAUSE; add -DMSDOS 12 Jan. 1995: pow_[dhiqrz][hiq]: adjust x**i to work on machines that sign-extend right shifts when i is the most negative integer. 26 Jan. 1995: adjust s_cat.c, s_copy.c to permit the left-hand side of character assignments to appear on the right-hand side (unless compiled with -DNO_OVERWRITE). 27 Jan. 1995: minor tweak to s_copy.c: copy forward whenever possible (for better cache behavior). 30 May 1995: added subroutine exit(rc) integer rc. Version not changed. 29 Aug. 1995: add F77_aloc.c; use it in s_cat.c and system_.c. 6 Sept. 1995: fix return type of system_ under -DKR_headers. 19 Dec. 1995: s_cat.c: fix bug when 2nd or later arg overlaps lhs. 19 Mar. 1996: s_cat.c: supply missing break after overlap detection. 13 May 1996: add [lq]bitbits.c and [lq]bitshft.c (f90 bit intrinsics). 19 June 1996: add casts to unsigned in [lq]bitshft.c. 26 Feb. 1997: adjust functions with a complex output argument to permit aliasing it with input arguments. (For now, at least, this is just for possible benefit of g77.) 4 April 1997: [cz]_div.c: tweaks invisible on most systems (that may affect systems using gratuitous extra precision). 19 Sept. 1997: [de]time_.c (Unix systems only): change return type to double. 2 May 1999: getenv_.c: omit environ in favor of getenv(). c_cos.c, c_exp.c, c_sin.c, d_cnjg.c, r_cnjg.c, z_cos.c, z_exp.c, z_log.c, z_sin.c: cope fully with overlapping arguments caused by equivalence. 3 May 1999: "invisible" tweaks to omit compiler warnings in abort_.c, ef1asc_.c, s_rnge.c, s_stop.c. 7 Sept. 1999: [cz]_div.c: arrange for compilation under -DIEEE_COMPLEX_DIVIDE to make these routines avoid calling sig_die when the denominator vanishes; instead, they return pairs of NaNs or Infinities, depending whether the numerator also vanishes or not. VERSION not changed. 15 Nov. 1999: s_rnge.c: add casts for the case of sizeof(ftnint) == sizeof(int) < sizeof(long). 10 March 2000: z_log.c: improve accuracy of Real(log(z)) for, e.g., z near (+-1,eps) with |eps| small. For the old evaluation, compile with -DPre20000310 . 20 April 2000: s_cat.c: tweak argument types to accord with calls by f2c when ftnint and ftnlen are of different sizes (different numbers of bits). 4 July 2000: adjustments to permit compilation by C++ compilers; VERSION string remains unchanged. 29 Sept. 2000: dtime_.c, etime_.c: use floating-point divide. dtime_.d, erf_.c, erfc_.c, etime.c: for use with "f2c -R", compile with -DREAL=float. 23 June 2001: add uninit.c; [fi]77vers.c: make version strings visible as extern char _lib[fi]77_version_f2c[]. 5 July 2001: modify uninit.c for __mc68k__ under Linux. 16 Nov. 2001: uninit.c: Linux Power PC logic supplied by Alan Bain. 18 Jan. 2002: fix glitches in qbit_bits(): wrong return type, missing ~ on y in return value. 14 March 2002: z_log.c: add code to cope with buggy compilers (e.g., some versions of gcc under -O2 or -O3) that do floating-point comparisons against values computed into extended-precision registers on some systems (such as Intel IA32 systems). Compile with -DNO_DOUBLE_EXTENDED to omit the new logic. 4 Oct. 2002: uninit.c: on IRIX systems, omit use of shell variables. 10 Oct 2005: uninit.c: on IA32 Linux systems, leave the rounding precision alone rather than forcing it to 53 bits; compile with -DUNINIT_F2C_PRECISION_53 to get the former behavior. */ starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/fio.h000066400000000000000000000055731413463044200217000ustar00rootroot00000000000000#ifndef SYSDEP_H_INCLUDED #include "sysdep1.h" #endif #include "stdio.h" #include "errno.h" #ifndef NULL /* ANSI C */ #include "stddef.h" #endif #ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif #ifndef FOPEN #define FOPEN fopen #endif #ifndef FREOPEN #define FREOPEN freopen #endif #ifndef FSEEK #define FSEEK fseek #endif #ifndef FSTAT #define FSTAT fstat #endif #ifndef FTELL #define FTELL ftell #endif #ifndef OFF_T #define OFF_T long #endif #ifndef STAT_ST #define STAT_ST stat #endif #ifndef STAT #define STAT stat #endif #ifdef MSDOS #ifndef NON_UNIX_STDIO #define NON_UNIX_STDIO #endif #endif #ifdef UIOLEN_int typedef int uiolen; #else typedef long uiolen; #endif /*units*/ typedef struct { FILE *ufd; /*0=unconnected*/ char *ufnm; #ifndef MSDOS long uinode; int udev; #endif int url; /*0=sequential*/ flag useek; /*true=can backspace, use dir, ...*/ flag ufmt; flag urw; /* (1 for can read) | (2 for can write) */ flag ublnk; flag uend; flag uwrt; /*last io was write*/ flag uscrtch; } unit; #undef Void #ifdef KR_headers #define Void /*void*/ extern int (*f__getn)(); /* for formatted input */ extern void (*f__putn)(); /* for formatted output */ extern void x_putc(); extern long f__inode(); extern VOID sig_die(); extern int (*f__donewrec)(), t_putc(), x_wSL(); extern int c_sfe(), err__fl(), xrd_SL(), f__putbuf(); #else #define Void void #ifdef __cplusplus extern "C" { #endif extern int (*f__getn)(void); /* for formatted input */ extern void (*f__putn)(int); /* for formatted output */ extern void x_putc(int); extern long f__inode(char*,int*); extern void sig_die(const char*,int); extern void f__fatal(int, const char*); extern int t_runc(alist*); extern int f__nowreading(unit*), f__nowwriting(unit*); extern int fk_open(int,int,ftnint); extern int en_fio(void); extern void f_init(void); extern int (*f__donewrec)(void), t_putc(int), x_wSL(void); extern void b_char(const char*,char*,ftnlen), g_char(const char*,ftnlen,char*); extern int c_sfe(cilist*), z_rnew(void); extern int err__fl(int,int,const char*); extern int xrd_SL(void); extern int f__putbuf(int); #endif extern flag f__init; extern cilist *f__elist; /*active external io list*/ extern flag f__reading,f__external,f__sequential,f__formatted; extern int (*f__doend)(Void); extern FILE *f__cf; /*current file*/ extern unit *f__curunit; /*current unit*/ extern unit f__units[]; #define err(f,m,s) {if(f) errno= m; else f__fatal(m,s); return(m);} #define errfl(f,m,s) return err__fl((int)f,m,s) /*Table sizes*/ #define MXUNIT 100 extern int f__recpos; /*position in current record*/ extern OFF_T f__cursor; /* offset to move to */ extern OFF_T f__hiwater; /* so TL doesn't confuse us */ #ifdef __cplusplus } #endif #define WRITE 1 #define READ 2 #define SEQ 3 #define DIR 4 #define FMT 5 #define UNF 6 #define EXT 7 #define INT 8 #define buf_end(x) (x->_flag & _IONBF ? x->_ptr : x->_base + BUFSIZ) starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/fmt.c000066400000000000000000000205661413463044200217030ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif #define skip(s) while(*s==' ') s++ #ifdef interdata #define SYLMX 300 #endif #ifdef pdp11 #define SYLMX 300 #endif #ifdef vax #define SYLMX 300 #endif #ifndef SYLMX #define SYLMX 300 #endif #define GLITCH '\2' /* special quote character for stu */ extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/ static struct syl f__syl[SYLMX]; int f__parenlvl,f__pc,f__revloc; #ifdef KR_headers #define Const /*nothing*/ #else #define Const const #endif static #ifdef KR_headers char *ap_end(s) char *s; #else const char *ap_end(const char *s) #endif { char quote; quote= *s++; for(;*s;s++) { if(*s!=quote) continue; if(*++s!=quote) return(s); } if(f__elist->cierr) { errno = 100; return(NULL); } f__fatal(100, "bad string"); /*NOTREACHED*/ return 0; } static int #ifdef KR_headers op_gen(a,b,c,d) #else op_gen(int a, int b, int c, int d) #endif { struct syl *p= &f__syl[f__pc]; if(f__pc>=SYLMX) { fprintf(stderr,"format too complicated:\n"); sig_die(f__fmtbuf, 1); } p->op=a; p->p1=b; p->p2.i[0]=c; p->p2.i[1]=d; return(f__pc++); } #ifdef KR_headers static char *f_list(); static char *gt_num(s,n,n1) char *s; int *n, n1; #else static const char *f_list(const char*); static const char *gt_num(const char *s, int *n, int n1) #endif { int m=0,f__cnt=0; char c; for(c= *s;;c = *s) { if(c==' ') { s++; continue; } if(c>'9' || c<'0') break; m=10*m+c-'0'; f__cnt++; s++; } if(f__cnt==0) { if (!n1) s = 0; *n=n1; } else *n=m; return(s); } static #ifdef KR_headers char *f_s(s,curloc) char *s; #else const char *f_s(const char *s, int curloc) #endif { skip(s); if(*s++!='(') { return(NULL); } if(f__parenlvl++ ==1) f__revloc=curloc; if(op_gen(RET1,curloc,0,0)<0 || (s=f_list(s))==NULL) { return(NULL); } skip(s); return(s); } static int #ifdef KR_headers ne_d(s,p) char *s,**p; #else ne_d(const char *s, const char **p) #endif { int n,x,sign=0; struct syl *sp; switch(*s) { default: return(0); case ':': (void) op_gen(COLON,0,0,0); break; case '$': (void) op_gen(NONL, 0, 0, 0); break; case 'B': case 'b': if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0); else (void) op_gen(BN,0,0,0); break; case 'S': case 's': if(*(s+1)=='s' || *(s+1) == 'S') { x=SS; s++; } else if(*(s+1)=='p' || *(s+1) == 'P') { x=SP; s++; } else x=S; (void) op_gen(x,0,0,0); break; case '/': (void) op_gen(SLASH,0,0,0); break; case '-': sign=1; case '+': s++; /*OUTRAGEOUS CODING TRICK*/ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!(s=gt_num(s,&n,0))) { bad: *p = 0; return 1; } switch(*s) { default: return(0); case 'P': case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break; case 'X': case 'x': (void) op_gen(X,n,0,0); break; case 'H': case 'h': sp = &f__syl[op_gen(H,n,0,0)]; sp->p2.s = (char*)s + 1; s+=n; break; } break; case GLITCH: case '"': case '\'': sp = &f__syl[op_gen(APOS,0,0,0)]; sp->p2.s = (char*)s; if((*p = ap_end(s)) == NULL) return(0); return(1); case 'T': case 't': if(*(s+1)=='l' || *(s+1) == 'L') { x=TL; s++; } else if(*(s+1)=='r'|| *(s+1) == 'R') { x=TR; s++; } else x=T; if (!(s=gt_num(s+1,&n,0))) goto bad; s--; (void) op_gen(x,n,0,0); break; case 'X': case 'x': (void) op_gen(X,1,0,0); break; case 'P': case 'p': (void) op_gen(P,1,0,0); break; } s++; *p=s; return(1); } static int #ifdef KR_headers e_d(s,p) char *s,**p; #else e_d(const char *s, const char **p) #endif { int i,im,n,w,d,e,found=0,x=0; Const char *sv=s; s=gt_num(s,&n,1); (void) op_gen(STACK,n,0,0); switch(*s++) { default: break; case 'E': case 'e': x=1; case 'G': case 'g': found=1; if (!(s=gt_num(s,&w,0))) { bad: *p = 0; return 1; } if(w==0) break; if(*s=='.') { if (!(s=gt_num(s+1,&d,0))) goto bad; } else d=0; if(*s!='E' && *s != 'e') (void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */ else { if (!(s=gt_num(s+1,&e,0))) goto bad; (void) op_gen(x==1?EE:GE,w,d,e); } break; case 'O': case 'o': i = O; im = OM; goto finish_I; case 'Z': case 'z': i = Z; im = ZM; goto finish_I; case 'L': case 'l': found=1; if (!(s=gt_num(s,&w,0))) goto bad; if(w==0) break; (void) op_gen(L,w,0,0); break; case 'A': case 'a': found=1; skip(s); if(*s>='0' && *s<='9') { s=gt_num(s,&w,1); if(w==0) break; (void) op_gen(AW,w,0,0); break; } (void) op_gen(A,0,0,0); break; case 'F': case 'f': if (!(s=gt_num(s,&w,0))) goto bad; found=1; if(w==0) break; if(*s=='.') { if (!(s=gt_num(s+1,&d,0))) goto bad; } else d=0; (void) op_gen(F,w,d,0); break; case 'D': case 'd': found=1; if (!(s=gt_num(s,&w,0))) goto bad; if(w==0) break; if(*s=='.') { if (!(s=gt_num(s+1,&d,0))) goto bad; } else d=0; (void) op_gen(D,w,d,0); break; case 'I': case 'i': i = I; im = IM; finish_I: if (!(s=gt_num(s,&w,0))) goto bad; found=1; if(w==0) break; if(*s!='.') { (void) op_gen(i,w,0,0); break; } if (!(s=gt_num(s+1,&d,0))) goto bad; (void) op_gen(im,w,d,0); break; } if(found==0) { f__pc--; /*unSTACK*/ *p=sv; return(0); } *p=s; return(1); } static #ifdef KR_headers char *i_tem(s) char *s; #else const char *i_tem(const char *s) #endif { const char *t; int n,curloc; if(*s==')') return(s); if(ne_d(s,&t)) return(t); if(e_d(s,&t)) return(t); s=gt_num(s,&n,1); if((curloc=op_gen(STACK,n,0,0))<0) return(NULL); return(f_s(s,curloc)); } static #ifdef KR_headers char *f_list(s) char *s; #else const char *f_list(const char *s) #endif { for(;*s!=0;) { skip(s); if((s=i_tem(s))==NULL) return(NULL); skip(s); if(*s==',') s++; else if(*s==')') { if(--f__parenlvl==0) { (void) op_gen(REVERT,f__revloc,0,0); return(++s); } (void) op_gen(GOTO,0,0,0); return(++s); } } return(NULL); } int #ifdef KR_headers pars_f(s) char *s; #else pars_f(const char *s) #endif { f__parenlvl=f__revloc=f__pc=0; if(f_s(s,0) == NULL) { return(-1); } return(0); } #define STKSZ 10 int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp; flag f__workdone, f__nonl; static int #ifdef KR_headers type_f(n) #else type_f(int n) #endif { switch(n) { default: return(n); case RET1: return(RET1); case REVERT: return(REVERT); case GOTO: return(GOTO); case STACK: return(STACK); case X: case SLASH: case APOS: case H: case T: case TL: case TR: return(NED); case F: case I: case IM: case A: case AW: case O: case OM: case L: case E: case EE: case D: case G: case GE: case Z: case ZM: return(ED); } } #ifdef KR_headers integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; #else integer do_fio(ftnint *number, char *ptr, ftnlen len) #endif { struct syl *p; int n,i; for(i=0;i<*number;i++,ptr+=len) { loop: switch(type_f((p= &f__syl[f__pc])->op)) { default: fprintf(stderr,"unknown code in do_fio: %d\n%s\n", p->op,f__fmtbuf); err(f__elist->cierr,100,"do_fio"); case NED: if((*f__doned)(p)) { f__pc++; goto loop; } f__pc++; continue; case ED: if(f__cnt[f__cp]<=0) { f__cp--; f__pc++; goto loop; } if(ptr==NULL) return((*f__doend)()); f__cnt[f__cp]--; f__workdone=1; if((n=(*f__doed)(p,ptr,len))>0) errfl(f__elist->cierr,errno,"fmt"); if(n<0) err(f__elist->ciend,(EOF),"fmt"); continue; case STACK: f__cnt[++f__cp]=p->p1; f__pc++; goto loop; case RET1: f__ret[++f__rp]=p->p1; f__pc++; goto loop; case GOTO: if(--f__cnt[f__cp]<=0) { f__cp--; f__rp--; f__pc++; goto loop; } f__pc=1+f__ret[f__rp--]; goto loop; case REVERT: f__rp=f__cp=0; f__pc = p->p1; if(ptr==NULL) return((*f__doend)()); if(!f__workdone) return(0); if((n=(*f__dorevert)()) != 0) return(n); goto loop; case COLON: if(ptr==NULL) return((*f__doend)()); f__pc++; goto loop; case NONL: f__nonl = 1; f__pc++; goto loop; case S: case SS: f__cplus=0; f__pc++; goto loop; case SP: f__cplus = 1; f__pc++; goto loop; case P: f__scale=p->p1; f__pc++; goto loop; case BN: f__cblank=0; f__pc++; goto loop; case BZ: f__cblank=1; f__pc++; goto loop; } } return(0); } int en_fio(Void) { ftnint one=1; return(do_fio(&one,(char *)NULL,(ftnint)0)); } VOID fmt_bg(Void) { f__workdone=f__cp=f__rp=f__pc=f__cursor=0; f__cnt[0]=f__ret[0]=0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/fmt.h000066400000000000000000000037261413463044200217070ustar00rootroot00000000000000struct syl { int op; int p1; union { int i[2]; char *s;} p2; }; #define RET1 1 #define REVERT 2 #define GOTO 3 #define X 4 #define SLASH 5 #define STACK 6 #define I 7 #define ED 8 #define NED 9 #define IM 10 #define APOS 11 #define H 12 #define TL 13 #define TR 14 #define T 15 #define COLON 16 #define S 17 #define SP 18 #define SS 19 #define P 20 #define BN 21 #define BZ 22 #define F 23 #define E 24 #define EE 25 #define D 26 #define G 27 #define GE 28 #define L 29 #define A 30 #define AW 31 #define O 32 #define NONL 33 #define OM 34 #define Z 35 #define ZM 36 typedef union { real pf; doublereal pd; } ufloat; typedef union { short is; #ifndef KR_headers signed #endif char ic; integer il; #ifdef Allow_TYQUAD longint ili; #endif } Uint; #ifdef KR_headers extern int (*f__doed)(),(*f__doned)(); extern int (*f__dorevert)(); extern int rd_ed(),rd_ned(); extern int w_ed(),w_ned(); extern int signbit_f2c(); extern char *f__fmtbuf; #else #ifdef __cplusplus extern "C" { #define Cextern extern "C" #else #define Cextern extern #endif extern const char *f__fmtbuf; extern int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*); extern int (*f__dorevert)(void); extern void fmt_bg(void); extern int pars_f(const char*); extern int rd_ed(struct syl*, char*, ftnlen),rd_ned(struct syl*); extern int signbit_f2c(double*); extern int w_ed(struct syl*, char*, ftnlen),w_ned(struct syl*); extern int wrt_E(ufloat*, int, int, int, ftnlen); extern int wrt_F(ufloat*, int, int, ftnlen); extern int wrt_L(Uint*, int, ftnlen); #endif extern int f__pc,f__parenlvl,f__revloc; extern flag f__cblank,f__cplus,f__workdone, f__nonl; extern int f__scale; #ifdef __cplusplus } #endif #define GET(x) if((x=(*f__getn)())<0) return(x) #define VAL(x) (x!='\n'?x:' ') #define PUT(x) (*f__putn)(x) #undef TYQUAD #ifndef Allow_TYQUAD #undef longint #define longint long #else #define TYQUAD 14 #endif #ifdef KR_headers extern char *f__icvt(); #else Cextern char *f__icvt(longint, int*, int*, int); #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/fmtlib.c000066400000000000000000000015411413463044200223620ustar00rootroot00000000000000/* @(#)fmtlib.c 1.2 */ #define MAXINTLENGTH 23 #include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifndef Allow_TYQUAD #undef longint #define longint long #undef ulongint #define ulongint unsigned long #endif #ifdef KR_headers char *f__icvt(value,ndigit,sign, base) longint value; int *ndigit,*sign; register int base; #else char *f__icvt(longint value, int *ndigit, int *sign, int base) #endif { static char buf[MAXINTLENGTH+1]; register int i; ulongint uvalue; if(value > 0) { uvalue = value; *sign = 0; } else if (value < 0) { uvalue = -value; *sign = 1; } else { *sign = 0; *ndigit = 1; buf[MAXINTLENGTH-1] = '0'; return &buf[MAXINTLENGTH-1]; } i = MAXINTLENGTH; do { buf[--i] = (uvalue%base) + '0'; uvalue /= base; } while(uvalue > 0); *ndigit = MAXINTLENGTH - i; return &buf[i]; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/fp.h000066400000000000000000000012311413463044200215130ustar00rootroot00000000000000#define FMAX 40 #define EXPMAXDIGS 8 #define EXPMAX 99999999 /* FMAX = max number of nonzero digits passed to atof() */ /* EXPMAX = 10^EXPMAXDIGS - 1 = largest allowed exponent absolute value */ #ifdef V10 /* Research Tenth-Edition Unix */ #include "local.h" #endif /* MAXFRACDIGS and MAXINTDIGS are for wrt_F -- bounds (not necessarily tight) on the maximum number of digits to the right and left of * the decimal point. */ #ifdef VAX #define MAXFRACDIGS 56 #define MAXINTDIGS 38 #else #ifdef CRAY #define MAXFRACDIGS 9880 #define MAXINTDIGS 9864 #else /* values that suffice for IEEE double */ #define MAXFRACDIGS 344 #define MAXINTDIGS 308 #endif #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/ftell64_.c000066400000000000000000000016251413463044200225270ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif static FILE * #ifdef KR_headers unit_chk(Unit, who) integer Unit; char *who; #else unit_chk(integer Unit, char *who) #endif { if (Unit >= MXUNIT || Unit < 0) f__fatal(101, who); return f__units[Unit].ufd; } longint #ifdef KR_headers ftell64_(Unit) integer *Unit; #else ftell64_(integer *Unit) #endif { FILE *f; return (f = unit_chk(*Unit, "ftell")) ? FTELL(f) : -1L; } int #ifdef KR_headers fseek64_(Unit, offset, whence) integer *Unit, *whence; longint *offset; #else fseek64_(integer *Unit, longint *offset, integer *whence) #endif { FILE *f; int w = (int)*whence; #ifdef SEEK_SET static int wohin[3] = { SEEK_SET, SEEK_CUR, SEEK_END }; #endif if (w < 0 || w > 2) w = 0; #ifdef SEEK_SET w = wohin[w]; #endif return !(f = unit_chk(*Unit, "fseek")) || FSEEK(f, (OFF_T)*offset, w) ? 1 : 0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/ftell_.c000066400000000000000000000016041413463044200223520ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif static FILE * #ifdef KR_headers unit_chk(Unit, who) integer Unit; char *who; #else unit_chk(integer Unit, const char *who) #endif { if (Unit >= MXUNIT || Unit < 0) f__fatal(101, who); return f__units[Unit].ufd; } integer #ifdef KR_headers ftell_(Unit) integer *Unit; #else ftell_(integer *Unit) #endif { FILE *f; return (f = unit_chk(*Unit, "ftell")) ? ftell(f) : -1L; } int #ifdef KR_headers fseek_(Unit, offset, whence) integer *Unit, *offset, *whence; #else fseek_(integer *Unit, integer *offset, integer *whence) #endif { FILE *f; int w = (int)*whence; #ifdef SEEK_SET static int wohin[3] = { SEEK_SET, SEEK_CUR, SEEK_END }; #endif if (w < 0 || w > 2) w = 0; #ifdef SEEK_SET w = wohin[w]; #endif return !(f = unit_chk(*Unit, "fseek")) || fseek(f, *offset, w) ? 1 : 0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/getarg_.c000066400000000000000000000011201413463044200225060ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif /* * subroutine getarg(k, c) * returns the kth unix command argument in fortran character * variable argument c */ #ifdef KR_headers VOID getarg_(n, s, ls) ftnint *n; char *s; ftnlen ls; #define Const /*nothing*/ #else #define Const const void getarg_(ftnint *n, char *s, ftnlen ls) #endif { extern int xargc; extern char **xargv; Const char *t; int i; if(*n>=0 && *n #include #ifdef __cplusplus extern "C" { #endif extern char *F77_aloc(ftnlen, const char*); #endif /* * getenv - f77 subroutine to return environment variables * * called by: * call getenv (ENV_NAME, char_var) * where: * ENV_NAME is the name of an environment variable * char_var is a character variable which will receive * the current value of ENV_NAME, or all blanks * if ENV_NAME is not defined */ #ifdef KR_headers VOID getenv_(fname, value, flen, vlen) char *value, *fname; ftnlen vlen, flen; #else void getenv_(char *fname, char *value, ftnlen flen, ftnlen vlen) #endif { char buf[256], *ep, *fp; integer i; if (flen <= 0) goto add_blanks; for(i = 0; i < sizeof(buf); i++) { if (i == flen || (buf[i] = fname[i]) == ' ') { buf[i] = 0; ep = getenv(buf); goto have_ep; } } while(i < flen && fname[i] != ' ') i++; strncpy(fp = F77_aloc(i+1, "getenv_"), fname, (int)i); fp[i] = 0; ep = getenv(fp); free(fp); have_ep: if (ep) while(*ep && vlen-- > 0) *value++ = *ep++; add_blanks: while(vlen-- > 0) *value++ = ' '; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_abs.c000066400000000000000000000003321413463044200221560ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint h_abs(x) shortint *x; #else shortint h_abs(shortint *x) #endif { if(*x >= 0) return(*x); return(- *x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_dim.c000066400000000000000000000003461413463044200221670ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint h_dim(a,b) shortint *a, *b; #else shortint h_dim(shortint *a, shortint *b) #endif { return( *a > *b ? *a - *b : 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_dnnt.c000066400000000000000000000004461413463044200223620ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); shortint h_dnnt(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif shortint h_dnnt(doublereal *x) #endif { return (shortint)(*x >= 0. ? floor(*x + .5) : -floor(.5 - *x)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_indx.c000066400000000000000000000006721413463044200223620ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint h_indx(a, b, la, lb) char *a, *b; ftnlen la, lb; #else shortint h_indx(char *a, char *b, ftnlen la, ftnlen lb) #endif { ftnlen i, n; char *s, *t, *bend; n = la - lb + 1; bend = b + lb; for(i = 0 ; i < n ; ++i) { s = a + i; t = b; while(t < bend) if(*s++ != *t++) goto no; return((shortint)i+1); no: ; } return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_len.c000066400000000000000000000003151413463044200221700ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint h_len(s, n) char *s; ftnlen n; #else shortint h_len(char *s, ftnlen n) #endif { return(n); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_mod.c000066400000000000000000000003171413463044200221730ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint h_mod(a,b) short *a, *b; #else shortint h_mod(short *a, short *b) #endif { return( *a % *b); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_nint.c000066400000000000000000000004311413463044200223610ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); shortint h_nint(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif shortint h_nint(real *x) #endif { return (shortint)(*x >= 0 ? floor(*x + .5) : -floor(.5 - *x)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/h_sign.c000066400000000000000000000004121413463044200223500ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint h_sign(a,b) shortint *a, *b; #else shortint h_sign(shortint *a, shortint *b) #endif { shortint x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/hl_ge.c000066400000000000000000000005321413463044200221620ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); shortlogical hl_ge(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); shortlogical hl_ge(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) >= 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/hl_gt.c000066400000000000000000000005311413463044200222000ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); shortlogical hl_gt(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); shortlogical hl_gt(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) > 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/hl_le.c000066400000000000000000000005321413463044200221670ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); shortlogical hl_le(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); shortlogical hl_le(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) <= 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/hl_lt.c000066400000000000000000000005311413463044200222050ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); shortlogical hl_lt(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); shortlogical hl_lt(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) < 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i77vers.c000066400000000000000000000433201413463044200224140ustar00rootroot00000000000000 char _libi77_version_f2c[] = "\n@(#) LIBI77 VERSION (f2c) pjw,dmg-mods 20030321\n"; /* 2.01 $ format added 2.02 Coding bug in open.c repaired 2.03 fixed bugs in lread.c (read * with negative f-format) and lio.c and lio.h (e-format conforming to spec) 2.04 changed open.c and err.c (fopen and freopen respectively) to update to new c-library (append mode) 2.05 added namelist capability 2.06 allow internal list and namelist I/O */ /* close.c: allow upper-case STATUS= values endfile.c create fort.nnn if unit nnn not open; else if (file length == 0) use creat() rather than copy; use local copy() rather than forking /bin/cp; rewind, fseek to clear buffer (for no reading past EOF) err.c use neither setbuf nor setvbuf; make stderr buffered fio.h #define _bufend inquire.c upper case responses; omit byfile test from SEQUENTIAL= answer "YES" to DIRECT= for unopened file (open to debate) lio.c flush stderr, stdout at end of each stmt space before character strings in list output only at line start lio.h adjust LEW, LED consistent with old libI77 lread.c use atof() allow "nnn*," when reading complex constants open.c try opening for writing when open for read fails, with special uwrt value (2) delaying creat() to first write; set curunit so error messages don't drop core; no file name ==> fort.nnn except for STATUS='SCRATCH' rdfmt.c use atof(); trust EOF == end-of-file (so don't read past end-of-file after endfile stmt) sfe.c flush stderr, stdout at end of each stmt wrtfmt.c: use upper case put wrt_E and wrt_F into wref.c, use sprintf() rather than ecvt() and fcvt() [more accurate on VAX] */ /* 16 Oct. 1988: uwrt = 3 after write, rewind, so close won't zap the file. */ /* 10 July 1989: change _bufend to buf_end in fio.h, wsfe.c, wrtfmt.c */ /* 28 Nov. 1989: corrections for IEEE and Cray arithmetic */ /* 29 Nov. 1989: change various int return types to long for f2c */ /* 30 Nov. 1989: various types from f2c.h */ /* 6 Dec. 1989: types corrected various places */ /* 19 Dec. 1989: make iostat= work right for internal I/O */ /* 8 Jan. 1990: add rsne, wsne -- routines for handling NAMELIST */ /* 28 Jan. 1990: have NAMELIST read treat $ as &, general white space as blank */ /* 27 Mar. 1990: change an = to == in rd_L(rdfmt.c) so formatted reads of logical values reject letters other than fFtT; have nowwriting reset cf */ /* 14 Aug. 1990: adjust lread.c to treat tabs as spaces in list input */ /* 17 Aug. 1990: adjust open.c to recognize blank='Z...' as well as blank='z...' when reopening an open file */ /* 30 Aug. 1990: prevent embedded blanks in list output of complex values; omit exponent field in list output of values of magnitude between 10 and 1e8; prevent writing stdin and reading stdout or stderr; don't close stdin, stdout, or stderr when reopening units 5, 6, 0. */ /* 18 Sep. 1990: add component udev to unit and consider old == new file iff uinode and udev values agree; use stat rather than access to check existence of file (when STATUS='OLD')*/ /* 2 Oct. 1990: adjust rewind.c so two successive rewinds after a write don't clobber the file. */ /* 9 Oct. 1990: add #include "fcntl.h" to endfile.c, err.c, open.c; adjust g_char in util.c for segmented memories. */ /* 17 Oct. 1990: replace abort() and _cleanup() with calls on sig_die(...,1) (defined in main.c). */ /* 5 Nov. 1990: changes to open.c: complain if new= is specified and the file already exists; allow file= to be omitted in open stmts and allow status='replace' (Fortran 90 extensions). */ /* 11 Dec. 1990: adjustments for POSIX. */ /* 15 Jan. 1991: tweak i_ungetc in rsli.c to allow reading from strings in read-only memory. */ /* 25 Apr. 1991: adjust namelist stuff to work with f2c -i2 */ /* 26 Apr. 1991: fix some bugs with NAMELIST read of multi-dim. arrays */ /* 16 May 1991: increase LEFBL in lio.h to bypass NeXT bug */ /* 17 Oct. 1991: change type of length field in sequential unformatted records from int to long (for systems where sizeof(int) can vary, depending on the compiler or compiler options). */ /* 14 Nov. 1991: change uint to Uint in fmt.h, rdfmt.c, wrtfmt.c. */ /* 25 Nov. 1991: change uint to Uint in lwrite.c; change sizeof(int) to sizeof(uioint) in fseeks in sue.c (missed on 17 Oct.). */ /* 1 Dec. 1991: uio.c: add test for read failure (seq. unformatted reads); adjust an error return from EOF to off end of record */ /* 12 Dec. 1991: rsli.c: fix bug with internal list input that caused the last character of each record to be ignored. iio.c: adjust error message in internal formatted input from "end-of-file" to "off end of record" if the format specifies more characters than the record contains. */ /* 17 Jan. 1992: lread.c, rsne.c: in list and namelist input, treat "r* ," and "r*," alike (where r is a positive integer constant), and fix a bug in handling null values following items with repeat counts (e.g., 2*1,,3); for namelist reading of a numeric array, allow a new name-value subsequence to terminate the current one (as though the current one ended with the right number of null values). lio.h, lwrite.c: omit insignificant zeros in list and namelist output. To get the old behavior, compile with -DOld_list_output . */ /* 18 Jan. 1992: make list output consistent with F format by printing .1 rather than 0.1 (introduced yesterday). */ /* 3 Feb. 1992: rsne.c: fix namelist read bug that caused the character following a comma to be ignored. */ /* 19 May 1992: adjust iio.c, ilnw.c, rdfmt.c and rsli.c to make err= work with internal list and formatted I/O. */ /* 18 July 1992: adjust rsne.c to allow namelist input to stop at an & (e.g. &end). */ /* 23 July 1992: switch to ANSI prototypes unless KR_headers is #defined ; recognize Z format (assuming 8-bit bytes). */ /* 14 Aug. 1992: tweak wrt_E in wref.c to avoid -NaN */ /* 23 Oct. 1992: Supply missing l_eof = 0 assignment to s_rsne() in rsne.c (so end-of-file on other files won't confuse namelist reads of external files). Prepend f__ to external names that are only of internal interest to lib[FI]77. */ /* 1 Feb. 1993: backspace.c: fix bug that bit when last char of 2nd buffer == '\n'. endfile.c: guard against tiny L_tmpnam; close and reopen files in t_runc(). lio.h: lengthen LINTW (buffer size in lwrite.c). err.c, open.c: more prepending of f__ (to [rw]_mode). */ /* 5 Feb. 1993: tweaks to NAMELIST: rsne.c: ? prints the namelist being sought; namelists of the wrong name are skipped (after an error message; xwsne.c: namelist writes have a newline before each new variable. open.c: ACCESS='APPEND' positions sequential files at EOF (nonstandard extension -- that doesn't require changing data structures). */ /* 9 Feb. 1993: Change some #ifdef MSDOS lines to #ifdef NON_UNIX_STDIO. err.c: under NON_UNIX_STDIO, avoid close(creat(name,0666)) when the unit has another file descriptor for name. */ /* 4 March 1993: err.c, open.c: take declaration of fdopen from rawio.h; open.c: always give f__w_mode[] 4 elements for use in t_runc (in endfile.c -- for change of 1 Feb. 1993). */ /* 6 March 1993: uio.c: adjust off-end-of-record test for sequential unformatted reads to respond to err= rather than end=. */ /* 12 March 1993: various tweaks for C++ */ /* 6 April 1993: adjust error returns for formatted inputs to flush the current input line when err=label is specified. To restore the old behavior (input left mid-line), either adjust the #definition of errfl in fio.h or omit the invocation of f__doend in err__fl (in err.c). */ /* 23 June 1993: iio.c: fix bug in format reversions for internal writes. */ /* 5 Aug. 1993: lread.c: fix bug in handling repetition counts for logical data (during list or namelist input). Change struct f__syl to struct syl (for buggy compilers). */ /* 7 Aug. 1993: lread.c: fix bug in namelist reading of incomplete logical arrays. */ /* 9 Aug. 1993: lread.c: fix bug in namelist reading of an incomplete array of numeric data followed by another namelist item whose name starts with 'd', 'D', 'e', or 'E'. */ /* 8 Sept. 1993: open.c: protect #include "sys/..." with #ifndef NON_UNIX_STDIO; Version date not changed. */ /* 10 Nov. 1993: backspace.c: add nonsense for #ifdef MSDOS */ /* 8 Dec. 1993: iio.c: adjust internal formatted reads to treat short records as though padded with blanks (rather than causing an "off end of record" error). */ /* 22 Feb. 1994: lread.c: check that realloc did not return NULL. */ /* 6 June 1994: Under NON_UNIX_STDIO, use binary mode for direct formatted files (avoiding any confusion regarding \n). */ /* 5 July 1994: Fix bug (introduced 6 June 1994?) in reopening files under NON_UNIX_STDIO. */ /* 6 July 1994: wref.c: protect with #ifdef GOOD_SPRINTF_EXPONENT an optimization that requires exponents to have 2 digits when 2 digits suffice. lwrite.c wsfe.c (list and formatted external output): omit ' ' carriage-control when compiled with -DOMIT_BLANK_CC . Off-by-one bug fixed in character count for list output of character strings. Omit '.' in list-directed printing of Nan, Infinity. */ /* 12 July 1994: wrtfmt.c: under G11.4, write 0. as " .0000 " rather than " .0000E+00". */ /* 3 Aug. 1994: lwrite.c: do not insert a newline when appending an oversize item to an empty line. */ /* 12 Aug. 1994: rsli.c rsne.c: fix glitch (reset nml_read) that kept ERR= (in list- or format-directed input) from working after a NAMELIST READ. */ /* 7 Sept. 1994: typesize.c: adjust to allow types LOGICAL*1, LOGICAL*2, INTEGER*1, and (under -DAllow_TYQUAD) INTEGER*8 in NAMELISTs. */ /* 6 Oct. 1994: util.c: omit f__mvgbt, as it is never used. */ /* 2 Nov. 1994: add #ifdef ALWAYS_FLUSH logic. */ /* 26 Jan. 1995: wref.c: fix glitch in printing the exponent of 0 when GOOD_SPRINTF_EXPONENT is not #defined. */ /* 24 Feb. 1995: iio.c: z_getc: insert (unsigned char *) to allow internal reading of characters with high-bit set (on machines that sign-extend characters). */ /* 14 March 1995:lread.c and rsfe.c: adjust s_rsle and s_rsfe to check for end-of-file (to prevent infinite loops with empty read statements). */ /* 26 May 1995: iio.c: z_wnew: fix bug in handling T format items in internal writes whose last item is written to an earlier position than some previous item. */ /* 29 Aug. 1995: backspace.c: adjust MSDOS logic. */ /* 6 Sept. 1995: Adjust namelist input to treat a subscripted name whose subscripts do not involve colons similarly to the name without a subscript: accept several values, stored in successive elements starting at the indicated subscript. Adjust namelist output to quote character strings (avoiding confusion with arrays of character strings). Adjust f_init calls for people who don't use libF77's main(); now open and namelist read statements invoke f_init if needed. */ /* 7 Sept. 1995: Fix some bugs with -DAllow_TYQUAD (for integer*8). Add -DNo_Namelist_Comments lines to rsne.c. */ /* 5 Oct. 1995: wrtfmt.c: fix bug with t editing (f__cursor was not always zeroed in mv_cur). */ /* 11 Oct. 1995: move defs of f__hiwater, f__svic, f__icptr from wrtfmt.c to err.c */ /* 15 Mar. 1996: lread.c, rsfe.c: honor END= in READ stmt with empty iolist */ /* 13 May 1996: add ftell_.c and fseek_.c */ /* 9 June 1996: Adjust rsli.c and lread.c so internal list input with too few items in the input string will honor end= . */ /* 12 Sept. 1995:fmtlib.c: fix glitch in printing the most negative integer. */ /* 25 Sept. 1995:fmt.h: for formatted writes of negative integer*1 values, make ic signed on ANSI systems. If formatted writes of integer*1 values trouble you when using a K&R C compiler, switch to an ANSI compiler or use a compiler flag that makes characters signed. */ /* 9 Dec. 1996: d[fu]e.c, err.c: complain about non-positive rec= in direct read and write statements. ftell_.c: change param "unit" to "Unit" for -DKR_headers. */ /* 26 Feb. 1997: ftell_.c: on systems that define SEEK_SET, etc., use SEEK_SET, SEEK_CUR, SEEK_END for *whence = 0, 1, 2. */ /* 7 Apr. 1997: fmt.c: adjust to complain at missing numbers in formats (but still treat missing ".nnn" as ".0"). */ /* 11 Apr. 1997: err.c: attempt to make stderr line buffered rather than fully buffered. (Buffering is needed for format items T and TR.) */ /* 27 May 1997: ftell_.c: fix typo (that caused the third argument to be treated as 2 on some systems). */ /* 5 Aug. 1997: lread.c: adjust to accord with a change to the Fortran 8X draft (in 1990 or 1991) that rescinded permission to elide quote marks in namelist input of character data; compile with -DF8X_NML_ELIDE_QUOTES to get the old behavior. wrtfmt.o: wrt_G: tweak to print the right number of 0's for zero under G format. */ /* 16 Aug. 1997: iio.c: fix bug in internal writes to an array of character strings that sometimes caused one more array element than required by the format to be blank-filled. Example: format(1x). */ /* 16 Sept. 1997:fmt.[ch] rdfmt.c wrtfmt.c: tweak struct syl for machines with 64-bit pointers and 32-bit ints that did not 64-bit align struct syl (e.g., Linux on the DEC Alpha). */ /* 19 Jan. 1998: backspace.c: for b->ufmt==0, change sizeof(int) to sizeof(uiolen). On machines where this would make a difference, it is best for portability to compile libI77 with -DUIOLEN_int (which will render the change invisible). */ /* 4 March 1998: open.c: fix glitch in comparing file names under -DNON_UNIX_STDIO */ /* 17 March 1998: endfile.c, open.c: acquire temporary files from tmpfile(), unless compiled with -DNON_ANSI_STDIO, which uses mktemp(). New buffering scheme independent of NON_UNIX_STDIO for handling T format items. Now -DNON_UNIX_STDIO is no longer be necessary for Linux, and libf2c no longer causes stderr to be buffered -- the former setbuf or setvbuf call for stderr was to make T format items work. open.c: use the Posix access() function to check existence or nonexistence of files, except under -DNON_POSIX_STDIO, where trial fopen calls are used. */ /* 5 April 1998: wsfe.c: make $ format item work: this was lost in the changes of 17 March 1998. */ /* 28 May 1998: backspace.c dfe.c due.c iio.c lread.c rsfe.c sue.c wsfe.c: set f__curunit sooner so various error messages will correctly identify the I/O unit involved. */ /* 17 June 1998: lread.c: unless compiled with ALLOW_FLOAT_IN_INTEGER_LIST_INPUT #defined, treat floating-point numbers (containing either a decimal point or an exponent field) as errors when they appear as list input for integer data. */ /* 7 Sept. 1998: move e_wdfe from sfe.c to dfe.c, where it was originally. Why did it ever move to sfe.c? */ /* 2 May 1999: open.c: set f__external (to get "external" versus "internal" right in the error message if we cannot open the file). err.c: cast a pointer difference to (int) for %d. rdfmt.c: omit fixed-length buffer that could be overwritten by formats Inn or Lnn with nn > 83. */ /* 3 May 1999: open.c: insert two casts for machines with 64-bit longs. */ /* 18 June 1999: backspace.c: allow for b->ufd changing in t_runc */ /* 27 June 1999: rsne.c: fix bug in namelist input: a misplaced increment */ /* could cause wrong array elements to be assigned; e.g., */ /* "&input k(5)=10*1 &end" assigned k(5) and k(15..23) */ /* 15 Nov. 1999: endfile.c: set state to writing (b->uwrt = 1) when an */ /* endfile statement requires copying the file. */ /* (Otherwise an immediately following rewind statement */ /* could make the file appear empty.) Also, supply a */ /* missing (long) cast in the sprintf call. */ /* sfe.c: add #ifdef ALWAYS_FLUSH logic, for formatted I/O: */ /* Compiling libf2c with -DALWAYS_FLUSH should prevent losing */ /* any data in buffers should the program fault. It also */ /* makes the program run more slowly. */ /* 20 April 2000: rsne.c, xwsne.c: tweaks that only matter if ftnint and */ /* ftnlen are of different fundamental types (different numbers */ /* of bits). Since these files will not compile when this */ /* change matters, the above VERSION string remains unchanged. */ /* 4 July 2000: adjustments to permit compilation by C++ compilers; */ /* VERSION string remains unchanged. */ /* 5 Dec. 2000: lread.c: under namelist input, when reading a logical array, */ /* treat Tstuff= and Fstuff= as new assignments rather than as */ /* logical constants. */ /* 22 Feb. 2001: endfile.c: adjust to use truncate() unless compiled with */ /* -DNO_TRUNCATE (or with -DMSDOS). */ /* 1 March 2001: endfile.c: switch to ftruncate (absent -DNO_TRUNCATE), */ /* thus permitting truncation of scratch files on true Unix */ /* systems, where scratch files have no name. Add an fflush() */ /* (surprisingly) needed on some Linux systems. */ /* 11 Oct. 2001: backspac.c dfe.c due.c endfile.c err.c fio.h fmt.c fmt.h */ /* inquire.c open.c rdfmt.c sue.c util.c: change fseek and */ /* ftell to FSEEK and FTELL (#defined to be fseek and ftell, */ /* respectively, in fio.h unless otherwise #defined), and use */ /* type OFF_T (#defined to be long unless otherwise #defined) */ /* to permit handling files over 2GB long where possible, */ /* with suitable -D options, provided for some systems in new */ /* header file sysdep1.h (copied from sysdep1.h0 by default). */ /* 15 Nov. 2001: endfile.c: add FSEEK after FTRUNCATE. */ /* 28 Nov. 2001: fmt.h lwrite.c wref.c and (new) signbit.c: on IEEE systems, */ /* print -0 as -0 when compiled with -DSIGNED_ZEROS. See */ /* comments in makefile or (better) libf2c/makefile.* . */ /* 6 Sept. 2002: rsne.c: fix bug with multiple repeat counts in reading */ /* namelists, e.g., &nl a(2) = 3*1.0, 2*2.0, 3*3.0 / */ /* 21 March 2003: err.c: before writing to a file after reading from it, */ /* f_seek(file, 0, SEEK_CUR) to make writing legal in ANSI C. */ starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_abs.c000066400000000000000000000003261413463044200221620ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_abs(x) integer *x; #else integer i_abs(integer *x) #endif { if(*x >= 0) return(*x); return(- *x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_ceiling.c000066400000000000000000000010261413463044200230250ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers integer i_sceiling(x) real *x; #else #ifdef __cplusplus extern "C" { #endif integer i_sceiling(real *x) #endif { #define CEIL(x) ((int)(x) + ((x) > 0 && (x) != (int)(x))) return (integer) CEIL(*x); } #ifdef __cplusplus } #endif #ifdef KR_headers integer i_dceiling(x) doublereal *x; #else #ifdef __cplusplus extern "C" { #endif integer i_dceiling(doublereal *x) #endif { #define CEIL(x) ((int)(x) + ((x) > 0 && (x) != (int)(x))) return (integer) CEIL(*x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_dim.c000066400000000000000000000003411413463044200221630ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_dim(a,b) integer *a, *b; #else integer i_dim(integer *a, integer *b) #endif { return( *a > *b ? *a - *b : 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_dnnt.c000066400000000000000000000004431413463044200223600ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); integer i_dnnt(x) doublereal *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif integer i_dnnt(doublereal *x) #endif { return (integer)(*x >= 0. ? floor(*x + .5) : -floor(.5 - *x)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_indx.c000066400000000000000000000006561413463044200223650ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_indx(a, b, la, lb) char *a, *b; ftnlen la, lb; #else integer i_indx(char *a, char *b, ftnlen la, ftnlen lb) #endif { ftnlen i, n; char *s, *t, *bend; n = la - lb + 1; bend = b + lb; for(i = 0 ; i < n ; ++i) { s = a + i; t = b; while(t < bend) if(*s++ != *t++) goto no; return(i+1); no: ; } return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_len.c000066400000000000000000000003131413463044200221670ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_len(s, n) char *s; ftnlen n; #else integer i_len(char *s, ftnlen n) #endif { return(n); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_len_trim.c000066400000000000000000000004401413463044200232230ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_len_trim(s, n) char *s; ftnlen n; #else integer i_len_trim(char *s, ftnlen n) #endif { int i; for(i=n-1;i>=0;i--) if(s[i] != ' ') return i + 1; return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_mod.c000066400000000000000000000003231413463044200221710ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_mod(a,b) integer *a, *b; #else integer i_mod(integer *a, integer *b) #endif { return( *a % *b); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_nint.c000066400000000000000000000004261413463044200223660ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); integer i_nint(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif integer i_nint(real *x) #endif { return (integer)(*x >= 0 ? floor(*x + .5) : -floor(.5 - *x)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/i_sign.c000066400000000000000000000004041413463044200223520ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer i_sign(a,b) integer *a, *b; #else integer i_sign(integer *a, integer *b) #endif { integer x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/iargc_.c000066400000000000000000000003041413463044200223250ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers ftnint iargc_() #else ftnint iargc_(void) #endif { extern int xargc; return ( xargc - 1 ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/iio.c000066400000000000000000000051171413463044200216700ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif extern char *f__icptr; char *f__icend; extern icilist *f__svic; int f__icnum; int z_getc(Void) { if(f__recpos++ < f__svic->icirlen) { if(f__icptr >= f__icend) err(f__svic->iciend,(EOF),"endfile"); return(*(unsigned char *)f__icptr++); } return '\n'; } void #ifdef KR_headers z_putc(c) #else z_putc(int c) #endif { if (f__icptr < f__icend && f__recpos++ < f__svic->icirlen) *f__icptr++ = c; } int z_rnew(Void) { f__icptr = f__svic->iciunit + (++f__icnum)*f__svic->icirlen; f__recpos = 0; f__cursor = 0; f__hiwater = 0; return 1; } static int z_endp(Void) { (*f__donewrec)(); return 0; } int #ifdef KR_headers c_si(a) icilist *a; #else c_si(icilist *a) #endif { f__elist = (cilist *)a; f__fmtbuf=a->icifmt; f__curunit = 0; f__sequential=f__formatted=1; f__external=0; if(pars_f(f__fmtbuf)<0) err(a->icierr,100,"startint"); fmt_bg(); f__cblank=f__cplus=f__scale=0; f__svic=a; f__icnum=f__recpos=0; f__cursor = 0; f__hiwater = 0; f__icptr = a->iciunit; f__icend = f__icptr + a->icirlen*a->icirnum; f__cf = 0; return(0); } int iw_rev(Void) { if(f__workdone) z_endp(); f__hiwater = f__recpos = f__cursor = 0; return(f__workdone=0); } #ifdef KR_headers integer s_rsfi(a) icilist *a; #else integer s_rsfi(icilist *a) #endif { int n; if(n=c_si(a)) return(n); f__reading=1; f__doed=rd_ed; f__doned=rd_ned; f__getn=z_getc; f__dorevert = z_endp; f__donewrec = z_rnew; f__doend = z_endp; return(0); } int z_wnew(Void) { if (f__recpos < f__hiwater) { f__icptr += f__hiwater - f__recpos; f__recpos = f__hiwater; } while(f__recpos++ < f__svic->icirlen) *f__icptr++ = ' '; f__recpos = 0; f__cursor = 0; f__hiwater = 0; f__icnum++; return 1; } #ifdef KR_headers integer s_wsfi(a) icilist *a; #else integer s_wsfi(icilist *a) #endif { int n; if(n=c_si(a)) return(n); f__reading=0; f__doed=w_ed; f__doned=w_ned; f__putn=z_putc; f__dorevert = iw_rev; f__donewrec = z_wnew; f__doend = z_endp; return(0); } integer e_rsfi(Void) { int n = en_fio(); f__fmtbuf = NULL; return(n); } integer e_wsfi(Void) { int n; n = en_fio(); f__fmtbuf = NULL; if(f__svic->icirnum != 1 && (f__icnum > f__svic->icirnum || (f__icnum == f__svic->icirnum && (f__recpos | f__hiwater)))) err(f__svic->icierr,110,"inwrite"); if (f__recpos < f__hiwater) f__recpos = f__hiwater; if (f__recpos >= f__svic->icirlen) err(f__svic->icierr,110,"recend"); if (!f__recpos && f__icnum) return n; while(f__recpos++ < f__svic->icirlen) *f__icptr++ = ' '; return n; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/ilnw.c000066400000000000000000000021451413463044200220570ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "lio.h" #ifdef __cplusplus extern "C" { #endif extern char *f__icptr; extern char *f__icend; extern icilist *f__svic; extern int f__icnum; #ifdef KR_headers extern void z_putc(); #else extern void z_putc(int); #endif static int z_wSL(Void) { while(f__recpos < f__svic->icirlen) z_putc(' '); return z_rnew(); } static void #ifdef KR_headers c_liw(a) icilist *a; #else c_liw(icilist *a) #endif { f__reading = 0; f__external = 0; f__formatted = 1; f__putn = z_putc; L_len = a->icirlen; f__donewrec = z_wSL; f__svic = a; f__icnum = f__recpos = 0; f__cursor = 0; f__cf = 0; f__curunit = 0; f__icptr = a->iciunit; f__icend = f__icptr + a->icirlen*a->icirnum; f__elist = (cilist *)a; } integer #ifdef KR_headers s_wsni(a) icilist *a; #else s_wsni(icilist *a) #endif { cilist ca; c_liw(a); ca.cifmt = a->icifmt; x_wsne(&ca); z_wSL(); return 0; } integer #ifdef KR_headers s_wsli(a) icilist *a; #else s_wsli(icilist *a) #endif { f__lioproc = l_write; c_liw(a); return(0); } integer e_wsli(Void) { z_wSL(); return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/inquire.c000066400000000000000000000052541413463044200225660ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "string.h" #ifdef NON_UNIX_STDIO #ifndef MSDOS #include "unistd.h" /* for access() */ #endif #endif #ifdef KR_headers integer f_inqu(a) inlist *a; #else #ifdef __cplusplus extern "C" integer f_inqu(inlist*); #endif #ifdef MSDOS #undef abs #undef min #undef max #include "io.h" #endif integer f_inqu(inlist *a) #endif { flag byfile; int i; #ifndef NON_UNIX_STDIO int n; #endif unit *p; char buf[256]; long x; if(a->infile!=NULL) { byfile=1; g_char(a->infile,a->infilen,buf); #ifdef NON_UNIX_STDIO x = access(buf,0) ? -1 : 0; for(i=0,p=NULL;iinunitinunit>=0) { p= &f__units[a->inunit]; } else { p=NULL; } } if(a->inex!=NULL) if(byfile && x != -1 || !byfile && p!=NULL) *a->inex=1; else *a->inex=0; if(a->inopen!=NULL) if(byfile) *a->inopen=(p!=NULL); else *a->inopen=(p!=NULL && p->ufd!=NULL); if(a->innum!=NULL) *a->innum= p-f__units; if(a->innamed!=NULL) if(byfile || p!=NULL && p->ufnm!=NULL) *a->innamed=1; else *a->innamed=0; if(a->inname!=NULL) if(byfile) b_char(buf,a->inname,a->innamlen); else if(p!=NULL && p->ufnm!=NULL) b_char(p->ufnm,a->inname,a->innamlen); if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL) if(p->url) b_char("DIRECT",a->inacc,a->inacclen); else b_char("SEQUENTIAL",a->inacc,a->inacclen); if(a->inseq!=NULL) if(p!=NULL && p->url) b_char("NO",a->inseq,a->inseqlen); else b_char("YES",a->inseq,a->inseqlen); if(a->indir!=NULL) if(p==NULL || p->url) b_char("YES",a->indir,a->indirlen); else b_char("NO",a->indir,a->indirlen); if(a->infmt!=NULL) if(p!=NULL && p->ufmt==0) b_char("UNFORMATTED",a->infmt,a->infmtlen); else b_char("FORMATTED",a->infmt,a->infmtlen); if(a->inform!=NULL) if(p!=NULL && p->ufmt==0) b_char("NO",a->inform,a->informlen); else b_char("YES",a->inform,a->informlen); if(a->inunf) if(p!=NULL && p->ufmt==0) b_char("YES",a->inunf,a->inunflen); else if (p!=NULL) b_char("NO",a->inunf,a->inunflen); else b_char("UNKNOWN",a->inunf,a->inunflen); if(a->inrecl!=NULL && p!=NULL) *a->inrecl=p->url; if(a->innrec!=NULL && p!=NULL && p->url>0) *a->innrec=(ftnint)(FTELL(p->ufd)/p->url+1); if(a->inblank && p!=NULL && p->ufmt) if(p->ublnk) b_char("ZERO",a->inblank,a->inblanklen); else b_char("NULL",a->inblank,a->inblanklen); return(0); } starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/l_ge.c000066400000000000000000000005161413463044200220140ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); logical l_ge(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); logical l_ge(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) >= 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/l_gt.c000066400000000000000000000005151413463044200220320ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); logical l_gt(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); logical l_gt(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) > 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/l_le.c000066400000000000000000000005161413463044200220210ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); logical l_le(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); logical l_le(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) <= 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/l_lt.c000066400000000000000000000005151413463044200220370ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern integer s_cmp(); logical l_lt(a,b,la,lb) char *a, *b; ftnlen la, lb; #else extern integer s_cmp(char *, char *, ftnlen, ftnlen); logical l_lt(char *a, char *b, ftnlen la, ftnlen lb) #endif { return(s_cmp(a,b,la,lb) < 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/lbitbits.c000066400000000000000000000021111413463044200227130ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifndef LONGBITS #define LONGBITS 32 #endif integer #ifdef KR_headers lbit_bits(a, b, len) integer a, b, len; #else lbit_bits(integer a, integer b, integer len) #endif { /* Assume 2's complement arithmetic */ unsigned long x, y; x = (unsigned long) a; y = (unsigned long)-1L; x >>= b; y <<= len; return (integer)(x & ~y); } integer #ifdef KR_headers lbit_cshift(a, b, len) integer a, b, len; #else lbit_cshift(integer a, integer b, integer len) #endif { unsigned long x, y, z; x = (unsigned long)a; if (len <= 0) { if (len == 0) return 0; goto full_len; } if (len >= LONGBITS) { full_len: if (b >= 0) { b %= LONGBITS; return (integer)(x << b | x >> LONGBITS -b ); } b = -b; b %= LONGBITS; return (integer)(x << LONGBITS - b | x >> b); } y = z = (unsigned long)-1; y <<= len; z &= ~y; y &= x; x &= z; if (b >= 0) { b %= len; return (integer)(y | z & (x << b | x >> len - b)); } b = -b; b %= len; return (integer)(y | z & (x >> b | x << len - b)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/lbitshft.c000066400000000000000000000004021413463044200227170ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif integer #ifdef KR_headers lbit_shift(a, b) integer a; integer b; #else lbit_shift(integer a, integer b) #endif { return b >= 0 ? a << b : (integer)((uinteger)a >> -b); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/libf2c.lbc000066400000000000000000000030721413463044200225650ustar00rootroot00000000000000abort_.obj backspac.obj c_abs.obj c_cos.obj c_div.obj c_exp.obj c_log.obj c_sin.obj c_sqrt.obj cabs.obj close.obj d_abs.obj d_acos.obj d_asin.obj d_atan.obj d_atn2.obj d_cnjg.obj d_cos.obj d_cosh.obj d_dim.obj d_exp.obj d_imag.obj d_int.obj d_lg10.obj d_log.obj d_mod.obj d_nint.obj d_prod.obj d_sign.obj d_sin.obj d_sinh.obj d_sqrt.obj d_tan.obj d_tanh.obj derf_.obj derfc_.obj dfe.obj dolio.obj dtime_.obj due.obj ef1asc_.obj ef1cmc_.obj endfile.obj erf_.obj erfc_.obj err.obj etime_.obj exit_.obj f77_aloc.obj f77vers.obj fmt.obj fmtlib.obj ftell_.obj getarg_.obj getenv_.obj h_abs.obj h_dim.obj h_dnnt.obj h_indx.obj h_len.obj h_mod.obj h_nint.obj h_sign.obj hl_ge.obj hl_gt.obj hl_le.obj hl_lt.obj i77vers.obj i_abs.obj i_dim.obj i_dnnt.obj i_indx.obj i_len.obj i_mod.obj i_nint.obj i_sign.obj iargc_.obj iio.obj ilnw.obj inquire.obj l_ge.obj l_gt.obj l_le.obj l_lt.obj lbitbits.obj lbitshft.obj lread.obj lwrite.obj main.obj open.obj pow_ci.obj pow_dd.obj pow_di.obj pow_hh.obj pow_ii.obj pow_ri.obj pow_zi.obj pow_zz.obj r_abs.obj r_acos.obj r_asin.obj r_atan.obj r_atn2.obj r_cnjg.obj r_cos.obj r_cosh.obj r_dim.obj r_exp.obj r_imag.obj r_int.obj r_lg10.obj r_log.obj r_mod.obj r_nint.obj r_sign.obj r_sin.obj r_sinh.obj r_sqrt.obj r_tan.obj r_tanh.obj rdfmt.obj rewind.obj rsfe.obj rsli.obj rsne.obj s_cat.obj s_cmp.obj s_copy.obj s_paus.obj s_rnge.obj s_stop.obj sfe.obj sig_die.obj signal_.obj sue.obj system_.obj typesize.obj uio.obj uninit.obj util.obj wref.obj wrtfmt.obj wsfe.obj wsle.obj wsne.obj xwsne.obj z_abs.obj z_cos.obj z_div.obj z_exp.obj z_log.obj z_sin.obj z_sqrt.obj starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/libf2c.sy000066400000000000000000000040031413463044200224530ustar00rootroot00000000000000+abort_.obj & +backspac.obj & +c_abs.obj & +c_cos.obj & +c_div.obj & +c_exp.obj & +c_log.obj & +c_sin.obj & +c_sqrt.obj & +cabs.obj & +close.obj & +d_abs.obj & +d_acos.obj & +d_asin.obj & +d_atan.obj & +d_atn2.obj & +d_cnjg.obj & +d_cos.obj & +d_cosh.obj & +d_dim.obj & +d_exp.obj & +d_imag.obj & +d_int.obj & +d_lg10.obj & +d_log.obj & +d_mod.obj & +d_nint.obj & +d_prod.obj & +d_sign.obj & +d_sin.obj & +d_sinh.obj & +d_sqrt.obj & +d_tan.obj & +d_tanh.obj & +derf_.obj & +derfc_.obj & +dfe.obj & +dolio.obj & +dtime_.obj & +due.obj & +ef1asc_.obj & +ef1cmc_.obj & +endfile.obj & +erf_.obj & +erfc_.obj & +err.obj & +etime_.obj & +exit_.obj & +f77_aloc.obj & +f77vers.obj & +fmt.obj & +fmtlib.obj & +ftell_.obj & +getarg_.obj & +getenv_.obj & +h_abs.obj & +h_dim.obj & +h_dnnt.obj & +h_indx.obj & +h_len.obj & +h_mod.obj & +h_nint.obj & +h_sign.obj & +hl_ge.obj & +hl_gt.obj & +hl_le.obj & +hl_lt.obj & +i77vers.obj & +i_abs.obj & +i_dim.obj & +i_dnnt.obj & +i_indx.obj & +i_len.obj & +i_mod.obj & +i_nint.obj & +i_sign.obj & +iargc_.obj & +iio.obj & +ilnw.obj & +inquire.obj & +l_ge.obj & +l_gt.obj & +l_le.obj & +l_lt.obj & +lbitbits.obj & +lbitshft.obj & +lread.obj & +lwrite.obj & +main.obj & +open.obj & +pow_ci.obj & +pow_dd.obj & +pow_di.obj & +pow_hh.obj & +pow_ii.obj & +pow_ri.obj & +pow_zi.obj & +pow_zz.obj & +r_abs.obj & +r_acos.obj & +r_asin.obj & +r_atan.obj & +r_atn2.obj & +r_cnjg.obj & +r_cos.obj & +r_cosh.obj & +r_dim.obj & +r_exp.obj & +r_imag.obj & +r_int.obj & +r_lg10.obj & +r_log.obj & +r_mod.obj & +r_nint.obj & +r_sign.obj & +r_sin.obj & +r_sinh.obj & +r_sqrt.obj & +r_tan.obj & +r_tanh.obj & +rdfmt.obj & +rewind.obj & +rsfe.obj & +rsli.obj & +rsne.obj & +s_cat.obj & +s_cmp.obj & +s_copy.obj & +s_paus.obj & +s_rnge.obj & +s_stop.obj & +sfe.obj & +sig_die.obj & +signal_.obj & +sue.obj & +system_.obj & +typesize.obj & +uio.obj & +uninit.obj & +util.obj & +wref.obj & +wrtfmt.obj & +wsfe.obj & +wsle.obj & +wsne.obj & +xwsne.obj & +z_abs.obj & +z_cos.obj & +z_div.obj & +z_exp.obj & +z_log.obj & +z_sin.obj & +z_sqrt.obj starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/lio.h000066400000000000000000000030341413463044200216740ustar00rootroot00000000000000/* copy of ftypes from the compiler */ /* variable types * numeric assumptions: * int < reals < complexes * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX */ /* 0-10 retain their old (pre LOGICAL*1, etc.) */ /* values to allow mixing old and new objects. */ #define TYUNKNOWN 0 #define TYADDR 1 #define TYSHORT 2 #define TYLONG 3 #define TYREAL 4 #define TYDREAL 5 #define TYCOMPLEX 6 #define TYDCOMPLEX 7 #define TYLOGICAL 8 #define TYCHAR 9 #define TYSUBR 10 #define TYINT1 11 #define TYLOGICAL1 12 #define TYLOGICAL2 13 #ifdef Allow_TYQUAD #undef TYQUAD #define TYQUAD 14 #endif #define LINTW 24 #define LINE 80 #define LLOGW 2 #ifdef Old_list_output #define LLOW 1.0 #define LHIGH 1.e9 #define LEFMT " %# .8E" #define LFFMT " %# .9g" #else #define LGFMT "%.9G" #endif /* LEFBL 20 should suffice; 24 overcomes a NeXT bug. */ #define LEFBL 24 typedef union { char flchar; short flshort; ftnint flint; #ifdef Allow_TYQUAD longint fllongint; #endif real flreal; doublereal fldouble; } flex; #ifdef KR_headers extern int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)(); extern int l_read(), l_write(); #else #ifdef __cplusplus extern "C" { #endif extern int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint); extern int l_write(ftnint*, char*, ftnlen, ftnint); extern void x_wsne(cilist*); extern int c_le(cilist*), (*l_getc)(void), (*l_ungetc)(int,FILE*); extern int l_read(ftnint*,char*,ftnlen,ftnint); extern integer e_rsle(void), e_wsle(void), s_wsne(cilist*); extern int z_rnew(void); #endif extern ftnint L_len; extern int f__scale; #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/lread.c000066400000000000000000000346231413463044200222030ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" /* Compile with -DF8X_NML_ELIDE_QUOTES to permit eliding quotation */ /* marks in namelist input a la the Fortran 8X Draft published in */ /* the May 1989 issue of Fortran Forum. */ #ifdef Allow_TYQUAD static longint f__llx; #endif #ifdef KR_headers extern double atof(); extern char *malloc(), *realloc(); int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)(); #else #undef abs #undef min #undef max #include "stdlib.h" #endif #include "fmt.h" #include "lio.h" #include "ctype.h" #include "fp.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern char *f__fmtbuf; #else extern const char *f__fmtbuf; int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void), (*l_ungetc)(int,FILE*); #endif int l_eof; #define isblnk(x) (f__ltab[x+1]&B) #define issep(x) (f__ltab[x+1]&SX) #define isapos(x) (f__ltab[x+1]&AX) #define isexp(x) (f__ltab[x+1]&EX) #define issign(x) (f__ltab[x+1]&SG) #define iswhit(x) (f__ltab[x+1]&WH) #define SX 1 #define B 2 #define AX 4 #define EX 8 #define SG 16 #define WH 32 char f__ltab[128+1] = { /* offset one for EOF */ 0, 0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; #ifdef ungetc static int #ifdef KR_headers un_getc(x,f__cf) int x; FILE *f__cf; #else un_getc(int x, FILE *f__cf) #endif { return ungetc(x,f__cf); } #else #define un_getc ungetc #ifdef KR_headers extern int ungetc(); #else extern int ungetc(int, FILE*); /* for systems with a buggy stdio.h */ #endif #endif int t_getc(Void) { int ch; if(f__curunit->uend) return(EOF); if((ch=getc(f__cf))!=EOF) return(ch); if(feof(f__cf)) f__curunit->uend = l_eof = 1; return(EOF); } integer e_rsle(Void) { int ch; if(f__curunit->uend) return(0); while((ch=t_getc())!='\n') if (ch == EOF) { if(feof(f__cf)) f__curunit->uend = l_eof = 1; return EOF; } return(0); } flag f__lquit; int f__lcount,f__ltype,nml_read; char *f__lchar; double f__lx,f__ly; #define ERR(x) if(n=(x)) return(n) #define GETC(x) (x=(*l_getc)()) #define Ungetc(x,y) (*l_ungetc)(x,y) static int #ifdef KR_headers l_R(poststar, reqint) int poststar, reqint; #else l_R(int poststar, int reqint) #endif { char s[FMAX+EXPMAXDIGS+4]; register int ch; register char *sp, *spe, *sp1; long e, exp; int havenum, havestar, se; if (!poststar) { if (f__lcount > 0) return(0); f__lcount = 1; } #ifdef Allow_TYQUAD f__llx = 0; #endif f__ltype = 0; exp = 0; havestar = 0; retry: sp1 = sp = s; spe = sp + FMAX; havenum = 0; switch(GETC(ch)) { case '-': *sp++ = ch; sp1++; spe++; case '+': GETC(ch); } while(ch == '0') { ++havenum; GETC(ch); } while(isdigit(ch)) { if (sp < spe) *sp++ = ch; else ++exp; GETC(ch); } if (ch == '*' && !poststar) { if (sp == sp1 || exp || *s == '-') { errfl(f__elist->cierr,112,"bad repetition count"); } poststar = havestar = 1; *sp = 0; f__lcount = atoi(s); goto retry; } if (ch == '.') { #ifndef ALLOW_FLOAT_IN_INTEGER_LIST_INPUT if (reqint) errfl(f__elist->cierr,115,"invalid integer"); #endif GETC(ch); if (sp == sp1) while(ch == '0') { ++havenum; --exp; GETC(ch); } while(isdigit(ch)) { if (sp < spe) { *sp++ = ch; --exp; } GETC(ch); } } havenum += sp - sp1; se = 0; if (issign(ch)) goto signonly; if (havenum && isexp(ch)) { #ifndef ALLOW_FLOAT_IN_INTEGER_LIST_INPUT if (reqint) errfl(f__elist->cierr,115,"invalid integer"); #endif GETC(ch); if (issign(ch)) { signonly: if (ch == '-') se = 1; GETC(ch); } if (!isdigit(ch)) { bad: errfl(f__elist->cierr,112,"exponent field"); } e = ch - '0'; while(isdigit(GETC(ch))) { e = 10*e + ch - '0'; if (e > EXPMAX) goto bad; } if (se) exp -= e; else exp += e; } (void) Ungetc(ch, f__cf); if (sp > sp1) { ++havenum; while(*--sp == '0') ++exp; if (exp) sprintf(sp+1, "e%ld", exp); else sp[1] = 0; f__lx = atof(s); #ifdef Allow_TYQUAD if (reqint&2 && (se = sp - sp1 + exp) > 14 && se < 20) { /* Assuming 64-bit longint and 32-bit long. */ if (exp < 0) sp += exp; if (sp1 <= sp) { f__llx = *sp1 - '0'; while(++sp1 <= sp) f__llx = 10*f__llx + (*sp1 - '0'); } while(--exp >= 0) f__llx *= 10; if (*s == '-') f__llx = -f__llx; } #endif } else f__lx = 0.; if (havenum) f__ltype = TYLONG; else switch(ch) { case ',': case '/': break; default: if (havestar && ( ch == ' ' ||ch == '\t' ||ch == '\n')) break; if (nml_read > 1) { f__lquit = 2; return 0; } errfl(f__elist->cierr,112,"invalid number"); } return 0; } static int #ifdef KR_headers rd_count(ch) register int ch; #else rd_count(register int ch) #endif { if (ch < '0' || ch > '9') return 1; f__lcount = ch - '0'; while(GETC(ch) >= '0' && ch <= '9') f__lcount = 10*f__lcount + ch - '0'; Ungetc(ch,f__cf); return f__lcount <= 0; } static int l_C(Void) { int ch, nml_save; double lz; if(f__lcount>0) return(0); f__ltype=0; GETC(ch); if(ch!='(') { if (nml_read > 1 && (ch < '0' || ch > '9')) { Ungetc(ch,f__cf); f__lquit = 2; return 0; } if (rd_count(ch)) if(!f__cf || !feof(f__cf)) errfl(f__elist->cierr,112,"complex format"); else err(f__elist->cierr,(EOF),"lread"); if(GETC(ch)!='*') { if(!f__cf || !feof(f__cf)) errfl(f__elist->cierr,112,"no star"); else err(f__elist->cierr,(EOF),"lread"); } if(GETC(ch)!='(') { Ungetc(ch,f__cf); return(0); } } else f__lcount = 1; while(iswhit(GETC(ch))); Ungetc(ch,f__cf); nml_save = nml_read; nml_read = 0; if (ch = l_R(1,0)) return ch; if (!f__ltype) errfl(f__elist->cierr,112,"no real part"); lz = f__lx; while(iswhit(GETC(ch))); if(ch!=',') { (void) Ungetc(ch,f__cf); errfl(f__elist->cierr,112,"no comma"); } while(iswhit(GETC(ch))); (void) Ungetc(ch,f__cf); if (ch = l_R(1,0)) return ch; if (!f__ltype) errfl(f__elist->cierr,112,"no imaginary part"); while(iswhit(GETC(ch))); if(ch!=')') errfl(f__elist->cierr,112,"no )"); f__ly = f__lx; f__lx = lz; #ifdef Allow_TYQUAD f__llx = 0; #endif nml_read = nml_save; return(0); } static char nmLbuf[256], *nmL_next; static int (*nmL_getc_save)(Void); #ifdef KR_headers static int (*nmL_ungetc_save)(/* int, FILE* */); #else static int (*nmL_ungetc_save)(int, FILE*); #endif static int nmL_getc(Void) { int rv; if (rv = *nmL_next++) return rv; l_getc = nmL_getc_save; l_ungetc = nmL_ungetc_save; return (*l_getc)(); } static int #ifdef KR_headers nmL_ungetc(x, f) int x; FILE *f; #else nmL_ungetc(int x, FILE *f) #endif { f = f; /* banish non-use warning */ return *--nmL_next = x; } static int #ifdef KR_headers Lfinish(ch, dot, rvp) int ch, dot, *rvp; #else Lfinish(int ch, int dot, int *rvp) #endif { char *s, *se; static char what[] = "namelist input"; s = nmLbuf + 2; se = nmLbuf + sizeof(nmLbuf) - 1; *s++ = ch; while(!issep(GETC(ch)) && ch!=EOF) { if (s >= se) { nmLbuf_ovfl: return *rvp = err__fl(f__elist->cierr,131,what); } *s++ = ch; if (ch != '=') continue; if (dot) return *rvp = err__fl(f__elist->cierr,112,what); got_eq: *s = 0; nmL_getc_save = l_getc; l_getc = nmL_getc; nmL_ungetc_save = l_ungetc; l_ungetc = nmL_ungetc; nmLbuf[1] = *(nmL_next = nmLbuf) = ','; *rvp = f__lcount = 0; return 1; } if (dot) goto done; for(;;) { if (s >= se) goto nmLbuf_ovfl; *s++ = ch; if (!isblnk(ch)) break; if (GETC(ch) == EOF) goto done; } if (ch == '=') goto got_eq; done: Ungetc(ch, f__cf); return 0; } static int l_L(Void) { int ch, rv, sawdot; if(f__lcount>0) return(0); f__lcount = 1; f__ltype=0; GETC(ch); if(isdigit(ch)) { rd_count(ch); if(GETC(ch)!='*') if(!f__cf || !feof(f__cf)) errfl(f__elist->cierr,112,"no star"); else err(f__elist->cierr,(EOF),"lread"); GETC(ch); } sawdot = 0; if(ch == '.') { sawdot = 1; GETC(ch); } switch(ch) { case 't': case 'T': if (nml_read && Lfinish(ch, sawdot, &rv)) return rv; f__lx=1; break; case 'f': case 'F': if (nml_read && Lfinish(ch, sawdot, &rv)) return rv; f__lx=0; break; default: if(isblnk(ch) || issep(ch) || ch==EOF) { (void) Ungetc(ch,f__cf); return(0); } if (nml_read > 1) { Ungetc(ch,f__cf); f__lquit = 2; return 0; } errfl(f__elist->cierr,112,"logical"); } f__ltype=TYLONG; while(!issep(GETC(ch)) && ch!=EOF); Ungetc(ch, f__cf); return(0); } #define BUFSIZE 128 static int l_CHAR(Void) { int ch,size,i; static char rafail[] = "realloc failure"; char quote,*p; if(f__lcount>0) return(0); f__ltype=0; if(f__lchar!=NULL) free(f__lchar); size=BUFSIZE; p=f__lchar = (char *)malloc((unsigned int)size); if(f__lchar == NULL) errfl(f__elist->cierr,113,"no space"); GETC(ch); if(isdigit(ch)) { /* allow Fortran 8x-style unquoted string... */ /* either find a repetition count or the string */ f__lcount = ch - '0'; *p++ = ch; for(i = 1;;) { switch(GETC(ch)) { case '*': if (f__lcount == 0) { f__lcount = 1; #ifndef F8X_NML_ELIDE_QUOTES if (nml_read) goto no_quote; #endif goto noquote; } p = f__lchar; goto have_lcount; case ',': case ' ': case '\t': case '\n': case '/': Ungetc(ch,f__cf); /* no break */ case EOF: f__lcount = 1; f__ltype = TYCHAR; return *p = 0; } if (!isdigit(ch)) { f__lcount = 1; #ifndef F8X_NML_ELIDE_QUOTES if (nml_read) { no_quote: errfl(f__elist->cierr,112, "undelimited character string"); } #endif goto noquote; } *p++ = ch; f__lcount = 10*f__lcount + ch - '0'; if (++i == size) { f__lchar = (char *)realloc(f__lchar, (unsigned int)(size += BUFSIZE)); if(f__lchar == NULL) errfl(f__elist->cierr,113,rafail); p = f__lchar + i; } } } else (void) Ungetc(ch,f__cf); have_lcount: if(GETC(ch)=='\'' || ch=='"') quote=ch; else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) { Ungetc(ch,f__cf); return 0; } #ifndef F8X_NML_ELIDE_QUOTES else if (nml_read > 1) { Ungetc(ch,f__cf); f__lquit = 2; return 0; } #endif else { /* Fortran 8x-style unquoted string */ *p++ = ch; for(i = 1;;) { switch(GETC(ch)) { case ',': case ' ': case '\t': case '\n': case '/': Ungetc(ch,f__cf); /* no break */ case EOF: f__ltype = TYCHAR; return *p = 0; } noquote: *p++ = ch; if (++i == size) { f__lchar = (char *)realloc(f__lchar, (unsigned int)(size += BUFSIZE)); if(f__lchar == NULL) errfl(f__elist->cierr,113,rafail); p = f__lchar + i; } } } f__ltype=TYCHAR; for(i=0;;) { while(GETC(ch)!=quote && ch!='\n' && ch!=EOF && ++icierr,113,rafail); p=f__lchar+i-1; *p++ = ch; } else if(ch==EOF) return(EOF); else if(ch=='\n') { if(*(p-1) != '\\') continue; i--; p--; if(++iciunit]; if(a->ciunit>=MXUNIT || a->ciunit<0) err(a->cierr,101,"stler"); f__scale=f__recpos=0; f__elist=a; if(f__curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,102,"lio"); f__cf=f__curunit->ufd; if(!f__curunit->ufmt) err(a->cierr,103,"lio") return(0); } int #ifdef KR_headers l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len; #else l_read(ftnint *number, char *ptr, ftnlen len, ftnint type) #endif { #define Ptr ((flex *)ptr) int i,n,ch; doublereal *yy; real *xx; for(i=0;i<*number;i++) { if(f__lquit) return(0); if(l_eof) err(f__elist->ciend, EOF, "list in") if(f__lcount == 0) { f__ltype = 0; for(;;) { GETC(ch); switch(ch) { case EOF: err(f__elist->ciend,(EOF),"list in") case ' ': case '\t': case '\n': continue; case '/': f__lquit = 1; goto loopend; case ',': f__lcount = 1; goto loopend; default: (void) Ungetc(ch, f__cf); goto rddata; } } } rddata: switch((int)type) { case TYINT1: case TYSHORT: case TYLONG: #ifndef ALLOW_FLOAT_IN_INTEGER_LIST_INPUT ERR(l_R(0,1)); break; #endif case TYREAL: case TYDREAL: ERR(l_R(0,0)); break; #ifdef TYQUAD case TYQUAD: n = l_R(0,2); if (n) return n; break; #endif case TYCOMPLEX: case TYDCOMPLEX: ERR(l_C()); break; case TYLOGICAL1: case TYLOGICAL2: case TYLOGICAL: ERR(l_L()); break; case TYCHAR: ERR(l_CHAR()); break; } while (GETC(ch) == ' ' || ch == '\t'); if (ch != ',' || f__lcount > 1) Ungetc(ch,f__cf); loopend: if(f__lquit) return(0); if(f__cf && ferror(f__cf)) { clearerr(f__cf); errfl(f__elist->cierr,errno,"list in"); } if(f__ltype==0) goto bump; switch((int)type) { case TYINT1: case TYLOGICAL1: Ptr->flchar = (char)f__lx; break; case TYLOGICAL2: case TYSHORT: Ptr->flshort = (short)f__lx; break; case TYLOGICAL: case TYLONG: Ptr->flint = (ftnint)f__lx; break; #ifdef Allow_TYQUAD case TYQUAD: if (!(Ptr->fllongint = f__llx)) Ptr->fllongint = f__lx; break; #endif case TYREAL: Ptr->flreal=f__lx; break; case TYDREAL: Ptr->fldouble=f__lx; break; case TYCOMPLEX: xx=(real *)ptr; *xx++ = f__lx; *xx = f__ly; break; case TYDCOMPLEX: yy=(doublereal *)ptr; *yy++ = f__lx; *yy = f__ly; break; case TYCHAR: b_char(f__lchar,ptr,len); break; } bump: if(f__lcount>0) f__lcount--; ptr += len; if (nml_read) nml_read++; } return(0); #undef Ptr } #ifdef KR_headers integer s_rsle(a) cilist *a; #else integer s_rsle(cilist *a) #endif { int n; f__reading=1; f__external=1; f__formatted=1; if(n=c_le(a)) return(n); f__lioproc = l_read; f__lquit = 0; f__lcount = 0; l_eof = 0; if(f__curunit->uwrt && f__nowreading(f__curunit)) err(a->cierr,errno,"read start"); if(f__curunit->uend) err(f__elist->ciend,(EOF),"read start"); l_getc = t_getc; l_ungetc = un_getc; f__doend = xrd_SL; return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/lwrite.c000066400000000000000000000110101413463044200224030ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #include "lio.h" #ifdef __cplusplus extern "C" { #endif ftnint L_len; int f__Aquote; static VOID donewrec(Void) { if (f__recpos) (*f__donewrec)(); } static VOID #ifdef KR_headers lwrt_I(n) longint n; #else lwrt_I(longint n) #endif { char *p; int ndigit, sign; p = f__icvt(n, &ndigit, &sign, 10); if(f__recpos + ndigit >= L_len) donewrec(); PUT(' '); if (sign) PUT('-'); while(*p) PUT(*p++); } static VOID #ifdef KR_headers lwrt_L(n, len) ftnint n; ftnlen len; #else lwrt_L(ftnint n, ftnlen len) #endif { if(f__recpos+LLOGW>=L_len) donewrec(); wrt_L((Uint *)&n,LLOGW, len); } static VOID #ifdef KR_headers lwrt_A(p,len) char *p; ftnlen len; #else lwrt_A(char *p, ftnlen len) #endif { int a; char *p1, *pe; a = 0; pe = p + len; if (f__Aquote) { a = 3; if (len > 1 && p[len-1] == ' ') { while(--len > 1 && p[len-1] == ' '); pe = p + len; } p1 = p; while(p1 < pe) if (*p1++ == '\'') a++; } if(f__recpos+len+a >= L_len) donewrec(); if (a #ifndef OMIT_BLANK_CC || !f__recpos #endif ) PUT(' '); if (a) { PUT('\''); while(p < pe) { if (*p == '\'') PUT('\''); PUT(*p++); } PUT('\''); } else while(p < pe) PUT(*p++); } static int #ifdef KR_headers l_g(buf, n) char *buf; double n; #else l_g(char *buf, double n) #endif { #ifdef Old_list_output doublereal absn; char *fmt; absn = n; if (absn < 0) absn = -absn; fmt = LLOW <= absn && absn < LHIGH ? LFFMT : LEFMT; #ifdef USE_STRLEN sprintf(buf, fmt, n); return strlen(buf); #else return sprintf(buf, fmt, n); #endif #else register char *b, c, c1; b = buf; *b++ = ' '; if (n < 0) { *b++ = '-'; n = -n; } else *b++ = ' '; if (n == 0) { #ifdef SIGNED_ZEROS if (signbit_f2c(&n)) *b++ = '-'; #endif *b++ = '0'; *b++ = '.'; *b = 0; goto f__ret; } sprintf(b, LGFMT, n); switch(*b) { #ifndef WANT_LEAD_0 case '0': while(b[0] = b[1]) b++; break; #endif case 'i': case 'I': /* Infinity */ case 'n': case 'N': /* NaN */ while(*++b); break; default: /* Fortran 77 insists on having a decimal point... */ for(;; b++) switch(*b) { case 0: *b++ = '.'; *b = 0; goto f__ret; case '.': while(*++b); goto f__ret; case 'E': for(c1 = '.', c = 'E'; *b = c1; c1 = c, c = *++b); goto f__ret; } } f__ret: return b - buf; #endif } static VOID #ifdef KR_headers l_put(s) register char *s; #else l_put(register char *s) #endif { #ifdef KR_headers register void (*pn)() = f__putn; #else register void (*pn)(int) = f__putn; #endif register int c; while(c = *s++) (*pn)(c); } static VOID #ifdef KR_headers lwrt_F(n) double n; #else lwrt_F(double n) #endif { char buf[LEFBL]; if(f__recpos + l_g(buf,n) >= L_len) donewrec(); l_put(buf); } static VOID #ifdef KR_headers lwrt_C(a,b) double a,b; #else lwrt_C(double a, double b) #endif { char *ba, *bb, bufa[LEFBL], bufb[LEFBL]; int al, bl; al = l_g(bufa, a); for(ba = bufa; *ba == ' '; ba++) --al; bl = l_g(bufb, b) + 1; /* intentionally high by 1 */ for(bb = bufb; *bb == ' '; bb++) --bl; if(f__recpos + al + bl + 3 >= L_len) donewrec(); #ifdef OMIT_BLANK_CC else #endif PUT(' '); PUT('('); l_put(ba); PUT(','); if (f__recpos + bl >= L_len) { (*f__donewrec)(); #ifndef OMIT_BLANK_CC PUT(' '); #endif } l_put(bb); PUT(')'); } int #ifdef KR_headers l_write(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len; #else l_write(ftnint *number, char *ptr, ftnlen len, ftnint type) #endif { #define Ptr ((flex *)ptr) int i; longint x; double y,z; real *xx; doublereal *yy; for(i=0;i< *number; i++) { switch((int)type) { default: f__fatal(117,"unknown type in lio"); case TYINT1: x = Ptr->flchar; goto xint; case TYSHORT: x=Ptr->flshort; goto xint; #ifdef Allow_TYQUAD case TYQUAD: x = Ptr->fllongint; goto xint; #endif case TYLONG: x=Ptr->flint; xint: lwrt_I(x); break; case TYREAL: y=Ptr->flreal; goto xfloat; case TYDREAL: y=Ptr->fldouble; xfloat: lwrt_F(y); break; case TYCOMPLEX: xx= &Ptr->flreal; y = *xx++; z = *xx; goto xcomplex; case TYDCOMPLEX: yy = &Ptr->fldouble; y= *yy++; z = *yy; xcomplex: lwrt_C(y,z); break; case TYLOGICAL1: x = Ptr->flchar; goto xlog; case TYLOGICAL2: x = Ptr->flshort; goto xlog; case TYLOGICAL: x = Ptr->flint; xlog: lwrt_L(Ptr->flint, len); break; case TYCHAR: lwrt_A(ptr,len); break; } ptr += len; } return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/main.c000066400000000000000000000042661413463044200220400ustar00rootroot00000000000000/* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ #include "stdio.h" #include "signal1.h" #ifndef SIGIOT #ifdef SIGABRT #define SIGIOT SIGABRT #endif #endif #ifndef KR_headers #undef VOID #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif #endif #ifndef VOID #define VOID void #endif #ifdef __cplusplus extern "C" { #endif #ifdef NO__STDC #define ONEXIT onexit extern VOID f_exit(); #else #ifndef KR_headers extern void f_exit(void); #ifndef NO_ONEXIT #define ONEXIT atexit extern int atexit(void (*)(void)); #endif #else #ifndef NO_ONEXIT #define ONEXIT onexit extern VOID f_exit(); #endif #endif #endif #ifdef KR_headers extern VOID f_init(), sig_die(); extern int MAIN__(); #define Int /* int */ #else extern void f_init(void), sig_die(const char*, int); extern int MAIN__(void); #define Int int #endif static VOID sigfdie(Sigarg) { Use_Sigarg; sig_die("Floating Exception", 1); } static VOID sigidie(Sigarg) { Use_Sigarg; sig_die("IOT Trap", 1); } #ifdef SIGQUIT static VOID sigqdie(Sigarg) { Use_Sigarg; sig_die("Quit signal", 1); } #endif static VOID sigindie(Sigarg) { Use_Sigarg; sig_die("Interrupt", 0); } static VOID sigtdie(Sigarg) { Use_Sigarg; sig_die("Killed", 0); } #ifdef SIGTRAP static VOID sigtrdie(Sigarg) { Use_Sigarg; sig_die("Trace trap", 1); } #endif int xargc; char **xargv; #ifdef __cplusplus } #endif int #ifdef KR_headers main(argc, argv) int argc; char **argv; #else main(int argc, char **argv) #endif { xargc = argc; xargv = argv; signal1(SIGFPE, sigfdie); /* ignore underflow, enable overflow */ #ifdef SIGIOT signal1(SIGIOT, sigidie); #endif #ifdef SIGTRAP signal1(SIGTRAP, sigtrdie); #endif #ifdef SIGQUIT if(signal1(SIGQUIT,sigqdie) == SIG_IGN) signal1(SIGQUIT, SIG_IGN); #endif if(signal1(SIGINT, sigindie) == SIG_IGN) signal1(SIGINT, SIG_IGN); signal1(SIGTERM,sigtdie); #ifdef pdp11 ldfps(01200); /* detect overflow as an exception */ #endif f_init(); #ifndef NO_ONEXIT ONEXIT(f_exit); #endif MAIN__(); #ifdef NO_ONEXIT f_exit(); #endif exit(0); /* exit(0) rather than return(0) to bypass Cray bug */ return 0; /* For compilers that complain of missing return values; */ /* others will complain that this is unreachable code. */ } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/math.hvc000066400000000000000000000000621413463044200223710ustar00rootroot00000000000000/* for VC 4.2 */ #include #undef complex starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/mkfile.plan9000066400000000000000000000120661413463044200231610ustar00rootroot00000000000000# Plan 9 mkfile for libf2c.a$O f2c.h # For use with "f2c" and "f2c -A": f2c.h: f2c.h0 cp f2c.h0 f2c.h # You may need to adjust signal1.h suitably for your system... signal1.h: signal1.h0 cp signal1.h0 signal1.h clean: rm -f libf2c.a$O *.$O arith.h backspac.$O: fio.h close.$O: fio.h dfe.$O: fio.h dfe.$O: fmt.h due.$O: fio.h endfile.$O: fio.h rawio.h err.$O: fio.h rawio.h fmt.$O: fio.h fmt.$O: fmt.h iio.$O: fio.h iio.$O: fmt.h ilnw.$O: fio.h ilnw.$O: lio.h inquire.$O: fio.h lread.$O: fio.h lread.$O: fmt.h lread.$O: lio.h lread.$O: fp.h lwrite.$O: fio.h lwrite.$O: fmt.h lwrite.$O: lio.h open.$O: fio.h rawio.h rdfmt.$O: fio.h rdfmt.$O: fmt.h rdfmt.$O: fp.h rewind.$O: fio.h rsfe.$O: fio.h rsfe.$O: fmt.h rsli.$O: fio.h rsli.$O: lio.h rsne.$O: fio.h rsne.$O: lio.h sfe.$O: fio.h sue.$O: fio.h uio.$O: fio.h uninit.$O: arith.h util.$O: fio.h wref.$O: fio.h wref.$O: fmt.h wref.$O: fp.h wrtfmt.$O: fio.h wrtfmt.$O: fmt.h wsfe.$O: fio.h wsfe.$O: fmt.h wsle.$O: fio.h wsle.$O: fmt.h wsle.$O: lio.h wsne.$O: fio.h wsne.$O: lio.h xwsne.$O: fio.h xwsne.$O: lio.h xwsne.$O: fmt.h arith.h: arithchk.c pcc -DNO_FPINIT -o arithchk arithchk.c arithchk >$target rm arithchk xsum.out:V: check check: xsum Notice README abort_.c arithchk.c backspac.c c_abs.c c_cos.c \ c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c close.c comptry.bat \ d_abs.c d_acos.c d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c \ d_dim.c d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c \ d_nint.c d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c \ d_tanh.c derf_.c derfc_.c dfe.c dolio.c dtime_.c due.c ef1asc_.c \ ef1cmc_.c endfile.c erf_.c erfc_.c err.c etime_.c exit_.c f2c.h0 \ f2ch.add f77_aloc.c f77vers.c fio.h fmt.c fmt.h fmtlib.c \ fp.h ftell_.c \ getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \ h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ i77vers.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c \ i_nint.c i_sign.c iargc_.c iio.c ilnw.c inquire.c l_ge.c l_gt.c \ l_le.c l_lt.c lbitbits.c lbitshft.c libf2c.lbc libf2c.sy lio.h \ lread.c lwrite.c main.c makefile.sy makefile.u makefile.vc \ makefile.wat math.hvc mkfile.plan9 open.c pow_ci.c pow_dd.c \ pow_di.c pow_hh.c pow_ii.c pow_qq.c pow_ri.c pow_zi.c pow_zz.c \ qbitbits.c qbitshft.c r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \ r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \ r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \ r_tan.c r_tanh.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c \ s_cat.c s_cmp.c s_copy.c s_paus.c s_rnge.c s_stop.c sfe.c \ sig_die.c signal1.h0 signal_.c sue.c system_.c typesize.c uio.c \ uninit.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c xwsne.c \ z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >xsum1.out cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/open.c000066400000000000000000000131051413463044200220450ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "string.h" #ifndef NON_POSIX_STDIO #ifdef MSDOS #include "io.h" #else #include "unistd.h" /* for access */ #endif #endif #ifdef KR_headers extern char *malloc(); #ifdef NON_ANSI_STDIO extern char *mktemp(); #endif extern integer f_clos(); #define Const /*nothing*/ #else #define Const const #undef abs #undef min #undef max #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif extern int f__canseek(FILE*); extern integer f_clos(cllist*); #endif #ifdef NON_ANSI_RW_MODES Const char *f__r_mode[2] = {"r", "r"}; Const char *f__w_mode[4] = {"w", "w", "r+w", "r+w"}; #else Const char *f__r_mode[2] = {"rb", "r"}; Const char *f__w_mode[4] = {"wb", "w", "r+b", "r+"}; #endif static char f__buf0[400], *f__buf = f__buf0; int f__buflen = (int)sizeof(f__buf0); static void #ifdef KR_headers f__bufadj(n, c) int n, c; #else f__bufadj(int n, int c) #endif { unsigned int len; char *nbuf, *s, *t, *te; if (f__buf == f__buf0) f__buflen = 1024; while(f__buflen <= n) f__buflen <<= 1; len = (unsigned int)f__buflen; if (len != f__buflen || !(nbuf = (char*)malloc(len))) f__fatal(113, "malloc failure"); s = nbuf; t = f__buf; te = t + c; while(t < te) *s++ = *t++; if (f__buf != f__buf0) free(f__buf); f__buf = nbuf; } int #ifdef KR_headers f__putbuf(c) int c; #else f__putbuf(int c) #endif { char *s, *se; int n; if (f__hiwater > f__recpos) f__recpos = f__hiwater; n = f__recpos + 1; if (n >= f__buflen) f__bufadj(n, f__recpos); s = f__buf; se = s + f__recpos; if (c) *se++ = c; *se = 0; for(;;) { fputs(s, f__cf); s += strlen(s); if (s >= se) break; /* normally happens the first time */ putc(*s++, f__cf); } return 0; } void #ifdef KR_headers x_putc(c) #else x_putc(int c) #endif { if (f__recpos >= f__buflen) f__bufadj(f__recpos, f__buflen); f__buf[f__recpos++] = c; } #define opnerr(f,m,s) {if(f) errno= m; else opn_err(m,s,a); return(m);} static void #ifdef KR_headers opn_err(m, s, a) int m; char *s; olist *a; #else opn_err(int m, const char *s, olist *a) #endif { if (a->ofnm) { /* supply file name to error message */ if (a->ofnmlen >= f__buflen) f__bufadj((int)a->ofnmlen, 0); g_char(a->ofnm, a->ofnmlen, f__curunit->ufnm = f__buf); } f__fatal(m, s); } #ifdef KR_headers integer f_open(a) olist *a; #else integer f_open(olist *a) #endif { unit *b; integer rv; char buf[256], *s; cllist x; int ufmt; FILE *tf; #ifndef NON_UNIX_STDIO int n; #endif f__external = 1; if(a->ounit>=MXUNIT || a->ounit<0) err(a->oerr,101,"open") if (!f__init) f_init(); f__curunit = b = &f__units[a->ounit]; if(b->ufd) { if(a->ofnm==0) { same: if (a->oblnk) b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z'; return(0); } #ifdef NON_UNIX_STDIO if (b->ufnm && strlen(b->ufnm) == a->ofnmlen && !strncmp(b->ufnm, a->ofnm, (unsigned)a->ofnmlen)) goto same; #else g_char(a->ofnm,a->ofnmlen,buf); if (f__inode(buf,&n) == b->uinode && n == b->udev) goto same; #endif x.cunit=a->ounit; x.csta=0; x.cerr=a->oerr; if ((rv = f_clos(&x)) != 0) return rv; } b->url = (int)a->orl; b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z'); if(a->ofm==0) { if(b->url>0) b->ufmt=0; else b->ufmt=1; } else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1; else b->ufmt=0; ufmt = b->ufmt; #ifdef url_Adjust if (b->url && !ufmt) url_Adjust(b->url); #endif if (a->ofnm) { g_char(a->ofnm,a->ofnmlen,buf); if (!buf[0]) opnerr(a->oerr,107,"open") } else sprintf(buf, "fort.%ld", (long)a->ounit); b->uscrtch = 0; b->uend=0; b->uwrt = 0; b->ufd = 0; b->urw = 3; switch(a->osta ? *a->osta : 'u') { case 'o': case 'O': #ifdef NON_POSIX_STDIO if (!(tf = FOPEN(buf,"r"))) opnerr(a->oerr,errno,"open") fclose(tf); #else if (access(buf,0)) opnerr(a->oerr,errno,"open") #endif break; case 's': case 'S': b->uscrtch=1; #ifdef NON_ANSI_STDIO (void) strcpy(buf,"tmp.FXXXXXX"); (void) mktemp(buf); goto replace; #else if (!(b->ufd = tmpfile())) opnerr(a->oerr,errno,"open") b->ufnm = 0; #ifndef NON_UNIX_STDIO b->uinode = b->udev = -1; #endif b->useek = 1; return 0; #endif case 'n': case 'N': #ifdef NON_POSIX_STDIO if ((tf = FOPEN(buf,"r")) || (tf = FOPEN(buf,"a"))) { fclose(tf); opnerr(a->oerr,128,"open") } #else if (!access(buf,0)) opnerr(a->oerr,128,"open") #endif /* no break */ case 'r': /* Fortran 90 replace option */ case 'R': #ifdef NON_ANSI_STDIO replace: #endif if (tf = FOPEN(buf,f__w_mode[0])) fclose(tf); } b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1)); if(b->ufnm==NULL) opnerr(a->oerr,113,"no space"); (void) strcpy(b->ufnm,buf); if ((s = a->oacc) && b->url) ufmt = 0; if(!(tf = FOPEN(buf, f__w_mode[ufmt|2]))) { if (tf = FOPEN(buf, f__r_mode[ufmt])) b->urw = 1; else if (tf = FOPEN(buf, f__w_mode[ufmt])) { b->uwrt = 1; b->urw = 2; } else err(a->oerr, errno, "open"); } b->useek = f__canseek(b->ufd = tf); #ifndef NON_UNIX_STDIO if((b->uinode = f__inode(buf,&b->udev)) == -1) opnerr(a->oerr,108,"open") #endif if(b->useek) if (a->orl) rewind(b->ufd); else if ((s = a->oacc) && (*s == 'a' || *s == 'A') && FSEEK(b->ufd, 0L, SEEK_END)) opnerr(a->oerr,129,"open"); return(0); } int #ifdef KR_headers fk_open(seq,fmt,n) ftnint n; #else fk_open(int seq, int fmt, ftnint n) #endif { char nbuf[10]; olist a; (void) sprintf(nbuf,"fort.%ld",(long)n); a.oerr=1; a.ounit=n; a.ofnm=nbuf; a.ofnmlen=strlen(nbuf); a.osta=NULL; a.oacc= (char*)(seq==SEQ?"s":"d"); a.ofm = (char*)(fmt==FMT?"f":"u"); a.orl = seq==DIR?1:0; a.oblnk=NULL; return(f_open(&a)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_ci.c000066400000000000000000000006341413463044200223670ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers VOID pow_ci(p, a, b) /* p = a**b */ complex *p, *a; integer *b; #else extern void pow_zi(doublecomplex*, doublecomplex*, integer*); void pow_ci(complex *p, complex *a, integer *b) /* p = a**b */ #endif { doublecomplex p1, a1; a1.r = a->r; a1.i = a->i; pow_zi(&p1, &a1, b); p->r = p1.r; p->i = p1.i; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_dd.c000066400000000000000000000004241413463044200223600ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double pow(); double pow_dd(ap, bp) doublereal *ap, *bp; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double pow_dd(doublereal *ap, doublereal *bp) #endif { return(pow(*ap, *bp) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_di.c000066400000000000000000000007001413463044200223620ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double pow_di(ap, bp) doublereal *ap; integer *bp; #else double pow_di(doublereal *ap, integer *bp) #endif { double pow, x; integer n; unsigned long u; pow = 1; x = *ap; n = *bp; if(n != 0) { if(n < 0) { n = -n; x = 1/x; } for(u = n; ; ) { if(u & 01) pow *= x; if(u >>= 1) x *= x; else break; } } return(pow); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_hh.c000066400000000000000000000007511413463044200223730ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers shortint pow_hh(ap, bp) shortint *ap, *bp; #else shortint pow_hh(shortint *ap, shortint *bp) #endif { shortint pow, x, n; unsigned u; x = *ap; n = *bp; if (n <= 0) { if (n == 0 || x == 1) return 1; if (x != -1) return x == 0 ? 1/x : 0; n = -n; } u = n; for(pow = 1; ; ) { if(u & 01) pow *= x; if(u >>= 1) x *= x; else break; } return(pow); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_ii.c000066400000000000000000000007501413463044200223740ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer pow_ii(ap, bp) integer *ap, *bp; #else integer pow_ii(integer *ap, integer *bp) #endif { integer pow, x, n; unsigned long u; x = *ap; n = *bp; if (n <= 0) { if (n == 0 || x == 1) return 1; if (x != -1) return x == 0 ? 1/x : 0; n = -n; } u = n; for(pow = 1; ; ) { if(u & 01) pow *= x; if(u >>= 1) x *= x; else break; } return(pow); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_qq.c000066400000000000000000000010041413463044200224050ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers longint pow_qq(ap, bp) longint *ap, *bp; #else longint pow_qq(longint *ap, longint *bp) #endif { longint pow, x, n; unsigned long long u; /* system-dependent */ x = *ap; n = *bp; if (n <= 0) { if (n == 0 || x == 1) return 1; if (x != -1) return x == 0 ? 1/x : 0; n = -n; } u = n; for(pow = 1; ; ) { if(u & 01) pow *= x; if(u >>= 1) x *= x; else break; } return(pow); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_ri.c000066400000000000000000000006641413463044200224110ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double pow_ri(ap, bp) real *ap; integer *bp; #else double pow_ri(real *ap, integer *bp) #endif { double pow, x; integer n; unsigned long u; pow = 1; x = *ap; n = *bp; if(n != 0) { if(n < 0) { n = -n; x = 1/x; } for(u = n; ; ) { if(u & 01) pow *= x; if(u >>= 1) x *= x; else break; } } return(pow); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_zi.c000066400000000000000000000015231413463044200224140ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers VOID pow_zi(p, a, b) /* p = a**b */ doublecomplex *p, *a; integer *b; #else extern void z_div(doublecomplex*, doublecomplex*, doublecomplex*); void pow_zi(doublecomplex *p, doublecomplex *a, integer *b) /* p = a**b */ #endif { integer n; unsigned long u; double t; doublecomplex q, x; static doublecomplex one = {1.0, 0.0}; n = *b; q.r = 1; q.i = 0; if(n == 0) goto done; if(n < 0) { n = -n; z_div(&x, &one, a); } else { x.r = a->r; x.i = a->i; } for(u = n; ; ) { if(u & 01) { t = q.r * x.r - q.i * x.i; q.i = q.r * x.i + q.i * x.r; q.r = t; } if(u >>= 1) { t = x.r * x.r - x.i * x.i; x.i = 2 * x.r * x.i; x.r = t; } else break; } done: p->i = q.i; p->r = q.r; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/pow_zz.c000066400000000000000000000010451413463044200224340ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double log(), exp(), cos(), sin(), atan2(), f__cabs(); VOID pow_zz(r,a,b) doublecomplex *r, *a, *b; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif extern double f__cabs(double,double); void pow_zz(doublecomplex *r, doublecomplex *a, doublecomplex *b) #endif { double logr, logi, x, y; logr = log( f__cabs(a->r, a->i) ); logi = atan2(a->i, a->r); x = exp( logr * b->r - logi * b->i ); y = logr * b->i + logi * b->r; r->r = x * cos(y); r->i = x * sin(y); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/qbitbits.c000066400000000000000000000021771413463044200227340ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifndef LONGBITS #define LONGBITS 32 #endif #ifndef LONG8BITS #define LONG8BITS (2*LONGBITS) #endif longint #ifdef KR_headers qbit_bits(a, b, len) longint a; integer b, len; #else qbit_bits(longint a, integer b, integer len) #endif { /* Assume 2's complement arithmetic */ ulongint x, y; x = (ulongint) a; y = (ulongint)-1L; x >>= b; y <<= len; return (longint)(x & ~y); } longint #ifdef KR_headers qbit_cshift(a, b, len) longint a; integer b, len; #else qbit_cshift(longint a, integer b, integer len) #endif { ulongint x, y, z; x = (ulongint)a; if (len <= 0) { if (len == 0) return 0; goto full_len; } if (len >= LONG8BITS) { full_len: if (b >= 0) { b %= LONG8BITS; return (longint)(x << b | x >> LONG8BITS - b ); } b = -b; b %= LONG8BITS; return (longint)(x << LONG8BITS - b | x >> b); } y = z = (unsigned long)-1; y <<= len; z &= ~y; y &= x; x &= z; if (b >= 0) { b %= len; return (longint)(y | z & (x << b | x >> len - b)); } b = -b; b %= len; return (longint)(y | z & (x >> b | x << len - b)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/qbitshft.c000066400000000000000000000004021413463044200227240ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif longint #ifdef KR_headers qbit_shift(a, b) longint a; integer b; #else qbit_shift(longint a, integer b) #endif { return b >= 0 ? a << b : (longint)((ulongint)a >> -b); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_abs.c000066400000000000000000000003161413463044200221720ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double r_abs(x) real *x; #else double r_abs(real *x) #endif { if(*x >= 0) return(*x); return(- *x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_acos.c000066400000000000000000000003511413463044200223510ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double acos(); double r_acos(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_acos(real *x) #endif { return( acos(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_asin.c000066400000000000000000000003511413463044200223560ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double asin(); double r_asin(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_asin(real *x) #endif { return( asin(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_atan.c000066400000000000000000000003511413463044200223470ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double atan(); double r_atan(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_atan(real *x) #endif { return( atan(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_atn2.c000066400000000000000000000003751413463044200222760ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double atan2(); double r_atn2(x,y) real *x, *y; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_atn2(real *x, real *y) #endif { return( atan2(*x,*y) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_cnjg.c000066400000000000000000000003531413463044200223470ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers VOID r_cnjg(r, z) complex *r, *z; #else VOID r_cnjg(complex *r, complex *z) #endif { real zi = z->i; r->r = z->r; r->i = -zi; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_cos.c000066400000000000000000000003451413463044200222130ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double cos(); double r_cos(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_cos(real *x) #endif { return( cos(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_cosh.c000066400000000000000000000003511413463044200223600ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double cosh(); double r_cosh(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_cosh(real *x) #endif { return( cosh(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_dim.c000066400000000000000000000003261413463044200221770ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double r_dim(a,b) real *a, *b; #else double r_dim(real *a, real *b) #endif { return( *a > *b ? *a - *b : 0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_exp.c000066400000000000000000000003451413463044200222230ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double exp(); double r_exp(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_exp(real *x) #endif { return( exp(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_imag.c000066400000000000000000000002751413463044200223460ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double r_imag(z) complex *z; #else double r_imag(complex *z) #endif { return(z->i); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_int.c000066400000000000000000000004011413463044200222120ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); double r_int(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_int(real *x) #endif { return( (*x>0) ? floor(*x) : -floor(- *x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_lg10.c000066400000000000000000000004271413463044200221730ustar00rootroot00000000000000#include "f2c.h" #define log10e 0.43429448190325182765 #ifdef KR_headers double log(); double r_lg10(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_lg10(real *x) #endif { return( log10e * log(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_log.c000066400000000000000000000003451413463044200222100ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double log(); double r_log(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_log(real *x) #endif { return( log(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_mod.c000066400000000000000000000012461413463044200222070ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers #ifdef IEEE_drem double drem(); #else double floor(); #endif double r_mod(x,y) real *x, *y; #else #ifdef IEEE_drem double drem(double, double); #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif #endif double r_mod(real *x, real *y) #endif { #ifdef IEEE_drem double xa, ya, z; if ((ya = *y) < 0.) ya = -ya; z = drem(xa = *x, ya); if (xa > 0) { if (z < 0) z += ya; } else if (z > 0) z -= ya; return z; #else double quotient; if( (quotient = (double)*x / *y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(*x - (*y) * quotient ); #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_nint.c000066400000000000000000000004151413463044200223750ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double floor(); double r_nint(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_nint(real *x) #endif { return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_sign.c000066400000000000000000000003701413463044200223650ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double r_sign(a,b) real *a, *b; #else double r_sign(real *a, real *b) #endif { double x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_sin.c000066400000000000000000000003451413463044200222200ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sin(); double r_sin(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_sin(real *x) #endif { return( sin(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_sinh.c000066400000000000000000000003511413463044200223650ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sinh(); double r_sinh(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_sinh(real *x) #endif { return( sinh(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_sqrt.c000066400000000000000000000003511413463044200224150ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sqrt(); double r_sqrt(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_sqrt(real *x) #endif { return( sqrt(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_tan.c000066400000000000000000000003451413463044200222110ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double tan(); double r_tan(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_tan(real *x) #endif { return( tan(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/r_tanh.c000066400000000000000000000003511413463044200223560ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double tanh(); double r_tanh(x) real *x; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif double r_tanh(real *x) #endif { return( tanh(*x) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/rawio.h000066400000000000000000000013161413463044200222330ustar00rootroot00000000000000#ifndef KR_headers #ifdef MSDOS #include "io.h" #ifndef WATCOM #define close _close #define creat _creat #define open _open #define read _read #define write _write #endif /*WATCOM*/ #endif /*MSDOS*/ #ifdef __cplusplus extern "C" { #endif #ifndef MSDOS #ifdef OPEN_DECL extern int creat(const char*,int), open(const char*,int); #endif extern int close(int); extern int read(int,void*,size_t), write(int,void*,size_t); extern int unlink(const char*); #ifndef _POSIX_SOURCE #ifndef NON_UNIX_STDIO extern FILE *fdopen(int, const char*); #endif #endif #endif /*KR_HEADERS*/ extern char *mktemp(char*); #ifdef __cplusplus } #endif #endif #include "fcntl.h" #ifndef O_WRONLY #define O_RDONLY 0 #define O_WRONLY 1 #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/rdfmt.c000066400000000000000000000213351413463044200222240ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef KR_headers extern double atof(); #define Const /*nothing*/ #else #define Const const #undef abs #undef min #undef max #include "stdlib.h" #endif #include "fmt.h" #include "fp.h" #include "ctype.h" #ifdef __cplusplus extern "C" { #endif static int #ifdef KR_headers rd_Z(n,w,len) Uint *n; ftnlen len; #else rd_Z(Uint *n, int w, ftnlen len) #endif { long x[9]; char *s, *s0, *s1, *se, *t; Const char *sc; int ch, i, w1, w2; static char hex[256]; static int one = 1; int bad = 0; if (!hex['0']) { sc = "0123456789"; while(ch = *sc++) hex[ch] = ch - '0' + 1; sc = "ABCDEF"; while(ch = *sc++) hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11; } s = s0 = (char *)x; s1 = (char *)&x[4]; se = (char *)&x[8]; if (len > 4*sizeof(long)) return errno = 117; while (w) { GET(ch); if (ch==',' || ch=='\n') break; w--; if (ch > ' ') { if (!hex[ch & 0xff]) bad++; *s++ = ch; if (s == se) { /* discard excess characters */ for(t = s0, s = s1; t < s1;) *t++ = *s++; s = s1; } } } if (bad) return errno = 115; w = (int)len; w1 = s - s0; w2 = w1+1 >> 1; t = (char *)n; if (*(char *)&one) { /* little endian */ t += w - 1; i = -1; } else i = 1; for(; w > w2; t += i, --w) *t = 0; if (!w) return 0; if (w < w2) s0 = s - (w << 1); else if (w1 & 1) { *t = hex[*s0++ & 0xff] - 1; if (!--w) return 0; t += i; } do { *t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1; t += i; s0 += 2; } while(--w); return 0; } static int #ifdef KR_headers rd_I(n,w,len, base) Uint *n; int w; ftnlen len; register int base; #else rd_I(Uint *n, int w, ftnlen len, register int base) #endif { int ch, sign; longint x = 0; if (w <= 0) goto have_x; for(;;) { GET(ch); if (ch != ' ') break; if (!--w) goto have_x; } sign = 0; switch(ch) { case ',': case '\n': w = 0; goto have_x; case '-': sign = 1; case '+': break; default: if (ch >= '0' && ch <= '9') { x = ch - '0'; break; } goto have_x; } while(--w) { GET(ch); if (ch >= '0' && ch <= '9') { x = x*base + ch - '0'; continue; } if (ch != ' ') { if (ch == '\n' || ch == ',') w = 0; break; } if (f__cblank) x *= base; } if (sign) x = -x; have_x: if(len == sizeof(integer)) n->il=x; else if(len == sizeof(char)) n->ic = (char)x; #ifdef Allow_TYQUAD else if (len == sizeof(longint)) n->ili = x; #endif else n->is = (short)x; if (w) { while(--w) GET(ch); return errno = 115; } return 0; } static int #ifdef KR_headers rd_L(n,w,len) ftnint *n; ftnlen len; #else rd_L(ftnint *n, int w, ftnlen len) #endif { int ch, dot, lv; if (w <= 0) goto bad; for(;;) { GET(ch); --w; if (ch != ' ') break; if (!w) goto bad; } dot = 0; retry: switch(ch) { case '.': if (dot++ || !w) goto bad; GET(ch); --w; goto retry; case 't': case 'T': lv = 1; break; case 'f': case 'F': lv = 0; break; default: bad: for(; w > 0; --w) GET(ch); /* no break */ case ',': case '\n': return errno = 116; } switch(len) { case sizeof(char): *(char *)n = (char)lv; break; case sizeof(short): *(short *)n = (short)lv; break; default: *n = lv; } while(w-- > 0) { GET(ch); if (ch == ',' || ch == '\n') break; } return 0; } static int #ifdef KR_headers rd_F(p, w, d, len) ufloat *p; ftnlen len; #else rd_F(ufloat *p, int w, int d, ftnlen len) #endif { char s[FMAX+EXPMAXDIGS+4]; register int ch; register char *sp, *spe, *sp1; double x; int scale1, se; long e, exp; sp1 = sp = s; spe = sp + FMAX; exp = -d; x = 0.; do { GET(ch); w--; } while (ch == ' ' && w); switch(ch) { case '-': *sp++ = ch; sp1++; spe++; case '+': if (!w) goto zero; --w; GET(ch); } while(ch == ' ') { blankdrop: if (!w--) goto zero; GET(ch); } while(ch == '0') { if (!w--) goto zero; GET(ch); } if (ch == ' ' && f__cblank) goto blankdrop; scale1 = f__scale; while(isdigit(ch)) { digloop1: if (sp < spe) *sp++ = ch; else ++exp; digloop1e: if (!w--) goto done; GET(ch); } if (ch == ' ') { if (f__cblank) { ch = '0'; goto digloop1; } goto digloop1e; } if (ch == '.') { exp += d; if (!w--) goto done; GET(ch); if (sp == sp1) { /* no digits yet */ while(ch == '0') { skip01: --exp; skip0: if (!w--) goto done; GET(ch); } if (ch == ' ') { if (f__cblank) goto skip01; goto skip0; } } while(isdigit(ch)) { digloop2: if (sp < spe) { *sp++ = ch; --exp; } digloop2e: if (!w--) goto done; GET(ch); } if (ch == ' ') { if (f__cblank) { ch = '0'; goto digloop2; } goto digloop2e; } } switch(ch) { default: break; case '-': se = 1; goto signonly; case '+': se = 0; goto signonly; case 'e': case 'E': case 'd': case 'D': if (!w--) goto bad; GET(ch); while(ch == ' ') { if (!w--) goto bad; GET(ch); } se = 0; switch(ch) { case '-': se = 1; case '+': signonly: if (!w--) goto bad; GET(ch); } while(ch == ' ') { if (!w--) goto bad; GET(ch); } if (!isdigit(ch)) goto bad; e = ch - '0'; for(;;) { if (!w--) { ch = '\n'; break; } GET(ch); if (!isdigit(ch)) { if (ch == ' ') { if (f__cblank) ch = '0'; else continue; } else break; } e = 10*e + ch - '0'; if (e > EXPMAX && sp > sp1) goto bad; } if (se) exp -= e; else exp += e; scale1 = 0; } switch(ch) { case '\n': case ',': break; default: bad: return (errno = 115); } done: if (sp > sp1) { while(*--sp == '0') ++exp; if (exp -= scale1) sprintf(sp+1, "e%ld", exp); else sp[1] = 0; x = atof(s); } zero: if (len == sizeof(real)) p->pf = x; else p->pd = x; return(0); } static int #ifdef KR_headers rd_A(p,len) char *p; ftnlen len; #else rd_A(char *p, ftnlen len) #endif { int i,ch; for(i=0;i=len) { for(i=0;i0;f__cursor--) if((ch=(*f__getn)())<0) return(ch); if(f__cursor<0) { if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/ f__cursor = -f__recpos; /* is this in the standard? */ if(f__external == 0) { extern char *f__icptr; f__icptr += f__cursor; } else if(f__curunit && f__curunit->useek) (void) FSEEK(f__cf, f__cursor,SEEK_CUR); else err(f__elist->cierr,106,"fmt"); f__recpos += f__cursor; f__cursor=0; } switch(p->op) { default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op); sig_die(f__fmtbuf, 1); case IM: case I: ch = rd_I((Uint *)ptr,p->p1,len, 10); break; /* O and OM don't work right for character, double, complex, */ /* or doublecomplex, and they differ from Fortran 90 in */ /* showing a minus sign for negative values. */ case OM: case O: ch = rd_I((Uint *)ptr, p->p1, len, 8); break; case L: ch = rd_L((ftnint *)ptr,p->p1,len); break; case A: ch = rd_A(ptr,len); break; case AW: ch = rd_AW(ptr,p->p1,len); break; case E: case EE: case D: case G: case GE: case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2.i[0],len); break; /* Z and ZM assume 8-bit bytes. */ case ZM: case Z: ch = rd_Z((Uint *)ptr, p->p1, len); break; } if(ch == 0) return(ch); else if(ch == EOF) return(EOF); if (f__cf) clearerr(f__cf); return(errno); } int #ifdef KR_headers rd_ned(p) struct syl *p; #else rd_ned(struct syl *p) #endif { switch(p->op) { default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op); sig_die(f__fmtbuf, 1); case APOS: return(rd_POS(p->p2.s)); case H: return(rd_H(p->p1,p->p2.s)); case SLASH: return((*f__donewrec)()); case TR: case X: f__cursor += p->p1; return(1); case T: f__cursor=p->p1-f__recpos - 1; return(1); case TL: f__cursor -= p->p1; if(f__cursor < -f__recpos) /* TL1000, 1X */ f__cursor = -f__recpos; return(1); } } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/rewind.c000066400000000000000000000007331413463044200223770ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer f_rew(a) alist *a; #else integer f_rew(alist *a) #endif { unit *b; if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"rewind"); b = &f__units[a->aunit]; if(b->ufd == NULL || b->uwrt == 3) return(0); if(!b->useek) err(a->aerr,106,"rewind") if(b->uwrt) { (void) t_runc(a); b->uwrt = 3; } rewind(b->ufd); b->uend=0; return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/rsfe.c000066400000000000000000000027241413463044200220500ustar00rootroot00000000000000/* read sequential formatted external */ #include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif int xrd_SL(Void) { int ch; if(!f__curunit->uend) while((ch=getc(f__cf))!='\n') if (ch == EOF) { f__curunit->uend = 1; break; } f__cursor=f__recpos=0; return(1); } int x_getc(Void) { int ch; if(f__curunit->uend) return(EOF); ch = getc(f__cf); if(ch!=EOF && ch!='\n') { f__recpos++; return(ch); } if(ch=='\n') { (void) ungetc(ch,f__cf); return(ch); } if(f__curunit->uend || feof(f__cf)) { errno=0; f__curunit->uend=1; return(-1); } return(-1); } int x_endp(Void) { xrd_SL(); return f__curunit->uend == 1 ? EOF : 0; } int x_rev(Void) { (void) xrd_SL(); return(0); } #ifdef KR_headers integer s_rsfe(a) cilist *a; /* start */ #else integer s_rsfe(cilist *a) /* start */ #endif { int n; if(!f__init) f_init(); f__reading=1; f__sequential=1; f__formatted=1; f__external=1; if(n=c_sfe(a)) return(n); f__elist=a; f__cursor=f__recpos=0; f__scale=0; f__fmtbuf=a->cifmt; f__cf=f__curunit->ufd; if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio"); f__getn= x_getc; f__doed= rd_ed; f__doned= rd_ned; fmt_bg(); f__doend=x_endp; f__donewrec=xrd_SL; f__dorevert=x_rev; f__cblank=f__curunit->ublnk; f__cplus=0; if(f__curunit->uwrt && f__nowreading(f__curunit)) err(a->cierr,errno,"read start"); if(f__curunit->uend) err(f__elist->ciend,(EOF),"read start"); return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/rsli.c000066400000000000000000000033711413463044200220610ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "lio.h" #include "fmt.h" /* for f__doend */ #ifdef __cplusplus extern "C" { #endif extern flag f__lquit; extern int f__lcount; extern char *f__icptr; extern char *f__icend; extern icilist *f__svic; extern int f__icnum, f__recpos; static int i_getc(Void) { if(f__recpos >= f__svic->icirlen) { if (f__recpos++ == f__svic->icirlen) return '\n'; z_rnew(); } f__recpos++; if(f__icptr >= f__icend) return EOF; return(*f__icptr++); } static #ifdef KR_headers int i_ungetc(ch, f) int ch; FILE *f; #else int i_ungetc(int ch, FILE *f) #endif { if (--f__recpos == f__svic->icirlen) return '\n'; if (f__recpos < -1) err(f__svic->icierr,110,"recend"); /* *--icptr == ch, and icptr may point to read-only memory */ return *--f__icptr /* = ch */; } static void #ifdef KR_headers c_lir(a) icilist *a; #else c_lir(icilist *a) #endif { extern int l_eof; f__reading = 1; f__external = 0; f__formatted = 1; f__svic = a; L_len = a->icirlen; f__recpos = -1; f__icnum = f__recpos = 0; f__cursor = 0; l_getc = i_getc; l_ungetc = i_ungetc; l_eof = 0; f__icptr = a->iciunit; f__icend = f__icptr + a->icirlen*a->icirnum; f__cf = 0; f__curunit = 0; f__elist = (cilist *)a; } #ifdef KR_headers integer s_rsli(a) icilist *a; #else integer s_rsli(icilist *a) #endif { f__lioproc = l_read; f__lquit = 0; f__lcount = 0; c_lir(a); f__doend = 0; return(0); } integer e_rsli(Void) { return 0; } #ifdef KR_headers integer s_rsni(a) icilist *a; #else extern int x_rsne(cilist*); integer s_rsni(icilist *a) #endif { extern int nml_read; integer rv; cilist ca; ca.ciend = a->iciend; ca.cierr = a->icierr; ca.cifmt = a->icifmt; c_lir(a); rv = x_rsne(&ca); nml_read = 0; return rv; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/rsne.c000066400000000000000000000265011413463044200220570ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "lio.h" #define MAX_NL_CACHE 3 /* maximum number of namelist hash tables to cache */ #define MAXDIM 20 /* maximum number of subscripts */ struct dimen { ftnlen extent; ftnlen curval; ftnlen delta; ftnlen stride; }; typedef struct dimen dimen; struct hashentry { struct hashentry *next; char *name; Vardesc *vd; }; typedef struct hashentry hashentry; struct hashtab { struct hashtab *next; Namelist *nl; int htsize; hashentry *tab[1]; }; typedef struct hashtab hashtab; static hashtab *nl_cache; static int n_nlcache; static hashentry **zot; static int colonseen; extern ftnlen f__typesize[]; extern flag f__lquit; extern int f__lcount, nml_read; extern int t_getc(Void); #ifdef KR_headers extern char *malloc(), *memset(); #define Const /*nothing*/ #ifdef ungetc static int un_getc(x,f__cf) int x; FILE *f__cf; { return ungetc(x,f__cf); } #else #define un_getc ungetc extern int ungetc(); #endif #else #define Const const #undef abs #undef min #undef max #include "stdlib.h" #include "string.h" #ifdef __cplusplus extern "C" { #endif #ifdef ungetc static int un_getc(int x, FILE *f__cf) { return ungetc(x,f__cf); } #else #define un_getc ungetc extern int ungetc(int, FILE*); /* for systems with a buggy stdio.h */ #endif #endif static Vardesc * #ifdef KR_headers hash(ht, s) hashtab *ht; register char *s; #else hash(hashtab *ht, register char *s) #endif { register int c, x; register hashentry *h; char *s0 = s; for(x = 0; c = *s++; x = x & 0x4000 ? ((x << 1) & 0x7fff) + 1 : x << 1) x += c; for(h = *(zot = ht->tab + x % ht->htsize); h; h = h->next) if (!strcmp(s0, h->name)) return h->vd; return 0; } hashtab * #ifdef KR_headers mk_hashtab(nl) Namelist *nl; #else mk_hashtab(Namelist *nl) #endif { int nht, nv; hashtab *ht; Vardesc *v, **vd, **vde; hashentry *he; hashtab **x, **x0, *y; for(x = &nl_cache; y = *x; x0 = x, x = &y->next) if (nl == y->nl) return y; if (n_nlcache >= MAX_NL_CACHE) { /* discard least recently used namelist hash table */ y = *x0; free((char *)y->next); y->next = 0; } else n_nlcache++; nv = nl->nvars; if (nv >= 0x4000) nht = 0x7fff; else { for(nht = 1; nht < nv; nht <<= 1); nht += nht - 1; } ht = (hashtab *)malloc(sizeof(hashtab) + (nht-1)*sizeof(hashentry *) + nv*sizeof(hashentry)); if (!ht) return 0; he = (hashentry *)&ht->tab[nht]; ht->nl = nl; ht->htsize = nht; ht->next = nl_cache; nl_cache = ht; memset((char *)ht->tab, 0, nht*sizeof(hashentry *)); vd = nl->vars; vde = vd + nv; while(vd < vde) { v = *vd++; if (!hash(ht, v->name)) { he->next = *zot; *zot = he; he->name = v->name; he->vd = v; he++; } } return ht; } static char Alpha[256], Alphanum[256]; static VOID nl_init(Void) { Const char *s; int c; if(!f__init) f_init(); for(s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; c = *s++; ) Alpha[c] = Alphanum[c] = Alpha[c + 'a' - 'A'] = Alphanum[c + 'a' - 'A'] = c; for(s = "0123456789_"; c = *s++; ) Alphanum[c] = c; } #define GETC(x) (x=(*l_getc)()) #define Ungetc(x,y) (*l_ungetc)(x,y) static int #ifdef KR_headers getname(s, slen) register char *s; int slen; #else getname(register char *s, int slen) #endif { register char *se = s + slen - 1; register int ch; GETC(ch); if (!(*s++ = Alpha[ch & 0xff])) { if (ch != EOF) ch = 115; errfl(f__elist->cierr, ch, "namelist read"); } while(*s = Alphanum[GETC(ch) & 0xff]) if (s < se) s++; if (ch == EOF) err(f__elist->cierr, EOF, "namelist read"); if (ch > ' ') Ungetc(ch,f__cf); return *s = 0; } static int #ifdef KR_headers getnum(chp, val) int *chp; ftnlen *val; #else getnum(int *chp, ftnlen *val) #endif { register int ch, sign; register ftnlen x; while(GETC(ch) <= ' ' && ch >= 0); if (ch == '-') { sign = 1; GETC(ch); } else { sign = 0; if (ch == '+') GETC(ch); } x = ch - '0'; if (x < 0 || x > 9) return 115; while(GETC(ch) >= '0' && ch <= '9') x = 10*x + ch - '0'; while(ch <= ' ' && ch >= 0) GETC(ch); if (ch == EOF) return EOF; *val = sign ? -x : x; *chp = ch; return 0; } static int #ifdef KR_headers getdimen(chp, d, delta, extent, x1) int *chp; dimen *d; ftnlen delta, extent, *x1; #else getdimen(int *chp, dimen *d, ftnlen delta, ftnlen extent, ftnlen *x1) #endif { register int k; ftnlen x2, x3; if (k = getnum(chp, x1)) return k; x3 = 1; if (*chp == ':') { if (k = getnum(chp, &x2)) return k; x2 -= *x1; if (*chp == ':') { if (k = getnum(chp, &x3)) return k; if (!x3) return 123; x2 /= x3; colonseen = 1; } if (x2 < 0 || x2 >= extent) return 123; d->extent = x2 + 1; } else d->extent = 1; d->curval = 0; d->delta = delta; d->stride = x3; return 0; } #ifndef No_Namelist_Questions static Void #ifdef KR_headers print_ne(a) cilist *a; #else print_ne(cilist *a) #endif { flag intext = f__external; int rpsave = f__recpos; FILE *cfsave = f__cf; unit *usave = f__curunit; cilist t; t = *a; t.ciunit = 6; s_wsne(&t); fflush(f__cf); f__external = intext; f__reading = 1; f__recpos = rpsave; f__cf = cfsave; f__curunit = usave; f__elist = a; } #endif static char where0[] = "namelist read start "; int #ifdef KR_headers x_rsne(a) cilist *a; #else x_rsne(cilist *a) #endif { int ch, got1, k, n, nd, quote, readall; Namelist *nl; static char where[] = "namelist read"; char buf[64]; hashtab *ht; Vardesc *v; dimen *dn, *dn0, *dn1; ftnlen *dims, *dims1; ftnlen b, b0, b1, ex, no, nomax, size, span; ftnint no1, no2, type; char *vaddr; long iva, ivae; dimen dimens[MAXDIM], substr; if (!Alpha['a']) nl_init(); f__reading=1; f__formatted=1; got1 = 0; top: for(;;) switch(GETC(ch)) { case EOF: eof: err(a->ciend,(EOF),where0); case '&': case '$': goto have_amp; #ifndef No_Namelist_Questions case '?': print_ne(a); continue; #endif default: if (ch <= ' ' && ch >= 0) continue; #ifndef No_Namelist_Comments while(GETC(ch) != '\n') if (ch == EOF) goto eof; #else errfl(a->cierr, 115, where0); #endif } have_amp: if (ch = getname(buf,sizeof(buf))) return ch; nl = (Namelist *)a->cifmt; if (strcmp(buf, nl->name)) #ifdef No_Bad_Namelist_Skip errfl(a->cierr, 118, where0); #else { fprintf(stderr, "Skipping namelist \"%s\": seeking namelist \"%s\".\n", buf, nl->name); fflush(stderr); for(;;) switch(GETC(ch)) { case EOF: err(a->ciend, EOF, where0); case '/': case '&': case '$': if (f__external) e_rsle(); else z_rnew(); goto top; case '"': case '\'': quote = ch; more_quoted: while(GETC(ch) != quote) if (ch == EOF) err(a->ciend, EOF, where0); if (GETC(ch) == quote) goto more_quoted; Ungetc(ch,f__cf); default: continue; } } #endif ht = mk_hashtab(nl); if (!ht) errfl(f__elist->cierr, 113, where0); for(;;) { for(;;) switch(GETC(ch)) { case EOF: if (got1) return 0; err(a->ciend, EOF, where0); case '/': case '$': case '&': return 0; default: if (ch <= ' ' && ch >= 0 || ch == ',') continue; Ungetc(ch,f__cf); if (ch = getname(buf,sizeof(buf))) return ch; goto havename; } havename: v = hash(ht,buf); if (!v) errfl(a->cierr, 119, where); while(GETC(ch) <= ' ' && ch >= 0); vaddr = v->addr; type = v->type; if (type < 0) { size = -type; type = TYCHAR; } else size = f__typesize[type]; ivae = size; iva = readall = 0; if (ch == '(' /*)*/ ) { dn = dimens; if (!(dims = v->dims)) { if (type != TYCHAR) errfl(a->cierr, 122, where); if (k = getdimen(&ch, dn, (ftnlen)size, (ftnlen)size, &b)) errfl(a->cierr, k, where); if (ch != ')') errfl(a->cierr, 115, where); b1 = dn->extent; if (--b < 0 || b + b1 > size) return 124; iva += b; size = b1; while(GETC(ch) <= ' ' && ch >= 0); goto scalar; } nd = (int)dims[0]; nomax = span = dims[1]; ivae = iva + size*nomax; colonseen = 0; if (k = getdimen(&ch, dn, size, nomax, &b)) errfl(a->cierr, k, where); no = dn->extent; b0 = dims[2]; dims1 = dims += 3; ex = 1; for(n = 1; n++ < nd; dims++) { if (ch != ',') errfl(a->cierr, 115, where); dn1 = dn + 1; span /= *dims; if (k = getdimen(&ch, dn1, dn->delta**dims, span, &b1)) errfl(a->cierr, k, where); ex *= *dims; b += b1*ex; no *= dn1->extent; dn = dn1; } if (ch != ')') errfl(a->cierr, 115, where); readall = 1 - colonseen; b -= b0; if (b < 0 || b >= nomax) errfl(a->cierr, 125, where); iva += size * b; dims = dims1; while(GETC(ch) <= ' ' && ch >= 0); no1 = 1; dn0 = dimens; if (type == TYCHAR && ch == '(' /*)*/) { if (k = getdimen(&ch, &substr, size, size, &b)) errfl(a->cierr, k, where); if (ch != ')') errfl(a->cierr, 115, where); b1 = substr.extent; if (--b < 0 || b + b1 > size) return 124; iva += b; b0 = size; size = b1; while(GETC(ch) <= ' ' && ch >= 0); if (b1 < b0) goto delta_adj; } if (readall) goto delta_adj; for(; dn0 < dn; dn0++) { if (dn0->extent != *dims++ || dn0->stride != 1) break; no1 *= dn0->extent; } if (dn0 == dimens && dimens[0].stride == 1) { no1 = dimens[0].extent; dn0++; } delta_adj: ex = 0; for(dn1 = dn0; dn1 <= dn; dn1++) ex += (dn1->extent-1) * (dn1->delta *= dn1->stride); for(dn1 = dn; dn1 > dn0; dn1--) { ex -= (dn1->extent - 1) * dn1->delta; dn1->delta -= ex; } } else if (dims = v->dims) { no = no1 = dims[1]; ivae = iva + no*size; } else scalar: no = no1 = 1; if (ch != '=') errfl(a->cierr, 115, where); got1 = nml_read = 1; f__lcount = 0; readloop: for(;;) { if (iva >= ivae || iva < 0) { f__lquit = 1; goto mustend; } else if (iva + no1*size > ivae) no1 = (ivae - iva)/size; f__lquit = 0; if (k = l_read(&no1, vaddr + iva, size, type)) return k; if (f__lquit == 1) return 0; if (readall) { iva += dn0->delta; if (f__lcount > 0) { no2 = (ivae - iva)/size; if (no2 > f__lcount) no2 = f__lcount; if (k = l_read(&no2, vaddr + iva, size, type)) return k; iva += no2 * dn0->delta; } } mustend: GETC(ch); if (readall) if (iva >= ivae) readall = 0; else for(;;) { switch(ch) { case ' ': case '\t': case '\n': GETC(ch); continue; } break; } if (ch == '/' || ch == '$' || ch == '&') { f__lquit = 1; return 0; } else if (f__lquit) { while(ch <= ' ' && ch >= 0) GETC(ch); Ungetc(ch,f__cf); if (!Alpha[ch & 0xff] && ch >= 0) errfl(a->cierr, 125, where); break; } Ungetc(ch,f__cf); if (readall && !Alpha[ch & 0xff]) goto readloop; if ((no -= no1) <= 0) break; for(dn1 = dn0; dn1 <= dn; dn1++) { if (++dn1->curval < dn1->extent) { iva += dn1->delta; goto readloop; } dn1->curval = 0; } break; } } } integer #ifdef KR_headers s_rsne(a) cilist *a; #else s_rsne(cilist *a) #endif { extern int l_eof; int n; f__external=1; l_eof = 0; if(n = c_le(a)) return n; if(f__curunit->uwrt && f__nowreading(f__curunit)) err(a->cierr,errno,where0); l_getc = t_getc; l_ungetc = un_getc; f__doend = xrd_SL; n = x_rsne(a); nml_read = 0; if (n) return n; return e_rsle(); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/s_cat.c000066400000000000000000000026621413463044200222030ustar00rootroot00000000000000/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the * target of a concatenation to appear on its right-hand side (contrary * to the Fortran 77 Standard, but in accordance with Fortran 90). */ #include "f2c.h" #ifndef NO_OVERWRITE #include "stdio.h" #undef abs #ifdef KR_headers extern char *F77_aloc(); extern void free(); extern void exit_(); #else #undef min #undef max #include "stdlib.h" extern #ifdef __cplusplus "C" #endif char *F77_aloc(ftnlen, const char*); #endif #include "string.h" #endif /* NO_OVERWRITE */ #ifdef __cplusplus extern "C" { #endif VOID #ifdef KR_headers s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnint rnp[], *np; ftnlen ll; #else s_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) #endif { ftnlen i, nc; char *rp; ftnlen n = *np; #ifndef NO_OVERWRITE ftnlen L, m; char *lp0, *lp1; lp0 = 0; lp1 = lp; L = ll; i = 0; while(i < n) { rp = rpp[i]; m = rnp[i++]; if (rp >= lp1 || rp + m <= lp) { if ((L -= m) <= 0) { n = i; break; } lp1 += m; continue; } lp0 = lp; lp = lp1 = F77_aloc(L = ll, "s_cat"); break; } lp1 = lp; #endif /* NO_OVERWRITE */ for(i = 0 ; i < n ; ++i) { nc = ll; if(rnp[i] < nc) nc = rnp[i]; ll -= nc; rp = rpp[i]; while(--nc >= 0) *lp++ = *rp++; } while(--ll >= 0) *lp++ = ' '; #ifndef NO_OVERWRITE if (lp0) { memcpy(lp0, lp1, L); free(lp1); } #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/s_cmp.c000066400000000000000000000013221413463044200222030ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif /* compare two strings */ #ifdef KR_headers integer s_cmp(a0, b0, la, lb) char *a0, *b0; ftnlen la, lb; #else integer s_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) #endif { register unsigned char *a, *aend, *b, *bend; a = (unsigned char *)a0; b = (unsigned char *)b0; aend = a + la; bend = b + lb; if(la <= lb) { while(a < aend) if(*a != *b) return( *a - *b ); else { ++a; ++b; } while(b < bend) if(*b != ' ') return( ' ' - *b ); else ++b; } else { while(b < bend) if(*a == *b) { ++a; ++b; } else return( *a - *b ); while(a < aend) if(*a != ' ') return(*a - ' '); else ++a; } return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/s_copy.c000066400000000000000000000020001413463044200223700ustar00rootroot00000000000000/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the * target of an assignment to appear on its right-hand side (contrary * to the Fortran 77 Standard, but in accordance with Fortran 90), * as in a(2:5) = a(4:7) . */ #include "f2c.h" #ifdef __cplusplus extern "C" { #endif /* assign strings: a = b */ #ifdef KR_headers VOID s_copy(a, b, la, lb) register char *a, *b; ftnlen la, lb; #else void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb) #endif { register char *aend, *bend; aend = a + la; if(la <= lb) #ifndef NO_OVERWRITE if (a <= b || a >= b + la) #endif while(a < aend) *a++ = *b++; #ifndef NO_OVERWRITE else for(b += la; a < aend; ) *--aend = *--b; #endif else { bend = b + lb; #ifndef NO_OVERWRITE if (a <= b || a >= bend) #endif while(b < bend) *a++ = *b++; #ifndef NO_OVERWRITE else { a += lb; while(b < bend) *--a = *--bend; a += lb; } #endif while(a < aend) *a++ = ' '; } } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/s_paus.c000066400000000000000000000031211413463044200223730ustar00rootroot00000000000000#include "stdio.h" #include "f2c.h" #define PAUSESIG 15 #include "signal1.h" #ifdef KR_headers #define Void /* void */ #define Int /* int */ #else #define Void void #define Int int #undef abs #undef min #undef max #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus extern "C" { #endif extern int getpid(void), isatty(int), pause(void); #endif extern VOID f_exit(Void); #ifndef MSDOS static VOID waitpause(Sigarg) { Use_Sigarg; return; } #endif static VOID #ifdef KR_headers s_1paus(fin) FILE *fin; #else s_1paus(FILE *fin) #endif { fprintf(stderr, "To resume execution, type go. Other input will terminate the job.\n"); fflush(stderr); if( getc(fin)!='g' || getc(fin)!='o' || getc(fin)!='\n' ) { fprintf(stderr, "STOP\n"); #ifdef NO_ONEXIT f_exit(); #endif exit(0); } } int #ifdef KR_headers s_paus(s, n) char *s; ftnlen n; #else s_paus(char *s, ftnlen n) #endif { fprintf(stderr, "PAUSE "); if(n > 0) fprintf(stderr, " %.*s", (int)n, s); fprintf(stderr, " statement executed\n"); if( isatty(fileno(stdin)) ) s_1paus(stdin); else { #ifdef MSDOS FILE *fin; fin = fopen("con", "r"); if (!fin) { fprintf(stderr, "s_paus: can't open con!\n"); fflush(stderr); exit(1); } s_1paus(fin); fclose(fin); #else fprintf(stderr, "To resume execution, execute a kill -%d %d command\n", PAUSESIG, getpid() ); signal1(PAUSESIG, waitpause); fflush(stderr); pause(); #endif } fprintf(stderr, "Execution resumes after PAUSE.\n"); fflush(stderr); return 0; /* NOT REACHED */ #ifdef __cplusplus } #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/s_rnge.c000066400000000000000000000013671413463044200223700ustar00rootroot00000000000000#include "stdio.h" #include "f2c.h" #ifdef __cplusplus extern "C" { #endif /* called when a subscript is out of range */ #ifdef KR_headers extern VOID sig_die(); integer s_rnge(varn, offset, procn, line) char *varn, *procn; ftnint offset, line; #else extern VOID sig_die(const char*,int); integer s_rnge(char *varn, ftnint offset, char *procn, ftnint line) #endif { register int i; fprintf(stderr, "Subscript out of range on file line %ld, procedure ", (long)line); while((i = *procn) && i != '_' && i != ' ') putc(*procn++, stderr); fprintf(stderr, ".\nAttempt to access the %ld-th element of variable ", (long)offset+1); while((i = *varn) && i != ' ') putc(*varn++, stderr); sig_die(".", 1); return 0; /* not reached */ } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/s_stop.c000066400000000000000000000013721413463044200224160ustar00rootroot00000000000000#include "stdio.h" #include "f2c.h" #ifdef KR_headers extern void f_exit(); int s_stop(s, n) char *s; ftnlen n; #else #undef abs #undef min #undef max #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus extern "C" { #endif void f_exit(void); int s_stop(char *s, ftnlen n) #endif { int i; if(n > 0) { fprintf(stderr, "STOP "); for(i = 0; iciunit]; if(a->ciunit >= MXUNIT || a->ciunit<0) err(a->cierr,101,"startio"); if(p->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe") if(!p->ufmt) err(a->cierr,102,"sfe") return(0); } integer e_wsfe(Void) { int n = en_fio(); f__fmtbuf = NULL; #ifdef ALWAYS_FLUSH if (!n && fflush(f__cf)) err(f__elist->cierr, errno, "write end"); #endif return n; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/sig_die.c000066400000000000000000000012611413463044200225070ustar00rootroot00000000000000#include "stdio.h" #include "signal.h" #ifndef SIGIOT #ifdef SIGABRT #define SIGIOT SIGABRT #endif #endif #ifdef KR_headers void sig_die(s, kill) char *s; int kill; #else #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus extern "C" { #endif extern void f_exit(void); void sig_die(const char *s, int kill) #endif { /* print error message, then clear buffers */ fprintf(stderr, "%s\n", s); if(kill) { fflush(stderr); f_exit(); fflush(stderr); /* now get a core */ #ifdef SIGIOT signal(SIGIOT, SIG_DFL); #endif abort(); } else { #ifdef NO_ONEXIT f_exit(); #endif exit(1); } } #ifdef __cplusplus } #endif #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/signal1.h0000066400000000000000000000015121413463044200225260ustar00rootroot00000000000000/* You may need to adjust the definition of signal1 to supply a */ /* cast to the correct argument type. This detail is system- and */ /* compiler-dependent. The #define below assumes signal.h declares */ /* type SIG_PF for the signal function's second argument. */ /* For some C++ compilers, "#define Sigarg_t ..." may be appropriate. */ #include #ifndef Sigret_t #define Sigret_t void #endif #ifndef Sigarg_t #ifdef KR_headers #define Sigarg_t #else #define Sigarg_t int #endif #endif /*Sigarg_t*/ #ifdef USE_SIG_PF /* compile with -DUSE_SIG_PF under IRIX */ #define sig_pf SIG_PF #else typedef Sigret_t (*sig_pf)(Sigarg_t); #endif #define signal1(a,b) signal(a,(sig_pf)b) #ifdef __cplusplus #define Sigarg ... #define Use_Sigarg #else #define Sigarg Int n #define Use_Sigarg n = n /* shut up compiler warning */ #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/signal_.c000066400000000000000000000004531413463044200225220ustar00rootroot00000000000000#include "f2c.h" #include "signal1.h" #ifdef __cplusplus extern "C" { #endif ftnint #ifdef KR_headers signal_(sigp, proc) integer *sigp; sig_pf proc; #else signal_(integer *sigp, sig_pf proc) #endif { int sig; sig = (int)*sigp; return (ftnint)signal(sig, proc); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/signbit.c000066400000000000000000000005121413463044200225410ustar00rootroot00000000000000#include "arith.h" #ifndef Long #define Long long #endif int #ifdef KR_headers signbit_f2c(x) double *x; #else signbit_f2c(double *x) #endif { #ifdef IEEE_MC68k if (*(Long*)x & 0x80000000) return 1; #else #ifdef IEEE_8087 if (((Long*)x)[1] & 0x80000000) return 1; #endif /*IEEE_8087*/ #endif /*IEEE_MC68k*/ return 0; } starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/sue.c000066400000000000000000000035111413463044200217000ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif extern uiolen f__reclen; OFF_T f__recloc; int #ifdef KR_headers c_sue(a) cilist *a; #else c_sue(cilist *a) #endif { f__external=f__sequential=1; f__formatted=0; f__curunit = &f__units[a->ciunit]; if(a->ciunit >= MXUNIT || a->ciunit < 0) err(a->cierr,101,"startio"); f__elist=a; if(f__curunit->ufd==NULL && fk_open(SEQ,UNF,a->ciunit)) err(a->cierr,114,"sue"); f__cf=f__curunit->ufd; if(f__curunit->ufmt) err(a->cierr,103,"sue") if(!f__curunit->useek) err(a->cierr,103,"sue") return(0); } #ifdef KR_headers integer s_rsue(a) cilist *a; #else integer s_rsue(cilist *a) #endif { int n; if(!f__init) f_init(); f__reading=1; if(n=c_sue(a)) return(n); f__recpos=0; if(f__curunit->uwrt && f__nowreading(f__curunit)) err(a->cierr, errno, "read start"); if(fread((char *)&f__reclen,sizeof(uiolen),1,f__cf) != 1) { if(feof(f__cf)) { f__curunit->uend = 1; err(a->ciend, EOF, "start"); } clearerr(f__cf); err(a->cierr, errno, "start"); } return(0); } #ifdef KR_headers integer s_wsue(a) cilist *a; #else integer s_wsue(cilist *a) #endif { int n; if(!f__init) f_init(); if(n=c_sue(a)) return(n); f__reading=0; f__reclen=0; if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr, errno, "write start"); f__recloc=FTELL(f__cf); FSEEK(f__cf,(OFF_T)sizeof(uiolen),SEEK_CUR); return(0); } integer e_wsue(Void) { OFF_T loc; fwrite((char *)&f__reclen,sizeof(uiolen),1,f__cf); #ifdef ALWAYS_FLUSH if (fflush(f__cf)) err(f__elist->cierr, errno, "write end"); #endif loc=FTELL(f__cf); FSEEK(f__cf,f__recloc,SEEK_SET); fwrite((char *)&f__reclen,sizeof(uiolen),1,f__cf); FSEEK(f__cf,loc,SEEK_SET); return(0); } integer e_rsue(Void) { FSEEK(f__cf,(OFF_T)(f__reclen-f__recpos+sizeof(uiolen)),SEEK_CUR); return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/sysdep1.h0000066400000000000000000000022621413463044200225630ustar00rootroot00000000000000#ifndef SYSDEP_H_INCLUDED #define SYSDEP_H_INCLUDED #undef USE_LARGEFILE #ifndef NO_LONG_LONG #ifdef __sun__ #define USE_LARGEFILE #define OFF_T off64_t #endif #ifdef __linux__ #define USE_LARGEFILE #define OFF_T __off64_t #endif #ifdef _AIX43 #define _LARGE_FILES #define _LARGE_FILE_API #define USE_LARGEFILE #endif /*_AIX43*/ #ifdef __hpux #define _FILE64 #define _LARGEFILE64_SOURCE #define USE_LARGEFILE #endif /*__hpux*/ #ifdef __sgi #define USE_LARGEFILE #endif /*__sgi*/ #ifdef __FreeBSD__ #define OFF_T off_t #define FSEEK fseeko #define FTELL ftello #endif #ifdef USE_LARGEFILE #ifndef OFF_T #define OFF_T off64_t #endif #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #define FOPEN fopen64 #define FREOPEN freopen64 #define FSEEK fseeko64 #define FSTAT fstat64 #define FTELL ftello64 #define FTRUNCATE ftruncate64 #define STAT stat64 #define STAT_ST stat64 #endif /*USE_LARGEFILE*/ #endif /*NO_LONG_LONG*/ #ifndef NON_UNIX_STDIO #ifndef USE_LARGEFILE #define _INCLUDE_POSIX_SOURCE /* for HP-UX */ #define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ #include "sys/types.h" #include "sys/stat.h" #endif #endif #endif /*SYSDEP_H_INCLUDED*/ starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/system_.c000066400000000000000000000012141413463044200225650ustar00rootroot00000000000000/* f77 interface to system routine */ #include "f2c.h" #ifdef KR_headers extern char *F77_aloc(); integer system_(s, n) register char *s; ftnlen n; #else #undef abs #undef min #undef max #include "stdlib.h" #ifdef __cplusplus extern "C" { #endif extern char *F77_aloc(ftnlen, const char*); integer system_(register char *s, ftnlen n) #endif { char buff0[256], *buff; register char *bp, *blast; integer rv; buff = bp = n < sizeof(buff0) ? buff0 : F77_aloc(n+1, "system_"); blast = bp + n; while(bp < blast && *s) *bp++ = *s++; *bp = 0; rv = system(buff); if (buff != buff0) free(buff); return rv; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/typesize.c000066400000000000000000000006021413463044200227560ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif ftnlen f__typesize[] = { 0, 0, sizeof(shortint), sizeof(integer), sizeof(real), sizeof(doublereal), sizeof(complex), sizeof(doublecomplex), sizeof(logical), sizeof(char), 0, sizeof(integer1), sizeof(logical1), sizeof(shortlogical), #ifdef Allow_TYQUAD sizeof(longint), #endif 0}; #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/uio.c000066400000000000000000000031231413463044200216770ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif uiolen f__reclen; int #ifdef KR_headers do_us(number,ptr,len) ftnint *number; char *ptr; ftnlen len; #else do_us(ftnint *number, char *ptr, ftnlen len) #endif { if(f__reading) { f__recpos += (int)(*number * len); if(f__recpos>f__reclen) err(f__elist->cierr, 110, "do_us"); if (fread(ptr,(int)len,(int)(*number),f__cf) != *number) err(f__elist->ciend, EOF, "do_us"); return(0); } else { f__reclen += *number * len; (void) fwrite(ptr,(int)len,(int)(*number),f__cf); return(0); } } #ifdef KR_headers integer do_ud(number,ptr,len) ftnint *number; char *ptr; ftnlen len; #else integer do_ud(ftnint *number, char *ptr, ftnlen len) #endif { f__recpos += (int)(*number * len); if(f__recpos > f__curunit->url && f__curunit->url!=1) err(f__elist->cierr,110,"do_ud"); if(f__reading) { #ifdef Pad_UDread #ifdef KR_headers int i; #else size_t i; #endif if (!(i = fread(ptr,(int)len,(int)(*number),f__cf)) && !(f__recpos - *number*len)) err(f__elist->cierr,EOF,"do_ud") if (i < *number) memset(ptr + i*len, 0, (*number - i)*len); return 0; #else if(fread(ptr,(int)len,(int)(*number),f__cf) != *number) err(f__elist->cierr,EOF,"do_ud") else return(0); #endif } (void) fwrite(ptr,(int)len,(int)(*number),f__cf); return(0); } #ifdef KR_headers integer do_uio(number,ptr,len) ftnint *number; char *ptr; ftnlen len; #else integer do_uio(ftnint *number, char *ptr, ftnlen len) #endif { if(f__sequential) return(do_us(number,ptr,len)); else return(do_ud(number,ptr,len)); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/uninit.c000066400000000000000000000166401413463044200224210ustar00rootroot00000000000000#include #include #include "arith.h" #define TYSHORT 2 #define TYLONG 3 #define TYREAL 4 #define TYDREAL 5 #define TYCOMPLEX 6 #define TYDCOMPLEX 7 #define TYINT1 11 #define TYQUAD 14 #ifndef Long #define Long long #endif #ifdef __mips #define RNAN 0xffc00000 #define DNAN0 0xfff80000 #define DNAN1 0 #endif #ifdef _PA_RISC1_1 #define RNAN 0xffc00000 #define DNAN0 0xfff80000 #define DNAN1 0 #endif #ifndef RNAN #define RNAN 0xff800001 #ifdef IEEE_MC68k #define DNAN0 0xfff00000 #define DNAN1 1 #else #define DNAN0 1 #define DNAN1 0xfff00000 #endif #endif /*RNAN*/ #ifdef KR_headers #define Void /*void*/ #define FA7UL (unsigned Long) 0xfa7a7a7aL #else #define Void void #define FA7UL 0xfa7a7a7aUL #endif #ifdef __cplusplus extern "C" { #endif static void ieee0(Void); static unsigned Long rnan = RNAN, dnan0 = DNAN0, dnan1 = DNAN1; double _0 = 0.; void #ifdef KR_headers _uninit_f2c(x, type, len) void *x; int type; long len; #else _uninit_f2c(void *x, int type, long len) #endif { static int first = 1; unsigned Long *lx, *lxe; if (first) { first = 0; ieee0(); } if (len == 1) switch(type) { case TYINT1: *(char*)x = 'Z'; return; case TYSHORT: *(short*)x = 0xfa7a; break; case TYLONG: *(unsigned Long*)x = FA7UL; return; case TYQUAD: case TYCOMPLEX: case TYDCOMPLEX: break; case TYREAL: *(unsigned Long*)x = rnan; return; case TYDREAL: lx = (unsigned Long*)x; lx[0] = dnan0; lx[1] = dnan1; return; default: printf("Surprise type %d in _uninit_f2c\n", type); } switch(type) { case TYINT1: memset(x, 'Z', len); break; case TYSHORT: *(short*)x = 0xfa7a; break; case TYQUAD: len *= 2; /* no break */ case TYLONG: lx = (unsigned Long*)x; lxe = lx + len; while(lx < lxe) *lx++ = FA7UL; break; case TYCOMPLEX: len *= 2; /* no break */ case TYREAL: lx = (unsigned Long*)x; lxe = lx + len; while(lx < lxe) *lx++ = rnan; break; case TYDCOMPLEX: len *= 2; /* no break */ case TYDREAL: lx = (unsigned Long*)x; for(lxe = lx + 2*len; lx < lxe; lx += 2) { lx[0] = dnan0; lx[1] = dnan1; } } } #ifdef __cplusplus } #endif #ifndef MSpc #ifdef MSDOS #define MSpc #else #ifdef _WIN32 #define MSpc #endif #endif #endif #ifdef MSpc #define IEEE0_done #include "float.h" #include "signal.h" static void ieee0(Void) { #ifndef __alpha #ifndef EM_DENORMAL #define EM_DENORMAL _EM_DENORMAL #endif #ifndef EM_UNDERFLOW #define EM_UNDERFLOW _EM_UNDERFLOW #endif #ifndef EM_INEXACT #define EM_INEXACT _EM_INEXACT #endif #ifndef MCW_EM #define MCW_EM _MCW_EM #endif _control87(EM_DENORMAL | EM_UNDERFLOW | EM_INEXACT, MCW_EM); #endif /* With MS VC++, compiling and linking with -Zi will permit */ /* clicking to invoke the MS C++ debugger, which will show */ /* the point of error -- provided SIGFPE is SIG_DFL. */ signal(SIGFPE, SIG_DFL); } #endif /* MSpc */ #ifdef __mips /* must link with -lfpe */ #define IEEE0_done /* code from Eric Grosse */ #include #include #include "/usr/include/sigfpe.h" /* full pathname for lcc -N */ #include "/usr/include/sys/fpu.h" static void #ifdef KR_headers ieeeuserhand(exception, val) unsigned exception[5]; int val[2]; #else ieeeuserhand(unsigned exception[5], int val[2]) #endif { fflush(stdout); fprintf(stderr,"ieee0() aborting because of "); if(exception[0]==_OVERFL) fprintf(stderr,"overflow\n"); else if(exception[0]==_UNDERFL) fprintf(stderr,"underflow\n"); else if(exception[0]==_DIVZERO) fprintf(stderr,"divide by 0\n"); else if(exception[0]==_INVALID) fprintf(stderr,"invalid operation\n"); else fprintf(stderr,"\tunknown reason\n"); fflush(stderr); abort(); } static void #ifdef KR_headers ieeeuserhand2(j) unsigned int **j; #else ieeeuserhand2(unsigned int **j) #endif { fprintf(stderr,"ieee0() aborting because of confusion\n"); abort(); } static void ieee0(Void) { int i; for(i=1; i<=4; i++){ sigfpe_[i].count = 1000; sigfpe_[i].trace = 1; sigfpe_[i].repls = _USER_DETERMINED; } sigfpe_[1].repls = _ZERO; /* underflow */ handle_sigfpes( _ON, _EN_UNDERFL|_EN_OVERFL|_EN_DIVZERO|_EN_INVALID, ieeeuserhand,_ABORT_ON_ERROR,ieeeuserhand2); } #endif /* mips */ #ifdef __linux__ #define IEEE0_done #include "fpu_control.h" #ifdef __alpha__ #ifndef USE_setfpucw #define __setfpucw(x) __fpu_control = (x) #endif #endif #ifndef _FPU_SETCW #undef Can_use__setfpucw #define Can_use__setfpucw #endif static void ieee0(Void) { #if (defined(__mc68000__) || defined(__mc68020__) || defined(mc68020) || defined (__mc68k__)) /* Reported 20010705 by Alan Bain */ /* Note that IEEE 754 IOP (illegal operation) */ /* = Signaling NAN (SNAN) + operation error (OPERR). */ #ifdef Can_use__setfpucw __setfpucw(_FPU_IEEE + _FPU_DOUBLE + _FPU_MASK_OPERR + _FPU_MASK_DZ + _FPU_MASK_SNAN+_FPU_MASK_OVFL); #else __fpu_control = _FPU_IEEE + _FPU_DOUBLE + _FPU_MASK_OPERR + _FPU_MASK_DZ + _FPU_MASK_SNAN+_FPU_MASK_OVFL; _FPU_SETCW(__fpu_control); #endif #elif (defined(__powerpc__)||defined(_ARCH_PPC)||defined(_ARCH_PWR)) /* !__mc68k__ */ /* Reported 20011109 by Alan Bain */ #ifdef Can_use__setfpucw /* The following is NOT a mistake -- the author of the fpu_control.h for the PPC has erroneously defined IEEE mode to turn on exceptions other than Inexact! Start from default then and turn on only the ones which we want*/ __setfpucw(_FPU_DEFAULT + _FPU_MASK_IM+_FPU_MASK_OM+_FPU_MASK_UM); #else /* PPC && !Can_use__setfpucw */ __fpu_control = _FPU_DEFAULT +_FPU_MASK_OM+_FPU_MASK_IM+_FPU_MASK_UM; _FPU_SETCW(__fpu_control); #endif /*Can_use__setfpucw*/ #else /* !(mc68000||powerpc) */ #ifdef _FPU_IEEE #ifndef _FPU_EXTENDED /* e.g., ARM processor under Linux */ #define _FPU_EXTENDED 0 #endif #ifndef _FPU_DOUBLE #define _FPU_DOUBLE 0 #endif #ifdef Can_use__setfpucw /* pre-1997 (?) Linux */ __setfpucw(_FPU_IEEE - _FPU_MASK_IM - _FPU_MASK_ZM - _FPU_MASK_OM); #else #ifdef UNINIT_F2C_PRECISION_53 /* 20051004 */ /* unmask invalid, etc., and change rounding precision to double */ __fpu_control = _FPU_IEEE - _FPU_EXTENDED + _FPU_DOUBLE - _FPU_MASK_IM - _FPU_MASK_ZM - _FPU_MASK_OM; _FPU_SETCW(__fpu_control); #else /* unmask invalid, etc., and keep current rounding precision */ fpu_control_t cw; _FPU_GETCW(cw); cw &= ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM); _FPU_SETCW(cw); #endif #endif #else /* !_FPU_IEEE */ fprintf(stderr, "\n%s\n%s\n%s\n%s\n", "WARNING: _uninit_f2c in libf2c does not know how", "to enable trapping on this system, so f2c's -trapuv", "option will not detect uninitialized variables unless", "you can enable trapping manually."); fflush(stderr); #endif /* _FPU_IEEE */ #endif /* __mc68k__ */ } #endif /* __linux__ */ #ifdef __alpha #ifndef IEEE0_done #define IEEE0_done #include static void ieee0(Void) { ieee_set_fp_control(IEEE_TRAP_ENABLE_INV); } #endif /*IEEE0_done*/ #endif /*__alpha*/ #ifdef __hpux #define IEEE0_done #define _INCLUDE_HPUX_SOURCE #include #ifndef FP_X_INV #include #define fpsetmask fesettrapenable #define FP_X_INV FE_INVALID #endif static void ieee0(Void) { fpsetmask(FP_X_INV); } #endif /*__hpux*/ #ifdef _AIX #define IEEE0_done #include static void ieee0(Void) { fp_enable(TRP_INVALID); fp_trap(FP_TRAP_SYNC); } #endif /*_AIX*/ #ifdef __sun #define IEEE0_done #include static void ieee0(Void) { fpsetmask(FP_X_INV); } #endif /*__sparc*/ #ifndef IEEE0_done static void ieee0(Void) {} #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/util.c000066400000000000000000000017141413463044200220640ustar00rootroot00000000000000#include "sysdep1.h" /* here to get stat64 on some badly designed Linux systems */ #include "f2c.h" #include "fio.h" #ifdef __cplusplus extern "C" { #endif VOID #ifdef KR_headers #define Const /*nothing*/ g_char(a,alen,b) char *a,*b; ftnlen alen; #else #define Const const g_char(const char *a, ftnlen alen, char *b) #endif { Const char *x = a + alen; char *y = b + alen; for(;; y--) { if (x <= a) { *b = 0; return; } if (*--x != ' ') break; } *y-- = 0; do *y-- = *x; while(x-- > a); } VOID #ifdef KR_headers b_char(a,b,blen) char *a,*b; ftnlen blen; #else b_char(const char *a, char *b, ftnlen blen) #endif { int i; for(i=0;i= d + 2 || f__scale <= -d) goto nogood; } if(f__scale <= 0) --d; if (len == sizeof(real)) dd = p->pf; else dd = p->pd; if (dd < 0.) { signspace = sign = 1; dd = -dd; } else { sign = 0; signspace = (int)f__cplus; #ifndef VAX if (!dd) { #ifdef SIGNED_ZEROS if (signbit_f2c(&dd)) signspace = sign = 1; #endif dd = 0.; /* avoid -0 */ } #endif } delta = w - (2 /* for the . and the d adjustment above */ + 2 /* for the E+ */ + signspace + d + e); #ifdef WANT_LEAD_0 if (f__scale <= 0 && delta > 0) { delta--; insert0 = 1; } else #endif if (delta < 0) { nogood: while(--w >= 0) PUT('*'); return(0); } if (f__scale < 0) d += f__scale; if (d > FMAX) { d1 = d - FMAX; d = FMAX; } else d1 = 0; sprintf(buf,"%#.*E", d, dd); #ifndef VAX /* check for NaN, Infinity */ if (!isdigit(buf[0])) { switch(buf[0]) { case 'n': case 'N': signspace = 0; /* no sign for NaNs */ } delta = w - strlen(buf) - signspace; if (delta < 0) goto nogood; while(--delta >= 0) PUT(' '); if (signspace) PUT(sign ? '-' : '+'); for(s = buf; *s; s++) PUT(*s); return 0; } #endif se = buf + d + 3; #ifdef GOOD_SPRINTF_EXPONENT /* When possible, exponent has 2 digits. */ if (f__scale != 1 && dd) sprintf(se, "%+.2d", atoi(se) + 1 - f__scale); #else if (dd) sprintf(se, "%+.2d", atoi(se) + 1 - f__scale); else strcpy(se, "+00"); #endif s = ++se; if (e < 2) { if (*s != '0') goto nogood; } #ifndef VAX /* accommodate 3 significant digits in exponent */ if (s[2]) { #ifdef Pedantic if (!e0 && !s[3]) for(s -= 2, e1 = 2; s[0] = s[1]; s++); /* Pedantic gives the behavior that Fortran 77 specifies, */ /* i.e., requires that E be specified for exponent fields */ /* of more than 3 digits. With Pedantic undefined, we get */ /* the behavior that Cray displays -- you get a bigger */ /* exponent field if it fits. */ #else if (!e0) { for(s -= 2, e1 = 2; s[0] = s[1]; s++) #ifdef CRAY delta--; if ((delta += 4) < 0) goto nogood #endif ; } #endif else if (e0 >= 0) goto shift; else e1 = e; } else shift: #endif for(s += 2, e1 = 2; *s; ++e1, ++s) if (e1 >= e) goto nogood; while(--delta >= 0) PUT(' '); if (signspace) PUT(sign ? '-' : '+'); s = buf; i = f__scale; if (f__scale <= 0) { #ifdef WANT_LEAD_0 if (insert0) PUT('0'); #endif PUT('.'); for(; i < 0; ++i) PUT('0'); PUT(*s); s += 2; } else if (f__scale > 1) { PUT(*s); s += 2; while(--i > 0) PUT(*s++); PUT('.'); } if (d1) { se -= 2; while(s < se) PUT(*s++); se += 2; do PUT('0'); while(--d1 > 0); } while(s < se) PUT(*s++); if (e < 2) PUT(s[1]); else { while(++e1 <= e) PUT('0'); while(*s) PUT(*s++); } return 0; } int #ifdef KR_headers wrt_F(p,w,d,len) ufloat *p; ftnlen len; #else wrt_F(ufloat *p, int w, int d, ftnlen len) #endif { int d1, sign, n; double x; char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s; x= (len==sizeof(real)?p->pf:p->pd); if (d < MAXFRACDIGS) d1 = 0; else { d1 = d - MAXFRACDIGS; d = MAXFRACDIGS; } if (x < 0.) { x = -x; sign = 1; } else { sign = 0; #ifndef VAX if (!x) { #ifdef SIGNED_ZEROS if (signbit_f2c(&x)) sign = 2; #endif x = 0.; } #endif } if (n = f__scale) if (n > 0) do x *= 10.; while(--n > 0); else do x *= 0.1; while(++n < 0); #ifdef USE_STRLEN sprintf(b = buf, "%#.*f", d, x); n = strlen(b) + d1; #else n = sprintf(b = buf, "%#.*f", d, x) + d1; #endif #ifndef WANT_LEAD_0 if (buf[0] == '0' && d) { ++b; --n; } #endif if (sign == 1) { /* check for all zeros */ for(s = b;;) { while(*s == '0') s++; switch(*s) { case '.': s++; continue; case 0: sign = 0; } break; } } if (sign || f__cplus) ++n; if (n > w) { #ifdef WANT_LEAD_0 if (buf[0] == '0' && --n == w) ++b; else #endif { while(--w >= 0) PUT('*'); return 0; } } for(w -= n; --w >= 0; ) PUT(' '); if (sign) PUT('-'); else if (f__cplus) PUT('+'); while(n = *b++) PUT(n); while(--d1 >= 0) PUT('0'); return 0; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/wrtfmt.c000066400000000000000000000165221413463044200224350ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif extern icilist *f__svic; extern char *f__icptr; static int mv_cur(Void) /* shouldn't use fseek because it insists on calling fflush */ /* instead we know too much about stdio */ { int cursor = f__cursor; f__cursor = 0; if(f__external == 0) { if(cursor < 0) { if(f__hiwater < f__recpos) f__hiwater = f__recpos; f__recpos += cursor; f__icptr += cursor; if(f__recpos < 0) err(f__elist->cierr, 110, "left off"); } else if(cursor > 0) { if(f__recpos + cursor >= f__svic->icirlen) err(f__elist->cierr, 110, "recend"); if(f__hiwater <= f__recpos) for(; cursor > 0; cursor--) (*f__putn)(' '); else if(f__hiwater <= f__recpos + cursor) { cursor -= f__hiwater - f__recpos; f__icptr += f__hiwater - f__recpos; f__recpos = f__hiwater; for(; cursor > 0; cursor--) (*f__putn)(' '); } else { f__icptr += cursor; f__recpos += cursor; } } return(0); } if (cursor > 0) { if(f__hiwater <= f__recpos) for(;cursor>0;cursor--) (*f__putn)(' '); else if(f__hiwater <= f__recpos + cursor) { cursor -= f__hiwater - f__recpos; f__recpos = f__hiwater; for(; cursor > 0; cursor--) (*f__putn)(' '); } else { f__recpos += cursor; } } else if (cursor < 0) { if(cursor + f__recpos < 0) err(f__elist->cierr,110,"left off"); if(f__hiwater < f__recpos) f__hiwater = f__recpos; f__recpos += cursor; } return(0); } static int #ifdef KR_headers wrt_Z(n,w,minlen,len) Uint *n; int w, minlen; ftnlen len; #else wrt_Z(Uint *n, int w, int minlen, ftnlen len) #endif { register char *s, *se; register int i, w1; static int one = 1; static char hex[] = "0123456789ABCDEF"; s = (char *)n; --len; if (*(char *)&one) { /* little endian */ se = s; s += len; i = -1; } else { se = s + len; i = 1; } for(;; s += i) if (s == se || *s) break; w1 = (i*(se-s) << 1) + 1; if (*s & 0xf0) w1++; if (w1 > w) for(i = 0; i < w; i++) (*f__putn)('*'); else { if ((minlen -= w1) > 0) w1 += minlen; while(--w >= w1) (*f__putn)(' '); while(--minlen >= 0) (*f__putn)('0'); if (!(*s & 0xf0)) { (*f__putn)(hex[*s & 0xf]); if (s == se) return 0; s += i; } for(;; s += i) { (*f__putn)(hex[*s >> 4 & 0xf]); (*f__putn)(hex[*s & 0xf]); if (s == se) break; } } return 0; } static int #ifdef KR_headers wrt_I(n,w,len, base) Uint *n; ftnlen len; register int base; #else wrt_I(Uint *n, int w, ftnlen len, register int base) #endif { int ndigit,sign,spare,i; longint x; char *ans; if(len==sizeof(integer)) x=n->il; else if(len == sizeof(char)) x = n->ic; #ifdef Allow_TYQUAD else if (len == sizeof(longint)) x = n->ili; #endif else x=n->is; ans=f__icvt(x,&ndigit,&sign, base); spare=w-ndigit; if(sign || f__cplus) spare--; if(spare<0) for(i=0;iil; else if(len == sizeof(char)) x = n->ic; #ifdef Allow_TYQUAD else if (len == sizeof(longint)) x = n->ili; #endif else x=n->is; ans=f__icvt(x,&ndigit,&sign, base); if(sign || f__cplus) xsign=1; else xsign=0; if(ndigit+xsign>w || m+xsign>w) { for(i=0;i=m) spare=w-ndigit-xsign; else spare=w-m-xsign; for(i=0;iil; else if(sz == sizeof(char)) x = n->ic; else x=n->is; for(i=0;i 0) (*f__putn)(*p++); return(0); } static int #ifdef KR_headers wrt_AW(p,w,len) char * p; ftnlen len; #else wrt_AW(char * p, int w, ftnlen len) #endif { while(w>len) { w--; (*f__putn)(' '); } while(w-- > 0) (*f__putn)(*p++); return(0); } static int #ifdef KR_headers wrt_G(p,w,d,e,len) ufloat *p; ftnlen len; #else wrt_G(ufloat *p, int w, int d, int e, ftnlen len) #endif { double up = 1,x; int i=0,oldscale,n,j; x = len==sizeof(real)?p->pf:p->pd; if(x < 0 ) x = -x; if(x<.1) { if (x != 0.) return(wrt_E(p,w,d,e,len)); i = 1; goto have_i; } for(;i<=d;i++,up*=10) { if(x>=up) continue; have_i: oldscale = f__scale; f__scale = 0; if(e==0) n=4; else n=e+2; i=wrt_F(p,w-n,d-i,len); for(j=0;jop) { default: fprintf(stderr,"w_ed, unexpected code: %d\n", p->op); sig_die(f__fmtbuf, 1); case I: return(wrt_I((Uint *)ptr,p->p1,len, 10)); case IM: return(wrt_IM((Uint *)ptr,p->p1,p->p2.i[0],len,10)); /* O and OM don't work right for character, double, complex, */ /* or doublecomplex, and they differ from Fortran 90 in */ /* showing a minus sign for negative values. */ case O: return(wrt_I((Uint *)ptr, p->p1, len, 8)); case OM: return(wrt_IM((Uint *)ptr,p->p1,p->p2.i[0],len,8)); case L: return(wrt_L((Uint *)ptr,p->p1, len)); case A: return(wrt_A(ptr,len)); case AW: return(wrt_AW(ptr,p->p1,len)); case D: case E: case EE: return(wrt_E((ufloat *)ptr,p->p1,p->p2.i[0],p->p2.i[1],len)); case G: case GE: return(wrt_G((ufloat *)ptr,p->p1,p->p2.i[0],p->p2.i[1],len)); case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2.i[0],len)); /* Z and ZM assume 8-bit bytes. */ case Z: return(wrt_Z((Uint *)ptr,p->p1,0,len)); case ZM: return(wrt_Z((Uint *)ptr,p->p1,p->p2.i[0],len)); } } int #ifdef KR_headers w_ned(p) struct syl *p; #else w_ned(struct syl *p) #endif { switch(p->op) { default: fprintf(stderr,"w_ned, unexpected code: %d\n", p->op); sig_die(f__fmtbuf, 1); case SLASH: return((*f__donewrec)()); case T: f__cursor = p->p1-f__recpos - 1; return(1); case TL: f__cursor -= p->p1; if(f__cursor < -f__recpos) /* TL1000, 1X */ f__cursor = -f__recpos; return(1); case TR: case X: f__cursor += p->p1; return(1); case APOS: return(wrt_AP(p->p2.s)); case H: return(wrt_H(p->p1,p->p2.s)); } } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/wsfe.c000066400000000000000000000024001413463044200220440ustar00rootroot00000000000000/*write sequential formatted external*/ #include "f2c.h" #include "fio.h" #include "fmt.h" #ifdef __cplusplus extern "C" { #endif int x_wSL(Void) { int n = f__putbuf('\n'); f__hiwater = f__recpos = f__cursor = 0; return(n == 0); } static int xw_end(Void) { int n; if(f__nonl) { f__putbuf(n = 0); fflush(f__cf); } else n = f__putbuf('\n'); f__hiwater = f__recpos = f__cursor = 0; return n; } static int xw_rev(Void) { int n = 0; if(f__workdone) { n = f__putbuf('\n'); f__workdone = 0; } f__hiwater = f__recpos = f__cursor = 0; return n; } #ifdef KR_headers integer s_wsfe(a) cilist *a; /*start*/ #else integer s_wsfe(cilist *a) /*start*/ #endif { int n; if(!f__init) f_init(); f__reading=0; f__sequential=1; f__formatted=1; f__external=1; if(n=c_sfe(a)) return(n); f__elist=a; f__hiwater = f__cursor=f__recpos=0; f__nonl = 0; f__scale=0; f__fmtbuf=a->cifmt; f__cf=f__curunit->ufd; if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio"); f__putn= x_putc; f__doed= w_ed; f__doned= w_ned; f__doend=xw_end; f__dorevert=xw_rev; f__donewrec=x_wSL; fmt_bg(); f__cplus=0; f__cblank=f__curunit->ublnk; if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr,errno,"write start"); return(0); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/wsle.c000066400000000000000000000012711413463044200220570ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "fmt.h" #include "lio.h" #include "string.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers integer s_wsle(a) cilist *a; #else integer s_wsle(cilist *a) #endif { int n; if(n=c_le(a)) return(n); f__reading=0; f__external=1; f__formatted=1; f__putn = x_putc; f__lioproc = l_write; L_len = LINE; f__donewrec = x_wSL; if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr, errno, "list output start"); return(0); } integer e_wsle(Void) { int n = f__putbuf('\n'); f__recpos=0; #ifdef ALWAYS_FLUSH if (!n && fflush(f__cf)) err(f__elist->cierr, errno, "write end"); #endif return(n); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/wsne.c000066400000000000000000000007371413463044200220670ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "lio.h" #ifdef __cplusplus extern "C" { #endif integer #ifdef KR_headers s_wsne(a) cilist *a; #else s_wsne(cilist *a) #endif { int n; if(n=c_le(a)) return(n); f__reading=0; f__external=1; f__formatted=1; f__putn = x_putc; L_len = LINE; f__donewrec = x_wSL; if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) err(a->cierr, errno, "namelist output start"); x_wsne(a); return e_wsle(); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/xwsne.c000066400000000000000000000022261413463044200222520ustar00rootroot00000000000000#include "f2c.h" #include "fio.h" #include "lio.h" #include "fmt.h" extern int f__Aquote; static VOID nl_donewrec(Void) { (*f__donewrec)(); PUT(' '); } #ifdef KR_headers x_wsne(a) cilist *a; #else #include "string.h" #ifdef __cplusplus extern "C" { #endif VOID x_wsne(cilist *a) #endif { Namelist *nl; char *s; Vardesc *v, **vd, **vde; ftnint number, type; ftnlen *dims; ftnlen size; extern ftnlen f__typesize[]; nl = (Namelist *)a->cifmt; PUT('&'); for(s = nl->name; *s; s++) PUT(*s); PUT(' '); f__Aquote = 1; vd = nl->vars; vde = vd + nl->nvars; while(vd < vde) { v = *vd++; s = v->name; #ifdef No_Extra_Namelist_Newlines if (f__recpos+strlen(s)+2 >= L_len) #endif nl_donewrec(); while(*s) PUT(*s++); PUT(' '); PUT('='); number = (dims = v->dims) ? dims[1] : 1; type = v->type; if (type < 0) { size = -type; type = TYCHAR; } else size = f__typesize[type]; l_write(&number, v->addr, size, type); if (vd < vde) { if (f__recpos+2 >= L_len) nl_donewrec(); PUT(','); PUT(' '); } else if (f__recpos+1 >= L_len) nl_donewrec(); } f__Aquote = 0; PUT('/'); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_abs.c000066400000000000000000000004141413463044200222010ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers double f__cabs(); double z_abs(z) doublecomplex *z; #else double f__cabs(double, double); double z_abs(doublecomplex *z) #endif { return( f__cabs( z->r, z->i ) ); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_cos.c000066400000000000000000000005531413463044200222240ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sin(), cos(), sinh(), cosh(); VOID z_cos(r, z) doublecomplex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif void z_cos(doublecomplex *r, doublecomplex *z) #endif { double zi = z->i, zr = z->r; r->r = cos(zr) * cosh(zi); r->i = - sin(zr) * sinh(zi); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_div.c000066400000000000000000000016211413463044200222170ustar00rootroot00000000000000#include "f2c.h" #ifdef __cplusplus extern "C" { #endif #ifdef KR_headers extern VOID sig_die(); VOID z_div(c, a, b) doublecomplex *a, *b, *c; #else extern void sig_die(const char*, int); void z_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) #endif { double ratio, den; double abr, abi, cr; if( (abr = b->r) < 0.) abr = - abr; if( (abi = b->i) < 0.) abi = - abi; if( abr <= abi ) { if(abi == 0) { #ifdef IEEE_COMPLEX_DIVIDE if (a->i != 0 || a->r != 0) abi = 1.; c->i = c->r = abi / abr; return; #else sig_die("complex division by zero", 1); #endif } ratio = b->r / b->i ; den = b->i * (1 + ratio*ratio); cr = (a->r*ratio + a->i) / den; c->i = (a->i*ratio - a->r) / den; } else { ratio = b->i / b->r ; den = b->r * (1 + ratio*ratio); cr = (a->r + a->i*ratio) / den; c->i = (a->i - a->r*ratio) / den; } c->r = cr; } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_exp.c000066400000000000000000000005451413463044200222350ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double exp(), cos(), sin(); VOID z_exp(r, z) doublecomplex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif void z_exp(doublecomplex *r, doublecomplex *z) #endif { double expx, zi = z->i; expx = exp(z->r); r->r = expx * cos(zi); r->i = expx * sin(zi); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_log.c000066400000000000000000000052511413463044200222210ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double log(), f__cabs(), atan2(); #define ANSI(x) () #else #define ANSI(x) x #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif extern double f__cabs(double, double); #endif #ifndef NO_DOUBLE_EXTENDED #ifndef GCC_COMPARE_BUG_FIXED #ifndef Pre20000310 #ifdef Comment Some versions of gcc, such as 2.95.3 and 3.0.4, are buggy under -O2 or -O3: on IA32 (Intel 80x87) systems, they may do comparisons on values computed in extended-precision registers. This can lead to the test "s > s0" that was used below being carried out incorrectly. The fix below cannot be spoiled by overzealous optimization, since the compiler cannot know whether gcc_bug_bypass_diff_F2C will be nonzero. (We expect it always to be zero. The weird name is unlikely to collide with anything.) An example (provided by Ulrich Jakobus) where the bug fix matters is double complex a, b a = (.1099557428756427618354862829619, .9857360542953131909982289471372) b = log(a) An alternative to the fix below would be to use 53-bit rounding precision, but the means of specifying this 80x87 feature are highly unportable. #endif /*Comment*/ #define BYPASS_GCC_COMPARE_BUG double (*gcc_bug_bypass_diff_F2C) ANSI((double*,double*)); static double #ifdef KR_headers diff1(a,b) double *a, *b; #else diff1(double *a, double *b) #endif { return *a - *b; } #endif /*Pre20000310*/ #endif /*GCC_COMPARE_BUG_FIXED*/ #endif /*NO_DOUBLE_EXTENDED*/ #ifdef KR_headers VOID z_log(r, z) doublecomplex *r, *z; #else void z_log(doublecomplex *r, doublecomplex *z) #endif { double s, s0, t, t2, u, v; double zi = z->i, zr = z->r; #ifdef BYPASS_GCC_COMPARE_BUG double (*diff) ANSI((double*,double*)); #endif r->i = atan2(zi, zr); #ifdef Pre20000310 r->r = log( f__cabs( zr, zi ) ); #else if (zi < 0) zi = -zi; if (zr < 0) zr = -zr; if (zr < zi) { t = zi; zi = zr; zr = t; } t = zi/zr; s = zr * sqrt(1 + t*t); /* now s = f__cabs(zi,zr), and zr = |zr| >= |zi| = zi */ if ((t = s - 1) < 0) t = -t; if (t > .01) r->r = log(s); else { #ifdef Comment log(1+x) = x - x^2/2 + x^3/3 - x^4/4 + - ... = x(1 - x/2 + x^2/3 -+...) [sqrt(y^2 + z^2) - 1] * [sqrt(y^2 + z^2) + 1] = y^2 + z^2 - 1, so sqrt(y^2 + z^2) - 1 = (y^2 + z^2 - 1) / [sqrt(y^2 + z^2) + 1] #endif /*Comment*/ #ifdef BYPASS_GCC_COMPARE_BUG if (!(diff = gcc_bug_bypass_diff_F2C)) diff = diff1; #endif t = ((zr*zr - 1.) + zi*zi) / (s + 1); t2 = t*t; s = 1. - 0.5*t; u = v = 1; do { s0 = s; u *= t2; v += 2; s += u/v - t*u/(v+1); } #ifdef BYPASS_GCC_COMPARE_BUG while(s - s0 > 1e-18 || (*diff)(&s,&s0) > 0.); #else while(s > s0); #endif r->r = s*t; } #endif } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_sin.c000066400000000000000000000005471413463044200222340ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sin(), cos(), sinh(), cosh(); VOID z_sin(r, z) doublecomplex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif void z_sin(doublecomplex *r, doublecomplex *z) #endif { double zi = z->i, zr = z->r; r->r = sin(zr) * cosh(zi); r->i = cos(zr) * sinh(zi); } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/F2CLIBS/libf2c/z_sqrt.c000066400000000000000000000011051413463044200224230ustar00rootroot00000000000000#include "f2c.h" #ifdef KR_headers double sqrt(), f__cabs(); VOID z_sqrt(r, z) doublecomplex *r, *z; #else #undef abs #include "math.h" #ifdef __cplusplus extern "C" { #endif extern double f__cabs(double, double); void z_sqrt(doublecomplex *r, doublecomplex *z) #endif { double mag, zi = z->i, zr = z->r; if( (mag = f__cabs(zr, zi)) == 0.) r->r = r->i = 0.; else if(zr > 0) { r->r = sqrt(0.5 * (mag + zr) ); r->i = zi / r->r / 2; } else { r->i = sqrt(0.5 * (mag - zr) ); if(zi < 0) r->i = - r->i; r->r = zi / r->i / 2; } } #ifdef __cplusplus } #endif starpu-1.3.9+dfsg/min-dgels/base/INCLUDE/000077500000000000000000000000001413463044200176365ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/INCLUDE/blaswrap.h000066400000000000000000000001741413463044200216240ustar00rootroot00000000000000/* CLAPACK 3.0 BLAS wrapper macros * Feb 5, 2000 */ #ifndef __BLASWRAP_H #define __BLASWRAP_H #endif /* __BLASWRAP_H */ starpu-1.3.9+dfsg/min-dgels/base/INCLUDE/clapack.h000066400000000000000000012720571413463044200214230ustar00rootroot00000000000000/* header file for clapack 3.2.1 */ #ifndef __CLAPACK_H #define __CLAPACK_H #ifdef __cplusplus extern "C" { #endif /* Subroutine */ int _starpu_caxpy_(integer *n, complex *ca, complex *cx, integer * incx, complex *cy, integer *incy); /* Subroutine */ int _starpu_ccopy_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy); /* Complex */ VOID _starpu_cdotc_(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy); /* Complex */ VOID _starpu_cdotu_(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy); /* Subroutine */ int _starpu_cgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, complex *alpha, complex *a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy); /* Subroutine */ int _starpu_cgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_cgemv_(char *trans, integer *m, integer *n, complex * alpha, complex *a, integer *lda, complex *x, integer *incx, complex * beta, complex *y, integer *incy); /* Subroutine */ int _starpu_cgerc_(integer *m, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *a, integer *lda); /* Subroutine */ int _starpu_cgeru_(integer *m, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *a, integer *lda); /* Subroutine */ int _starpu_chbmv_(char *uplo, integer *n, integer *k, complex * alpha, complex *a, integer *lda, complex *x, integer *incx, complex * beta, complex *y, integer *incy); /* Subroutine */ int _starpu_chemm_(char *side, char *uplo, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_chemv_(char *uplo, integer *n, complex *alpha, complex * a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy); /* Subroutine */ int _starpu_cher_(char *uplo, integer *n, real *alpha, complex *x, integer *incx, complex *a, integer *lda); /* Subroutine */ int _starpu_cher2_(char *uplo, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *a, integer *lda); /* Subroutine */ int _starpu_cher2k_(char *uplo, char *trans, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, real *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_cherk_(char *uplo, char *trans, integer *n, integer *k, real *alpha, complex *a, integer *lda, real *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_chpmv_(char *uplo, integer *n, complex *alpha, complex * ap, complex *x, integer *incx, complex *beta, complex *y, integer * incy); /* Subroutine */ int _starpu_chpr_(char *uplo, integer *n, real *alpha, complex *x, integer *incx, complex *ap); /* Subroutine */ int _starpu_chpr2_(char *uplo, integer *n, complex *alpha, complex * x, integer *incx, complex *y, integer *incy, complex *ap); /* Subroutine */ int _starpu_crotg_(complex *ca, complex *cb, real *c__, complex *s); /* Subroutine */ int _starpu_cscal_(integer *n, complex *ca, complex *cx, integer * incx); /* Subroutine */ int _starpu__starpu_csrot_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy, real *c__, real *s); /* Subroutine */ int _starpu_csscal_(integer *n, real *sa, complex *cx, integer *incx); /* Subroutine */ int _starpu_cswap_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy); /* Subroutine */ int _starpu_csymm_(char *side, char *uplo, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_csyr2k_(char *uplo, char *trans, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_csyrk_(char *uplo, char *trans, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *beta, complex *c__, integer *ldc); /* Subroutine */ int _starpu_ctbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, complex *a, integer *lda, complex *x, integer *incx); /* Subroutine */ int _starpu_ctbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, complex *a, integer *lda, complex *x, integer *incx); /* Subroutine */ int _starpu_ctpmv_(char *uplo, char *trans, char *diag, integer *n, complex *ap, complex *x, integer *incx); /* Subroutine */ int _starpu_ctpsv_(char *uplo, char *trans, char *diag, integer *n, complex *ap, complex *x, integer *incx); /* Subroutine */ int _starpu_ctrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_ctrmv_(char *uplo, char *trans, char *diag, integer *n, complex *a, integer *lda, complex *x, integer *incx); /* Subroutine */ int _starpu_ctrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_ctrsv_(char *uplo, char *trans, char *diag, integer *n, complex *a, integer *lda, complex *x, integer *incx); doublereal _starpu_dasum_(integer *n, doublereal *dx, integer *incx); /* Subroutine */ int _starpu_daxpy_(integer *n, doublereal *da, doublereal *dx, integer *incx, doublereal *dy, integer *incy); doublereal _starpu_dcabs1_(doublecomplex *z__); /* Subroutine */ int _starpu_dcopy_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy); doublereal _starpu_ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy); /* Subroutine */ int _starpu_dgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dgemv_(char *trans, integer *m, integer *n, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dger_(integer *m, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda); doublereal _starpu_dnrm2_(integer *n, doublereal *x, integer *incx); /* Subroutine */ int _starpu_drot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *c__, doublereal *s); /* Subroutine */ int _starpu_drotg_(doublereal *da, doublereal *db, doublereal *c__, doublereal *s); /* Subroutine */ int _starpu_drotm_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *dparam); /* Subroutine */ int _starpu_drotmg_(doublereal *dd1, doublereal *dd2, doublereal * dx1, doublereal *dy1, doublereal *dparam); /* Subroutine */ int _starpu_dsbmv_(char *uplo, integer *n, integer *k, doublereal * alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx); doublereal _starpu_dsdot_(integer *n, real *sx, integer *incx, real *sy, integer * incy); /* Subroutine */ int _starpu_dspmv_(char *uplo, integer *n, doublereal *alpha, doublereal *ap, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dspr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *ap); /* Subroutine */ int _starpu_dspr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *ap); /* Subroutine */ int _starpu_dswap_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy); /* Subroutine */ int _starpu_dsymm_(char *side, char *uplo, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dsymv_(char *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); /* Subroutine */ int _starpu_dsyr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *a, integer *lda); /* Subroutine */ int _starpu_dsyr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *a, integer *lda); /* Subroutine */ int _starpu_dsyr2k_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dsyrk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c__, integer *ldc); /* Subroutine */ int _starpu_dtbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublereal *a, integer *lda, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublereal *a, integer *lda, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtpmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *ap, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtpsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *ap, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dtrmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx); /* Subroutine */ int _starpu_dtrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, integer * lda, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dtrsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, doublereal *x, integer *incx); doublereal _starpu_dzasum_(integer *n, doublecomplex *zx, integer *incx); doublereal _starpu_dznrm2_(integer *n, doublecomplex *x, integer *incx); integer _starpu_icamax_(integer *n, complex *cx, integer *incx); integer _starpu_idamax_(integer *n, doublereal *dx, integer *incx); integer _starpu_isamax_(integer *n, real *sx, integer *incx); integer _starpu_izamax_(integer *n, doublecomplex *zx, integer *incx); logical _starpu_lsame_(char *ca, char *cb); doublereal _starpu_sasum_(integer *n, real *sx, integer *incx); /* Subroutine */ int _starpu_saxpy_(integer *n, real *sa, real *sx, integer *incx, real *sy, integer *incy); doublereal _starpu_scabs1_(complex *z__); doublereal _starpu_scasum_(integer *n, complex *cx, integer *incx); doublereal _starpu_scnrm2_(integer *n, complex *x, integer *incx); /* Subroutine */ int _starpu_scopy_(integer *n, real *sx, integer *incx, real *sy, integer *incy); doublereal _starpu_sdot_(integer *n, real *sx, integer *incx, real *sy, integer *incy); doublereal _starpu_sdsdot_(integer *n, real *sb, real *sx, integer *incx, real *sy, integer *incy); /* Subroutine */ int _starpu_sgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, real *alpha, real *a, integer *lda, real *x, integer * incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * ldb, real *beta, real *c__, integer *ldc); /* Subroutine */ int _starpu_sgemv_(char *trans, integer *m, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sger_(integer *m, integer *n, real *alpha, real *x, integer *incx, real *y, integer *incy, real *a, integer *lda); doublereal _starpu_snrm2_(integer *n, real *x, integer *incx); /* Subroutine */ int _starpu_srot_(integer *n, real *sx, integer *incx, real *sy, integer *incy, real *c__, real *s); /* Subroutine */ int _starpu_srotg_(real *sa, real *sb, real *c__, real *s); /* Subroutine */ int _starpu_srotm_(integer *n, real *sx, integer *incx, real *sy, integer *incy, real *sparam); /* Subroutine */ int _starpu_srotmg_(real *sd1, real *sd2, real *sx1, real *sy1, real *sparam); /* Subroutine */ int _starpu_ssbmv_(char *uplo, integer *n, integer *k, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sscal_(integer *n, real *sa, real *sx, integer *incx); /* Subroutine */ int _starpu_sspmv_(char *uplo, integer *n, real *alpha, real *ap, real *x, integer *incx, real *beta, real *y, integer *incy); /* Subroutine */ int _starpu_sspr_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *ap); /* Subroutine */ int _starpu_sspr2_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *y, integer *incy, real *ap); /* Subroutine */ int _starpu_sswap_(integer *n, real *sx, integer *incx, real *sy, integer *incy); /* Subroutine */ int _starpu_ssymm_(char *side, char *uplo, integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, real *c__, integer *ldc); /* Subroutine */ int _starpu_ssymv_(char *uplo, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer * incy); /* Subroutine */ int _starpu_ssyr_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *a, integer *lda); /* Subroutine */ int _starpu_ssyr2_(char *uplo, integer *n, real *alpha, real *x, integer *incx, real *y, integer *incy, real *a, integer *lda); /* Subroutine */ int _starpu_ssyr2k_(char *uplo, char *trans, integer *n, integer *k, real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, real *c__, integer *ldc); /* Subroutine */ int _starpu_ssyrk_(char *uplo, char *trans, integer *n, integer *k, real *alpha, real *a, integer *lda, real *beta, real *c__, integer * ldc); /* Subroutine */ int _starpu_stbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_stbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_stpmv_(char *uplo, char *trans, char *diag, integer *n, real *ap, real *x, integer *incx); /* Subroutine */ int _starpu_stpsv_(char *uplo, char *trans, char *diag, integer *n, real *ap, real *x, integer *incx); /* Subroutine */ int _starpu_strmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, integer *ldb); /* Subroutine */ int _starpu_strmv_(char *uplo, char *trans, char *diag, integer *n, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_strsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, integer *ldb); /* Subroutine */ int _starpu_strsv_(char *uplo, char *trans, char *diag, integer *n, real *a, integer *lda, real *x, integer *incx); /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info); /* Subroutine */ int _starpu_xerbla_array__(char *srname_array__, integer * srname_len__, integer *info, ftnlen srname_array_len); /* Subroutine */ int _starpu_zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Subroutine */ int _starpu_zcopy_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Double Complex */ VOID _starpu_zdotc_(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Double Complex */ VOID _starpu_zdotu_(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Subroutine */ int _starpu_zdrot_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy, doublereal *c__, doublereal *s); /* Subroutine */ int _starpu_zdscal_(integer *n, doublereal *da, doublecomplex *zx, integer *incx); /* Subroutine */ int _starpu_zgbmv_(char *trans, integer *m, integer *n, integer *kl, integer *ku, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex * y, integer *incy); /* Subroutine */ int _starpu_zgemm_(char *transa, char *transb, integer *m, integer * n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex * c__, integer *ldc); /* Subroutine */ int _starpu_zgemv_(char *trans, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * x, integer *incx, doublecomplex *beta, doublecomplex *y, integer * incy); /* Subroutine */ int _starpu_zgerc_(integer *m, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zgeru_(integer *m, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zhbmv_(char *uplo, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer * incx, doublecomplex *beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zhemm_(char *side, char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer * ldc); /* Subroutine */ int _starpu_zhemv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zher_(char *uplo, integer *n, doublereal *alpha, doublecomplex *x, integer *incx, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zher2_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zher2k_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublereal *beta, doublecomplex *c__, integer *ldc); /* Subroutine */ int _starpu_zherk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublecomplex *a, integer *lda, doublereal *beta, doublecomplex *c__, integer *ldc); /* Subroutine */ int _starpu_zhpmv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *ap, doublecomplex *x, integer *incx, doublecomplex * beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zhpr_(char *uplo, integer *n, doublereal *alpha, doublecomplex *x, integer *incx, doublecomplex *ap); /* Subroutine */ int _starpu_zhpr2_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublecomplex *ap); /* Subroutine */ int _starpu_zrotg_(doublecomplex *ca, doublecomplex *cb, doublereal * c__, doublecomplex *s); /* Subroutine */ int _starpu_zscal_(integer *n, doublecomplex *za, doublecomplex *zx, integer *incx); /* Subroutine */ int _starpu_zswap_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy); /* Subroutine */ int _starpu_zsymm_(char *side, char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer * ldc); /* Subroutine */ int _starpu_zsyr2k_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer * ldc); /* Subroutine */ int _starpu_zsyrk_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * beta, doublecomplex *c__, integer *ldc); /* Subroutine */ int _starpu_ztbmv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztbsv_(char *uplo, char *trans, char *diag, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztpmv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *ap, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztpsv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *ap, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_ztrmv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_ztrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_ztrsv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_cbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, real *d__, real *e, complex *vt, integer *ldvt, complex *u, integer *ldu, complex *c__, integer *ldc, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, complex *ab, integer *ldab, real *d__, real *e, complex *q, integer *ldq, complex *pt, integer *ldpt, complex *c__, integer *ldc, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbcon_(char *norm, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbequ_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgbequb_(integer *m, integer *n, integer *kl, integer * ku, complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer * ldafb, integer *ipiv, complex *b, integer *ldb, complex *x, integer * ldx, real *ferr, real *berr, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex * afb, integer *ldafb, integer *ipiv, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, complex *ab, integer *ldab, integer *ipiv, complex *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_cgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex * afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgbtf2_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgbtrf_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, complex *ab, integer *ldab, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *scale, integer *m, complex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_cgebal_(char *job, integer *n, complex *a, integer *lda, integer *ilo, integer *ihi, real *scale, integer *info); /* Subroutine */ int _starpu_cgebd2_(integer *m, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tauq, complex *taup, complex *work, integer *info); /* Subroutine */ int _starpu_cgebrd_(integer *m, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tauq, complex *taup, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgecon_(char *norm, integer *n, complex *a, integer *lda, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgeequ_(integer *m, integer *n, complex *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgeequb_(integer *m, integer *n, complex *a, integer * lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_cgees_(char *jobvs, char *sort, L_fp select, integer *n, complex *a, integer *lda, integer *sdim, complex *w, complex *vs, integer *ldvs, complex *work, integer *lwork, real *rwork, logical * bwork, integer *info); /* Subroutine */ int _starpu_cgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, complex *a, integer *lda, integer *sdim, complex * w, complex *vs, integer *ldvs, real *rconde, real *rcondv, complex * work, integer *lwork, real *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cgeev_(char *jobvl, char *jobvr, integer *n, complex *a, integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex *work, integer *lwork, real *rwork, integer * info); /* Subroutine */ int _starpu_cgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, complex *a, integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *ilo, integer *ihi, real *scale, real *abnrm, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgegs_(char *jobvsl, char *jobvsr, integer *n, complex * a, integer *lda, complex *b, integer *ldb, complex *alpha, complex * beta, complex *vsl, integer *ldvsl, complex *vsr, integer *ldvsr, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgegv_(char *jobvl, char *jobvr, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex * work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgehd2_(integer *n, integer *ilo, integer *ihi, complex * a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgehrd_(integer *n, integer *ilo, integer *ihi, complex * a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgelq2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgelqf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgels_(char *trans, integer *m, integer *n, integer * nrhs, complex *a, integer *lda, complex *b, integer *ldb, complex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgelsd_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, real *s, real *rcond, integer *rank, complex *work, integer *lwork, real *rwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_cgelss_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, real *s, real *rcond, integer *rank, complex *work, integer *lwork, real *rwork, integer * info); /* Subroutine */ int _starpu_cgelsx_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgelsy_(integer *m, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, complex *work, integer *lwork, real *rwork, integer * info); /* Subroutine */ int _starpu_cgeql2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgeqlf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgeqp3_(integer *m, integer *n, complex *a, integer *lda, integer *jpvt, complex *tau, complex *work, integer *lwork, real * rwork, integer *info); /* Subroutine */ int _starpu_cgeqpf_(integer *m, integer *n, complex *a, integer *lda, integer *jpvt, complex *tau, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgeqr2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgeqrf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgerfs_(char *trans, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgerq2_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cgerqf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgesc2_(integer *n, complex *a, integer *lda, complex * rhs, integer *ipiv, integer *jpiv, real *scale); /* Subroutine */ int _starpu_cgesdd_(char *jobz, integer *m, integer *n, complex *a, integer *lda, real *s, complex *u, integer *ldu, complex *vt, integer *ldvt, complex *work, integer *lwork, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_cgesv_(integer *n, integer *nrhs, complex *a, integer * lda, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgesvd_(char *jobu, char *jobvt, integer *m, integer *n, complex *a, integer *lda, real *s, complex *u, integer *ldu, complex * vt, integer *ldvt, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cgesvx_(char *fact, char *trans, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer * info); /* Subroutine */ int _starpu_cgetc2_(integer *n, complex *a, integer *lda, integer * ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_cgetf2_(integer *m, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgetrf_(integer *m, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgetri_(integer *n, complex *a, integer *lda, integer * ipiv, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgetrs_(char *trans, integer *n, integer *nrhs, complex * a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_cggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *lscale, real *rscale, integer *m, complex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_cggbal_(char *job, integer *n, complex *a, integer *lda, complex *b, integer *ldb, integer *ilo, integer *ihi, real *lscale, real *rscale, real *work, integer *info); /* Subroutine */ int _starpu_cgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, complex *a, integer *lda, complex *b, integer * ldb, integer *sdim, complex *alpha, complex *beta, complex *vsl, integer *ldvsl, complex *vsr, integer *ldvsr, complex *work, integer * lwork, real *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, complex *a, integer *lda, complex *b, integer *ldb, integer *sdim, complex *alpha, complex *beta, complex * vsl, integer *ldvsl, complex *vsr, integer *ldvsr, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cggev_(char *jobvl, char *jobvr, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex * work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *vl, integer *ldvl, complex * vr, integer *ldvr, integer *ilo, integer *ihi, real *lscale, real * rscale, real *abnrm, real *bbnrm, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *iwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_cggglm_(integer *n, integer *m, integer *p, complex *a, integer *lda, complex *b, integer *ldb, complex *d__, complex *x, complex *y, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, complex *a, integer *lda, complex *b, integer *ldb, complex *q, integer *ldq, complex *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_cgglse_(integer *m, integer *n, integer *p, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, complex *d__, complex *x, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cggqrf_(integer *n, integer *m, integer *p, complex *a, integer *lda, complex *taua, complex *b, integer *ldb, complex *taub, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cggrqf_(integer *m, integer *p, integer *n, complex *a, integer *lda, complex *taua, complex *b, integer *ldb, complex *taub, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, complex *a, integer * lda, complex *b, integer *ldb, real *alpha, real *beta, complex *u, integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, complex *work, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_cggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, complex *a, integer *lda, complex *b, integer *ldb, real *tola, real *tolb, integer *k, integer *l, complex *u, integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, integer *iwork, real *rwork, complex *tau, complex *work, integer * info); /* Subroutine */ int _starpu_cgtcon_(char *norm, integer *n, complex *dl, complex * d__, complex *du, complex *du2, integer *ipiv, real *anorm, real * rcond, complex *work, integer *info); /* Subroutine */ int _starpu_cgtrfs_(char *trans, integer *n, integer *nrhs, complex * dl, complex *d__, complex *du, complex *dlf, complex *df, complex * duf, complex *du2, integer *ipiv, complex *b, integer *ldb, complex * x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgtsv_(integer *n, integer *nrhs, complex *dl, complex * d__, complex *du, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, complex *dl, complex *d__, complex *du, complex *dlf, complex * df, complex *duf, complex *du2, integer *ipiv, complex *b, integer * ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cgttrf_(integer *n, complex *dl, complex *d__, complex * du, complex *du2, integer *ipiv, integer *info); /* Subroutine */ int _starpu_cgttrs_(char *trans, integer *n, integer *nrhs, complex * dl, complex *d__, complex *du, complex *du2, integer *ipiv, complex * b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cgtts2_(integer *itrans, integer *n, integer *nrhs, complex *dl, complex *d__, complex *du, complex *du2, integer *ipiv, complex *b, integer *ldb); /* Subroutine */ int _starpu_chbev_(char *jobz, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chbevd_(char *jobz, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, complex *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer * m, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_chbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, complex *x, integer *ldx, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, complex *q, integer *ldq, real *vl, real *vu, integer * il, integer *iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_chbtrd_(char *vect, char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *d__, real *e, complex *q, integer * ldq, complex *work, integer *info); /* Subroutine */ int _starpu_checon_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, real *anorm, real *rcond, complex *work, integer * info); /* Subroutine */ int _starpu_cheequb_(char *uplo, integer *n, complex *a, integer * lda, real *s, real *scond, real *amax, complex *work, integer *info); /* Subroutine */ int _starpu_cheev_(char *jobz, char *uplo, integer *n, complex *a, integer *lda, real *w, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_cheevd_(char *jobz, char *uplo, integer *n, complex *a, integer *lda, real *w, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_cheevr_(char *jobz, char *range, char *uplo, integer *n, complex *a, integer *lda, real *vl, real *vu, integer *il, integer * iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, integer *isuppz, complex *work, integer *lwork, real *rwork, integer * lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_cheevx_(char *jobz, char *range, char *uplo, integer *n, complex *a, integer *lda, real *vl, real *vu, integer *il, integer * iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_chegs2_(integer *itype, char *uplo, integer *n, complex * a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chegst_(integer *itype, char *uplo, integer *n, complex * a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chegv_(integer *itype, char *jobz, char *uplo, integer * n, complex *a, integer *lda, complex *b, integer *ldb, real *w, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_chegvd_(integer *itype, char *jobz, char *uplo, integer * n, complex *a, integer *lda, complex *b, integer *ldb, real *w, complex *work, integer *lwork, real *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chegvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, complex *a, integer *lda, complex *b, integer *ldb, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer * m, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_cherfs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cherfsx_(char *uplo, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chesv_(char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_chesvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_chesvxx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chetd2_(char *uplo, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tau, integer *info); /* Subroutine */ int _starpu_chetf2_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_chetrd_(char *uplo, integer *n, complex *a, integer *lda, real *d__, real *e, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_chetrf_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_chetri_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_chetrs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_chfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, real *alpha, complex *a, integer *lda, real *beta, complex *c__); /* Subroutine */ int _starpu_chgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *t, integer *ldt, complex *alpha, complex *beta, complex *q, integer *ldq, complex *z__, integer *ldz, complex *work, integer *lwork, real * rwork, integer *info); /* Character */ VOID _starpu_chla_transtype__(char *ret_val, ftnlen ret_val_len, integer *trans); /* Subroutine */ int _starpu_chpcon_(char *uplo, integer *n, complex *ap, integer * ipiv, real *anorm, real *rcond, complex *work, integer *info); /* Subroutine */ int _starpu_chpev_(char *jobz, char *uplo, integer *n, complex *ap, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chpevd_(char *jobz, char *uplo, integer *n, complex *ap, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chpevx_(char *jobz, char *range, char *uplo, integer *n, complex *ap, real *vl, real *vu, integer *il, integer *iu, real * abstol, integer *m, real *w, complex *z__, integer *ldz, complex * work, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_chpgst_(integer *itype, char *uplo, integer *n, complex * ap, complex *bp, integer *info); /* Subroutine */ int _starpu_chpgv_(integer *itype, char *jobz, char *uplo, integer * n, complex *ap, complex *bp, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chpgvd_(integer *itype, char *jobz, char *uplo, integer * n, complex *ap, complex *bp, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_chpgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, complex *ap, complex *bp, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, complex * z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_chprfs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *afp, integer *ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chpsv_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chpsvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *ap, complex *afp, integer *ipiv, complex *b, integer * ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_chptrd_(char *uplo, integer *n, complex *ap, real *d__, real *e, complex *tau, integer *info); /* Subroutine */ int _starpu_chptrf_(char *uplo, integer *n, complex *ap, integer * ipiv, integer *info); /* Subroutine */ int _starpu_chptri_(char *uplo, integer *n, complex *ap, integer * ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_chptrs_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_chsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, complex *h__, integer *ldh, complex *w, complex * vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer * m, complex *work, real *rwork, integer *ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_chseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, complex *z__, integer *ldz, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, real *alpha, complex *ab, integer *ldab, complex *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_cla_gbrcond_c__(char *trans, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer * ipiv, real *c__, logical *capply, integer *info, complex *work, real * rwork, ftnlen trans_len); doublereal _starpu_cla_gbrcond_x__(char *trans, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer * ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_cla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, integer * ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex * y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex * y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info); doublereal _starpu_cla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, complex *ab, integer *ldab, complex *afb, integer *ldafb); /* Subroutine */ int _starpu_cla_geamv__(integer *trans, integer *m, integer *n, real *alpha, complex *a, integer *lda, complex *x, integer *incx, real * beta, real *y, integer *incy); doublereal _starpu_cla_gercond_c__(char *trans, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen trans_len); doublereal _starpu_cla_gercond_x__(char *trans, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_cla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer * ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info); /* Subroutine */ int _starpu_cla_heamv__(integer *uplo, integer *n, real *alpha, complex *a, integer *lda, complex *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_cla_hercond_c__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen uplo_len); doublereal _starpu_cla_hercond_x__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_herfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer * n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer *ithresh, real * rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_cla_herpvgrw__(char *uplo, integer *n, integer *info, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *work, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_lin_berr__(integer *n, integer *nz, integer *nrhs, complex *res, real *ayb, real *berr); doublereal _starpu_cla_porcond_c__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen uplo_len); doublereal _starpu_cla_porcond_x__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, complex *x, integer *info, complex *work, real *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer *n_norms__, real * errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_cla_porpvgrw__(char *uplo, integer *ncols, complex *a, integer * lda, complex *af, integer *ldaf, real *work, ftnlen uplo_len); doublereal _starpu_cla_rpvgrw__(integer *n, integer *ncols, complex *a, integer *lda, complex *af, integer *ldaf); /* Subroutine */ int _starpu_cla_syamv__(integer *uplo, integer *n, real *alpha, complex *a, integer *lda, complex *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_cla_syrcond_c__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *c__, logical *capply, integer *info, complex *work, real *rwork, ftnlen uplo_len); doublereal _starpu_cla_syrcond_x__(char *uplo, integer *n, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex *x, integer *info, complex *work, real *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, complex *b, integer *ldb, complex *y, integer *ldy, real *berr_out__, integer * n_norms__, real *errs_n__, real *errs_c__, complex *res, real *ayb, complex *dy, complex *y_tail__, real *rcond, integer *ithresh, real * rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_cla_syrpvgrw__(char *uplo, integer *n, integer *info, complex *a, integer *lda, complex *af, integer *ldaf, integer *ipiv, real *work, ftnlen uplo_len); /* Subroutine */ int _starpu_cla_wwaddw__(integer *n, complex *x, complex *y, complex *w); /* Subroutine */ int _starpu_clabrd_(integer *m, integer *n, integer *nb, complex *a, integer *lda, real *d__, real *e, complex *tauq, complex *taup, complex *x, integer *ldx, complex *y, integer *ldy); /* Subroutine */ int _starpu_clacgv_(integer *n, complex *x, integer *incx); /* Subroutine */ int _starpu_clacn2_(integer *n, complex *v, complex *x, real *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_clacon_(integer *n, complex *v, complex *x, real *est, integer *kase); /* Subroutine */ int _starpu_clacp2_(char *uplo, integer *m, integer *n, real *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_clacpy_(char *uplo, integer *m, integer *n, complex *a, integer *lda, complex *b, integer *ldb); /* Subroutine */ int _starpu_clacrm_(integer *m, integer *n, complex *a, integer *lda, real *b, integer *ldb, complex *c__, integer *ldc, real *rwork); /* Subroutine */ int _starpu_clacrt_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy, complex *c__, complex *s); /* Complex */ VOID _starpu_cladiv_(complex * ret_val, complex *x, complex *y); /* Subroutine */ int _starpu_claed0_(integer *qsiz, integer *n, real *d__, real *e, complex *q, integer *ldq, complex *qstore, integer *ldqs, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_claed7_(integer *n, integer *cutpnt, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, real *d__, complex * q, integer *ldq, real *rho, integer *indxq, real *qstore, integer * qptr, integer *prmptr, integer *perm, integer *givptr, integer * givcol, real *givnum, complex *work, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_claed8_(integer *k, integer *n, integer *qsiz, complex * q, integer *ldq, real *d__, real *rho, integer *cutpnt, real *z__, real *dlamda, complex *q2, integer *ldq2, real *w, integer *indxp, integer *indx, integer *indxq, integer *perm, integer *givptr, integer *givcol, real *givnum, integer *info); /* Subroutine */ int _starpu_claein_(logical *rightv, logical *noinit, integer *n, complex *h__, integer *ldh, complex *w, complex *v, complex *b, integer *ldb, real *rwork, real *eps3, real *smlnum, integer *info); /* Subroutine */ int _starpu_claesy_(complex *a, complex *b, complex *c__, complex * rt1, complex *rt2, complex *evscal, complex *cs1, complex *sn1); /* Subroutine */ int _starpu_claev2_(complex *a, complex *b, complex *c__, real *rt1, real *rt2, real *cs1, complex *sn1); /* Subroutine */ int _starpu_clag2z_(integer *m, integer *n, complex *sa, integer * ldsa, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_clags2_(logical *upper, real *a1, complex *a2, real *a3, real *b1, complex *b2, real *b3, real *csu, complex *snu, real *csv, complex *snv, real *csq, complex *snq); /* Subroutine */ int _starpu_clagtm_(char *trans, integer *n, integer *nrhs, real * alpha, complex *dl, complex *d__, complex *du, complex *x, integer * ldx, real *beta, complex *b, integer *ldb); /* Subroutine */ int _starpu_clahef_(char *uplo, integer *n, integer *nb, integer *kb, complex *a, integer *lda, integer *ipiv, complex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_clahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * info); /* Subroutine */ int _starpu_clahr2_(integer *n, integer *k, integer *nb, complex *a, integer *lda, complex *tau, complex *t, integer *ldt, complex *y, integer *ldy); /* Subroutine */ int _starpu_clahrd_(integer *n, integer *k, integer *nb, complex *a, integer *lda, complex *tau, complex *t, integer *ldt, complex *y, integer *ldy); /* Subroutine */ int _starpu_claic1_(integer *job, integer *j, complex *x, real *sest, complex *w, complex *gamma, real *sestpr, complex *s, complex *c__); /* Subroutine */ int _starpu_clals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, complex *b, integer *ldb, complex *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * difl, real *difr, real *z__, integer *k, real *c__, real *s, real * rwork, integer *info); /* Subroutine */ int _starpu_clalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, complex *b, integer *ldb, complex *bx, integer *ldbx, real *u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real *z__, real *poles, integer *givptr, integer *givcol, integer * ldgcol, integer *perm, real *givnum, real *c__, real *s, real *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_clalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, real *d__, real *e, complex *b, integer *ldb, real *rcond, integer *rank, complex *work, real *rwork, integer *iwork, integer * info); doublereal _starpu_clangb_(char *norm, integer *n, integer *kl, integer *ku, complex * ab, integer *ldab, real *work); doublereal _starpu_clange_(char *norm, integer *m, integer *n, complex *a, integer * lda, real *work); doublereal _starpu_clangt_(char *norm, integer *n, complex *dl, complex *d__, complex *du); doublereal _starpu_clanhb_(char *norm, char *uplo, integer *n, integer *k, complex * ab, integer *ldab, real *work); doublereal _starpu_clanhe_(char *norm, char *uplo, integer *n, complex *a, integer * lda, real *work); doublereal _starpu_clanhf_(char *norm, char *transr, char *uplo, integer *n, complex * a, real *work); doublereal _starpu_clanhp_(char *norm, char *uplo, integer *n, complex *ap, real * work); doublereal _starpu_clanhs_(char *norm, integer *n, complex *a, integer *lda, real * work); doublereal _starpu_clanht_(char *norm, integer *n, real *d__, complex *e); doublereal _starpu_clansb_(char *norm, char *uplo, integer *n, integer *k, complex * ab, integer *ldab, real *work); doublereal _starpu_clansp_(char *norm, char *uplo, integer *n, complex *ap, real * work); doublereal _starpu_clansy_(char *norm, char *uplo, integer *n, complex *a, integer * lda, real *work); doublereal _starpu_clantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, complex *ab, integer *ldab, real *work); doublereal _starpu_clantp_(char *norm, char *uplo, char *diag, integer *n, complex * ap, real *work); doublereal _starpu_clantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, complex *a, integer *lda, real *work); /* Subroutine */ int _starpu_clapll_(integer *n, complex *x, integer *incx, complex * y, integer *incy, real *ssmin); /* Subroutine */ int _starpu_clapmt_(logical *forwrd, integer *m, integer *n, complex *x, integer *ldx, integer *k); /* Subroutine */ int _starpu_claqgb_(integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char *equed); /* Subroutine */ int _starpu_claqge_(integer *m, integer *n, complex *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * equed); /* Subroutine */ int _starpu_claqhb_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqhe_(char *uplo, integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqhp_(char *uplo, integer *n, complex *ap, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqp2_(integer *m, integer *n, integer *offset, complex *a, integer *lda, integer *jpvt, complex *tau, real *vn1, real *vn2, complex *work); /* Subroutine */ int _starpu_claqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, complex *a, integer *lda, integer *jpvt, complex * tau, real *vn1, real *vn2, complex *auxv, complex *f, integer *ldf); /* Subroutine */ int _starpu_claqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, integer *iloz, integer *ihiz, complex *z__, integer *ldz, complex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_claqr1_(integer *n, complex *h__, integer *ldh, complex * s1, complex *s2, complex *v); /* Subroutine */ int _starpu_claqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * ns, integer *nd, complex *sh, complex *v, integer *ldv, integer *nh, complex *t, integer *ldt, integer *nv, complex *wv, integer *ldwv, complex *work, integer *lwork); /* Subroutine */ int _starpu_claqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * ns, integer *nd, complex *sh, complex *v, integer *ldv, integer *nh, complex *t, integer *ldt, integer *nv, complex *wv, integer *ldwv, complex *work, integer *lwork); /* Subroutine */ int _starpu_claqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, integer *iloz, integer *ihiz, complex *z__, integer *ldz, complex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_claqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, complex *s, complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex * z__, integer *ldz, complex *v, integer *ldv, complex *u, integer *ldu, integer *nv, complex *wv, integer *ldwv, integer *nh, complex *wh, integer *ldwh); /* Subroutine */ int _starpu_claqsb_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqsp_(char *uplo, integer *n, complex *ap, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_claqsy_(char *uplo, integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_clar1v_(integer *n, integer *b1, integer *bn, real * lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * gaptol, complex *z__, logical *wantnc, integer *negcnt, real *ztz, real *mingma, integer *r__, integer *isuppz, real *nrminv, real * resid, real *rqcorr, real *work); /* Subroutine */ int _starpu_clar2v_(integer *n, complex *x, complex *y, complex *z__, integer *incx, real *c__, complex *s, integer *incc); /* Subroutine */ int _starpu_clarcm_(integer *m, integer *n, real *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, real *rwork); /* Subroutine */ int _starpu_clarf_(char *side, integer *m, integer *n, complex *v, integer *incv, complex *tau, complex *c__, integer *ldc, complex * work); /* Subroutine */ int _starpu_clarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, complex *v, integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, integer *ldwork); /* Subroutine */ int _starpu_clarfg_(integer *n, complex *alpha, complex *x, integer * incx, complex *tau); /* Subroutine */ int _starpu_clarfp_(integer *n, complex *alpha, complex *x, integer * incx, complex *tau); /* Subroutine */ int _starpu_clarft_(char *direct, char *storev, integer *n, integer * k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt); /* Subroutine */ int _starpu_clarfx_(char *side, integer *m, integer *n, complex *v, complex *tau, complex *c__, integer *ldc, complex *work); /* Subroutine */ int _starpu_clargv_(integer *n, complex *x, integer *incx, complex * y, integer *incy, real *c__, integer *incc); /* Subroutine */ int _starpu_clarnv_(integer *idist, integer *iseed, integer *n, complex *x); /* Subroutine */ int _starpu_clarrv_(integer *n, real *vl, real *vu, real *d__, real * l, real *pivmin, integer *isplit, integer *m, integer *dol, integer * dou, real *minrgp, real *rtol1, real *rtol2, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, real *gers, complex * z__, integer *ldz, integer *isuppz, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_clarscl2_(integer *m, integer *n, real *d__, complex *x, integer *ldx); /* Subroutine */ int _starpu_clartg_(complex *f, complex *g, real *cs, complex *sn, complex *r__); /* Subroutine */ int _starpu_clartv_(integer *n, complex *x, integer *incx, complex * y, integer *incy, real *c__, complex *s, integer *incc); /* Subroutine */ int _starpu_clarz_(char *side, integer *m, integer *n, integer *l, complex *v, integer *incv, complex *tau, complex *c__, integer *ldc, complex *work); /* Subroutine */ int _starpu_clarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, complex *v, integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, integer *ldwork); /* Subroutine */ int _starpu_clarzt_(char *direct, char *storev, integer *n, integer * k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt); /* Subroutine */ int _starpu_clascl_(char *type__, integer *kl, integer *ku, real * cfrom, real *cto, integer *m, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_clascl2_(integer *m, integer *n, real *d__, complex *x, integer *ldx); /* Subroutine */ int _starpu_claset_(char *uplo, integer *m, integer *n, complex * alpha, complex *beta, complex *a, integer *lda); /* Subroutine */ int _starpu_clasr_(char *side, char *pivot, char *direct, integer *m, integer *n, real *c__, real *s, complex *a, integer *lda); /* Subroutine */ int _starpu_classq_(integer *n, complex *x, integer *incx, real * scale, real *sumsq); /* Subroutine */ int _starpu_claswp_(integer *n, complex *a, integer *lda, integer * k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_clasyf_(char *uplo, integer *n, integer *nb, integer *kb, complex *a, integer *lda, integer *ipiv, complex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_clatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, complex *ab, integer *ldab, complex * x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_clatdf_(integer *ijob, integer *n, complex *z__, integer *ldz, complex *rhs, real *rdsum, real *rdscal, integer *ipiv, integer *jpiv); /* Subroutine */ int _starpu_clatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, complex *ap, complex *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_clatrd_(char *uplo, integer *n, integer *nb, complex *a, integer *lda, real *e, complex *tau, complex *w, integer *ldw); /* Subroutine */ int _starpu_clatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, complex *a, integer *lda, complex *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_clatrz_(integer *m, integer *n, integer *l, complex *a, integer *lda, complex *tau, complex *work); /* Subroutine */ int _starpu_clatzm_(char *side, integer *m, integer *n, complex *v, integer *incv, complex *tau, complex *c1, complex *c2, integer *ldc, complex *work); /* Subroutine */ int _starpu_clauu2_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_clauum_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpbcon_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpbequ_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real * berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpbstf_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_cpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_cpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer * ldafb, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpbtf2_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_cpbtrf_(char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_cpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_cpftrf_(char *transr, char *uplo, integer *n, complex *a, integer *info); /* Subroutine */ int _starpu_cpftri_(char *transr, char *uplo, integer *n, complex *a, integer *info); /* Subroutine */ int _starpu_cpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, complex *a, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cpocon_(char *uplo, integer *n, complex *a, integer *lda, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpoequ_(integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cpoequb_(integer *n, complex *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cporfs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real * err_bnds_comp__, integer *nparams, real *params, complex *work, real * rwork, integer *info); /* Subroutine */ int _starpu_cposv_(char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cposvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, char * equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, char * equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpotf2_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpotrf_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpotri_(char *uplo, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_cpotrs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cppcon_(char *uplo, integer *n, complex *ap, real *anorm, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cppequ_(char *uplo, integer *n, complex *ap, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_cpprfs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *afp, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cppsv_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *ap, complex *afp, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpptrf_(char *uplo, integer *n, complex *ap, integer * info); /* Subroutine */ int _starpu_cpptri_(char *uplo, integer *n, complex *ap, integer * info); /* Subroutine */ int _starpu_cpptrs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cpstf2_(char *uplo, integer *n, complex *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_cpstrf_(char *uplo, integer *n, complex *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_cptcon_(integer *n, real *d__, complex *e, real *anorm, real *rcond, real *rwork, integer *info); /* Subroutine */ int _starpu_cpteqr_(char *compz, integer *n, real *d__, real *e, complex *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_cptrfs_(char *uplo, integer *n, integer *nrhs, real *d__, complex *e, real *df, complex *ef, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cptsv_(integer *n, integer *nrhs, real *d__, complex *e, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cptsvx_(char *fact, integer *n, integer *nrhs, real *d__, complex *e, real *df, complex *ef, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cpttrf_(integer *n, real *d__, complex *e, integer *info); /* Subroutine */ int _starpu_cpttrs_(char *uplo, integer *n, integer *nrhs, real *d__, complex *e, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cptts2_(integer *iuplo, integer *n, integer *nrhs, real * d__, complex *e, complex *b, integer *ldb); /* Subroutine */ int _starpu_crot_(integer *n, complex *cx, integer *incx, complex * cy, integer *incy, real *c__, complex *s); /* Subroutine */ int _starpu_cspcon_(char *uplo, integer *n, complex *ap, integer * ipiv, real *anorm, real *rcond, complex *work, integer *info); /* Subroutine */ int _starpu_cspmv_(char *uplo, integer *n, complex *alpha, complex * ap, complex *x, integer *incx, complex *beta, complex *y, integer * incy); /* Subroutine */ int _starpu_cspr_(char *uplo, integer *n, complex *alpha, complex *x, integer *incx, complex *ap); /* Subroutine */ int _starpu_csprfs_(char *uplo, integer *n, integer *nrhs, complex * ap, complex *afp, integer *ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_cspsv_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_cspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *ap, complex *afp, integer *ipiv, complex *b, integer * ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csptrf_(char *uplo, integer *n, complex *ap, integer * ipiv, integer *info); /* Subroutine */ int _starpu_csptri_(char *uplo, integer *n, complex *ap, integer * ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_csptrs_(char *uplo, integer *n, integer *nrhs, complex * ap, integer *ipiv, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu__starpu_csrscl_(integer *n, real *sa, complex *sx, integer *incx); /* Subroutine */ int _starpu_cstedc_(char *compz, integer *n, real *d__, real *e, complex *z__, integer *ldz, complex *work, integer *lwork, real * rwork, integer *lrwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_cstegr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, integer *isuppz, real *work, integer *lwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_cstein_(integer *n, real *d__, real *e, integer *m, real *w, integer *iblock, integer *isplit, complex *z__, integer *ldz, real *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_cstemr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, integer *m, real *w, complex *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, real *work, integer *lwork, integer *iwork, integer * liwork, integer *info); /* Subroutine */ int _starpu_csteqr_(char *compz, integer *n, real *d__, real *e, complex *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_csycon_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, real *anorm, real *rcond, complex *work, integer * info); /* Subroutine */ int _starpu_csyequb_(char *uplo, integer *n, complex *a, integer * lda, real *s, real *scond, real *amax, complex *work, integer *info); /* Subroutine */ int _starpu_csymv_(char *uplo, integer *n, complex *alpha, complex * a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy); /* Subroutine */ int _starpu_csyr_(char *uplo, integer *n, complex *alpha, complex *x, integer *incx, complex *a, integer *lda); /* Subroutine */ int _starpu_csyrfs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csysv_(char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_csysvx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, integer *lwork, real *rwork, integer *info); /* Subroutine */ int _starpu_csysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * ipiv, char *equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_csytf2_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_csytrf_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_csytri_(char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *info); /* Subroutine */ int _starpu_csytrs_(char *uplo, integer *n, integer *nrhs, complex * a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_ctbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, complex *ab, integer *ldab, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ctfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, complex *alpha, complex *a, complex *b, integer *ldb); /* Subroutine */ int _starpu_ctftri_(char *transr, char *uplo, char *diag, integer *n, complex *a, integer *info); /* Subroutine */ int _starpu_ctfttp_(char *transr, char *uplo, integer *n, complex * arf, complex *ap, integer *info); /* Subroutine */ int _starpu_ctfttr_(char *transr, char *uplo, integer *n, complex * arf, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctgevc_(char *side, char *howmny, logical *select, integer *n, complex *s, integer *lds, complex *p, integer *ldp, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer *m, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctgex2_(logical *wantq, logical *wantz, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *q, integer *ldq, complex *z__, integer *ldz, integer *j1, integer *info); /* Subroutine */ int _starpu_ctgexc_(logical *wantq, logical *wantz, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *q, integer *ldq, complex *z__, integer *ldz, integer *ifst, integer * ilst, integer *info); /* Subroutine */ int _starpu_ctgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, complex *q, integer *ldq, complex *z__, integer *ldz, integer *m, real *pl, real *pr, real * dif, complex *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ctgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, complex *a, integer * lda, complex *b, integer *ldb, real *tola, real *tolb, real *alpha, real *beta, complex *u, integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, complex *work, integer *ncycle, integer * info); /* Subroutine */ int _starpu_ctgsna_(char *job, char *howmny, logical *select, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *vl, integer *ldvl, complex *vr, integer *ldvr, real *s, real *dif, integer *mm, integer *m, complex *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ctgsy2_(char *trans, integer *ijob, integer *m, integer * n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, complex *d__, integer *ldd, complex *e, integer *lde, complex *f, integer *ldf, real *scale, real *rdsum, real *rdscal, integer *info); /* Subroutine */ int _starpu_ctgsyl_(char *trans, integer *ijob, integer *m, integer * n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, complex *d__, integer *ldd, complex *e, integer *lde, complex *f, integer *ldf, real *scale, real *dif, complex *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ctpcon_(char *norm, char *uplo, char *diag, integer *n, complex *ap, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *ap, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctptri_(char *uplo, char *diag, integer *n, complex *ap, integer *info); /* Subroutine */ int _starpu_ctptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *ap, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ctpttf_(char *transr, char *uplo, integer *n, complex * ap, complex *arf, integer *info); /* Subroutine */ int _starpu_ctpttr_(char *uplo, integer *n, complex *ap, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctrcon_(char *norm, char *uplo, char *diag, integer *n, complex *a, integer *lda, real *rcond, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrevc_(char *side, char *howmny, logical *select, integer *n, complex *t, integer *ldt, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer *m, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrexc_(char *compq, integer *n, complex *t, integer * ldt, complex *q, integer *ldq, integer *ifst, integer *ilst, integer * info); /* Subroutine */ int _starpu_ctrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrsen_(char *job, char *compq, logical *select, integer *n, complex *t, integer *ldt, complex *q, integer *ldq, complex *w, integer *m, real *s, real *sep, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ctrsna_(char *job, char *howmny, logical *select, integer *n, complex *t, integer *ldt, complex *vl, integer *ldvl, complex *vr, integer *ldvr, real *s, real *sep, integer *mm, integer * m, complex *work, integer *ldwork, real *rwork, integer *info); /* Subroutine */ int _starpu_ctrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, integer *ldc, real *scale, integer *info); /* Subroutine */ int _starpu_ctrti2_(char *uplo, char *diag, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctrtri_(char *uplo, char *diag, integer *n, complex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ctrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ctrttf_(char *transr, char *uplo, integer *n, complex *a, integer *lda, complex *arf, integer *info); /* Subroutine */ int _starpu_ctrttp_(char *uplo, integer *n, complex *a, integer *lda, complex *ap, integer *info); /* Subroutine */ int _starpu_ctzrqf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, integer *info); /* Subroutine */ int _starpu_ctzrzf_(integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cung2l_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cung2r_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cungbr_(char *vect, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunghr_(integer *n, integer *ilo, integer *ihi, complex * a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cungl2_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cunglq_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungql_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungqr_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungr2_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *info); /* Subroutine */ int _starpu_cungrq_(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cungtr_(char *uplo, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunm2l_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunm2r_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cunmhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cunml2_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmlq_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmql_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmqr_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmr2_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_cunmrq_(char *side, char *trans, integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cunmrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_cunmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *c__, integer *ldc, complex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_cupgtr_(char *uplo, integer *n, complex *ap, complex * tau, complex *q, integer *ldq, complex *work, integer *info); /* Subroutine */ int _starpu_cupmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, complex *ap, complex *tau, complex *c__, integer *ldc, complex *work, integer *info); /* Subroutine */ int _starpu_dbdsdc_(char *uplo, char *compq, integer *n, doublereal * d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *q, integer *iq, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_ddisna_(char *job, integer *m, integer *n, doublereal * d__, doublereal *sep, integer *info); /* Subroutine */ int _starpu_dgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal * d__, doublereal *e, doublereal *q, integer *ldq, doublereal *pt, integer *ldpt, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgbcon_(char *norm, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbequ_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info); /* Subroutine */ int _starpu_dgbequb_(integer *m, integer *n, integer *kl, integer * ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info); /* Subroutine */ int _starpu_dgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgbtf2_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgbtrf_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *scale, integer *m, doublereal *v, integer * ldv, integer *info); /* Subroutine */ int _starpu_dgebal_(char *job, integer *n, doublereal *a, integer * lda, integer *ilo, integer *ihi, doublereal *scale, integer *info); /* Subroutine */ int _starpu_dgebd2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgebrd_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgecon_(char *norm, integer *n, doublereal *a, integer * lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgeequ_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dgeequb_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dgees_(char *jobvs, char *sort, L_fp select, integer *n, doublereal *a, integer *lda, integer *sdim, doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, doublereal *work, integer *lwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, doublereal *a, integer *lda, integer *sdim, doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, doublereal *rconde, doublereal *rcondv, doublereal *work, integer * lwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dgeev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublereal *a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgegs_(char *jobvsl, char *jobvsr, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgegv_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgehd2_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgehrd_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgejsv_(char *joba, char *jobu, char *jobv, char *jobr, char *jobt, char *jobp, integer *m, integer *n, doublereal *a, integer *lda, doublereal *sva, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgelq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgelqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgels_(char *trans, integer *m, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgelsd_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgelss_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgelsx_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * info); /* Subroutine */ int _starpu_dgelsy_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_dgeql2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgeqlf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgeqp3_(integer *m, integer *n, doublereal *a, integer * lda, integer *jpvt, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgeqpf_(integer *m, integer *n, doublereal *a, integer * lda, integer *jpvt, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgeqr2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgeqrf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgerfs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgerq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgerqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgesc2_(integer *n, doublereal *a, integer *lda, doublereal *rhs, integer *ipiv, integer *jpiv, doublereal *scale); /* Subroutine */ int _starpu_dgesdd_(char *jobz, integer *m, integer *n, doublereal * a, integer *lda, doublereal *s, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgesvj_(char *joba, char *jobu, char *jobv, integer *m, integer *n, doublereal *a, integer *lda, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgesvx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dgetc2_(integer *n, doublereal *a, integer *lda, integer *ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_dgetf2_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgetri_(integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgetrs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_dggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, doublereal *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_dggbal_(char *job, integer *n, doublereal *a, integer * lda, doublereal *b, integer *ldb, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *work, integer * info); /* Subroutine */ int _starpu_dgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, integer *lwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *rconde, doublereal * rcondv, doublereal *work, integer *lwork, integer *iwork, integer * liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_dggev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * rcondv, doublereal *work, integer *lwork, integer *iwork, logical * bwork, integer *info); /* Subroutine */ int _starpu_dggglm_(integer *n, integer *m, integer *p, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *d__, doublereal *x, doublereal *y, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *q, integer *ldq, doublereal *z__, integer * ldz, integer *info); /* Subroutine */ int _starpu_dgglse_(integer *m, integer *n, integer *p, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, doublereal *d__, doublereal *x, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggqrf_(integer *n, integer *m, integer *p, doublereal * a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, doublereal *taub, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggrqf_(integer *m, integer *p, integer *n, doublereal * a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, doublereal *taub, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer *ldq, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *tola, doublereal *tolb, integer *k, integer *l, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer *ldq, integer *iwork, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dgsvj0_(char *jobv, integer *m, integer *n, doublereal * a, integer *lda, doublereal *d__, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *eps, doublereal *sfmin, doublereal *tol, integer *nsweep, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dgsvj1_(char *jobv, integer *m, integer *n, integer *n1, doublereal *a, integer *lda, doublereal *d__, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *eps, doublereal *sfmin, doublereal *tol, integer *nsweep, doublereal *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_dgtcon_(char *norm, integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgtrfs_(char *trans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_dgtsv_(integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal * dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dgttrf_(integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dgttrs_(char *trans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dgtts2_(integer *itrans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dhgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *t, integer *ldt, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dhsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer * ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_dhseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); logical _starpu_disnan_(doublereal *din); /* Subroutine */ int _starpu_dla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublereal *ab, integer * ldab, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_dla_gbrcond__(char *trans, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_dla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal * y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info); doublereal _starpu_dla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb); /* Subroutine */ int _starpu_dla_geamv__(integer *trans, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_dla_gercond__(char *trans, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_dla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer * ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal * dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info); /* Subroutine */ int _starpu_dla_lin_berr__(integer *n, integer *nz, integer *nrhs, doublereal *res, doublereal *ayb, doublereal *berr); doublereal _starpu_dla_porcond__(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_dla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal * af, integer *ldaf, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal * y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_dla_porpvgrw__(char *uplo, integer *ncols, doublereal *a, integer * lda, doublereal *af, integer *ldaf, doublereal *work, ftnlen uplo_len); doublereal _starpu_dla_rpvgrw__(integer *n, integer *ncols, doublereal *a, integer * lda, doublereal *af, integer *ldaf); /* Subroutine */ int _starpu_dla_syamv__(integer *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_dla_syrcond__(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_dla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal * af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal * berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal * errs_c__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_dla_syrpvgrw__(char *uplo, integer *n, integer *info, doublereal * a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len); /* Subroutine */ int _starpu_dla_wwaddw__(integer *n, doublereal *x, doublereal *y, doublereal *w); /* Subroutine */ int _starpu_dlabad_(doublereal *small, doublereal *large); /* Subroutine */ int _starpu_dlabrd_(integer *m, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer *ldy); /* Subroutine */ int _starpu_dlacn2_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_dlacon_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase); /* Subroutine */ int _starpu_dlacpy_(char *uplo, integer *m, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dladiv_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p, doublereal *q); /* Subroutine */ int _starpu_dlae2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2); /* Subroutine */ int _starpu_dlaebz_(integer *ijob, integer *nitmax, integer *n, integer *mmax, integer *minp, integer *nbmin, doublereal *abstol, doublereal *reltol, doublereal *pivmin, doublereal *d__, doublereal * e, doublereal *e2, integer *nval, doublereal *ab, doublereal *c__, integer *mout, integer *nab, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed0_(integer *icompq, integer *qsiz, integer *n, doublereal *d__, doublereal *e, doublereal *q, integer *ldq, doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed1_(integer *n, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed2_(integer *k, integer *n, integer *n1, doublereal * d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, integer *indx, integer *indxc, integer *indxp, integer *coltyp, integer *info); /* Subroutine */ int _starpu_dlaed3_(integer *k, integer *n, integer *n1, doublereal * d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, doublereal *q2, integer *indx, integer *ctot, doublereal *w, doublereal *s, integer *info); /* Subroutine */ int _starpu_dlaed4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, integer *info); /* Subroutine */ int _starpu_dlaed5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam); /* Subroutine */ int _starpu_dlaed6_(integer *kniter, logical *orgati, doublereal * rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * tau, integer *info); /* Subroutine */ int _starpu_dlaed7_(integer *icompq, integer *n, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlaed8_(integer *icompq, integer *k, integer *n, integer *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer *indx, integer *info); /* Subroutine */ int _starpu_dlaed9_(integer *k, integer *kstart, integer *kstop, integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, integer *info); /* Subroutine */ int _starpu_dlaeda_(integer *n, integer *tlvls, integer *curlvl, integer *curpbm, integer *prmptr, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, doublereal *z__, doublereal *ztemp, integer *info); /* Subroutine */ int _starpu_dlaein_(logical *rightv, logical *noinit, integer *n, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *vr, doublereal *vi, doublereal *b, integer *ldb, doublereal *work, doublereal *eps3, doublereal *smlnum, doublereal * bignum, integer *info); /* Subroutine */ int _starpu_dlaev2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1); /* Subroutine */ int _starpu_dlaexc_(logical *wantq, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, integer *j1, integer *n1, integer *n2, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlag2_(doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *safmin, doublereal *scale1, doublereal * scale2, doublereal *wr1, doublereal *wr2, doublereal *wi); /* Subroutine */ int _starpu_dlag2s_(integer *m, integer *n, doublereal *a, integer * lda, real *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_dlags2_(logical *upper, doublereal *a1, doublereal *a2, doublereal *a3, doublereal *b1, doublereal *b2, doublereal *b3, doublereal *csu, doublereal *snu, doublereal *csv, doublereal *snv, doublereal *csq, doublereal *snq); /* Subroutine */ int _starpu_dlagtf_(integer *n, doublereal *a, doublereal *lambda, doublereal *b, doublereal *c__, doublereal *tol, doublereal *d__, integer *in, integer *info); /* Subroutine */ int _starpu_dlagtm_(char *trans, integer *n, integer *nrhs, doublereal *alpha, doublereal *dl, doublereal *d__, doublereal *du, doublereal *x, integer *ldx, doublereal *beta, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dlagts_(integer *job, integer *n, doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, integer *in, doublereal *y, doublereal *tol, integer *info); /* Subroutine */ int _starpu_dlagv2_(doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *csl, doublereal *snl, doublereal *csr, doublereal * snr); /* Subroutine */ int _starpu_dlahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_dlahr2_(integer *n, integer *k, integer *nb, doublereal * a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, doublereal *y, integer *ldy); /* Subroutine */ int _starpu_dlahrd_(integer *n, integer *k, integer *nb, doublereal * a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, doublereal *y, integer *ldy); /* Subroutine */ int _starpu_dlaic1_(integer *job, integer *j, doublereal *x, doublereal *sest, doublereal *w, doublereal *gamma, doublereal * sestpr, doublereal *s, doublereal *c__); logical _starpu_dlaisnan_(doublereal *din1, doublereal *din2); /* Subroutine */ int _starpu_dlaln2_(logical *ltrans, integer *na, integer *nw, doublereal *smin, doublereal *ca, doublereal *a, integer *lda, doublereal *d1, doublereal *d2, doublereal *b, integer *ldb, doublereal *wr, doublereal *wi, doublereal *x, integer *ldx, doublereal *scale, doublereal *xnorm, integer *info); /* Subroutine */ int _starpu_dlals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * k, doublereal *c__, doublereal *s, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal * poles, integer *givptr, integer *givcol, integer *ldgcol, integer * perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, doublereal *rcond, integer *rank, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlamrg_(integer *n1, integer *n2, doublereal *a, integer *dtrd1, integer *dtrd2, integer *index); integer _starpu_dlaneg_(integer *n, doublereal *d__, doublereal *lld, doublereal * sigma, doublereal *pivmin, integer *r__); doublereal _starpu_dlangb_(char *norm, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *work); doublereal _starpu_dlange_(char *norm, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work); doublereal _starpu_dlangt_(char *norm, integer *n, doublereal *dl, doublereal *d__, doublereal *du); doublereal _starpu_dlanhs_(char *norm, integer *n, doublereal *a, integer *lda, doublereal *work); doublereal _starpu_dlansb_(char *norm, char *uplo, integer *n, integer *k, doublereal *ab, integer *ldab, doublereal *work); doublereal _starpu_dlansf_(char *norm, char *transr, char *uplo, integer *n, doublereal *a, doublereal *work); doublereal _starpu_dlansp_(char *norm, char *uplo, integer *n, doublereal *ap, doublereal *work); doublereal _starpu_dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e); doublereal _starpu_dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *work); doublereal _starpu_dlantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, doublereal *ab, integer *ldab, doublereal *work); doublereal _starpu_dlantp_(char *norm, char *uplo, char *diag, integer *n, doublereal *ap, doublereal *work); doublereal _starpu_dlantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work); /* Subroutine */ int _starpu_dlanv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *rt1r, doublereal *rt1i, doublereal *rt2r, doublereal *rt2i, doublereal *cs, doublereal *sn); /* Subroutine */ int _starpu_dlapll_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *ssmin); /* Subroutine */ int _starpu_dlapmt_(logical *forwrd, integer *m, integer *n, doublereal *x, integer *ldx, integer *k); doublereal _starpu_dlapy2_(doublereal *x, doublereal *y); doublereal _starpu_dlapy3_(doublereal *x, doublereal *y, doublereal *z__); /* Subroutine */ int _starpu_dlaqgb_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqge_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqp2_(integer *m, integer *n, integer *offset, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *work); /* Subroutine */ int _starpu_dlaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *auxv, doublereal *f, integer *ldf); /* Subroutine */ int _starpu_dlaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dlaqr1_(integer *n, doublereal *h__, integer *ldh, doublereal *sr1, doublereal *si1, doublereal *sr2, doublereal *si2, doublereal *v); /* Subroutine */ int _starpu_dlaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork); /* Subroutine */ int _starpu_dlaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork); /* Subroutine */ int _starpu_dlaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dlaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, doublereal *sr, doublereal *si, doublereal *h__, integer *ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *v, integer * ldv, doublereal *u, integer *ldu, integer *nv, doublereal *wv, integer *ldwv, integer *nh, doublereal *wh, integer *ldwh); /* Subroutine */ int _starpu_dlaqsb_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqsp_(char *uplo, integer *n, doublereal *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqsy_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_dlaqtr_(logical *ltran, logical *lreal, integer *n, doublereal *t, integer *ldt, doublereal *b, doublereal *w, doublereal *scale, doublereal *x, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlar1v_(integer *n, integer *b1, integer *bn, doublereal *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * lld, doublereal *pivmin, doublereal *gaptol, doublereal *z__, logical *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, doublereal *rqcorr, doublereal *work); /* Subroutine */ int _starpu_dlar2v_(integer *n, doublereal *x, doublereal *y, doublereal *z__, integer *incx, doublereal *c__, doublereal *s, integer *incc); /* Subroutine */ int _starpu_dlarf_(char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, doublereal *v, integer * ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, doublereal *work, integer *ldwork); /* Subroutine */ int _starpu_dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau); /* Subroutine */ int _starpu_dlarfp_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau); /* Subroutine */ int _starpu_dlarft_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt); /* Subroutine */ int _starpu_dlarfx_(char *side, integer *m, integer *n, doublereal * v, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlargv_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *c__, integer *incc); /* Subroutine */ int _starpu_dlarnv_(integer *idist, integer *iseed, integer *n, doublereal *x); /* Subroutine */ int _starpu_dlarra_(integer *n, doublereal *d__, doublereal *e, doublereal *e2, doublereal *spltol, doublereal *tnrm, integer *nsplit, integer *isplit, integer *info); /* Subroutine */ int _starpu_dlarrb_(integer *n, doublereal *d__, doublereal *lld, integer *ifirst, integer *ilast, doublereal *rtol1, doublereal *rtol2, integer *offset, doublereal *w, doublereal *wgap, doublereal *werr, doublereal *work, integer *iwork, doublereal *pivmin, doublereal * spdiam, integer *twist, integer *info); /* Subroutine */ int _starpu_dlarrc_(char *jobt, integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *e, doublereal *pivmin, integer *eigcnt, integer *lcnt, integer *rcnt, integer *info); /* Subroutine */ int _starpu_dlarrd_(char *range, char *order, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *gers, doublereal *reltol, doublereal *d__, doublereal *e, doublereal *e2, doublereal *pivmin, integer *nsplit, integer *isplit, integer *m, doublereal *w, doublereal *werr, doublereal *wl, doublereal *wu, integer *iblock, integer *indexw, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlarre_(char *range, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *d__, doublereal *e, doublereal *e2, doublereal *rtol1, doublereal *rtol2, doublereal * spltol, integer *nsplit, integer *isplit, integer *m, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublereal *pivmin, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dlarrf_(integer *n, doublereal *d__, doublereal *l, doublereal *ld, integer *clstrt, integer *clend, doublereal *w, doublereal *wgap, doublereal *werr, doublereal *spdiam, doublereal * clgapl, doublereal *clgapr, doublereal *pivmin, doublereal *sigma, doublereal *dplus, doublereal *lplus, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlarrj_(integer *n, doublereal *d__, doublereal *e2, integer *ifirst, integer *ilast, doublereal *rtol, integer *offset, doublereal *w, doublereal *werr, doublereal *work, integer *iwork, doublereal *pivmin, doublereal *spdiam, integer *info); /* Subroutine */ int _starpu_dlarrk_(integer *n, integer *iw, doublereal *gl, doublereal *gu, doublereal *d__, doublereal *e2, doublereal *pivmin, doublereal *reltol, doublereal *w, doublereal *werr, integer *info); /* Subroutine */ int _starpu_dlarrr_(integer *n, doublereal *d__, doublereal *e, integer *info); /* Subroutine */ int _starpu_dlarrv_(integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, integer *m, integer *dol, integer *dou, doublereal *minrgp, doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlarscl2_(integer *m, integer *n, doublereal *d__, doublereal *x, integer *ldx); /* Subroutine */ int _starpu_dlartg_(doublereal *f, doublereal *g, doublereal *cs, doublereal *sn, doublereal *r__); /* Subroutine */ int _starpu_dlartv_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *c__, doublereal *s, integer *incc); /* Subroutine */ int _starpu_dlaruv_(integer *iseed, integer *n, doublereal *x); /* Subroutine */ int _starpu_dlarz_(char *side, integer *m, integer *n, integer *l, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, doublereal *v, integer *ldv, doublereal *t, integer *ldt, doublereal *c__, integer * ldc, doublereal *work, integer *ldwork); /* Subroutine */ int _starpu_dlarzt_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt); /* Subroutine */ int _starpu_dlas2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax); /* Subroutine */ int _starpu_dlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_dlascl2_(integer *m, integer *n, doublereal *d__, doublereal *x, integer *ldx); /* Subroutine */ int _starpu_dlasd0_(integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer * ldvt, integer *smlsiz, integer *iwork, doublereal *work, integer * info); /* Subroutine */ int _starpu_dlasd1_(integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, integer *idxq, integer * iwork, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasd2_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, doublereal *alpha, doublereal * beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *dsigma, doublereal *u2, integer *ldu2, doublereal *vt2, integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer * idxq, integer *coltyp, integer *info); /* Subroutine */ int _starpu_dlasd3_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *q, integer *ldq, doublereal *dsigma, doublereal *u, integer *ldu, doublereal *u2, integer *ldu2, doublereal *vt, integer *ldvt, doublereal *vt2, integer *ldvt2, integer *idxc, integer *ctot, doublereal *z__, integer *info); /* Subroutine */ int _starpu_dlasd4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal * sigma, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasd5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * work); /* Subroutine */ int _starpu_dlasd6_(integer *icompq, integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlasd7_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *c__, doublereal *s, integer *info); /* Subroutine */ int _starpu_dlasd8_(integer *icompq, integer *k, doublereal *d__, doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * work, integer *info); /* Subroutine */ int _starpu_dlasda_(integer *icompq, integer *smlsiz, integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dlasdq_(char *uplo, integer *sqre, integer *n, integer * ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasdt_(integer *n, integer *lvl, integer *nd, integer * inode, integer *ndiml, integer *ndimr, integer *msub); /* Subroutine */ int _starpu_dlaset_(char *uplo, integer *m, integer *n, doublereal * alpha, doublereal *beta, doublereal *a, integer *lda); /* Subroutine */ int _starpu_dlasq1_(integer *n, doublereal *d__, doublereal *e, doublereal *work, integer *info); /* Subroutine */ int _starpu_dlasq2_(integer *n, doublereal *z__, integer *info); /* Subroutine */ int _starpu_dlasq3_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, doublereal *tau); /* Subroutine */ int _starpu_dlasq4_(integer *i0, integer *n0, doublereal *z__, integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *tau, integer *ttype, doublereal *g); /* Subroutine */ int _starpu_dlasq5_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *tau, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2, logical *ieee); /* Subroutine */ int _starpu_dlasq6_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2); /* Subroutine */ int _starpu_dlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * lda); /* Subroutine */ int _starpu_dlasrt_(char *id, integer *n, doublereal *d__, integer * info); /* Subroutine */ int _starpu_dlassq_(integer *n, doublereal *x, integer *incx, doublereal *scale, doublereal *sumsq); /* Subroutine */ int _starpu_dlasv2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * csr, doublereal *snl, doublereal *csl); /* Subroutine */ int _starpu_dlaswp_(integer *n, doublereal *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_dlasy2_(logical *ltranl, logical *ltranr, integer *isgn, integer *n1, integer *n2, doublereal *tl, integer *ldtl, doublereal * tr, integer *ldtr, doublereal *b, integer *ldb, doublereal *scale, doublereal *x, integer *ldx, doublereal *xnorm, integer *info); /* Subroutine */ int _starpu_dlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublereal *a, integer *lda, integer *ipiv, doublereal *w, integer * ldw, integer *info); /* Subroutine */ int _starpu_dlat2s_(char *uplo, integer *n, doublereal *a, integer * lda, real *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_dlatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_dlatdf_(integer *ijob, integer *n, doublereal *z__, integer *ldz, doublereal *rhs, doublereal *rdsum, doublereal *rdscal, integer *ipiv, integer *jpiv); /* Subroutine */ int _starpu_dlatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublereal *ap, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_dlatrd_(char *uplo, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, integer *ldw); /* Subroutine */ int _starpu_dlatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublereal *a, integer *lda, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_dlatrz_(integer *m, integer *n, integer *l, doublereal * a, integer *lda, doublereal *tau, doublereal *work); /* Subroutine */ int _starpu_dlatzm_(char *side, integer *m, integer *n, doublereal * v, integer *incv, doublereal *tau, doublereal *c1, doublereal *c2, integer *ldc, doublereal *work); /* Subroutine */ int _starpu_dlauu2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dlauum_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dopgtr_(char *uplo, integer *n, doublereal *ap, doublereal *tau, doublereal *q, integer *ldq, doublereal *work, integer *info); /* Subroutine */ int _starpu_dopmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *ap, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorg2l_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorg2r_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorgbr_(char *vect, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorghr_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgl2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorglq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgql_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgqr_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgr2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorgrq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorgtr_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal * tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dorml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormql_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormr2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info); /* Subroutine */ int _starpu_dormrq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dormtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dpbcon_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *anorm, doublereal *rcond, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dpbequ_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_dpbstf_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_dpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, char *equed, doublereal *s, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dpbtf2_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_dpbtrf_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_dpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpftrf_(char *transr, char *uplo, integer *n, doublereal *a, integer *info); /* Subroutine */ int _starpu_dpftri_(char *transr, char *uplo, integer *n, doublereal *a, integer *info); /* Subroutine */ int _starpu_dpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, doublereal *a, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpocon_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dpoequ_(integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dpoequb_(integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dporfs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_dporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dposvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal * berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal * berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dpotf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dpotrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dpotri_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info); /* Subroutine */ int _starpu_dpotrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dppcon_(char *uplo, integer *n, doublereal *ap, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dppequ_(char *uplo, integer *n, doublereal *ap, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_dpprfs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *afp, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dppsv_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *ap, doublereal *afp, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_dpptrf_(char *uplo, integer *n, doublereal *ap, integer * info); /* Subroutine */ int _starpu_dpptri_(char *uplo, integer *n, doublereal *ap, integer * info); /* Subroutine */ int _starpu_dpptrs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dpstf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_dpstrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_dptcon_(integer *n, doublereal *d__, doublereal *e, doublereal *anorm, doublereal *rcond, doublereal *work, integer *info); /* Subroutine */ int _starpu_dpteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dptrfs_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *info); /* Subroutine */ int _starpu_dptsv_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dptsvx_(char *fact, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * info); /* Subroutine */ int _starpu_dpttrf_(integer *n, doublereal *d__, doublereal *e, integer *info); /* Subroutine */ int _starpu_dpttrs_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dptts2_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_drscl_(integer *n, doublereal *sa, doublereal *sx, integer *incx); /* Subroutine */ int _starpu_dsbev_(char *jobz, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsbevd_(char *jobz, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *q, integer * ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *x, integer *ldx, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal * bb, integer *ldbb, doublereal *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsbtrd_(char *vect, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *d__, doublereal *e, doublereal *q, integer *ldq, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c__); /* Subroutine */ int _starpu__starpu_dsgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *work, real *swork, integer *iter, integer *info); /* Subroutine */ int _starpu_dspcon_(char *uplo, integer *n, doublereal *ap, integer * ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dspev_(char *jobz, char *uplo, integer *n, doublereal * ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dspevd_(char *jobz, char *uplo, integer *n, doublereal * ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dspevx_(char *jobz, char *range, char *uplo, integer *n, doublereal *ap, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dspgst_(integer *itype, char *uplo, integer *n, doublereal *ap, doublereal *bp, integer *info); /* Subroutine */ int _starpu_dspgv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dspgvd_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dspgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublereal *ap, doublereal *bp, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu__starpu_dsposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *work, real *swork, integer *iter, integer *info); /* Subroutine */ int _starpu_dsprfs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dspsv_(char *uplo, integer *n, integer *nrhs, doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsptrd_(char *uplo, integer *n, doublereal *ap, doublereal *d__, doublereal *e, doublereal *tau, integer *info); /* Subroutine */ int _starpu_dsptrf_(char *uplo, integer *n, doublereal *ap, integer * ipiv, integer *info); /* Subroutine */ int _starpu_dsptri_(char *uplo, integer *n, doublereal *ap, integer * ipiv, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsptrs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dstebz_(char *range, char *order, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, doublereal *d__, doublereal *e, integer *m, integer *nsplit, doublereal *w, integer *iblock, integer *isplit, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstegr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstein_(integer *n, doublereal *d__, doublereal *e, integer *m, doublereal *w, integer *iblock, integer *isplit, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dstemr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsterf_(integer *n, doublereal *d__, doublereal *e, integer *info); /* Subroutine */ int _starpu_dstev_(char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_dstevd_(char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstevr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dstevx_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsycon_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsyequb_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *s, doublereal *scond, doublereal *amax, doublereal * work, integer *info); /* Subroutine */ int _starpu_dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsyevd_(char *jobz, char *uplo, integer *n, doublereal * a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsyevr_(char *jobz, char *range, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsyevx_(char *jobz, char *range, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsygs2_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dsygst_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dsygv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsygvd_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dsygvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_dsyrfs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublereal * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsysv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsysvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *s, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal * rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal * err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dsytd2_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info); /* Subroutine */ int _starpu_dsytf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_dsytrd_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsytrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dsytri_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *work, integer *info); /* Subroutine */ int _starpu_dsytrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_dtbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_dtfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, doublereal *b, integer *ldb); /* Subroutine */ int _starpu_dtftri_(char *transr, char *uplo, char *diag, integer *n, doublereal *a, integer *info); /* Subroutine */ int _starpu_dtfttp_(char *transr, char *uplo, integer *n, doublereal *arf, doublereal *ap, integer *info); /* Subroutine */ int _starpu_dtfttr_(char *transr, char *uplo, integer *n, doublereal *arf, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtgevc_(char *side, char *howmny, logical *select, integer *n, doublereal *s, integer *lds, doublereal *p, integer *ldp, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer *info); /* Subroutine */ int _starpu_dtgex2_(logical *wantq, logical *wantz, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * q, integer *ldq, doublereal *z__, integer *ldz, integer *j1, integer * n1, integer *n2, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dtgexc_(logical *wantq, logical *wantz, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * q, integer *ldq, doublereal *z__, integer *ldz, integer *ifst, integer *ilst, doublereal *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_dtgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, doublereal *a, integer *lda, doublereal * b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, integer *m, doublereal *pl, doublereal *pr, doublereal *dif, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_dtgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *tola, doublereal *tolb, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer * ldq, doublereal *work, integer *ncycle, integer *info); /* Subroutine */ int _starpu_dtgsna_(char *job, char *howmny, logical *select, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *dif, integer *mm, integer *m, doublereal * work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtgsy2_(char *trans, integer *ijob, integer *m, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * scale, doublereal *rdsum, doublereal *rdscal, integer *iwork, integer *pq, integer *info); /* Subroutine */ int _starpu_dtgsyl_(char *trans, integer *ijob, integer *m, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * scale, doublereal *dif, doublereal *work, integer *lwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_dtpcon_(char *norm, char *uplo, char *diag, integer *n, doublereal *ap, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtptri_(char *uplo, char *diag, integer *n, doublereal * ap, integer *info); /* Subroutine */ int _starpu_dtptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_dtpttf_(char *transr, char *uplo, integer *n, doublereal *ap, doublereal *arf, integer *info); /* Subroutine */ int _starpu_dtpttr_(char *uplo, integer *n, doublereal *ap, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtrcon_(char *norm, char *uplo, char *diag, integer *n, doublereal *a, integer *lda, doublereal *rcond, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtrevc_(char *side, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer *info); /* Subroutine */ int _starpu_dtrexc_(char *compq, integer *n, doublereal *t, integer * ldt, doublereal *q, integer *ldq, integer *ifst, integer *ilst, doublereal *work, integer *info); /* Subroutine */ int _starpu_dtrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_dtrsen_(char *job, char *compq, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, doublereal *wr, doublereal *wi, integer *m, doublereal *s, doublereal *sep, doublereal *work, integer *lwork, integer *iwork, integer * liwork, integer *info); /* Subroutine */ int _starpu_dtrsna_(char *job, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *sep, integer *mm, integer *m, doublereal *work, integer *ldwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_dtrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, doublereal *a, integer *lda, doublereal *b, integer * ldb, doublereal *c__, integer *ldc, doublereal *scale, integer *info); /* Subroutine */ int _starpu_dtrti2_(char *uplo, char *diag, integer *n, doublereal * a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtrtri_(char *uplo, char *diag, integer *n, doublereal * a, integer *lda, integer *info); /* Subroutine */ int _starpu_dtrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_dtrttf_(char *transr, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *arf, integer *info); /* Subroutine */ int _starpu_dtrttp_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *ap, integer *info); /* Subroutine */ int _starpu_dtzrqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, integer *info); /* Subroutine */ int _starpu_dtzrzf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); doublereal _starpu_dzsum1_(integer *n, doublecomplex *cx, integer *incx); integer _starpu_icmax1_(integer *n, complex *cx, integer *incx); integer _starpu_ieeeck_(integer *ispec, real *zero, real *one); integer _starpu_ilaclc_(integer *m, integer *n, complex *a, integer *lda); integer _starpu_ilaclr_(integer *m, integer *n, complex *a, integer *lda); integer _starpu_iladiag_(char *diag); integer _starpu_iladlc_(integer *m, integer *n, doublereal *a, integer *lda); integer _starpu_iladlr_(integer *m, integer *n, doublereal *a, integer *lda); integer _starpu_ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, integer *n4); integer _starpu_ilaprec_(char *prec); integer _starpu_ilaslc_(integer *m, integer *n, real *a, integer *lda); integer _starpu_ilaslr_(integer *m, integer *n, real *a, integer *lda); integer _starpu_ilatrans_(char *trans); integer _starpu_ilauplo_(char *uplo); /* Subroutine */ int _starpu_ilaver_(integer *vers_major__, integer *vers_minor__, integer *vers_patch__); integer _starpu_ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda); integer _starpu_ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda); integer _starpu_iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer *ilo, integer *ihi, integer *lwork); integer _starpu_izmax1_(integer *n, doublecomplex *cx, integer *incx); logical _starpu_lsamen_(integer *n, char *ca, char *cb); integer _starpu_smaxloc_(real *a, integer *dimm); /* Subroutine */ int _starpu_sbdsdc_(char *uplo, char *compq, integer *n, real *d__, real *e, real *u, integer *ldu, real *vt, integer *ldvt, real *q, integer *iq, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, real *d__, real *e, real *vt, integer *ldvt, real * u, integer *ldu, real *c__, integer *ldc, real *work, integer *info); doublereal _starpu_scsum1_(integer *n, complex *cx, integer *incx); /* Subroutine */ int _starpu_sdisna_(char *job, integer *m, integer *n, real *d__, real *sep, integer *info); /* Subroutine */ int _starpu_sgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, real *ab, integer *ldab, real *d__, real * e, real *q, integer *ldq, real *pt, integer *ldpt, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sgbcon_(char *norm, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbequ_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real * colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgbequb_(integer *m, integer *n, integer *kl, integer * ku, real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real * ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, real *ab, integer *ldab, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real * rpvgrw, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgbtf2_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgbtrf_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, real *ab, integer *ldab, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *scale, integer *m, real *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_sgebal_(char *job, integer *n, real *a, integer *lda, integer *ilo, integer *ihi, real *scale, integer *info); /* Subroutine */ int _starpu_sgebd2_(integer *m, integer *n, real *a, integer *lda, real *d__, real *e, real *tauq, real *taup, real *work, integer *info); /* Subroutine */ int _starpu_sgebrd_(integer *m, integer *n, real *a, integer *lda, real *d__, real *e, real *tauq, real *taup, real *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_sgecon_(char *norm, integer *n, real *a, integer *lda, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgeequ_(integer *m, integer *n, real *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgeequb_(integer *m, integer *n, real *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer *info); /* Subroutine */ int _starpu_sgees_(char *jobvs, char *sort, L_fp select, integer *n, real *a, integer *lda, integer *sdim, real *wr, real *wi, real *vs, integer *ldvs, real *work, integer *lwork, logical *bwork, integer * info); /* Subroutine */ int _starpu_sgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, real *a, integer *lda, integer *sdim, real *wr, real *wi, real *vs, integer *ldvs, real *rconde, real *rcondv, real * work, integer *lwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sgeev_(char *jobvl, char *jobvr, integer *n, real *a, integer *lda, real *wr, real *wi, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, real *a, integer *lda, real *wr, real *wi, real * vl, integer *ldvl, real *vr, integer *ldvr, integer *ilo, integer * ihi, real *scale, real *abnrm, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgegs_(char *jobvsl, char *jobvsr, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgegv_(char *jobvl, char *jobvr, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgehd2_(integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgehrd_(integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgejsv_(char *joba, char *jobu, char *jobv, char *jobr, char *jobt, char *jobp, integer *m, integer *n, real *a, integer *lda, real *sva, real *u, integer *ldu, real *v, integer *ldv, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgelq2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgelqf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgels_(char *trans, integer *m, integer *n, integer * nrhs, real *a, integer *lda, real *b, integer *ldb, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgelsd_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *s, real *rcond, integer * rank, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgelss_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *s, real *rcond, integer * rank, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgelsx_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, real *work, integer *info); /* Subroutine */ int _starpu_sgelsy_(integer *m, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *jpvt, real *rcond, integer *rank, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeql2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgeqlf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeqp3_(integer *m, integer *n, real *a, integer *lda, integer *jpvt, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgeqpf_(integer *m, integer *n, real *a, integer *lda, integer *jpvt, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgeqr2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgeqrf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgerfs_(char *trans, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgerq2_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sgerqf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgesc2_(integer *n, real *a, integer *lda, real *rhs, integer *ipiv, integer *jpiv, real *scale); /* Subroutine */ int _starpu_sgesdd_(char *jobz, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgesv_(integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgesvd_(char *jobu, char *jobvt, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgesvj_(char *joba, char *jobu, char *jobv, integer *m, integer *n, real *a, integer *lda, real *sva, integer *mv, real *v, integer *ldv, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgesvx_(char *fact, char *trans, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer * n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer * nparams, real *params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgetc2_(integer *n, real *a, integer *lda, integer *ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_sgetf2_(integer *m, integer *n, real *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgetrf_(integer *m, integer *n, real *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgetri_(integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgetrs_(char *trans, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, real *lscale, real *rscale, integer *m, real *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_sggbal_(char *job, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *ilo, integer *ihi, real *lscale, real *rscale, real *work, integer *info); /* Subroutine */ int _starpu_sgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *sdim, real *alphar, real *alphai, real *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real *work, integer *lwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *sdim, real *alphar, real *alphai, real *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, integer * liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sggev_(char *jobvl, char *jobvr, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *ilo, integer *ihi, real *lscale, real *rscale, real *abnrm, real *bbnrm, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_sggglm_(integer *n, integer *m, integer *p, real *a, integer *lda, real *b, integer *ldb, real *d__, real *x, real *y, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, real *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_sgglse_(integer *m, integer *n, integer *p, real *a, integer *lda, real *b, integer *ldb, real *c__, real *d__, real *x, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggqrf_(integer *n, integer *m, integer *p, real *a, integer *lda, real *taua, real *b, integer *ldb, real *taub, real * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggrqf_(integer *m, integer *p, integer *n, real *a, integer *lda, real *taua, real *b, integer *ldb, real *taub, real * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, real *a, integer *lda, real *b, integer *ldb, real *alpha, real *beta, real *u, integer * ldu, real *v, integer *ldv, real *q, integer *ldq, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, real *a, integer *lda, real *b, integer *ldb, real *tola, real *tolb, integer *k, integer *l, real *u, integer *ldu, real *v, integer *ldv, real *q, integer *ldq, integer *iwork, real * tau, real *work, integer *info); /* Subroutine */ int _starpu_sgsvj0_(char *jobv, integer *m, integer *n, real *a, integer *lda, real *d__, real *sva, integer *mv, real *v, integer * ldv, real *eps, real *sfmin, real *tol, integer *nsweep, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgsvj1_(char *jobv, integer *m, integer *n, integer *n1, real *a, integer *lda, real *d__, real *sva, integer *mv, real *v, integer *ldv, real *eps, real *sfmin, real *tol, integer *nsweep, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sgtcon_(char *norm, integer *n, real *dl, real *d__, real *du, real *du2, integer *ipiv, real *anorm, real *rcond, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgtrfs_(char *trans, integer *n, integer *nrhs, real *dl, real *d__, real *du, real *dlf, real *df, real *duf, real *du2, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real * ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgtsv_(integer *n, integer *nrhs, real *dl, real *d__, real *du, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, real *dl, real *d__, real *du, real *dlf, real *df, real *duf, real *du2, integer *ipiv, real *b, integer *ldb, real *x, integer * ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sgttrf_(integer *n, real *dl, real *d__, real *du, real * du2, integer *ipiv, integer *info); /* Subroutine */ int _starpu_sgttrs_(char *trans, integer *n, integer *nrhs, real *dl, real *d__, real *du, real *du2, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sgtts2_(integer *itrans, integer *n, integer *nrhs, real *dl, real *d__, real *du, real *du2, integer *ipiv, real *b, integer * ldb); /* Subroutine */ int _starpu_shgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *t, integer *ldt, real *alphar, real *alphai, real *beta, real *q, integer *ldq, real *z__, integer *ldz, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_shsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, real *h__, integer *ldh, real *wr, real *wi, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real *work, integer *ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_shseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real *wi, real *z__, integer *ldz, real *work, integer *lwork, integer *info); logical _starpu_sisnan_(real *sin__); /* Subroutine */ int _starpu_sla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, real *alpha, real *ab, integer *ldab, real * x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_sla_gbrcond__(char *trans, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, integer *cmode, real *c__, integer *info, real *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_sla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, integer *ipiv, logical *colequ, real *c__, real *b, integer *ldb, real *y, integer * ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real * errs_c__, real *res, real *ayb, real *dy, real *y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical * ignore_cwise__, integer *info); doublereal _starpu_sla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, real *ab, integer *ldab, real *afb, integer *ldafb); /* Subroutine */ int _starpu_sla_geamv__(integer *trans, integer *m, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_sla_gercond__(char *trans, integer *n, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, integer *cmode, real *c__, integer *info, real *work, integer *iwork, ftnlen trans_len); /* Subroutine */ int _starpu_sla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, real *a, integer *lda, real * af, integer *ldaf, integer *ipiv, logical *colequ, real *c__, real *b, integer *ldb, real *y, integer *ldy, real *berr_out__, integer * n_norms__, real *errs_n__, real *errs_c__, real *res, real *ayb, real *dy, real *y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info); /* Subroutine */ int _starpu_sla_lin_berr__(integer *n, integer *nz, integer *nrhs, real *res, real *ayb, real *berr); doublereal _starpu_sla_porcond__(char *uplo, integer *n, real *a, integer *lda, real * af, integer *ldaf, integer *cmode, real *c__, integer *info, real * work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_sla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer * ldaf, logical *colequ, real *c__, real *b, integer *ldb, real *y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, real *res, real *ayb, real *dy, real *y_tail__, real * rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_sla_porpvgrw__(char *uplo, integer *ncols, real *a, integer *lda, real *af, integer *ldaf, real *work, ftnlen uplo_len); doublereal _starpu_sla_rpvgrw__(integer *n, integer *ncols, real *a, integer *lda, real *af, integer *ldaf); /* Subroutine */ int _starpu_sla_syamv__(integer *uplo, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy); doublereal _starpu_sla_syrcond__(char *uplo, integer *n, real *a, integer *lda, real * af, integer *ldaf, integer *ipiv, integer *cmode, real *c__, integer * info, real *work, integer *iwork, ftnlen uplo_len); /* Subroutine */ int _starpu_sla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer * ldaf, integer *ipiv, logical *colequ, real *c__, real *b, integer * ldb, real *y, integer *ldy, real *berr_out__, integer *n_norms__, real *errs_n__, real *errs_c__, real *res, real *ayb, real *dy, real * y_tail__, real *rcond, integer *ithresh, real *rthresh, real *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_sla_syrpvgrw__(char *uplo, integer *n, integer *info, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *work, ftnlen uplo_len); /* Subroutine */ int _starpu_sla_wwaddw__(integer *n, real *x, real *y, real *w); /* Subroutine */ int _starpu_slabad_(real *small, real *large); /* Subroutine */ int _starpu_slabrd_(integer *m, integer *n, integer *nb, real *a, integer *lda, real *d__, real *e, real *tauq, real *taup, real *x, integer *ldx, real *y, integer *ldy); /* Subroutine */ int _starpu_slacn2_(integer *n, real *v, real *x, integer *isgn, real *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_slacon_(integer *n, real *v, real *x, integer *isgn, real *est, integer *kase); /* Subroutine */ int _starpu_slacpy_(char *uplo, integer *m, integer *n, real *a, integer *lda, real *b, integer *ldb); /* Subroutine */ int _starpu_sladiv_(real *a, real *b, real *c__, real *d__, real *p, real *q); /* Subroutine */ int _starpu_slae2_(real *a, real *b, real *c__, real *rt1, real *rt2); /* Subroutine */ int _starpu_slaebz_(integer *ijob, integer *nitmax, integer *n, integer *mmax, integer *minp, integer *nbmin, real *abstol, real * reltol, real *pivmin, real *d__, real *e, real *e2, integer *nval, real *ab, real *c__, integer *mout, integer *nab, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slaed0_(integer *icompq, integer *qsiz, integer *n, real *d__, real *e, real *q, integer *ldq, real *qstore, integer *ldqs, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slaed1_(integer *n, real *d__, real *q, integer *ldq, integer *indxq, real *rho, integer *cutpnt, real *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_slaed2_(integer *k, integer *n, integer *n1, real *d__, real *q, integer *ldq, integer *indxq, real *rho, real *z__, real * dlamda, real *w, real *q2, integer *indx, integer *indxc, integer * indxp, integer *coltyp, integer *info); /* Subroutine */ int _starpu_slaed3_(integer *k, integer *n, integer *n1, real *d__, real *q, integer *ldq, real *rho, real *dlamda, real *q2, integer * indx, integer *ctot, real *w, real *s, integer *info); /* Subroutine */ int _starpu_slaed4_(integer *n, integer *i__, real *d__, real *z__, real *delta, real *rho, real *dlam, integer *info); /* Subroutine */ int _starpu_slaed5_(integer *i__, real *d__, real *z__, real *delta, real *rho, real *dlam); /* Subroutine */ int _starpu_slaed6_(integer *kniter, logical *orgati, real *rho, real *d__, real *z__, real *finit, real *tau, integer *info); /* Subroutine */ int _starpu_slaed7_(integer *icompq, integer *n, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, real *d__, real *q, integer *ldq, integer *indxq, real *rho, integer *cutpnt, real * qstore, integer *qptr, integer *prmptr, integer *perm, integer * givptr, integer *givcol, real *givnum, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slaed8_(integer *icompq, integer *k, integer *n, integer *qsiz, real *d__, real *q, integer *ldq, integer *indxq, real *rho, integer *cutpnt, real *z__, real *dlamda, real *q2, integer *ldq2, real *w, integer *perm, integer *givptr, integer *givcol, real * givnum, integer *indxp, integer *indx, integer *info); /* Subroutine */ int _starpu_slaed9_(integer *k, integer *kstart, integer *kstop, integer *n, real *d__, real *q, integer *ldq, real *rho, real *dlamda, real *w, real *s, integer *lds, integer *info); /* Subroutine */ int _starpu_slaeda_(integer *n, integer *tlvls, integer *curlvl, integer *curpbm, integer *prmptr, integer *perm, integer *givptr, integer *givcol, real *givnum, real *q, integer *qptr, real *z__, real *ztemp, integer *info); /* Subroutine */ int _starpu_slaein_(logical *rightv, logical *noinit, integer *n, real *h__, integer *ldh, real *wr, real *wi, real *vr, real *vi, real *b, integer *ldb, real *work, real *eps3, real *smlnum, real *bignum, integer *info); /* Subroutine */ int _starpu_slaev2_(real *a, real *b, real *c__, real *rt1, real * rt2, real *cs1, real *sn1); /* Subroutine */ int _starpu_slaexc_(logical *wantq, integer *n, real *t, integer * ldt, real *q, integer *ldq, integer *j1, integer *n1, integer *n2, real *work, integer *info); /* Subroutine */ int _starpu_slag2_(real *a, integer *lda, real *b, integer *ldb, real *safmin, real *scale1, real *scale2, real *wr1, real *wr2, real * wi); /* Subroutine */ int _starpu_slag2d_(integer *m, integer *n, real *sa, integer *ldsa, doublereal *a, integer *lda, integer *info); /* Subroutine */ int _starpu_slags2_(logical *upper, real *a1, real *a2, real *a3, real *b1, real *b2, real *b3, real *csu, real *snu, real *csv, real * snv, real *csq, real *snq); /* Subroutine */ int _starpu_slagtf_(integer *n, real *a, real *lambda, real *b, real *c__, real *tol, real *d__, integer *in, integer *info); /* Subroutine */ int _starpu_slagtm_(char *trans, integer *n, integer *nrhs, real * alpha, real *dl, real *d__, real *du, real *x, integer *ldx, real * beta, real *b, integer *ldb); /* Subroutine */ int _starpu_slagts_(integer *job, integer *n, real *a, real *b, real *c__, real *d__, integer *in, real *y, real *tol, integer *info); /* Subroutine */ int _starpu_slagv2_(real *a, integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real *beta, real *csl, real *snl, real * csr, real *snr); /* Subroutine */ int _starpu_slahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer * info); /* Subroutine */ int _starpu_slahr2_(integer *n, integer *k, integer *nb, real *a, integer *lda, real *tau, real *t, integer *ldt, real *y, integer *ldy); /* Subroutine */ int _starpu_slahrd_(integer *n, integer *k, integer *nb, real *a, integer *lda, real *tau, real *t, integer *ldt, real *y, integer *ldy); /* Subroutine */ int _starpu_slaic1_(integer *job, integer *j, real *x, real *sest, real *w, real *gamma, real *sestpr, real *s, real *c__); logical _starpu_slaisnan_(real *sin1, real *sin2); /* Subroutine */ int _starpu_slaln2_(logical *ltrans, integer *na, integer *nw, real * smin, real *ca, real *a, integer *lda, real *d1, real *d2, real *b, integer *ldb, real *wr, real *wi, real *x, integer *ldx, real *scale, real *xnorm, integer *info); /* Subroutine */ int _starpu_slals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, real *b, integer *ldb, real *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * difl, real *difr, real *z__, integer *k, real *c__, real *s, real * work, integer *info); /* Subroutine */ int _starpu_slalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, real *b, integer *ldb, real *bx, integer *ldbx, real * u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real * z__, real *poles, integer *givptr, integer *givcol, integer *ldgcol, integer *perm, real *givnum, real *c__, real *s, real *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_slalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb, real *rcond, integer *rank, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slamrg_(integer *n1, integer *n2, real *a, integer * strd1, integer *strd2, integer *index); integer _starpu_slaneg_(integer *n, real *d__, real *lld, real *sigma, real *pivmin, integer *r__); doublereal _starpu_slangb_(char *norm, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *work); doublereal _starpu_slange_(char *norm, integer *m, integer *n, real *a, integer *lda, real *work); doublereal _starpu_slangt_(char *norm, integer *n, real *dl, real *d__, real *du); doublereal _starpu_slanhs_(char *norm, integer *n, real *a, integer *lda, real *work); doublereal _starpu_slansb_(char *norm, char *uplo, integer *n, integer *k, real *ab, integer *ldab, real *work); doublereal _starpu_slansf_(char *norm, char *transr, char *uplo, integer *n, real *a, real *work); doublereal _starpu_slansp_(char *norm, char *uplo, integer *n, real *ap, real *work); doublereal _starpu_slanst_(char *norm, integer *n, real *d__, real *e); doublereal _starpu_slansy_(char *norm, char *uplo, integer *n, real *a, integer *lda, real *work); doublereal _starpu_slantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, real *ab, integer *ldab, real *work); doublereal _starpu_slantp_(char *norm, char *uplo, char *diag, integer *n, real *ap, real *work); doublereal _starpu_slantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, real *a, integer *lda, real *work); /* Subroutine */ int _starpu_slanv2_(real *a, real *b, real *c__, real *d__, real * rt1r, real *rt1i, real *rt2r, real *rt2i, real *cs, real *sn); /* Subroutine */ int _starpu_slapll_(integer *n, real *x, integer *incx, real *y, integer *incy, real *ssmin); /* Subroutine */ int _starpu_slapmt_(logical *forwrd, integer *m, integer *n, real *x, integer *ldx, integer *k); doublereal _starpu_slapy2_(real *x, real *y); doublereal _starpu_slapy3_(real *x, real *y, real *z__); /* Subroutine */ int _starpu_slaqgb_(integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real * colcnd, real *amax, char *equed); /* Subroutine */ int _starpu_slaqge_(integer *m, integer *n, real *a, integer *lda, real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * equed); /* Subroutine */ int _starpu_slaqp2_(integer *m, integer *n, integer *offset, real *a, integer *lda, integer *jpvt, real *tau, real *vn1, real *vn2, real * work); /* Subroutine */ int _starpu_slaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, real *a, integer *lda, integer *jpvt, real *tau, real *vn1, real *vn2, real *auxv, real *f, integer *ldf); /* Subroutine */ int _starpu_slaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_slaqr1_(integer *n, real *h__, integer *ldh, real *sr1, real *si1, real *sr2, real *si2, real *v); /* Subroutine */ int _starpu_slaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, real *h__, integer *ldh, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer *ns, integer *nd, real *sr, real *si, real *v, integer *ldv, integer *nh, real *t, integer *ldt, integer *nv, real *wv, integer *ldwv, real * work, integer *lwork); /* Subroutine */ int _starpu_slaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, real *h__, integer *ldh, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer *ns, integer *nd, real *sr, real *si, real *v, integer *ldv, integer *nh, real *t, integer *ldt, integer *nv, real *wv, integer *ldwv, real * work, integer *lwork); /* Subroutine */ int _starpu_slaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_slaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, real *sr, real *si, real *h__, integer *ldh, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *v, integer *ldv, real *u, integer *ldu, integer *nv, real *wv, integer *ldwv, integer *nh, real *wh, integer * ldwh); /* Subroutine */ int _starpu_slaqsb_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_slaqsp_(char *uplo, integer *n, real *ap, real *s, real * scond, real *amax, char *equed); /* Subroutine */ int _starpu_slaqsy_(char *uplo, integer *n, real *a, integer *lda, real *s, real *scond, real *amax, char *equed); /* Subroutine */ int _starpu_slaqtr_(logical *ltran, logical *lreal, integer *n, real *t, integer *ldt, real *b, real *w, real *scale, real *x, real *work, integer *info); /* Subroutine */ int _starpu_slar1v_(integer *n, integer *b1, integer *bn, real * lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * gaptol, real *z__, logical *wantnc, integer *negcnt, real *ztz, real * mingma, integer *r__, integer *isuppz, real *nrminv, real *resid, real *rqcorr, real *work); /* Subroutine */ int _starpu_slar2v_(integer *n, real *x, real *y, real *z__, integer *incx, real *c__, real *s, integer *incc); /* Subroutine */ int _starpu_slarf_(char *side, integer *m, integer *n, real *v, integer *incv, real *tau, real *c__, integer *ldc, real *work); /* Subroutine */ int _starpu_slarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, real *v, integer *ldv, real *t, integer *ldt, real *c__, integer *ldc, real *work, integer * ldwork); /* Subroutine */ int _starpu_slarfg_(integer *n, real *alpha, real *x, integer *incx, real *tau); /* Subroutine */ int _starpu_slarfp_(integer *n, real *alpha, real *x, integer *incx, real *tau); /* Subroutine */ int _starpu_slarft_(char *direct, char *storev, integer *n, integer * k, real *v, integer *ldv, real *tau, real *t, integer *ldt); /* Subroutine */ int _starpu_slarfx_(char *side, integer *m, integer *n, real *v, real *tau, real *c__, integer *ldc, real *work); /* Subroutine */ int _starpu_slargv_(integer *n, real *x, integer *incx, real *y, integer *incy, real *c__, integer *incc); /* Subroutine */ int _starpu_slarnv_(integer *idist, integer *iseed, integer *n, real *x); /* Subroutine */ int _starpu_slarra_(integer *n, real *d__, real *e, real *e2, real * spltol, real *tnrm, integer *nsplit, integer *isplit, integer *info); /* Subroutine */ int _starpu_slarrb_(integer *n, real *d__, real *lld, integer * ifirst, integer *ilast, real *rtol1, real *rtol2, integer *offset, real *w, real *wgap, real *werr, real *work, integer *iwork, real * pivmin, real *spdiam, integer *twist, integer *info); /* Subroutine */ int _starpu_slarrc_(char *jobt, integer *n, real *vl, real *vu, real *d__, real *e, real *pivmin, integer *eigcnt, integer *lcnt, integer * rcnt, integer *info); /* Subroutine */ int _starpu_slarrd_(char *range, char *order, integer *n, real *vl, real *vu, integer *il, integer *iu, real *gers, real *reltol, real * d__, real *e, real *e2, real *pivmin, integer *nsplit, integer * isplit, integer *m, real *w, real *werr, real *wl, real *wu, integer * iblock, integer *indexw, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slarre_(char *range, integer *n, real *vl, real *vu, integer *il, integer *iu, real *d__, real *e, real *e2, real *rtol1, real *rtol2, real *spltol, integer *nsplit, integer *isplit, integer * m, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, real *gers, real *pivmin, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slarrf_(integer *n, real *d__, real *l, real *ld, integer *clstrt, integer *clend, real *w, real *wgap, real *werr, real *spdiam, real *clgapl, real *clgapr, real *pivmin, real *sigma, real *dplus, real *lplus, real *work, integer *info); /* Subroutine */ int _starpu_slarrj_(integer *n, real *d__, real *e2, integer *ifirst, integer *ilast, real *rtol, integer *offset, real *w, real *werr, real *work, integer *iwork, real *pivmin, real *spdiam, integer *info); /* Subroutine */ int _starpu_slarrk_(integer *n, integer *iw, real *gl, real *gu, real *d__, real *e2, real *pivmin, real *reltol, real *w, real *werr, integer *info); /* Subroutine */ int _starpu_slarrr_(integer *n, real *d__, real *e, integer *info); /* Subroutine */ int _starpu_slarrv_(integer *n, real *vl, real *vu, real *d__, real * l, real *pivmin, integer *isplit, integer *m, integer *dol, integer * dou, real *minrgp, real *rtol1, real *rtol2, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, real *gers, real *z__, integer *ldz, integer *isuppz, real *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_slarscl2_(integer *m, integer *n, real *d__, real *x, integer *ldx); /* Subroutine */ int _starpu_slartg_(real *f, real *g, real *cs, real *sn, real *r__); /* Subroutine */ int _starpu_slartv_(integer *n, real *x, integer *incx, real *y, integer *incy, real *c__, real *s, integer *incc); /* Subroutine */ int _starpu_slaruv_(integer *iseed, integer *n, real *x); /* Subroutine */ int _starpu_slarz_(char *side, integer *m, integer *n, integer *l, real *v, integer *incv, real *tau, real *c__, integer *ldc, real * work); /* Subroutine */ int _starpu_slarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, real *v, integer *ldv, real *t, integer *ldt, real *c__, integer *ldc, real * work, integer *ldwork); /* Subroutine */ int _starpu_slarzt_(char *direct, char *storev, integer *n, integer * k, real *v, integer *ldv, real *tau, real *t, integer *ldt); /* Subroutine */ int _starpu_slas2_(real *f, real *g, real *h__, real *ssmin, real * ssmax); /* Subroutine */ int _starpu_slascl_(char *type__, integer *kl, integer *ku, real * cfrom, real *cto, integer *m, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_slascl2_(integer *m, integer *n, real *d__, real *x, integer *ldx); /* Subroutine */ int _starpu_slasd0_(integer *n, integer *sqre, real *d__, real *e, real *u, integer *ldu, real *vt, integer *ldvt, integer *smlsiz, integer *iwork, real *work, integer *info); /* Subroutine */ int _starpu_slasd1_(integer *nl, integer *nr, integer *sqre, real * d__, real *alpha, real *beta, real *u, integer *ldu, real *vt, integer *ldvt, integer *idxq, integer *iwork, real *work, integer * info); /* Subroutine */ int _starpu_slasd2_(integer *nl, integer *nr, integer *sqre, integer *k, real *d__, real *z__, real *alpha, real *beta, real *u, integer * ldu, real *vt, integer *ldvt, real *dsigma, real *u2, integer *ldu2, real *vt2, integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer *idxq, integer *coltyp, integer *info); /* Subroutine */ int _starpu_slasd3_(integer *nl, integer *nr, integer *sqre, integer *k, real *d__, real *q, integer *ldq, real *dsigma, real *u, integer * ldu, real *u2, integer *ldu2, real *vt, integer *ldvt, real *vt2, integer *ldvt2, integer *idxc, integer *ctot, real *z__, integer * info); /* Subroutine */ int _starpu_slasd4_(integer *n, integer *i__, real *d__, real *z__, real *delta, real *rho, real *sigma, real *work, integer *info); /* Subroutine */ int _starpu_slasd5_(integer *i__, real *d__, real *z__, real *delta, real *rho, real *dsigma, real *work); /* Subroutine */ int _starpu_slasd6_(integer *icompq, integer *nl, integer *nr, integer *sqre, real *d__, real *vf, real *vl, real *alpha, real *beta, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * difl, real *difr, real *z__, integer *k, real *c__, real *s, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slasd7_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *k, real *d__, real *z__, real *zw, real *vf, real *vfw, real *vl, real *vlw, real *alpha, real *beta, real *dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, integer * givptr, integer *givcol, integer *ldgcol, real *givnum, integer * ldgnum, real *c__, real *s, integer *info); /* Subroutine */ int _starpu_slasd8_(integer *icompq, integer *k, real *d__, real * z__, real *vf, real *vl, real *difl, real *difr, integer *lddifr, real *dsigma, real *work, integer *info); /* Subroutine */ int _starpu_slasda_(integer *icompq, integer *smlsiz, integer *n, integer *sqre, real *d__, real *e, real *u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real *z__, real *poles, integer * givptr, integer *givcol, integer *ldgcol, integer *perm, real *givnum, real *c__, real *s, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_slasdq_(char *uplo, integer *sqre, integer *n, integer * ncvt, integer *nru, integer *ncc, real *d__, real *e, real *vt, integer *ldvt, real *u, integer *ldu, real *c__, integer *ldc, real * work, integer *info); /* Subroutine */ int _starpu_slasdt_(integer *n, integer *lvl, integer *nd, integer * inode, integer *ndiml, integer *ndimr, integer *msub); /* Subroutine */ int _starpu_slaset_(char *uplo, integer *m, integer *n, real *alpha, real *beta, real *a, integer *lda); /* Subroutine */ int _starpu_slasq1_(integer *n, real *d__, real *e, real *work, integer *info); /* Subroutine */ int _starpu_slasq2_(integer *n, real *z__, integer *info); /* Subroutine */ int _starpu_slasq3_(integer *i0, integer *n0, real *z__, integer *pp, real *dmin__, real *sigma, real *desig, real *qmax, integer *nfail, integer *iter, integer *ndiv, logical *ieee, integer *ttype, real * dmin1, real *dmin2, real *dn, real *dn1, real *dn2, real *g, real * tau); /* Subroutine */ int _starpu_slasq4_(integer *i0, integer *n0, real *z__, integer *pp, integer *n0in, real *dmin__, real *dmin1, real *dmin2, real *dn, real *dn1, real *dn2, real *tau, integer *ttype, real *g); /* Subroutine */ int _starpu_slasq5_(integer *i0, integer *n0, real *z__, integer *pp, real *tau, real *dmin__, real *dmin1, real *dmin2, real *dn, real * dnm1, real *dnm2, logical *ieee); /* Subroutine */ int _starpu_slasq6_(integer *i0, integer *n0, real *z__, integer *pp, real *dmin__, real *dmin1, real *dmin2, real *dn, real *dnm1, real * dnm2); /* Subroutine */ int _starpu_slasr_(char *side, char *pivot, char *direct, integer *m, integer *n, real *c__, real *s, real *a, integer *lda); /* Subroutine */ int _starpu_slasrt_(char *id, integer *n, real *d__, integer *info); /* Subroutine */ int _starpu_slassq_(integer *n, real *x, integer *incx, real *scale, real *sumsq); /* Subroutine */ int _starpu_slasv2_(real *f, real *g, real *h__, real *ssmin, real * ssmax, real *snr, real *csr, real *snl, real *csl); /* Subroutine */ int _starpu_slaswp_(integer *n, real *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_slasy2_(logical *ltranl, logical *ltranr, integer *isgn, integer *n1, integer *n2, real *tl, integer *ldtl, real *tr, integer * ldtr, real *b, integer *ldb, real *scale, real *x, integer *ldx, real *xnorm, integer *info); /* Subroutine */ int _starpu_slasyf_(char *uplo, integer *n, integer *nb, integer *kb, real *a, integer *lda, integer *ipiv, real *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_slatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, real *ab, integer *ldab, real *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_slatdf_(integer *ijob, integer *n, real *z__, integer * ldz, real *rhs, real *rdsum, real *rdscal, integer *ipiv, integer * jpiv); /* Subroutine */ int _starpu_slatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, real *ap, real *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_slatrd_(char *uplo, integer *n, integer *nb, real *a, integer *lda, real *e, real *tau, real *w, integer *ldw); /* Subroutine */ int _starpu_slatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, real *a, integer *lda, real *x, real *scale, real *cnorm, integer *info); /* Subroutine */ int _starpu_slatrz_(integer *m, integer *n, integer *l, real *a, integer *lda, real *tau, real *work); /* Subroutine */ int _starpu_slatzm_(char *side, integer *m, integer *n, real *v, integer *incv, real *tau, real *c1, real *c2, integer *ldc, real * work); /* Subroutine */ int _starpu_slauu2_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_slauum_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_sopgtr_(char *uplo, integer *n, real *ap, real *tau, real *q, integer *ldq, real *work, integer *info); /* Subroutine */ int _starpu_sopmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, real *ap, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sorg2l_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorg2r_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorgbr_(char *vect, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorghr_(integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgl2_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorglq_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgql_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgqr_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgr2_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *info); /* Subroutine */ int _starpu_sorgrq_(integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorgtr_(char *uplo, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorm2l_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real * c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sorml2_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormlq_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormql_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormqr_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormr2_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *info); /* Subroutine */ int _starpu_sormrq_(char *side, char *trans, integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_sormtr_(char *side, char *uplo, char *trans, integer *m, integer *n, real *a, integer *lda, real *tau, real *c__, integer *ldc, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_spbcon_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spbequ_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_spbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spbstf_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_spbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spbtf2_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_spbtrf_(char *uplo, integer *n, integer *kd, real *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_spbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spftrf_(char *transr, char *uplo, integer *n, real *a, integer *info); /* Subroutine */ int _starpu_spftri_(char *transr, char *uplo, integer *n, real *a, integer *info); /* Subroutine */ int _starpu_spftrs_(char *transr, char *uplo, integer *n, integer * nrhs, real *a, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spocon_(char *uplo, integer *n, real *a, integer *lda, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spoequ_(integer *n, real *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_spoequb_(integer *n, real *a, integer *lda, real *s, real *scond, real *amax, integer *info); /* Subroutine */ int _starpu_sporfs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer *ldaf, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, real *s, real * b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real *params, real *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_sposv_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sposvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spotf2_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_spotrf_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_spotri_(char *uplo, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_spotrs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sppcon_(char *uplo, integer *n, real *ap, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sppequ_(char *uplo, integer *n, real *ap, real *s, real * scond, real *amax, integer *info); /* Subroutine */ int _starpu_spprfs_(char *uplo, integer *n, integer *nrhs, real *ap, real *afp, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sppsv_(char *uplo, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *ap, real *afp, char *equed, real *s, real *b, integer * ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_spptrf_(char *uplo, integer *n, real *ap, integer *info); /* Subroutine */ int _starpu_spptri_(char *uplo, integer *n, real *ap, integer *info); /* Subroutine */ int _starpu_spptrs_(char *uplo, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_spstf2_(char *uplo, integer *n, real *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_spstrf_(char *uplo, integer *n, real *a, integer *lda, integer *piv, integer *rank, real *tol, real *work, integer *info); /* Subroutine */ int _starpu_sptcon_(integer *n, real *d__, real *e, real *anorm, real *rcond, real *work, integer *info); /* Subroutine */ int _starpu_spteqr_(char *compz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sptrfs_(integer *n, integer *nrhs, real *d__, real *e, real *df, real *ef, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *info); /* Subroutine */ int _starpu_sptsv_(integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sptsvx_(char *fact, integer *n, integer *nrhs, real *d__, real *e, real *df, real *ef, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *info); /* Subroutine */ int _starpu_spttrf_(integer *n, real *d__, real *e, integer *info); /* Subroutine */ int _starpu_spttrs_(integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sptts2_(integer *n, integer *nrhs, real *d__, real *e, real *b, integer *ldb); /* Subroutine */ int _starpu_srscl_(integer *n, real *sa, real *sx, integer *incx); /* Subroutine */ int _starpu_ssbev_(char *jobz, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_ssbevd_(char *jobz, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real * w, real *z__, integer *ldz, real *work, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_ssbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * x, integer *ldx, real *work, integer *info); /* Subroutine */ int _starpu_ssbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_ssbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * w, real *z__, integer *ldz, real *work, integer *lwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer * ldbb, real *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssbtrd_(char *vect, char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *d__, real *e, real *q, integer *ldq, real *work, integer *info); /* Subroutine */ int _starpu_ssfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, real *alpha, real *a, integer *lda, real *beta, real * c__); /* Subroutine */ int _starpu_sspcon_(char *uplo, integer *n, real *ap, integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sspev_(char *jobz, char *uplo, integer *n, real *ap, real *w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sspevd_(char *jobz, char *uplo, integer *n, real *ap, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sspevx_(char *jobz, char *range, char *uplo, integer *n, real *ap, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer * iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_sspgst_(integer *itype, char *uplo, integer *n, real *ap, real *bp, integer *info); /* Subroutine */ int _starpu_sspgv_(integer *itype, char *jobz, char *uplo, integer * n, real *ap, real *bp, real *w, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sspgvd_(integer *itype, char *jobz, char *uplo, integer * n, real *ap, real *bp, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sspgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, real *ap, real *bp, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer * ldz, real *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssprfs_(char *uplo, integer *n, integer *nrhs, real *ap, real *afp, integer *ipiv, real *b, integer *ldb, real *x, integer * ldx, real *ferr, real *berr, real *work, integer *iwork, integer * info); /* Subroutine */ int _starpu_sspsv_(char *uplo, integer *n, integer *nrhs, real *ap, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *ap, real *afp, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssptrd_(char *uplo, integer *n, real *ap, real *d__, real *e, real *tau, integer *info); /* Subroutine */ int _starpu_ssptrf_(char *uplo, integer *n, real *ap, integer *ipiv, integer *info); /* Subroutine */ int _starpu_ssptri_(char *uplo, integer *n, real *ap, integer *ipiv, real *work, integer *info); /* Subroutine */ int _starpu_ssptrs_(char *uplo, integer *n, integer *nrhs, real *ap, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_sstebz_(char *range, char *order, integer *n, real *vl, real *vu, integer *il, integer *iu, real *abstol, real *d__, real *e, integer *m, integer *nsplit, real *w, integer *iblock, integer * isplit, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_sstedc_(char *compz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstegr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, integer *isuppz, real * work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstein_(integer *n, real *d__, real *e, integer *m, real *w, integer *iblock, integer *isplit, real *z__, integer *ldz, real * work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_sstemr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, integer *m, real *w, real *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, real *work, integer *lwork, integer *iwork, integer * liwork, integer *info); /* Subroutine */ int _starpu_ssteqr_(char *compz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_ssterf_(integer *n, real *d__, real *e, integer *info); /* Subroutine */ int _starpu_sstev_(char *jobz, integer *n, real *d__, real *e, real * z__, integer *ldz, real *work, integer *info); /* Subroutine */ int _starpu_sstevd_(char *jobz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstevr_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, integer *isuppz, real * work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_sstevx_(char *jobz, char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer * iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssycon_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssyequb_(char *uplo, integer *n, real *a, integer *lda, real *s, real *scond, real *amax, real *work, integer *info); /* Subroutine */ int _starpu_ssyev_(char *jobz, char *uplo, integer *n, real *a, integer *lda, real *w, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssyevd_(char *jobz, char *uplo, integer *n, real *a, integer *lda, real *w, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssyevr_(char *jobz, char *range, char *uplo, integer *n, real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, integer * isuppz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssyevx_(char *jobz, char *range, char *uplo, integer *n, real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real * work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssygs2_(integer *itype, char *uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ssygst_(integer *itype, char *uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ssygv_(integer *itype, char *jobz, char *uplo, integer * n, real *a, integer *lda, real *b, integer *ldb, real *w, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssygvd_(integer *itype, char *jobz, char *uplo, integer * n, real *a, integer *lda, real *b, integer *ldb, real *w, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ssygvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, real * vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_ssyrfs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *berr, integer *n_err_bnds__, real *err_bnds_norm__, real * err_bnds_comp__, integer *nparams, real *params, real *work, integer * iwork, integer *info); /* Subroutine */ int _starpu_ssysv_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssysvx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, integer *lwork, integer *iwork, integer * info); /* Subroutine */ int _starpu_ssysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *rpvgrw, real *berr, integer *n_err_bnds__, real * err_bnds_norm__, real *err_bnds_comp__, integer *nparams, real * params, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_ssytd2_(char *uplo, integer *n, real *a, integer *lda, real *d__, real *e, real *tau, integer *info); /* Subroutine */ int _starpu_ssytf2_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_ssytrd_(char *uplo, integer *n, real *a, integer *lda, real *d__, real *e, real *tau, real *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_ssytrf_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ssytri_(char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *info); /* Subroutine */ int _starpu_ssytrs_(char *uplo, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_stbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, real *ab, integer *ldab, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_stfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, real *alpha, real *a, real *b, integer *ldb); /* Subroutine */ int _starpu_stftri_(char *transr, char *uplo, char *diag, integer *n, real *a, integer *info); /* Subroutine */ int _starpu_stfttp_(char *transr, char *uplo, integer *n, real *arf, real *ap, integer *info); /* Subroutine */ int _starpu_stfttr_(char *transr, char *uplo, integer *n, real *arf, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_stgevc_(char *side, char *howmny, logical *select, integer *n, real *s, integer *lds, real *p, integer *ldp, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real *work, integer *info); /* Subroutine */ int _starpu_stgex2_(logical *wantq, logical *wantz, integer *n, real *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real * z__, integer *ldz, integer *j1, integer *n1, integer *n2, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_stgexc_(logical *wantq, logical *wantz, integer *n, real *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real * z__, integer *ldz, integer *ifst, integer *ilst, real *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_stgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, real *a, integer *lda, real *b, integer * ldb, real *alphar, real *alphai, real *beta, real *q, integer *ldq, real *z__, integer *ldz, integer *m, real *pl, real *pr, real *dif, real *work, integer *lwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_stgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, real *a, integer *lda, real *b, integer *ldb, real *tola, real *tolb, real *alpha, real * beta, real *u, integer *ldu, real *v, integer *ldv, real *q, integer * ldq, real *work, integer *ncycle, integer *info); /* Subroutine */ int _starpu_stgsna_(char *job, char *howmny, logical *select, integer *n, real *a, integer *lda, real *b, integer *ldb, real *vl, integer *ldvl, real *vr, integer *ldvr, real *s, real *dif, integer * mm, integer *m, real *work, integer *lwork, integer *iwork, integer * info); /* Subroutine */ int _starpu_stgsy2_(char *trans, integer *ijob, integer *m, integer * n, real *a, integer *lda, real *b, integer *ldb, real *c__, integer * ldc, real *d__, integer *ldd, real *e, integer *lde, real *f, integer *ldf, real *scale, real *rdsum, real *rdscal, integer *iwork, integer *pq, integer *info); /* Subroutine */ int _starpu_stgsyl_(char *trans, integer *ijob, integer *m, integer * n, real *a, integer *lda, real *b, integer *ldb, real *c__, integer * ldc, real *d__, integer *ldd, real *e, integer *lde, real *f, integer *ldf, real *scale, real *dif, real *work, integer *lwork, integer * iwork, integer *info); /* Subroutine */ int _starpu_stpcon_(char *norm, char *uplo, char *diag, integer *n, real *ap, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_stptri_(char *uplo, char *diag, integer *n, real *ap, integer *info); /* Subroutine */ int _starpu_stptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *ap, real *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_stpttf_(char *transr, char *uplo, integer *n, real *ap, real *arf, integer *info); /* Subroutine */ int _starpu_stpttr_(char *uplo, integer *n, real *ap, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_strcon_(char *norm, char *uplo, char *diag, integer *n, real *a, integer *lda, real *rcond, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_strevc_(char *side, char *howmny, logical *select, integer *n, real *t, integer *ldt, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real *work, integer *info); /* Subroutine */ int _starpu_strexc_(char *compq, integer *n, real *t, integer *ldt, real *q, integer *ldq, integer *ifst, integer *ilst, real *work, integer *info); /* Subroutine */ int _starpu_strrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_strsen_(char *job, char *compq, logical *select, integer *n, real *t, integer *ldt, real *q, integer *ldq, real *wr, real *wi, integer *m, real *s, real *sep, real *work, integer *lwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_strsna_(char *job, char *howmny, logical *select, integer *n, real *t, integer *ldt, real *vl, integer *ldvl, real *vr, integer *ldvr, real *s, real *sep, integer *mm, integer *m, real * work, integer *ldwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_strsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, real *a, integer *lda, real *b, integer *ldb, real * c__, integer *ldc, real *scale, integer *info); /* Subroutine */ int _starpu_strti2_(char *uplo, char *diag, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_strtri_(char *uplo, char *diag, integer *n, real *a, integer *lda, integer *info); /* Subroutine */ int _starpu_strtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_strttf_(char *transr, char *uplo, integer *n, real *a, integer *lda, real *arf, integer *info); /* Subroutine */ int _starpu_strttp_(char *uplo, integer *n, real *a, integer *lda, real *ap, integer *info); /* Subroutine */ int _starpu_stzrqf_(integer *m, integer *n, real *a, integer *lda, real *tau, integer *info); /* Subroutine */ int _starpu_stzrzf_(integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info); /* Subroutine */ int _starpu_xerbla_array__(char *srname_array__, integer * srname_len__, integer *info, ftnlen srname_array_len); /* Subroutine */ int _starpu_zbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, doublereal *d__, doublereal *e, doublecomplex *vt, integer *ldvt, doublecomplex *u, integer *ldu, doublecomplex *c__, integer *ldc, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zcgesv_(integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublecomplex *work, complex *swork, doublereal *rwork, integer *iter, integer *info); /* Subroutine */ int _starpu_zcposv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublecomplex *work, complex *swork, doublereal *rwork, integer *iter, integer *info); /* Subroutine */ int _starpu_zdrscl_(integer *n, doublereal *sa, doublecomplex *sx, integer *incx); /* Subroutine */ int _starpu_zgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *pt, integer *ldpt, doublecomplex *c__, integer *ldc, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbcon_(char *norm, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zgbequ_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info); /* Subroutine */ int _starpu_zgbequb_(integer *m, integer *n, integer *kl, integer * ku, doublecomplex *ab, integer *ldab, doublereal *r__, doublereal * c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex * afb, integer *ldafb, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, doublecomplex * b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgbtf2_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgbtrf_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *scale, integer *m, doublecomplex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_zgebal_(char *job, integer *n, doublecomplex *a, integer *lda, integer *ilo, integer *ihi, doublereal *scale, integer *info); /* Subroutine */ int _starpu_zgebd2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, doublecomplex *taup, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgebrd_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, doublecomplex *taup, doublecomplex *work, integer *lwork, integer * info); /* Subroutine */ int _starpu_zgecon_(char *norm, integer *n, doublecomplex *a, integer *lda, doublereal *anorm, doublereal *rcond, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeequ_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zgeequb_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zgees_(char *jobvs, char *sort, L_fp select, integer *n, doublecomplex *a, integer *lda, integer *sdim, doublecomplex *w, doublecomplex *vs, integer *ldvs, doublecomplex *work, integer *lwork, doublereal *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, doublecomplex *a, integer *lda, integer *sdim, doublecomplex *w, doublecomplex *vs, integer *ldvs, doublereal * rconde, doublereal *rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zgeev_(char *jobvl, char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublecomplex *work, integer * lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgegs_(char *jobvsl, char *jobvsr, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublecomplex * work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgegv_(char *jobvl, char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgehd2_(integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zgehrd_(integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgelq2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgelqf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgels_(char *trans, integer *m, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgelsd_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *s, doublereal *rcond, integer *rank, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zgelss_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *s, doublereal *rcond, integer *rank, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgelsx_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *jpvt, doublereal *rcond, integer *rank, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgelsy_(integer *m, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *jpvt, doublereal *rcond, integer *rank, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeql2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgeqlf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgeqp3_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeqpf_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgeqr2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgeqrf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgerfs_(char *trans, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublereal *r__, doublereal *c__, doublecomplex * b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgerq2_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgerqf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgesc2_(integer *n, doublecomplex *a, integer *lda, doublecomplex *rhs, integer *ipiv, integer *jpiv, doublereal *scale); /* Subroutine */ int _starpu_zgesdd_(char *jobz, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zgesv_(integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer * info); /* Subroutine */ int _starpu_zgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgesvx_(char *fact, char *trans, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgetc2_(integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *jpiv, integer *info); /* Subroutine */ int _starpu_zgetf2_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgetrf_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zgetri_(integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgetrs_(char *trans, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, doublecomplex *v, integer *ldv, integer *info); /* Subroutine */ int _starpu_zggbal_(char *job, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *work, integer * info); /* Subroutine */ int _starpu_zgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *sdim, doublecomplex *alpha, doublecomplex * beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublecomplex *work, integer *lwork, doublereal *rwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *sdim, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublereal *rconde, doublereal * rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *liwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zggev_(char *jobvl, char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, logical *bwork, integer *info); /* Subroutine */ int _starpu_zggglm_(integer *n, integer *m, integer *p, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *d__, doublecomplex *x, doublecomplex *y, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_zgglse_(integer *m, integer *n, integer *p, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, doublecomplex *d__, doublecomplex *x, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zggqrf_(integer *n, integer *m, integer *p, doublecomplex *a, integer *lda, doublecomplex *taua, doublecomplex *b, integer *ldb, doublecomplex *taub, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zggrqf_(integer *m, integer *p, integer *n, doublecomplex *a, integer *lda, doublecomplex *taua, doublecomplex *b, integer *ldb, doublecomplex *taub, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *alpha, doublereal *beta, doublecomplex *u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, integer *ldq, doublecomplex *work, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *tola, doublereal *tolb, integer *k, integer *l, doublecomplex *u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, integer *ldq, integer *iwork, doublereal * rwork, doublecomplex *tau, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgtcon_(char *norm, integer *n, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer * ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zgtrfs_(char *trans, integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *dlf, doublecomplex *df, doublecomplex *duf, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zgtsv_(integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *dlf, doublecomplex *df, doublecomplex *duf, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zgttrf_(integer *n, doublecomplex *dl, doublecomplex * d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, integer * info); /* Subroutine */ int _starpu_zgttrs_(char *trans, integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zgtts2_(integer *itrans, integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zhbev_(char *jobz, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhbevd_(char *jobz, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublecomplex *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zhbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublecomplex *x, integer *ldx, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, integer *ldbb, doublecomplex *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal * abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_zhbtrd_(char *vect, char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zhecon_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zheequb_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zheev_(char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zheevd_(char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zheevr_(char *jobz, char *range, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal * w, doublecomplex *z__, integer *ldz, integer *isuppz, doublecomplex * work, integer *lwork, doublereal *rwork, integer *lrwork, integer * iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zheevx_(char *jobz, char *range, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal * w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer * lwork, doublereal *rwork, integer *iwork, integer *ifail, integer * info); /* Subroutine */ int _starpu_zhegs2_(integer *itype, char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhegst_(integer *itype, char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhegv_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhegvd_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhegvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zherfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zherfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhesv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zhesvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhesvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhetd2_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, integer *info); /* Subroutine */ int _starpu_zhetf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zhetrd_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zhetrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zhetri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zhetrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublecomplex *a, integer *lda, doublereal *beta, doublecomplex *c__); /* Subroutine */ int _starpu_zhgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *t, integer *ldt, doublecomplex *alpha, doublecomplex * beta, doublecomplex *q, integer *ldq, doublecomplex *z__, integer * ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zhpcon_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zhpev_(char *jobz, char *uplo, integer *n, doublecomplex *ap, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhpevd_(char *jobz, char *uplo, integer *n, doublecomplex *ap, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zhpevx_(char *jobz, char *range, char *uplo, integer *n, doublecomplex *ap, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal * rwork, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zhpgst_(integer *itype, char *uplo, integer *n, doublecomplex *ap, doublecomplex *bp, integer *info); /* Subroutine */ int _starpu_zhpgv_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *ap, doublecomplex *bp, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zhpgvd_(integer *itype, char *jobz, char *uplo, integer * n, doublecomplex *ap, doublecomplex *bp, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal * rwork, integer *lrwork, integer *iwork, integer *liwork, integer * info); /* Subroutine */ int _starpu_zhpgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublecomplex *ap, doublecomplex *bp, doublereal * vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer * ifail, integer *info); /* Subroutine */ int _starpu_zhprfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex * b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zhpsv_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhpsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zhptrd_(char *uplo, integer *n, doublecomplex *ap, doublereal *d__, doublereal *e, doublecomplex *tau, integer *info); /* Subroutine */ int _starpu_zhptrf_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zhptri_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zhptrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zhsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, doublecomplex *h__, integer *ldh, doublecomplex * w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, integer *ifaill, integer *ifailr, integer *info); /* Subroutine */ int _starpu_zhseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublecomplex *ab, integer *ldab, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_gbrcond_c__(char *trans, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, doublereal *c__, logical *capply, integer *info, doublecomplex *work, doublereal *rwork, ftnlen trans_len); doublereal _starpu_zla_gbrcond_x__(char *trans, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, doublecomplex *x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_zla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info); doublereal _starpu_zla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer * ldafb); /* Subroutine */ int _starpu_zla_geamv__(integer *trans, integer *m, integer *n, doublereal *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_gercond_c__(char *trans, integer *n, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal * c__, logical *capply, integer *info, doublecomplex *work, doublereal * rwork, ftnlen trans_len); doublereal _starpu_zla_gercond_x__(char *trans, integer *n, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex * x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen trans_len); /* Subroutine */ int _starpu_zla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal * errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info); /* Subroutine */ int _starpu_zla_heamv__(integer *uplo, integer *n, doublereal *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_hercond_c__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *c__, logical *capply, integer *info, doublecomplex *work, doublereal * rwork, ftnlen uplo_len); doublereal _starpu_zla_hercond_x__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex * x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_herfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal * errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_zla_herpvgrw__(char *uplo, integer *n, integer *info, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_lin_berr__(integer *n, integer *nz, integer *nrhs, doublecomplex *res, doublereal *ayb, doublereal *berr); doublereal _starpu_zla_porcond_c__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, doublereal *c__, logical * capply, integer *info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); doublereal _starpu_zla_porcond_x__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, doublecomplex *x, integer * info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_zla_porpvgrw__(char *uplo, integer *ncols, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, doublereal *work, ftnlen uplo_len); doublereal _starpu_zla_rpvgrw__(integer *n, integer *ncols, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf); /* Subroutine */ int _starpu_zla_syamv__(integer *uplo, integer *n, doublereal *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublereal *beta, doublereal *y, integer *incy); doublereal _starpu_zla_syrcond_c__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *c__, logical *capply, integer *info, doublecomplex *work, doublereal * rwork, ftnlen uplo_len); doublereal _starpu_zla_syrcond_x__(char *uplo, integer *n, doublecomplex *a, integer * lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex * x, integer *info, doublecomplex *work, doublereal *rwork, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublecomplex *b, integer *ldb, doublecomplex *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal * errs_n__, doublereal *errs_c__, doublecomplex *res, doublereal *ayb, doublecomplex *dy, doublecomplex *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len); doublereal _starpu_zla_syrpvgrw__(char *uplo, integer *n, integer *info, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len); /* Subroutine */ int _starpu_zla_wwaddw__(integer *n, doublecomplex *x, doublecomplex *y, doublecomplex *w); /* Subroutine */ int _starpu_zlabrd_(integer *m, integer *n, integer *nb, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, doublecomplex *taup, doublecomplex *x, integer * ldx, doublecomplex *y, integer *ldy); /* Subroutine */ int _starpu_zlacgv_(integer *n, doublecomplex *x, integer *incx); /* Subroutine */ int _starpu_zlacn2_(integer *n, doublecomplex *v, doublecomplex *x, doublereal *est, integer *kase, integer *isave); /* Subroutine */ int _starpu_zlacon_(integer *n, doublecomplex *v, doublecomplex *x, doublereal *est, integer *kase); /* Subroutine */ int _starpu_zlacp2_(char *uplo, integer *m, integer *n, doublereal * a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zlacpy_(char *uplo, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zlacrm_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, integer *ldc, doublereal *rwork); /* Subroutine */ int _starpu_zlacrt_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy, doublecomplex *c__, doublecomplex * s); /* Double Complex */ VOID _starpu_zladiv_(doublecomplex * ret_val, doublecomplex *x, doublecomplex *y); /* Subroutine */ int _starpu_zlaed0_(integer *qsiz, integer *n, doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, integer *ldqs, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlaed7_(integer *n, integer *cutpnt, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * work, doublereal *rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlaed8_(integer *k, integer *n, integer *qsiz, doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, integer *indxq, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, integer *info); /* Subroutine */ int _starpu_zlaein_(logical *rightv, logical *noinit, integer *n, doublecomplex *h__, integer *ldh, doublecomplex *w, doublecomplex *v, doublecomplex *b, integer *ldb, doublereal *rwork, doublereal *eps3, doublereal *smlnum, integer *info); /* Subroutine */ int _starpu_zlaesy_(doublecomplex *a, doublecomplex *b, doublecomplex *c__, doublecomplex *rt1, doublecomplex *rt2, doublecomplex *evscal, doublecomplex *cs1, doublecomplex *sn1); /* Subroutine */ int _starpu_zlaev2_(doublecomplex *a, doublecomplex *b, doublecomplex *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, doublecomplex *sn1); /* Subroutine */ int _starpu_zlag2c_(integer *m, integer *n, doublecomplex *a, integer *lda, complex *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_zlags2_(logical *upper, doublereal *a1, doublecomplex * a2, doublereal *a3, doublereal *b1, doublecomplex *b2, doublereal *b3, doublereal *csu, doublecomplex *snu, doublereal *csv, doublecomplex * snv, doublereal *csq, doublecomplex *snq); /* Subroutine */ int _starpu_zlagtm_(char *trans, integer *n, integer *nrhs, doublereal *alpha, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *x, integer *ldx, doublereal *beta, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zlahef_(char *uplo, integer *n, integer *nb, integer *kb, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_zlahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, integer *info); /* Subroutine */ int _starpu_zlahr2_(integer *n, integer *k, integer *nb, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *t, integer *ldt, doublecomplex *y, integer *ldy); /* Subroutine */ int _starpu_zlahrd_(integer *n, integer *k, integer *nb, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *t, integer *ldt, doublecomplex *y, integer *ldy); /* Subroutine */ int _starpu_zlaic1_(integer *job, integer *j, doublecomplex *x, doublereal *sest, doublecomplex *w, doublecomplex *gamma, doublereal * sestpr, doublecomplex *s, doublecomplex *c__); /* Subroutine */ int _starpu_zlals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, doublecomplex *b, integer *ldb, doublecomplex *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *poles, doublereal *difl, doublereal *difr, doublereal * z__, integer *k, doublereal *c__, doublereal *s, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zlalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, doublecomplex *b, integer *ldb, doublecomplex *bx, integer *ldbx, doublereal *u, integer *ldu, doublereal *vt, integer * k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal * poles, integer *givptr, integer *givcol, integer *ldgcol, integer * perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * rwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublecomplex *b, integer *ldb, doublereal *rcond, integer *rank, doublecomplex *work, doublereal * rwork, integer *iwork, integer *info); doublereal _starpu_zlangb_(char *norm, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlange_(char *norm, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlangt_(char *norm, integer *n, doublecomplex *dl, doublecomplex * d__, doublecomplex *du); doublereal _starpu_zlanhb_(char *norm, char *uplo, integer *n, integer *k, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlanhf_(char *norm, char *transr, char *uplo, integer *n, doublecomplex *a, doublereal *work); doublereal _starpu_zlanhp_(char *norm, char *uplo, integer *n, doublecomplex *ap, doublereal *work); doublereal _starpu_zlanhs_(char *norm, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlanht_(char *norm, integer *n, doublereal *d__, doublecomplex *e); doublereal _starpu_zlansb_(char *norm, char *uplo, integer *n, integer *k, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlansp_(char *norm, char *uplo, integer *n, doublecomplex *ap, doublereal *work); doublereal _starpu_zlansy_(char *norm, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *work); doublereal _starpu_zlantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, doublecomplex *ab, integer *ldab, doublereal *work); doublereal _starpu_zlantp_(char *norm, char *uplo, char *diag, integer *n, doublecomplex *ap, doublereal *work); doublereal _starpu_zlantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *work); /* Subroutine */ int _starpu_zlapll_(integer *n, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublereal *ssmin); /* Subroutine */ int _starpu_zlapmt_(logical *forwrd, integer *m, integer *n, doublecomplex *x, integer *ldx, integer *k); /* Subroutine */ int _starpu_zlaqgb_(integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqge_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqhb_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqhe_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqhp_(char *uplo, integer *n, doublecomplex *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqp2_(integer *m, integer *n, integer *offset, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublereal *vn1, doublereal *vn2, doublecomplex *work); /* Subroutine */ int _starpu_zlaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublereal *vn1, doublereal *vn2, doublecomplex * auxv, doublecomplex *f, integer *ldf); /* Subroutine */ int _starpu_zlaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zlaqr1_(integer *n, doublecomplex *h__, integer *ldh, doublecomplex *s1, doublecomplex *s2, doublecomplex *v); /* Subroutine */ int _starpu_zlaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublecomplex *h__, integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, integer *ns, integer *nd, doublecomplex *sh, doublecomplex *v, integer *ldv, integer *nh, doublecomplex *t, integer *ldt, integer *nv, doublecomplex *wv, integer *ldwv, doublecomplex *work, integer *lwork); /* Subroutine */ int _starpu_zlaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublecomplex *h__, integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, integer *ns, integer *nd, doublecomplex *sh, doublecomplex *v, integer *ldv, integer *nh, doublecomplex *t, integer *ldt, integer *nv, doublecomplex *wv, integer *ldwv, doublecomplex *work, integer *lwork); /* Subroutine */ int _starpu_zlaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zlaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, doublecomplex *s, doublecomplex *h__, integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *v, integer *ldv, doublecomplex *u, integer *ldu, integer *nv, doublecomplex *wv, integer *ldwv, integer *nh, doublecomplex *wh, integer *ldwh); /* Subroutine */ int _starpu_zlaqsb_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqsp_(char *uplo, integer *n, doublecomplex *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlaqsy_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); /* Subroutine */ int _starpu_zlar1v_(integer *n, integer *b1, integer *bn, doublereal *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * lld, doublereal *pivmin, doublereal *gaptol, doublecomplex *z__, logical *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, doublereal *rqcorr, doublereal *work); /* Subroutine */ int _starpu_zlar2v_(integer *n, doublecomplex *x, doublecomplex *y, doublecomplex *z__, integer *incx, doublereal *c__, doublecomplex *s, integer *incc); /* Subroutine */ int _starpu_zlarcm_(integer *m, integer *n, doublereal *a, integer * lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublereal *rwork); /* Subroutine */ int _starpu_zlarf_(char *side, integer *m, integer *n, doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, doublecomplex *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * ldc, doublecomplex *work, integer *ldwork); /* Subroutine */ int _starpu_zlarfg_(integer *n, doublecomplex *alpha, doublecomplex * x, integer *incx, doublecomplex *tau); /* Subroutine */ int _starpu_zlarfp_(integer *n, doublecomplex *alpha, doublecomplex * x, integer *incx, doublecomplex *tau); /* Subroutine */ int _starpu_zlarft_(char *direct, char *storev, integer *n, integer * k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * t, integer *ldt); /* Subroutine */ int _starpu_zlarfx_(char *side, integer *m, integer *n, doublecomplex *v, doublecomplex *tau, doublecomplex *c__, integer * ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlargv_(integer *n, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublereal *c__, integer *incc); /* Subroutine */ int _starpu_zlarnv_(integer *idist, integer *iseed, integer *n, doublecomplex *x); /* Subroutine */ int _starpu_zlarrv_(integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, integer *m, integer *dol, integer *dou, doublereal *minrgp, doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublecomplex *z__, integer *ldz, integer *isuppz, doublereal *work, integer *iwork, integer *info); /* Subroutine */ int _starpu_zlarscl2_(integer *m, integer *n, doublereal *d__, doublecomplex *x, integer *ldx); /* Subroutine */ int _starpu_zlartg_(doublecomplex *f, doublecomplex *g, doublereal * cs, doublecomplex *sn, doublecomplex *r__); /* Subroutine */ int _starpu_zlartv_(integer *n, doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, doublereal *c__, doublecomplex *s, integer *incc); /* Subroutine */ int _starpu_zlarz_(char *side, integer *m, integer *n, integer *l, doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex * c__, integer *ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, doublecomplex *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *ldwork); /* Subroutine */ int _starpu_zlarzt_(char *direct, char *storev, integer *n, integer * k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * t, integer *ldt); /* Subroutine */ int _starpu_zlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zlascl2_(integer *m, integer *n, doublereal *d__, doublecomplex *x, integer *ldx); /* Subroutine */ int _starpu_zlaset_(char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * lda); /* Subroutine */ int _starpu_zlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, doublereal *s, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zlassq_(integer *n, doublecomplex *x, integer *incx, doublereal *scale, doublereal *sumsq); /* Subroutine */ int _starpu_zlaswp_(integer *n, doublecomplex *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx); /* Subroutine */ int _starpu_zlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *w, integer *ldw, integer *info); /* Subroutine */ int _starpu_zlat2c_(char *uplo, integer *n, doublecomplex *a, integer *lda, complex *sa, integer *ldsa, integer *info); /* Subroutine */ int _starpu_zlatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublecomplex *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_zlatdf_(integer *ijob, integer *n, doublecomplex *z__, integer *ldz, doublecomplex *rhs, doublereal *rdsum, doublereal * rdscal, integer *ipiv, integer *jpiv); /* Subroutine */ int _starpu_zlatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublecomplex *ap, doublecomplex *x, doublereal * scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_zlatrd_(char *uplo, integer *n, integer *nb, doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, doublecomplex *w, integer *ldw); /* Subroutine */ int _starpu_zlatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, doublereal *scale, doublereal *cnorm, integer *info); /* Subroutine */ int _starpu_zlatrz_(integer *m, integer *n, integer *l, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work); /* Subroutine */ int _starpu_zlatzm_(char *side, integer *m, integer *n, doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex * c1, doublecomplex *c2, integer *ldc, doublecomplex *work); /* Subroutine */ int _starpu_zlauu2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zlauum_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpbcon_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *anorm, doublereal * rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpbequ_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer * ldafb, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_zpbstf_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_zpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_zpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer *ldafb, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal * ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpbtf2_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_zpbtrf_(char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, integer *info); /* Subroutine */ int _starpu_zpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer * ldb, integer *info); /* Subroutine */ int _starpu_zpftrf_(char *transr, char *uplo, integer *n, doublecomplex *a, integer *info); /* Subroutine */ int _starpu_zpftri_(char *transr, char *uplo, integer *n, doublecomplex *a, integer *info); /* Subroutine */ int _starpu_zpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, doublecomplex *a, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zpocon_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *anorm, doublereal *rcond, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpoequ_(integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zpoequb_(integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zporfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_zporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zposv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zposvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpotf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpotrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpotri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_zpotrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zppcon_(char *uplo, integer *n, doublecomplex *ap, doublereal *anorm, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zppequ_(char *uplo, integer *n, doublecomplex *ap, doublereal *s, doublereal *scond, doublereal *amax, integer *info); /* Subroutine */ int _starpu_zpprfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *afp, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zppsv_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *ap, doublecomplex *afp, char *equed, doublereal * s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpptrf_(char *uplo, integer *n, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_zpptri_(char *uplo, integer *n, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_zpptrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zpstf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_zpstrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info); /* Subroutine */ int _starpu_zptcon_(integer *n, doublereal *d__, doublecomplex *e, doublereal *anorm, doublereal *rcond, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zpteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_zptrfs_(char *uplo, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublereal *df, doublecomplex *ef, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_zptsv_(integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zptsvx_(char *fact, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublereal *df, doublecomplex *ef, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zpttrf_(integer *n, doublereal *d__, doublecomplex *e, integer *info); /* Subroutine */ int _starpu_zpttrs_(char *uplo, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zptts2_(integer *iuplo, integer *n, integer *nrhs, doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_zrot_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy, doublereal *c__, doublecomplex *s); /* Subroutine */ int _starpu_zspcon_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zspmv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *ap, doublecomplex *x, integer *incx, doublecomplex * beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zspr_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *ap); /* Subroutine */ int _starpu_zsprfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex * b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_zspsv_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsptrf_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zsptri_(char *uplo, integer *n, doublecomplex *ap, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsptrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_zstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zstegr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zstein_(integer *n, doublereal *d__, doublereal *e, integer *m, doublereal *w, integer *iblock, integer *isplit, doublecomplex *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info); /* Subroutine */ int _starpu_zstemr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, integer *m, doublereal *w, doublecomplex *z__, integer * ldz, integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_zsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, integer *info); /* Subroutine */ int _starpu_zsycon_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsyequb_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsymv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy); /* Subroutine */ int _starpu_zsyr_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *a, integer *lda); /* Subroutine */ int _starpu_zsyrfs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsysv_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zsysvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * ldaf, integer *ipiv, char *equed, doublereal *s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_zsytf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info); /* Subroutine */ int _starpu_zsytrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zsytri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zsytrs_(char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * rwork, integer *info); /* Subroutine */ int _starpu_ztbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, doublecomplex *b, integer *ldb); /* Subroutine */ int _starpu_ztftri_(char *transr, char *uplo, char *diag, integer *n, doublecomplex *a, integer *info); /* Subroutine */ int _starpu_ztfttp_(char *transr, char *uplo, integer *n, doublecomplex *arf, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_ztfttr_(char *transr, char *uplo, integer *n, doublecomplex *arf, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztgevc_(char *side, char *howmny, logical *select, integer *n, doublecomplex *s, integer *lds, doublecomplex *p, integer *ldp, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer * ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztgex2_(logical *wantq, logical *wantz, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, integer *j1, integer *info); /* Subroutine */ int _starpu_ztgexc_(logical *wantq, logical *wantz, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, integer *ifst, integer *ilst, integer *info); /* Subroutine */ int _starpu_ztgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex * beta, doublecomplex *q, integer *ldq, doublecomplex *z__, integer * ldz, integer *m, doublereal *pl, doublereal *pr, doublereal *dif, doublecomplex *work, integer *lwork, integer *iwork, integer *liwork, integer *info); /* Subroutine */ int _starpu_ztgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublereal *tola, doublereal *tolb, doublereal *alpha, doublereal *beta, doublecomplex * u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, integer *ldq, doublecomplex *work, integer *ncycle, integer *info); /* Subroutine */ int _starpu_ztgsna_(char *job, char *howmny, logical *select, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer * ldvr, doublereal *s, doublereal *dif, integer *mm, integer *m, doublecomplex *work, integer *lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ztgsy2_(char *trans, integer *ijob, integer *m, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd, doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf, doublereal *scale, doublereal *rdsum, doublereal *rdscal, integer * info); /* Subroutine */ int _starpu_ztgsyl_(char *trans, integer *ijob, integer *m, integer * n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd, doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf, doublereal *scale, doublereal *dif, doublecomplex *work, integer * lwork, integer *iwork, integer *info); /* Subroutine */ int _starpu_ztpcon_(char *norm, char *uplo, char *diag, integer *n, doublecomplex *ap, doublereal *rcond, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztptri_(char *uplo, char *diag, integer *n, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_ztptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztpttf_(char *transr, char *uplo, integer *n, doublecomplex *ap, doublecomplex *arf, integer *info); /* Subroutine */ int _starpu_ztpttr_(char *uplo, integer *n, doublecomplex *ap, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztrcon_(char *norm, char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, doublereal *rcond, doublecomplex * work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztrevc_(char *side, char *howmny, logical *select, integer *n, doublecomplex *t, integer *ldt, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztrexc_(char *compq, integer *n, doublecomplex *t, integer *ldt, doublecomplex *q, integer *ldq, integer *ifst, integer * ilst, integer *info); /* Subroutine */ int _starpu_ztrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, integer * info); /* Subroutine */ int _starpu_ztrsen_(char *job, char *compq, logical *select, integer *n, doublecomplex *t, integer *ldt, doublecomplex *q, integer *ldq, doublecomplex *w, integer *m, doublereal *s, doublereal *sep, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_ztrsna_(char *job, char *howmny, logical *select, integer *n, doublecomplex *t, integer *ldt, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublereal *s, doublereal *sep, integer *mm, integer *m, doublecomplex *work, integer *ldwork, doublereal *rwork, integer *info); /* Subroutine */ int _starpu_ztrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, doublereal *scale, integer *info); /* Subroutine */ int _starpu_ztrti2_(char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztrtri_(char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, integer *info); /* Subroutine */ int _starpu_ztrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, integer *info); /* Subroutine */ int _starpu_ztrttf_(char *transr, char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *arf, integer *info); /* Subroutine */ int _starpu_ztrttp_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *ap, integer *info); /* Subroutine */ int _starpu_ztzrqf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, integer *info); /* Subroutine */ int _starpu_ztzrzf_(integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zung2l_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zung2r_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zungbr_(char *vect, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunghr_(integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungl2_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zunglq_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungql_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungqr_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungr2_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zungrq_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zungtr_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunmbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zunmhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex * work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunmlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmql_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmr2_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_zunmr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * info); /* Subroutine */ int _starpu_zunmrq_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zunmrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * lwork, integer *info); /* Subroutine */ int _starpu_zunmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, integer *info); /* Subroutine */ int _starpu_zupgtr_(char *uplo, integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *q, integer *ldq, doublecomplex * work, integer *info); /* Subroutine */ int _starpu_zupmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); /* Subroutine */ int _starpu_dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1); doublereal _starpu_dsecnd_(); /* Subroutine */ int _starpu_ilaver_(integer *vers_major__, integer *vers_minor__, integer *vers_patch__); logical _starpu_lsame_(char *ca, char *cb); doublereal _starpu_second_(); doublereal _starpu_slamch_(char *cmach); /* Subroutine */ int _starpu_slamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1); /* Subroutine */ int _starpu_slamc2_(integer *beta, integer *t, logical *rnd, real * eps, integer *emin, real *rmin, integer *emax, real *rmax); doublereal _starpu_slamc3_(real *a, real *b); /* Subroutine */ int _starpu_slamc4_(integer *emin, real *start, integer *base); /* Subroutine */ int _starpu_slamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, real *rmax); doublereal _starpu_dlamch_(char *cmach); /* Subroutine */ int _starpu_dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1); /* Subroutine */ int _starpu_dlamc2_(integer *beta, integer *t, logical *rnd, doublereal *eps, integer *emin, doublereal *rmin, integer *emax, doublereal *rmax); doublereal _starpu_dlamc3_(doublereal *a, doublereal *b); /* Subroutine */ int _starpu_dlamc4_(integer *emin, doublereal *start, integer *base); /* Subroutine */ int _starpu_dlamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, doublereal *rmax); integer _starpu_ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, integer *n4); #ifdef __cplusplus } #endif #endif /* __CLAPACK_H */ starpu-1.3.9+dfsg/min-dgels/base/INCLUDE/f2c.h000066400000000000000000000111201413463044200204540ustar00rootroot00000000000000/* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE typedef long int integer; typedef unsigned long int uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef double doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef long int logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; #ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ typedef long long longint; /* system-dependent */ typedef unsigned long long ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef long int flag; typedef long int ftnlen; typedef long int ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; int nvars; }; typedef struct Namelist Namelist; #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ int (*S_fp)(...); #else typedef int /* Unknown procedure type */ (*U_fp)(); typedef shortint (*J_fp)(); typedef integer (*I_fp)(); typedef real (*R_fp)(); typedef doublereal (*D_fp)(), (*E_fp)(); typedef /* Complex */ VOID (*C_fp)(); typedef /* Double Complex */ VOID (*Z_fp)(); typedef logical (*L_fp)(); typedef shortlogical (*K_fp)(); typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* double complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif starpu-1.3.9+dfsg/min-dgels/base/Makefile000066400000000000000000000005461413463044200202200ustar00rootroot00000000000000# # Top Level Makefile for LAPACK # Version 3.2.1 # June 2009 # include make.inc all: lib lib: f2clib blaslib clean: cleanlib blaslib: ( cd BLAS/SRC; $(MAKE) ) f2clib: ( cd F2CLIBS/libf2c; $(MAKE) ) cleanlib: ( cd BLAS/SRC; $(MAKE) clean ) ( cd SRC; $(MAKE) clean ) ( cd SRC/VARIANTS; $(MAKE) clean ) ( cd F2CLIBS/libf2c; $(MAKE) clean ) starpu-1.3.9+dfsg/min-dgels/base/README.install000066400000000000000000000205721413463044200211060ustar00rootroot00000000000000 =================== CLAPACK README FILE =================== ============================================================================================ Version 3.2.1 (threadsafe) Release date: June 2009 / April 2010 F2C translation of LAPACK 3.2.1 To get revisions info about LAPACK 3.2.1, please see http://www.netlib.org/lapack/lapack-3.2.1.html FOR SUPPORT: LAPACK Forum: http://icl.cs.utk.edu/lapack-forum/ ============================================================================================ This README file describes how and how to install the ANSI C translation of the LAPACK library, called CLAPACK. CLAPACK must be compiled with an ANSI Standard C compiler. If the C compiler on your machine is an old-style C compiler, you will have to use gcc to compile the package. IMPORTANT NOTE: You *CANNOT* just go to www.netlib.org/clapack, download a routine like sgesv.c and have it work unless you properly install and link to the f2c and BLAS routines as described below. If your linker complains about missing functions, you have probably accidentally neglected this step. Also, you will need the file "f2c.h" (included with the f2c libraries) in order to compile these routines. The default BLAS routines included with CLAPACK in the BLAS/SRC subdirectory may also be used these will most likely be slower than a BLAS library optimized for your machine. If you do not have such an optimized BLAS library, you can get one at http://www.netlib.org/atlas ============================================================================== For a fast default installation, you will need to - Untar clapack.tar and modify the make.inc file (see step 1 below) - Make the f2c libraries (see step 2 below) - Make the BLAS library (see step 2 below) - Make the main library, test it, and time it by simply typing make If you encounter difficulties, you may find the installation manual for the FORTRAN version (INSTALL/lawn81.*) useful. Procedure for installing CLAPACK: ============================================================================== (1) 'tar xvf clapack.tar' to build the following directory structure: CLAPACK/README.install this file CLAPACK/BLAS/ C source for BLAS CLAPACK/F2CLIBS/ f2c I/O functions (libI77) and math functions (libF77) CLAPACK/INSTALL/ Testing functions and pre-tested make.inc files for various platforms. CLAPACK/INCLUDE/ header files - clapack.h is including C prototypes of all the CLAPACK routines. CLAPACK/SRC/ C source of LAPACK routines CLAPACK/TESTING/ driver routines to test correctness CLAPACK/make.inc compiler, compile flags and library definitions, included in all Makefiles. NOTE: It's better to use gcc compiler on some older Sun systems. You should be sure to modify the make.inc file for your system. (2) Build the f2c libraries by doing: make f2clib ############################################################################## WARNING: 1) If your system lacks onexit() and you are not using an ANSI C compiler, then you should change your F2CCFLAGS line in make.inc to F2CCFLAGS=$(CFLAGS) -DNO_ONEXIT On at least some Sun systems, it is better to use F2CCFLAGS=$(CFLAGS) -Donexit=on_exit 2) On at least some Sun systems, the type declaration in F2CLIBS/libI77/rawio.h: extern FILE *fdopen(int, char*) is not consistent with the one defined in stdio.h. In this case you should comment out this line. ############################################################################## (3) To run CLAPACK, you need to create a BLAS library. The performance of CLAPACK largely depends on the performance of the BLAS library. You can either use the reference BLAS library included with this distribution, which is easy to install but not optimized to be fast on any particular machine, or else find a version of the BLAS optimized for your machine. If you want to use the reference BLAS library included with this distribution, build it by doing make blaslib from the main directory. If you want to find a BLAS library optimized for your machine, see the note below for more details; see also the README in the BLAS/WRAP directory. (4) Compile and run the BLAS TESTING code by doing: cd CLAPACK/BLAS/TESTING; make -f Makeblat2 cd CLAPACK/BLAS xblat2s < sblat2.in xblat2d < dblat2.in xblat2c < cblat2.in xblat2z < zblat2.in cd CLAPACK/BLAS/TESTING; make -f Makeblat3 cd CLAPACK/BLAS xblat3s < sblat3.in xblat3d < dblat3.in xblat3c < cblat3.in xblat3z < zblat3.in Inspect the output files *.SUMM to confirm that no errors occurred. {NOTE: If a compiling error involving _atexit appears then see information within the WARNING above.} {NOTE: For the highest performance, it is best to use a version of the BLAS optimized for your particular machine. This may be done by modifying the line BLASLIB = ../../blas$(PLAT).a in CLAPACK/make.inc to point to the optimized BLAS. Link with BLAS which provides the standard CBLAS interface ========================================================== If you are using a version of the BLAS which provides the standard CBLAS interface (e.g. ATLAS), you need to add the appropriate "wrapper" library. you can make the wrapper library libcblaswr.a by typing "make cblaswrap" from the main directory. For this setup (ATLAS with the CBLAS wrapper), the BLASLIB line might look like Example: Modification to make.inc CC = gcc BLASLIB = ../../libcblaswr.a -lcblas -latlas Creation of libcblaswr.a : make cblaswrap Link with BLAS which Fortran calling interface =============================================== Two possibilities: - add -DNO_BLAS_WRAP to the CC variable to when compiling and no need of a "wrapper" library Example: CC = gcc -DNO_BLAS_WRAP BLASLIB = -lgoto -lpthread - add the sample Fortran calling interface (libfblaswr.a) for systems with Sun-style Fortran calling conventions is also provided; however, this interface will need modifications to work on other architectures which have different Fortran calling convensions. See the README in the BLAS/WRAP subdirectory for further information. Example: CC = gcc BLASLIB = ../../libfblaswr.a -lgoto -lpthread Creation of libfblaswr.a : make fblaswrap } (5) Build the archive containing lapack source code by doing: cd CLAPACK/SRC; make (6) Compile the matrix generation software, the eigenroutine TESTING code, the linear system TESTING code, and run the LAPACK tests by doing: cd CLAPACK/TESTING/MATGEN; make cd CLAPACK/TESTING; make Inspect the output files *.out to confirm that no errors occurred. I. Compile the matrix generation software, the eigenroutine TESTING code, the linear system TESTING code, and run the LAPACK tests separately by doing: cd CLAPACK/TESTING/MATGEN; make cd CLAPACK/TESTING/EIG; make cd CLAPACK/TESTING/LIN; make cd CLAPACK/TESTING; make II. After the executable files and libraries have been created for each of the compiles, the object files should be removed by doing: make clean III. Each 'make' may be accomplished just for one or a subset of the precisions desired. For example: make single make single complex make single double complex complex16 Using make without any arguments will compile all four precisions. James Demmel Xiaoye Li Chris Puscasiu Steve Timson UC Berkeley Sept 27 1993 {Revised by Susan Ostrouchov and Jude Toth} {The University of Tennessee at Knoxville} {October 15, 1993} {Revised by Xiaoye Li and James Demmel} {University of California at Berkeley} {November 22, 1994} {Revised by David Bindel and James Demmel} {University of California at Berkeley} {July 19, 2000} {Revised by Julie Langou} {University of Tennessee} {February 2008} {Revised by Julie Langou} {University of Tennessee} {October 2008, April 2010} {Revised by Peng Du} {University of Tennessee} {May 2009} starpu-1.3.9+dfsg/min-dgels/base/SRC/000077500000000000000000000000001413463044200172025ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/Makefile000066400000000000000000000161771413463044200206560ustar00rootroot00000000000000TOPDIR=.. include $(TOPDIR)/make.inc ####################################################################### # This is the makefile to create a library for LAPACK. # The files are organized as follows: # ALLAUX -- Auxiliary routines called from all precisions # ALLXAUX -- Auxiliary routines called from all precisions but # only from routines using extra precision. # SCLAUX -- Auxiliary routines called from both REAL and COMPLEX # DZLAUX -- Auxiliary routines called from both DOUBLE PRECISION # and COMPLEX*16 # SLASRC -- Single precision real LAPACK routines # SXLASRC -- Single precision real LAPACK routines using extra # precision. # CLASRC -- Single precision complex LAPACK routines # CXLASRC -- Single precision complex LAPACK routines using extra # precision. # DLASRC -- Double precision real LAPACK routines # DXLASRC -- Double precision real LAPACK routines using extra # precision. # ZLASRC -- Double precision complex LAPACK routines # ZXLASRC -- Double precision complex LAPACK routines using extra # precision. # # The library can be set up to include routines for any combination # of the four precisions. To create or add to the library, enter make # followed by one or more of the precisions desired. Some examples: # make single # make single complex # make single double complex complex16 # Alternatively, the command # make # without any arguments creates a library of all four precisions. # The library is called # lapack.a # and is created at the next higher directory level. # # To remove the object files after the library is created, enter # make clean # On some systems, you can force the source files to be recompiled by # entering (for example) # make single FRC=FRC # # ***Note*** # The functions lsame, second, dsecnd, slamch, and dlamch may have # to be installed before compiling the library. Refer to the # installation guide, LAPACK Working Note 41, for instructions. # ####################################################################### ALLAUX = maxloc.o ilaenv.o ieeeck.o lsamen.o xerbla.o xerbla_array.o iparmq.o \ ilaprec.o ilatrans.o ilauplo.o iladiag.o chla_transtype.o \ ../INSTALL/ilaver.o ../INSTALL/lsame.o ALLXAUX = DZLAUX = \ dbdsdc.o \ dbdsqr.o ddisna.o dlabad.o dlacpy.o dladiv.o dlae2.o dlaebz.o \ dlaed0.o dlaed1.o dlaed2.o dlaed3.o dlaed4.o dlaed5.o dlaed6.o \ dlaed7.o dlaed8.o dlaed9.o dlaeda.o dlaev2.o dlagtf.o \ dlagts.o dlamrg.o dlanst.o \ dlapy2.o dlapy3.o dlarnv.o \ dlarra.o dlarrb.o dlarrc.o dlarrd.o dlarre.o dlarrf.o dlarrj.o \ dlarrk.o dlarrr.o dlaneg.o \ dlartg.o dlaruv.o dlas2.o dlascl.o \ dlasd0.o dlasd1.o dlasd2.o dlasd3.o dlasd4.o dlasd5.o dlasd6.o \ dlasd7.o dlasd8.o dlasda.o dlasdq.o dlasdt.o \ dlaset.o dlasq1.o dlasq2.o dlasq3.o dlasq4.o dlasq5.o dlasq6.o \ dlasr.o dlasrt.o dlassq.o dlasv2.o dpttrf.o dstebz.o dstedc.o \ dsteqr.o dsterf.o dlaisnan.o disnan.o \ ../INSTALL/dlamch.o ../INSTALL/dsecnd.o DLASRC = \ dgbbrd.o dgbcon.o dgbequ.o dgbrfs.o dgbsv.o \ dgbsvx.o dgbtf2.o dgbtrf.o dgbtrs.o dgebak.o dgebal.o dgebd2.o \ dgebrd.o dgecon.o dgeequ.o dgees.o dgeesx.o dgeev.o dgeevx.o \ dgegs.o dgegv.o dgehd2.o dgehrd.o dgelq2.o dgelqf.o \ dgels.o dgelsd.o dgelss.o dgelsx.o dgelsy.o dgeql2.o dgeqlf.o \ dgeqp3.o dgeqpf.o dgeqr2.o dgeqrf.o dgerfs.o dgerq2.o dgerqf.o \ dgesc2.o dgesdd.o dgesv.o dgesvd.o dgesvx.o dgetc2.o dgetf2.o \ dgetrf.o dgetri.o \ dgetrs.o dggbak.o dggbal.o dgges.o dggesx.o dggev.o dggevx.o \ dggglm.o dgghrd.o dgglse.o dggqrf.o \ dggrqf.o dggsvd.o dggsvp.o dgtcon.o dgtrfs.o dgtsv.o \ dgtsvx.o dgttrf.o dgttrs.o dgtts2.o dhgeqz.o \ dhsein.o dhseqr.o dlabrd.o dlacon.o dlacn2.o \ dlaein.o dlaexc.o dlag2.o dlags2.o dlagtm.o dlagv2.o dlahqr.o \ dlahrd.o dlahr2.o dlaic1.o dlaln2.o dlals0.o dlalsa.o dlalsd.o \ dlangb.o dlange.o dlangt.o dlanhs.o dlansb.o dlansp.o \ dlansy.o dlantb.o dlantp.o dlantr.o dlanv2.o \ dlapll.o dlapmt.o \ dlaqgb.o dlaqge.o dlaqp2.o dlaqps.o dlaqsb.o dlaqsp.o dlaqsy.o \ dlaqr0.o dlaqr1.o dlaqr2.o dlaqr3.o dlaqr4.o dlaqr5.o \ dlaqtr.o dlar1v.o dlar2v.o iladlr.o iladlc.o \ dlarf.o dlarfb.o dlarfg.o dlarft.o dlarfx.o dlargv.o \ dlarrv.o dlartv.o dlarfp.o \ dlarz.o dlarzb.o dlarzt.o dlaswp.o dlasy2.o dlasyf.o \ dlatbs.o dlatdf.o dlatps.o dlatrd.o dlatrs.o dlatrz.o dlatzm.o dlauu2.o \ dlauum.o dopgtr.o dopmtr.o dorg2l.o dorg2r.o \ dorgbr.o dorghr.o dorgl2.o dorglq.o dorgql.o dorgqr.o dorgr2.o \ dorgrq.o dorgtr.o dorm2l.o dorm2r.o \ dormbr.o dormhr.o dorml2.o dormlq.o dormql.o dormqr.o dormr2.o \ dormr3.o dormrq.o dormrz.o dormtr.o dpbcon.o dpbequ.o dpbrfs.o \ dpbstf.o dpbsv.o dpbsvx.o \ dpbtf2.o dpbtrf.o dpbtrs.o dpocon.o dpoequ.o dporfs.o dposv.o \ dposvx.o dpotf2.o dpotrf.o dpotri.o dpotrs.o dpstrf.o dpstf2.o \ dppcon.o dppequ.o \ dpprfs.o dppsv.o dppsvx.o dpptrf.o dpptri.o dpptrs.o dptcon.o \ dpteqr.o dptrfs.o dptsv.o dptsvx.o dpttrs.o dptts2.o drscl.o \ dsbev.o dsbevd.o dsbevx.o dsbgst.o dsbgv.o dsbgvd.o dsbgvx.o \ dsbtrd.o dspcon.o dspev.o dspevd.o dspevx.o dspgst.o \ dspgv.o dspgvd.o dspgvx.o dsprfs.o dspsv.o dspsvx.o dsptrd.o \ dsptrf.o dsptri.o dsptrs.o dstegr.o dstein.o dstev.o dstevd.o dstevr.o \ dstevx.o dsycon.o dsyev.o dsyevd.o dsyevr.o \ dsyevx.o dsygs2.o dsygst.o dsygv.o dsygvd.o dsygvx.o dsyrfs.o \ dsysv.o dsysvx.o \ dsytd2.o dsytf2.o dsytrd.o dsytrf.o dsytri.o dsytrs.o dtbcon.o \ dtbrfs.o dtbtrs.o dtgevc.o dtgex2.o dtgexc.o dtgsen.o \ dtgsja.o dtgsna.o dtgsy2.o dtgsyl.o dtpcon.o dtprfs.o dtptri.o \ dtptrs.o \ dtrcon.o dtrevc.o dtrexc.o dtrrfs.o dtrsen.o dtrsna.o dtrsyl.o \ dtrti2.o dtrtri.o dtrtrs.o dtzrqf.o dtzrzf.o dstemr.o \ dsgesv.o dsposv.o dlag2s.o slag2d.o dlat2s.o \ dlansf.o dpftrf.o dpftri.o dpftrs.o dsfrk.o dtfsm.o dtftri.o dtfttp.o \ dtfttr.o dtpttf.o dtpttr.o dtrttf.o dtrttp.o \ dgejsv.o dgesvj.o dgsvj0.o dgsvj1.o \ dgeequb.o dsyequb.o dpoequb.o dgbequb.o DXLASRC = dgesvxx.o dgerfsx.o dla_gerfsx_extended.o dla_geamv.o \ dla_gercond.o dla_rpvgrw.o dsysvxx.o dsyrfsx.o \ dla_syrfsx_extended.o dla_syamv.o dla_syrcond.o dla_syrpvgrw.o \ dposvxx.o dporfsx.o dla_porfsx_extended.o dla_porcond.o \ dla_porpvgrw.o dgbsvxx.o dgbrfsx.o dla_gbrfsx_extended.o \ dla_gbamv.o dla_gbrcond.o dla_gbrpvgrw.o dla_lin_berr.o dlarscl2.o \ dlascl2.o dla_wwaddw.o all: ../$(LAPACKLIB) ifdef USEXBLAS ALLXOBJ=$(DXLASRC) $(ALLXAUX) endif ALLOBJ=$(DLASRC) $(DZLAUX) \ $(ALLAUX) ../$(LAPACKLIB): $(ALLOBJ) $(ALLXOBJ) $(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ) $(ALLXOBJ) $(RANLIB) $@ double: $(DLASRC) $(ALLAUX) $(DZLAUX) $(ARCH) $(ARCHFLAGS) ../$(LAPACKLIB) $(DLASRC) $(ALLAUX) \ $(DZLAUX) $(RANLIB) ../$(LAPACKLIB) $(ALLAUX): $(FRC) $(DZLAUX): $(FRC) $(DLASRC): $(FRC) ifdef USEXBLAS $(ALLXAUX): $(FRC) $(DXLASRC): $(FRC) endif FRC: @FRC=$(FRC) clean: rm -f *.o .c.o: $(CC) $(CFLAGS) -c $< dlaruv.o: dlaruv.c ; $(CC) $(NOOPT) -c $< -o $@ dla_wwaddw.o: dla_wwaddw.c ; $(CC) $(NOOPT) -c $< -o $@ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/000077500000000000000000000000001413463044200204315ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/Makefile000066400000000000000000000045371413463044200221020ustar00rootroot00000000000000TOPDIR=../.. include $(TOPDIR)/make.inc ####################################################################### # This is the makefile to create a the variants libraries for LAPACK. # The files are organized as follows: # CHOLRL -- Right looking block version of the algorithm, calling Level 3 BLAS # CHOLTOP -- Top looking block version of the algorithm, calling Level 3 BLAS # LUCR -- Crout Level 3 BLAS version of LU factorization # LULL -- left-looking Level 3 BLAS version of LU factorization # QRLL -- left-looking Level 3 BLAS version of QR factorization # LUREC -- an iterative version of Sivan Toledo's recursive LU algorithm[1]. # For square matrices, this iterative versions should # be within a factor of two of the optimum number of memory transfers. # # [1] Toledo, S. 1997. Locality of Reference in LU Decomposition with # Partial Pivoting. SIAM J. Matrix Anal. Appl. 18, 4 (Oct. 1997), # 1065-1081. http://dx.doi.org/10.1137/S0895479896297744 ####################################################################### VARIANTSDIR=LIB CHOLRL = cholesky/RL/cpotrf.o cholesky/RL/dpotrf.o cholesky/RL/spotrf.o cholesky/RL/zpotrf.o CHOLTOP = cholesky/TOP/cpotrf.o cholesky/TOP/dpotrf.o cholesky/TOP/spotrf.o cholesky/TOP/zpotrf.o LUCR = lu/CR/cgetrf.o lu/CR/dgetrf.o lu/CR/sgetrf.o lu/CR/zgetrf.o LULL = lu/LL/cgetrf.o lu/LL/dgetrf.o lu/LL/sgetrf.o lu/LL/zgetrf.o LUREC = lu/REC/cgetrf.o lu/REC/dgetrf.o lu/REC/sgetrf.o lu/REC/zgetrf.o QRLL = qr/LL/cgeqrf.o qr/LL/dgeqrf.o qr/LL/sgeqrf.o qr/LL/zgeqrf.o qr/LL/sceil.o all: cholrl choltop lucr lull lurec qrll cholrl: $(CHOLRL) $(ARCH) $(ARCHFLAGS) $(VARIANTSDIR)/cholrl.a $(CHOLRL) $(RANLIB) $(VARIANTSDIR)/cholrl.a choltop: $(CHOLTOP) $(ARCH) $(ARCHFLAGS) $(VARIANTSDIR)/choltop.a $(CHOLTOP) $(RANLIB) $(VARIANTSDIR)/choltop.a lucr: $(LUCR) $(ARCH) $(ARCHFLAGS) $(VARIANTSDIR)/lucr.a $(LUCR) $(RANLIB) $(VARIANTSDIR)/lucr.a lull: $(LULL) $(ARCH) $(ARCHFLAGS) $(VARIANTSDIR)/lull.a $(LULL) $(RANLIB) $(VARIANTSDIR)/lull.a lurec: $(LUREC) $(ARCH) $(ARCHFLAGS) $(VARIANTSDIR)/lurec.a $(LUREC) $(RANLIB) $(VARIANTSDIR)/lurec.a qrll: $(QRLL) $(ARCH) $(ARCHFLAGS) $(VARIANTSDIR)/qrll.a $(QRLL) $(RANLIB) $(VARIANTSDIR)/qrll.a .c.o: $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(CHOLRL) $(CHOLTOP) $(LUCR) $(LULL) $(LUREC) $(QRLL) \ $(VARIANTSDIR)/*.a starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/README000066400000000000000000000057611413463044200213220ustar00rootroot00000000000000 =============== = README File = =============== This README File is for the LAPACK driver variants. It is composed of 5 sections: - Description: contents a quick description of each of the variants. For a more detailed description please refer to LAWN XXX. - Build - Testing - Linking your program - Support Author: Julie LANGOU, May 2008 =============== = DESCRIPTION = =============== This directory contains several variants of LAPACK routines in single/double/complex/double complex precision: - [sdcz]getrf with LU Crout Level 3 BLAS version algorithm [2]- Directory: SRC/VARIANTS/lu/CR - [sdcz]getrf with LU Left Looking Level 3 BLAS version algorithm [2]- Directory: SRC/VARIANTS/lu/LL - [sdcz]getrf with Sivan Toledo's recursive LU algorithm [1] - Directory: SRC/VARIANTS/lu/REC - [sdcz]geqrf with QR Left Looking Level 3 BLAS version algorithm [2]- Directory: SRC/VARIANTS/qr/LL - [sdcz]potrf with Cholesky Right Looking Level 3 BLAS version algorithm [2]- Directory: SRC/VARIANTS/cholesky/RL - [sdcz]potrf with Cholesky Top Level 3 BLAS version algorithm [2]- Directory: SRC/VARIANTS/cholesky/TOP References:For a more detailed description please refer to - [1] Toledo, S. 1997. Locality of Reference in LU Decomposition with Partial Pivoting. SIAM J. Matrix Anal. Appl. 18, 4 (Oct. 1997), 1065-1081. http://dx.doi.org/10.1137/S0895479896297744 - [2]LAWN XXX ========= = BUILD = ========= These variants are compiled by default in the build process but they are not tested by default. The build process creates one new library per variants in the four arithmetics (singel/double/comple/double complex). The libraries are in the SRC/VARIANTS/LIB directory. Corresponding libraries created in SRC/VARIANTS/LIB: - LU Crout : lucr.a - LU Left Looking : lull.a - LU Sivan Toledo's recursive : lurec.a - QR Left Looking : qrll.a - Cholesky Right Looking : cholrl.a - Cholesky Top : choltop.a =========== = TESTING = =========== To test these variants you can type 'make variants-testing' This will rerun the linear methods testings once per variants and append the short name of the variants to the output files. You should then see the following files in the TESTING directory: [scdz]test_cholrl.out [scdz]test_choltop.out [scdz]test_lucr.out [scdz]test_lull.out [scdz]test_lurec.out [scdz]test_qrll.out ======================== = LINKING YOUR PROGRAM = ======================== You just need to add the variants methods library in your linking sequence before your lapack libary. Here is a quick example for LU Default using LU Right Looking version: $(FORTRAN) -c myprog.f $(FORTRAN) -o myexe myprog.o $(LAPACKLIB) $(BLASLIB) Using LU Left Looking version: $(FORTRAN) -c myprog.f $(FORTRAN) -o myexe myprog.o $(PATH TO LAPACK/SRC/VARIANTS/LIB)/lull.a $(LAPACKLIB) $(BLASLIB) =========== = SUPPORT = =========== You can use either LAPACK forum or the LAPACK mailing list to get support. LAPACK forum : http://icl.cs.utk.edu/lapack-forum LAPACK mailing list : lapack@cs.utk.edu starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/cholesky/000077500000000000000000000000001413463044200222525ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/cholesky/RL/000077500000000000000000000000001413463044200225675ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/cholesky/RL/dpotrf.c000066400000000000000000000152121413463044200242320ustar00rootroot00000000000000/* dpotrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b17 = 1.; static doublereal c_b20 = -1.; /* Subroutine */ int _starpu_dpotrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer j, jb, nb; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dpotf2_(char *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* March 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOTRF computes the Cholesky factorization of a real symmetric */ /* positive definite matrix A. */ /* The factorization has the form */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* This is the right looking block version of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code. */ _starpu_dpotf2_(uplo, n, &a[a_offset], lda, info); } else { /* Use blocked code. */ if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ /* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); _starpu_dpotf2_("Upper", &jb, &a[j + j * a_dim1], lda, info); if (*info != 0) { goto L30; } if (j + jb <= *n) { /* Updating the trailing submatrix. */ i__3 = *n - j - jb + 1; _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", &jb, & i__3, &c_b17, &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda); i__3 = *n - j - jb + 1; _starpu_dsyrk_("Upper", "Transpose", &i__3, &jb, &c_b20, &a[j + ( j + jb) * a_dim1], lda, &c_b17, &a[j + jb + (j + jb) * a_dim1], lda); } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__2 = *n; i__1 = nb; for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ /* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); _starpu_dpotf2_("Lower", &jb, &a[j + j * a_dim1], lda, info); if (*info != 0) { goto L30; } if (j + jb <= *n) { /* Updating the trailing submatrix. */ i__3 = *n - j - jb + 1; _starpu_dtrsm_("Right", "Lower", "Transpose", "Non-unit", &i__3, & jb, &c_b17, &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda); i__3 = *n - j - jb + 1; _starpu_dsyrk_("Lower", "No Transpose", &i__3, &jb, &c_b20, &a[j + jb + j * a_dim1], lda, &c_b17, &a[j + jb + (j + jb) * a_dim1], lda); } /* L20: */ } } } goto L40; L30: *info = *info + j - 1; L40: return 0; /* End of DPOTRF */ } /* _starpu_dpotrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/cholesky/TOP/000077500000000000000000000000001413463044200227145ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/cholesky/TOP/dpotrf.c000066400000000000000000000146131413463044200243630ustar00rootroot00000000000000/* dpotrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b15 = 1.; static doublereal c_b18 = -1.; /* Subroutine */ int _starpu_dpotrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer j, jb, nb; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dpotf2_(char *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* March 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOTRF computes the Cholesky factorization of a real symmetric */ /* positive definite matrix A. */ /* The factorization has the form */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* This is the top-looking block version of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code. */ _starpu_dpotf2_(uplo, n, &a[a_offset], lda, info); } else { /* Use blocked code. */ if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); /* Compute the current block. */ i__3 = j - 1; _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", &i__3, &jb, & c_b15, &a[a_dim1 + 1], lda, &a[j * a_dim1 + 1], lda); i__3 = j - 1; _starpu_dsyrk_("Upper", "Transpose", &jb, &i__3, &c_b18, &a[j * a_dim1 + 1], lda, &c_b15, &a[j + j * a_dim1], lda); /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ _starpu_dpotf2_("Upper", &jb, &a[j + j * a_dim1], lda, info); if (*info != 0) { goto L30; } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__2 = *n; i__1 = nb; for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); /* Compute the current block. */ i__3 = j - 1; _starpu_dtrsm_("Right", "Lower", "Transpose", "Non-unit", &jb, &i__3, &c_b15, &a[a_dim1 + 1], lda, &a[j + a_dim1], lda); i__3 = j - 1; _starpu_dsyrk_("Lower", "No Transpose", &jb, &i__3, &c_b18, &a[j + a_dim1], lda, &c_b15, &a[j + j * a_dim1], lda); /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ _starpu_dpotf2_("Lower", &jb, &a[j + j * a_dim1], lda, info); if (*info != 0) { goto L30; } /* L20: */ } } } goto L40; L30: *info = *info + j - 1; L40: return 0; /* End of DPOTRF */ } /* _starpu_dpotrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/000077500000000000000000000000001413463044200210515ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/CR/000077500000000000000000000000001413463044200213555ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/CR/dgetrf.c000066400000000000000000000147211413463044200230010ustar00rootroot00000000000000/* dgetrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b11 = -1.; static doublereal c_b12 = 1.; /* Subroutine */ int _starpu_dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, jb, nb; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iinfo; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dgetf2_( integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* March 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETRF computes an LU factorization of a general M-by-N matrix A */ /* using partial pivoting with row interchanges. */ /* The factorization has the form */ /* A = P * L * U */ /* where P is a permutation matrix, L is lower triangular with unit */ /* diagonal elements (lower trapezoidal if m > n), and U is upper */ /* triangular (upper trapezoidal if m < n). */ /* This is the Crout Level 3 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix to be factored. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETRF", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DGETRF", " ", m, n, &c_n1, &c_n1); if (nb <= 1 || nb >= min(*m,*n)) { /* Use unblocked code. */ _starpu_dgetf2_(m, n, &a[a_offset], lda, &ipiv[1], info); } else { /* Use blocked code. */ i__1 = min(*m,*n); i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = min(*m,*n) - j + 1; jb = min(i__3,nb); /* Update current block. */ i__3 = *m - j + 1; i__4 = j - 1; _starpu_dgemm_("No transpose", "No transpose", &i__3, &jb, &i__4, &c_b11, &a[j + a_dim1], lda, &a[j * a_dim1 + 1], lda, &c_b12, &a[ j + j * a_dim1], lda); /* Factor diagonal and subdiagonal blocks and test for exact */ /* singularity. */ i__3 = *m - j + 1; _starpu_dgetf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); /* Adjust INFO and the pivot indices. */ if (*info == 0 && iinfo > 0) { *info = iinfo + j - 1; } /* Computing MIN */ i__4 = *m, i__5 = j + jb - 1; i__3 = min(i__4,i__5); for (i__ = j; i__ <= i__3; ++i__) { ipiv[i__] = j - 1 + ipiv[i__]; /* L10: */ } /* Apply interchanges to column 1:J-1 */ i__3 = j - 1; i__4 = j + jb - 1; _starpu_dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); if (j + jb <= *n) { /* Apply interchanges to column J+JB:N */ i__3 = *n - j - jb + 1; i__4 = j + jb - 1; _starpu_dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, & ipiv[1], &c__1); i__3 = *n - j - jb + 1; i__4 = j - 1; _starpu_dgemm_("No transpose", "No transpose", &jb, &i__3, &i__4, & c_b11, &a[j + a_dim1], lda, &a[(j + jb) * a_dim1 + 1], lda, &c_b12, &a[j + (j + jb) * a_dim1], lda); /* Compute block row of U. */ i__3 = *n - j - jb + 1; _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &jb, &i__3, & c_b12, &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda); } /* L20: */ } } return 0; /* End of DGETRF */ } /* _starpu_dgetrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/LL/000077500000000000000000000000001413463044200213605ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/LL/dgetrf.c000066400000000000000000000164631413463044200230110ustar00rootroot00000000000000/* dgetrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b15 = 1.; static doublereal c_b18 = -1.; /* Subroutine */ int _starpu_dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; /* Local variables */ integer i__, j, k, jb, nb; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iinfo; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dgetf2_( integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* March 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETRF computes an LU factorization of a general M-by-N matrix A */ /* using partial pivoting with row interchanges. */ /* The factorization has the form */ /* A = P * L * U */ /* where P is a permutation matrix, L is lower triangular with unit */ /* diagonal elements (lower trapezoidal if m > n), and U is upper */ /* triangular (upper trapezoidal if m < n). */ /* This is the left-looking Level 3 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix to be factored. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETRF", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DGETRF", " ", m, n, &c_n1, &c_n1); if (nb <= 1 || nb >= min(*m,*n)) { /* Use unblocked code. */ _starpu_dgetf2_(m, n, &a[a_offset], lda, &ipiv[1], info); } else { /* Use blocked code. */ i__1 = min(*m,*n); i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = min(*m,*n) - j + 1; jb = min(i__3,nb); /* Update before factoring the current panel */ i__3 = j - nb; i__4 = nb; for (k = 1; i__4 < 0 ? k >= i__3 : k <= i__3; k += i__4) { /* Apply interchanges to rows K:K+NB-1. */ i__5 = k + nb - 1; _starpu_dlaswp_(&jb, &a[j * a_dim1 + 1], lda, &k, &i__5, &ipiv[1], & c__1); /* Compute block row of U. */ _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &nb, &jb, & c_b15, &a[k + k * a_dim1], lda, &a[k + j * a_dim1], lda); /* Update trailing submatrix. */ i__5 = *m - k - nb + 1; _starpu_dgemm_("No transpose", "No transpose", &i__5, &jb, &nb, & c_b18, &a[k + nb + k * a_dim1], lda, &a[k + j * a_dim1], lda, &c_b15, &a[k + nb + j * a_dim1], lda); /* L30: */ } /* Factor diagonal and subdiagonal blocks and test for exact */ /* singularity. */ i__4 = *m - j + 1; _starpu_dgetf2_(&i__4, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); /* Adjust INFO and the pivot indices. */ if (*info == 0 && iinfo > 0) { *info = iinfo + j - 1; } /* Computing MIN */ i__3 = *m, i__5 = j + jb - 1; i__4 = min(i__3,i__5); for (i__ = j; i__ <= i__4; ++i__) { ipiv[i__] = j - 1 + ipiv[i__]; /* L10: */ } /* L20: */ } /* Apply interchanges to the left-overs */ i__2 = min(*m,*n); i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { i__4 = k - 1; /* Computing MIN */ i__5 = k + nb - 1, i__6 = min(*m,*n); i__3 = min(i__5,i__6); _starpu_dlaswp_(&i__4, &a[a_dim1 + 1], lda, &k, &i__3, &ipiv[1], &c__1); /* L40: */ } /* Apply update to the M+1:N columns when N > M */ if (*n > *m) { i__1 = *n - *m; _starpu_dlaswp_(&i__1, &a[(*m + 1) * a_dim1 + 1], lda, &c__1, m, &ipiv[1], &c__1); i__1 = *m; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ i__4 = *m - k + 1; jb = min(i__4,nb); i__4 = *n - *m; _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &jb, &i__4, & c_b15, &a[k + k * a_dim1], lda, &a[k + (*m + 1) * a_dim1], lda); if (k + nb <= *m) { i__4 = *m - k - nb + 1; i__3 = *n - *m; _starpu_dgemm_("No transpose", "No transpose", &i__4, &i__3, &nb, &c_b18, &a[k + nb + k * a_dim1], lda, &a[k + (*m + 1) * a_dim1], lda, &c_b15, &a[k + nb + (*m + 1) * a_dim1], lda); } /* L50: */ } } } return 0; /* End of DGETRF */ } /* _starpu_dgetrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/REC/000077500000000000000000000000001413463044200214625ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/lu/REC/dgetrf.c000066400000000000000000000205641413463044200231100ustar00rootroot00000000000000/* dgetrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = 1.; static doublereal c_b15 = -1.; /* Subroutine */ int _starpu_dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, ipivstart, jpivstart, jp; doublereal tmp; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer kcols; doublereal sfmin; integer nstep; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer kahead; extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer npived; extern /* Subroutine */ int _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); integer kstart, ntopiv; /* -- LAPACK routine (version 3.X) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* May 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETRF computes an LU factorization of a general M-by-N matrix A */ /* using partial pivoting with row interchanges. */ /* The factorization has the form */ /* A = P * L * U */ /* where P is a permutation matrix, L is lower triangular with unit */ /* diagonal elements (lower trapezoidal if m > n), and U is upper */ /* triangular (upper trapezoidal if m < n). */ /* This code implements an iterative version of Sivan Toledo's recursive */ /* LU algorithm[1]. For square matrices, this iterative versions should */ /* be within a factor of two of the optimum number of memory transfers. */ /* The pattern is as follows, with the large blocks of U being updated */ /* in one call to DTRSM, and the dotted lines denoting sections that */ /* have had all pending permutations applied: */ /* 1 2 3 4 5 6 7 8 */ /* +-+-+---+-------+------ */ /* | |1| | | */ /* |.+-+ 2 | | */ /* | | | | | */ /* |.|.+-+-+ 4 | */ /* | | | |1| | */ /* | | |.+-+ | */ /* | | | | | | */ /* |.|.|.|.+-+-+---+ 8 */ /* | | | | | |1| | */ /* | | | | |.+-+ 2 | */ /* | | | | | | | | */ /* | | | | |.|.+-+-+ */ /* | | | | | | | |1| */ /* | | | | | | |.+-+ */ /* | | | | | | | | | */ /* |.|.|.|.|.|.|.|.+----- */ /* | | | | | | | | | */ /* The 1-2-1-4-1-2-1-8-... pattern is the position of the last 1 bit in */ /* the binary expansion of the current column. Each Schur update is */ /* applied as soon as the necessary portion of U is available. */ /* [1] Toledo, S. 1997. Locality of Reference in LU Decomposition with */ /* Partial Pivoting. SIAM J. Matrix Anal. Appl. 18, 4 (Oct. 1997), */ /* 1065-1081. http://dx.doi.org/10.1137/S0895479896297744 */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix to be factored. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETRF", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Compute machine safe minimum */ sfmin = _starpu_dlamch_("S"); nstep = min(*m,*n); i__1 = nstep; for (j = 1; j <= i__1; ++j) { kahead = j & -j; kstart = j + 1 - kahead; /* Computing MIN */ i__2 = kahead, i__3 = *m - j; kcols = min(i__2,i__3); /* Find pivot. */ i__2 = *m - j + 1; jp = j - 1 + _starpu_idamax_(&i__2, &a[j + j * a_dim1], &c__1); ipiv[j] = jp; /* Permute just this column. */ if (jp != j) { tmp = a[j + j * a_dim1]; a[j + j * a_dim1] = a[jp + j * a_dim1]; a[jp + j * a_dim1] = tmp; } /* Apply pending permutations to L */ ntopiv = 1; ipivstart = j; jpivstart = j - ntopiv; while(ntopiv < kahead) { _starpu_dlaswp_(&ntopiv, &a[jpivstart * a_dim1 + 1], lda, &ipivstart, &j, &ipiv[1], &c__1); ipivstart -= ntopiv; ntopiv <<= 1; jpivstart -= ntopiv; } /* Permute U block to match L */ _starpu_dlaswp_(&kcols, &a[(j + 1) * a_dim1 + 1], lda, &kstart, &j, &ipiv[1], &c__1); /* Factor the current column */ if (a[j + j * a_dim1] != 0. && ! _starpu_disnan_(&a[j + j * a_dim1])) { if ((d__1 = a[j + j * a_dim1], abs(d__1)) >= sfmin) { i__2 = *m - j; d__1 = 1. / a[j + j * a_dim1]; _starpu_dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); } else { i__2 = *m - j; for (i__ = 1; i__ <= i__2; ++i__) { a[j + i__ + j * a_dim1] /= a[j + j * a_dim1]; } } } else if (a[j + j * a_dim1] == 0. && *info == 0) { *info = j; } /* Solve for U block. */ _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &kahead, &kcols, & c_b12, &a[kstart + kstart * a_dim1], lda, &a[kstart + (j + 1) * a_dim1], lda); /* Schur complement. */ i__2 = *m - j; _starpu_dgemm_("No transpose", "No transpose", &i__2, &kcols, &kahead, &c_b15, &a[j + 1 + kstart * a_dim1], lda, &a[kstart + (j + 1) * a_dim1], lda, &c_b12, &a[j + 1 + (j + 1) * a_dim1], lda); } /* Handle pivot permutations on the way out of the recursion */ npived = nstep & -nstep; j = nstep - npived; while(j > 0) { ntopiv = j & -j; i__1 = j + 1; _starpu_dlaswp_(&ntopiv, &a[(j - ntopiv + 1) * a_dim1 + 1], lda, &i__1, & nstep, &ipiv[1], &c__1); j -= ntopiv; } /* If short and wide, handle the rest of the columns. */ if (*m < *n) { i__1 = *n - *m; _starpu_dlaswp_(&i__1, &a[(*m + kcols + 1) * a_dim1 + 1], lda, &c__1, m, & ipiv[1], &c__1); i__1 = *n - *m; _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", m, &i__1, &c_b12, &a[ a_offset], lda, &a[(*m + kcols + 1) * a_dim1 + 1], lda); } return 0; /* End of DGETRF */ } /* _starpu_dgetrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/qr/000077500000000000000000000000001413463044200210535ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/qr/LL/000077500000000000000000000000001413463044200213625ustar00rootroot00000000000000starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/qr/LL/dgeqrf.c000066400000000000000000000300461413463044200230010ustar00rootroot00000000000000/* dgeqrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgeqrf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; real r__1; /* Local variables */ integer i__, j, k, ib, nb, nt, nx, iws; extern doublereal _starpu_sceil_(real *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer lbwork, llwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* March 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQRF computes a QR factorization of a real M-by-N matrix A: */ /* A = Q * R. */ /* This is the left-looking Level 3 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(M,N)-by-N upper trapezoidal matrix R (R is */ /* upper triangular if m >= n); the elements below the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of min(m,n) elementary reflectors (see Further */ /* Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. The dimension can be divided into three parts. */ /* 1) The part for the triangular factor T. If the very last T is not bigger */ /* than any of the rest, then this part is NB x ceiling(K/NB), otherwise, */ /* NB x (K-NT), where K = min(M,N) and NT is the dimension of the very last T */ /* 2) The part for the very last T when T is bigger than any of the rest T. */ /* The size of this part is NT x NT, where NT = K - ceiling ((K-NX)/NB) x NB, */ /* where K = min(M,N), NX is calculated by */ /* NX = MAX( 0, ILAENV( 3, 'DGEQRF', ' ', M, N, -1, -1 ) ) */ /* 3) The part for dlarfb is of size max((N-M)*K, (N-M)*NB, K*NB, NB*NB) */ /* So LWORK = part1 + part2 + part3 */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nbmin = 2; nx = 0; iws = *n; k = min(*m,*n); nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGEQRF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); } /* Get NT, the size of the very last T, which is the left-over from in-between K-NX and K to K, eg.: */ /* NB=3 2NB=6 K=10 */ /* | | | */ /* 1--2--3--4--5--6--7--8--9--10 */ /* | \________/ */ /* K-NX=5 NT=4 */ /* So here 4 x 4 is the last T stored in the workspace */ r__1 = (real) (k - nx) / (real) nb; nt = k - _starpu_sceil_(&r__1) * nb; /* optimal workspace = space for dlarfb + space for normal T's + space for the last T */ /* Computing MAX */ /* Computing MAX */ i__3 = (*n - *m) * k, i__4 = (*n - *m) * nb; /* Computing MAX */ i__5 = k * nb, i__6 = nb * nb; i__1 = max(i__3,i__4), i__2 = max(i__5,i__6); llwork = max(i__1,i__2); r__1 = (real) llwork / (real) nb; llwork = _starpu_sceil_(&r__1); if (nt > nb) { lbwork = k - nt; /* Optimal workspace for dlarfb = MAX(1,N)*NT */ lwkopt = (lbwork + llwork) * nb; work[1] = (doublereal) (lwkopt + nt * nt); } else { r__1 = (real) k / (real) nb; lbwork = _starpu_sceil_(&r__1) * nb; lwkopt = (lbwork + llwork - nb) * nb; work[1] = (doublereal) lwkopt; } /* Test the input arguments */ lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*n) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQRF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (k == 0) { work[1] = 1.; return 0; } if (nb > 1 && nb < k) { if (nx < k) { /* Determine if workspace is large enough for blocked code. */ if (nt <= nb) { iws = (lbwork + llwork - nb) * nb; } else { iws = (lbwork + llwork) * nb + nt * nt; } if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ if (nt <= nb) { nb = *lwork / (llwork + (lbwork - nb)); } else { nb = (*lwork - nt * nt) / (lbwork + llwork); } /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGEQRF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Update the current column using old T's */ i__3 = i__ - nb; i__4 = nb; for (j = 1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { /* Apply H' to A(J:M,I:I+IB-1) from the left */ i__5 = *m - j + 1; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__5, & ib, &nb, &a[j + j * a_dim1], lda, &work[j], &lbwork, & a[j + i__ * a_dim1], lda, &work[lbwork * nb + nt * nt + 1], &ib); /* L20: */ } /* Compute the QR factorization of the current block */ /* A(I:M,I:I+IB-1) */ i__4 = *m - i__ + 1; _starpu_dgeqr2_(&i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ lbwork * nb + nt * nt + 1], &iinfo); if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = *m - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[i__], &lbwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { if (i__ != 1) { i__2 = i__ - nb; i__1 = nb; for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Apply H' to A(J:M,I:K) from the left */ i__4 = *m - j + 1; i__3 = k - i__ + 1; i__5 = k - i__ + 1; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__4, & i__3, &nb, &a[j + j * a_dim1], lda, &work[j], &lbwork, &a[j + i__ * a_dim1], lda, &work[lbwork * nb + nt * nt + 1], &i__5); /* L30: */ } i__1 = *m - i__ + 1; i__2 = k - i__ + 1; _starpu_dgeqr2_(&i__1, &i__2, &a[i__ + i__ * a_dim1], lda, &tau[i__], & work[lbwork * nb + nt * nt + 1], &iinfo); } else { /* Use unblocked code to factor the last or only block. */ i__1 = *m - i__ + 1; i__2 = *n - i__ + 1; _starpu_dgeqr2_(&i__1, &i__2, &a[i__ + i__ * a_dim1], lda, &tau[i__], & work[1], &iinfo); } } /* Apply update to the column M+1:N when N > M */ if (*m < *n && i__ != 1) { /* Form the last triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ if (nt <= nb) { i__1 = *m - i__ + 1; i__2 = k - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[i__], &lbwork); } else { i__1 = *m - i__ + 1; i__2 = k - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[lbwork * nb + 1], &nt); } /* Apply H' to A(1:M,M+1:N) from the left */ i__1 = k - nx; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__4 = k - j + 1; ib = min(i__4,nb); i__4 = *m - j + 1; i__3 = *n - *m; i__5 = *n - *m; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__4, & i__3, &ib, &a[j + j * a_dim1], lda, &work[j], &lbwork, &a[ j + (*m + 1) * a_dim1], lda, &work[lbwork * nb + nt * nt + 1], &i__5); /* L40: */ } if (nt <= nb) { i__2 = *m - j + 1; i__1 = *n - *m; i__4 = k - j + 1; i__3 = *n - *m; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__2, & i__1, &i__4, &a[j + j * a_dim1], lda, &work[j], &lbwork, & a[j + (*m + 1) * a_dim1], lda, &work[lbwork * nb + nt * nt + 1], &i__3); } else { i__2 = *m - j + 1; i__1 = *n - *m; i__4 = k - j + 1; i__3 = *n - *m; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__2, & i__1, &i__4, &a[j + j * a_dim1], lda, &work[lbwork * nb + 1], &nt, &a[j + (*m + 1) * a_dim1], lda, &work[lbwork * nb + nt * nt + 1], &i__3); } } work[1] = (doublereal) iws; return 0; /* End of DGEQRF */ } /* _starpu_dgeqrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/VARIANTS/qr/LL/sceil.c000066400000000000000000000022131413463044200226230ustar00rootroot00000000000000/* sceil.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_sceil_(real *a) { /* System generated locals */ real ret_val; /* -- LAPACK routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* June 2008 */ /* .. Scalar Arguments ..* */ /* .. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements ..* */ if (*a - (integer) (*a) == 0.f) { ret_val = *a; } else if (*a > 0.f) { ret_val = (real) ((integer) (*a) + 1); } else { ret_val = (real) ((integer) (*a)); } return ret_val; } /* _starpu_sceil_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/chla_transtype.c000066400000000000000000000037121413463044200223710ustar00rootroot00000000000000/* _starpu_chla_transtype.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Character */ VOID _starpu_chla_transtype__(char *ret_val, ftnlen ret_val_len, integer *trans) { /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* October 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine translates from a BLAST-specified integer constant to */ /* the character string specifying a transposition operation. */ /* CHLA_TRANSTYPE returns an CHARACTER*1. If CHLA_TRANSTYPE is 'X', */ /* then input is not an integer indicating a transposition operator. */ /* Otherwise CHLA_TRANSTYPE returns the constant value corresponding to */ /* TRANS. */ /* Arguments */ /* ========= */ /* TRANS (input) INTEGER */ /* Specifies the form of the system of equations: */ /* = BLAS_NO_TRANS = 111 : No Transpose */ /* = BLAS_TRANS = 112 : Transpose */ /* = BLAS_CONJ_TRANS = 113 : Conjugate Transpose */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Executable Statements .. */ if (*trans == 111) { *(unsigned char *)ret_val = 'N'; } else if (*trans == 112) { *(unsigned char *)ret_val = 'T'; } else if (*trans == 113) { *(unsigned char *)ret_val = 'C'; } else { *(unsigned char *)ret_val = 'X'; } return ; /* End of CHLA_TRANSTYPE */ } /* _starpu_chla_transtype__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dbdsdc.c000066400000000000000000000411011413463044200205660ustar00rootroot00000000000000/* dbdsdc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__9 = 9; static integer c__0 = 0; static doublereal c_b15 = 1.; static integer c__1 = 1; static doublereal c_b29 = 0.; /* Subroutine */ int _starpu_dbdsdc_(char *uplo, char *compq, integer *n, doublereal * d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *q, integer *iq, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *), log(doublereal); /* Local variables */ integer i__, j, k; doublereal p, r__; integer z__, ic, ii, kk; doublereal cs; integer is, iu; doublereal sn; integer nm1; doublereal eps; integer ivt, difl, difr, ierr, perm, mlvl, sqre; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer * , doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer poles, iuplo, nsize, start; extern /* Subroutine */ int _starpu_dlasd0_(integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlasda_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer givcol; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); integer icompq; doublereal orgnrm; integer givnum, givptr, qstart, smlsiz, wstart, smlszp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DBDSDC computes the singular value decomposition (SVD) of a real */ /* N-by-N (upper or lower) bidiagonal matrix B: B = U * S * VT, */ /* using a divide and conquer method, where S is a diagonal matrix */ /* with non-negative diagonal elements (the singular values of B), and */ /* U and VT are orthogonal matrices of left and right singular vectors, */ /* respectively. DBDSDC can be used to compute all singular values, */ /* and optionally, singular vectors or singular vectors in compact form. */ /* This code makes very mild assumptions about floating point */ /* arithmetic. It will work on machines with a guard digit in */ /* add/subtract, or on those binary machines without guard digits */ /* which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ /* It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. See DLASD3 for details. */ /* The code currently calls DLASDQ if singular values only are desired. */ /* However, it can be slightly modified to compute singular values */ /* using the divide and conquer method. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': B is upper bidiagonal. */ /* = 'L': B is lower bidiagonal. */ /* COMPQ (input) CHARACTER*1 */ /* Specifies whether singular vectors are to be computed */ /* as follows: */ /* = 'N': Compute singular values only; */ /* = 'P': Compute singular values and compute singular */ /* vectors in compact form; */ /* = 'I': Compute singular values and singular vectors. */ /* N (input) INTEGER */ /* The order of the matrix B. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the bidiagonal matrix B. */ /* On exit, if INFO=0, the singular values of B. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the elements of E contain the offdiagonal */ /* elements of the bidiagonal matrix whose SVD is desired. */ /* On exit, E has been destroyed. */ /* U (output) DOUBLE PRECISION array, dimension (LDU,N) */ /* If COMPQ = 'I', then: */ /* On exit, if INFO = 0, U contains the left singular vectors */ /* of the bidiagonal matrix. */ /* For other values of COMPQ, U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= 1. */ /* If singular vectors are desired, then LDU >= max( 1, N ). */ /* VT (output) DOUBLE PRECISION array, dimension (LDVT,N) */ /* If COMPQ = 'I', then: */ /* On exit, if INFO = 0, VT' contains the right singular */ /* vectors of the bidiagonal matrix. */ /* For other values of COMPQ, VT is not referenced. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. LDVT >= 1. */ /* If singular vectors are desired, then LDVT >= max( 1, N ). */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ) */ /* If COMPQ = 'P', then: */ /* On exit, if INFO = 0, Q and IQ contain the left */ /* and right singular vectors in a compact form, */ /* requiring O(N log N) space instead of 2*N**2. */ /* In particular, Q contains all the DOUBLE PRECISION data in */ /* LDQ >= N*(11 + 2*SMLSIZ + 8*INT(LOG_2(N/(SMLSIZ+1)))) */ /* words of memory, where SMLSIZ is returned by ILAENV and */ /* is equal to the maximum size of the subproblems at the */ /* bottom of the computation tree (usually about 25). */ /* For other values of COMPQ, Q is not referenced. */ /* IQ (output) INTEGER array, dimension (LDIQ) */ /* If COMPQ = 'P', then: */ /* On exit, if INFO = 0, Q and IQ contain the left */ /* and right singular vectors in a compact form, */ /* requiring O(N log N) space instead of 2*N**2. */ /* In particular, IQ contains all INTEGER data in */ /* LDIQ >= N*(3 + 3*INT(LOG_2(N/(SMLSIZ+1)))) */ /* words of memory, where SMLSIZ is returned by ILAENV and */ /* is equal to the maximum size of the subproblems at the */ /* bottom of the computation tree (usually about 25). */ /* For other values of COMPQ, IQ is not referenced. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* If COMPQ = 'N' then LWORK >= (4 * N). */ /* If COMPQ = 'P' then LWORK >= (6 * N). */ /* If COMPQ = 'I' then LWORK >= (3 * N**2 + 4 * N). */ /* IWORK (workspace) INTEGER array, dimension (8*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: The algorithm failed to compute an singular value. */ /* The update process of divide and conquer failed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* Changed dimension statement in comment describing E from (N) to */ /* (N-1). Sven, 17 Feb 05. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; --q; --iq; --work; --iwork; /* Function Body */ *info = 0; iuplo = 0; if (_starpu_lsame_(uplo, "U")) { iuplo = 1; } if (_starpu_lsame_(uplo, "L")) { iuplo = 2; } if (_starpu_lsame_(compq, "N")) { icompq = 0; } else if (_starpu_lsame_(compq, "P")) { icompq = 1; } else if (_starpu_lsame_(compq, "I")) { icompq = 2; } else { icompq = -1; } if (iuplo == 0) { *info = -1; } else if (icompq < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ldu < 1 || icompq == 2 && *ldu < *n) { *info = -7; } else if (*ldvt < 1 || icompq == 2 && *ldvt < *n) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DBDSDC", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } smlsiz = _starpu_ilaenv_(&c__9, "DBDSDC", " ", &c__0, &c__0, &c__0, &c__0); if (*n == 1) { if (icompq == 1) { q[1] = d_sign(&c_b15, &d__[1]); q[smlsiz * *n + 1] = 1.; } else if (icompq == 2) { u[u_dim1 + 1] = d_sign(&c_b15, &d__[1]); vt[vt_dim1 + 1] = 1.; } d__[1] = abs(d__[1]); return 0; } nm1 = *n - 1; /* If matrix lower bidiagonal, rotate to be upper bidiagonal */ /* by applying Givens rotations on the left */ wstart = 1; qstart = 3; if (icompq == 1) { _starpu_dcopy_(n, &d__[1], &c__1, &q[1], &c__1); i__1 = *n - 1; _starpu_dcopy_(&i__1, &e[1], &c__1, &q[*n + 1], &c__1); } if (iuplo == 2) { qstart = 5; wstart = (*n << 1) - 1; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); d__[i__] = r__; e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; if (icompq == 1) { q[i__ + (*n << 1)] = cs; q[i__ + *n * 3] = sn; } else if (icompq == 2) { work[i__] = cs; work[nm1 + i__] = -sn; } /* L10: */ } } /* If ICOMPQ = 0, use DLASDQ to compute the singular values. */ if (icompq == 0) { _starpu_dlasdq_("U", &c__0, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[ vt_offset], ldvt, &u[u_offset], ldu, &u[u_offset], ldu, &work[ wstart], info); goto L40; } /* If N is smaller than the minimum divide size SMLSIZ, then solve */ /* the problem with another solver. */ if (*n <= smlsiz) { if (icompq == 2) { _starpu_dlaset_("A", n, n, &c_b29, &c_b15, &u[u_offset], ldu); _starpu_dlaset_("A", n, n, &c_b29, &c_b15, &vt[vt_offset], ldvt); _starpu_dlasdq_("U", &c__0, n, n, n, &c__0, &d__[1], &e[1], &vt[vt_offset] , ldvt, &u[u_offset], ldu, &u[u_offset], ldu, &work[ wstart], info); } else if (icompq == 1) { iu = 1; ivt = iu + *n; _starpu_dlaset_("A", n, n, &c_b29, &c_b15, &q[iu + (qstart - 1) * *n], n); _starpu_dlaset_("A", n, n, &c_b29, &c_b15, &q[ivt + (qstart - 1) * *n], n); _starpu_dlasdq_("U", &c__0, n, n, n, &c__0, &d__[1], &e[1], &q[ivt + ( qstart - 1) * *n], n, &q[iu + (qstart - 1) * *n], n, &q[ iu + (qstart - 1) * *n], n, &work[wstart], info); } goto L40; } if (icompq == 2) { _starpu_dlaset_("A", n, n, &c_b29, &c_b15, &u[u_offset], ldu); _starpu_dlaset_("A", n, n, &c_b29, &c_b15, &vt[vt_offset], ldvt); } /* Scale. */ orgnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (orgnrm == 0.) { return 0; } _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b15, n, &c__1, &d__[1], n, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b15, &nm1, &c__1, &e[1], &nm1, & ierr); eps = _starpu_dlamch_("Epsilon"); mlvl = (integer) (log((doublereal) (*n) / (doublereal) (smlsiz + 1)) / log(2.)) + 1; smlszp = smlsiz + 1; if (icompq == 1) { iu = 1; ivt = smlsiz + 1; difl = ivt + smlszp; difr = difl + mlvl; z__ = difr + (mlvl << 1); ic = z__ + mlvl; is = ic + 1; poles = is + 1; givnum = poles + (mlvl << 1); k = 1; givptr = 2; perm = 3; givcol = perm + mlvl; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) < eps) { d__[i__] = d_sign(&eps, &d__[i__]); } /* L20: */ } start = 1; sqre = 0; i__1 = nm1; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { /* Subproblem found. First determine its size and then */ /* apply divide and conquer on it. */ if (i__ < nm1) { /* A subproblem with E(I) small for I < NM1. */ nsize = i__ - start + 1; } else if ((d__1 = e[i__], abs(d__1)) >= eps) { /* A subproblem with E(NM1) not too small but I = NM1. */ nsize = *n - start + 1; } else { /* A subproblem with E(NM1) small. This implies an */ /* 1-by-1 subproblem at D(N). Solve this 1-by-1 problem */ /* first. */ nsize = i__ - start + 1; if (icompq == 2) { u[*n + *n * u_dim1] = d_sign(&c_b15, &d__[*n]); vt[*n + *n * vt_dim1] = 1.; } else if (icompq == 1) { q[*n + (qstart - 1) * *n] = d_sign(&c_b15, &d__[*n]); q[*n + (smlsiz + qstart - 1) * *n] = 1.; } d__[*n] = (d__1 = d__[*n], abs(d__1)); } if (icompq == 2) { _starpu_dlasd0_(&nsize, &sqre, &d__[start], &e[start], &u[start + start * u_dim1], ldu, &vt[start + start * vt_dim1], ldvt, &smlsiz, &iwork[1], &work[wstart], info); } else { _starpu_dlasda_(&icompq, &smlsiz, &nsize, &sqre, &d__[start], &e[ start], &q[start + (iu + qstart - 2) * *n], n, &q[ start + (ivt + qstart - 2) * *n], &iq[start + k * *n], &q[start + (difl + qstart - 2) * *n], &q[start + ( difr + qstart - 2) * *n], &q[start + (z__ + qstart - 2) * *n], &q[start + (poles + qstart - 2) * *n], &iq[ start + givptr * *n], &iq[start + givcol * *n], n, & iq[start + perm * *n], &q[start + (givnum + qstart - 2) * *n], &q[start + (ic + qstart - 2) * *n], &q[ start + (is + qstart - 2) * *n], &work[wstart], & iwork[1], info); if (*info != 0) { return 0; } } start = i__ + 1; } /* L30: */ } /* Unscale */ _starpu_dlascl_("G", &c__0, &c__0, &c_b15, &orgnrm, n, &c__1, &d__[1], n, &ierr); L40: /* Use Selection Sort to minimize swaps of singular vectors */ i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; kk = i__; p = d__[i__]; i__2 = *n; for (j = ii; j <= i__2; ++j) { if (d__[j] > p) { kk = j; p = d__[j]; } /* L50: */ } if (kk != i__) { d__[kk] = d__[i__]; d__[i__] = p; if (icompq == 1) { iq[i__] = kk; } else if (icompq == 2) { _starpu_dswap_(n, &u[i__ * u_dim1 + 1], &c__1, &u[kk * u_dim1 + 1], & c__1); _starpu_dswap_(n, &vt[i__ + vt_dim1], ldvt, &vt[kk + vt_dim1], ldvt); } } else if (icompq == 1) { iq[i__] = i__; } /* L60: */ } /* If ICOMPQ = 1, use IQ(N,1) as the indicator for UPLO */ if (icompq == 1) { if (iuplo == 1) { iq[*n] = 1; } else { iq[*n] = 0; } } /* If B is lower bidiagonal, update U by those Givens rotations */ /* which rotated B to be upper bidiagonal */ if (iuplo == 2 && icompq == 2) { _starpu_dlasr_("L", "V", "B", n, n, &work[1], &work[*n], &u[u_offset], ldu); } return 0; /* End of DBDSDC */ } /* _starpu_dbdsdc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dbdsqr.c000066400000000000000000000621701413463044200206330ustar00rootroot00000000000000/* dbdsqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b15 = -.125; static integer c__1 = 1; static doublereal c_b49 = 1.; static doublereal c_b72 = -1.; /* Subroutine */ int _starpu_dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * ldc, doublereal *work, integer *info) { /* System generated locals */ integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double pow_dd(doublereal *, doublereal *), sqrt(doublereal), d_sign( doublereal *, doublereal *); /* Local variables */ doublereal f, g, h__; integer i__, j, m; doublereal r__, cs; integer ll; doublereal sn, mu; integer nm1, nm12, nm13, lll; doublereal eps, sll, tol, abse; integer idir; doublereal abss; integer oldm; doublereal cosl; integer isub, iter; doublereal unfl, sinl, cosr, smin, smax, sinr; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dlas2_( doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal oldcs; extern /* Subroutine */ int _starpu_dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); integer oldll; doublereal shift, sigmn, oldsn; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer maxit; doublereal sminl, sigmx; logical lower; extern /* Subroutine */ int _starpu_dlasq1_(integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *); doublereal sminoa, thresh; logical rotate; doublereal tolmul; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DBDSQR computes the singular values and, optionally, the right and/or */ /* left singular vectors from the singular value decomposition (SVD) of */ /* a real N-by-N (upper or lower) bidiagonal matrix B using the implicit */ /* zero-shift QR algorithm. The SVD of B has the form */ /* B = Q * S * P**T */ /* where S is the diagonal matrix of singular values, Q is an orthogonal */ /* matrix of left singular vectors, and P is an orthogonal matrix of */ /* right singular vectors. If left singular vectors are requested, this */ /* subroutine actually returns U*Q instead of Q, and, if right singular */ /* vectors are requested, this subroutine returns P**T*VT instead of */ /* P**T, for given real input matrices U and VT. When U and VT are the */ /* orthogonal matrices that reduce a general matrix A to bidiagonal */ /* form: A = U*B*VT, as computed by DGEBRD, then */ /* A = (U*Q) * S * (P**T*VT) */ /* is the SVD of A. Optionally, the subroutine may also compute Q**T*C */ /* for a given real input matrix C. */ /* See "Computing Small Singular Values of Bidiagonal Matrices With */ /* Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, */ /* LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11, */ /* no. 5, pp. 873-912, Sept 1990) and */ /* "Accurate singular values and differential qd algorithms," by */ /* B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics */ /* Department, University of California at Berkeley, July 1992 */ /* for a detailed description of the algorithm. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': B is upper bidiagonal; */ /* = 'L': B is lower bidiagonal. */ /* N (input) INTEGER */ /* The order of the matrix B. N >= 0. */ /* NCVT (input) INTEGER */ /* The number of columns of the matrix VT. NCVT >= 0. */ /* NRU (input) INTEGER */ /* The number of rows of the matrix U. NRU >= 0. */ /* NCC (input) INTEGER */ /* The number of columns of the matrix C. NCC >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the bidiagonal matrix B. */ /* On exit, if INFO=0, the singular values of B in decreasing */ /* order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the N-1 offdiagonal elements of the bidiagonal */ /* matrix B. */ /* On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E */ /* will contain the diagonal and superdiagonal elements of a */ /* bidiagonal matrix orthogonally equivalent to the one given */ /* as input. */ /* VT (input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT) */ /* On entry, an N-by-NCVT matrix VT. */ /* On exit, VT is overwritten by P**T * VT. */ /* Not referenced if NCVT = 0. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. */ /* LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0. */ /* U (input/output) DOUBLE PRECISION array, dimension (LDU, N) */ /* On entry, an NRU-by-N matrix U. */ /* On exit, U is overwritten by U * Q. */ /* Not referenced if NRU = 0. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= max(1,NRU). */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC, NCC) */ /* On entry, an N-by-NCC matrix C. */ /* On exit, C is overwritten by Q**T * C. */ /* Not referenced if NCC = 0. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. */ /* LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: If INFO = -i, the i-th argument had an illegal value */ /* > 0: */ /* if NCVT = NRU = NCC = 0, */ /* = 1, a split was marked by a positive value in E */ /* = 2, current block of Z not diagonalized after 30*N */ /* iterations (in inner while loop) */ /* = 3, termination criterion of outer while loop not met */ /* (program created more than N unreduced blocks) */ /* else NCVT = NRU = NCC = 0, */ /* the algorithm did not converge; D and E contain the */ /* elements of a bidiagonal matrix which is orthogonally */ /* similar to the input matrix B; if INFO = i, i */ /* elements of E have not converged to zero. */ /* Internal Parameters */ /* =================== */ /* TOLMUL DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8))) */ /* TOLMUL controls the convergence criterion of the QR loop. */ /* If it is positive, TOLMUL*EPS is the desired relative */ /* precision in the computed singular values. */ /* If it is negative, abs(TOLMUL*EPS*sigma_max) is the */ /* desired absolute accuracy in the computed singular */ /* values (corresponds to relative accuracy */ /* abs(TOLMUL*EPS) in the largest singular value. */ /* abs(TOLMUL) should be between 1 and 1/EPS, and preferably */ /* between 10 (for fast convergence) and .1/EPS */ /* (for there to be some accuracy in the results). */ /* Default is to lose at either one eighth or 2 of the */ /* available decimal digits in each computed singular value */ /* (whichever is smaller). */ /* MAXITR INTEGER, default = 6 */ /* MAXITR controls the maximum number of passes of the */ /* algorithm through its inner loop. The algorithms stops */ /* (and so fails to converge) if the number of passes */ /* through the inner loop exceeds MAXITR*N**2. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; lower = _starpu_lsame_(uplo, "L"); if (! _starpu_lsame_(uplo, "U") && ! lower) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ncvt < 0) { *info = -3; } else if (*nru < 0) { *info = -4; } else if (*ncc < 0) { *info = -5; } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { *info = -9; } else if (*ldu < max(1,*nru)) { *info = -11; } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { *info = -13; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DBDSQR", &i__1); return 0; } if (*n == 0) { return 0; } if (*n == 1) { goto L160; } /* ROTATE is true if any singular vectors desired, false otherwise */ rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; /* If no singular vectors desired, use qd algorithm */ if (! rotate) { _starpu_dlasq1_(n, &d__[1], &e[1], &work[1], info); return 0; } nm1 = *n - 1; nm12 = nm1 + nm1; nm13 = nm12 + nm1; idir = 0; /* Get machine constants */ eps = _starpu_dlamch_("Epsilon"); unfl = _starpu_dlamch_("Safe minimum"); /* If matrix lower bidiagonal, rotate to be upper bidiagonal */ /* by applying Givens rotations on the left */ if (lower) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); d__[i__] = r__; e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; work[i__] = cs; work[nm1 + i__] = sn; /* L10: */ } /* Update singular vectors if desired */ if (*nru > 0) { _starpu_dlasr_("R", "V", "F", nru, n, &work[1], &work[*n], &u[u_offset], ldu); } if (*ncc > 0) { _starpu_dlasr_("L", "V", "F", n, ncc, &work[1], &work[*n], &c__[c_offset], ldc); } } /* Compute singular values to relative accuracy TOL */ /* (By setting TOL to be negative, algorithm will compute */ /* singular values to absolute accuracy ABS(TOL)*norm(input matrix)) */ /* Computing MAX */ /* Computing MIN */ d__3 = 100., d__4 = pow_dd(&eps, &c_b15); d__1 = 10., d__2 = min(d__3,d__4); tolmul = max(d__1,d__2); tol = tolmul * eps; /* Compute approximate maximum, minimum singular values */ smax = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = smax, d__3 = (d__1 = d__[i__], abs(d__1)); smax = max(d__2,d__3); /* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = smax, d__3 = (d__1 = e[i__], abs(d__1)); smax = max(d__2,d__3); /* L30: */ } sminl = 0.; if (tol >= 0.) { /* Relative accuracy desired */ sminoa = abs(d__[1]); if (sminoa == 0.) { goto L50; } mu = sminoa; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1] , abs(d__1)))); sminoa = min(sminoa,mu); if (sminoa == 0.) { goto L50; } /* L40: */ } L50: sminoa /= sqrt((doublereal) (*n)); /* Computing MAX */ d__1 = tol * sminoa, d__2 = *n * 6 * *n * unfl; thresh = max(d__1,d__2); } else { /* Absolute accuracy desired */ /* Computing MAX */ d__1 = abs(tol) * smax, d__2 = *n * 6 * *n * unfl; thresh = max(d__1,d__2); } /* Prepare for main iteration loop for the singular values */ /* (MAXIT is the maximum number of passes through the inner */ /* loop permitted before nonconvergence signalled.) */ maxit = *n * 6 * *n; iter = 0; oldll = -1; oldm = -1; /* M points to last element of unconverged part of matrix */ m = *n; /* Begin main iteration loop */ L60: /* Check for convergence or exceeding iteration count */ if (m <= 1) { goto L160; } if (iter > maxit) { goto L200; } /* Find diagonal block of matrix to work on */ if (tol < 0. && (d__1 = d__[m], abs(d__1)) <= thresh) { d__[m] = 0.; } smax = (d__1 = d__[m], abs(d__1)); smin = smax; i__1 = m - 1; for (lll = 1; lll <= i__1; ++lll) { ll = m - lll; abss = (d__1 = d__[ll], abs(d__1)); abse = (d__1 = e[ll], abs(d__1)); if (tol < 0. && abss <= thresh) { d__[ll] = 0.; } if (abse <= thresh) { goto L80; } smin = min(smin,abss); /* Computing MAX */ d__1 = max(smax,abss); smax = max(d__1,abse); /* L70: */ } ll = 0; goto L90; L80: e[ll] = 0.; /* Matrix splits since E(LL) = 0 */ if (ll == m - 1) { /* Convergence of bottom singular value, return to top of loop */ --m; goto L60; } L90: ++ll; /* E(LL) through E(M-1) are nonzero, E(LL-1) is zero */ if (ll == m - 1) { /* 2 by 2 block, handle separately */ _starpu_dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, &sinl, &cosl); d__[m - 1] = sigmx; e[m - 1] = 0.; d__[m] = sigmn; /* Compute singular vectors, if desired */ if (*ncvt > 0) { _starpu_drot_(ncvt, &vt[m - 1 + vt_dim1], ldvt, &vt[m + vt_dim1], ldvt, & cosr, &sinr); } if (*nru > 0) { _starpu_drot_(nru, &u[(m - 1) * u_dim1 + 1], &c__1, &u[m * u_dim1 + 1], & c__1, &cosl, &sinl); } if (*ncc > 0) { _starpu_drot_(ncc, &c__[m - 1 + c_dim1], ldc, &c__[m + c_dim1], ldc, & cosl, &sinl); } m += -2; goto L60; } /* If working on new submatrix, choose shift direction */ /* (from larger end diagonal element towards smaller) */ if (ll > oldm || m < oldll) { if ((d__1 = d__[ll], abs(d__1)) >= (d__2 = d__[m], abs(d__2))) { /* Chase bulge from top (big end) to bottom (small end) */ idir = 1; } else { /* Chase bulge from bottom (big end) to top (small end) */ idir = 2; } } /* Apply convergence tests */ if (idir == 1) { /* Run convergence test in forward direction */ /* First apply standard test to bottom of matrix */ if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs( d__1)) || tol < 0. && (d__3 = e[m - 1], abs(d__3)) <= thresh) { e[m - 1] = 0.; goto L60; } if (tol >= 0.) { /* If relative accuracy desired, */ /* apply convergence criterion forward */ mu = (d__1 = d__[ll], abs(d__1)); sminl = mu; i__1 = m - 1; for (lll = ll; lll <= i__1; ++lll) { if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { e[lll] = 0.; goto L60; } mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[ lll], abs(d__1)))); sminl = min(sminl,mu); /* L100: */ } } } else { /* Run convergence test in backward direction */ /* First apply standard test to top of matrix */ if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1) ) || tol < 0. && (d__3 = e[ll], abs(d__3)) <= thresh) { e[ll] = 0.; goto L60; } if (tol >= 0.) { /* If relative accuracy desired, */ /* apply convergence criterion backward */ mu = (d__1 = d__[m], abs(d__1)); sminl = mu; i__1 = ll; for (lll = m - 1; lll >= i__1; --lll) { if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { e[lll] = 0.; goto L60; } mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll] , abs(d__1)))); sminl = min(sminl,mu); /* L110: */ } } } oldll = ll; oldm = m; /* Compute shift. First, test if shifting would ruin relative */ /* accuracy, and if so set the shift to zero. */ /* Computing MAX */ d__1 = eps, d__2 = tol * .01; if (tol >= 0. && *n * tol * (sminl / smax) <= max(d__1,d__2)) { /* Use a zero shift to avoid loss of relative accuracy */ shift = 0.; } else { /* Compute the shift from 2-by-2 block at end of matrix */ if (idir == 1) { sll = (d__1 = d__[ll], abs(d__1)); _starpu_dlas2_(&d__[m - 1], &e[m - 1], &d__[m], &shift, &r__); } else { sll = (d__1 = d__[m], abs(d__1)); _starpu_dlas2_(&d__[ll], &e[ll], &d__[ll + 1], &shift, &r__); } /* Test if shift negligible, and if so set to zero */ if (sll > 0.) { /* Computing 2nd power */ d__1 = shift / sll; if (d__1 * d__1 < eps) { shift = 0.; } } } /* Increment iteration count */ iter = iter + m - ll; /* If SHIFT = 0, do simplified QR iteration */ if (shift == 0.) { if (idir == 1) { /* Chase bulge from top to bottom */ /* Save cosines and sines for later singular vector updates */ cs = 1.; oldcs = 1.; i__1 = m - 1; for (i__ = ll; i__ <= i__1; ++i__) { d__1 = d__[i__] * cs; _starpu_dlartg_(&d__1, &e[i__], &cs, &sn, &r__); if (i__ > ll) { e[i__ - 1] = oldsn * r__; } d__1 = oldcs * r__; d__2 = d__[i__ + 1] * sn; _starpu_dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); work[i__ - ll + 1] = cs; work[i__ - ll + 1 + nm1] = sn; work[i__ - ll + 1 + nm12] = oldcs; work[i__ - ll + 1 + nm13] = oldsn; /* L120: */ } h__ = d__[m] * cs; d__[m] = h__ * oldcs; e[m - 1] = h__ * oldsn; /* Update singular vectors */ if (*ncvt > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "F", &i__1, ncvt, &work[1], &work[*n], &vt[ ll + vt_dim1], ldvt); } if (*nru > 0) { i__1 = m - ll + 1; _starpu_dlasr_("R", "V", "F", nru, &i__1, &work[nm12 + 1], &work[nm13 + 1], &u[ll * u_dim1 + 1], ldu); } if (*ncc > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + 1], &c__[ll + c_dim1], ldc); } /* Test convergence */ if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { e[m - 1] = 0.; } } else { /* Chase bulge from bottom to top */ /* Save cosines and sines for later singular vector updates */ cs = 1.; oldcs = 1.; i__1 = ll + 1; for (i__ = m; i__ >= i__1; --i__) { d__1 = d__[i__] * cs; _starpu_dlartg_(&d__1, &e[i__ - 1], &cs, &sn, &r__); if (i__ < m) { e[i__] = oldsn * r__; } d__1 = oldcs * r__; d__2 = d__[i__ - 1] * sn; _starpu_dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); work[i__ - ll] = cs; work[i__ - ll + nm1] = -sn; work[i__ - ll + nm12] = oldcs; work[i__ - ll + nm13] = -oldsn; /* L130: */ } h__ = d__[ll] * cs; d__[ll] = h__ * oldcs; e[ll] = h__ * oldsn; /* Update singular vectors */ if (*ncvt > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "B", &i__1, ncvt, &work[nm12 + 1], &work[ nm13 + 1], &vt[ll + vt_dim1], ldvt); } if (*nru > 0) { i__1 = m - ll + 1; _starpu_dlasr_("R", "V", "B", nru, &i__1, &work[1], &work[*n], &u[ll * u_dim1 + 1], ldu); } if (*ncc > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "B", &i__1, ncc, &work[1], &work[*n], &c__[ ll + c_dim1], ldc); } /* Test convergence */ if ((d__1 = e[ll], abs(d__1)) <= thresh) { e[ll] = 0.; } } } else { /* Use nonzero shift */ if (idir == 1) { /* Chase bulge from top to bottom */ /* Save cosines and sines for later singular vector updates */ f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[ ll]) + shift / d__[ll]); g = e[ll]; i__1 = m - 1; for (i__ = ll; i__ <= i__1; ++i__) { _starpu_dlartg_(&f, &g, &cosr, &sinr, &r__); if (i__ > ll) { e[i__ - 1] = r__; } f = cosr * d__[i__] + sinr * e[i__]; e[i__] = cosr * e[i__] - sinr * d__[i__]; g = sinr * d__[i__ + 1]; d__[i__ + 1] = cosr * d__[i__ + 1]; _starpu_dlartg_(&f, &g, &cosl, &sinl, &r__); d__[i__] = r__; f = cosl * e[i__] + sinl * d__[i__ + 1]; d__[i__ + 1] = cosl * d__[i__ + 1] - sinl * e[i__]; if (i__ < m - 1) { g = sinl * e[i__ + 1]; e[i__ + 1] = cosl * e[i__ + 1]; } work[i__ - ll + 1] = cosr; work[i__ - ll + 1 + nm1] = sinr; work[i__ - ll + 1 + nm12] = cosl; work[i__ - ll + 1 + nm13] = sinl; /* L140: */ } e[m - 1] = f; /* Update singular vectors */ if (*ncvt > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "F", &i__1, ncvt, &work[1], &work[*n], &vt[ ll + vt_dim1], ldvt); } if (*nru > 0) { i__1 = m - ll + 1; _starpu_dlasr_("R", "V", "F", nru, &i__1, &work[nm12 + 1], &work[nm13 + 1], &u[ll * u_dim1 + 1], ldu); } if (*ncc > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + 1], &c__[ll + c_dim1], ldc); } /* Test convergence */ if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { e[m - 1] = 0.; } } else { /* Chase bulge from bottom to top */ /* Save cosines and sines for later singular vector updates */ f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[m] ) + shift / d__[m]); g = e[m - 1]; i__1 = ll + 1; for (i__ = m; i__ >= i__1; --i__) { _starpu_dlartg_(&f, &g, &cosr, &sinr, &r__); if (i__ < m) { e[i__] = r__; } f = cosr * d__[i__] + sinr * e[i__ - 1]; e[i__ - 1] = cosr * e[i__ - 1] - sinr * d__[i__]; g = sinr * d__[i__ - 1]; d__[i__ - 1] = cosr * d__[i__ - 1]; _starpu_dlartg_(&f, &g, &cosl, &sinl, &r__); d__[i__] = r__; f = cosl * e[i__ - 1] + sinl * d__[i__ - 1]; d__[i__ - 1] = cosl * d__[i__ - 1] - sinl * e[i__ - 1]; if (i__ > ll + 1) { g = sinl * e[i__ - 2]; e[i__ - 2] = cosl * e[i__ - 2]; } work[i__ - ll] = cosr; work[i__ - ll + nm1] = -sinr; work[i__ - ll + nm12] = cosl; work[i__ - ll + nm13] = -sinl; /* L150: */ } e[ll] = f; /* Test convergence */ if ((d__1 = e[ll], abs(d__1)) <= thresh) { e[ll] = 0.; } /* Update singular vectors if desired */ if (*ncvt > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "B", &i__1, ncvt, &work[nm12 + 1], &work[ nm13 + 1], &vt[ll + vt_dim1], ldvt); } if (*nru > 0) { i__1 = m - ll + 1; _starpu_dlasr_("R", "V", "B", nru, &i__1, &work[1], &work[*n], &u[ll * u_dim1 + 1], ldu); } if (*ncc > 0) { i__1 = m - ll + 1; _starpu_dlasr_("L", "V", "B", &i__1, ncc, &work[1], &work[*n], &c__[ ll + c_dim1], ldc); } } } /* QR iteration finished, go back and check convergence */ goto L60; /* All singular values converged, so make them positive */ L160: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] < 0.) { d__[i__] = -d__[i__]; /* Change sign of singular vectors, if desired */ if (*ncvt > 0) { _starpu_dscal_(ncvt, &c_b72, &vt[i__ + vt_dim1], ldvt); } } /* L170: */ } /* Sort the singular values into decreasing order (insertion sort on */ /* singular values, but only one transposition per singular vector) */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Scan for smallest D(I) */ isub = 1; smin = d__[1]; i__2 = *n + 1 - i__; for (j = 2; j <= i__2; ++j) { if (d__[j] <= smin) { isub = j; smin = d__[j]; } /* L180: */ } if (isub != *n + 1 - i__) { /* Swap singular values and vectors */ d__[isub] = d__[*n + 1 - i__]; d__[*n + 1 - i__] = smin; if (*ncvt > 0) { _starpu_dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[*n + 1 - i__ + vt_dim1], ldvt); } if (*nru > 0) { _starpu_dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[(*n + 1 - i__) * u_dim1 + 1], &c__1); } if (*ncc > 0) { _starpu_dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[*n + 1 - i__ + c_dim1], ldc); } } /* L190: */ } goto L220; /* Maximum number of iterations exceeded, failure to converge */ L200: *info = 0; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } /* L210: */ } L220: return 0; /* End of DBDSQR */ } /* _starpu_dbdsqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ddisna.c000066400000000000000000000141051413463044200206110ustar00rootroot00000000000000/* ddisna.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_ddisna_(char *job, integer *m, integer *n, doublereal * d__, doublereal *sep, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, k; doublereal eps; logical decr, left, incr, sing, eigen; extern logical _starpu_lsame_(char *, char *); doublereal anorm; logical right; extern doublereal _starpu_dlamch_(char *); doublereal oldgap, safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal newgap, thresh; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DDISNA computes the reciprocal condition numbers for the eigenvectors */ /* of a real symmetric or complex Hermitian matrix or for the left or */ /* right singular vectors of a general m-by-n matrix. The reciprocal */ /* condition number is the 'gap' between the corresponding eigenvalue or */ /* singular value and the nearest other one. */ /* The bound on the error, measured by angle in radians, in the I-th */ /* computed vector is given by */ /* DLAMCH( 'E' ) * ( ANORM / SEP( I ) ) */ /* where ANORM = 2-norm(A) = max( abs( D(j) ) ). SEP(I) is not allowed */ /* to be smaller than DLAMCH( 'E' )*ANORM in order to limit the size of */ /* the error bound. */ /* DDISNA may also be used to compute error bounds for eigenvectors of */ /* the generalized symmetric definite eigenproblem. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies for which problem the reciprocal condition numbers */ /* should be computed: */ /* = 'E': the eigenvectors of a symmetric/Hermitian matrix; */ /* = 'L': the left singular vectors of a general matrix; */ /* = 'R': the right singular vectors of a general matrix. */ /* M (input) INTEGER */ /* The number of rows of the matrix. M >= 0. */ /* N (input) INTEGER */ /* If JOB = 'L' or 'R', the number of columns of the matrix, */ /* in which case N >= 0. Ignored if JOB = 'E'. */ /* D (input) DOUBLE PRECISION array, dimension (M) if JOB = 'E' */ /* dimension (min(M,N)) if JOB = 'L' or 'R' */ /* The eigenvalues (if JOB = 'E') or singular values (if JOB = */ /* 'L' or 'R') of the matrix, in either increasing or decreasing */ /* order. If singular values, they must be non-negative. */ /* SEP (output) DOUBLE PRECISION array, dimension (M) if JOB = 'E' */ /* dimension (min(M,N)) if JOB = 'L' or 'R' */ /* The reciprocal condition numbers of the vectors. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ --sep; --d__; /* Function Body */ *info = 0; eigen = _starpu_lsame_(job, "E"); left = _starpu_lsame_(job, "L"); right = _starpu_lsame_(job, "R"); sing = left || right; if (eigen) { k = *m; } else if (sing) { k = min(*m,*n); } if (! eigen && ! sing) { *info = -1; } else if (*m < 0) { *info = -2; } else if (k < 0) { *info = -3; } else { incr = TRUE_; decr = TRUE_; i__1 = k - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (incr) { incr = incr && d__[i__] <= d__[i__ + 1]; } if (decr) { decr = decr && d__[i__] >= d__[i__ + 1]; } /* L10: */ } if (sing && k > 0) { if (incr) { incr = incr && 0. <= d__[1]; } if (decr) { decr = decr && d__[k] >= 0.; } } if (! (incr || decr)) { *info = -4; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DDISNA", &i__1); return 0; } /* Quick return if possible */ if (k == 0) { return 0; } /* Compute reciprocal condition numbers */ if (k == 1) { sep[1] = _starpu_dlamch_("O"); } else { oldgap = (d__1 = d__[2] - d__[1], abs(d__1)); sep[1] = oldgap; i__1 = k - 1; for (i__ = 2; i__ <= i__1; ++i__) { newgap = (d__1 = d__[i__ + 1] - d__[i__], abs(d__1)); sep[i__] = min(oldgap,newgap); oldgap = newgap; /* L20: */ } sep[k] = oldgap; } if (sing) { if (left && *m > *n || right && *m < *n) { if (incr) { sep[1] = min(sep[1],d__[1]); } if (decr) { /* Computing MIN */ d__1 = sep[k], d__2 = d__[k]; sep[k] = min(d__1,d__2); } } } /* Ensure that reciprocal condition numbers are not less than */ /* threshold, in order to limit the size of the error bound */ eps = _starpu_dlamch_("E"); safmin = _starpu_dlamch_("S"); /* Computing MAX */ d__2 = abs(d__[1]), d__3 = (d__1 = d__[k], abs(d__1)); anorm = max(d__2,d__3); if (anorm == 0.) { thresh = eps; } else { /* Computing MAX */ d__1 = eps * anorm; thresh = max(d__1,safmin); } i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = sep[i__]; sep[i__] = max(d__1,thresh); /* L30: */ } return 0; /* End of DDISNA */ } /* _starpu_ddisna_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbbrd.c000066400000000000000000000370651413463044200206050ustar00rootroot00000000000000/* dgbbrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b8 = 0.; static doublereal c_b9 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dgbbrd_(char *vect, integer *m, integer *n, integer *ncc, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal * d__, doublereal *e, doublereal *q, integer *ldq, doublereal *pt, integer *ldpt, doublereal *c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, c_dim1, c_offset, pt_dim1, pt_offset, q_dim1, q_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; /* Local variables */ integer i__, j, l, j1, j2, kb; doublereal ra, rb, rc; integer kk, ml, mn, nr, mu; doublereal rs; integer kb1, ml0, mu0, klm, kun, nrt, klu1, inca; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); extern logical _starpu_lsame_(char *, char *); logical wantb, wantc; integer minmn; logical wantq; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *), _starpu_dlargv_( integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartv_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical wantpt; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBBRD reduces a real general m-by-n band matrix A to upper */ /* bidiagonal form B by an orthogonal transformation: Q' * A * P = B. */ /* The routine computes B, and optionally forms Q or P', or computes */ /* Q'*C for a given matrix C. */ /* Arguments */ /* ========= */ /* VECT (input) CHARACTER*1 */ /* Specifies whether or not the matrices Q and P' are to be */ /* formed. */ /* = 'N': do not form Q or P'; */ /* = 'Q': form Q only; */ /* = 'P': form P' only; */ /* = 'B': form both. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NCC (input) INTEGER */ /* The number of columns of the matrix C. NCC >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals of the matrix A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals of the matrix A. KU >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the m-by-n band matrix A, stored in rows 1 to */ /* KL+KU+1. The j-th column of A is stored in the j-th column of */ /* the array AB as follows: */ /* AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl). */ /* On exit, A is overwritten by values generated during the */ /* reduction. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array A. LDAB >= KL+KU+1. */ /* D (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The diagonal elements of the bidiagonal matrix B. */ /* E (output) DOUBLE PRECISION array, dimension (min(M,N)-1) */ /* The superdiagonal elements of the bidiagonal matrix B. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ,M) */ /* If VECT = 'Q' or 'B', the m-by-m orthogonal matrix Q. */ /* If VECT = 'N' or 'P', the array Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. */ /* LDQ >= max(1,M) if VECT = 'Q' or 'B'; LDQ >= 1 otherwise. */ /* PT (output) DOUBLE PRECISION array, dimension (LDPT,N) */ /* If VECT = 'P' or 'B', the n-by-n orthogonal matrix P'. */ /* If VECT = 'N' or 'Q', the array PT is not referenced. */ /* LDPT (input) INTEGER */ /* The leading dimension of the array PT. */ /* LDPT >= max(1,N) if VECT = 'P' or 'B'; LDPT >= 1 otherwise. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,NCC) */ /* On entry, an m-by-ncc matrix C. */ /* On exit, C is overwritten by Q'*C. */ /* C is not referenced if NCC = 0. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. */ /* LDC >= max(1,M) if NCC > 0; LDC >= 1 if NCC = 0. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*max(M,N)) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --d__; --e; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; pt_dim1 = *ldpt; pt_offset = 1 + pt_dim1; pt -= pt_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ wantb = _starpu_lsame_(vect, "B"); wantq = _starpu_lsame_(vect, "Q") || wantb; wantpt = _starpu_lsame_(vect, "P") || wantb; wantc = *ncc > 0; klu1 = *kl + *ku + 1; *info = 0; if (! wantq && ! wantpt && ! _starpu_lsame_(vect, "N")) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ncc < 0) { *info = -4; } else if (*kl < 0) { *info = -5; } else if (*ku < 0) { *info = -6; } else if (*ldab < klu1) { *info = -8; } else if (*ldq < 1 || wantq && *ldq < max(1,*m)) { *info = -12; } else if (*ldpt < 1 || wantpt && *ldpt < max(1,*n)) { *info = -14; } else if (*ldc < 1 || wantc && *ldc < max(1,*m)) { *info = -16; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBBRD", &i__1); return 0; } /* Initialize Q and P' to the unit matrix, if needed */ if (wantq) { _starpu_dlaset_("Full", m, m, &c_b8, &c_b9, &q[q_offset], ldq); } if (wantpt) { _starpu_dlaset_("Full", n, n, &c_b8, &c_b9, &pt[pt_offset], ldpt); } /* Quick return if possible. */ if (*m == 0 || *n == 0) { return 0; } minmn = min(*m,*n); if (*kl + *ku > 1) { /* Reduce to upper bidiagonal form if KU > 0; if KU = 0, reduce */ /* first to lower bidiagonal form and then transform to upper */ /* bidiagonal */ if (*ku > 0) { ml0 = 1; mu0 = 2; } else { ml0 = 2; mu0 = 1; } /* Wherever possible, plane rotations are generated and applied in */ /* vector operations of length NR over the index set J1:J2:KLU1. */ /* The sines of the plane rotations are stored in WORK(1:max(m,n)) */ /* and the cosines in WORK(max(m,n)+1:2*max(m,n)). */ mn = max(*m,*n); /* Computing MIN */ i__1 = *m - 1; klm = min(i__1,*kl); /* Computing MIN */ i__1 = *n - 1; kun = min(i__1,*ku); kb = klm + kun; kb1 = kb + 1; inca = kb1 * *ldab; nr = 0; j1 = klm + 2; j2 = 1 - kun; i__1 = minmn; for (i__ = 1; i__ <= i__1; ++i__) { /* Reduce i-th column and i-th row of matrix to bidiagonal form */ ml = klm + 1; mu = kun + 1; i__2 = kb; for (kk = 1; kk <= i__2; ++kk) { j1 += kb; j2 += kb; /* generate plane rotations to annihilate nonzero elements */ /* which have been created below the band */ if (nr > 0) { _starpu_dlargv_(&nr, &ab[klu1 + (j1 - klm - 1) * ab_dim1], &inca, &work[j1], &kb1, &work[mn + j1], &kb1); } /* apply plane rotations from the left */ i__3 = kb; for (l = 1; l <= i__3; ++l) { if (j2 - klm + l - 1 > *n) { nrt = nr - 1; } else { nrt = nr; } if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[klu1 - l + (j1 - klm + l - 1) * ab_dim1], &inca, &ab[klu1 - l + 1 + (j1 - klm + l - 1) * ab_dim1], &inca, &work[mn + j1], & work[j1], &kb1); } /* L10: */ } if (ml > ml0) { if (ml <= *m - i__ + 1) { /* generate plane rotation to annihilate a(i+ml-1,i) */ /* within the band, and apply rotation from the left */ _starpu_dlartg_(&ab[*ku + ml - 1 + i__ * ab_dim1], &ab[*ku + ml + i__ * ab_dim1], &work[mn + i__ + ml - 1], &work[i__ + ml - 1], &ra); ab[*ku + ml - 1 + i__ * ab_dim1] = ra; if (i__ < *n) { /* Computing MIN */ i__4 = *ku + ml - 2, i__5 = *n - i__; i__3 = min(i__4,i__5); i__6 = *ldab - 1; i__7 = *ldab - 1; _starpu_drot_(&i__3, &ab[*ku + ml - 2 + (i__ + 1) * ab_dim1], &i__6, &ab[*ku + ml - 1 + (i__ + 1) * ab_dim1], &i__7, &work[mn + i__ + ml - 1], &work[i__ + ml - 1]); } } ++nr; j1 -= kb1; } if (wantq) { /* accumulate product of plane rotations in Q */ i__3 = j2; i__4 = kb1; for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { _starpu_drot_(m, &q[(j - 1) * q_dim1 + 1], &c__1, &q[j * q_dim1 + 1], &c__1, &work[mn + j], &work[j]); /* L20: */ } } if (wantc) { /* apply plane rotations to C */ i__4 = j2; i__3 = kb1; for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { _starpu_drot_(ncc, &c__[j - 1 + c_dim1], ldc, &c__[j + c_dim1] , ldc, &work[mn + j], &work[j]); /* L30: */ } } if (j2 + kun > *n) { /* adjust J2 to keep within the bounds of the matrix */ --nr; j2 -= kb1; } i__3 = j2; i__4 = kb1; for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { /* create nonzero element a(j-1,j+ku) above the band */ /* and store it in WORK(n+1:2*n) */ work[j + kun] = work[j] * ab[(j + kun) * ab_dim1 + 1]; ab[(j + kun) * ab_dim1 + 1] = work[mn + j] * ab[(j + kun) * ab_dim1 + 1]; /* L40: */ } /* generate plane rotations to annihilate nonzero elements */ /* which have been generated above the band */ if (nr > 0) { _starpu_dlargv_(&nr, &ab[(j1 + kun - 1) * ab_dim1 + 1], &inca, & work[j1 + kun], &kb1, &work[mn + j1 + kun], &kb1); } /* apply plane rotations from the right */ i__4 = kb; for (l = 1; l <= i__4; ++l) { if (j2 + l - 1 > *m) { nrt = nr - 1; } else { nrt = nr; } if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + 1 + (j1 + kun - 1) * ab_dim1], & inca, &ab[l + (j1 + kun) * ab_dim1], &inca, & work[mn + j1 + kun], &work[j1 + kun], &kb1); } /* L50: */ } if (ml == ml0 && mu > mu0) { if (mu <= *n - i__ + 1) { /* generate plane rotation to annihilate a(i,i+mu-1) */ /* within the band, and apply rotation from the right */ _starpu_dlartg_(&ab[*ku - mu + 3 + (i__ + mu - 2) * ab_dim1], &ab[*ku - mu + 2 + (i__ + mu - 1) * ab_dim1], &work[mn + i__ + mu - 1], &work[i__ + mu - 1], &ra); ab[*ku - mu + 3 + (i__ + mu - 2) * ab_dim1] = ra; /* Computing MIN */ i__3 = *kl + mu - 2, i__5 = *m - i__; i__4 = min(i__3,i__5); _starpu_drot_(&i__4, &ab[*ku - mu + 4 + (i__ + mu - 2) * ab_dim1], &c__1, &ab[*ku - mu + 3 + (i__ + mu - 1) * ab_dim1], &c__1, &work[mn + i__ + mu - 1], &work[i__ + mu - 1]); } ++nr; j1 -= kb1; } if (wantpt) { /* accumulate product of plane rotations in P' */ i__4 = j2; i__3 = kb1; for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { _starpu_drot_(n, &pt[j + kun - 1 + pt_dim1], ldpt, &pt[j + kun + pt_dim1], ldpt, &work[mn + j + kun], & work[j + kun]); /* L60: */ } } if (j2 + kb > *m) { /* adjust J2 to keep within the bounds of the matrix */ --nr; j2 -= kb1; } i__3 = j2; i__4 = kb1; for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { /* create nonzero element a(j+kl+ku,j+ku-1) below the */ /* band and store it in WORK(1:n) */ work[j + kb] = work[j + kun] * ab[klu1 + (j + kun) * ab_dim1]; ab[klu1 + (j + kun) * ab_dim1] = work[mn + j + kun] * ab[ klu1 + (j + kun) * ab_dim1]; /* L70: */ } if (ml > ml0) { --ml; } else { --mu; } /* L80: */ } /* L90: */ } } if (*ku == 0 && *kl > 0) { /* A has been reduced to lower bidiagonal form */ /* Transform lower bidiagonal form to upper bidiagonal by applying */ /* plane rotations from the left, storing diagonal elements in D */ /* and off-diagonal elements in E */ /* Computing MIN */ i__2 = *m - 1; i__1 = min(i__2,*n); for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlartg_(&ab[i__ * ab_dim1 + 1], &ab[i__ * ab_dim1 + 2], &rc, &rs, &ra); d__[i__] = ra; if (i__ < *n) { e[i__] = rs * ab[(i__ + 1) * ab_dim1 + 1]; ab[(i__ + 1) * ab_dim1 + 1] = rc * ab[(i__ + 1) * ab_dim1 + 1] ; } if (wantq) { _starpu_drot_(m, &q[i__ * q_dim1 + 1], &c__1, &q[(i__ + 1) * q_dim1 + 1], &c__1, &rc, &rs); } if (wantc) { _starpu_drot_(ncc, &c__[i__ + c_dim1], ldc, &c__[i__ + 1 + c_dim1], ldc, &rc, &rs); } /* L100: */ } if (*m <= *n) { d__[*m] = ab[*m * ab_dim1 + 1]; } } else if (*ku > 0) { /* A has been reduced to upper bidiagonal form */ if (*m < *n) { /* Annihilate a(m,m+1) by applying plane rotations from the */ /* right, storing diagonal elements in D and off-diagonal */ /* elements in E */ rb = ab[*ku + (*m + 1) * ab_dim1]; for (i__ = *m; i__ >= 1; --i__) { _starpu_dlartg_(&ab[*ku + 1 + i__ * ab_dim1], &rb, &rc, &rs, &ra); d__[i__] = ra; if (i__ > 1) { rb = -rs * ab[*ku + i__ * ab_dim1]; e[i__ - 1] = rc * ab[*ku + i__ * ab_dim1]; } if (wantpt) { _starpu_drot_(n, &pt[i__ + pt_dim1], ldpt, &pt[*m + 1 + pt_dim1], ldpt, &rc, &rs); } /* L110: */ } } else { /* Copy off-diagonal elements to E and diagonal elements to D */ i__1 = minmn - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] = ab[*ku + (i__ + 1) * ab_dim1]; /* L120: */ } i__1 = minmn; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = ab[*ku + 1 + i__ * ab_dim1]; /* L130: */ } } } else { /* A is diagonal. Set elements of E to zero and copy diagonal */ /* elements to D. */ i__1 = minmn - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] = 0.; /* L140: */ } i__1 = minmn; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = ab[i__ * ab_dim1 + 1]; /* L150: */ } } return 0; /* End of DGBBRD */ } /* _starpu_dgbbrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbcon.c000066400000000000000000000175261413463044200206150ustar00rootroot00000000000000/* dgbcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgbcon_(char *norm, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer j; doublereal t; integer kd, lm, jp, ix, kase; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer kase1; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); logical lnoti; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlatbs_(char *, char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; logical onenrm; char normin[1]; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBCON estimates the reciprocal of the condition number of a real */ /* general band matrix A, in either the 1-norm or the infinity-norm, */ /* using the LU factorization computed by DGBTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as */ /* RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies whether the 1-norm condition number or the */ /* infinity-norm condition number is required: */ /* = '1' or 'O': 1-norm; */ /* = 'I': Infinity-norm. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* Details of the LU factorization of the band matrix A, as */ /* computed by DGBTRF. U is stored as an upper triangular band */ /* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and */ /* the multipliers used during the factorization are stored in */ /* rows KL+KU+2 to 2*KL+KU+1. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= N, row i of the matrix was */ /* interchanged with row IPIV(i). */ /* ANORM (input) DOUBLE PRECISION */ /* If NORM = '1' or 'O', the 1-norm of the original matrix A. */ /* If NORM = 'I', the infinity-norm of the original matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(norm(A) * norm(inv(A))). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --ipiv; --work; --iwork; /* Function Body */ *info = 0; onenrm = *(unsigned char *)norm == '1' || _starpu_lsame_(norm, "O"); if (! onenrm && ! _starpu_lsame_(norm, "I")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*ldab < (*kl << 1) + *ku + 1) { *info = -6; } else if (*anorm < 0.) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } smlnum = _starpu_dlamch_("Safe minimum"); /* Estimate the norm of inv(A). */ ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { kase1 = 1; } else { kase1 = 2; } kd = *kl + *ku + 1; lnoti = *kl > 0; kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { /* Multiply by inv(L). */ if (lnoti) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = *kl, i__3 = *n - j; lm = min(i__2,i__3); jp = ipiv[j]; t = work[jp]; if (jp != j) { work[jp] = work[j]; work[j] = t; } d__1 = -t; _starpu_daxpy_(&lm, &d__1, &ab[kd + 1 + j * ab_dim1], &c__1, & work[j + 1], &c__1); /* L20: */ } } /* Multiply by inv(U). */ i__1 = *kl + *ku; _starpu_dlatbs_("Upper", "No transpose", "Non-unit", normin, n, &i__1, & ab[ab_offset], ldab, &work[1], &scale, &work[(*n << 1) + 1], info); } else { /* Multiply by inv(U'). */ i__1 = *kl + *ku; _starpu_dlatbs_("Upper", "Transpose", "Non-unit", normin, n, &i__1, &ab[ ab_offset], ldab, &work[1], &scale, &work[(*n << 1) + 1], info); /* Multiply by inv(L'). */ if (lnoti) { for (j = *n - 1; j >= 1; --j) { /* Computing MIN */ i__1 = *kl, i__2 = *n - j; lm = min(i__1,i__2); work[j] -= _starpu_ddot_(&lm, &ab[kd + 1 + j * ab_dim1], &c__1, & work[j + 1], &c__1); jp = ipiv[j]; if (jp != j) { t = work[jp]; work[jp] = work[j]; work[j] = t; } /* L30: */ } } } /* Divide X by 1/SCALE if doing so will not cause overflow. */ *(unsigned char *)normin = 'Y'; if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) { goto L40; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } L40: return 0; /* End of DGBCON */ } /* _starpu_dgbcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbequ.c000066400000000000000000000200721413463044200206160ustar00rootroot00000000000000/* dgbequ.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgbequ_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, kd; doublereal rcmin, rcmax; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum, smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBEQU computes row and column scalings intended to equilibrate an */ /* M-by-N band matrix A and reduce its condition number. R returns the */ /* row scale factors and C the column scale factors, chosen to try to */ /* make the largest element in each row and column of the matrix B with */ /* elements B(i,j)=R(i)*A(i,j)*C(j) have absolute value 1. */ /* R(i) and C(j) are restricted to be between SMLNUM = smallest safe */ /* number and BIGNUM = largest safe number. Use of these scaling */ /* factors is not guaranteed to reduce the condition number of A but */ /* works well in practice. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The band matrix A, stored in rows 1 to KL+KU+1. The j-th */ /* column of A is stored in the j-th column of the array AB as */ /* follows: */ /* AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* R (output) DOUBLE PRECISION array, dimension (M) */ /* If INFO = 0, or INFO > M, R contains the row scale factors */ /* for A. */ /* C (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, C contains the column scale factors for A. */ /* ROWCND (output) DOUBLE PRECISION */ /* If INFO = 0 or INFO > M, ROWCND contains the ratio of the */ /* smallest R(i) to the largest R(i). If ROWCND >= 0.1 and */ /* AMAX is neither too large nor too small, it is not worth */ /* scaling by R. */ /* COLCND (output) DOUBLE PRECISION */ /* If INFO = 0, COLCND contains the ratio of the smallest */ /* C(i) to the largest C(i). If COLCND >= 0.1, it is not */ /* worth scaling by C. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= M: the i-th row of A is exactly zero */ /* > M: the (i-M)-th column of A is exactly zero */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --r__; --c__; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*ldab < *kl + *ku + 1) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBEQU", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { *rowcnd = 1.; *colcnd = 1.; *amax = 0.; return 0; } /* Get machine constants. */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; /* Compute row scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { r__[i__] = 0.; /* L10: */ } /* Find the maximum element in each row. */ kd = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = j - *ku; /* Computing MIN */ i__4 = j + *kl; i__3 = min(i__4,*m); for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = r__[i__], d__3 = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs(d__1)); r__[i__] = max(d__2,d__3); /* L20: */ } /* L30: */ } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = rcmax, d__2 = r__[i__]; rcmax = max(d__1,d__2); /* Computing MIN */ d__1 = rcmin, d__2 = r__[i__]; rcmin = min(d__1,d__2); /* L40: */ } *amax = rcmax; if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (r__[i__] == 0.) { *info = i__; return 0; } /* L50: */ } } else { /* Invert the scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ /* Computing MAX */ d__2 = r__[i__]; d__1 = max(d__2,smlnum); r__[i__] = 1. / min(d__1,bignum); /* L60: */ } /* Compute ROWCND = min(R(I)) / max(R(I)) */ *rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } /* Compute column scale factors */ i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j] = 0.; /* L70: */ } /* Find the maximum element in each column, */ /* assuming the row scaling computed above. */ kd = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__3 = j - *ku; /* Computing MIN */ i__4 = j + *kl; i__2 = min(i__4,*m); for (i__ = max(i__3,1); i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = c__[j], d__3 = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs( d__1)) * r__[i__]; c__[j] = max(d__2,d__3); /* L80: */ } /* L90: */ } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L100: */ } if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (c__[j] == 0.) { *info = *m + j; return 0; } /* L110: */ } } else { /* Invert the scale factors. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ /* Computing MAX */ d__2 = c__[j]; d__1 = max(d__2,smlnum); c__[j] = 1. / min(d__1,bignum); /* L120: */ } /* Compute COLCND = min(C(J)) / max(C(J)) */ *colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } return 0; /* End of DGBEQU */ } /* _starpu_dgbequ_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbequb.c000066400000000000000000000223671413463044200207710ustar00rootroot00000000000000/* dgbequb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgbequb_(integer *m, integer *n, integer *kl, integer * ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3; /* Builtin functions */ double log(doublereal), pow_di(doublereal *, integer *); /* Local variables */ integer i__, j, kd; doublereal radix, rcmin, rcmax; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum, logrdx, smlnum; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBEQUB computes row and column scalings intended to equilibrate an */ /* M-by-N matrix A and reduce its condition number. R returns the row */ /* scale factors and C the column scale factors, chosen to try to make */ /* the largest element in each row and column of the matrix B with */ /* elements B(i,j)=R(i)*A(i,j)*C(j) have an absolute value of at most */ /* the radix. */ /* R(i) and C(j) are restricted to be a power of the radix between */ /* SMLNUM = smallest safe number and BIGNUM = largest safe number. Use */ /* of these scaling factors is not guaranteed to reduce the condition */ /* number of A but works well in practice. */ /* This routine differs from DGEEQU by restricting the scaling factors */ /* to a power of the radix. Baring over- and underflow, scaling by */ /* these factors introduces no additional rounding errors. However, the */ /* scaled entries' magnitured are no longer approximately 1 but lie */ /* between sqrt(radix) and 1/sqrt(radix). */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl) */ /* LDAB (input) INTEGER */ /* The leading dimension of the array A. LDAB >= max(1,M). */ /* R (output) DOUBLE PRECISION array, dimension (M) */ /* If INFO = 0 or INFO > M, R contains the row scale factors */ /* for A. */ /* C (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, C contains the column scale factors for A. */ /* ROWCND (output) DOUBLE PRECISION */ /* If INFO = 0 or INFO > M, ROWCND contains the ratio of the */ /* smallest R(i) to the largest R(i). If ROWCND >= 0.1 and */ /* AMAX is neither too large nor too small, it is not worth */ /* scaling by R. */ /* COLCND (output) DOUBLE PRECISION */ /* If INFO = 0, COLCND contains the ratio of the smallest */ /* C(i) to the largest C(i). If COLCND >= 0.1, it is not */ /* worth scaling by C. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= M: the i-th row of A is exactly zero */ /* > M: the (i-M)-th column of A is exactly zero */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --r__; --c__; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*ldab < *kl + *ku + 1) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBEQUB", &i__1); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { *rowcnd = 1.; *colcnd = 1.; *amax = 0.; return 0; } /* Get machine constants. Assume SMLNUM is a power of the radix. */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; radix = _starpu_dlamch_("B"); logrdx = log(radix); /* Compute row scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { r__[i__] = 0.; /* L10: */ } /* Find the maximum element in each row. */ kd = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = j - *ku; /* Computing MIN */ i__4 = j + *kl; i__3 = min(i__4,*m); for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = r__[i__], d__3 = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs(d__1)); r__[i__] = max(d__2,d__3); /* L20: */ } /* L30: */ } i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (r__[i__] > 0.) { i__3 = (integer) (log(r__[i__]) / logrdx); r__[i__] = pow_di(&radix, &i__3); } } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = rcmax, d__2 = r__[i__]; rcmax = max(d__1,d__2); /* Computing MIN */ d__1 = rcmin, d__2 = r__[i__]; rcmin = min(d__1,d__2); /* L40: */ } *amax = rcmax; if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (r__[i__] == 0.) { *info = i__; return 0; } /* L50: */ } } else { /* Invert the scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ /* Computing MAX */ d__2 = r__[i__]; d__1 = max(d__2,smlnum); r__[i__] = 1. / min(d__1,bignum); /* L60: */ } /* Compute ROWCND = min(R(I)) / max(R(I)). */ *rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } /* Compute column scale factors. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j] = 0.; /* L70: */ } /* Find the maximum element in each column, */ /* assuming the row scaling computed above. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__3 = j - *ku; /* Computing MIN */ i__4 = j + *kl; i__2 = min(i__4,*m); for (i__ = max(i__3,1); i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = c__[j], d__3 = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs( d__1)) * r__[i__]; c__[j] = max(d__2,d__3); /* L80: */ } if (c__[j] > 0.) { i__2 = (integer) (log(c__[j]) / logrdx); c__[j] = pow_di(&radix, &i__2); } /* L90: */ } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L100: */ } if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (c__[j] == 0.) { *info = *m + j; return 0; } /* L110: */ } } else { /* Invert the scale factors. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ /* Computing MAX */ d__2 = c__[j]; d__1 = max(d__2,smlnum); c__[j] = 1. / min(d__1,bignum); /* L120: */ } /* Compute COLCND = min(C(J)) / max(C(J)). */ *colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } return 0; /* End of DGBEQUB */ } /* _starpu_dgbequb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbrfs.c000066400000000000000000000331201413463044200206140ustar00rootroot00000000000000/* dgbrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b15 = -1.; static doublereal c_b17 = 1.; /* Subroutine */ int _starpu_dgbrfs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s; integer kk; doublereal xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern /* Subroutine */ int _starpu_dgbmv_(char *, integer *, integer *, integer * , integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dgbtrs_( char *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical notran; char transt[1]; doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is banded, and provides */ /* error bounds and backward error estimates for the solution. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The original band matrix A, stored in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(n,j+kl). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* AFB (input) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* Details of the LU factorization of the band matrix A, as */ /* computed by DGBTRF. U is stored as an upper triangular band */ /* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and */ /* the multipliers used during the factorization are stored in */ /* rows KL+KU+2 to 2*KL+KU+1. */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= 2*KL*KU+1. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from DGBTRF; for 1<=i<=N, row i of the */ /* matrix was interchanged with row IPIV(i). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGBTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; notran = _starpu_lsame_(trans, "N"); if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*ldab < *kl + *ku + 1) { *info = -7; } else if (*ldafb < (*kl << 1) + *ku + 1) { *info = -9; } else if (*ldb < max(1,*n)) { *info = -12; } else if (*ldx < max(1,*n)) { *info = -14; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ /* Computing MIN */ i__1 = *kl + *ku + 2, i__2 = *n + 1; nz = min(i__1,i__2); eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - op(A) * X, */ /* where op(A) = A, A**T, or A**H, depending on TRANS. */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dgbmv_(trans, n, n, kl, ku, &c_b15, &ab[ab_offset], ldab, &x[j * x_dim1 + 1], &c__1, &c_b17, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(op(A))*abs(X) + abs(B). */ if (notran) { i__2 = *n; for (k = 1; k <= i__2; ++k) { kk = *ku + 1 - k; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MAX */ i__3 = 1, i__4 = k - *ku; /* Computing MIN */ i__6 = *n, i__7 = k + *kl; i__5 = min(i__6,i__7); for (i__ = max(i__3,i__4); i__ <= i__5; ++i__) { work[i__] += (d__1 = ab[kk + i__ + k * ab_dim1], abs(d__1) ) * xk; /* L40: */ } /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; kk = *ku + 1 - k; /* Computing MAX */ i__5 = 1, i__3 = k - *ku; /* Computing MIN */ i__6 = *n, i__7 = k + *kl; i__4 = min(i__6,i__7); for (i__ = max(i__5,i__3); i__ <= i__4; ++i__) { s += (d__1 = ab[kk + i__ + k * ab_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L60: */ } work[k] += s; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dgbtrs_(trans, n, kl, ku, &c__1, &afb[afb_offset], ldafb, &ipiv[1] , &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b17, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(op(A)))* */ /* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(op(A)) is the inverse of op(A) */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(op(A))*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(op(A)) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(op(A)**T). */ _starpu_dgbtrs_(transt, n, kl, ku, &c__1, &afb[afb_offset], ldafb, & ipiv[1], &work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] *= work[i__]; /* L110: */ } } else { /* Multiply by inv(op(A))*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] *= work[i__]; /* L120: */ } _starpu_dgbtrs_(trans, n, kl, ku, &c__1, &afb[afb_offset], ldafb, & ipiv[1], &work[*n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DGBRFS */ } /* _starpu_dgbrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbrfsx.c000066400000000000000000000661031413463044200210130ustar00rootroot00000000000000/* dgbrfsx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c_n1 = -1; static integer c__0 = 0; static integer c__1 = 1; /* Subroutine */ int _starpu_dgbrfsx_(char *trans, char *equed, integer *n, integer * kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal illrcond_thresh__, unstable_thresh__, err_lbnd__; integer ref_type__; extern integer _starpu_ilatrans_(char *); integer j; doublereal rcond_tmp__; integer prec_type__, trans_type__; extern doublereal _starpu_dla_gbrcond__(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, ftnlen); doublereal cwise_wrong__; extern /* Subroutine */ int _starpu_dla_gbrfsx_extended__(integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, logical *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal * , doublereal *, logical *, integer *); char norm[1]; logical ignore_cwise__; extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern doublereal _starpu_dlangb_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *), _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dgbcon_(char *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); logical colequ, notran, rowequ; extern integer _starpu_ilaprec_(char *); integer ithresh, n_norms__; doublereal rthresh; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBRFSX improves the computed solution to a system of linear */ /* equations and provides error bounds and backward error estimates */ /* for the solution. In addition to normwise error bound, the code */ /* provides maximum componentwise error bound if possible. See */ /* comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the */ /* error bounds. */ /* The original system of linear equations may have been equilibrated */ /* before calling this routine, as described by arguments EQUED, R */ /* and C below. In this case, the solution and error bounds returned */ /* are for the original unequilibrated system. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* EQUED (input) CHARACTER*1 */ /* Specifies the form of equilibration that was done to A */ /* before calling this routine. This is needed to compute */ /* the solution and error bounds correctly. */ /* = 'N': No equilibration */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* The right hand side B has been changed accordingly. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The original band matrix A, stored in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(n,j+kl). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* AFB (input) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* Details of the LU factorization of the band matrix A, as */ /* computed by DGBTRF. U is stored as an upper triangular band */ /* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and */ /* the multipliers used during the factorization are stored in */ /* rows KL+KU+2 to 2*KL+KU+1. */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= 2*KL*KU+1. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from DGETRF; for 1<=i<=N, row i of the */ /* matrix was interchanged with row IPIV(i). */ /* R (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'R' or 'B', A is */ /* multiplied on the left by diag(R); if EQUED = 'N' or 'C', R */ /* is not accessed. R is an input argument if FACT = 'F'; */ /* otherwise, R is an output argument. If FACT = 'F' and */ /* EQUED = 'R' or 'B', each element of R must be positive. */ /* If R is output, each element of R is a power of the radix. */ /* If R is input, each element of R should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* C (input or output) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If EQUED = 'C' or 'B', A is */ /* multiplied on the right by diag(C); if EQUED = 'N' or 'R', C */ /* is not accessed. C is an input argument if FACT = 'F'; */ /* otherwise, C is an output argument. If FACT = 'F' and */ /* EQUED = 'C' or 'B', each element of C must be positive. */ /* If C is output, each element of C is a power of the radix. */ /* If C is input, each element of C should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGETRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* Componentwise relative backward error. This is the */ /* componentwise relative backward error of each solution vector X(j) */ /* (i.e., the smallest relative change in any element of A or B that */ /* makes X(j) an exact solution). */ /* N_ERR_BNDS (input) INTEGER */ /* Number of error bounds to return for each right hand side */ /* and each type (normwise or componentwise). See ERR_BNDS_NORM and */ /* ERR_BNDS_COMP below. */ /* ERR_BNDS_NORM (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* NPARAMS (input) INTEGER */ /* Specifies the number of parameters set in PARAMS. If .LE. 0, the */ /* PARAMS array is never referenced and default values are used. */ /* PARAMS (input / output) DOUBLE PRECISION array, dimension NPARAMS */ /* Specifies algorithm parameters. If an entry is .LT. 0.0, then */ /* that entry will be filled with default value used for that */ /* parameter. Only positions up to NPARAMS are accessed; defaults */ /* are used for higher-numbered parameters. */ /* PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative */ /* refinement or not. */ /* Default: 1.0D+0 */ /* = 0.0 : No refinement is performed, and no error bounds are */ /* computed. */ /* = 1.0 : Use the double-precision refinement algorithm, */ /* possibly with doubled-single computations if the */ /* compilation environment does not support DOUBLE */ /* PRECISION. */ /* (other values are reserved for future use) */ /* PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual */ /* computations allowed for refinement. */ /* Default: 10 */ /* Aggressive: Set to 100 to permit convergence using approximate */ /* factorizations or factorizations other than LU. If */ /* the factorization uses a technique other than */ /* Gaussian elimination, the guarantees in */ /* err_bnds_norm and err_bnds_comp may no longer be */ /* trustworthy. */ /* PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code */ /* will attempt to find a solution with small componentwise */ /* relative error in the double-precision algorithm. Positive */ /* is true, 0.0 is false. */ /* Default: 1.0 (attempt componentwise convergence) */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: Successful exit. The solution to every right-hand side is */ /* guaranteed. */ /* < 0: If INFO = -i, the i-th argument had an illegal value */ /* > 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Check the input parameters. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --ipiv; --r__; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; trans_type__ = _starpu_ilatrans_(trans); ref_type__ = 1; if (*nparams >= 1) { if (params[1] < 0.) { params[1] = 1.; } else { ref_type__ = (integer) params[1]; } } /* Set default parameters. */ illrcond_thresh__ = (doublereal) (*n) * _starpu_dlamch_("Epsilon"); ithresh = 10; rthresh = .5; unstable_thresh__ = .25; ignore_cwise__ = FALSE_; if (*nparams >= 2) { if (params[2] < 0.) { params[2] = (doublereal) ithresh; } else { ithresh = (integer) params[2]; } } if (*nparams >= 3) { if (params[3] < 0.) { if (ignore_cwise__) { params[3] = 0.; } else { params[3] = 1.; } } else { ignore_cwise__ = params[3] == 0.; } } if (ref_type__ == 0 || *n_err_bnds__ == 0) { n_norms__ = 0; } else if (ignore_cwise__) { n_norms__ = 1; } else { n_norms__ = 2; } notran = _starpu_lsame_(trans, "N"); rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); /* Test input parameters. */ if (trans_type__ == -1) { *info = -1; } else if (! rowequ && ! colequ && ! _starpu_lsame_(equed, "N")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kl < 0) { *info = -4; } else if (*ku < 0) { *info = -5; } else if (*nrhs < 0) { *info = -6; } else if (*ldab < *kl + *ku + 1) { *info = -8; } else if (*ldafb < (*kl << 1) + *ku + 1) { *info = -10; } else if (*ldb < max(1,*n)) { *info = -13; } else if (*ldx < max(1,*n)) { *info = -15; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBRFSX", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0 || *nrhs == 0) { *rcond = 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 0.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 0.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 0.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 1.; } } return 0; } /* Default to failure. */ *rcond = 0.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 1.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 0.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 0.; } } /* Compute the norm of A and the reciprocal of the condition */ /* number of A. */ if (notran) { *(unsigned char *)norm = 'I'; } else { *(unsigned char *)norm = '1'; } anorm = _starpu_dlangb_(norm, n, kl, ku, &ab[ab_offset], ldab, &work[1]); _starpu_dgbcon_(norm, n, kl, ku, &afb[afb_offset], ldafb, &ipiv[1], &anorm, rcond, &work[1], &iwork[1], info); /* Perform refinement on each right-hand side */ if (ref_type__ != 0) { prec_type__ = _starpu_ilaprec_("E"); if (notran) { _starpu_dla_gbrfsx_extended__(&prec_type__, &trans_type__, n, kl, ku, nrhs, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, & ipiv[1], &colequ, &c__[1], &b[b_offset], ldb, &x[x_offset] , ldx, &berr[1], &n_norms__, &err_bnds_norm__[ err_bnds_norm_offset], &err_bnds_comp__[ err_bnds_comp_offset], &work[*n + 1], &work[1], &work[(*n << 1) + 1], &work[1], rcond, &ithresh, &rthresh, & unstable_thresh__, &ignore_cwise__, info); } else { _starpu_dla_gbrfsx_extended__(&prec_type__, &trans_type__, n, kl, ku, nrhs, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, & ipiv[1], &rowequ, &r__[1], &b[b_offset], ldb, &x[x_offset] , ldx, &berr[1], &n_norms__, &err_bnds_norm__[ err_bnds_norm_offset], &err_bnds_comp__[ err_bnds_comp_offset], &work[*n + 1], &work[1], &work[(*n << 1) + 1], &work[1], rcond, &ithresh, &rthresh, & unstable_thresh__, &ignore_cwise__, info); } } /* Computing MAX */ d__1 = 10., d__2 = sqrt((doublereal) (*n)); err_lbnd__ = max(d__1,d__2) * _starpu_dlamch_("Epsilon"); if (*n_err_bnds__ >= 1 && n_norms__ >= 1) { /* Compute scaled normwise condition number cond(A*C). */ if (colequ && notran) { rcond_tmp__ = _starpu_dla_gbrcond__(trans, n, kl, ku, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, &ipiv[1], &c_n1, &c__[1], info, &work[1], &iwork[1], (ftnlen)1); } else if (rowequ && ! notran) { rcond_tmp__ = _starpu_dla_gbrcond__(trans, n, kl, ku, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, &ipiv[1], &c_n1, &r__[1], info, &work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = _starpu_dla_gbrcond__(trans, n, kl, ku, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, &ipiv[1], &c__0, &r__[1], info, &work[1], &iwork[1], (ftnlen)1); } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] > 1.) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_norm__[j + err_bnds_norm_dim1] = 0.; if (*info <= *n) { *info = *n + j; } } else if (err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] < err_lbnd__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = err_lbnd__; err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = rcond_tmp__; } } } if (*n_err_bnds__ >= 1 && n_norms__ >= 2) { /* Compute componentwise condition number cond(A*diag(Y(:,J))) for */ /* each right-hand side using the current solution as an estimate of */ /* the true solution. If the componentwise error estimate is too */ /* large, then the solution is a lousy estimate of truth and the */ /* estimated RCOND may be too optimistic. To avoid misleading users, */ /* the inverse condition number is set to 0.0 when the estimated */ /* cwise error is at least CWISE_WRONG. */ cwise_wrong__ = sqrt(_starpu_dlamch_("Epsilon")); i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < cwise_wrong__) { rcond_tmp__ = _starpu_dla_gbrcond__(trans, n, kl, ku, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, &ipiv[1], &c__1, &x[j * x_dim1 + 1], info, &work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = 0.; } /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] > 1.) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 0.; if (params[3] == 1. && *info < *n + j) { *info = *n + j; } } else if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < err_lbnd__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = err_lbnd__; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = rcond_tmp__; } } } return 0; /* End of DGBRFSX */ } /* _starpu_dgbrfsx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbsv.c000066400000000000000000000142721413463044200204610ustar00rootroot00000000000000/* dgbsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgbsv_(integer *n, integer *kl, integer *ku, integer * nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, b_dim1, b_offset, i__1; /* Local variables */ extern /* Subroutine */ int _starpu_dgbtrf_(integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dgbtrs_(char *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBSV computes the solution to a real system of linear equations */ /* A * X = B, where A is a band matrix of order N with KL subdiagonals */ /* and KU superdiagonals, and X and B are N-by-NRHS matrices. */ /* The LU decomposition with partial pivoting and row interchanges is */ /* used to factor A as A = L * U, where L is a product of permutation */ /* and unit lower triangular matrices with KL subdiagonals, and U is */ /* upper triangular with KL+KU superdiagonals. The factored form of A */ /* is then used to solve the system of equations A * X = B. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows KL+1 to */ /* 2*KL+KU+1; rows 1 to KL of the array need not be set. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(KL+KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+KL) */ /* On exit, details of the factorization: U is stored as an */ /* upper triangular band matrix with KL+KU superdiagonals in */ /* rows 1 to KL+KU+1, and the multipliers used during the */ /* factorization are stored in rows KL+KU+2 to 2*KL+KU+1. */ /* See below for further details. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. */ /* IPIV (output) INTEGER array, dimension (N) */ /* The pivot indices that define the permutation matrix P; */ /* row i of the matrix was interchanged with row IPIV(i). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and the solution has not been computed. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* M = N = 6, KL = 2, KU = 1: */ /* On entry: On exit: */ /* * * * + + + * * * u14 u25 u36 */ /* * * + + + + * * u13 u24 u35 u46 */ /* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 */ /* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 */ /* a21 a32 a43 a54 a65 * m21 m32 m43 m54 m65 * */ /* a31 a42 a53 a64 * * m31 m42 m53 m64 * * */ /* Array elements marked * are not used by the routine; elements marked */ /* + need not be set on entry, but are required by the routine to store */ /* elements of U because of fill-in resulting from the row interchanges. */ /* ===================================================================== */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*kl < 0) { *info = -2; } else if (*ku < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldab < (*kl << 1) + *ku + 1) { *info = -6; } else if (*ldb < max(*n,1)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBSV ", &i__1); return 0; } /* Compute the LU factorization of the band matrix A. */ _starpu_dgbtrf_(n, n, kl, ku, &ab[ab_offset], ldab, &ipiv[1], info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dgbtrs_("No transpose", n, kl, ku, nrhs, &ab[ab_offset], ldab, &ipiv[ 1], &b[b_offset], ldb, info); } return 0; /* End of DGBSV */ } /* _starpu_dgbsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbsvx.c000066400000000000000000000557561413463044200206650ustar00rootroot00000000000000/* dgbsvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgbsvx_(char *fact, char *trans, integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, j1, j2; doublereal amax; char norm[1]; extern logical _starpu_lsame_(char *, char *); doublereal rcmin, rcmax, anorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical equil; extern doublereal _starpu_dlangb_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *), _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlaqgb_(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, char *), _starpu_dgbcon_(char *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); doublereal colcnd; extern doublereal _starpu_dlantb_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgbequ_(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dgbrfs_( char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dgbtrf_(integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dgbtrs_(char *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer infequ; logical colequ; doublereal rowcnd; logical notran; doublereal smlnum; logical rowequ; doublereal rpvgrw; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBSVX uses the LU factorization to compute the solution to a real */ /* system of linear equations A * X = B, A**T * X = B, or A**H * X = B, */ /* where A is a band matrix of order N with KL subdiagonals and KU */ /* superdiagonals, and X and B are N-by-NRHS matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed by this subroutine: */ /* 1. If FACT = 'E', real scaling factors are computed to equilibrate */ /* the system: */ /* TRANS = 'N': diag(R)*A*diag(C) *inv(diag(C))*X = diag(R)*B */ /* TRANS = 'T': (diag(R)*A*diag(C))**T *inv(diag(R))*X = diag(C)*B */ /* TRANS = 'C': (diag(R)*A*diag(C))**H *inv(diag(R))*X = diag(C)*B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(R)*A*diag(C) and B by diag(R)*B (if TRANS='N') */ /* or diag(C)*B (if TRANS = 'T' or 'C'). */ /* 2. If FACT = 'N' or 'E', the LU decomposition is used to factor the */ /* matrix A (after equilibration if FACT = 'E') as */ /* A = L * U, */ /* where L is a product of permutation and unit lower triangular */ /* matrices with KL subdiagonals, and U is upper triangular with */ /* KL+KU superdiagonals. */ /* 3. If some U(i,i)=0, so that U is exactly singular, then the routine */ /* returns with INFO = i. Otherwise, the factored form of A is used */ /* to estimate the condition number of the matrix A. If the */ /* reciprocal of the condition number is less than machine precision, */ /* INFO = N+1 is returned as a warning, but the routine still goes on */ /* to solve for X and compute error bounds as described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(C) (if TRANS = 'N') or diag(R) (if TRANS = 'T' or 'C') so */ /* that it solves the original system before equilibration. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AFB and IPIV contain the factored form of */ /* A. If EQUED is not 'N', the matrix A has been */ /* equilibrated with scaling factors given by R and C. */ /* AB, AFB, and IPIV are not modified. */ /* = 'N': The matrix A will be copied to AFB and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AFB and factored. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations. */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Transpose) */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl) */ /* If FACT = 'F' and EQUED is not 'N', then A must have been */ /* equilibrated by the scaling factors in R and/or C. AB is not */ /* modified if FACT = 'F' or 'N', or if FACT = 'E' and */ /* EQUED = 'N' on exit. */ /* On exit, if EQUED .ne. 'N', A is scaled as follows: */ /* EQUED = 'R': A := diag(R) * A */ /* EQUED = 'C': A := A * diag(C) */ /* EQUED = 'B': A := diag(R) * A * diag(C). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* AFB (input or output) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* If FACT = 'F', then AFB is an input argument and on entry */ /* contains details of the LU factorization of the band matrix */ /* A, as computed by DGBTRF. U is stored as an upper triangular */ /* band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, */ /* and the multipliers used during the factorization are stored */ /* in rows KL+KU+2 to 2*KL+KU+1. If EQUED .ne. 'N', then AFB is */ /* the factored form of the equilibrated matrix A. */ /* If FACT = 'N', then AFB is an output argument and on exit */ /* returns details of the LU factorization of A. */ /* If FACT = 'E', then AFB is an output argument and on exit */ /* returns details of the LU factorization of the equilibrated */ /* matrix A (see the description of AB for the form of the */ /* equilibrated matrix). */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= 2*KL+KU+1. */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains the pivot indices from the factorization A = L*U */ /* as computed by DGBTRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = L*U */ /* of the original matrix A. */ /* If FACT = 'E', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = L*U */ /* of the equilibrated matrix A. */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* R (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'R' or 'B', A is */ /* multiplied on the left by diag(R); if EQUED = 'N' or 'C', R */ /* is not accessed. R is an input argument if FACT = 'F'; */ /* otherwise, R is an output argument. If FACT = 'F' and */ /* EQUED = 'R' or 'B', each element of R must be positive. */ /* C (input or output) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If EQUED = 'C' or 'B', A is */ /* multiplied on the right by diag(C); if EQUED = 'N' or 'R', C */ /* is not accessed. C is an input argument if FACT = 'F'; */ /* otherwise, C is an output argument. If FACT = 'F' and */ /* EQUED = 'C' or 'B', each element of C must be positive. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, */ /* if EQUED = 'N', B is not modified; */ /* if TRANS = 'N' and EQUED = 'R' or 'B', B is overwritten by */ /* diag(R)*B; */ /* if TRANS = 'T' or 'C' and EQUED = 'C' or 'B', B is */ /* overwritten by diag(C)*B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X */ /* to the original system of equations. Note that A and B are */ /* modified on exit if EQUED .ne. 'N', and the solution to the */ /* equilibrated system is inv(diag(C))*X if TRANS = 'N' and */ /* EQUED = 'C' or 'B', or inv(diag(R))*X if TRANS = 'T' or 'C' */ /* and EQUED = 'R' or 'B'. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A after equilibration (if done). If RCOND is less than the */ /* machine precision (in particular, if RCOND = 0), the matrix */ /* is singular to working precision. This condition is */ /* indicated by a return code of INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (3*N) */ /* On exit, WORK(1) contains the reciprocal pivot growth */ /* factor norm(A)/norm(U). The "max absolute element" norm is */ /* used. If WORK(1) is much less than 1, then the stability */ /* of the LU factorization of the (equilibrated) matrix A */ /* could be poor. This also means that the solution X, condition */ /* estimator RCOND, and forward error bound FERR could be */ /* unreliable. If factorization fails with 0 0: if INFO = i, and i is */ /* <= N: U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, so the solution and error bounds */ /* could not be computed. RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --ipiv; --r__; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); notran = _starpu_lsame_(trans, "N"); if (nofact || equil) { *(unsigned char *)equed = 'N'; rowequ = FALSE_; colequ = FALSE_; } else { rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; } /* Test the input parameters. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kl < 0) { *info = -4; } else if (*ku < 0) { *info = -5; } else if (*nrhs < 0) { *info = -6; } else if (*ldab < *kl + *ku + 1) { *info = -8; } else if (*ldafb < (*kl << 1) + *ku + 1) { *info = -10; } else if (_starpu_lsame_(fact, "F") && ! (rowequ || colequ || _starpu_lsame_(equed, "N"))) { *info = -12; } else { if (rowequ) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = r__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = r__[j]; rcmax = max(d__1,d__2); /* L10: */ } if (rcmin <= 0.) { *info = -13; } else if (*n > 0) { rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { rowcnd = 1.; } } if (colequ && *info == 0) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L20: */ } if (rcmin <= 0.) { *info = -14; } else if (*n > 0) { colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { colcnd = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -16; } else if (*ldx < max(1,*n)) { *info = -18; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBSVX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dgbequ_(n, n, kl, ku, &ab[ab_offset], ldab, &r__[1], &c__[1], &rowcnd, &colcnd, &amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqgb_(n, n, kl, ku, &ab[ab_offset], ldab, &r__[1], &c__[1], & rowcnd, &colcnd, &amax, equed); rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); } } /* Scale the right hand side. */ if (notran) { if (rowequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = r__[i__] * b[i__ + j * b_dim1]; /* L30: */ } /* L40: */ } } } else if (colequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = c__[i__] * b[i__ + j * b_dim1]; /* L50: */ } /* L60: */ } } if (nofact || equil) { /* Compute the LU factorization of the band matrix A. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = j - *ku; j1 = max(i__2,1); /* Computing MIN */ i__2 = j + *kl; j2 = min(i__2,*n); i__2 = j2 - j1 + 1; _starpu_dcopy_(&i__2, &ab[*ku + 1 - j + j1 + j * ab_dim1], &c__1, &afb[* kl + *ku + 1 - j + j1 + j * afb_dim1], &c__1); /* L70: */ } _starpu_dgbtrf_(n, n, kl, ku, &afb[afb_offset], ldafb, &ipiv[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { /* Compute the reciprocal pivot growth factor of the */ /* leading rank-deficient INFO columns of A. */ anorm = 0.; i__1 = *info; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = *ku + 2 - j; /* Computing MIN */ i__4 = *n + *ku + 1 - j, i__5 = *kl + *ku + 1; i__3 = min(i__4,i__5); for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs( d__1)); anorm = max(d__2,d__3); /* L80: */ } /* L90: */ } /* Computing MIN */ i__3 = *info - 1, i__2 = *kl + *ku; i__1 = min(i__3,i__2); /* Computing MAX */ i__4 = 1, i__5 = *kl + *ku + 2 - *info; rpvgrw = _starpu_dlantb_("M", "U", "N", info, &i__1, &afb[max(i__4, i__5) + afb_dim1], ldafb, &work[1]); if (rpvgrw == 0.) { rpvgrw = 1.; } else { rpvgrw = anorm / rpvgrw; } work[1] = rpvgrw; *rcond = 0.; return 0; } } /* Compute the norm of the matrix A and the */ /* reciprocal pivot growth factor RPVGRW. */ if (notran) { *(unsigned char *)norm = '1'; } else { *(unsigned char *)norm = 'I'; } anorm = _starpu_dlangb_(norm, n, kl, ku, &ab[ab_offset], ldab, &work[1]); i__1 = *kl + *ku; rpvgrw = _starpu_dlantb_("M", "U", "N", n, &i__1, &afb[afb_offset], ldafb, &work[ 1]); if (rpvgrw == 0.) { rpvgrw = 1.; } else { rpvgrw = _starpu_dlangb_("M", n, kl, ku, &ab[ab_offset], ldab, &work[1]) / rpvgrw; } /* Compute the reciprocal of the condition number of A. */ _starpu_dgbcon_(norm, n, kl, ku, &afb[afb_offset], ldafb, &ipiv[1], &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dgbtrs_(trans, n, kl, ku, nrhs, &afb[afb_offset], ldafb, &ipiv[1], &x[ x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dgbrfs_(trans, n, kl, ku, nrhs, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, &ipiv[1], &b[b_offset], ldb, &x[x_offset], ldx, &ferr[1], & berr[1], &work[1], &iwork[1], info); /* Transform the solution matrix X to a solution of the original */ /* system. */ if (notran) { if (colequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__ + j * x_dim1] = c__[i__] * x[i__ + j * x_dim1]; /* L100: */ } /* L110: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= colcnd; /* L120: */ } } } else if (rowequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__ + j * x_dim1] = r__[i__] * x[i__ + j * x_dim1]; /* L130: */ } /* L140: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= rowcnd; /* L150: */ } } /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } work[1] = rpvgrw; return 0; /* End of DGBSVX */ } /* _starpu_dgbsvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbsvxx.c000066400000000000000000000744561413463044200210530ustar00rootroot00000000000000/* dgbsvxx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgbsvxx_(char *fact, char *trans, integer *n, integer * kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j; doublereal amax; extern doublereal _starpu_dla_gbrpvgrw__(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal rcmin, rcmax; logical equil; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlaqgb_(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, char *); doublereal colcnd; extern /* Subroutine */ int _starpu_dgbtrf_(integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dgbtrs_(char *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer infequ; logical colequ; doublereal rowcnd; logical notran; doublereal smlnum; logical rowequ; extern /* Subroutine */ int _starpu_dlascl2_(integer *, integer *, doublereal *, doublereal *, integer *), _starpu_dgbequb_(integer *, integer *, integer * , integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dgbrfsx_( char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBSVXX uses the LU factorization to compute the solution to a */ /* double precision system of linear equations A * X = B, where A is an */ /* N-by-N matrix and X and B are N-by-NRHS matrices. */ /* If requested, both normwise and maximum componentwise error bounds */ /* are returned. DGBSVXX will return a solution with a tiny */ /* guaranteed error (O(eps) where eps is the working machine */ /* precision) unless the matrix is very ill-conditioned, in which */ /* case a warning is returned. Relevant condition numbers also are */ /* calculated and returned. */ /* DGBSVXX accepts user-provided factorizations and equilibration */ /* factors; see the definitions of the FACT and EQUED options. */ /* Solving with refinement and using a factorization from a previous */ /* DGBSVXX call will also produce a solution with either O(eps) */ /* errors or warnings, but we cannot make that claim for general */ /* user-provided factorizations and equilibration factors if they */ /* differ from what DGBSVXX would itself produce. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', double precision scaling factors are computed to equilibrate */ /* the system: */ /* TRANS = 'N': diag(R)*A*diag(C) *inv(diag(C))*X = diag(R)*B */ /* TRANS = 'T': (diag(R)*A*diag(C))**T *inv(diag(R))*X = diag(C)*B */ /* TRANS = 'C': (diag(R)*A*diag(C))**H *inv(diag(R))*X = diag(C)*B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(R)*A*diag(C) and B by diag(R)*B (if TRANS='N') */ /* or diag(C)*B (if TRANS = 'T' or 'C'). */ /* 2. If FACT = 'N' or 'E', the LU decomposition is used to factor */ /* the matrix A (after equilibration if FACT = 'E') as */ /* A = P * L * U, */ /* where P is a permutation matrix, L is a unit lower triangular */ /* matrix, and U is upper triangular. */ /* 3. If some U(i,i)=0, so that U is exactly singular, then the */ /* routine returns with INFO = i. Otherwise, the factored form of A */ /* is used to estimate the condition number of the matrix A (see */ /* argument RCOND). If the reciprocal of the condition number is less */ /* than machine precision, the routine still goes on to solve for X */ /* and compute error bounds as described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. By default (unless PARAMS(LA_LINRX_ITREF_I) is set to zero), */ /* the routine will use iterative refinement to try to get a small */ /* error and error bounds. Refinement calculates the residual to at */ /* least twice the working precision. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(C) (if TRANS = 'N') or diag(R) (if TRANS = 'T' or 'C') so */ /* that it solves the original system before equilibration. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AF and IPIV contain the factored form of A. */ /* If EQUED is not 'N', the matrix A has been */ /* equilibrated with scaling factors given by R and C. */ /* A, AF, and IPIV are not modified. */ /* = 'N': The matrix A will be copied to AF and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AF and factored. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate Transpose = Transpose) */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl) */ /* If FACT = 'F' and EQUED is not 'N', then AB must have been */ /* equilibrated by the scaling factors in R and/or C. AB is not */ /* modified if FACT = 'F' or 'N', or if FACT = 'E' and */ /* EQUED = 'N' on exit. */ /* On exit, if EQUED .ne. 'N', A is scaled as follows: */ /* EQUED = 'R': A := diag(R) * A */ /* EQUED = 'C': A := A * diag(C) */ /* EQUED = 'B': A := diag(R) * A * diag(C). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* AFB (input or output) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* If FACT = 'F', then AFB is an input argument and on entry */ /* contains details of the LU factorization of the band matrix */ /* A, as computed by DGBTRF. U is stored as an upper triangular */ /* band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, */ /* and the multipliers used during the factorization are stored */ /* in rows KL+KU+2 to 2*KL+KU+1. If EQUED .ne. 'N', then AFB is */ /* the factored form of the equilibrated matrix A. */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the factors L and U from the factorization A = P*L*U */ /* of the original matrix A. */ /* If FACT = 'E', then AF is an output argument and on exit */ /* returns the factors L and U from the factorization A = P*L*U */ /* of the equilibrated matrix A (see the description of A for */ /* the form of the equilibrated matrix). */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= 2*KL+KU+1. */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains the pivot indices from the factorization A = P*L*U */ /* as computed by DGETRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = P*L*U */ /* of the original matrix A. */ /* If FACT = 'E', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = P*L*U */ /* of the equilibrated matrix A. */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* R (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'R' or 'B', A is */ /* multiplied on the left by diag(R); if EQUED = 'N' or 'C', R */ /* is not accessed. R is an input argument if FACT = 'F'; */ /* otherwise, R is an output argument. If FACT = 'F' and */ /* EQUED = 'R' or 'B', each element of R must be positive. */ /* If R is output, each element of R is a power of the radix. */ /* If R is input, each element of R should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* C (input or output) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If EQUED = 'C' or 'B', A is */ /* multiplied on the right by diag(C); if EQUED = 'N' or 'R', C */ /* is not accessed. C is an input argument if FACT = 'F'; */ /* otherwise, C is an output argument. If FACT = 'F' and */ /* EQUED = 'C' or 'B', each element of C must be positive. */ /* If C is output, each element of C is a power of the radix. */ /* If C is input, each element of C should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, */ /* if EQUED = 'N', B is not modified; */ /* if TRANS = 'N' and EQUED = 'R' or 'B', B is overwritten by */ /* diag(R)*B; */ /* if TRANS = 'T' or 'C' and EQUED = 'C' or 'B', B is */ /* overwritten by diag(C)*B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0, the N-by-NRHS solution matrix X to the original */ /* system of equations. Note that A and B are modified on exit */ /* if EQUED .ne. 'N', and the solution to the equilibrated system is */ /* inv(diag(C))*X if TRANS = 'N' and EQUED = 'C' or 'B', or */ /* inv(diag(R))*X if TRANS = 'T' or 'C' and EQUED = 'R' or 'B'. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* RPVGRW (output) DOUBLE PRECISION */ /* Reciprocal pivot growth. On exit, this contains the reciprocal */ /* pivot growth factor norm(A)/norm(U). The "max absolute element" */ /* norm is used. If this is much less than 1, then the stability of */ /* the LU factorization of the (equilibrated) matrix A could be poor. */ /* This also means that the solution X, estimated condition numbers, */ /* and error bounds could be unreliable. If factorization fails with */ /* 0 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --ipiv; --r__; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); notran = _starpu_lsame_(trans, "N"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; if (nofact || equil) { *(unsigned char *)equed = 'N'; rowequ = FALSE_; colequ = FALSE_; } else { rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); } /* Default is failure. If an input parameter is wrong or */ /* factorization fails, make everything look horrible. Only the */ /* pivot growth is set here, the rest is initialized in DGBRFSX. */ *rpvgrw = 0.; /* Test the input parameters. PARAMS is not tested until DGBRFSX. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kl < 0) { *info = -4; } else if (*ku < 0) { *info = -5; } else if (*nrhs < 0) { *info = -6; } else if (*ldab < *kl + *ku + 1) { *info = -8; } else if (*ldafb < (*kl << 1) + *ku + 1) { *info = -10; } else if (_starpu_lsame_(fact, "F") && ! (rowequ || colequ || _starpu_lsame_(equed, "N"))) { *info = -12; } else { if (rowequ) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = r__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = r__[j]; rcmax = max(d__1,d__2); /* L10: */ } if (rcmin <= 0.) { *info = -13; } else if (*n > 0) { rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { rowcnd = 1.; } } if (colequ && *info == 0) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L20: */ } if (rcmin <= 0.) { *info = -14; } else if (*n > 0) { colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { colcnd = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -15; } else if (*ldx < max(1,*n)) { *info = -16; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBSVXX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dgbequb_(n, n, kl, ku, &ab[ab_offset], ldab, &r__[1], &c__[1], & rowcnd, &colcnd, &amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqgb_(n, n, kl, ku, &ab[ab_offset], ldab, &r__[1], &c__[1], & rowcnd, &colcnd, &amax, equed); rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); } /* If the scaling factors are not applied, set them to 1.0. */ if (! rowequ) { i__1 = *n; for (j = 1; j <= i__1; ++j) { r__[j] = 1.; } } if (! colequ) { i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j] = 1.; } } } /* Scale the right hand side. */ if (notran) { if (rowequ) { _starpu_dlascl2_(n, nrhs, &r__[1], &b[b_offset], ldb); } } else { if (colequ) { _starpu_dlascl2_(n, nrhs, &c__[1], &b[b_offset], ldb); } } if (nofact || equil) { /* Compute the LU factorization of A. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = (*kl << 1) + *ku + 1; for (i__ = *kl + 1; i__ <= i__2; ++i__) { afb[i__ + j * afb_dim1] = ab[i__ - *kl + j * ab_dim1]; /* L30: */ } /* L40: */ } _starpu_dgbtrf_(n, n, kl, ku, &afb[afb_offset], ldafb, &ipiv[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { /* Pivot in column INFO is exactly 0 */ /* Compute the reciprocal pivot growth factor of the */ /* leading rank-deficient INFO columns of A. */ *rpvgrw = _starpu_dla_gbrpvgrw__(n, kl, ku, info, &ab[ab_offset], ldab, & afb[afb_offset], ldafb); return 0; } } /* Compute the reciprocal pivot growth factor RPVGRW. */ *rpvgrw = _starpu_dla_gbrpvgrw__(n, kl, ku, n, &ab[ab_offset], ldab, &afb[ afb_offset], ldafb); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dgbtrs_(trans, n, kl, ku, nrhs, &afb[afb_offset], ldafb, &ipiv[1], &x[ x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dgbrfsx_(trans, equed, n, kl, ku, nrhs, &ab[ab_offset], ldab, &afb[ afb_offset], ldafb, &ipiv[1], &r__[1], &c__[1], &b[b_offset], ldb, &x[x_offset], ldx, rcond, &berr[1], n_err_bnds__, & err_bnds_norm__[err_bnds_norm_offset], &err_bnds_comp__[ err_bnds_comp_offset], nparams, ¶ms[1], &work[1], &iwork[1], info); /* Scale solutions. */ if (colequ && notran) { _starpu_dlascl2_(n, nrhs, &c__[1], &x[x_offset], ldx); } else if (rowequ && ! notran) { _starpu_dlascl2_(n, nrhs, &r__[1], &x[x_offset], ldx); } return 0; /* End of DGBSVXX */ } /* _starpu_dgbsvxx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbtf2.c000066400000000000000000000171671413463044200205320ustar00rootroot00000000000000/* dgbtf2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b9 = -1.; /* Subroutine */ int _starpu_dgbtf2_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; doublereal d__1; /* Local variables */ integer i__, j, km, jp, ju, kv; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBTF2 computes an LU factorization of a real m-by-n band matrix A */ /* using partial pivoting with row interchanges. */ /* This is the unblocked version of the algorithm, calling Level 2 BLAS. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows KL+1 to */ /* 2*KL+KU+1; rows 1 to KL of the array need not be set. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl) */ /* On exit, details of the factorization: U is stored as an */ /* upper triangular band matrix with KL+KU superdiagonals in */ /* rows 1 to KL+KU+1, and the multipliers used during the */ /* factorization are stored in rows KL+KU+2 to 2*KL+KU+1. */ /* See below for further details. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = +i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* M = N = 6, KL = 2, KU = 1: */ /* On entry: On exit: */ /* * * * + + + * * * u14 u25 u36 */ /* * * + + + + * * u13 u24 u35 u46 */ /* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 */ /* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 */ /* a21 a32 a43 a54 a65 * m21 m32 m43 m54 m65 * */ /* a31 a42 a53 a64 * * m31 m42 m53 m64 * * */ /* Array elements marked * are not used by the routine; elements marked */ /* + need not be set on entry, but are required by the routine to store */ /* elements of U, because of fill-in resulting from the row */ /* interchanges. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* KV is the number of superdiagonals in the factor U, allowing for */ /* fill-in. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --ipiv; /* Function Body */ kv = *ku + *kl; /* Test the input parameters. */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*ldab < *kl + kv + 1) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBTF2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Gaussian elimination with partial pivoting */ /* Set fill-in elements in columns KU+2 to KV to zero. */ i__1 = min(kv,*n); for (j = *ku + 2; j <= i__1; ++j) { i__2 = *kl; for (i__ = kv - j + 2; i__ <= i__2; ++i__) { ab[i__ + j * ab_dim1] = 0.; /* L10: */ } /* L20: */ } /* JU is the index of the last column affected by the current stage */ /* of the factorization. */ ju = 1; i__1 = min(*m,*n); for (j = 1; j <= i__1; ++j) { /* Set fill-in elements in column J+KV to zero. */ if (j + kv <= *n) { i__2 = *kl; for (i__ = 1; i__ <= i__2; ++i__) { ab[i__ + (j + kv) * ab_dim1] = 0.; /* L30: */ } } /* Find pivot and test for singularity. KM is the number of */ /* subdiagonal elements in the current column. */ /* Computing MIN */ i__2 = *kl, i__3 = *m - j; km = min(i__2,i__3); i__2 = km + 1; jp = _starpu_idamax_(&i__2, &ab[kv + 1 + j * ab_dim1], &c__1); ipiv[j] = jp + j - 1; if (ab[kv + jp + j * ab_dim1] != 0.) { /* Computing MAX */ /* Computing MIN */ i__4 = j + *ku + jp - 1; i__2 = ju, i__3 = min(i__4,*n); ju = max(i__2,i__3); /* Apply interchange to columns J to JU. */ if (jp != 1) { i__2 = ju - j + 1; i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dswap_(&i__2, &ab[kv + jp + j * ab_dim1], &i__3, &ab[kv + 1 + j * ab_dim1], &i__4); } if (km > 0) { /* Compute multipliers. */ d__1 = 1. / ab[kv + 1 + j * ab_dim1]; _starpu_dscal_(&km, &d__1, &ab[kv + 2 + j * ab_dim1], &c__1); /* Update trailing submatrix within the band. */ if (ju > j) { i__2 = ju - j; i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dger_(&km, &i__2, &c_b9, &ab[kv + 2 + j * ab_dim1], &c__1, &ab[kv + (j + 1) * ab_dim1], &i__3, &ab[kv + 1 + (j + 1) * ab_dim1], &i__4); } } } else { /* If pivot is zero, set INFO to the index of the pivot */ /* unless a zero pivot has already been found. */ if (*info == 0) { *info = j; } } /* L40: */ } return 0; /* End of DGBTF2 */ } /* _starpu_dgbtf2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbtrf.c000066400000000000000000000412371413463044200206250ustar00rootroot00000000000000/* dgbtrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__65 = 65; static doublereal c_b18 = -1.; static doublereal c_b31 = 1.; /* Subroutine */ int _starpu_dgbtrf_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublereal d__1; /* Local variables */ integer i__, j, i2, i3, j2, j3, k2, jb, nb, ii, jj, jm, ip, jp, km, ju, kv, nw; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal temp; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_( integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer * ); doublereal work13[4160] /* was [65][64] */, work31[4160] /* was [65][64] */; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dgbtf2_( integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBTRF computes an LU factorization of a real m-by-n band matrix A */ /* using partial pivoting with row interchanges. */ /* This is the blocked version of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows KL+1 to */ /* 2*KL+KU+1; rows 1 to KL of the array need not be set. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl) */ /* On exit, details of the factorization: U is stored as an */ /* upper triangular band matrix with KL+KU superdiagonals in */ /* rows 1 to KL+KU+1, and the multipliers used during the */ /* factorization are stored in rows KL+KU+2 to 2*KL+KU+1. */ /* See below for further details. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = +i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* M = N = 6, KL = 2, KU = 1: */ /* On entry: On exit: */ /* * * * + + + * * * u14 u25 u36 */ /* * * + + + + * * u13 u24 u35 u46 */ /* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 */ /* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 */ /* a21 a32 a43 a54 a65 * m21 m32 m43 m54 m65 * */ /* a31 a42 a53 a64 * * m31 m42 m53 m64 * * */ /* Array elements marked * are not used by the routine; elements marked */ /* + need not be set on entry, but are required by the routine to store */ /* elements of U because of fill-in resulting from the row interchanges. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* KV is the number of superdiagonals in the factor U, allowing for */ /* fill-in */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --ipiv; /* Function Body */ kv = *ku + *kl; /* Test the input parameters. */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*ldab < *kl + kv + 1) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBTRF", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Determine the block size for this environment */ nb = _starpu_ilaenv_(&c__1, "DGBTRF", " ", m, n, kl, ku); /* The block size must not exceed the limit set by the size of the */ /* local arrays WORK13 and WORK31. */ nb = min(nb,64); if (nb <= 1 || nb > *kl) { /* Use unblocked code */ _starpu_dgbtf2_(m, n, kl, ku, &ab[ab_offset], ldab, &ipiv[1], info); } else { /* Use blocked code */ /* Zero the superdiagonal elements of the work array WORK13 */ i__1 = nb; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { work13[i__ + j * 65 - 66] = 0.; /* L10: */ } /* L20: */ } /* Zero the subdiagonal elements of the work array WORK31 */ i__1 = nb; for (j = 1; j <= i__1; ++j) { i__2 = nb; for (i__ = j + 1; i__ <= i__2; ++i__) { work31[i__ + j * 65 - 66] = 0.; /* L30: */ } /* L40: */ } /* Gaussian elimination with partial pivoting */ /* Set fill-in elements in columns KU+2 to KV to zero */ i__1 = min(kv,*n); for (j = *ku + 2; j <= i__1; ++j) { i__2 = *kl; for (i__ = kv - j + 2; i__ <= i__2; ++i__) { ab[i__ + j * ab_dim1] = 0.; /* L50: */ } /* L60: */ } /* JU is the index of the last column affected by the current */ /* stage of the factorization */ ju = 1; i__1 = min(*m,*n); i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = nb, i__4 = min(*m,*n) - j + 1; jb = min(i__3,i__4); /* The active part of the matrix is partitioned */ /* A11 A12 A13 */ /* A21 A22 A23 */ /* A31 A32 A33 */ /* Here A11, A21 and A31 denote the current block of JB columns */ /* which is about to be factorized. The number of rows in the */ /* partitioning are JB, I2, I3 respectively, and the numbers */ /* of columns are JB, J2, J3. The superdiagonal elements of A13 */ /* and the subdiagonal elements of A31 lie outside the band. */ /* Computing MIN */ i__3 = *kl - jb, i__4 = *m - j - jb + 1; i2 = min(i__3,i__4); /* Computing MIN */ i__3 = jb, i__4 = *m - j - *kl + 1; i3 = min(i__3,i__4); /* J2 and J3 are computed after JU has been updated. */ /* Factorize the current block of JB columns */ i__3 = j + jb - 1; for (jj = j; jj <= i__3; ++jj) { /* Set fill-in elements in column JJ+KV to zero */ if (jj + kv <= *n) { i__4 = *kl; for (i__ = 1; i__ <= i__4; ++i__) { ab[i__ + (jj + kv) * ab_dim1] = 0.; /* L70: */ } } /* Find pivot and test for singularity. KM is the number of */ /* subdiagonal elements in the current column. */ /* Computing MIN */ i__4 = *kl, i__5 = *m - jj; km = min(i__4,i__5); i__4 = km + 1; jp = _starpu_idamax_(&i__4, &ab[kv + 1 + jj * ab_dim1], &c__1); ipiv[jj] = jp + jj - j; if (ab[kv + jp + jj * ab_dim1] != 0.) { /* Computing MAX */ /* Computing MIN */ i__6 = jj + *ku + jp - 1; i__4 = ju, i__5 = min(i__6,*n); ju = max(i__4,i__5); if (jp != 1) { /* Apply interchange to columns J to J+JB-1 */ if (jp + jj - 1 < j + *kl) { i__4 = *ldab - 1; i__5 = *ldab - 1; _starpu_dswap_(&jb, &ab[kv + 1 + jj - j + j * ab_dim1], & i__4, &ab[kv + jp + jj - j + j * ab_dim1], &i__5); } else { /* The interchange affects columns J to JJ-1 of A31 */ /* which are stored in the work array WORK31 */ i__4 = jj - j; i__5 = *ldab - 1; _starpu_dswap_(&i__4, &ab[kv + 1 + jj - j + j * ab_dim1], &i__5, &work31[jp + jj - j - *kl - 1], & c__65); i__4 = j + jb - jj; i__5 = *ldab - 1; i__6 = *ldab - 1; _starpu_dswap_(&i__4, &ab[kv + 1 + jj * ab_dim1], &i__5, & ab[kv + jp + jj * ab_dim1], &i__6); } } /* Compute multipliers */ d__1 = 1. / ab[kv + 1 + jj * ab_dim1]; _starpu_dscal_(&km, &d__1, &ab[kv + 2 + jj * ab_dim1], &c__1); /* Update trailing submatrix within the band and within */ /* the current block. JM is the index of the last column */ /* which needs to be updated. */ /* Computing MIN */ i__4 = ju, i__5 = j + jb - 1; jm = min(i__4,i__5); if (jm > jj) { i__4 = jm - jj; i__5 = *ldab - 1; i__6 = *ldab - 1; _starpu_dger_(&km, &i__4, &c_b18, &ab[kv + 2 + jj * ab_dim1], &c__1, &ab[kv + (jj + 1) * ab_dim1], &i__5, & ab[kv + 1 + (jj + 1) * ab_dim1], &i__6); } } else { /* If pivot is zero, set INFO to the index of the pivot */ /* unless a zero pivot has already been found. */ if (*info == 0) { *info = jj; } } /* Copy current column of A31 into the work array WORK31 */ /* Computing MIN */ i__4 = jj - j + 1; nw = min(i__4,i3); if (nw > 0) { _starpu_dcopy_(&nw, &ab[kv + *kl + 1 - jj + j + jj * ab_dim1], & c__1, &work31[(jj - j + 1) * 65 - 65], &c__1); } /* L80: */ } if (j + jb <= *n) { /* Apply the row interchanges to the other blocks. */ /* Computing MIN */ i__3 = ju - j + 1; j2 = min(i__3,kv) - jb; /* Computing MAX */ i__3 = 0, i__4 = ju - j - kv + 1; j3 = max(i__3,i__4); /* Use DLASWP to apply the row interchanges to A12, A22, and */ /* A32. */ i__3 = *ldab - 1; _starpu_dlaswp_(&j2, &ab[kv + 1 - jb + (j + jb) * ab_dim1], &i__3, & c__1, &jb, &ipiv[j], &c__1); /* Adjust the pivot indices. */ i__3 = j + jb - 1; for (i__ = j; i__ <= i__3; ++i__) { ipiv[i__] = ipiv[i__] + j - 1; /* L90: */ } /* Apply the row interchanges to A13, A23, and A33 */ /* columnwise. */ k2 = j - 1 + jb + j2; i__3 = j3; for (i__ = 1; i__ <= i__3; ++i__) { jj = k2 + i__; i__4 = j + jb - 1; for (ii = j + i__ - 1; ii <= i__4; ++ii) { ip = ipiv[ii]; if (ip != ii) { temp = ab[kv + 1 + ii - jj + jj * ab_dim1]; ab[kv + 1 + ii - jj + jj * ab_dim1] = ab[kv + 1 + ip - jj + jj * ab_dim1]; ab[kv + 1 + ip - jj + jj * ab_dim1] = temp; } /* L100: */ } /* L110: */ } /* Update the relevant part of the trailing submatrix */ if (j2 > 0) { /* Update A12 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &jb, &j2, &c_b31, &ab[kv + 1 + j * ab_dim1], &i__3, &ab[kv + 1 - jb + (j + jb) * ab_dim1], &i__4); if (i2 > 0) { /* Update A22 */ i__3 = *ldab - 1; i__4 = *ldab - 1; i__5 = *ldab - 1; _starpu_dgemm_("No transpose", "No transpose", &i2, &j2, &jb, &c_b18, &ab[kv + 1 + jb + j * ab_dim1], &i__3, &ab[kv + 1 - jb + (j + jb) * ab_dim1], &i__4, &c_b31, &ab[kv + 1 + (j + jb) * ab_dim1], & i__5); } if (i3 > 0) { /* Update A32 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dgemm_("No transpose", "No transpose", &i3, &j2, &jb, &c_b18, work31, &c__65, &ab[kv + 1 - jb + (j + jb) * ab_dim1], &i__3, &c_b31, &ab[kv + *kl + 1 - jb + (j + jb) * ab_dim1], &i__4); } } if (j3 > 0) { /* Copy the lower triangle of A13 into the work array */ /* WORK13 */ i__3 = j3; for (jj = 1; jj <= i__3; ++jj) { i__4 = jb; for (ii = jj; ii <= i__4; ++ii) { work13[ii + jj * 65 - 66] = ab[ii - jj + 1 + (jj + j + kv - 1) * ab_dim1]; /* L120: */ } /* L130: */ } /* Update A13 in the work array */ i__3 = *ldab - 1; _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &jb, &j3, &c_b31, &ab[kv + 1 + j * ab_dim1], &i__3, work13, &c__65); if (i2 > 0) { /* Update A23 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dgemm_("No transpose", "No transpose", &i2, &j3, &jb, &c_b18, &ab[kv + 1 + jb + j * ab_dim1], &i__3, work13, &c__65, &c_b31, &ab[jb + 1 + (j + kv) * ab_dim1], &i__4); } if (i3 > 0) { /* Update A33 */ i__3 = *ldab - 1; _starpu_dgemm_("No transpose", "No transpose", &i3, &j3, &jb, &c_b18, work31, &c__65, work13, &c__65, & c_b31, &ab[*kl + 1 + (j + kv) * ab_dim1], & i__3); } /* Copy the lower triangle of A13 back into place */ i__3 = j3; for (jj = 1; jj <= i__3; ++jj) { i__4 = jb; for (ii = jj; ii <= i__4; ++ii) { ab[ii - jj + 1 + (jj + j + kv - 1) * ab_dim1] = work13[ii + jj * 65 - 66]; /* L140: */ } /* L150: */ } } } else { /* Adjust the pivot indices. */ i__3 = j + jb - 1; for (i__ = j; i__ <= i__3; ++i__) { ipiv[i__] = ipiv[i__] + j - 1; /* L160: */ } } /* Partially undo the interchanges in the current block to */ /* restore the upper triangular form of A31 and copy the upper */ /* triangle of A31 back into place */ i__3 = j; for (jj = j + jb - 1; jj >= i__3; --jj) { jp = ipiv[jj] - jj + 1; if (jp != 1) { /* Apply interchange to columns J to JJ-1 */ if (jp + jj - 1 < j + *kl) { /* The interchange does not affect A31 */ i__4 = jj - j; i__5 = *ldab - 1; i__6 = *ldab - 1; _starpu_dswap_(&i__4, &ab[kv + 1 + jj - j + j * ab_dim1], & i__5, &ab[kv + jp + jj - j + j * ab_dim1], & i__6); } else { /* The interchange does affect A31 */ i__4 = jj - j; i__5 = *ldab - 1; _starpu_dswap_(&i__4, &ab[kv + 1 + jj - j + j * ab_dim1], & i__5, &work31[jp + jj - j - *kl - 1], &c__65); } } /* Copy the current column of A31 back into place */ /* Computing MIN */ i__4 = i3, i__5 = jj - j + 1; nw = min(i__4,i__5); if (nw > 0) { _starpu_dcopy_(&nw, &work31[(jj - j + 1) * 65 - 65], &c__1, &ab[ kv + *kl + 1 - jj + j + jj * ab_dim1], &c__1); } /* L170: */ } /* L180: */ } } return 0; /* End of DGBTRF */ } /* _starpu_dgbtrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgbtrs.c000066400000000000000000000156711413463044200206450ustar00rootroot00000000000000/* dgbtrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = -1.; static integer c__1 = 1; static doublereal c_b23 = 1.; /* Subroutine */ int _starpu_dgbtrs_(char *trans, integer *n, integer *kl, integer * ku, integer *nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, kd, lm; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtbsv_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); logical lnoti; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGBTRS solves a system of linear equations */ /* A * X = B or A' * X = B */ /* with a general band matrix A using the LU factorization computed */ /* by DGBTRF. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations. */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A'* X = B (Transpose) */ /* = 'C': A'* X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* Details of the LU factorization of the band matrix A, as */ /* computed by DGBTRF. U is stored as an upper triangular band */ /* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and */ /* the multipliers used during the factorization are stored in */ /* rows KL+KU+2 to 2*KL+KU+1. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= N, row i of the matrix was */ /* interchanged with row IPIV(i). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; notran = _starpu_lsame_(trans, "N"); if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0) { *info = -3; } else if (*ku < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*ldab < (*kl << 1) + *ku + 1) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGBTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } kd = *ku + *kl + 1; lnoti = *kl > 0; if (notran) { /* Solve A*X = B. */ /* Solve L*X = B, overwriting B with X. */ /* L is represented as a product of permutations and unit lower */ /* triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1), */ /* where each transformation L(i) is a rank-one modification of */ /* the identity matrix. */ if (lnoti) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = *kl, i__3 = *n - j; lm = min(i__2,i__3); l = ipiv[j]; if (l != j) { _starpu_dswap_(nrhs, &b[l + b_dim1], ldb, &b[j + b_dim1], ldb); } _starpu_dger_(&lm, nrhs, &c_b7, &ab[kd + 1 + j * ab_dim1], &c__1, &b[ j + b_dim1], ldb, &b[j + 1 + b_dim1], ldb); /* L10: */ } } i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { /* Solve U*X = B, overwriting B with X. */ i__2 = *kl + *ku; _starpu_dtbsv_("Upper", "No transpose", "Non-unit", n, &i__2, &ab[ ab_offset], ldab, &b[i__ * b_dim1 + 1], &c__1); /* L20: */ } } else { /* Solve A'*X = B. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { /* Solve U'*X = B, overwriting B with X. */ i__2 = *kl + *ku; _starpu_dtbsv_("Upper", "Transpose", "Non-unit", n, &i__2, &ab[ab_offset], ldab, &b[i__ * b_dim1 + 1], &c__1); /* L30: */ } /* Solve L'*X = B, overwriting B with X. */ if (lnoti) { for (j = *n - 1; j >= 1; --j) { /* Computing MIN */ i__1 = *kl, i__2 = *n - j; lm = min(i__1,i__2); _starpu_dgemv_("Transpose", &lm, nrhs, &c_b7, &b[j + 1 + b_dim1], ldb, &ab[kd + 1 + j * ab_dim1], &c__1, &c_b23, &b[j + b_dim1], ldb); l = ipiv[j]; if (l != j) { _starpu_dswap_(nrhs, &b[l + b_dim1], ldb, &b[j + b_dim1], ldb); } /* L40: */ } } } return 0; /* End of DGBTRS */ } /* _starpu_dgbtrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgebak.c000066400000000000000000000137671413463044200206010ustar00rootroot00000000000000/* dgebak.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *scale, integer *m, doublereal *v, integer * ldv, integer *info) { /* System generated locals */ integer v_dim1, v_offset, i__1; /* Local variables */ integer i__, k; doublereal s; integer ii; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical leftv; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical rightv; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEBAK forms the right or left eigenvectors of a real general matrix */ /* by backward transformation on the computed eigenvectors of the */ /* balanced matrix output by DGEBAL. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies the type of backward transformation required: */ /* = 'N', do nothing, return immediately; */ /* = 'P', do backward transformation for permutation only; */ /* = 'S', do backward transformation for scaling only; */ /* = 'B', do backward transformations for both permutation and */ /* scaling. */ /* JOB must be the same as the argument JOB supplied to DGEBAL. */ /* SIDE (input) CHARACTER*1 */ /* = 'R': V contains right eigenvectors; */ /* = 'L': V contains left eigenvectors. */ /* N (input) INTEGER */ /* The number of rows of the matrix V. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* The integers ILO and IHI determined by DGEBAL. */ /* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. */ /* SCALE (input) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutation and scaling factors, as returned */ /* by DGEBAL. */ /* M (input) INTEGER */ /* The number of columns of the matrix V. M >= 0. */ /* V (input/output) DOUBLE PRECISION array, dimension (LDV,M) */ /* On entry, the matrix of right or left eigenvectors to be */ /* transformed, as returned by DHSEIN or DTREVC. */ /* On exit, V is overwritten by the transformed eigenvectors. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. LDV >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and Test the input parameters */ /* Parameter adjustments */ --scale; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; /* Function Body */ rightv = _starpu_lsame_(side, "R"); leftv = _starpu_lsame_(side, "L"); *info = 0; if (! _starpu_lsame_(job, "N") && ! _starpu_lsame_(job, "P") && ! _starpu_lsame_(job, "S") && ! _starpu_lsame_(job, "B")) { *info = -1; } else if (! rightv && ! leftv) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ilo < 1 || *ilo > max(1,*n)) { *info = -4; } else if (*ihi < min(*ilo,*n) || *ihi > *n) { *info = -5; } else if (*m < 0) { *info = -7; } else if (*ldv < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEBAK", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*m == 0) { return 0; } if (_starpu_lsame_(job, "N")) { return 0; } if (*ilo == *ihi) { goto L30; } /* Backward balance */ if (_starpu_lsame_(job, "S") || _starpu_lsame_(job, "B")) { if (rightv) { i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { s = scale[i__]; _starpu_dscal_(m, &s, &v[i__ + v_dim1], ldv); /* L10: */ } } if (leftv) { i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { s = 1. / scale[i__]; _starpu_dscal_(m, &s, &v[i__ + v_dim1], ldv); /* L20: */ } } } /* Backward permutation */ /* For I = ILO-1 step -1 until 1, */ /* IHI+1 step 1 until N do -- */ L30: if (_starpu_lsame_(job, "P") || _starpu_lsame_(job, "B")) { if (rightv) { i__1 = *n; for (ii = 1; ii <= i__1; ++ii) { i__ = ii; if (i__ >= *ilo && i__ <= *ihi) { goto L40; } if (i__ < *ilo) { i__ = *ilo - ii; } k = (integer) scale[i__]; if (k == i__) { goto L40; } _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); L40: ; } } if (leftv) { i__1 = *n; for (ii = 1; ii <= i__1; ++ii) { i__ = ii; if (i__ >= *ilo && i__ <= *ihi) { goto L50; } if (i__ < *ilo) { i__ = *ilo - ii; } k = (integer) scale[i__]; if (k == i__) { goto L50; } _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); L50: ; } } } return 0; /* End of DGEBAK */ } /* _starpu_dgebak_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgebal.c000066400000000000000000000227071413463044200205740ustar00rootroot00000000000000/* dgebal.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgebal_(char *job, integer *n, doublereal *a, integer * lda, integer *ilo, integer *ihi, doublereal *scale, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ doublereal c__, f, g; integer i__, j, k, l, m; doublereal r__, s, ca, ra; integer ica, ira, iexc; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal sfmin1, sfmin2, sfmax1, sfmax2; extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical noconv; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEBAL balances a general real matrix A. This involves, first, */ /* permuting A by a similarity transformation to isolate eigenvalues */ /* in the first 1 to ILO-1 and last IHI+1 to N elements on the */ /* diagonal; and second, applying a diagonal similarity transformation */ /* to rows and columns ILO to IHI to make the rows and columns as */ /* close in norm as possible. Both steps are optional. */ /* Balancing may reduce the 1-norm of the matrix, and improve the */ /* accuracy of the computed eigenvalues and/or eigenvectors. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies the operations to be performed on A: */ /* = 'N': none: simply set ILO = 1, IHI = N, SCALE(I) = 1.0 */ /* for i = 1,...,N; */ /* = 'P': permute only; */ /* = 'S': scale only; */ /* = 'B': both permute and scale. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the input matrix A. */ /* On exit, A is overwritten by the balanced matrix. */ /* If JOB = 'N', A is not referenced. */ /* See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* ILO (output) INTEGER */ /* IHI (output) INTEGER */ /* ILO and IHI are set to integers such that on exit */ /* A(i,j) = 0 if i > j and j = 1,...,ILO-1 or I = IHI+1,...,N. */ /* If JOB = 'N' or 'S', ILO = 1 and IHI = N. */ /* SCALE (output) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and scaling factors applied to */ /* A. If P(j) is the index of the row and column interchanged */ /* with row and column j and D(j) is the scaling factor */ /* applied to row and column j, then */ /* SCALE(j) = P(j) for j = 1,...,ILO-1 */ /* = D(j) for j = ILO,...,IHI */ /* = P(j) for j = IHI+1,...,N. */ /* The order in which the interchanges are made is N to IHI+1, */ /* then 1 to ILO-1. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The permutations consist of row and column interchanges which put */ /* the matrix in the form */ /* ( T1 X Y ) */ /* P A P = ( 0 B Z ) */ /* ( 0 0 T2 ) */ /* where T1 and T2 are upper triangular matrices whose eigenvalues lie */ /* along the diagonal. The column indices ILO and IHI mark the starting */ /* and ending columns of the submatrix B. Balancing consists of applying */ /* a diagonal similarity transformation inv(D) * B * D to make the */ /* 1-norms of each row of B and its corresponding column nearly equal. */ /* The output matrix is */ /* ( T1 X*D Y ) */ /* ( 0 inv(D)*B*D inv(D)*Z ). */ /* ( 0 0 T2 ) */ /* Information about the permutations P and the diagonal matrix D is */ /* returned in the vector SCALE. */ /* This subroutine is based on the EISPACK routine BALANC. */ /* Modified by Tzu-Yi Chen, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --scale; /* Function Body */ *info = 0; if (! _starpu_lsame_(job, "N") && ! _starpu_lsame_(job, "P") && ! _starpu_lsame_(job, "S") && ! _starpu_lsame_(job, "B")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEBAL", &i__1); return 0; } k = 1; l = *n; if (*n == 0) { goto L210; } if (_starpu_lsame_(job, "N")) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { scale[i__] = 1.; /* L10: */ } goto L210; } if (_starpu_lsame_(job, "S")) { goto L120; } /* Permutation to isolate eigenvalues if possible */ goto L50; /* Row and column exchange. */ L20: scale[m] = (doublereal) j; if (j == m) { goto L30; } _starpu_dswap_(&l, &a[j * a_dim1 + 1], &c__1, &a[m * a_dim1 + 1], &c__1); i__1 = *n - k + 1; _starpu_dswap_(&i__1, &a[j + k * a_dim1], lda, &a[m + k * a_dim1], lda); L30: switch (iexc) { case 1: goto L40; case 2: goto L80; } /* Search for rows isolating an eigenvalue and push them down. */ L40: if (l == 1) { goto L210; } --l; L50: for (j = l; j >= 1; --j) { i__1 = l; for (i__ = 1; i__ <= i__1; ++i__) { if (i__ == j) { goto L60; } if (a[j + i__ * a_dim1] != 0.) { goto L70; } L60: ; } m = l; iexc = 1; goto L20; L70: ; } goto L90; /* Search for columns isolating an eigenvalue and push them left. */ L80: ++k; L90: i__1 = l; for (j = k; j <= i__1; ++j) { i__2 = l; for (i__ = k; i__ <= i__2; ++i__) { if (i__ == j) { goto L100; } if (a[i__ + j * a_dim1] != 0.) { goto L110; } L100: ; } m = k; iexc = 2; goto L20; L110: ; } L120: i__1 = l; for (i__ = k; i__ <= i__1; ++i__) { scale[i__] = 1.; /* L130: */ } if (_starpu_lsame_(job, "P")) { goto L210; } /* Balance the submatrix in rows K to L. */ /* Iterative loop for norm reduction */ sfmin1 = _starpu_dlamch_("S") / _starpu_dlamch_("P"); sfmax1 = 1. / sfmin1; sfmin2 = sfmin1 * 2.; sfmax2 = 1. / sfmin2; L140: noconv = FALSE_; i__1 = l; for (i__ = k; i__ <= i__1; ++i__) { c__ = 0.; r__ = 0.; i__2 = l; for (j = k; j <= i__2; ++j) { if (j == i__) { goto L150; } c__ += (d__1 = a[j + i__ * a_dim1], abs(d__1)); r__ += (d__1 = a[i__ + j * a_dim1], abs(d__1)); L150: ; } ica = _starpu_idamax_(&l, &a[i__ * a_dim1 + 1], &c__1); ca = (d__1 = a[ica + i__ * a_dim1], abs(d__1)); i__2 = *n - k + 1; ira = _starpu_idamax_(&i__2, &a[i__ + k * a_dim1], lda); ra = (d__1 = a[i__ + (ira + k - 1) * a_dim1], abs(d__1)); /* Guard against zero C or R due to underflow. */ if (c__ == 0. || r__ == 0.) { goto L200; } g = r__ / 2.; f = 1.; s = c__ + r__; L160: /* Computing MAX */ d__1 = max(f,c__); /* Computing MIN */ d__2 = min(r__,g); if (c__ >= g || max(d__1,ca) >= sfmax2 || min(d__2,ra) <= sfmin2) { goto L170; } f *= 2.; c__ *= 2.; ca *= 2.; r__ /= 2.; g /= 2.; ra /= 2.; goto L160; L170: g = c__ / 2.; L180: /* Computing MIN */ d__1 = min(f,c__), d__1 = min(d__1,g); if (g < r__ || max(r__,ra) >= sfmax2 || min(d__1,ca) <= sfmin2) { goto L190; } f /= 2.; c__ /= 2.; g /= 2.; ca /= 2.; r__ *= 2.; ra *= 2.; goto L180; /* Now balance. */ L190: if (c__ + r__ >= s * .95) { goto L200; } if (f < 1. && scale[i__] < 1.) { if (f * scale[i__] <= sfmin1) { goto L200; } } if (f > 1. && scale[i__] > 1.) { if (scale[i__] >= sfmax1 / f) { goto L200; } } g = 1. / f; scale[i__] *= f; noconv = TRUE_; i__2 = *n - k + 1; _starpu_dscal_(&i__2, &g, &a[i__ + k * a_dim1], lda); _starpu_dscal_(&l, &f, &a[i__ * a_dim1 + 1], &c__1); L200: ; } if (noconv) { goto L140; } L210: *ilo = k; *ihi = l; return 0; /* End of DGEBAL */ } /* _starpu_dgebal_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgebd2.c000066400000000000000000000230061413463044200204760ustar00rootroot00000000000000/* dgebd2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgebd2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEBD2 reduces a real general m by n matrix A to upper or lower */ /* bidiagonal form B by an orthogonal transformation: Q' * A * P = B. */ /* If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows in the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns in the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n general matrix to be reduced. */ /* On exit, */ /* if m >= n, the diagonal and the first superdiagonal are */ /* overwritten with the upper bidiagonal matrix B; the */ /* elements below the diagonal, with the array TAUQ, represent */ /* the orthogonal matrix Q as a product of elementary */ /* reflectors, and the elements above the first superdiagonal, */ /* with the array TAUP, represent the orthogonal matrix P as */ /* a product of elementary reflectors; */ /* if m < n, the diagonal and the first subdiagonal are */ /* overwritten with the lower bidiagonal matrix B; the */ /* elements below the first subdiagonal, with the array TAUQ, */ /* represent the orthogonal matrix Q as a product of */ /* elementary reflectors, and the elements above the diagonal, */ /* with the array TAUP, represent the orthogonal matrix P as */ /* a product of elementary reflectors. */ /* See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* D (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The diagonal elements of the bidiagonal matrix B: */ /* D(i) = A(i,i). */ /* E (output) DOUBLE PRECISION array, dimension (min(M,N)-1) */ /* The off-diagonal elements of the bidiagonal matrix B: */ /* if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; */ /* if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. */ /* TAUQ (output) DOUBLE PRECISION array dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Q. See Further Details. */ /* TAUP (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix P. See Further Details. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (max(M,N)) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrices Q and P are represented as products of elementary */ /* reflectors: */ /* If m >= n, */ /* Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) */ /* Each H(i) and G(i) has the form: */ /* H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' */ /* where tauq and taup are real scalars, and v and u are real vectors; */ /* v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); */ /* u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); */ /* tauq is stored in TAUQ(i) and taup in TAUP(i). */ /* If m < n, */ /* Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) */ /* Each H(i) and G(i) has the form: */ /* H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' */ /* where tauq and taup are real scalars, and v and u are real vectors; */ /* v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); */ /* u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); */ /* tauq is stored in TAUQ(i) and taup in TAUP(i). */ /* The contents of A on exit are illustrated by the following examples: */ /* m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ /* ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) */ /* ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) */ /* ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) */ /* ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) */ /* ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) */ /* ( v1 v2 v3 v4 v5 ) */ /* where d and e denote diagonal and off-diagonal elements of B, vi */ /* denotes an element of the vector defining H(i), and ui an element of */ /* the vector defining G(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tauq; --taup; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info < 0) { i__1 = -(*info); _starpu_xerbla_("DGEBD2", &i__1); return 0; } if (*m >= *n) { /* Reduce to upper bidiagonal form */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ i__2 = *m - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m)+ i__ * a_dim1], &c__1, &tauq[i__]); d__[i__] = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; /* Apply H(i) to A(i:m,i+1:n) from the left */ if (i__ < *n) { i__2 = *m - i__ + 1; i__3 = *n - i__; _starpu_dlarf_("Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, & tauq[i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1] ); } a[i__ + i__ * a_dim1] = d__[i__]; if (i__ < *n) { /* Generate elementary reflector G(i) to annihilate */ /* A(i,i+2:n) */ i__2 = *n - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( i__3, *n)* a_dim1], lda, &taup[i__]); e[i__] = a[i__ + (i__ + 1) * a_dim1]; a[i__ + (i__ + 1) * a_dim1] = 1.; /* Apply G(i) to A(i+1:m,i+1:n) from the right */ i__2 = *m - i__; i__3 = *n - i__; _starpu_dlarf_("Right", &i__2, &i__3, &a[i__ + (i__ + 1) * a_dim1], lda, &taup[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &work[1]); a[i__ + (i__ + 1) * a_dim1] = e[i__]; } else { taup[i__] = 0.; } /* L10: */ } } else { /* Reduce to lower bidiagonal form */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector G(i) to annihilate A(i,i+1:n) */ i__2 = *n - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n)* a_dim1], lda, &taup[i__]); d__[i__] = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; /* Apply G(i) to A(i+1:m,i:n) from the right */ if (i__ < *m) { i__2 = *m - i__; i__3 = *n - i__ + 1; _starpu_dlarf_("Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, & taup[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1]); } a[i__ + i__ * a_dim1] = d__[i__]; if (i__ < *m) { /* Generate elementary reflector H(i) to annihilate */ /* A(i+2:m,i) */ i__2 = *m - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *m)+ i__ * a_dim1], &c__1, &tauq[i__]); e[i__] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; /* Apply H(i) to A(i+1:m,i+1:n) from the left */ i__2 = *m - i__; i__3 = *n - i__; _starpu_dlarf_("Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], & c__1, &tauq[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &work[1]); a[i__ + 1 + i__ * a_dim1] = e[i__]; } else { tauq[i__] = 0.; } /* L20: */ } } return 0; /* End of DGEBD2 */ } /* _starpu_dgebd2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgebrd.c000066400000000000000000000260561413463044200206060ustar00rootroot00000000000000/* dgebrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b21 = -1.; static doublereal c_b22 = 1.; /* Subroutine */ int _starpu_dgebrd_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * taup, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, nb, nx; doublereal ws; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nbmin, iinfo, minmn; extern /* Subroutine */ int _starpu_dgebd2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlabrd_(integer *, integer *, integer * , doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *) , _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwrkx, ldwrky, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEBRD reduces a general real M-by-N matrix A to upper or lower */ /* bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. */ /* If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows in the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns in the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N general matrix to be reduced. */ /* On exit, */ /* if m >= n, the diagonal and the first superdiagonal are */ /* overwritten with the upper bidiagonal matrix B; the */ /* elements below the diagonal, with the array TAUQ, represent */ /* the orthogonal matrix Q as a product of elementary */ /* reflectors, and the elements above the first superdiagonal, */ /* with the array TAUP, represent the orthogonal matrix P as */ /* a product of elementary reflectors; */ /* if m < n, the diagonal and the first subdiagonal are */ /* overwritten with the lower bidiagonal matrix B; the */ /* elements below the first subdiagonal, with the array TAUQ, */ /* represent the orthogonal matrix Q as a product of */ /* elementary reflectors, and the elements above the diagonal, */ /* with the array TAUP, represent the orthogonal matrix P as */ /* a product of elementary reflectors. */ /* See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* D (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The diagonal elements of the bidiagonal matrix B: */ /* D(i) = A(i,i). */ /* E (output) DOUBLE PRECISION array, dimension (min(M,N)-1) */ /* The off-diagonal elements of the bidiagonal matrix B: */ /* if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; */ /* if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. */ /* TAUQ (output) DOUBLE PRECISION array dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Q. See Further Details. */ /* TAUP (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix P. See Further Details. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of the array WORK. LWORK >= max(1,M,N). */ /* For optimum performance LWORK >= (M+N)*NB, where NB */ /* is the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrices Q and P are represented as products of elementary */ /* reflectors: */ /* If m >= n, */ /* Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) */ /* Each H(i) and G(i) has the form: */ /* H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' */ /* where tauq and taup are real scalars, and v and u are real vectors; */ /* v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); */ /* u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); */ /* tauq is stored in TAUQ(i) and taup in TAUP(i). */ /* If m < n, */ /* Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) */ /* Each H(i) and G(i) has the form: */ /* H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' */ /* where tauq and taup are real scalars, and v and u are real vectors; */ /* v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); */ /* u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); */ /* tauq is stored in TAUQ(i) and taup in TAUP(i). */ /* The contents of A on exit are illustrated by the following examples: */ /* m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ /* ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) */ /* ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) */ /* ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) */ /* ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) */ /* ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) */ /* ( v1 v2 v3 v4 v5 ) */ /* where d and e denote diagonal and off-diagonal elements of B, vi */ /* denotes an element of the vector defining H(i), and ui an element of */ /* the vector defining G(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tauq; --taup; --work; /* Function Body */ *info = 0; /* Computing MAX */ i__1 = 1, i__2 = _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); nb = max(i__1,i__2); lwkopt = (*m + *n) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*lwork < max(i__1,*n) && ! lquery) { *info = -10; } } if (*info < 0) { i__1 = -(*info); _starpu_xerbla_("DGEBRD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ minmn = min(*m,*n); if (minmn == 0) { work[1] = 1.; return 0; } ws = (doublereal) max(*m,*n); ldwrkx = *m; ldwrky = *n; if (nb > 1 && nb < minmn) { /* Set the crossover point NX. */ /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__3, "DGEBRD", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); /* Determine when to switch from blocked to unblocked code. */ if (nx < minmn) { ws = (doublereal) ((*m + *n) * nb); if ((doublereal) (*lwork) < ws) { /* Not enough work space for the optimal NB, consider using */ /* a smaller block size. */ nbmin = _starpu_ilaenv_(&c__2, "DGEBRD", " ", m, n, &c_n1, &c_n1); if (*lwork >= (*m + *n) * nbmin) { nb = *lwork / (*m + *n); } else { nb = 1; nx = minmn; } } } } else { nx = minmn; } i__1 = minmn - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Reduce rows and columns i:i+nb-1 to bidiagonal form and return */ /* the matrices X and Y which are needed to update the unreduced */ /* part of the matrix */ i__3 = *m - i__ + 1; i__4 = *n - i__ + 1; _starpu_dlabrd_(&i__3, &i__4, &nb, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[ i__], &tauq[i__], &taup[i__], &work[1], &ldwrkx, &work[ldwrkx * nb + 1], &ldwrky); /* Update the trailing submatrix A(i+nb:m,i+nb:n), using an update */ /* of the form A := A - V*Y' - X*U' */ i__3 = *m - i__ - nb + 1; i__4 = *n - i__ - nb + 1; _starpu_dgemm_("No transpose", "Transpose", &i__3, &i__4, &nb, &c_b21, &a[i__ + nb + i__ * a_dim1], lda, &work[ldwrkx * nb + nb + 1], & ldwrky, &c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda); i__3 = *m - i__ - nb + 1; i__4 = *n - i__ - nb + 1; _starpu_dgemm_("No transpose", "No transpose", &i__3, &i__4, &nb, &c_b21, & work[nb + 1], &ldwrkx, &a[i__ + (i__ + nb) * a_dim1], lda, & c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda); /* Copy diagonal and off-diagonal elements of B back into A */ if (*m >= *n) { i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j + j * a_dim1] = d__[j]; a[j + (j + 1) * a_dim1] = e[j]; /* L10: */ } } else { i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j + j * a_dim1] = d__[j]; a[j + 1 + j * a_dim1] = e[j]; /* L20: */ } } /* L30: */ } /* Use unblocked code to reduce the remainder of the matrix */ i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; _starpu_dgebd2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], & tauq[i__], &taup[i__], &work[1], &iinfo); work[1] = ws; return 0; /* End of DGEBRD */ } /* _starpu_dgebrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgecon.c000066400000000000000000000143601413463044200206110ustar00rootroot00000000000000/* dgecon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgecon_(char *norm, integer *n, doublereal *a, integer * lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; doublereal d__1; /* Local variables */ doublereal sl; integer ix; doublereal su; integer kase, kase1; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *), _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dlatrs_(char *, char *, char *, char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical onenrm; char normin[1]; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGECON estimates the reciprocal of the condition number of a general */ /* real matrix A, in either the 1-norm or the infinity-norm, using */ /* the LU factorization computed by DGETRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as */ /* RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies whether the 1-norm condition number or the */ /* infinity-norm condition number is required: */ /* = '1' or 'O': 1-norm; */ /* = 'I': Infinity-norm. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The factors L and U from the factorization A = P*L*U */ /* as computed by DGETRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* ANORM (input) DOUBLE PRECISION */ /* If NORM = '1' or 'O', the 1-norm of the original matrix A. */ /* If NORM = 'I', the infinity-norm of the original matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(norm(A) * norm(inv(A))). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; --iwork; /* Function Body */ *info = 0; onenrm = *(unsigned char *)norm == '1' || _starpu_lsame_(norm, "O"); if (! onenrm && ! _starpu_lsame_(norm, "I")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*anorm < 0.) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGECON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } smlnum = _starpu_dlamch_("Safe minimum"); /* Estimate the norm of inv(A). */ ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { kase1 = 1; } else { kase1 = 2; } kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { /* Multiply by inv(L). */ _starpu_dlatrs_("Lower", "No transpose", "Unit", normin, n, &a[a_offset], lda, &work[1], &sl, &work[(*n << 1) + 1], info); /* Multiply by inv(U). */ _starpu_dlatrs_("Upper", "No transpose", "Non-unit", normin, n, &a[ a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info); } else { /* Multiply by inv(U'). */ _starpu_dlatrs_("Upper", "Transpose", "Non-unit", normin, n, &a[a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info); /* Multiply by inv(L'). */ _starpu_dlatrs_("Lower", "Transpose", "Unit", normin, n, &a[a_offset], lda, &work[1], &sl, &work[(*n << 1) + 1], info); } /* Divide X by 1/(SL*SU) if doing so will not cause overflow. */ scale = sl * su; *(unsigned char *)normin = 'Y'; if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } L20: return 0; /* End of DGECON */ } /* _starpu_dgecon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeequ.c000066400000000000000000000165041413463044200206260ustar00rootroot00000000000000/* dgeequ.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgeequ_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j; doublereal rcmin, rcmax; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum, smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEEQU computes row and column scalings intended to equilibrate an */ /* M-by-N matrix A and reduce its condition number. R returns the row */ /* scale factors and C the column scale factors, chosen to try to make */ /* the largest element in each row and column of the matrix B with */ /* elements B(i,j)=R(i)*A(i,j)*C(j) have absolute value 1. */ /* R(i) and C(j) are restricted to be between SMLNUM = smallest safe */ /* number and BIGNUM = largest safe number. Use of these scaling */ /* factors is not guaranteed to reduce the condition number of A but */ /* works well in practice. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The M-by-N matrix whose equilibration factors are */ /* to be computed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* R (output) DOUBLE PRECISION array, dimension (M) */ /* If INFO = 0 or INFO > M, R contains the row scale factors */ /* for A. */ /* C (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, C contains the column scale factors for A. */ /* ROWCND (output) DOUBLE PRECISION */ /* If INFO = 0 or INFO > M, ROWCND contains the ratio of the */ /* smallest R(i) to the largest R(i). If ROWCND >= 0.1 and */ /* AMAX is neither too large nor too small, it is not worth */ /* scaling by R. */ /* COLCND (output) DOUBLE PRECISION */ /* If INFO = 0, COLCND contains the ratio of the smallest */ /* C(i) to the largest C(i). If COLCND >= 0.1, it is not */ /* worth scaling by C. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= M: the i-th row of A is exactly zero */ /* > M: the (i-M)-th column of A is exactly zero */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --r__; --c__; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEEQU", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { *rowcnd = 1.; *colcnd = 1.; *amax = 0.; return 0; } /* Get machine constants. */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; /* Compute row scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { r__[i__] = 0.; /* L10: */ } /* Find the maximum element in each row. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = r__[i__], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); r__[i__] = max(d__2,d__3); /* L20: */ } /* L30: */ } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = rcmax, d__2 = r__[i__]; rcmax = max(d__1,d__2); /* Computing MIN */ d__1 = rcmin, d__2 = r__[i__]; rcmin = min(d__1,d__2); /* L40: */ } *amax = rcmax; if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (r__[i__] == 0.) { *info = i__; return 0; } /* L50: */ } } else { /* Invert the scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ /* Computing MAX */ d__2 = r__[i__]; d__1 = max(d__2,smlnum); r__[i__] = 1. / min(d__1,bignum); /* L60: */ } /* Compute ROWCND = min(R(I)) / max(R(I)) */ *rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } /* Compute column scale factors */ i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j] = 0.; /* L70: */ } /* Find the maximum element in each column, */ /* assuming the row scaling computed above. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = c__[j], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)) * r__[i__]; c__[j] = max(d__2,d__3); /* L80: */ } /* L90: */ } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L100: */ } if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (c__[j] == 0.) { *info = *m + j; return 0; } /* L110: */ } } else { /* Invert the scale factors. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ /* Computing MAX */ d__2 = c__[j]; d__1 = max(d__2,smlnum); c__[j] = 1. / min(d__1,bignum); /* L120: */ } /* Compute COLCND = min(C(J)) / max(C(J)) */ *colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } return 0; /* End of DGEEQU */ } /* _starpu_dgeequ_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeequb.c000066400000000000000000000210121413463044200207560ustar00rootroot00000000000000/* dgeequb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgeequb_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2, d__3; /* Builtin functions */ double log(doublereal), pow_di(doublereal *, integer *); /* Local variables */ integer i__, j; doublereal radix, rcmin, rcmax; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum, logrdx, smlnum; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEEQUB computes row and column scalings intended to equilibrate an */ /* M-by-N matrix A and reduce its condition number. R returns the row */ /* scale factors and C the column scale factors, chosen to try to make */ /* the largest element in each row and column of the matrix B with */ /* elements B(i,j)=R(i)*A(i,j)*C(j) have an absolute value of at most */ /* the radix. */ /* R(i) and C(j) are restricted to be a power of the radix between */ /* SMLNUM = smallest safe number and BIGNUM = largest safe number. Use */ /* of these scaling factors is not guaranteed to reduce the condition */ /* number of A but works well in practice. */ /* This routine differs from DGEEQU by restricting the scaling factors */ /* to a power of the radix. Baring over- and underflow, scaling by */ /* these factors introduces no additional rounding errors. However, the */ /* scaled entries' magnitured are no longer approximately 1 but lie */ /* between sqrt(radix) and 1/sqrt(radix). */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The M-by-N matrix whose equilibration factors are */ /* to be computed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* R (output) DOUBLE PRECISION array, dimension (M) */ /* If INFO = 0 or INFO > M, R contains the row scale factors */ /* for A. */ /* C (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, C contains the column scale factors for A. */ /* ROWCND (output) DOUBLE PRECISION */ /* If INFO = 0 or INFO > M, ROWCND contains the ratio of the */ /* smallest R(i) to the largest R(i). If ROWCND >= 0.1 and */ /* AMAX is neither too large nor too small, it is not worth */ /* scaling by R. */ /* COLCND (output) DOUBLE PRECISION */ /* If INFO = 0, COLCND contains the ratio of the smallest */ /* C(i) to the largest C(i). If COLCND >= 0.1, it is not */ /* worth scaling by C. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= M: the i-th row of A is exactly zero */ /* > M: the (i-M)-th column of A is exactly zero */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --r__; --c__; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEEQUB", &i__1); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { *rowcnd = 1.; *colcnd = 1.; *amax = 0.; return 0; } /* Get machine constants. Assume SMLNUM is a power of the radix. */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; radix = _starpu_dlamch_("B"); logrdx = log(radix); /* Compute row scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { r__[i__] = 0.; /* L10: */ } /* Find the maximum element in each row. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = r__[i__], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); r__[i__] = max(d__2,d__3); /* L20: */ } /* L30: */ } i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (r__[i__] > 0.) { i__2 = (integer) (log(r__[i__]) / logrdx); r__[i__] = pow_di(&radix, &i__2); } } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = rcmax, d__2 = r__[i__]; rcmax = max(d__1,d__2); /* Computing MIN */ d__1 = rcmin, d__2 = r__[i__]; rcmin = min(d__1,d__2); /* L40: */ } *amax = rcmax; if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (r__[i__] == 0.) { *info = i__; return 0; } /* L50: */ } } else { /* Invert the scale factors. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ /* Computing MAX */ d__2 = r__[i__]; d__1 = max(d__2,smlnum); r__[i__] = 1. / min(d__1,bignum); /* L60: */ } /* Compute ROWCND = min(R(I)) / max(R(I)). */ *rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } /* Compute column scale factors */ i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j] = 0.; /* L70: */ } /* Find the maximum element in each column, */ /* assuming the row scaling computed above. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = c__[j], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)) * r__[i__]; c__[j] = max(d__2,d__3); /* L80: */ } if (c__[j] > 0.) { i__2 = (integer) (log(c__[j]) / logrdx); c__[j] = pow_di(&radix, &i__2); } /* L90: */ } /* Find the maximum and minimum scale factors. */ rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L100: */ } if (rcmin == 0.) { /* Find the first zero scale factor and return an error code. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (c__[j] == 0.) { *info = *m + j; return 0; } /* L110: */ } } else { /* Invert the scale factors. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ /* Computing MAX */ d__2 = c__[j]; d__1 = max(d__2,smlnum); c__[j] = 1. / min(d__1,bignum); /* L120: */ } /* Compute COLCND = min(C(J)) / max(C(J)). */ *colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } return 0; /* End of DGEEQUB */ } /* _starpu_dgeequb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgees.c000066400000000000000000000422431413463044200204420ustar00rootroot00000000000000/* dgees.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgees_(char *jobvs, char *sort, L_fp select, integer *n, doublereal *a, integer *lda, integer *sdim, doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, doublereal *work, integer *lwork, logical *bwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, vs_dim1, vs_offset, i__1, i__2, i__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal s; integer i1, i2, ip, ihi, ilo; doublereal dum[1], eps, sep; integer ibal; doublereal anrm; integer idum[1], ierr, itau, iwrk, inxt, icond, ieval; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical cursl; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dgebak_( char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dgebal_(char *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); logical lst2sl, scalea; extern doublereal _starpu_dlamch_(char *); doublereal cscale; extern doublereal _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dorghr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dhseqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dtrsen_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *); logical lastsl; integer minwrk, maxwrk; doublereal smlnum; integer hswork; logical wantst, lquery, wantvs; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* .. Function Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEES computes for an N-by-N real nonsymmetric matrix A, the */ /* eigenvalues, the real Schur form T, and, optionally, the matrix of */ /* Schur vectors Z. This gives the Schur factorization A = Z*T*(Z**T). */ /* Optionally, it also orders the eigenvalues on the diagonal of the */ /* real Schur form so that selected eigenvalues are at the top left. */ /* The leading columns of Z then form an orthonormal basis for the */ /* invariant subspace corresponding to the selected eigenvalues. */ /* A matrix is in real Schur form if it is upper quasi-triangular with */ /* 1-by-1 and 2-by-2 blocks. 2-by-2 blocks will be standardized in the */ /* form */ /* [ a b ] */ /* [ c a ] */ /* where b*c < 0. The eigenvalues of such a block are a +- sqrt(bc). */ /* Arguments */ /* ========= */ /* JOBVS (input) CHARACTER*1 */ /* = 'N': Schur vectors are not computed; */ /* = 'V': Schur vectors are computed. */ /* SORT (input) CHARACTER*1 */ /* Specifies whether or not to order the eigenvalues on the */ /* diagonal of the Schur form. */ /* = 'N': Eigenvalues are not ordered; */ /* = 'S': Eigenvalues are ordered (see SELECT). */ /* SELECT (external procedure) LOGICAL FUNCTION of two DOUBLE PRECISION arguments */ /* SELECT must be declared EXTERNAL in the calling subroutine. */ /* If SORT = 'S', SELECT is used to select eigenvalues to sort */ /* to the top left of the Schur form. */ /* If SORT = 'N', SELECT is not referenced. */ /* An eigenvalue WR(j)+sqrt(-1)*WI(j) is selected if */ /* SELECT(WR(j),WI(j)) is true; i.e., if either one of a complex */ /* conjugate pair of eigenvalues is selected, then both complex */ /* eigenvalues are selected. */ /* Note that a selected complex eigenvalue may no longer */ /* satisfy SELECT(WR(j),WI(j)) = .TRUE. after ordering, since */ /* ordering may change the value of complex eigenvalues */ /* (especially if the eigenvalue is ill-conditioned); in this */ /* case INFO is set to N+2 (see INFO below). */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* On exit, A has been overwritten by its real Schur form T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* SDIM (output) INTEGER */ /* If SORT = 'N', SDIM = 0. */ /* If SORT = 'S', SDIM = number of eigenvalues (after sorting) */ /* for which SELECT is true. (Complex conjugate */ /* pairs for which SELECT is true for either */ /* eigenvalue count as 2.) */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* WR and WI contain the real and imaginary parts, */ /* respectively, of the computed eigenvalues in the same order */ /* that they appear on the diagonal of the output Schur form T. */ /* Complex conjugate pairs of eigenvalues will appear */ /* consecutively with the eigenvalue having the positive */ /* imaginary part first. */ /* VS (output) DOUBLE PRECISION array, dimension (LDVS,N) */ /* If JOBVS = 'V', VS contains the orthogonal matrix Z of Schur */ /* vectors. */ /* If JOBVS = 'N', VS is not referenced. */ /* LDVS (input) INTEGER */ /* The leading dimension of the array VS. LDVS >= 1; if */ /* JOBVS = 'V', LDVS >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) contains the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,3*N). */ /* For good performance, LWORK must generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* BWORK (workspace) LOGICAL array, dimension (N) */ /* Not referenced if SORT = 'N'. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, and i is */ /* <= N: the QR algorithm failed to compute all the */ /* eigenvalues; elements 1:ILO-1 and i+1:N of WR and WI */ /* contain those eigenvalues which have converged; if */ /* JOBVS = 'V', VS contains the matrix which reduces A */ /* to its partially converged Schur form. */ /* = N+1: the eigenvalues could not be reordered because some */ /* eigenvalues were too close to separate (the problem */ /* is very ill-conditioned); */ /* = N+2: after reordering, roundoff changed values of some */ /* complex eigenvalues so that leading eigenvalues in */ /* the Schur form no longer satisfy SELECT=.TRUE. This */ /* could also be caused by underflow due to scaling. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --wr; --wi; vs_dim1 = *ldvs; vs_offset = 1 + vs_dim1; vs -= vs_offset; --work; --bwork; /* Function Body */ *info = 0; lquery = *lwork == -1; wantvs = _starpu_lsame_(jobvs, "V"); wantst = _starpu_lsame_(sort, "S"); if (! wantvs && ! _starpu_lsame_(jobvs, "N")) { *info = -1; } else if (! wantst && ! _starpu_lsame_(sort, "N")) { *info = -2; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldvs < 1 || wantvs && *ldvs < *n) { *info = -11; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV. */ /* HSWORK refers to the workspace preferred by DHSEQR, as */ /* calculated below. HSWORK is computed assuming ILO=1 and IHI=N, */ /* the worst case.) */ if (*info == 0) { if (*n == 0) { minwrk = 1; maxwrk = 1; } else { maxwrk = (*n << 1) + *n * _starpu_ilaenv_(&c__1, "DGEHRD", " ", n, &c__1, n, &c__0); minwrk = *n * 3; _starpu_dhseqr_("S", jobvs, n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1] , &vs[vs_offset], ldvs, &work[1], &c_n1, &ieval); hswork = (integer) work[1]; if (! wantvs) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n + hswork; maxwrk = max(i__1,i__2); } else { /* Computing MAX */ i__1 = maxwrk, i__2 = (*n << 1) + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGHR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n + hswork; maxwrk = max(i__1,i__2); } } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -13; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEES ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { *sdim = 0; return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = sqrt(smlnum) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, dum); scalea = FALSE_; if (anrm > 0. && anrm < smlnum) { scalea = TRUE_; cscale = smlnum; } else if (anrm > bignum) { scalea = TRUE_; cscale = bignum; } if (scalea) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &cscale, n, n, &a[a_offset], lda, & ierr); } /* Permute the matrix to make it more nearly triangular */ /* (Workspace: need N) */ ibal = 1; _starpu_dgebal_("P", n, &a[a_offset], lda, &ilo, &ihi, &work[ibal], &ierr); /* Reduce to upper Hessenberg form */ /* (Workspace: need 3*N, prefer 2*N+N*NB) */ itau = *n + ibal; iwrk = *n + itau; i__1 = *lwork - iwrk + 1; _starpu_dgehrd_(n, &ilo, &ihi, &a[a_offset], lda, &work[itau], &work[iwrk], &i__1, &ierr); if (wantvs) { /* Copy Householder vectors to VS */ _starpu_dlacpy_("L", n, n, &a[a_offset], lda, &vs[vs_offset], ldvs) ; /* Generate orthogonal matrix in VS */ /* (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB) */ i__1 = *lwork - iwrk + 1; _starpu_dorghr_(n, &ilo, &ihi, &vs[vs_offset], ldvs, &work[itau], &work[iwrk], &i__1, &ierr); } *sdim = 0; /* Perform QR iteration, accumulating Schur vectors in VS if desired */ /* (Workspace: need N+1, prefer N+HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("S", jobvs, n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], &vs[ vs_offset], ldvs, &work[iwrk], &i__1, &ieval); if (ieval > 0) { *info = ieval; } /* Sort eigenvalues if desired */ if (wantst && *info == 0) { if (scalea) { _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, n, &c__1, &wr[1], n, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, n, &c__1, &wi[1], n, & ierr); } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { bwork[i__] = (*select)(&wr[i__], &wi[i__]); /* L10: */ } /* Reorder eigenvalues and transform Schur vectors */ /* (Workspace: none needed) */ i__1 = *lwork - iwrk + 1; _starpu_dtrsen_("N", jobvs, &bwork[1], n, &a[a_offset], lda, &vs[vs_offset], ldvs, &wr[1], &wi[1], sdim, &s, &sep, &work[iwrk], &i__1, idum, &c__1, &icond); if (icond > 0) { *info = *n + icond; } } if (wantvs) { /* Undo balancing */ /* (Workspace: need N) */ _starpu_dgebak_("P", "R", n, &ilo, &ihi, &work[ibal], n, &vs[vs_offset], ldvs, &ierr); } if (scalea) { /* Undo scaling for the Schur form of A */ _starpu_dlascl_("H", &c__0, &c__0, &cscale, &anrm, n, n, &a[a_offset], lda, & ierr); i__1 = *lda + 1; _starpu_dcopy_(n, &a[a_offset], &i__1, &wr[1], &c__1); if (cscale == smlnum) { /* If scaling back towards underflow, adjust WI if an */ /* offdiagonal element of a 2-by-2 block in the Schur form */ /* underflows. */ if (ieval > 0) { i1 = ieval + 1; i2 = ihi - 1; i__1 = ilo - 1; /* Computing MAX */ i__3 = ilo - 1; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[ 1], &i__2, &ierr); } else if (wantst) { i1 = 1; i2 = *n - 1; } else { i1 = ilo; i2 = ihi - 1; } inxt = i1 - 1; i__1 = i2; for (i__ = i1; i__ <= i__1; ++i__) { if (i__ < inxt) { goto L20; } if (wi[i__] == 0.) { inxt = i__ + 1; } else { if (a[i__ + 1 + i__ * a_dim1] == 0.) { wi[i__] = 0.; wi[i__ + 1] = 0.; } else if (a[i__ + 1 + i__ * a_dim1] != 0. && a[i__ + ( i__ + 1) * a_dim1] == 0.) { wi[i__] = 0.; wi[i__ + 1] = 0.; if (i__ > 1) { i__2 = i__ - 1; _starpu_dswap_(&i__2, &a[i__ * a_dim1 + 1], &c__1, &a[( i__ + 1) * a_dim1 + 1], &c__1); } if (*n > i__ + 1) { i__2 = *n - i__ - 1; _starpu_dswap_(&i__2, &a[i__ + (i__ + 2) * a_dim1], lda, & a[i__ + 1 + (i__ + 2) * a_dim1], lda); } if (wantvs) { _starpu_dswap_(n, &vs[i__ * vs_dim1 + 1], &c__1, &vs[(i__ + 1) * vs_dim1 + 1], &c__1); } a[i__ + (i__ + 1) * a_dim1] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 0.; } inxt = i__ + 2; } L20: ; } } /* Undo scaling for the imaginary part of the eigenvalues */ i__1 = *n - ieval; /* Computing MAX */ i__3 = *n - ieval; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[ieval + 1], &i__2, &ierr); } if (wantst && *info == 0) { /* Check if reordering successful */ lastsl = TRUE_; lst2sl = TRUE_; *sdim = 0; ip = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { cursl = (*select)(&wr[i__], &wi[i__]); if (wi[i__] == 0.) { if (cursl) { ++(*sdim); } ip = 0; if (cursl && ! lastsl) { *info = *n + 2; } } else { if (ip == 1) { /* Last eigenvalue of conjugate pair */ cursl = cursl || lastsl; lastsl = cursl; if (cursl) { *sdim += 2; } ip = -1; if (cursl && ! lst2sl) { *info = *n + 2; } } else { /* First eigenvalue of conjugate pair */ ip = 1; } } lst2sl = lastsl; lastsl = cursl; /* L30: */ } } work[1] = (doublereal) maxwrk; return 0; /* End of DGEES */ } /* _starpu_dgees_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeesx.c000066400000000000000000000526211413463044200206330ustar00rootroot00000000000000/* dgeesx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgeesx_(char *jobvs, char *sort, L_fp select, char * sense, integer *n, doublereal *a, integer *lda, integer *sdim, doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, doublereal *rconde, doublereal *rcondv, doublereal *work, integer * lwork, integer *iwork, integer *liwork, logical *bwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, vs_dim1, vs_offset, i__1, i__2, i__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, i1, i2, ip, ihi, ilo; doublereal dum[1], eps; integer ibal; doublereal anrm; integer ierr, itau, iwrk, lwrk, inxt, icond, ieval; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical cursl; integer liwrk; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dgebak_( char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dgebal_(char *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); logical lst2sl, scalea; extern doublereal _starpu_dlamch_(char *); doublereal cscale; extern doublereal _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dorghr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dhseqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical wantsb; extern /* Subroutine */ int _starpu_dtrsen_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *); logical wantse, lastsl; integer minwrk, maxwrk; logical wantsn; doublereal smlnum; integer hswork; logical wantst, lquery, wantsv, wantvs; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* .. Function Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEESX computes for an N-by-N real nonsymmetric matrix A, the */ /* eigenvalues, the real Schur form T, and, optionally, the matrix of */ /* Schur vectors Z. This gives the Schur factorization A = Z*T*(Z**T). */ /* Optionally, it also orders the eigenvalues on the diagonal of the */ /* real Schur form so that selected eigenvalues are at the top left; */ /* computes a reciprocal condition number for the average of the */ /* selected eigenvalues (RCONDE); and computes a reciprocal condition */ /* number for the right invariant subspace corresponding to the */ /* selected eigenvalues (RCONDV). The leading columns of Z form an */ /* orthonormal basis for this invariant subspace. */ /* For further explanation of the reciprocal condition numbers RCONDE */ /* and RCONDV, see Section 4.10 of the LAPACK Users' Guide (where */ /* these quantities are called s and sep respectively). */ /* A real matrix is in real Schur form if it is upper quasi-triangular */ /* with 1-by-1 and 2-by-2 blocks. 2-by-2 blocks will be standardized in */ /* the form */ /* [ a b ] */ /* [ c a ] */ /* where b*c < 0. The eigenvalues of such a block are a +- sqrt(bc). */ /* Arguments */ /* ========= */ /* JOBVS (input) CHARACTER*1 */ /* = 'N': Schur vectors are not computed; */ /* = 'V': Schur vectors are computed. */ /* SORT (input) CHARACTER*1 */ /* Specifies whether or not to order the eigenvalues on the */ /* diagonal of the Schur form. */ /* = 'N': Eigenvalues are not ordered; */ /* = 'S': Eigenvalues are ordered (see SELECT). */ /* SELECT (external procedure) LOGICAL FUNCTION of two DOUBLE PRECISION arguments */ /* SELECT must be declared EXTERNAL in the calling subroutine. */ /* If SORT = 'S', SELECT is used to select eigenvalues to sort */ /* to the top left of the Schur form. */ /* If SORT = 'N', SELECT is not referenced. */ /* An eigenvalue WR(j)+sqrt(-1)*WI(j) is selected if */ /* SELECT(WR(j),WI(j)) is true; i.e., if either one of a */ /* complex conjugate pair of eigenvalues is selected, then both */ /* are. Note that a selected complex eigenvalue may no longer */ /* satisfy SELECT(WR(j),WI(j)) = .TRUE. after ordering, since */ /* ordering may change the value of complex eigenvalues */ /* (especially if the eigenvalue is ill-conditioned); in this */ /* case INFO may be set to N+3 (see INFO below). */ /* SENSE (input) CHARACTER*1 */ /* Determines which reciprocal condition numbers are computed. */ /* = 'N': None are computed; */ /* = 'E': Computed for average of selected eigenvalues only; */ /* = 'V': Computed for selected right invariant subspace only; */ /* = 'B': Computed for both. */ /* If SENSE = 'E', 'V' or 'B', SORT must equal 'S'. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the N-by-N matrix A. */ /* On exit, A is overwritten by its real Schur form T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* SDIM (output) INTEGER */ /* If SORT = 'N', SDIM = 0. */ /* If SORT = 'S', SDIM = number of eigenvalues (after sorting) */ /* for which SELECT is true. (Complex conjugate */ /* pairs for which SELECT is true for either */ /* eigenvalue count as 2.) */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* WR and WI contain the real and imaginary parts, respectively, */ /* of the computed eigenvalues, in the same order that they */ /* appear on the diagonal of the output Schur form T. Complex */ /* conjugate pairs of eigenvalues appear consecutively with the */ /* eigenvalue having the positive imaginary part first. */ /* VS (output) DOUBLE PRECISION array, dimension (LDVS,N) */ /* If JOBVS = 'V', VS contains the orthogonal matrix Z of Schur */ /* vectors. */ /* If JOBVS = 'N', VS is not referenced. */ /* LDVS (input) INTEGER */ /* The leading dimension of the array VS. LDVS >= 1, and if */ /* JOBVS = 'V', LDVS >= N. */ /* RCONDE (output) DOUBLE PRECISION */ /* If SENSE = 'E' or 'B', RCONDE contains the reciprocal */ /* condition number for the average of the selected eigenvalues. */ /* Not referenced if SENSE = 'N' or 'V'. */ /* RCONDV (output) DOUBLE PRECISION */ /* If SENSE = 'V' or 'B', RCONDV contains the reciprocal */ /* condition number for the selected right invariant subspace. */ /* Not referenced if SENSE = 'N' or 'E'. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,3*N). */ /* Also, if SENSE = 'E' or 'V' or 'B', */ /* LWORK >= N+2*SDIM*(N-SDIM), where SDIM is the number of */ /* selected eigenvalues computed by this routine. Note that */ /* N+2*SDIM*(N-SDIM) <= N+N*N/2. Note also that an error is only */ /* returned if LWORK < max(1,3*N), but if SENSE = 'E' or 'V' or */ /* 'B' this may not be large enough. */ /* For good performance, LWORK must generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates upper bounds on the optimal sizes of the */ /* arrays WORK and IWORK, returns these values as the first */ /* entries of the WORK and IWORK arrays, and no error messages */ /* related to LWORK or LIWORK are issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* LIWORK >= 1; if SENSE = 'V' or 'B', LIWORK >= SDIM*(N-SDIM). */ /* Note that SDIM*(N-SDIM) <= N*N/4. Note also that an error is */ /* only returned if LIWORK < 1, but if SENSE = 'V' or 'B' this */ /* may not be large enough. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates upper bounds on the optimal sizes of */ /* the arrays WORK and IWORK, returns these values as the first */ /* entries of the WORK and IWORK arrays, and no error messages */ /* related to LWORK or LIWORK are issued by XERBLA. */ /* BWORK (workspace) LOGICAL array, dimension (N) */ /* Not referenced if SORT = 'N'. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, and i is */ /* <= N: the QR algorithm failed to compute all the */ /* eigenvalues; elements 1:ILO-1 and i+1:N of WR and WI */ /* contain those eigenvalues which have converged; if */ /* JOBVS = 'V', VS contains the transformation which */ /* reduces A to its partially converged Schur form. */ /* = N+1: the eigenvalues could not be reordered because some */ /* eigenvalues were too close to separate (the problem */ /* is very ill-conditioned); */ /* = N+2: after reordering, roundoff changed values of some */ /* complex eigenvalues so that leading eigenvalues in */ /* the Schur form no longer satisfy SELECT=.TRUE. This */ /* could also be caused by underflow due to scaling. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --wr; --wi; vs_dim1 = *ldvs; vs_offset = 1 + vs_dim1; vs -= vs_offset; --work; --iwork; --bwork; /* Function Body */ *info = 0; wantvs = _starpu_lsame_(jobvs, "V"); wantst = _starpu_lsame_(sort, "S"); wantsn = _starpu_lsame_(sense, "N"); wantse = _starpu_lsame_(sense, "E"); wantsv = _starpu_lsame_(sense, "V"); wantsb = _starpu_lsame_(sense, "B"); lquery = *lwork == -1 || *liwork == -1; if (! wantvs && ! _starpu_lsame_(jobvs, "N")) { *info = -1; } else if (! wantst && ! _starpu_lsame_(sort, "N")) { *info = -2; } else if (! (wantsn || wantse || wantsv || wantsb) || ! wantst && ! wantsn) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldvs < 1 || wantvs && *ldvs < *n) { *info = -12; } /* Compute workspace */ /* (Note: Comments in the code beginning "RWorkspace:" describe the */ /* minimal amount of real workspace needed at that point in the */ /* code, as well as the preferred amount for good performance. */ /* IWorkspace refers to integer workspace. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV. */ /* HSWORK refers to the workspace preferred by DHSEQR, as */ /* calculated below. HSWORK is computed assuming ILO=1 and IHI=N, */ /* the worst case. */ /* If SENSE = 'E', 'V' or 'B', then the amount of workspace needed */ /* depends on SDIM, which is computed by the routine DTRSEN later */ /* in the code.) */ if (*info == 0) { liwrk = 1; if (*n == 0) { minwrk = 1; lwrk = 1; } else { maxwrk = (*n << 1) + *n * _starpu_ilaenv_(&c__1, "DGEHRD", " ", n, &c__1, n, &c__0); minwrk = *n * 3; _starpu_dhseqr_("S", jobvs, n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1] , &vs[vs_offset], ldvs, &work[1], &c_n1, &ieval); hswork = (integer) work[1]; if (! wantvs) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n + hswork; maxwrk = max(i__1,i__2); } else { /* Computing MAX */ i__1 = maxwrk, i__2 = (*n << 1) + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGHR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n + hswork; maxwrk = max(i__1,i__2); } lwrk = maxwrk; if (! wantsn) { /* Computing MAX */ i__1 = lwrk, i__2 = *n + *n * *n / 2; lwrk = max(i__1,i__2); } if (wantsv || wantsb) { liwrk = *n * *n / 4; } } iwork[1] = liwrk; work[1] = (doublereal) lwrk; if (*lwork < minwrk && ! lquery) { *info = -16; } else if (*liwork < 1 && ! lquery) { *info = -18; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEESX", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *sdim = 0; return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = sqrt(smlnum) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, dum); scalea = FALSE_; if (anrm > 0. && anrm < smlnum) { scalea = TRUE_; cscale = smlnum; } else if (anrm > bignum) { scalea = TRUE_; cscale = bignum; } if (scalea) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &cscale, n, n, &a[a_offset], lda, & ierr); } /* Permute the matrix to make it more nearly triangular */ /* (RWorkspace: need N) */ ibal = 1; _starpu_dgebal_("P", n, &a[a_offset], lda, &ilo, &ihi, &work[ibal], &ierr); /* Reduce to upper Hessenberg form */ /* (RWorkspace: need 3*N, prefer 2*N+N*NB) */ itau = *n + ibal; iwrk = *n + itau; i__1 = *lwork - iwrk + 1; _starpu_dgehrd_(n, &ilo, &ihi, &a[a_offset], lda, &work[itau], &work[iwrk], &i__1, &ierr); if (wantvs) { /* Copy Householder vectors to VS */ _starpu_dlacpy_("L", n, n, &a[a_offset], lda, &vs[vs_offset], ldvs) ; /* Generate orthogonal matrix in VS */ /* (RWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */ i__1 = *lwork - iwrk + 1; _starpu_dorghr_(n, &ilo, &ihi, &vs[vs_offset], ldvs, &work[itau], &work[iwrk], &i__1, &ierr); } *sdim = 0; /* Perform QR iteration, accumulating Schur vectors in VS if desired */ /* (RWorkspace: need N+1, prefer N+HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("S", jobvs, n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], &vs[ vs_offset], ldvs, &work[iwrk], &i__1, &ieval); if (ieval > 0) { *info = ieval; } /* Sort eigenvalues if desired */ if (wantst && *info == 0) { if (scalea) { _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, n, &c__1, &wr[1], n, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, n, &c__1, &wi[1], n, & ierr); } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { bwork[i__] = (*select)(&wr[i__], &wi[i__]); /* L10: */ } /* Reorder eigenvalues, transform Schur vectors, and compute */ /* reciprocal condition numbers */ /* (RWorkspace: if SENSE is not 'N', need N+2*SDIM*(N-SDIM) */ /* otherwise, need N ) */ /* (IWorkspace: if SENSE is 'V' or 'B', need SDIM*(N-SDIM) */ /* otherwise, need 0 ) */ i__1 = *lwork - iwrk + 1; _starpu_dtrsen_(sense, jobvs, &bwork[1], n, &a[a_offset], lda, &vs[vs_offset], ldvs, &wr[1], &wi[1], sdim, rconde, rcondv, &work[iwrk], & i__1, &iwork[1], liwork, &icond); if (! wantsn) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n + (*sdim << 1) * (*n - *sdim); maxwrk = max(i__1,i__2); } if (icond == -15) { /* Not enough real workspace */ *info = -16; } else if (icond == -17) { /* Not enough integer workspace */ *info = -18; } else if (icond > 0) { /* DTRSEN failed to reorder or to restore standard Schur form */ *info = icond + *n; } } if (wantvs) { /* Undo balancing */ /* (RWorkspace: need N) */ _starpu_dgebak_("P", "R", n, &ilo, &ihi, &work[ibal], n, &vs[vs_offset], ldvs, &ierr); } if (scalea) { /* Undo scaling for the Schur form of A */ _starpu_dlascl_("H", &c__0, &c__0, &cscale, &anrm, n, n, &a[a_offset], lda, & ierr); i__1 = *lda + 1; _starpu_dcopy_(n, &a[a_offset], &i__1, &wr[1], &c__1); if ((wantsv || wantsb) && *info == 0) { dum[0] = *rcondv; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &c__1, &c__1, dum, & c__1, &ierr); *rcondv = dum[0]; } if (cscale == smlnum) { /* If scaling back towards underflow, adjust WI if an */ /* offdiagonal element of a 2-by-2 block in the Schur form */ /* underflows. */ if (ieval > 0) { i1 = ieval + 1; i2 = ihi - 1; i__1 = ilo - 1; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[ 1], n, &ierr); } else if (wantst) { i1 = 1; i2 = *n - 1; } else { i1 = ilo; i2 = ihi - 1; } inxt = i1 - 1; i__1 = i2; for (i__ = i1; i__ <= i__1; ++i__) { if (i__ < inxt) { goto L20; } if (wi[i__] == 0.) { inxt = i__ + 1; } else { if (a[i__ + 1 + i__ * a_dim1] == 0.) { wi[i__] = 0.; wi[i__ + 1] = 0.; } else if (a[i__ + 1 + i__ * a_dim1] != 0. && a[i__ + ( i__ + 1) * a_dim1] == 0.) { wi[i__] = 0.; wi[i__ + 1] = 0.; if (i__ > 1) { i__2 = i__ - 1; _starpu_dswap_(&i__2, &a[i__ * a_dim1 + 1], &c__1, &a[( i__ + 1) * a_dim1 + 1], &c__1); } if (*n > i__ + 1) { i__2 = *n - i__ - 1; _starpu_dswap_(&i__2, &a[i__ + (i__ + 2) * a_dim1], lda, & a[i__ + 1 + (i__ + 2) * a_dim1], lda); } _starpu_dswap_(n, &vs[i__ * vs_dim1 + 1], &c__1, &vs[(i__ + 1) * vs_dim1 + 1], &c__1); a[i__ + (i__ + 1) * a_dim1] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 0.; } inxt = i__ + 2; } L20: ; } } i__1 = *n - ieval; /* Computing MAX */ i__3 = *n - ieval; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[ieval + 1], &i__2, &ierr); } if (wantst && *info == 0) { /* Check if reordering successful */ lastsl = TRUE_; lst2sl = TRUE_; *sdim = 0; ip = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { cursl = (*select)(&wr[i__], &wi[i__]); if (wi[i__] == 0.) { if (cursl) { ++(*sdim); } ip = 0; if (cursl && ! lastsl) { *info = *n + 2; } } else { if (ip == 1) { /* Last eigenvalue of conjugate pair */ cursl = cursl || lastsl; lastsl = cursl; if (cursl) { *sdim += 2; } ip = -1; if (cursl && ! lst2sl) { *info = *n + 2; } } else { /* First eigenvalue of conjugate pair */ ip = 1; } } lst2sl = lastsl; lastsl = cursl; /* L30: */ } } work[1] = (doublereal) maxwrk; if (wantsv || wantsb) { /* Computing MAX */ i__1 = 1, i__2 = *sdim * (*n - *sdim); iwork[1] = max(i__1,i__2); } else { iwork[1] = 1; } return 0; /* End of DGEESX */ } /* _starpu_dgeesx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeev.c000066400000000000000000000447151413463044200204530ustar00rootroot00000000000000/* dgeev.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgeev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, k; doublereal r__, cs, sn; integer ihi; doublereal scl; integer ilo; doublereal dum[1], eps; integer ibal; char side[1]; doublereal anrm; integer ierr, itau; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer iwrk, nout; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern doublereal _starpu_dlapy2_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dgebak_( char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dgebal_(char *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); logical scalea; extern doublereal _starpu_dlamch_(char *); doublereal cscale; extern doublereal _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *); logical select[1]; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dorghr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dhseqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dtrevc_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); integer minwrk, maxwrk; logical wantvl; doublereal smlnum; integer hswork; logical lquery, wantvr; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEEV computes for an N-by-N real nonsymmetric matrix A, the */ /* eigenvalues and, optionally, the left and/or right eigenvectors. */ /* The right eigenvector v(j) of A satisfies */ /* A * v(j) = lambda(j) * v(j) */ /* where lambda(j) is its eigenvalue. */ /* The left eigenvector u(j) of A satisfies */ /* u(j)**H * A = lambda(j) * u(j)**H */ /* where u(j)**H denotes the conjugate transpose of u(j). */ /* The computed eigenvectors are normalized to have Euclidean norm */ /* equal to 1 and largest component real. */ /* Arguments */ /* ========= */ /* JOBVL (input) CHARACTER*1 */ /* = 'N': left eigenvectors of A are not computed; */ /* = 'V': left eigenvectors of A are computed. */ /* JOBVR (input) CHARACTER*1 */ /* = 'N': right eigenvectors of A are not computed; */ /* = 'V': right eigenvectors of A are computed. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* On exit, A has been overwritten. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* WR and WI contain the real and imaginary parts, */ /* respectively, of the computed eigenvalues. Complex */ /* conjugate pairs of eigenvalues appear consecutively */ /* with the eigenvalue having the positive imaginary part */ /* first. */ /* VL (output) DOUBLE PRECISION array, dimension (LDVL,N) */ /* If JOBVL = 'V', the left eigenvectors u(j) are stored one */ /* after another in the columns of VL, in the same order */ /* as their eigenvalues. */ /* If JOBVL = 'N', VL is not referenced. */ /* If the j-th eigenvalue is real, then u(j) = VL(:,j), */ /* the j-th column of VL. */ /* If the j-th and (j+1)-st eigenvalues form a complex */ /* conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and */ /* u(j+1) = VL(:,j) - i*VL(:,j+1). */ /* LDVL (input) INTEGER */ /* The leading dimension of the array VL. LDVL >= 1; if */ /* JOBVL = 'V', LDVL >= N. */ /* VR (output) DOUBLE PRECISION array, dimension (LDVR,N) */ /* If JOBVR = 'V', the right eigenvectors v(j) are stored one */ /* after another in the columns of VR, in the same order */ /* as their eigenvalues. */ /* If JOBVR = 'N', VR is not referenced. */ /* If the j-th eigenvalue is real, then v(j) = VR(:,j), */ /* the j-th column of VR. */ /* If the j-th and (j+1)-st eigenvalues form a complex */ /* conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and */ /* v(j+1) = VR(:,j) - i*VR(:,j+1). */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. LDVR >= 1; if */ /* JOBVR = 'V', LDVR >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,3*N), and */ /* if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N. For good */ /* performance, LWORK must generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, the QR algorithm failed to compute all the */ /* eigenvalues, and no eigenvectors have been computed; */ /* elements i+1:N of WR and WI contain eigenvalues which */ /* have converged. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --wr; --wi; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; wantvl = _starpu_lsame_(jobvl, "V"); wantvr = _starpu_lsame_(jobvr, "V"); if (! wantvl && ! _starpu_lsame_(jobvl, "N")) { *info = -1; } else if (! wantvr && ! _starpu_lsame_(jobvr, "N")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldvl < 1 || wantvl && *ldvl < *n) { *info = -9; } else if (*ldvr < 1 || wantvr && *ldvr < *n) { *info = -11; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV. */ /* HSWORK refers to the workspace preferred by DHSEQR, as */ /* calculated below. HSWORK is computed assuming ILO=1 and IHI=N, */ /* the worst case.) */ if (*info == 0) { if (*n == 0) { minwrk = 1; maxwrk = 1; } else { maxwrk = (*n << 1) + *n * _starpu_ilaenv_(&c__1, "DGEHRD", " ", n, &c__1, n, &c__0); if (wantvl) { minwrk = *n << 2; /* Computing MAX */ i__1 = maxwrk, i__2 = (*n << 1) + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGHR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); _starpu_dhseqr_("S", "V", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[ 1], &vl[vl_offset], ldvl, &work[1], &c_n1, info); hswork = (integer) work[1]; /* Computing MAX */ i__1 = maxwrk, i__2 = *n + 1, i__1 = max(i__1,i__2), i__2 = * n + hswork; maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n << 2; maxwrk = max(i__1,i__2); } else if (wantvr) { minwrk = *n << 2; /* Computing MAX */ i__1 = maxwrk, i__2 = (*n << 1) + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGHR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); _starpu_dhseqr_("S", "V", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[ 1], &vr[vr_offset], ldvr, &work[1], &c_n1, info); hswork = (integer) work[1]; /* Computing MAX */ i__1 = maxwrk, i__2 = *n + 1, i__1 = max(i__1,i__2), i__2 = * n + hswork; maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n << 2; maxwrk = max(i__1,i__2); } else { minwrk = *n * 3; _starpu_dhseqr_("E", "N", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[ 1], &vr[vr_offset], ldvr, &work[1], &c_n1, info); hswork = (integer) work[1]; /* Computing MAX */ i__1 = maxwrk, i__2 = *n + 1, i__1 = max(i__1,i__2), i__2 = * n + hswork; maxwrk = max(i__1,i__2); } maxwrk = max(maxwrk,minwrk); } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -13; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEEV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = sqrt(smlnum) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, dum); scalea = FALSE_; if (anrm > 0. && anrm < smlnum) { scalea = TRUE_; cscale = smlnum; } else if (anrm > bignum) { scalea = TRUE_; cscale = bignum; } if (scalea) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &cscale, n, n, &a[a_offset], lda, & ierr); } /* Balance the matrix */ /* (Workspace: need N) */ ibal = 1; _starpu_dgebal_("B", n, &a[a_offset], lda, &ilo, &ihi, &work[ibal], &ierr); /* Reduce to upper Hessenberg form */ /* (Workspace: need 3*N, prefer 2*N+N*NB) */ itau = ibal + *n; iwrk = itau + *n; i__1 = *lwork - iwrk + 1; _starpu_dgehrd_(n, &ilo, &ihi, &a[a_offset], lda, &work[itau], &work[iwrk], &i__1, &ierr); if (wantvl) { /* Want left eigenvectors */ /* Copy Householder vectors to VL */ *(unsigned char *)side = 'L'; _starpu_dlacpy_("L", n, n, &a[a_offset], lda, &vl[vl_offset], ldvl) ; /* Generate orthogonal matrix in VL */ /* (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB) */ i__1 = *lwork - iwrk + 1; _starpu_dorghr_(n, &ilo, &ihi, &vl[vl_offset], ldvl, &work[itau], &work[iwrk], &i__1, &ierr); /* Perform QR iteration, accumulating Schur vectors in VL */ /* (Workspace: need N+1, prefer N+HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("S", "V", n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], & vl[vl_offset], ldvl, &work[iwrk], &i__1, info); if (wantvr) { /* Want left and right eigenvectors */ /* Copy Schur vectors to VR */ *(unsigned char *)side = 'B'; _starpu_dlacpy_("F", n, n, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr); } } else if (wantvr) { /* Want right eigenvectors */ /* Copy Householder vectors to VR */ *(unsigned char *)side = 'R'; _starpu_dlacpy_("L", n, n, &a[a_offset], lda, &vr[vr_offset], ldvr) ; /* Generate orthogonal matrix in VR */ /* (Workspace: need 3*N-1, prefer 2*N+(N-1)*NB) */ i__1 = *lwork - iwrk + 1; _starpu_dorghr_(n, &ilo, &ihi, &vr[vr_offset], ldvr, &work[itau], &work[iwrk], &i__1, &ierr); /* Perform QR iteration, accumulating Schur vectors in VR */ /* (Workspace: need N+1, prefer N+HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("S", "V", n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], & vr[vr_offset], ldvr, &work[iwrk], &i__1, info); } else { /* Compute eigenvalues only */ /* (Workspace: need N+1, prefer N+HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("E", "N", n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], & vr[vr_offset], ldvr, &work[iwrk], &i__1, info); } /* If INFO > 0 from DHSEQR, then quit */ if (*info > 0) { goto L50; } if (wantvl || wantvr) { /* Compute left and/or right eigenvectors */ /* (Workspace: need 4*N) */ _starpu_dtrevc_(side, "B", select, n, &a[a_offset], lda, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, n, &nout, &work[iwrk], &ierr); } if (wantvl) { /* Undo balancing of left eigenvectors */ /* (Workspace: need N) */ _starpu_dgebak_("B", "L", n, &ilo, &ihi, &work[ibal], n, &vl[vl_offset], ldvl, &ierr); /* Normalize left eigenvectors and make largest component real */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (wi[i__] == 0.) { scl = 1. / _starpu_dnrm2_(n, &vl[i__ * vl_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vl[i__ * vl_dim1 + 1], &c__1); } else if (wi[i__] > 0.) { d__1 = _starpu_dnrm2_(n, &vl[i__ * vl_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vl[(i__ + 1) * vl_dim1 + 1], &c__1); scl = 1. / _starpu_dlapy2_(&d__1, &d__2); _starpu_dscal_(n, &scl, &vl[i__ * vl_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vl[(i__ + 1) * vl_dim1 + 1], &c__1); i__2 = *n; for (k = 1; k <= i__2; ++k) { /* Computing 2nd power */ d__1 = vl[k + i__ * vl_dim1]; /* Computing 2nd power */ d__2 = vl[k + (i__ + 1) * vl_dim1]; work[iwrk + k - 1] = d__1 * d__1 + d__2 * d__2; /* L10: */ } k = _starpu_idamax_(n, &work[iwrk], &c__1); _starpu_dlartg_(&vl[k + i__ * vl_dim1], &vl[k + (i__ + 1) * vl_dim1], &cs, &sn, &r__); _starpu_drot_(n, &vl[i__ * vl_dim1 + 1], &c__1, &vl[(i__ + 1) * vl_dim1 + 1], &c__1, &cs, &sn); vl[k + (i__ + 1) * vl_dim1] = 0.; } /* L20: */ } } if (wantvr) { /* Undo balancing of right eigenvectors */ /* (Workspace: need N) */ _starpu_dgebak_("B", "R", n, &ilo, &ihi, &work[ibal], n, &vr[vr_offset], ldvr, &ierr); /* Normalize right eigenvectors and make largest component real */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (wi[i__] == 0.) { scl = 1. / _starpu_dnrm2_(n, &vr[i__ * vr_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vr[i__ * vr_dim1 + 1], &c__1); } else if (wi[i__] > 0.) { d__1 = _starpu_dnrm2_(n, &vr[i__ * vr_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vr[(i__ + 1) * vr_dim1 + 1], &c__1); scl = 1. / _starpu_dlapy2_(&d__1, &d__2); _starpu_dscal_(n, &scl, &vr[i__ * vr_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vr[(i__ + 1) * vr_dim1 + 1], &c__1); i__2 = *n; for (k = 1; k <= i__2; ++k) { /* Computing 2nd power */ d__1 = vr[k + i__ * vr_dim1]; /* Computing 2nd power */ d__2 = vr[k + (i__ + 1) * vr_dim1]; work[iwrk + k - 1] = d__1 * d__1 + d__2 * d__2; /* L30: */ } k = _starpu_idamax_(n, &work[iwrk], &c__1); _starpu_dlartg_(&vr[k + i__ * vr_dim1], &vr[k + (i__ + 1) * vr_dim1], &cs, &sn, &r__); _starpu_drot_(n, &vr[i__ * vr_dim1 + 1], &c__1, &vr[(i__ + 1) * vr_dim1 + 1], &c__1, &cs, &sn); vr[k + (i__ + 1) * vr_dim1] = 0.; } /* L40: */ } } /* Undo scaling if necessary */ L50: if (scalea) { i__1 = *n - *info; /* Computing MAX */ i__3 = *n - *info; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wr[*info + 1], &i__2, &ierr); i__1 = *n - *info; /* Computing MAX */ i__3 = *n - *info; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[*info + 1], &i__2, &ierr); if (*info > 0) { i__1 = ilo - 1; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wr[1], n, &ierr); i__1 = ilo - 1; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[1], n, &ierr); } } work[1] = (doublereal) maxwrk; return 0; /* End of DGEEV */ } /* _starpu_dgeev_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeevx.c000066400000000000000000000604261413463044200206400ustar00rootroot00000000000000/* dgeevx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgeevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublereal *a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublereal *work, integer *lwork, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, k; doublereal r__, cs, sn; char job[1]; doublereal scl, dum[1], eps; char side[1]; doublereal anrm; integer ierr, itau; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer iwrk, nout; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); integer icond; extern logical _starpu_lsame_(char *, char *); extern doublereal _starpu_dlapy2_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dgebak_( char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dgebal_(char *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); logical scalea; extern doublereal _starpu_dlamch_(char *); doublereal cscale; extern doublereal _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *); logical select[1]; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dorghr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dhseqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dtrevc_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), _starpu_dtrsna_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, integer *); integer minwrk, maxwrk; logical wantvl, wntsnb; integer hswork; logical wntsne; doublereal smlnum; logical lquery, wantvr, wntsnn, wntsnv; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEEVX computes for an N-by-N real nonsymmetric matrix A, the */ /* eigenvalues and, optionally, the left and/or right eigenvectors. */ /* Optionally also, it computes a balancing transformation to improve */ /* the conditioning of the eigenvalues and eigenvectors (ILO, IHI, */ /* SCALE, and ABNRM), reciprocal condition numbers for the eigenvalues */ /* (RCONDE), and reciprocal condition numbers for the right */ /* eigenvectors (RCONDV). */ /* The right eigenvector v(j) of A satisfies */ /* A * v(j) = lambda(j) * v(j) */ /* where lambda(j) is its eigenvalue. */ /* The left eigenvector u(j) of A satisfies */ /* u(j)**H * A = lambda(j) * u(j)**H */ /* where u(j)**H denotes the conjugate transpose of u(j). */ /* The computed eigenvectors are normalized to have Euclidean norm */ /* equal to 1 and largest component real. */ /* Balancing a matrix means permuting the rows and columns to make it */ /* more nearly upper triangular, and applying a diagonal similarity */ /* transformation D * A * D**(-1), where D is a diagonal matrix, to */ /* make its rows and columns closer in norm and the condition numbers */ /* of its eigenvalues and eigenvectors smaller. The computed */ /* reciprocal condition numbers correspond to the balanced matrix. */ /* Permuting rows and columns will not change the condition numbers */ /* (in exact arithmetic) but diagonal scaling will. For further */ /* explanation of balancing, see section 4.10.2 of the LAPACK */ /* Users' Guide. */ /* Arguments */ /* ========= */ /* BALANC (input) CHARACTER*1 */ /* Indicates how the input matrix should be diagonally scaled */ /* and/or permuted to improve the conditioning of its */ /* eigenvalues. */ /* = 'N': Do not diagonally scale or permute; */ /* = 'P': Perform permutations to make the matrix more nearly */ /* upper triangular. Do not diagonally scale; */ /* = 'S': Diagonally scale the matrix, i.e. replace A by */ /* D*A*D**(-1), where D is a diagonal matrix chosen */ /* to make the rows and columns of A more equal in */ /* norm. Do not permute; */ /* = 'B': Both diagonally scale and permute A. */ /* Computed reciprocal condition numbers will be for the matrix */ /* after balancing and/or permuting. Permuting does not change */ /* condition numbers (in exact arithmetic), but balancing does. */ /* JOBVL (input) CHARACTER*1 */ /* = 'N': left eigenvectors of A are not computed; */ /* = 'V': left eigenvectors of A are computed. */ /* If SENSE = 'E' or 'B', JOBVL must = 'V'. */ /* JOBVR (input) CHARACTER*1 */ /* = 'N': right eigenvectors of A are not computed; */ /* = 'V': right eigenvectors of A are computed. */ /* If SENSE = 'E' or 'B', JOBVR must = 'V'. */ /* SENSE (input) CHARACTER*1 */ /* Determines which reciprocal condition numbers are computed. */ /* = 'N': None are computed; */ /* = 'E': Computed for eigenvalues only; */ /* = 'V': Computed for right eigenvectors only; */ /* = 'B': Computed for eigenvalues and right eigenvectors. */ /* If SENSE = 'E' or 'B', both left and right eigenvectors */ /* must also be computed (JOBVL = 'V' and JOBVR = 'V'). */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* On exit, A has been overwritten. If JOBVL = 'V' or */ /* JOBVR = 'V', A contains the real Schur form of the balanced */ /* version of the input matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* WR and WI contain the real and imaginary parts, */ /* respectively, of the computed eigenvalues. Complex */ /* conjugate pairs of eigenvalues will appear consecutively */ /* with the eigenvalue having the positive imaginary part */ /* first. */ /* VL (output) DOUBLE PRECISION array, dimension (LDVL,N) */ /* If JOBVL = 'V', the left eigenvectors u(j) are stored one */ /* after another in the columns of VL, in the same order */ /* as their eigenvalues. */ /* If JOBVL = 'N', VL is not referenced. */ /* If the j-th eigenvalue is real, then u(j) = VL(:,j), */ /* the j-th column of VL. */ /* If the j-th and (j+1)-st eigenvalues form a complex */ /* conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and */ /* u(j+1) = VL(:,j) - i*VL(:,j+1). */ /* LDVL (input) INTEGER */ /* The leading dimension of the array VL. LDVL >= 1; if */ /* JOBVL = 'V', LDVL >= N. */ /* VR (output) DOUBLE PRECISION array, dimension (LDVR,N) */ /* If JOBVR = 'V', the right eigenvectors v(j) are stored one */ /* after another in the columns of VR, in the same order */ /* as their eigenvalues. */ /* If JOBVR = 'N', VR is not referenced. */ /* If the j-th eigenvalue is real, then v(j) = VR(:,j), */ /* the j-th column of VR. */ /* If the j-th and (j+1)-st eigenvalues form a complex */ /* conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and */ /* v(j+1) = VR(:,j) - i*VR(:,j+1). */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. LDVR >= 1, and if */ /* JOBVR = 'V', LDVR >= N. */ /* ILO (output) INTEGER */ /* IHI (output) INTEGER */ /* ILO and IHI are integer values determined when A was */ /* balanced. The balanced A(i,j) = 0 if I > J and */ /* J = 1,...,ILO-1 or I = IHI+1,...,N. */ /* SCALE (output) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and scaling factors applied */ /* when balancing A. If P(j) is the index of the row and column */ /* interchanged with row and column j, and D(j) is the scaling */ /* factor applied to row and column j, then */ /* SCALE(J) = P(J), for J = 1,...,ILO-1 */ /* = D(J), for J = ILO,...,IHI */ /* = P(J) for J = IHI+1,...,N. */ /* The order in which the interchanges are made is N to IHI+1, */ /* then 1 to ILO-1. */ /* ABNRM (output) DOUBLE PRECISION */ /* The one-norm of the balanced matrix (the maximum */ /* of the sum of absolute values of elements of any column). */ /* RCONDE (output) DOUBLE PRECISION array, dimension (N) */ /* RCONDE(j) is the reciprocal condition number of the j-th */ /* eigenvalue. */ /* RCONDV (output) DOUBLE PRECISION array, dimension (N) */ /* RCONDV(j) is the reciprocal condition number of the j-th */ /* right eigenvector. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. If SENSE = 'N' or 'E', */ /* LWORK >= max(1,2*N), and if JOBVL = 'V' or JOBVR = 'V', */ /* LWORK >= 3*N. If SENSE = 'V' or 'B', LWORK >= N*(N+6). */ /* For good performance, LWORK must generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (2*N-2) */ /* If SENSE = 'N' or 'E', not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, the QR algorithm failed to compute all the */ /* eigenvalues, and no eigenvectors or condition numbers */ /* have been computed; elements 1:ILO-1 and i+1:N of WR */ /* and WI contain eigenvalues which have converged. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --wr; --wi; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --scale; --rconde; --rcondv; --work; --iwork; /* Function Body */ *info = 0; lquery = *lwork == -1; wantvl = _starpu_lsame_(jobvl, "V"); wantvr = _starpu_lsame_(jobvr, "V"); wntsnn = _starpu_lsame_(sense, "N"); wntsne = _starpu_lsame_(sense, "E"); wntsnv = _starpu_lsame_(sense, "V"); wntsnb = _starpu_lsame_(sense, "B"); if (! (_starpu_lsame_(balanc, "N") || _starpu_lsame_(balanc, "S") || _starpu_lsame_(balanc, "P") || _starpu_lsame_(balanc, "B"))) { *info = -1; } else if (! wantvl && ! _starpu_lsame_(jobvl, "N")) { *info = -2; } else if (! wantvr && ! _starpu_lsame_(jobvr, "N")) { *info = -3; } else if (! (wntsnn || wntsne || wntsnb || wntsnv) || (wntsne || wntsnb) && ! (wantvl && wantvr)) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldvl < 1 || wantvl && *ldvl < *n) { *info = -11; } else if (*ldvr < 1 || wantvr && *ldvr < *n) { *info = -13; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV. */ /* HSWORK refers to the workspace preferred by DHSEQR, as */ /* calculated below. HSWORK is computed assuming ILO=1 and IHI=N, */ /* the worst case.) */ if (*info == 0) { if (*n == 0) { minwrk = 1; maxwrk = 1; } else { maxwrk = *n + *n * _starpu_ilaenv_(&c__1, "DGEHRD", " ", n, &c__1, n, & c__0); if (wantvl) { _starpu_dhseqr_("S", "V", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[ 1], &vl[vl_offset], ldvl, &work[1], &c_n1, info); } else if (wantvr) { _starpu_dhseqr_("S", "V", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[ 1], &vr[vr_offset], ldvr, &work[1], &c_n1, info); } else { if (wntsnn) { _starpu_dhseqr_("E", "N", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1], &vr[vr_offset], ldvr, &work[1], &c_n1, info); } else { _starpu_dhseqr_("S", "N", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1], &vr[vr_offset], ldvr, &work[1], &c_n1, info); } } hswork = (integer) work[1]; if (! wantvl && ! wantvr) { minwrk = *n << 1; if (! wntsnn) { /* Computing MAX */ i__1 = minwrk, i__2 = *n * *n + *n * 6; minwrk = max(i__1,i__2); } maxwrk = max(maxwrk,hswork); if (! wntsnn) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n * *n + *n * 6; maxwrk = max(i__1,i__2); } } else { minwrk = *n * 3; if (! wntsnn && ! wntsne) { /* Computing MAX */ i__1 = minwrk, i__2 = *n * *n + *n * 6; minwrk = max(i__1,i__2); } maxwrk = max(maxwrk,hswork); /* Computing MAX */ i__1 = maxwrk, i__2 = *n + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGHR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); if (! wntsnn && ! wntsne) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n * *n + *n * 6; maxwrk = max(i__1,i__2); } /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3; maxwrk = max(i__1,i__2); } maxwrk = max(maxwrk,minwrk); } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -21; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEEVX", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = sqrt(smlnum) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ icond = 0; anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, dum); scalea = FALSE_; if (anrm > 0. && anrm < smlnum) { scalea = TRUE_; cscale = smlnum; } else if (anrm > bignum) { scalea = TRUE_; cscale = bignum; } if (scalea) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &cscale, n, n, &a[a_offset], lda, & ierr); } /* Balance the matrix and compute ABNRM */ _starpu_dgebal_(balanc, n, &a[a_offset], lda, ilo, ihi, &scale[1], &ierr); *abnrm = _starpu_dlange_("1", n, n, &a[a_offset], lda, dum); if (scalea) { dum[0] = *abnrm; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &c__1, &c__1, dum, &c__1, & ierr); *abnrm = dum[0]; } /* Reduce to upper Hessenberg form */ /* (Workspace: need 2*N, prefer N+N*NB) */ itau = 1; iwrk = itau + *n; i__1 = *lwork - iwrk + 1; _starpu_dgehrd_(n, ilo, ihi, &a[a_offset], lda, &work[itau], &work[iwrk], &i__1, & ierr); if (wantvl) { /* Want left eigenvectors */ /* Copy Householder vectors to VL */ *(unsigned char *)side = 'L'; _starpu_dlacpy_("L", n, n, &a[a_offset], lda, &vl[vl_offset], ldvl) ; /* Generate orthogonal matrix in VL */ /* (Workspace: need 2*N-1, prefer N+(N-1)*NB) */ i__1 = *lwork - iwrk + 1; _starpu_dorghr_(n, ilo, ihi, &vl[vl_offset], ldvl, &work[itau], &work[iwrk], & i__1, &ierr); /* Perform QR iteration, accumulating Schur vectors in VL */ /* (Workspace: need 1, prefer HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("S", "V", n, ilo, ihi, &a[a_offset], lda, &wr[1], &wi[1], &vl[ vl_offset], ldvl, &work[iwrk], &i__1, info); if (wantvr) { /* Want left and right eigenvectors */ /* Copy Schur vectors to VR */ *(unsigned char *)side = 'B'; _starpu_dlacpy_("F", n, n, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr); } } else if (wantvr) { /* Want right eigenvectors */ /* Copy Householder vectors to VR */ *(unsigned char *)side = 'R'; _starpu_dlacpy_("L", n, n, &a[a_offset], lda, &vr[vr_offset], ldvr) ; /* Generate orthogonal matrix in VR */ /* (Workspace: need 2*N-1, prefer N+(N-1)*NB) */ i__1 = *lwork - iwrk + 1; _starpu_dorghr_(n, ilo, ihi, &vr[vr_offset], ldvr, &work[itau], &work[iwrk], & i__1, &ierr); /* Perform QR iteration, accumulating Schur vectors in VR */ /* (Workspace: need 1, prefer HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_("S", "V", n, ilo, ihi, &a[a_offset], lda, &wr[1], &wi[1], &vr[ vr_offset], ldvr, &work[iwrk], &i__1, info); } else { /* Compute eigenvalues only */ /* If condition numbers desired, compute Schur form */ if (wntsnn) { *(unsigned char *)job = 'E'; } else { *(unsigned char *)job = 'S'; } /* (Workspace: need 1, prefer HSWORK (see comments) ) */ iwrk = itau; i__1 = *lwork - iwrk + 1; _starpu_dhseqr_(job, "N", n, ilo, ihi, &a[a_offset], lda, &wr[1], &wi[1], &vr[ vr_offset], ldvr, &work[iwrk], &i__1, info); } /* If INFO > 0 from DHSEQR, then quit */ if (*info > 0) { goto L50; } if (wantvl || wantvr) { /* Compute left and/or right eigenvectors */ /* (Workspace: need 3*N) */ _starpu_dtrevc_(side, "B", select, n, &a[a_offset], lda, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, n, &nout, &work[iwrk], &ierr); } /* Compute condition numbers if desired */ /* (Workspace: need N*N+6*N unless SENSE = 'E') */ if (! wntsnn) { _starpu_dtrsna_(sense, "A", select, n, &a[a_offset], lda, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, &rconde[1], &rcondv[1], n, &nout, &work[iwrk], n, &iwork[1], &icond); } if (wantvl) { /* Undo balancing of left eigenvectors */ _starpu_dgebak_(balanc, "L", n, ilo, ihi, &scale[1], n, &vl[vl_offset], ldvl, &ierr); /* Normalize left eigenvectors and make largest component real */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (wi[i__] == 0.) { scl = 1. / _starpu_dnrm2_(n, &vl[i__ * vl_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vl[i__ * vl_dim1 + 1], &c__1); } else if (wi[i__] > 0.) { d__1 = _starpu_dnrm2_(n, &vl[i__ * vl_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vl[(i__ + 1) * vl_dim1 + 1], &c__1); scl = 1. / _starpu_dlapy2_(&d__1, &d__2); _starpu_dscal_(n, &scl, &vl[i__ * vl_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vl[(i__ + 1) * vl_dim1 + 1], &c__1); i__2 = *n; for (k = 1; k <= i__2; ++k) { /* Computing 2nd power */ d__1 = vl[k + i__ * vl_dim1]; /* Computing 2nd power */ d__2 = vl[k + (i__ + 1) * vl_dim1]; work[k] = d__1 * d__1 + d__2 * d__2; /* L10: */ } k = _starpu_idamax_(n, &work[1], &c__1); _starpu_dlartg_(&vl[k + i__ * vl_dim1], &vl[k + (i__ + 1) * vl_dim1], &cs, &sn, &r__); _starpu_drot_(n, &vl[i__ * vl_dim1 + 1], &c__1, &vl[(i__ + 1) * vl_dim1 + 1], &c__1, &cs, &sn); vl[k + (i__ + 1) * vl_dim1] = 0.; } /* L20: */ } } if (wantvr) { /* Undo balancing of right eigenvectors */ _starpu_dgebak_(balanc, "R", n, ilo, ihi, &scale[1], n, &vr[vr_offset], ldvr, &ierr); /* Normalize right eigenvectors and make largest component real */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (wi[i__] == 0.) { scl = 1. / _starpu_dnrm2_(n, &vr[i__ * vr_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vr[i__ * vr_dim1 + 1], &c__1); } else if (wi[i__] > 0.) { d__1 = _starpu_dnrm2_(n, &vr[i__ * vr_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vr[(i__ + 1) * vr_dim1 + 1], &c__1); scl = 1. / _starpu_dlapy2_(&d__1, &d__2); _starpu_dscal_(n, &scl, &vr[i__ * vr_dim1 + 1], &c__1); _starpu_dscal_(n, &scl, &vr[(i__ + 1) * vr_dim1 + 1], &c__1); i__2 = *n; for (k = 1; k <= i__2; ++k) { /* Computing 2nd power */ d__1 = vr[k + i__ * vr_dim1]; /* Computing 2nd power */ d__2 = vr[k + (i__ + 1) * vr_dim1]; work[k] = d__1 * d__1 + d__2 * d__2; /* L30: */ } k = _starpu_idamax_(n, &work[1], &c__1); _starpu_dlartg_(&vr[k + i__ * vr_dim1], &vr[k + (i__ + 1) * vr_dim1], &cs, &sn, &r__); _starpu_drot_(n, &vr[i__ * vr_dim1 + 1], &c__1, &vr[(i__ + 1) * vr_dim1 + 1], &c__1, &cs, &sn); vr[k + (i__ + 1) * vr_dim1] = 0.; } /* L40: */ } } /* Undo scaling if necessary */ L50: if (scalea) { i__1 = *n - *info; /* Computing MAX */ i__3 = *n - *info; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wr[*info + 1], &i__2, &ierr); i__1 = *n - *info; /* Computing MAX */ i__3 = *n - *info; i__2 = max(i__3,1); _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[*info + 1], &i__2, &ierr); if (*info == 0) { if ((wntsnv || wntsnb) && icond == 0) { _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, n, &c__1, &rcondv[ 1], n, &ierr); } } else { i__1 = *ilo - 1; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wr[1], n, &ierr); i__1 = *ilo - 1; _starpu_dlascl_("G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[1], n, &ierr); } } work[1] = (doublereal) maxwrk; return 0; /* End of DGEEVX */ } /* _starpu_dgeevx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgegs.c000066400000000000000000000424351413463044200204470ustar00rootroot00000000000000/* dgegs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b36 = 0.; static doublereal c_b37 = 1.; /* Subroutine */ int _starpu_dgegs_(char *jobvsl, char *jobvsr, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vsl_dim1, vsl_offset, vsr_dim1, vsr_offset, i__1, i__2; /* Local variables */ integer nb, nb1, nb2, nb3, ihi, ilo; doublereal eps, anrm, bnrm; integer itau, lopt; extern logical _starpu_lsame_(char *, char *); integer ileft, iinfo, icols; logical ilvsl; integer iwork; logical ilvsr; integer irows; extern /* Subroutine */ int _starpu_dggbak_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dggbal_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical ilascl, ilbscl; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer ijobvl, iright, ijobvr; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal anrmto; integer lwkmin; doublereal bnrmto; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal smlnum; integer lwkopt; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is deprecated and has been replaced by routine DGGES. */ /* DGEGS computes the eigenvalues, real Schur form, and, optionally, */ /* left and or/right Schur vectors of a real matrix pair (A,B). */ /* Given two square matrices A and B, the generalized real Schur */ /* factorization has the form */ /* A = Q*S*Z**T, B = Q*T*Z**T */ /* where Q and Z are orthogonal matrices, T is upper triangular, and S */ /* is an upper quasi-triangular matrix with 1-by-1 and 2-by-2 diagonal */ /* blocks, the 2-by-2 blocks corresponding to complex conjugate pairs */ /* of eigenvalues of (A,B). The columns of Q are the left Schur vectors */ /* and the columns of Z are the right Schur vectors. */ /* If only the eigenvalues of (A,B) are needed, the driver routine */ /* DGEGV should be used instead. See DGEGV for a description of the */ /* eigenvalues of the generalized nonsymmetric eigenvalue problem */ /* (GNEP). */ /* Arguments */ /* ========= */ /* JOBVSL (input) CHARACTER*1 */ /* = 'N': do not compute the left Schur vectors; */ /* = 'V': compute the left Schur vectors (returned in VSL). */ /* JOBVSR (input) CHARACTER*1 */ /* = 'N': do not compute the right Schur vectors; */ /* = 'V': compute the right Schur vectors (returned in VSR). */ /* N (input) INTEGER */ /* The order of the matrices A, B, VSL, and VSR. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the matrix A. */ /* On exit, the upper quasi-triangular matrix S from the */ /* generalized real Schur factorization. */ /* LDA (input) INTEGER */ /* The leading dimension of A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the matrix B. */ /* On exit, the upper triangular matrix T from the generalized */ /* real Schur factorization. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB >= max(1,N). */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* The real parts of each scalar alpha defining an eigenvalue */ /* of GNEP. */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* The imaginary parts of each scalar alpha defining an */ /* eigenvalue of GNEP. If ALPHAI(j) is zero, then the j-th */ /* eigenvalue is real; if positive, then the j-th and (j+1)-st */ /* eigenvalues are a complex conjugate pair, with */ /* ALPHAI(j+1) = -ALPHAI(j). */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* The scalars beta that define the eigenvalues of GNEP. */ /* Together, the quantities alpha = (ALPHAR(j),ALPHAI(j)) and */ /* beta = BETA(j) represent the j-th eigenvalue of the matrix */ /* pair (A,B), in one of the forms lambda = alpha/beta or */ /* mu = beta/alpha. Since either lambda or mu may overflow, */ /* they should not, in general, be computed. */ /* VSL (output) DOUBLE PRECISION array, dimension (LDVSL,N) */ /* If JOBVSL = 'V', the matrix of left Schur vectors Q. */ /* Not referenced if JOBVSL = 'N'. */ /* LDVSL (input) INTEGER */ /* The leading dimension of the matrix VSL. LDVSL >=1, and */ /* if JOBVSL = 'V', LDVSL >= N. */ /* VSR (output) DOUBLE PRECISION array, dimension (LDVSR,N) */ /* If JOBVSR = 'V', the matrix of right Schur vectors Z. */ /* Not referenced if JOBVSR = 'N'. */ /* LDVSR (input) INTEGER */ /* The leading dimension of the matrix VSR. LDVSR >= 1, and */ /* if JOBVSR = 'V', LDVSR >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,4*N). */ /* For good performance, LWORK must generally be larger. */ /* To compute the optimal value of LWORK, call ILAENV to get */ /* blocksizes (for DGEQRF, DORMQR, and DORGQR.) Then compute: */ /* NB -- MAX of the blocksizes for DGEQRF, DORMQR, and DORGQR */ /* The optimal LWORK is 2*N + N*(NB+1). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1,...,N: */ /* The QZ iteration failed. (A,B) are not in Schur */ /* form, but ALPHAR(j), ALPHAI(j), and BETA(j) should */ /* be correct for j=INFO+1,...,N. */ /* > N: errors that usually indicate LAPACK problems: */ /* =N+1: error return from DGGBAL */ /* =N+2: error return from DGEQRF */ /* =N+3: error return from DORMQR */ /* =N+4: error return from DORGQR */ /* =N+5: error return from DGGHRD */ /* =N+6: error return from DHGEQZ (other than failed */ /* iteration) */ /* =N+7: error return from DGGBAK (computing VSL) */ /* =N+8: error return from DGGBAK (computing VSR) */ /* =N+9: error return from DLASCL (various places) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; vsl_dim1 = *ldvsl; vsl_offset = 1 + vsl_dim1; vsl -= vsl_offset; vsr_dim1 = *ldvsr; vsr_offset = 1 + vsr_dim1; vsr -= vsr_offset; --work; /* Function Body */ if (_starpu_lsame_(jobvsl, "N")) { ijobvl = 1; ilvsl = FALSE_; } else if (_starpu_lsame_(jobvsl, "V")) { ijobvl = 2; ilvsl = TRUE_; } else { ijobvl = -1; ilvsl = FALSE_; } if (_starpu_lsame_(jobvsr, "N")) { ijobvr = 1; ilvsr = FALSE_; } else if (_starpu_lsame_(jobvsr, "V")) { ijobvr = 2; ilvsr = TRUE_; } else { ijobvr = -1; ilvsr = FALSE_; } /* Test the input arguments */ /* Computing MAX */ i__1 = *n << 2; lwkmin = max(i__1,1); lwkopt = lwkmin; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; *info = 0; if (ijobvl <= 0) { *info = -1; } else if (ijobvr <= 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldvsl < 1 || ilvsl && *ldvsl < *n) { *info = -12; } else if (*ldvsr < 1 || ilvsr && *ldvsr < *n) { *info = -14; } else if (*lwork < lwkmin && ! lquery) { *info = -16; } if (*info == 0) { nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, n, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DORMQR", " ", n, n, n, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORGQR", " ", n, n, n, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2); nb = max(i__1,nb3); lopt = (*n << 1) + *n * (nb + 1); work[1] = (doublereal) lopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEGS ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("E") * _starpu_dlamch_("B"); safmin = _starpu_dlamch_("S"); smlnum = *n * safmin / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]); ilascl = FALSE_; if (anrm > 0. && anrm < smlnum) { anrmto = smlnum; ilascl = TRUE_; } else if (anrm > bignum) { anrmto = bignum; ilascl = TRUE_; } if (ilascl) { _starpu_dlascl_("G", &c_n1, &c_n1, &anrm, &anrmto, n, n, &a[a_offset], lda, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]); ilbscl = FALSE_; if (bnrm > 0. && bnrm < smlnum) { bnrmto = smlnum; ilbscl = TRUE_; } else if (bnrm > bignum) { bnrmto = bignum; ilbscl = TRUE_; } if (ilbscl) { _starpu_dlascl_("G", &c_n1, &c_n1, &bnrm, &bnrmto, n, n, &b[b_offset], ldb, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } } /* Permute the matrix to make it more nearly triangular */ /* Workspace layout: (2*N words -- "work..." not actually used) */ /* left_permutation, right_permutation, work... */ ileft = 1; iright = *n + 1; iwork = iright + *n; _starpu_dggbal_("P", n, &a[a_offset], lda, &b[b_offset], ldb, &ilo, &ihi, &work[ ileft], &work[iright], &work[iwork], &iinfo); if (iinfo != 0) { *info = *n + 1; goto L10; } /* Reduce B to triangular form, and initialize VSL and/or VSR */ /* Workspace layout: ("work..." must have at least N words) */ /* left_permutation, right_permutation, tau, work... */ irows = ihi + 1 - ilo; icols = *n + 1 - ilo; itau = iwork; iwork = itau + irows; i__1 = *lwork + 1 - iwork; _starpu_dgeqrf_(&irows, &icols, &b[ilo + ilo * b_dim1], ldb, &work[itau], &work[ iwork], &i__1, &iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { *info = *n + 2; goto L10; } i__1 = *lwork + 1 - iwork; _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[ilo + ilo * b_dim1], ldb, & work[itau], &a[ilo + ilo * a_dim1], lda, &work[iwork], &i__1, & iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { *info = *n + 3; goto L10; } if (ilvsl) { _starpu_dlaset_("Full", n, n, &c_b36, &c_b37, &vsl[vsl_offset], ldvsl); i__1 = irows - 1; i__2 = irows - 1; _starpu_dlacpy_("L", &i__1, &i__2, &b[ilo + 1 + ilo * b_dim1], ldb, &vsl[ilo + 1 + ilo * vsl_dim1], ldvsl); i__1 = *lwork + 1 - iwork; _starpu_dorgqr_(&irows, &irows, &irows, &vsl[ilo + ilo * vsl_dim1], ldvsl, & work[itau], &work[iwork], &i__1, &iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { *info = *n + 4; goto L10; } } if (ilvsr) { _starpu_dlaset_("Full", n, n, &c_b36, &c_b37, &vsr[vsr_offset], ldvsr); } /* Reduce to generalized Hessenberg form */ _starpu_dgghrd_(jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[b_offset], ldb, &vsl[vsl_offset], ldvsl, &vsr[vsr_offset], ldvsr, &iinfo); if (iinfo != 0) { *info = *n + 5; goto L10; } /* Perform QZ algorithm, computing Schur vectors if desired */ /* Workspace layout: ("work..." must have at least 1 word) */ /* left_permutation, right_permutation, work... */ iwork = itau; i__1 = *lwork + 1 - iwork; _starpu_dhgeqz_("S", jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vsl[vsl_offset] , ldvsl, &vsr[vsr_offset], ldvsr, &work[iwork], &i__1, &iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { if (iinfo > 0 && iinfo <= *n) { *info = iinfo; } else if (iinfo > *n && iinfo <= *n << 1) { *info = iinfo - *n; } else { *info = *n + 6; } goto L10; } /* Apply permutation to VSL and VSR */ if (ilvsl) { _starpu_dggbak_("P", "L", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsl[ vsl_offset], ldvsl, &iinfo); if (iinfo != 0) { *info = *n + 7; goto L10; } } if (ilvsr) { _starpu_dggbak_("P", "R", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsr[ vsr_offset], ldvsr, &iinfo); if (iinfo != 0) { *info = *n + 8; goto L10; } } /* Undo scaling */ if (ilascl) { _starpu_dlascl_("H", &c_n1, &c_n1, &anrmto, &anrm, n, n, &a[a_offset], lda, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } _starpu_dlascl_("G", &c_n1, &c_n1, &anrmto, &anrm, n, &c__1, &alphar[1], n, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } _starpu_dlascl_("G", &c_n1, &c_n1, &anrmto, &anrm, n, &c__1, &alphai[1], n, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } } if (ilbscl) { _starpu_dlascl_("U", &c_n1, &c_n1, &bnrmto, &bnrm, n, n, &b[b_offset], ldb, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } _starpu_dlascl_("G", &c_n1, &c_n1, &bnrmto, &bnrm, n, &c__1, &beta[1], n, & iinfo); if (iinfo != 0) { *info = *n + 9; return 0; } } L10: work[1] = (doublereal) lwkopt; return 0; /* End of DGEGS */ } /* _starpu_dgegs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgegv.c000066400000000000000000000633421413463044200204520ustar00rootroot00000000000000/* dgegv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b27 = 1.; static doublereal c_b38 = 0.; /* Subroutine */ int _starpu_dgegv_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Local variables */ integer jc, nb, in, jr, nb1, nb2, nb3, ihi, ilo; doublereal eps; logical ilv; doublereal absb, anrm, bnrm; integer itau; doublereal temp; logical ilvl, ilvr; integer lopt; doublereal anrm1, anrm2, bnrm1, bnrm2, absai, scale, absar, sbeta; extern logical _starpu_lsame_(char *, char *); integer ileft, iinfo, icols, iwork, irows; extern /* Subroutine */ int _starpu_dggbak_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dggbal_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); doublereal salfai; extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal salfar; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmax; char chtemp[1]; logical ldumma[1]; extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dtgevc_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); integer ijobvl, iright; logical ilimit; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ijobvr; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal onepls; integer lwkmin; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is deprecated and has been replaced by routine DGGEV. */ /* DGEGV computes the eigenvalues and, optionally, the left and/or right */ /* eigenvectors of a real matrix pair (A,B). */ /* Given two square matrices A and B, */ /* the generalized nonsymmetric eigenvalue problem (GNEP) is to find the */ /* eigenvalues lambda and corresponding (non-zero) eigenvectors x such */ /* that */ /* A*x = lambda*B*x. */ /* An alternate form is to find the eigenvalues mu and corresponding */ /* eigenvectors y such that */ /* mu*A*y = B*y. */ /* These two forms are equivalent with mu = 1/lambda and x = y if */ /* neither lambda nor mu is zero. In order to deal with the case that */ /* lambda or mu is zero or small, two values alpha and beta are returned */ /* for each eigenvalue, such that lambda = alpha/beta and */ /* mu = beta/alpha. */ /* The vectors x and y in the above equations are right eigenvectors of */ /* the matrix pair (A,B). Vectors u and v satisfying */ /* u**H*A = lambda*u**H*B or mu*v**H*A = v**H*B */ /* are left eigenvectors of (A,B). */ /* Note: this routine performs "full balancing" on A and B -- see */ /* "Further Details", below. */ /* Arguments */ /* ========= */ /* JOBVL (input) CHARACTER*1 */ /* = 'N': do not compute the left generalized eigenvectors; */ /* = 'V': compute the left generalized eigenvectors (returned */ /* in VL). */ /* JOBVR (input) CHARACTER*1 */ /* = 'N': do not compute the right generalized eigenvectors; */ /* = 'V': compute the right generalized eigenvectors (returned */ /* in VR). */ /* N (input) INTEGER */ /* The order of the matrices A, B, VL, and VR. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the matrix A. */ /* If JOBVL = 'V' or JOBVR = 'V', then on exit A */ /* contains the real Schur form of A from the generalized Schur */ /* factorization of the pair (A,B) after balancing. */ /* If no eigenvectors were computed, then only the diagonal */ /* blocks from the Schur form will be correct. See DGGHRD and */ /* DHGEQZ for details. */ /* LDA (input) INTEGER */ /* The leading dimension of A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the matrix B. */ /* If JOBVL = 'V' or JOBVR = 'V', then on exit B contains the */ /* upper triangular matrix obtained from B in the generalized */ /* Schur factorization of the pair (A,B) after balancing. */ /* If no eigenvectors were computed, then only those elements of */ /* B corresponding to the diagonal blocks from the Schur form of */ /* A will be correct. See DGGHRD and DHGEQZ for details. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB >= max(1,N). */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* The real parts of each scalar alpha defining an eigenvalue of */ /* GNEP. */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* The imaginary parts of each scalar alpha defining an */ /* eigenvalue of GNEP. If ALPHAI(j) is zero, then the j-th */ /* eigenvalue is real; if positive, then the j-th and */ /* (j+1)-st eigenvalues are a complex conjugate pair, with */ /* ALPHAI(j+1) = -ALPHAI(j). */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* The scalars beta that define the eigenvalues of GNEP. */ /* Together, the quantities alpha = (ALPHAR(j),ALPHAI(j)) and */ /* beta = BETA(j) represent the j-th eigenvalue of the matrix */ /* pair (A,B), in one of the forms lambda = alpha/beta or */ /* mu = beta/alpha. Since either lambda or mu may overflow, */ /* they should not, in general, be computed. */ /* VL (output) DOUBLE PRECISION array, dimension (LDVL,N) */ /* If JOBVL = 'V', the left eigenvectors u(j) are stored */ /* in the columns of VL, in the same order as their eigenvalues. */ /* If the j-th eigenvalue is real, then u(j) = VL(:,j). */ /* If the j-th and (j+1)-st eigenvalues form a complex conjugate */ /* pair, then */ /* u(j) = VL(:,j) + i*VL(:,j+1) */ /* and */ /* u(j+1) = VL(:,j) - i*VL(:,j+1). */ /* Each eigenvector is scaled so that its largest component has */ /* abs(real part) + abs(imag. part) = 1, except for eigenvectors */ /* corresponding to an eigenvalue with alpha = beta = 0, which */ /* are set to zero. */ /* Not referenced if JOBVL = 'N'. */ /* LDVL (input) INTEGER */ /* The leading dimension of the matrix VL. LDVL >= 1, and */ /* if JOBVL = 'V', LDVL >= N. */ /* VR (output) DOUBLE PRECISION array, dimension (LDVR,N) */ /* If JOBVR = 'V', the right eigenvectors x(j) are stored */ /* in the columns of VR, in the same order as their eigenvalues. */ /* If the j-th eigenvalue is real, then x(j) = VR(:,j). */ /* If the j-th and (j+1)-st eigenvalues form a complex conjugate */ /* pair, then */ /* x(j) = VR(:,j) + i*VR(:,j+1) */ /* and */ /* x(j+1) = VR(:,j) - i*VR(:,j+1). */ /* Each eigenvector is scaled so that its largest component has */ /* abs(real part) + abs(imag. part) = 1, except for eigenvalues */ /* corresponding to an eigenvalue with alpha = beta = 0, which */ /* are set to zero. */ /* Not referenced if JOBVR = 'N'. */ /* LDVR (input) INTEGER */ /* The leading dimension of the matrix VR. LDVR >= 1, and */ /* if JOBVR = 'V', LDVR >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,8*N). */ /* For good performance, LWORK must generally be larger. */ /* To compute the optimal value of LWORK, call ILAENV to get */ /* blocksizes (for DGEQRF, DORMQR, and DORGQR.) Then compute: */ /* NB -- MAX of the blocksizes for DGEQRF, DORMQR, and DORGQR; */ /* The optimal LWORK is: */ /* 2*N + MAX( 6*N, N*(NB+1) ). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1,...,N: */ /* The QZ iteration failed. No eigenvectors have been */ /* calculated, but ALPHAR(j), ALPHAI(j), and BETA(j) */ /* should be correct for j=INFO+1,...,N. */ /* > N: errors that usually indicate LAPACK problems: */ /* =N+1: error return from DGGBAL */ /* =N+2: error return from DGEQRF */ /* =N+3: error return from DORMQR */ /* =N+4: error return from DORGQR */ /* =N+5: error return from DGGHRD */ /* =N+6: error return from DHGEQZ (other than failed */ /* iteration) */ /* =N+7: error return from DTGEVC */ /* =N+8: error return from DGGBAK (computing VL) */ /* =N+9: error return from DGGBAK (computing VR) */ /* =N+10: error return from DLASCL (various calls) */ /* Further Details */ /* =============== */ /* Balancing */ /* --------- */ /* This driver calls DGGBAL to both permute and scale rows and columns */ /* of A and B. The permutations PL and PR are chosen so that PL*A*PR */ /* and PL*B*R will be upper triangular except for the diagonal blocks */ /* A(i:j,i:j) and B(i:j,i:j), with i and j as close together as */ /* possible. The diagonal scaling matrices DL and DR are chosen so */ /* that the pair DL*PL*A*PR*DR, DL*PL*B*PR*DR have elements close to */ /* one (except for the elements that start out zero.) */ /* After the eigenvalues and eigenvectors of the balanced matrices */ /* have been computed, DGGBAK transforms the eigenvectors back to what */ /* they would have been (in perfect arithmetic) if they had not been */ /* balanced. */ /* Contents of A and B on Exit */ /* -------- -- - --- - -- ---- */ /* If any eigenvectors are computed (either JOBVL='V' or JOBVR='V' or */ /* both), then on exit the arrays A and B will contain the real Schur */ /* form[*] of the "balanced" versions of A and B. If no eigenvectors */ /* are computed, then only the diagonal blocks will be correct. */ /* [*] See DHGEQZ, DGEGS, or read the book "Matrix Computations", */ /* by Golub & van Loan, pub. by Johns Hopkins U. Press. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --work; /* Function Body */ if (_starpu_lsame_(jobvl, "N")) { ijobvl = 1; ilvl = FALSE_; } else if (_starpu_lsame_(jobvl, "V")) { ijobvl = 2; ilvl = TRUE_; } else { ijobvl = -1; ilvl = FALSE_; } if (_starpu_lsame_(jobvr, "N")) { ijobvr = 1; ilvr = FALSE_; } else if (_starpu_lsame_(jobvr, "V")) { ijobvr = 2; ilvr = TRUE_; } else { ijobvr = -1; ilvr = FALSE_; } ilv = ilvl || ilvr; /* Test the input arguments */ /* Computing MAX */ i__1 = *n << 3; lwkmin = max(i__1,1); lwkopt = lwkmin; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; *info = 0; if (ijobvl <= 0) { *info = -1; } else if (ijobvr <= 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldvl < 1 || ilvl && *ldvl < *n) { *info = -12; } else if (*ldvr < 1 || ilvr && *ldvr < *n) { *info = -14; } else if (*lwork < lwkmin && ! lquery) { *info = -16; } if (*info == 0) { nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, n, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DORMQR", " ", n, n, n, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORGQR", " ", n, n, n, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2); nb = max(i__1,nb3); /* Computing MAX */ i__1 = *n * 6, i__2 = *n * (nb + 1); lopt = (*n << 1) + max(i__1,i__2); work[1] = (doublereal) lopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEGV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("E") * _starpu_dlamch_("B"); safmin = _starpu_dlamch_("S"); safmin += safmin; safmax = 1. / safmin; onepls = eps * 4 + 1.; /* Scale A */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]); anrm1 = anrm; anrm2 = 1.; if (anrm < 1.) { if (safmax * anrm < 1.) { anrm1 = safmin; anrm2 = safmax * anrm; } } if (anrm > 0.) { _starpu_dlascl_("G", &c_n1, &c_n1, &anrm, &c_b27, n, n, &a[a_offset], lda, & iinfo); if (iinfo != 0) { *info = *n + 10; return 0; } } /* Scale B */ bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]); bnrm1 = bnrm; bnrm2 = 1.; if (bnrm < 1.) { if (safmax * bnrm < 1.) { bnrm1 = safmin; bnrm2 = safmax * bnrm; } } if (bnrm > 0.) { _starpu_dlascl_("G", &c_n1, &c_n1, &bnrm, &c_b27, n, n, &b[b_offset], ldb, & iinfo); if (iinfo != 0) { *info = *n + 10; return 0; } } /* Permute the matrix to make it more nearly triangular */ /* Workspace layout: (8*N words -- "work" requires 6*N words) */ /* left_permutation, right_permutation, work... */ ileft = 1; iright = *n + 1; iwork = iright + *n; _starpu_dggbal_("P", n, &a[a_offset], lda, &b[b_offset], ldb, &ilo, &ihi, &work[ ileft], &work[iright], &work[iwork], &iinfo); if (iinfo != 0) { *info = *n + 1; goto L120; } /* Reduce B to triangular form, and initialize VL and/or VR */ /* Workspace layout: ("work..." must have at least N words) */ /* left_permutation, right_permutation, tau, work... */ irows = ihi + 1 - ilo; if (ilv) { icols = *n + 1 - ilo; } else { icols = irows; } itau = iwork; iwork = itau + irows; i__1 = *lwork + 1 - iwork; _starpu_dgeqrf_(&irows, &icols, &b[ilo + ilo * b_dim1], ldb, &work[itau], &work[ iwork], &i__1, &iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { *info = *n + 2; goto L120; } i__1 = *lwork + 1 - iwork; _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[ilo + ilo * b_dim1], ldb, & work[itau], &a[ilo + ilo * a_dim1], lda, &work[iwork], &i__1, & iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { *info = *n + 3; goto L120; } if (ilvl) { _starpu_dlaset_("Full", n, n, &c_b38, &c_b27, &vl[vl_offset], ldvl) ; i__1 = irows - 1; i__2 = irows - 1; _starpu_dlacpy_("L", &i__1, &i__2, &b[ilo + 1 + ilo * b_dim1], ldb, &vl[ilo + 1 + ilo * vl_dim1], ldvl); i__1 = *lwork + 1 - iwork; _starpu_dorgqr_(&irows, &irows, &irows, &vl[ilo + ilo * vl_dim1], ldvl, &work[ itau], &work[iwork], &i__1, &iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { *info = *n + 4; goto L120; } } if (ilvr) { _starpu_dlaset_("Full", n, n, &c_b38, &c_b27, &vr[vr_offset], ldvr) ; } /* Reduce to generalized Hessenberg form */ if (ilv) { /* Eigenvectors requested -- work on whole matrix. */ _starpu_dgghrd_(jobvl, jobvr, n, &ilo, &ihi, &a[a_offset], lda, &b[b_offset], ldb, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, &iinfo); } else { _starpu_dgghrd_("N", "N", &irows, &c__1, &irows, &a[ilo + ilo * a_dim1], lda, &b[ilo + ilo * b_dim1], ldb, &vl[vl_offset], ldvl, &vr[ vr_offset], ldvr, &iinfo); } if (iinfo != 0) { *info = *n + 5; goto L120; } /* Perform QZ algorithm */ /* Workspace layout: ("work..." must have at least 1 word) */ /* left_permutation, right_permutation, work... */ iwork = itau; if (ilv) { *(unsigned char *)chtemp = 'S'; } else { *(unsigned char *)chtemp = 'E'; } i__1 = *lwork + 1 - iwork; _starpu_dhgeqz_(chtemp, jobvl, jobvr, n, &ilo, &ihi, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, &work[iwork], &i__1, &iinfo); if (iinfo >= 0) { /* Computing MAX */ i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1; lwkopt = max(i__1,i__2); } if (iinfo != 0) { if (iinfo > 0 && iinfo <= *n) { *info = iinfo; } else if (iinfo > *n && iinfo <= *n << 1) { *info = iinfo - *n; } else { *info = *n + 6; } goto L120; } if (ilv) { /* Compute Eigenvectors (DTGEVC requires 6*N words of workspace) */ if (ilvl) { if (ilvr) { *(unsigned char *)chtemp = 'B'; } else { *(unsigned char *)chtemp = 'L'; } } else { *(unsigned char *)chtemp = 'R'; } _starpu_dtgevc_(chtemp, "B", ldumma, n, &a[a_offset], lda, &b[b_offset], ldb, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, n, &in, &work[ iwork], &iinfo); if (iinfo != 0) { *info = *n + 7; goto L120; } /* Undo balancing on VL and VR, rescale */ if (ilvl) { _starpu_dggbak_("P", "L", n, &ilo, &ihi, &work[ileft], &work[iright], n, & vl[vl_offset], ldvl, &iinfo); if (iinfo != 0) { *info = *n + 8; goto L120; } i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { if (alphai[jc] < 0.) { goto L50; } temp = 0.; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__2 = temp, d__3 = (d__1 = vl[jr + jc * vl_dim1], abs(d__1)); temp = max(d__2,d__3); /* L10: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__3 = temp, d__4 = (d__1 = vl[jr + jc * vl_dim1], abs(d__1)) + (d__2 = vl[jr + (jc + 1) * vl_dim1], abs(d__2)); temp = max(d__3,d__4); /* L20: */ } } if (temp < safmin) { goto L50; } temp = 1. / temp; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + jc * vl_dim1] *= temp; /* L30: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + jc * vl_dim1] *= temp; vl[jr + (jc + 1) * vl_dim1] *= temp; /* L40: */ } } L50: ; } } if (ilvr) { _starpu_dggbak_("P", "R", n, &ilo, &ihi, &work[ileft], &work[iright], n, & vr[vr_offset], ldvr, &iinfo); if (iinfo != 0) { *info = *n + 9; goto L120; } i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { if (alphai[jc] < 0.) { goto L100; } temp = 0.; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__2 = temp, d__3 = (d__1 = vr[jr + jc * vr_dim1], abs(d__1)); temp = max(d__2,d__3); /* L60: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__3 = temp, d__4 = (d__1 = vr[jr + jc * vr_dim1], abs(d__1)) + (d__2 = vr[jr + (jc + 1) * vr_dim1], abs(d__2)); temp = max(d__3,d__4); /* L70: */ } } if (temp < safmin) { goto L100; } temp = 1. / temp; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + jc * vr_dim1] *= temp; /* L80: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + jc * vr_dim1] *= temp; vr[jr + (jc + 1) * vr_dim1] *= temp; /* L90: */ } } L100: ; } } /* End of eigenvector calculation */ } /* Undo scaling in alpha, beta */ /* Note: this does not give the alpha and beta for the unscaled */ /* problem. */ /* Un-scaling is limited to avoid underflow in alpha and beta */ /* if they are significant. */ i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { absar = (d__1 = alphar[jc], abs(d__1)); absai = (d__1 = alphai[jc], abs(d__1)); absb = (d__1 = beta[jc], abs(d__1)); salfar = anrm * alphar[jc]; salfai = anrm * alphai[jc]; sbeta = bnrm * beta[jc]; ilimit = FALSE_; scale = 1.; /* Check for significant underflow in ALPHAI */ /* Computing MAX */ d__1 = safmin, d__2 = eps * absar, d__1 = max(d__1,d__2), d__2 = eps * absb; if (abs(salfai) < safmin && absai >= max(d__1,d__2)) { ilimit = TRUE_; /* Computing MAX */ d__1 = onepls * safmin, d__2 = anrm2 * absai; scale = onepls * safmin / anrm1 / max(d__1,d__2); } else if (salfai == 0.) { /* If insignificant underflow in ALPHAI, then make the */ /* conjugate eigenvalue real. */ if (alphai[jc] < 0. && jc > 1) { alphai[jc - 1] = 0.; } else if (alphai[jc] > 0. && jc < *n) { alphai[jc + 1] = 0.; } } /* Check for significant underflow in ALPHAR */ /* Computing MAX */ d__1 = safmin, d__2 = eps * absai, d__1 = max(d__1,d__2), d__2 = eps * absb; if (abs(salfar) < safmin && absar >= max(d__1,d__2)) { ilimit = TRUE_; /* Computing MAX */ /* Computing MAX */ d__3 = onepls * safmin, d__4 = anrm2 * absar; d__1 = scale, d__2 = onepls * safmin / anrm1 / max(d__3,d__4); scale = max(d__1,d__2); } /* Check for significant underflow in BETA */ /* Computing MAX */ d__1 = safmin, d__2 = eps * absar, d__1 = max(d__1,d__2), d__2 = eps * absai; if (abs(sbeta) < safmin && absb >= max(d__1,d__2)) { ilimit = TRUE_; /* Computing MAX */ /* Computing MAX */ d__3 = onepls * safmin, d__4 = bnrm2 * absb; d__1 = scale, d__2 = onepls * safmin / bnrm1 / max(d__3,d__4); scale = max(d__1,d__2); } /* Check for possible overflow when limiting scaling */ if (ilimit) { /* Computing MAX */ d__1 = abs(salfar), d__2 = abs(salfai), d__1 = max(d__1,d__2), d__2 = abs(sbeta); temp = scale * safmin * max(d__1,d__2); if (temp > 1.) { scale /= temp; } if (scale < 1.) { ilimit = FALSE_; } } /* Recompute un-scaled ALPHAR, ALPHAI, BETA if necessary. */ if (ilimit) { salfar = scale * alphar[jc] * anrm; salfai = scale * alphai[jc] * anrm; sbeta = scale * beta[jc] * bnrm; } alphar[jc] = salfar; alphai[jc] = salfai; beta[jc] = sbeta; /* L110: */ } L120: work[1] = (doublereal) lwkopt; return 0; /* End of DGEGV */ } /* _starpu_dgegv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgehd2.c000066400000000000000000000136551413463044200205150ustar00rootroot00000000000000/* dgehd2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgehd2_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEHD2 reduces a real general matrix A to upper Hessenberg form H by */ /* an orthogonal similarity transformation: Q' * A * Q = H . */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that A is already upper triangular in rows */ /* and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally */ /* set by a previous call to DGEBAL; otherwise they should be */ /* set to 1 and N respectively. See Further Details. */ /* 1 <= ILO <= IHI <= max(1,N). */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the n by n general matrix to be reduced. */ /* On exit, the upper triangle and the first subdiagonal of A */ /* are overwritten with the upper Hessenberg matrix H, and the */ /* elements below the first subdiagonal, with the array TAU, */ /* represent the orthogonal matrix Q as a product of elementary */ /* reflectors. See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAU (output) DOUBLE PRECISION array, dimension (N-1) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of (ihi-ilo) elementary */ /* reflectors */ /* Q = H(ilo) H(ilo+1) . . . H(ihi-1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on */ /* exit in A(i+2:ihi,i), and tau in TAU(i). */ /* The contents of A are illustrated by the following example, with */ /* n = 7, ilo = 2 and ihi = 6: */ /* on entry, on exit, */ /* ( a a a a a a a ) ( a a h h h h a ) */ /* ( a a a a a a ) ( a h h h h a ) */ /* ( a a a a a a ) ( h h h h h h ) */ /* ( a a a a a a ) ( v2 h h h h h ) */ /* ( a a a a a a ) ( v2 v3 h h h h ) */ /* ( a a a a a a ) ( v2 v3 v4 h h h ) */ /* ( a ) ( a ) */ /* where a denotes an element of the original matrix A, h denotes a */ /* modified element of the upper Hessenberg matrix H, and vi denotes an */ /* element of the vector defining H(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*ilo < 1 || *ilo > max(1,*n)) { *info = -2; } else if (*ihi < min(*ilo,*n) || *ihi > *n) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEHD2", &i__1); return 0; } i__1 = *ihi - 1; for (i__ = *ilo; i__ <= i__1; ++i__) { /* Compute elementary reflector H(i) to annihilate A(i+2:ihi,i) */ i__2 = *ihi - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *n)+ i__ * a_dim1], &c__1, &tau[i__]); aii = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; /* Apply H(i) to A(1:ihi,i+1:ihi) from the right */ i__2 = *ihi - i__; _starpu_dlarf_("Right", ihi, &i__2, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ i__], &a[(i__ + 1) * a_dim1 + 1], lda, &work[1]); /* Apply H(i) to A(i+1:ihi,i+1:n) from the left */ i__2 = *ihi - i__; i__3 = *n - i__; _starpu_dlarf_("Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ i__], &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &work[1]); a[i__ + 1 + i__ * a_dim1] = aii; /* L10: */ } return 0; /* End of DGEHD2 */ } /* _starpu_dgehd2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgehrd.c000066400000000000000000000256671413463044200206230ustar00rootroot00000000000000/* dgehrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static integer c__65 = 65; static doublereal c_b25 = -1.; static doublereal c_b26 = 1.; /* Subroutine */ int _starpu_dgehrd_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j; doublereal t[4160] /* was [65][64] */; integer ib; doublereal ei; integer nb, nh, nx, iws; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_( integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dgehd2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlahr2_( integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEHRD reduces a real general matrix A to upper Hessenberg form H by */ /* an orthogonal similarity transformation: Q' * A * Q = H . */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that A is already upper triangular in rows */ /* and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally */ /* set by a previous call to DGEBAL; otherwise they should be */ /* set to 1 and N respectively. See Further Details. */ /* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N general matrix to be reduced. */ /* On exit, the upper triangle and the first subdiagonal of A */ /* are overwritten with the upper Hessenberg matrix H, and the */ /* elements below the first subdiagonal, with the array TAU, */ /* represent the orthogonal matrix Q as a product of elementary */ /* reflectors. See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAU (output) DOUBLE PRECISION array, dimension (N-1) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). Elements 1:ILO-1 and IHI:N-1 of TAU are set to */ /* zero. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of the array WORK. LWORK >= max(1,N). */ /* For optimum performance LWORK >= N*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of (ihi-ilo) elementary */ /* reflectors */ /* Q = H(ilo) H(ilo+1) . . . H(ihi-1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i) = 0, v(i+1) = 1 and v(ihi+1:n) = 0; v(i+2:ihi) is stored on */ /* exit in A(i+2:ihi,i), and tau in TAU(i). */ /* The contents of A are illustrated by the following example, with */ /* n = 7, ilo = 2 and ihi = 6: */ /* on entry, on exit, */ /* ( a a a a a a a ) ( a a h h h h a ) */ /* ( a a a a a a ) ( a h h h h a ) */ /* ( a a a a a a ) ( h h h h h h ) */ /* ( a a a a a a ) ( v2 h h h h h ) */ /* ( a a a a a a ) ( v2 v3 h h h h ) */ /* ( a a a a a a ) ( v2 v3 v4 h h h ) */ /* ( a ) ( a ) */ /* where a denotes an element of the original matrix A, h denotes a */ /* modified element of the upper Hessenberg matrix H, and vi denotes an */ /* element of the vector defining H(i). */ /* This file is a slight modification of LAPACK-3.0's DGEHRD */ /* subroutine incorporating improvements proposed by Quintana-Orti and */ /* Van de Geijn (2005). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; /* Computing MIN */ i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DGEHRD", " ", n, ilo, ihi, &c_n1); nb = min(i__1,i__2); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*n < 0) { *info = -1; } else if (*ilo < 1 || *ilo > max(1,*n)) { *info = -2; } else if (*ihi < min(*ilo,*n) || *ihi > *n) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*lwork < max(1,*n) && ! lquery) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEHRD", &i__1); return 0; } else if (lquery) { return 0; } /* Set elements 1:ILO-1 and IHI:N-1 of TAU to zero */ i__1 = *ilo - 1; for (i__ = 1; i__ <= i__1; ++i__) { tau[i__] = 0.; /* L10: */ } i__1 = *n - 1; for (i__ = max(1,*ihi); i__ <= i__1; ++i__) { tau[i__] = 0.; /* L20: */ } /* Quick return if possible */ nh = *ihi - *ilo + 1; if (nh <= 1) { work[1] = 1.; return 0; } /* Determine the block size */ /* Computing MIN */ i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DGEHRD", " ", n, ilo, ihi, &c_n1); nb = min(i__1,i__2); nbmin = 2; iws = 1; if (nb > 1 && nb < nh) { /* Determine when to cross over from blocked to unblocked code */ /* (last block is always handled by unblocked code) */ /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__3, "DGEHRD", " ", n, ilo, ihi, &c_n1); nx = max(i__1,i__2); if (nx < nh) { /* Determine if workspace is large enough for blocked code */ iws = *n * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: determine the */ /* minimum value of NB, and reduce NB or force use of */ /* unblocked code */ /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGEHRD", " ", n, ilo, ihi, & c_n1); nbmin = max(i__1,i__2); if (*lwork >= *n * nbmin) { nb = *lwork / *n; } else { nb = 1; } } } } ldwork = *n; if (nb < nbmin || nb >= nh) { /* Use unblocked code below */ i__ = *ilo; } else { /* Use blocked code */ i__1 = *ihi - 1 - nx; i__2 = nb; for (i__ = *ilo; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *ihi - i__; ib = min(i__3,i__4); /* Reduce columns i:i+ib-1 to Hessenberg form, returning the */ /* matrices V and T of the block reflector H = I - V*T*V' */ /* which performs the reduction, and also the matrix Y = A*V*T */ _starpu_dlahr2_(ihi, &i__, &ib, &a[i__ * a_dim1 + 1], lda, &tau[i__], t, & c__65, &work[1], &ldwork); /* Apply the block reflector H to A(1:ihi,i+ib:ihi) from the */ /* right, computing A := A - Y * V'. V(i+ib,ib-1) must be set */ /* to 1 */ ei = a[i__ + ib + (i__ + ib - 1) * a_dim1]; a[i__ + ib + (i__ + ib - 1) * a_dim1] = 1.; i__3 = *ihi - i__ - ib + 1; _starpu_dgemm_("No transpose", "Transpose", ihi, &i__3, &ib, &c_b25, & work[1], &ldwork, &a[i__ + ib + i__ * a_dim1], lda, & c_b26, &a[(i__ + ib) * a_dim1 + 1], lda); a[i__ + ib + (i__ + ib - 1) * a_dim1] = ei; /* Apply the block reflector H to A(1:i,i+1:i+ib-1) from the */ /* right */ i__3 = ib - 1; _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &i__, &i__3, &c_b26, &a[i__ + 1 + i__ * a_dim1], lda, &work[1], &ldwork); i__3 = ib - 2; for (j = 0; j <= i__3; ++j) { _starpu_daxpy_(&i__, &c_b25, &work[ldwork * j + 1], &c__1, &a[(i__ + j + 1) * a_dim1 + 1], &c__1); /* L30: */ } /* Apply the block reflector H to A(i+1:ihi,i+ib:n) from the */ /* left */ i__3 = *ihi - i__; i__4 = *n - i__ - ib + 1; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__3, & i__4, &ib, &a[i__ + 1 + i__ * a_dim1], lda, t, &c__65, &a[ i__ + 1 + (i__ + ib) * a_dim1], lda, &work[1], &ldwork); /* L40: */ } } /* Use unblocked code to reduce the rest of the matrix */ _starpu_dgehd2_(n, &i__, ihi, &a[a_offset], lda, &tau[1], &work[1], &iinfo); work[1] = (doublereal) iws; return 0; /* End of DGEHRD */ } /* _starpu_dgehrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgejsv.c000066400000000000000000002336171413463044200206440ustar00rootroot00000000000000/* dgejsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b34 = 0.; static doublereal c_b35 = 1.; static integer c__0 = 0; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgejsv_(char *joba, char *jobu, char *jobv, char *jobr, char *jobt, char *jobp, integer *m, integer *n, doublereal *a, integer *lda, doublereal *sva, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *work, integer *lwork, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, u_dim1, u_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7, i__8, i__9, i__10; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal), log(doublereal), d_sign(doublereal *, doublereal *); integer i_dnnt(doublereal *); /* Local variables */ integer p, q, n1, nr; doublereal big, xsc, big1; logical defr; doublereal aapp, aaqq; logical kill; integer ierr; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp1; logical jracc; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal small, entra, sfmin; logical lsvec; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal epsln; logical rsvec; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical l2aber; extern /* Subroutine */ int _starpu_dgeqp3_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal condr1, condr2, uscal1, uscal2; logical l2kill, l2rank, l2tran, l2pert; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal scalem; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal sconda; logical goscal; doublereal aatmin; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal aatmax; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical noscal; extern /* Subroutine */ int _starpu_dpocon_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dgesvj_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); doublereal entrat; logical almort; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal maxprj; logical errest; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical transp, rowpiv; doublereal cond_ok__; integer warning, numrank; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Zlatko Drmac of the University of Zagreb and -- */ /* -- Kresimir Veselic of the Fernuniversitaet Hagen -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* This routine is also part of SIGMA (version 1.23, October 23. 2008.) */ /* SIGMA is a library of algorithms for highly accurate algorithms for */ /* computation of SVD, PSVD, QSVD, (H,K)-SVD, and for solution of the */ /* eigenvalue problems Hx = lambda M x, H M x = lambda x with H, M > 0. */ /* -#- Scalar Arguments -#- */ /* -#- Array Arguments -#- */ /* .. */ /* Purpose */ /* ~~~~~~~ */ /* DGEJSV computes the singular value decomposition (SVD) of a real M-by-N */ /* matrix [A], where M >= N. The SVD of [A] is written as */ /* [A] = [U] * [SIGMA] * [V]^t, */ /* where [SIGMA] is an N-by-N (M-by-N) matrix which is zero except for its N */ /* diagonal elements, [U] is an M-by-N (or M-by-M) orthonormal matrix, and */ /* [V] is an N-by-N orthogonal matrix. The diagonal elements of [SIGMA] are */ /* the singular values of [A]. The columns of [U] and [V] are the left and */ /* the right singular vectors of [A], respectively. The matrices [U] and [V] */ /* are computed and stored in the arrays U and V, respectively. The diagonal */ /* of [SIGMA] is computed and stored in the array SVA. */ /* Further details */ /* ~~~~~~~~~~~~~~~ */ /* DGEJSV implements a preconditioned Jacobi SVD algorithm. It uses SGEQP3, */ /* SGEQRF, and SGELQF as preprocessors and preconditioners. Optionally, an */ /* additional row pivoting can be used as a preprocessor, which in some */ /* cases results in much higher accuracy. An example is matrix A with the */ /* structure A = D1 * C * D2, where D1, D2 are arbitrarily ill-conditioned */ /* diagonal matrices and C is well-conditioned matrix. In that case, complete */ /* pivoting in the first QR factorizations provides accuracy dependent on the */ /* condition number of C, and independent of D1, D2. Such higher accuracy is */ /* not completely understood theoretically, but it works well in practice. */ /* Further, if A can be written as A = B*D, with well-conditioned B and some */ /* diagonal D, then the high accuracy is guaranteed, both theoretically and */ /* in software, independent of D. For more details see [1], [2]. */ /* The computational range for the singular values can be the full range */ /* ( UNDERFLOW,OVERFLOW ), provided that the machine arithmetic and the BLAS */ /* & LAPACK routines called by DGEJSV are implemented to work in that range. */ /* If that is not the case, then the restriction for safe computation with */ /* the singular values in the range of normalized IEEE numbers is that the */ /* spectral condition number kappa(A)=sigma_max(A)/sigma_min(A) does not */ /* overflow. This code (DGEJSV) is best used in this restricted range, */ /* meaning that singular values of magnitude below ||A||_2 / SLAMCH('O') are */ /* returned as zeros. See JOBR for details on this. */ /* Further, this implementation is somewhat slower than the one described */ /* in [1,2] due to replacement of some non-LAPACK components, and because */ /* the choice of some tuning parameters in the iterative part (DGESVJ) is */ /* left to the implementer on a particular machine. */ /* The rank revealing QR factorization (in this code: SGEQP3) should be */ /* implemented as in [3]. We have a new version of SGEQP3 under development */ /* that is more robust than the current one in LAPACK, with a cleaner cut in */ /* rank defficient cases. It will be available in the SIGMA library [4]. */ /* If M is much larger than N, it is obvious that the inital QRF with */ /* column pivoting can be preprocessed by the QRF without pivoting. That */ /* well known trick is not used in DGEJSV because in some cases heavy row */ /* weighting can be treated with complete pivoting. The overhead in cases */ /* M much larger than N is then only due to pivoting, but the benefits in */ /* terms of accuracy have prevailed. The implementer/user can incorporate */ /* this extra QRF step easily. The implementer can also improve data movement */ /* (matrix transpose, matrix copy, matrix transposed copy) - this */ /* implementation of DGEJSV uses only the simplest, naive data movement. */ /* Contributors */ /* ~~~~~~~~~~~~ */ /* Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany) */ /* References */ /* ~~~~~~~~~~ */ /* [1] Z. Drmac and K. Veselic: New fast and accurate Jacobi SVD algorithm I. */ /* SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp. 1322-1342. */ /* LAPACK Working note 169. */ /* [2] Z. Drmac and K. Veselic: New fast and accurate Jacobi SVD algorithm II. */ /* SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp. 1343-1362. */ /* LAPACK Working note 170. */ /* [3] Z. Drmac and Z. Bujanovic: On the failure of rank-revealing QR */ /* factorization software - a case study. */ /* ACM Trans. Math. Softw. Vol. 35, No 2 (2008), pp. 1-28. */ /* LAPACK Working note 176. */ /* [4] Z. Drmac: SIGMA - mathematical software library for accurate SVD, PSV, */ /* QSVD, (H,K)-SVD computations. */ /* Department of Mathematics, University of Zagreb, 2008. */ /* Bugs, examples and comments */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* Please report all bugs and send interesting examples and/or comments to */ /* drmac@math.hr. Thank you. */ /* Arguments */ /* ~~~~~~~~~ */ /* ............................................................................ */ /* . JOBA (input) CHARACTER*1 */ /* . Specifies the level of accuracy: */ /* . = 'C': This option works well (high relative accuracy) if A = B * D, */ /* . with well-conditioned B and arbitrary diagonal matrix D. */ /* . The accuracy cannot be spoiled by COLUMN scaling. The */ /* . accuracy of the computed output depends on the condition of */ /* . B, and the procedure aims at the best theoretical accuracy. */ /* . The relative error max_{i=1:N}|d sigma_i| / sigma_i is */ /* . bounded by f(M,N)*epsilon* cond(B), independent of D. */ /* . The input matrix is preprocessed with the QRF with column */ /* . pivoting. This initial preprocessing and preconditioning by */ /* . a rank revealing QR factorization is common for all values of */ /* . JOBA. Additional actions are specified as follows: */ /* . = 'E': Computation as with 'C' with an additional estimate of the */ /* . condition number of B. It provides a realistic error bound. */ /* . = 'F': If A = D1 * C * D2 with ill-conditioned diagonal scalings */ /* . D1, D2, and well-conditioned matrix C, this option gives */ /* . higher accuracy than the 'C' option. If the structure of the */ /* . input matrix is not known, and relative accuracy is */ /* . desirable, then this option is advisable. The input matrix A */ /* . is preprocessed with QR factorization with FULL (row and */ /* . column) pivoting. */ /* . = 'G' Computation as with 'F' with an additional estimate of the */ /* . condition number of B, where A=D*B. If A has heavily weighted */ /* . rows, then using this condition number gives too pessimistic */ /* . error bound. */ /* . = 'A': Small singular values are the noise and the matrix is treated */ /* . as numerically rank defficient. The error in the computed */ /* . singular values is bounded by f(m,n)*epsilon*||A||. */ /* . The computed SVD A = U * S * V^t restores A up to */ /* . f(m,n)*epsilon*||A||. */ /* . This gives the procedure the licence to discard (set to zero) */ /* . all singular values below N*epsilon*||A||. */ /* . = 'R': Similar as in 'A'. Rank revealing property of the initial */ /* . QR factorization is used do reveal (using triangular factor) */ /* . a gap sigma_{r+1} < epsilon * sigma_r in which case the */ /* . numerical RANK is declared to be r. The SVD is computed with */ /* . absolute error bounds, but more accurately than with 'A'. */ /* . */ /* . JOBU (input) CHARACTER*1 */ /* . Specifies whether to compute the columns of U: */ /* . = 'U': N columns of U are returned in the array U. */ /* . = 'F': full set of M left sing. vectors is returned in the array U. */ /* . = 'W': U may be used as workspace of length M*N. See the description */ /* . of U. */ /* . = 'N': U is not computed. */ /* . */ /* . JOBV (input) CHARACTER*1 */ /* . Specifies whether to compute the matrix V: */ /* . = 'V': N columns of V are returned in the array V; Jacobi rotations */ /* . are not explicitly accumulated. */ /* . = 'J': N columns of V are returned in the array V, but they are */ /* . computed as the product of Jacobi rotations. This option is */ /* . allowed only if JOBU .NE. 'N', i.e. in computing the full SVD. */ /* . = 'W': V may be used as workspace of length N*N. See the description */ /* . of V. */ /* . = 'N': V is not computed. */ /* . */ /* . JOBR (input) CHARACTER*1 */ /* . Specifies the RANGE for the singular values. Issues the licence to */ /* . set to zero small positive singular values if they are outside */ /* . specified range. If A .NE. 0 is scaled so that the largest singular */ /* . value of c*A is around DSQRT(BIG), BIG=SLAMCH('O'), then JOBR issues */ /* . the licence to kill columns of A whose norm in c*A is less than */ /* . DSQRT(SFMIN) (for JOBR.EQ.'R'), or less than SMALL=SFMIN/EPSLN, */ /* . where SFMIN=SLAMCH('S'), EPSLN=SLAMCH('E'). */ /* . = 'N': Do not kill small columns of c*A. This option assumes that */ /* . BLAS and QR factorizations and triangular solvers are */ /* . implemented to work in that range. If the condition of A */ /* . is greater than BIG, use DGESVJ. */ /* . = 'R': RESTRICTED range for sigma(c*A) is [DSQRT(SFMIN), DSQRT(BIG)] */ /* . (roughly, as described above). This option is recommended. */ /* . ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* . For computing the singular values in the FULL range [SFMIN,BIG] */ /* . use DGESVJ. */ /* . */ /* . JOBT (input) CHARACTER*1 */ /* . If the matrix is square then the procedure may determine to use */ /* . transposed A if A^t seems to be better with respect to convergence. */ /* . If the matrix is not square, JOBT is ignored. This is subject to */ /* . changes in the future. */ /* . The decision is based on two values of entropy over the adjoint */ /* . orbit of A^t * A. See the descriptions of WORK(6) and WORK(7). */ /* . = 'T': transpose if entropy test indicates possibly faster */ /* . convergence of Jacobi process if A^t is taken as input. If A is */ /* . replaced with A^t, then the row pivoting is included automatically. */ /* . = 'N': do not speculate. */ /* . This option can be used to compute only the singular values, or the */ /* . full SVD (U, SIGMA and V). For only one set of singular vectors */ /* . (U or V), the caller should provide both U and V, as one of the */ /* . matrices is used as workspace if the matrix A is transposed. */ /* . The implementer can easily remove this constraint and make the */ /* . code more complicated. See the descriptions of U and V. */ /* . */ /* . JOBP (input) CHARACTER*1 */ /* . Issues the licence to introduce structured perturbations to drown */ /* . denormalized numbers. This licence should be active if the */ /* . denormals are poorly implemented, causing slow computation, */ /* . especially in cases of fast convergence (!). For details see [1,2]. */ /* . For the sake of simplicity, this perturbations are included only */ /* . when the full SVD or only the singular values are requested. The */ /* . implementer/user can easily add the perturbation for the cases of */ /* . computing one set of singular vectors. */ /* . = 'P': introduce perturbation */ /* . = 'N': do not perturb */ /* ............................................................................ */ /* M (input) INTEGER */ /* The number of rows of the input matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the input matrix A. M >= N >= 0. */ /* A (input/workspace) REAL array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* SVA (workspace/output) REAL array, dimension (N) */ /* On exit, */ /* - For WORK(1)/WORK(2) = ONE: The singular values of A. During the */ /* computation SVA contains Euclidean column norms of the */ /* iterated matrices in the array A. */ /* - For WORK(1) .NE. WORK(2): The singular values of A are */ /* (WORK(1)/WORK(2)) * SVA(1:N). This factored form is used if */ /* sigma_max(A) overflows or if small singular values have been */ /* saved from underflow by scaling the input matrix A. */ /* - If JOBR='R' then some of the singular values may be returned */ /* as exact zeros obtained by "set to zero" because they are */ /* below the numerical rank threshold or are denormalized numbers. */ /* U (workspace/output) REAL array, dimension ( LDU, N ) */ /* If JOBU = 'U', then U contains on exit the M-by-N matrix of */ /* the left singular vectors. */ /* If JOBU = 'F', then U contains on exit the M-by-M matrix of */ /* the left singular vectors, including an ONB */ /* of the orthogonal complement of the Range(A). */ /* If JOBU = 'W' .AND. (JOBV.EQ.'V' .AND. JOBT.EQ.'T' .AND. M.EQ.N), */ /* then U is used as workspace if the procedure */ /* replaces A with A^t. In that case, [V] is computed */ /* in U as left singular vectors of A^t and then */ /* copied back to the V array. This 'W' option is just */ /* a reminder to the caller that in this case U is */ /* reserved as workspace of length N*N. */ /* If JOBU = 'N' U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U, LDU >= 1. */ /* IF JOBU = 'U' or 'F' or 'W', then LDU >= M. */ /* V (workspace/output) REAL array, dimension ( LDV, N ) */ /* If JOBV = 'V', 'J' then V contains on exit the N-by-N matrix of */ /* the right singular vectors; */ /* If JOBV = 'W', AND (JOBU.EQ.'U' AND JOBT.EQ.'T' AND M.EQ.N), */ /* then V is used as workspace if the pprocedure */ /* replaces A with A^t. In that case, [U] is computed */ /* in V as right singular vectors of A^t and then */ /* copied back to the U array. This 'W' option is just */ /* a reminder to the caller that in this case V is */ /* reserved as workspace of length N*N. */ /* If JOBV = 'N' V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V, LDV >= 1. */ /* If JOBV = 'V' or 'J' or 'W', then LDV >= N. */ /* WORK (workspace/output) REAL array, dimension at least LWORK. */ /* On exit, */ /* WORK(1) = SCALE = WORK(2) / WORK(1) is the scaling factor such */ /* that SCALE*SVA(1:N) are the computed singular values */ /* of A. (See the description of SVA().) */ /* WORK(2) = See the description of WORK(1). */ /* WORK(3) = SCONDA is an estimate for the condition number of */ /* column equilibrated A. (If JOBA .EQ. 'E' or 'G') */ /* SCONDA is an estimate of DSQRT(||(R^t * R)^(-1)||_1). */ /* It is computed using DPOCON. It holds */ /* N^(-1/4) * SCONDA <= ||R^(-1)||_2 <= N^(1/4) * SCONDA */ /* where R is the triangular factor from the QRF of A. */ /* However, if R is truncated and the numerical rank is */ /* determined to be strictly smaller than N, SCONDA is */ /* returned as -1, thus indicating that the smallest */ /* singular values might be lost. */ /* If full SVD is needed, the following two condition numbers are */ /* useful for the analysis of the algorithm. They are provied for */ /* a developer/implementer who is familiar with the details of */ /* the method. */ /* WORK(4) = an estimate of the scaled condition number of the */ /* triangular factor in the first QR factorization. */ /* WORK(5) = an estimate of the scaled condition number of the */ /* triangular factor in the second QR factorization. */ /* The following two parameters are computed if JOBT .EQ. 'T'. */ /* They are provided for a developer/implementer who is familiar */ /* with the details of the method. */ /* WORK(6) = the entropy of A^t*A :: this is the Shannon entropy */ /* of diag(A^t*A) / Trace(A^t*A) taken as point in the */ /* probability simplex. */ /* WORK(7) = the entropy of A*A^t. */ /* LWORK (input) INTEGER */ /* Length of WORK to confirm proper allocation of work space. */ /* LWORK depends on the job: */ /* If only SIGMA is needed ( JOBU.EQ.'N', JOBV.EQ.'N' ) and */ /* -> .. no scaled condition estimate required ( JOBE.EQ.'N'): */ /* LWORK >= max(2*M+N,4*N+1,7). This is the minimal requirement. */ /* For optimal performance (blocked code) the optimal value */ /* is LWORK >= max(2*M+N,3*N+(N+1)*NB,7). Here NB is the optimal */ /* block size for xGEQP3/xGEQRF. */ /* -> .. an estimate of the scaled condition number of A is */ /* required (JOBA='E', 'G'). In this case, LWORK is the maximum */ /* of the above and N*N+4*N, i.e. LWORK >= max(2*M+N,N*N+4N,7). */ /* If SIGMA and the right singular vectors are needed (JOBV.EQ.'V'), */ /* -> the minimal requirement is LWORK >= max(2*N+M,7). */ /* -> For optimal performance, LWORK >= max(2*N+M,2*N+N*NB,7), */ /* where NB is the optimal block size. */ /* If SIGMA and the left singular vectors are needed */ /* -> the minimal requirement is LWORK >= max(2*N+M,7). */ /* -> For optimal performance, LWORK >= max(2*N+M,2*N+N*NB,7), */ /* where NB is the optimal block size. */ /* If full SVD is needed ( JOBU.EQ.'U' or 'F', JOBV.EQ.'V' ) and */ /* -> .. the singular vectors are computed without explicit */ /* accumulation of the Jacobi rotations, LWORK >= 6*N+2*N*N */ /* -> .. in the iterative part, the Jacobi rotations are */ /* explicitly accumulated (option, see the description of JOBV), */ /* then the minimal requirement is LWORK >= max(M+3*N+N*N,7). */ /* For better performance, if NB is the optimal block size, */ /* LWORK >= max(3*N+N*N+M,3*N+N*N+N*NB,7). */ /* IWORK (workspace/output) INTEGER array, dimension M+3*N. */ /* On exit, */ /* IWORK(1) = the numerical rank determined after the initial */ /* QR factorization with pivoting. See the descriptions */ /* of JOBA and JOBR. */ /* IWORK(2) = the number of the computed nonzero singular values */ /* IWORK(3) = if nonzero, a warning message: */ /* If IWORK(3).EQ.1 then some of the column norms of A */ /* were denormalized floats. The requested high accuracy */ /* is not warranted by the data. */ /* INFO (output) INTEGER */ /* < 0 : if INFO = -i, then the i-th argument had an illegal value. */ /* = 0 : successfull exit; */ /* > 0 : DGEJSV did not converge in the maximal allowed number */ /* of sweeps. The computed values may be inaccurate. */ /* ............................................................................ */ /* Local Parameters: */ /* Local Scalars: */ /* Intrinsic Functions: */ /* External Functions: */ /* External Subroutines ( BLAS, LAPACK ): */ /* ............................................................................ */ /* Test the input arguments */ /* Parameter adjustments */ --sva; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --work; --iwork; /* Function Body */ lsvec = _starpu_lsame_(jobu, "U") || _starpu_lsame_(jobu, "F"); jracc = _starpu_lsame_(jobv, "J"); rsvec = _starpu_lsame_(jobv, "V") || jracc; rowpiv = _starpu_lsame_(joba, "F") || _starpu_lsame_(joba, "G"); l2rank = _starpu_lsame_(joba, "R"); l2aber = _starpu_lsame_(joba, "A"); errest = _starpu_lsame_(joba, "E") || _starpu_lsame_(joba, "G"); l2tran = _starpu_lsame_(jobt, "T"); l2kill = _starpu_lsame_(jobr, "R"); defr = _starpu_lsame_(jobr, "N"); l2pert = _starpu_lsame_(jobp, "P"); if (! (rowpiv || l2rank || l2aber || errest || _starpu_lsame_(joba, "C"))) { *info = -1; } else if (! (lsvec || _starpu_lsame_(jobu, "N") || _starpu_lsame_( jobu, "W"))) { *info = -2; } else if (! (rsvec || _starpu_lsame_(jobv, "N") || _starpu_lsame_( jobv, "W")) || jracc && ! lsvec) { *info = -3; } else if (! (l2kill || defr)) { *info = -4; } else if (! (l2tran || _starpu_lsame_(jobt, "N"))) { *info = -5; } else if (! (l2pert || _starpu_lsame_(jobp, "N"))) { *info = -6; } else if (*m < 0) { *info = -7; } else if (*n < 0 || *n > *m) { *info = -8; } else if (*lda < *m) { *info = -10; } else if (lsvec && *ldu < *m) { *info = -13; } else if (rsvec && *ldv < *n) { *info = -14; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 7, i__2 = (*n << 2) + 1, i__1 = max(i__1,i__2), i__2 = (*m << 1) + *n; /* Computing MAX */ i__3 = 7, i__4 = (*n << 2) + *n * *n, i__3 = max(i__3,i__4), i__4 = (* m << 1) + *n; /* Computing MAX */ i__5 = 7, i__6 = (*n << 1) + *m; /* Computing MAX */ i__7 = 7, i__8 = (*n << 1) + *m; /* Computing MAX */ i__9 = 7, i__10 = *m + *n * 3 + *n * *n; if (! (lsvec || rsvec || errest) && *lwork < max(i__1,i__2) || ! ( lsvec || lsvec) && errest && *lwork < max(i__3,i__4) || lsvec && ! rsvec && *lwork < max(i__5,i__6) || rsvec && ! lsvec && * lwork < max(i__7,i__8) || lsvec && rsvec && ! jracc && *lwork < *n * 6 + (*n << 1) * *n || lsvec && rsvec && jracc && * lwork < max(i__9,i__10)) { *info = -17; } else { /* #:) */ *info = 0; } } if (*info != 0) { /* #:( */ i__1 = -(*info); _starpu_xerbla_("DGEJSV", &i__1); } /* Quick return for void matrix (Y3K safe) */ /* #:) */ if (*m == 0 || *n == 0) { return 0; } /* Determine whether the matrix U should be M x N or M x M */ if (lsvec) { n1 = *n; if (_starpu_lsame_(jobu, "F")) { n1 = *m; } } /* Set numerical parameters */ /* ! NOTE: Make sure DLAMCH() does not fail on the target architecture. */ epsln = _starpu_dlamch_("Epsilon"); sfmin = _starpu_dlamch_("SafeMinimum"); small = sfmin / epsln; big = _starpu_dlamch_("O"); /* BIG = ONE / SFMIN */ /* Initialize SVA(1:N) = diag( ||A e_i||_2 )_1^N */ /* (!) If necessary, scale SVA() to protect the largest norm from */ /* overflow. It is possible that this scaling pushes the smallest */ /* column norm left from the underflow threshold (extreme case). */ scalem = 1. / sqrt((doublereal) (*m) * (doublereal) (*n)); noscal = TRUE_; goscal = TRUE_; i__1 = *n; for (p = 1; p <= i__1; ++p) { aapp = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], &c__1, &aapp, &aaqq); if (aapp > big) { *info = -9; i__2 = -(*info); _starpu_xerbla_("DGEJSV", &i__2); return 0; } aaqq = sqrt(aaqq); if (aapp < big / aaqq && noscal) { sva[p] = aapp * aaqq; } else { noscal = FALSE_; sva[p] = aapp * (aaqq * scalem); if (goscal) { goscal = FALSE_; i__2 = p - 1; _starpu_dscal_(&i__2, &scalem, &sva[1], &c__1); } } /* L1874: */ } if (noscal) { scalem = 1.; } aapp = 0.; aaqq = big; i__1 = *n; for (p = 1; p <= i__1; ++p) { /* Computing MAX */ d__1 = aapp, d__2 = sva[p]; aapp = max(d__1,d__2); if (sva[p] != 0.) { /* Computing MIN */ d__1 = aaqq, d__2 = sva[p]; aaqq = min(d__1,d__2); } /* L4781: */ } /* Quick return for zero M x N matrix */ /* #:) */ if (aapp == 0.) { if (lsvec) { _starpu_dlaset_("G", m, &n1, &c_b34, &c_b35, &u[u_offset], ldu) ; } if (rsvec) { _starpu_dlaset_("G", n, n, &c_b34, &c_b35, &v[v_offset], ldv); } work[1] = 1.; work[2] = 1.; if (errest) { work[3] = 1.; } if (lsvec && rsvec) { work[4] = 1.; work[5] = 1.; } if (l2tran) { work[6] = 0.; work[7] = 0.; } iwork[1] = 0; iwork[2] = 0; return 0; } /* Issue warning if denormalized column norms detected. Override the */ /* high relative accuracy request. Issue licence to kill columns */ /* (set them to zero) whose norm is less than sigma_max / BIG (roughly). */ /* #:( */ warning = 0; if (aaqq <= sfmin) { l2rank = TRUE_; l2kill = TRUE_; warning = 1; } /* Quick return for one-column matrix */ /* #:) */ if (*n == 1) { if (lsvec) { _starpu_dlascl_("G", &c__0, &c__0, &sva[1], &scalem, m, &c__1, &a[a_dim1 + 1], lda, &ierr); _starpu_dlacpy_("A", m, &c__1, &a[a_offset], lda, &u[u_offset], ldu); /* computing all M left singular vectors of the M x 1 matrix */ if (n1 != *n) { i__1 = *lwork - *n; _starpu_dgeqrf_(m, n, &u[u_offset], ldu, &work[1], &work[*n + 1], & i__1, &ierr); i__1 = *lwork - *n; _starpu_dorgqr_(m, &n1, &c__1, &u[u_offset], ldu, &work[1], &work[*n + 1], &i__1, &ierr); _starpu_dcopy_(m, &a[a_dim1 + 1], &c__1, &u[u_dim1 + 1], &c__1); } } if (rsvec) { v[v_dim1 + 1] = 1.; } if (sva[1] < big * scalem) { sva[1] /= scalem; scalem = 1.; } work[1] = 1. / scalem; work[2] = 1.; if (sva[1] != 0.) { iwork[1] = 1; if (sva[1] / scalem >= sfmin) { iwork[2] = 1; } else { iwork[2] = 0; } } else { iwork[1] = 0; iwork[2] = 0; } if (errest) { work[3] = 1.; } if (lsvec && rsvec) { work[4] = 1.; work[5] = 1.; } if (l2tran) { work[6] = 0.; work[7] = 0.; } return 0; } transp = FALSE_; l2tran = l2tran && *m == *n; aatmax = -1.; aatmin = big; if (rowpiv || l2tran) { /* Compute the row norms, needed to determine row pivoting sequence */ /* (in the case of heavily row weighted A, row pivoting is strongly */ /* advised) and to collect information needed to compare the */ /* structures of A * A^t and A^t * A (in the case L2TRAN.EQ..TRUE.). */ if (l2tran) { i__1 = *m; for (p = 1; p <= i__1; ++p) { xsc = 0.; temp1 = 0.; _starpu_dlassq_(n, &a[p + a_dim1], lda, &xsc, &temp1); /* DLASSQ gets both the ell_2 and the ell_infinity norm */ /* in one pass through the vector */ work[*m + *n + p] = xsc * scalem; work[*n + p] = xsc * (scalem * sqrt(temp1)); /* Computing MAX */ d__1 = aatmax, d__2 = work[*n + p]; aatmax = max(d__1,d__2); if (work[*n + p] != 0.) { /* Computing MIN */ d__1 = aatmin, d__2 = work[*n + p]; aatmin = min(d__1,d__2); } /* L1950: */ } } else { i__1 = *m; for (p = 1; p <= i__1; ++p) { work[*m + *n + p] = scalem * (d__1 = a[p + _starpu_idamax_(n, &a[p + a_dim1], lda) * a_dim1], abs(d__1)); /* Computing MAX */ d__1 = aatmax, d__2 = work[*m + *n + p]; aatmax = max(d__1,d__2); /* Computing MIN */ d__1 = aatmin, d__2 = work[*m + *n + p]; aatmin = min(d__1,d__2); /* L1904: */ } } } /* For square matrix A try to determine whether A^t would be better */ /* input for the preconditioned Jacobi SVD, with faster convergence. */ /* The decision is based on an O(N) function of the vector of column */ /* and row norms of A, based on the Shannon entropy. This should give */ /* the right choice in most cases when the difference actually matters. */ /* It may fail and pick the slower converging side. */ entra = 0.; entrat = 0.; if (l2tran) { xsc = 0.; temp1 = 0.; _starpu_dlassq_(n, &sva[1], &c__1, &xsc, &temp1); temp1 = 1. / temp1; entra = 0.; i__1 = *n; for (p = 1; p <= i__1; ++p) { /* Computing 2nd power */ d__1 = sva[p] / xsc; big1 = d__1 * d__1 * temp1; if (big1 != 0.) { entra += big1 * log(big1); } /* L1113: */ } entra = -entra / log((doublereal) (*n)); /* Now, SVA().^2/Trace(A^t * A) is a point in the probability simplex. */ /* It is derived from the diagonal of A^t * A. Do the same with the */ /* diagonal of A * A^t, compute the entropy of the corresponding */ /* probability distribution. Note that A * A^t and A^t * A have the */ /* same trace. */ entrat = 0.; i__1 = *n + *m; for (p = *n + 1; p <= i__1; ++p) { /* Computing 2nd power */ d__1 = work[p] / xsc; big1 = d__1 * d__1 * temp1; if (big1 != 0.) { entrat += big1 * log(big1); } /* L1114: */ } entrat = -entrat / log((doublereal) (*m)); /* Analyze the entropies and decide A or A^t. Smaller entropy */ /* usually means better input for the algorithm. */ transp = entrat < entra; /* If A^t is better than A, transpose A. */ if (transp) { /* In an optimal implementation, this trivial transpose */ /* should be replaced with faster transpose. */ i__1 = *n - 1; for (p = 1; p <= i__1; ++p) { i__2 = *n; for (q = p + 1; q <= i__2; ++q) { temp1 = a[q + p * a_dim1]; a[q + p * a_dim1] = a[p + q * a_dim1]; a[p + q * a_dim1] = temp1; /* L1116: */ } /* L1115: */ } i__1 = *n; for (p = 1; p <= i__1; ++p) { work[*m + *n + p] = sva[p]; sva[p] = work[*n + p]; /* L1117: */ } temp1 = aapp; aapp = aatmax; aatmax = temp1; temp1 = aaqq; aaqq = aatmin; aatmin = temp1; kill = lsvec; lsvec = rsvec; rsvec = kill; rowpiv = TRUE_; } } /* END IF L2TRAN */ /* Scale the matrix so that its maximal singular value remains less */ /* than DSQRT(BIG) -- the matrix is scaled so that its maximal column */ /* has Euclidean norm equal to DSQRT(BIG/N). The only reason to keep */ /* DSQRT(BIG) instead of BIG is the fact that DGEJSV uses LAPACK and */ /* BLAS routines that, in some implementations, are not capable of */ /* working in the full interval [SFMIN,BIG] and that they may provoke */ /* overflows in the intermediate results. If the singular values spread */ /* from SFMIN to BIG, then DGESVJ will compute them. So, in that case, */ /* one should use DGESVJ instead of DGEJSV. */ big1 = sqrt(big); temp1 = sqrt(big / (doublereal) (*n)); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &temp1, n, &c__1, &sva[1], n, &ierr); if (aaqq > aapp * sfmin) { aaqq = aaqq / aapp * temp1; } else { aaqq = aaqq * temp1 / aapp; } temp1 *= scalem; _starpu_dlascl_("G", &c__0, &c__0, &aapp, &temp1, m, n, &a[a_offset], lda, &ierr); /* To undo scaling at the end of this procedure, multiply the */ /* computed singular values with USCAL2 / USCAL1. */ uscal1 = temp1; uscal2 = aapp; if (l2kill) { /* L2KILL enforces computation of nonzero singular values in */ /* the restricted range of condition number of the initial A, */ /* sigma_max(A) / sigma_min(A) approx. DSQRT(BIG)/DSQRT(SFMIN). */ xsc = sqrt(sfmin); } else { xsc = small; /* Now, if the condition number of A is too big, */ /* sigma_max(A) / sigma_min(A) .GT. DSQRT(BIG/N) * EPSLN / SFMIN, */ /* as a precaution measure, the full SVD is computed using DGESVJ */ /* with accumulated Jacobi rotations. This provides numerically */ /* more robust computation, at the cost of slightly increased run */ /* time. Depending on the concrete implementation of BLAS and LAPACK */ /* (i.e. how they behave in presence of extreme ill-conditioning) the */ /* implementor may decide to remove this switch. */ if (aaqq < sqrt(sfmin) && lsvec && rsvec) { jracc = TRUE_; } } if (aaqq < xsc) { i__1 = *n; for (p = 1; p <= i__1; ++p) { if (sva[p] < xsc) { _starpu_dlaset_("A", m, &c__1, &c_b34, &c_b34, &a[p * a_dim1 + 1], lda); sva[p] = 0.; } /* L700: */ } } /* Preconditioning using QR factorization with pivoting */ if (rowpiv) { /* Optional row permutation (Bjoerck row pivoting): */ /* A result by Cox and Higham shows that the Bjoerck's */ /* row pivoting combined with standard column pivoting */ /* has similar effect as Powell-Reid complete pivoting. */ /* The ell-infinity norms of A are made nonincreasing. */ i__1 = *m - 1; for (p = 1; p <= i__1; ++p) { i__2 = *m - p + 1; q = _starpu_idamax_(&i__2, &work[*m + *n + p], &c__1) + p - 1; iwork[(*n << 1) + p] = q; if (p != q) { temp1 = work[*m + *n + p]; work[*m + *n + p] = work[*m + *n + q]; work[*m + *n + q] = temp1; } /* L1952: */ } i__1 = *m - 1; _starpu_dlaswp_(n, &a[a_offset], lda, &c__1, &i__1, &iwork[(*n << 1) + 1], & c__1); } /* End of the preparation phase (scaling, optional sorting and */ /* transposing, optional flushing of small columns). */ /* Preconditioning */ /* If the full SVD is needed, the right singular vectors are computed */ /* from a matrix equation, and for that we need theoretical analysis */ /* of the Businger-Golub pivoting. So we use DGEQP3 as the first RR QRF. */ /* In all other cases the first RR QRF can be chosen by other criteria */ /* (eg speed by replacing global with restricted window pivoting, such */ /* as in SGEQPX from TOMS # 782). Good results will be obtained using */ /* SGEQPX with properly (!) chosen numerical parameters. */ /* Any improvement of DGEQP3 improves overal performance of DGEJSV. */ /* A * P1 = Q1 * [ R1^t 0]^t: */ i__1 = *n; for (p = 1; p <= i__1; ++p) { /* .. all columns are free columns */ iwork[p] = 0; /* L1963: */ } i__1 = *lwork - *n; _starpu_dgeqp3_(m, n, &a[a_offset], lda, &iwork[1], &work[1], &work[*n + 1], & i__1, &ierr); /* The upper triangular matrix R1 from the first QRF is inspected for */ /* rank deficiency and possibilities for deflation, or possible */ /* ill-conditioning. Depending on the user specified flag L2RANK, */ /* the procedure explores possibilities to reduce the numerical */ /* rank by inspecting the computed upper triangular factor. If */ /* L2RANK or L2ABER are up, then DGEJSV will compute the SVD of */ /* A + dA, where ||dA|| <= f(M,N)*EPSLN. */ nr = 1; if (l2aber) { /* Standard absolute error bound suffices. All sigma_i with */ /* sigma_i < N*EPSLN*||A|| are flushed to zero. This is an */ /* agressive enforcement of lower numerical rank by introducing a */ /* backward error of the order of N*EPSLN*||A||. */ temp1 = sqrt((doublereal) (*n)) * epsln; i__1 = *n; for (p = 2; p <= i__1; ++p) { if ((d__2 = a[p + p * a_dim1], abs(d__2)) >= temp1 * (d__1 = a[ a_dim1 + 1], abs(d__1))) { ++nr; } else { goto L3002; } /* L3001: */ } L3002: ; } else if (l2rank) { /* .. similarly as above, only slightly more gentle (less agressive). */ /* Sudden drop on the diagonal of R1 is used as the criterion for */ /* close-to-rank-defficient. */ temp1 = sqrt(sfmin); i__1 = *n; for (p = 2; p <= i__1; ++p) { if ((d__2 = a[p + p * a_dim1], abs(d__2)) < epsln * (d__1 = a[p - 1 + (p - 1) * a_dim1], abs(d__1)) || (d__3 = a[p + p * a_dim1], abs(d__3)) < small || l2kill && (d__4 = a[p + p * a_dim1], abs(d__4)) < temp1) { goto L3402; } ++nr; /* L3401: */ } L3402: ; } else { /* The goal is high relative accuracy. However, if the matrix */ /* has high scaled condition number the relative accuracy is in */ /* general not feasible. Later on, a condition number estimator */ /* will be deployed to estimate the scaled condition number. */ /* Here we just remove the underflowed part of the triangular */ /* factor. This prevents the situation in which the code is */ /* working hard to get the accuracy not warranted by the data. */ temp1 = sqrt(sfmin); i__1 = *n; for (p = 2; p <= i__1; ++p) { if ((d__1 = a[p + p * a_dim1], abs(d__1)) < small || l2kill && ( d__2 = a[p + p * a_dim1], abs(d__2)) < temp1) { goto L3302; } ++nr; /* L3301: */ } L3302: ; } almort = FALSE_; if (nr == *n) { maxprj = 1.; i__1 = *n; for (p = 2; p <= i__1; ++p) { temp1 = (d__1 = a[p + p * a_dim1], abs(d__1)) / sva[iwork[p]]; maxprj = min(maxprj,temp1); /* L3051: */ } /* Computing 2nd power */ d__1 = maxprj; if (d__1 * d__1 >= 1. - (doublereal) (*n) * epsln) { almort = TRUE_; } } sconda = -1.; condr1 = -1.; condr2 = -1.; if (errest) { if (*n == nr) { if (rsvec) { /* .. V is available as workspace */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &v[v_offset], ldv); i__1 = *n; for (p = 1; p <= i__1; ++p) { temp1 = sva[iwork[p]]; d__1 = 1. / temp1; _starpu_dscal_(&p, &d__1, &v[p * v_dim1 + 1], &c__1); /* L3053: */ } _starpu_dpocon_("U", n, &v[v_offset], ldv, &c_b35, &temp1, &work[*n + 1], &iwork[(*n << 1) + *m + 1], &ierr); } else if (lsvec) { /* .. U is available as workspace */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &u[u_offset], ldu); i__1 = *n; for (p = 1; p <= i__1; ++p) { temp1 = sva[iwork[p]]; d__1 = 1. / temp1; _starpu_dscal_(&p, &d__1, &u[p * u_dim1 + 1], &c__1); /* L3054: */ } _starpu_dpocon_("U", n, &u[u_offset], ldu, &c_b35, &temp1, &work[*n + 1], &iwork[(*n << 1) + *m + 1], &ierr); } else { _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[*n + 1], n); i__1 = *n; for (p = 1; p <= i__1; ++p) { temp1 = sva[iwork[p]]; d__1 = 1. / temp1; _starpu_dscal_(&p, &d__1, &work[*n + (p - 1) * *n + 1], &c__1); /* L3052: */ } /* .. the columns of R are scaled to have unit Euclidean lengths. */ _starpu_dpocon_("U", n, &work[*n + 1], n, &c_b35, &temp1, &work[*n + * n * *n + 1], &iwork[(*n << 1) + *m + 1], &ierr); } sconda = 1. / sqrt(temp1); /* SCONDA is an estimate of DSQRT(||(R^t * R)^(-1)||_1). */ /* N^(-1/4) * SCONDA <= ||R^(-1)||_2 <= N^(1/4) * SCONDA */ } else { sconda = -1.; } } l2pert = l2pert && (d__1 = a[a_dim1 + 1] / a[nr + nr * a_dim1], abs(d__1)) > sqrt(big1); /* If there is no violent scaling, artificial perturbation is not needed. */ /* Phase 3: */ if (! (rsvec || lsvec)) { /* Singular Values only */ /* .. transpose A(1:NR,1:N) */ /* Computing MIN */ i__2 = *n - 1; i__1 = min(i__2,nr); for (p = 1; p <= i__1; ++p) { i__2 = *n - p; _starpu_dcopy_(&i__2, &a[p + (p + 1) * a_dim1], lda, &a[p + 1 + p * a_dim1], &c__1); /* L1946: */ } /* The following two DO-loops introduce small relative perturbation */ /* into the strict upper triangle of the lower triangular matrix. */ /* Small entries below the main diagonal are also changed. */ /* This modification is useful if the computing environment does not */ /* provide/allow FLUSH TO ZERO underflow, for it prevents many */ /* annoying denormalized numbers in case of strongly scaled matrices. */ /* The perturbation is structured so that it does not introduce any */ /* new perturbation of the singular values, and it does not destroy */ /* the job done by the preconditioner. */ /* The licence for this perturbation is in the variable L2PERT, which */ /* should be .FALSE. if FLUSH TO ZERO underflow is active. */ if (! almort) { if (l2pert) { /* XSC = DSQRT(SMALL) */ xsc = epsln / (doublereal) (*n); i__1 = nr; for (q = 1; q <= i__1; ++q) { temp1 = xsc * (d__1 = a[q + q * a_dim1], abs(d__1)); i__2 = *n; for (p = 1; p <= i__2; ++p) { if (p > q && (d__1 = a[p + q * a_dim1], abs(d__1)) <= temp1 || p < q) { a[p + q * a_dim1] = d_sign(&temp1, &a[p + q * a_dim1]); } /* L4949: */ } /* L4947: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b34, &c_b34, &a[(a_dim1 << 1) + 1], lda); } /* .. second preconditioning using the QR factorization */ i__1 = *lwork - *n; _starpu_dgeqrf_(n, &nr, &a[a_offset], lda, &work[1], &work[*n + 1], &i__1, &ierr); /* .. and transpose upper to lower triangular */ i__1 = nr - 1; for (p = 1; p <= i__1; ++p) { i__2 = nr - p; _starpu_dcopy_(&i__2, &a[p + (p + 1) * a_dim1], lda, &a[p + 1 + p * a_dim1], &c__1); /* L1948: */ } } /* Row-cyclic Jacobi SVD algorithm with column pivoting */ /* .. again some perturbation (a "background noise") is added */ /* to drown denormals */ if (l2pert) { /* XSC = DSQRT(SMALL) */ xsc = epsln / (doublereal) (*n); i__1 = nr; for (q = 1; q <= i__1; ++q) { temp1 = xsc * (d__1 = a[q + q * a_dim1], abs(d__1)); i__2 = nr; for (p = 1; p <= i__2; ++p) { if (p > q && (d__1 = a[p + q * a_dim1], abs(d__1)) <= temp1 || p < q) { a[p + q * a_dim1] = d_sign(&temp1, &a[p + q * a_dim1]) ; } /* L1949: */ } /* L1947: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b34, &c_b34, &a[(a_dim1 << 1) + 1], lda); } /* .. and one-sided Jacobi rotations are started on a lower */ /* triangular matrix (plus perturbation which is ignored in */ /* the part which destroys triangular form (confusing?!)) */ _starpu_dgesvj_("L", "NoU", "NoV", &nr, &nr, &a[a_offset], lda, &sva[1], n, & v[v_offset], ldv, &work[1], lwork, info); scalem = work[1]; numrank = i_dnnt(&work[2]); } else if (rsvec && ! lsvec) { /* -> Singular Values and Right Singular Vectors <- */ if (almort) { /* .. in this case NR equals N */ i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; _starpu_dcopy_(&i__2, &a[p + p * a_dim1], lda, &v[p + p * v_dim1], & c__1); /* L1998: */ } i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("Upper", &i__1, &i__2, &c_b34, &c_b34, &v[(v_dim1 << 1) + 1], ldv); _starpu_dgesvj_("L", "U", "N", n, &nr, &v[v_offset], ldv, &sva[1], &nr, & a[a_offset], lda, &work[1], lwork, info); scalem = work[1]; numrank = i_dnnt(&work[2]); } else { /* .. two more QR factorizations ( one QRF is not enough, two require */ /* accumulated product of Jacobi rotations, three are perfect ) */ i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("Lower", &i__1, &i__2, &c_b34, &c_b34, &a[a_dim1 + 2], lda); i__1 = *lwork - *n; _starpu_dgelqf_(&nr, n, &a[a_offset], lda, &work[1], &work[*n + 1], &i__1, &ierr); _starpu_dlacpy_("Lower", &nr, &nr, &a[a_offset], lda, &v[v_offset], ldv); i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("Upper", &i__1, &i__2, &c_b34, &c_b34, &v[(v_dim1 << 1) + 1], ldv); i__1 = *lwork - (*n << 1); _starpu_dgeqrf_(&nr, &nr, &v[v_offset], ldv, &work[*n + 1], &work[(*n << 1) + 1], &i__1, &ierr); i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = nr - p + 1; _starpu_dcopy_(&i__2, &v[p + p * v_dim1], ldv, &v[p + p * v_dim1], & c__1); /* L8998: */ } i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("Upper", &i__1, &i__2, &c_b34, &c_b34, &v[(v_dim1 << 1) + 1], ldv); _starpu_dgesvj_("Lower", "U", "N", &nr, &nr, &v[v_offset], ldv, &sva[1], & nr, &u[u_offset], ldu, &work[*n + 1], lwork, info); scalem = work[*n + 1]; numrank = i_dnnt(&work[*n + 2]); if (nr < *n) { i__1 = *n - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &v[nr + 1 + v_dim1], ldv); i__1 = *n - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &v[(nr + 1) * v_dim1 + 1], ldv); i__1 = *n - nr; i__2 = *n - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &v[nr + 1 + (nr + 1) * v_dim1], ldv); } i__1 = *lwork - *n; _starpu_dormlq_("Left", "Transpose", n, n, &nr, &a[a_offset], lda, &work[ 1], &v[v_offset], ldv, &work[*n + 1], &i__1, &ierr); } i__1 = *n; for (p = 1; p <= i__1; ++p) { _starpu_dcopy_(n, &v[p + v_dim1], ldv, &a[iwork[p] + a_dim1], lda); /* L8991: */ } _starpu_dlacpy_("All", n, n, &a[a_offset], lda, &v[v_offset], ldv); if (transp) { _starpu_dlacpy_("All", n, n, &v[v_offset], ldv, &u[u_offset], ldu); } } else if (lsvec && ! rsvec) { /* -#- Singular Values and Left Singular Vectors -#- */ /* .. second preconditioning step to avoid need to accumulate */ /* Jacobi rotations in the Jacobi iterations. */ i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; _starpu_dcopy_(&i__2, &a[p + p * a_dim1], lda, &u[p + p * u_dim1], &c__1); /* L1965: */ } i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("Upper", &i__1, &i__2, &c_b34, &c_b34, &u[(u_dim1 << 1) + 1], ldu); i__1 = *lwork - (*n << 1); _starpu_dgeqrf_(n, &nr, &u[u_offset], ldu, &work[*n + 1], &work[(*n << 1) + 1] , &i__1, &ierr); i__1 = nr - 1; for (p = 1; p <= i__1; ++p) { i__2 = nr - p; _starpu_dcopy_(&i__2, &u[p + (p + 1) * u_dim1], ldu, &u[p + 1 + p * u_dim1], &c__1); /* L1967: */ } i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("Upper", &i__1, &i__2, &c_b34, &c_b34, &u[(u_dim1 << 1) + 1], ldu); i__1 = *lwork - *n; _starpu_dgesvj_("Lower", "U", "N", &nr, &nr, &u[u_offset], ldu, &sva[1], &nr, &a[a_offset], lda, &work[*n + 1], &i__1, info); scalem = work[*n + 1]; numrank = i_dnnt(&work[*n + 2]); if (nr < *m) { i__1 = *m - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &u[nr + 1 + u_dim1], ldu); if (nr < n1) { i__1 = n1 - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &u[(nr + 1) * u_dim1 + 1], ldu); i__1 = *m - nr; i__2 = n1 - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &u[nr + 1 + (nr + 1) * u_dim1], ldu); } } i__1 = *lwork - *n; _starpu_dormqr_("Left", "No Tr", m, &n1, n, &a[a_offset], lda, &work[1], &u[ u_offset], ldu, &work[*n + 1], &i__1, &ierr); if (rowpiv) { i__1 = *m - 1; _starpu_dlaswp_(&n1, &u[u_offset], ldu, &c__1, &i__1, &iwork[(*n << 1) + 1], &c_n1); } i__1 = n1; for (p = 1; p <= i__1; ++p) { xsc = 1. / _starpu_dnrm2_(m, &u[p * u_dim1 + 1], &c__1); _starpu_dscal_(m, &xsc, &u[p * u_dim1 + 1], &c__1); /* L1974: */ } if (transp) { _starpu_dlacpy_("All", n, n, &u[u_offset], ldu, &v[v_offset], ldv); } } else { /* -#- Full SVD -#- */ if (! jracc) { if (! almort) { /* Second Preconditioning Step (QRF [with pivoting]) */ /* Note that the composition of TRANSPOSE, QRF and TRANSPOSE is */ /* equivalent to an LQF CALL. Since in many libraries the QRF */ /* seems to be better optimized than the LQF, we do explicit */ /* transpose and use the QRF. This is subject to changes in an */ /* optimized implementation of DGEJSV. */ i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; _starpu_dcopy_(&i__2, &a[p + p * a_dim1], lda, &v[p + p * v_dim1], &c__1); /* L1968: */ } /* .. the following two loops perturb small entries to avoid */ /* denormals in the second QR factorization, where they are */ /* as good as zeros. This is done to avoid painfully slow */ /* computation with denormals. The relative size of the perturbation */ /* is a parameter that can be changed by the implementer. */ /* This perturbation device will be obsolete on machines with */ /* properly implemented arithmetic. */ /* To switch it off, set L2PERT=.FALSE. To remove it from the */ /* code, remove the action under L2PERT=.TRUE., leave the ELSE part. */ /* The following two loops should be blocked and fused with the */ /* transposed copy above. */ if (l2pert) { xsc = sqrt(small); i__1 = nr; for (q = 1; q <= i__1; ++q) { temp1 = xsc * (d__1 = v[q + q * v_dim1], abs(d__1)); i__2 = *n; for (p = 1; p <= i__2; ++p) { if (p > q && (d__1 = v[p + q * v_dim1], abs(d__1)) <= temp1 || p < q) { v[p + q * v_dim1] = d_sign(&temp1, &v[p + q * v_dim1]); } if (p < q) { v[p + q * v_dim1] = -v[p + q * v_dim1]; } /* L2968: */ } /* L2969: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b34, &c_b34, &v[(v_dim1 << 1) + 1], ldv); } /* Estimate the row scaled condition number of R1 */ /* (If R1 is rectangular, N > NR, then the condition number */ /* of the leading NR x NR submatrix is estimated.) */ _starpu_dlacpy_("L", &nr, &nr, &v[v_offset], ldv, &work[(*n << 1) + 1] , &nr); i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = nr - p + 1; temp1 = _starpu_dnrm2_(&i__2, &work[(*n << 1) + (p - 1) * nr + p], &c__1); i__2 = nr - p + 1; d__1 = 1. / temp1; _starpu_dscal_(&i__2, &d__1, &work[(*n << 1) + (p - 1) * nr + p], &c__1); /* L3950: */ } _starpu_dpocon_("Lower", &nr, &work[(*n << 1) + 1], &nr, &c_b35, & temp1, &work[(*n << 1) + nr * nr + 1], &iwork[*m + (* n << 1) + 1], &ierr); condr1 = 1. / sqrt(temp1); /* .. here need a second oppinion on the condition number */ /* .. then assume worst case scenario */ /* R1 is OK for inverse <=> CONDR1 .LT. DBLE(N) */ /* more conservative <=> CONDR1 .LT. DSQRT(DBLE(N)) */ cond_ok__ = sqrt((doublereal) nr); /* [TP] COND_OK is a tuning parameter. */ if (condr1 < cond_ok__) { /* .. the second QRF without pivoting. Note: in an optimized */ /* implementation, this QRF should be implemented as the QRF */ /* of a lower triangular matrix. */ /* R1^t = Q2 * R2 */ i__1 = *lwork - (*n << 1); _starpu_dgeqrf_(n, &nr, &v[v_offset], ldv, &work[*n + 1], &work[(* n << 1) + 1], &i__1, &ierr); if (l2pert) { xsc = sqrt(small) / epsln; i__1 = nr; for (p = 2; p <= i__1; ++p) { i__2 = p - 1; for (q = 1; q <= i__2; ++q) { /* Computing MIN */ d__3 = (d__1 = v[p + p * v_dim1], abs(d__1)), d__4 = (d__2 = v[q + q * v_dim1], abs( d__2)); temp1 = xsc * min(d__3,d__4); if ((d__1 = v[q + p * v_dim1], abs(d__1)) <= temp1) { v[q + p * v_dim1] = d_sign(&temp1, &v[q + p * v_dim1]); } /* L3958: */ } /* L3959: */ } } if (nr != *n) { _starpu_dlacpy_("A", n, &nr, &v[v_offset], ldv, &work[(*n << 1) + 1], n); } /* .. save ... */ /* .. this transposed copy should be better than naive */ i__1 = nr - 1; for (p = 1; p <= i__1; ++p) { i__2 = nr - p; _starpu_dcopy_(&i__2, &v[p + (p + 1) * v_dim1], ldv, &v[p + 1 + p * v_dim1], &c__1); /* L1969: */ } condr2 = condr1; } else { /* .. ill-conditioned case: second QRF with pivoting */ /* Note that windowed pivoting would be equaly good */ /* numerically, and more run-time efficient. So, in */ /* an optimal implementation, the next call to DGEQP3 */ /* should be replaced with eg. CALL SGEQPX (ACM TOMS #782) */ /* with properly (carefully) chosen parameters. */ /* R1^t * P2 = Q2 * R2 */ i__1 = nr; for (p = 1; p <= i__1; ++p) { iwork[*n + p] = 0; /* L3003: */ } i__1 = *lwork - (*n << 1); _starpu_dgeqp3_(n, &nr, &v[v_offset], ldv, &iwork[*n + 1], &work[* n + 1], &work[(*n << 1) + 1], &i__1, &ierr); /* * CALL DGEQRF( N, NR, V, LDV, WORK(N+1), WORK(2*N+1), */ /* * & LWORK-2*N, IERR ) */ if (l2pert) { xsc = sqrt(small); i__1 = nr; for (p = 2; p <= i__1; ++p) { i__2 = p - 1; for (q = 1; q <= i__2; ++q) { /* Computing MIN */ d__3 = (d__1 = v[p + p * v_dim1], abs(d__1)), d__4 = (d__2 = v[q + q * v_dim1], abs( d__2)); temp1 = xsc * min(d__3,d__4); if ((d__1 = v[q + p * v_dim1], abs(d__1)) <= temp1) { v[q + p * v_dim1] = d_sign(&temp1, &v[q + p * v_dim1]); } /* L3968: */ } /* L3969: */ } } _starpu_dlacpy_("A", n, &nr, &v[v_offset], ldv, &work[(*n << 1) + 1], n); if (l2pert) { xsc = sqrt(small); i__1 = nr; for (p = 2; p <= i__1; ++p) { i__2 = p - 1; for (q = 1; q <= i__2; ++q) { /* Computing MIN */ d__3 = (d__1 = v[p + p * v_dim1], abs(d__1)), d__4 = (d__2 = v[q + q * v_dim1], abs( d__2)); temp1 = xsc * min(d__3,d__4); v[p + q * v_dim1] = -d_sign(&temp1, &v[q + p * v_dim1]); /* L8971: */ } /* L8970: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("L", &i__1, &i__2, &c_b34, &c_b34, &v[v_dim1 + 2], ldv); } /* Now, compute R2 = L3 * Q3, the LQ factorization. */ i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dgelqf_(&nr, &nr, &v[v_offset], ldv, &work[(*n << 1) + *n * nr + 1], &work[(*n << 1) + *n * nr + nr + 1], & i__1, &ierr); /* .. and estimate the condition number */ _starpu_dlacpy_("L", &nr, &nr, &v[v_offset], ldv, &work[(*n << 1) + *n * nr + nr + 1], &nr); i__1 = nr; for (p = 1; p <= i__1; ++p) { temp1 = _starpu_dnrm2_(&p, &work[(*n << 1) + *n * nr + nr + p] , &nr); d__1 = 1. / temp1; _starpu_dscal_(&p, &d__1, &work[(*n << 1) + *n * nr + nr + p], &nr); /* L4950: */ } _starpu_dpocon_("L", &nr, &work[(*n << 1) + *n * nr + nr + 1], & nr, &c_b35, &temp1, &work[(*n << 1) + *n * nr + nr + nr * nr + 1], &iwork[*m + (*n << 1) + 1], & ierr); condr2 = 1. / sqrt(temp1); if (condr2 >= cond_ok__) { /* .. save the Householder vectors used for Q3 */ /* (this overwrittes the copy of R2, as it will not be */ /* needed in this branch, but it does not overwritte the */ /* Huseholder vectors of Q2.). */ _starpu_dlacpy_("U", &nr, &nr, &v[v_offset], ldv, &work[(*n << 1) + 1], n); /* .. and the rest of the information on Q3 is in */ /* WORK(2*N+N*NR+1:2*N+N*NR+N) */ } } if (l2pert) { xsc = sqrt(small); i__1 = nr; for (q = 2; q <= i__1; ++q) { temp1 = xsc * v[q + q * v_dim1]; i__2 = q - 1; for (p = 1; p <= i__2; ++p) { /* V(p,q) = - DSIGN( TEMP1, V(q,p) ) */ v[p + q * v_dim1] = -d_sign(&temp1, &v[p + q * v_dim1]); /* L4969: */ } /* L4968: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b34, &c_b34, &v[(v_dim1 << 1) + 1], ldv); } /* Second preconditioning finished; continue with Jacobi SVD */ /* The input matrix is lower trinagular. */ /* Recover the right singular vectors as solution of a well */ /* conditioned triangular matrix equation. */ if (condr1 < cond_ok__) { i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dgesvj_("L", "U", "N", &nr, &nr, &v[v_offset], ldv, &sva[ 1], &nr, &u[u_offset], ldu, &work[(*n << 1) + *n * nr + nr + 1], &i__1, info); scalem = work[(*n << 1) + *n * nr + nr + 1]; numrank = i_dnnt(&work[(*n << 1) + *n * nr + nr + 2]); i__1 = nr; for (p = 1; p <= i__1; ++p) { _starpu_dcopy_(&nr, &v[p * v_dim1 + 1], &c__1, &u[p * u_dim1 + 1], &c__1); _starpu_dscal_(&nr, &sva[p], &v[p * v_dim1 + 1], &c__1); /* L3970: */ } /* .. pick the right matrix equation and solve it */ if (nr == *n) { /* :)) .. best case, R1 is inverted. The solution of this matrix */ /* equation is Q2*V2 = the product of the Jacobi rotations */ /* used in DGESVJ, premultiplied with the orthogonal matrix */ /* from the second QR factorization. */ _starpu_dtrsm_("L", "U", "N", "N", &nr, &nr, &c_b35, &a[ a_offset], lda, &v[v_offset], ldv); } else { /* .. R1 is well conditioned, but non-square. Transpose(R2) */ /* is inverted to get the product of the Jacobi rotations */ /* used in DGESVJ. The Q-factor from the second QR */ /* factorization is then built in explicitly. */ _starpu_dtrsm_("L", "U", "T", "N", &nr, &nr, &c_b35, &work[(* n << 1) + 1], n, &v[v_offset], ldv); if (nr < *n) { i__1 = *n - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &v[nr + 1 + v_dim1], ldv); i__1 = *n - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &v[(nr + 1) * v_dim1 + 1], ldv); i__1 = *n - nr; i__2 = *n - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &v[nr + 1 + (nr + 1) * v_dim1], ldv); } i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dormqr_("L", "N", n, n, &nr, &work[(*n << 1) + 1], n, &work[*n + 1], &v[v_offset], ldv, &work[(*n << 1) + *n * nr + nr + 1], &i__1, &ierr); } } else if (condr2 < cond_ok__) { /* :) .. the input matrix A is very likely a relative of */ /* the Kahan matrix :) */ /* The matrix R2 is inverted. The solution of the matrix equation */ /* is Q3^T*V3 = the product of the Jacobi rotations (appplied to */ /* the lower triangular L3 from the LQ factorization of */ /* R2=L3*Q3), pre-multiplied with the transposed Q3. */ i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dgesvj_("L", "U", "N", &nr, &nr, &v[v_offset], ldv, &sva[ 1], &nr, &u[u_offset], ldu, &work[(*n << 1) + *n * nr + nr + 1], &i__1, info); scalem = work[(*n << 1) + *n * nr + nr + 1]; numrank = i_dnnt(&work[(*n << 1) + *n * nr + nr + 2]); i__1 = nr; for (p = 1; p <= i__1; ++p) { _starpu_dcopy_(&nr, &v[p * v_dim1 + 1], &c__1, &u[p * u_dim1 + 1], &c__1); _starpu_dscal_(&nr, &sva[p], &u[p * u_dim1 + 1], &c__1); /* L3870: */ } _starpu_dtrsm_("L", "U", "N", "N", &nr, &nr, &c_b35, &work[(*n << 1) + 1], n, &u[u_offset], ldu); /* .. apply the permutation from the second QR factorization */ i__1 = nr; for (q = 1; q <= i__1; ++q) { i__2 = nr; for (p = 1; p <= i__2; ++p) { work[(*n << 1) + *n * nr + nr + iwork[*n + p]] = u[p + q * u_dim1]; /* L872: */ } i__2 = nr; for (p = 1; p <= i__2; ++p) { u[p + q * u_dim1] = work[(*n << 1) + *n * nr + nr + p]; /* L874: */ } /* L873: */ } if (nr < *n) { i__1 = *n - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &v[nr + 1 + v_dim1], ldv); i__1 = *n - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &v[(nr + 1) * v_dim1 + 1], ldv); i__1 = *n - nr; i__2 = *n - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &v[nr + 1 + (nr + 1) * v_dim1], ldv); } i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dormqr_("L", "N", n, n, &nr, &work[(*n << 1) + 1], n, & work[*n + 1], &v[v_offset], ldv, &work[(*n << 1) + *n * nr + nr + 1], &i__1, &ierr); } else { /* Last line of defense. */ /* #:( This is a rather pathological case: no scaled condition */ /* improvement after two pivoted QR factorizations. Other */ /* possibility is that the rank revealing QR factorization */ /* or the condition estimator has failed, or the COND_OK */ /* is set very close to ONE (which is unnecessary). Normally, */ /* this branch should never be executed, but in rare cases of */ /* failure of the RRQR or condition estimator, the last line of */ /* defense ensures that DGEJSV completes the task. */ /* Compute the full SVD of L3 using DGESVJ with explicit */ /* accumulation of Jacobi rotations. */ i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dgesvj_("L", "U", "V", &nr, &nr, &v[v_offset], ldv, &sva[ 1], &nr, &u[u_offset], ldu, &work[(*n << 1) + *n * nr + nr + 1], &i__1, info); scalem = work[(*n << 1) + *n * nr + nr + 1]; numrank = i_dnnt(&work[(*n << 1) + *n * nr + nr + 2]); if (nr < *n) { i__1 = *n - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &v[nr + 1 + v_dim1], ldv); i__1 = *n - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &v[(nr + 1) * v_dim1 + 1], ldv); i__1 = *n - nr; i__2 = *n - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &v[nr + 1 + (nr + 1) * v_dim1], ldv); } i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dormqr_("L", "N", n, n, &nr, &work[(*n << 1) + 1], n, & work[*n + 1], &v[v_offset], ldv, &work[(*n << 1) + *n * nr + nr + 1], &i__1, &ierr); i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dormlq_("L", "T", &nr, &nr, &nr, &work[(*n << 1) + 1], n, &work[(*n << 1) + *n * nr + 1], &u[u_offset], ldu, &work[(*n << 1) + *n * nr + nr + 1], &i__1, & ierr); i__1 = nr; for (q = 1; q <= i__1; ++q) { i__2 = nr; for (p = 1; p <= i__2; ++p) { work[(*n << 1) + *n * nr + nr + iwork[*n + p]] = u[p + q * u_dim1]; /* L772: */ } i__2 = nr; for (p = 1; p <= i__2; ++p) { u[p + q * u_dim1] = work[(*n << 1) + *n * nr + nr + p]; /* L774: */ } /* L773: */ } } /* Permute the rows of V using the (column) permutation from the */ /* first QRF. Also, scale the columns to make them unit in */ /* Euclidean norm. This applies to all cases. */ temp1 = sqrt((doublereal) (*n)) * epsln; i__1 = *n; for (q = 1; q <= i__1; ++q) { i__2 = *n; for (p = 1; p <= i__2; ++p) { work[(*n << 1) + *n * nr + nr + iwork[p]] = v[p + q * v_dim1]; /* L972: */ } i__2 = *n; for (p = 1; p <= i__2; ++p) { v[p + q * v_dim1] = work[(*n << 1) + *n * nr + nr + p] ; /* L973: */ } xsc = 1. / _starpu_dnrm2_(n, &v[q * v_dim1 + 1], &c__1); if (xsc < 1. - temp1 || xsc > temp1 + 1.) { _starpu_dscal_(n, &xsc, &v[q * v_dim1 + 1], &c__1); } /* L1972: */ } /* At this moment, V contains the right singular vectors of A. */ /* Next, assemble the left singular vector matrix U (M x N). */ if (nr < *m) { i__1 = *m - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &u[nr + 1 + u_dim1], ldu); if (nr < n1) { i__1 = n1 - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &u[(nr + 1) * u_dim1 + 1], ldu); i__1 = *m - nr; i__2 = n1 - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &u[nr + 1 + (nr + 1) * u_dim1], ldu); } } /* The Q matrix from the first QRF is built into the left singular */ /* matrix U. This applies to all cases. */ i__1 = *lwork - *n; _starpu_dormqr_("Left", "No_Tr", m, &n1, n, &a[a_offset], lda, &work[ 1], &u[u_offset], ldu, &work[*n + 1], &i__1, &ierr); /* The columns of U are normalized. The cost is O(M*N) flops. */ temp1 = sqrt((doublereal) (*m)) * epsln; i__1 = nr; for (p = 1; p <= i__1; ++p) { xsc = 1. / _starpu_dnrm2_(m, &u[p * u_dim1 + 1], &c__1); if (xsc < 1. - temp1 || xsc > temp1 + 1.) { _starpu_dscal_(m, &xsc, &u[p * u_dim1 + 1], &c__1); } /* L1973: */ } /* If the initial QRF is computed with row pivoting, the left */ /* singular vectors must be adjusted. */ if (rowpiv) { i__1 = *m - 1; _starpu_dlaswp_(&n1, &u[u_offset], ldu, &c__1, &i__1, &iwork[(*n << 1) + 1], &c_n1); } } else { /* .. the initial matrix A has almost orthogonal columns and */ /* the second QRF is not needed */ _starpu_dlacpy_("Upper", n, n, &a[a_offset], lda, &work[*n + 1], n); if (l2pert) { xsc = sqrt(small); i__1 = *n; for (p = 2; p <= i__1; ++p) { temp1 = xsc * work[*n + (p - 1) * *n + p]; i__2 = p - 1; for (q = 1; q <= i__2; ++q) { work[*n + (q - 1) * *n + p] = -d_sign(&temp1, & work[*n + (p - 1) * *n + q]); /* L5971: */ } /* L5970: */ } } else { i__1 = *n - 1; i__2 = *n - 1; _starpu_dlaset_("Lower", &i__1, &i__2, &c_b34, &c_b34, &work[*n + 2], n); } i__1 = *lwork - *n - *n * *n; _starpu_dgesvj_("Upper", "U", "N", n, n, &work[*n + 1], n, &sva[1], n, &u[u_offset], ldu, &work[*n + *n * *n + 1], &i__1, info); scalem = work[*n + *n * *n + 1]; numrank = i_dnnt(&work[*n + *n * *n + 2]); i__1 = *n; for (p = 1; p <= i__1; ++p) { _starpu_dcopy_(n, &work[*n + (p - 1) * *n + 1], &c__1, &u[p * u_dim1 + 1], &c__1); _starpu_dscal_(n, &sva[p], &work[*n + (p - 1) * *n + 1], &c__1); /* L6970: */ } _starpu_dtrsm_("Left", "Upper", "NoTrans", "No UD", n, n, &c_b35, &a[ a_offset], lda, &work[*n + 1], n); i__1 = *n; for (p = 1; p <= i__1; ++p) { _starpu_dcopy_(n, &work[*n + p], n, &v[iwork[p] + v_dim1], ldv); /* L6972: */ } temp1 = sqrt((doublereal) (*n)) * epsln; i__1 = *n; for (p = 1; p <= i__1; ++p) { xsc = 1. / _starpu_dnrm2_(n, &v[p * v_dim1 + 1], &c__1); if (xsc < 1. - temp1 || xsc > temp1 + 1.) { _starpu_dscal_(n, &xsc, &v[p * v_dim1 + 1], &c__1); } /* L6971: */ } /* Assemble the left singular vector matrix U (M x N). */ if (*n < *m) { i__1 = *m - *n; _starpu_dlaset_("A", &i__1, n, &c_b34, &c_b34, &u[nr + 1 + u_dim1] , ldu); if (*n < n1) { i__1 = n1 - *n; _starpu_dlaset_("A", n, &i__1, &c_b34, &c_b34, &u[(*n + 1) * u_dim1 + 1], ldu); i__1 = *m - *n; i__2 = n1 - *n; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &u[nr + 1 + (*n + 1) * u_dim1], ldu); } } i__1 = *lwork - *n; _starpu_dormqr_("Left", "No Tr", m, &n1, n, &a[a_offset], lda, &work[ 1], &u[u_offset], ldu, &work[*n + 1], &i__1, &ierr); temp1 = sqrt((doublereal) (*m)) * epsln; i__1 = n1; for (p = 1; p <= i__1; ++p) { xsc = 1. / _starpu_dnrm2_(m, &u[p * u_dim1 + 1], &c__1); if (xsc < 1. - temp1 || xsc > temp1 + 1.) { _starpu_dscal_(m, &xsc, &u[p * u_dim1 + 1], &c__1); } /* L6973: */ } if (rowpiv) { i__1 = *m - 1; _starpu_dlaswp_(&n1, &u[u_offset], ldu, &c__1, &i__1, &iwork[(*n << 1) + 1], &c_n1); } } /* end of the >> almost orthogonal case << in the full SVD */ } else { /* This branch deploys a preconditioned Jacobi SVD with explicitly */ /* accumulated rotations. It is included as optional, mainly for */ /* experimental purposes. It does perfom well, and can also be used. */ /* In this implementation, this branch will be automatically activated */ /* if the condition number sigma_max(A) / sigma_min(A) is predicted */ /* to be greater than the overflow threshold. This is because the */ /* a posteriori computation of the singular vectors assumes robust */ /* implementation of BLAS and some LAPACK procedures, capable of working */ /* in presence of extreme values. Since that is not always the case, ... */ i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; _starpu_dcopy_(&i__2, &a[p + p * a_dim1], lda, &v[p + p * v_dim1], & c__1); /* L7968: */ } if (l2pert) { xsc = sqrt(small / epsln); i__1 = nr; for (q = 1; q <= i__1; ++q) { temp1 = xsc * (d__1 = v[q + q * v_dim1], abs(d__1)); i__2 = *n; for (p = 1; p <= i__2; ++p) { if (p > q && (d__1 = v[p + q * v_dim1], abs(d__1)) <= temp1 || p < q) { v[p + q * v_dim1] = d_sign(&temp1, &v[p + q * v_dim1]); } if (p < q) { v[p + q * v_dim1] = -v[p + q * v_dim1]; } /* L5968: */ } /* L5969: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b34, &c_b34, &v[(v_dim1 << 1) + 1], ldv); } i__1 = *lwork - (*n << 1); _starpu_dgeqrf_(n, &nr, &v[v_offset], ldv, &work[*n + 1], &work[(*n << 1) + 1], &i__1, &ierr); _starpu_dlacpy_("L", n, &nr, &v[v_offset], ldv, &work[(*n << 1) + 1], n); i__1 = nr; for (p = 1; p <= i__1; ++p) { i__2 = nr - p + 1; _starpu_dcopy_(&i__2, &v[p + p * v_dim1], ldv, &u[p + p * u_dim1], & c__1); /* L7969: */ } if (l2pert) { xsc = sqrt(small / epsln); i__1 = nr; for (q = 2; q <= i__1; ++q) { i__2 = q - 1; for (p = 1; p <= i__2; ++p) { /* Computing MIN */ d__3 = (d__1 = u[p + p * u_dim1], abs(d__1)), d__4 = ( d__2 = u[q + q * u_dim1], abs(d__2)); temp1 = xsc * min(d__3,d__4); u[p + q * u_dim1] = -d_sign(&temp1, &u[q + p * u_dim1] ); /* L9971: */ } /* L9970: */ } } else { i__1 = nr - 1; i__2 = nr - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b34, &c_b34, &u[(u_dim1 << 1) + 1], ldu); } i__1 = *lwork - (*n << 1) - *n * nr; _starpu_dgesvj_("G", "U", "V", &nr, &nr, &u[u_offset], ldu, &sva[1], n, & v[v_offset], ldv, &work[(*n << 1) + *n * nr + 1], &i__1, info); scalem = work[(*n << 1) + *n * nr + 1]; numrank = i_dnnt(&work[(*n << 1) + *n * nr + 2]); if (nr < *n) { i__1 = *n - nr; _starpu_dlaset_("A", &i__1, &nr, &c_b34, &c_b34, &v[nr + 1 + v_dim1], ldv); i__1 = *n - nr; _starpu_dlaset_("A", &nr, &i__1, &c_b34, &c_b34, &v[(nr + 1) * v_dim1 + 1], ldv); i__1 = *n - nr; i__2 = *n - nr; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &v[nr + 1 + (nr + 1) * v_dim1], ldv); } i__1 = *lwork - (*n << 1) - *n * nr - nr; _starpu_dormqr_("L", "N", n, n, &nr, &work[(*n << 1) + 1], n, &work[*n + 1], &v[v_offset], ldv, &work[(*n << 1) + *n * nr + nr + 1] , &i__1, &ierr); /* Permute the rows of V using the (column) permutation from the */ /* first QRF. Also, scale the columns to make them unit in */ /* Euclidean norm. This applies to all cases. */ temp1 = sqrt((doublereal) (*n)) * epsln; i__1 = *n; for (q = 1; q <= i__1; ++q) { i__2 = *n; for (p = 1; p <= i__2; ++p) { work[(*n << 1) + *n * nr + nr + iwork[p]] = v[p + q * v_dim1]; /* L8972: */ } i__2 = *n; for (p = 1; p <= i__2; ++p) { v[p + q * v_dim1] = work[(*n << 1) + *n * nr + nr + p]; /* L8973: */ } xsc = 1. / _starpu_dnrm2_(n, &v[q * v_dim1 + 1], &c__1); if (xsc < 1. - temp1 || xsc > temp1 + 1.) { _starpu_dscal_(n, &xsc, &v[q * v_dim1 + 1], &c__1); } /* L7972: */ } /* At this moment, V contains the right singular vectors of A. */ /* Next, assemble the left singular vector matrix U (M x N). */ if (*n < *m) { i__1 = *m - *n; _starpu_dlaset_("A", &i__1, n, &c_b34, &c_b34, &u[nr + 1 + u_dim1], ldu); if (*n < n1) { i__1 = n1 - *n; _starpu_dlaset_("A", n, &i__1, &c_b34, &c_b34, &u[(*n + 1) * u_dim1 + 1], ldu); i__1 = *m - *n; i__2 = n1 - *n; _starpu_dlaset_("A", &i__1, &i__2, &c_b34, &c_b35, &u[nr + 1 + (* n + 1) * u_dim1], ldu); } } i__1 = *lwork - *n; _starpu_dormqr_("Left", "No Tr", m, &n1, n, &a[a_offset], lda, &work[1], & u[u_offset], ldu, &work[*n + 1], &i__1, &ierr); if (rowpiv) { i__1 = *m - 1; _starpu_dlaswp_(&n1, &u[u_offset], ldu, &c__1, &i__1, &iwork[(*n << 1) + 1], &c_n1); } } if (transp) { /* .. swap U and V because the procedure worked on A^t */ i__1 = *n; for (p = 1; p <= i__1; ++p) { _starpu_dswap_(n, &u[p * u_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); /* L6974: */ } } } /* end of the full SVD */ /* Undo scaling, if necessary (and possible) */ if (uscal2 <= big / sva[1] * uscal1) { _starpu_dlascl_("G", &c__0, &c__0, &uscal1, &uscal2, &nr, &c__1, &sva[1], n, & ierr); uscal1 = 1.; uscal2 = 1.; } if (nr < *n) { i__1 = *n; for (p = nr + 1; p <= i__1; ++p) { sva[p] = 0.; /* L3004: */ } } work[1] = uscal2 * scalem; work[2] = uscal1; if (errest) { work[3] = sconda; } if (lsvec && rsvec) { work[4] = condr1; work[5] = condr2; } if (l2tran) { work[6] = entra; work[7] = entrat; } iwork[1] = nr; iwork[2] = numrank; iwork[3] = warning; return 0; /* .. */ /* .. END OF DGEJSV */ /* .. */ } /* _starpu_dgejsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgelq2.c000066400000000000000000000106351413463044200205310ustar00rootroot00000000000000/* dgelq2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgelq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, k; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELQ2 computes an LQ factorization of a real m by n matrix A: */ /* A = L * Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix A. */ /* On exit, the elements on and below the diagonal of the array */ /* contain the m by min(m,n) lower trapezoidal matrix L (L is */ /* lower triangular if m <= n); the elements above the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (M) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(k) . . . H(2) H(1), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELQ2", &i__1); return 0; } k = min(*m,*n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i,i+1:n) */ i__2 = *n - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfp_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n)* a_dim1] , lda, &tau[i__]); if (i__ < *m) { /* Apply H(i) to A(i+1:m,i:n) from the right */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__; i__3 = *n - i__ + 1; _starpu_dlarf_("Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[ i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1]); a[i__ + i__ * a_dim1] = aii; } /* L10: */ } return 0; /* End of DGELQ2 */ } /* _starpu_dgelq2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgelqf.c000066400000000000000000000163741413463044200206230ustar00rootroot00000000000000/* dgelqf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgelqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dgelq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELQF computes an LQ factorization of a real M-by-N matrix A: */ /* A = L * Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the elements on and below the diagonal of the array */ /* contain the m-by-min(m,n) lower trapezoidal matrix L (L is */ /* lower triangular if m <= n); the elements above the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M). */ /* For optimum performance LWORK >= M*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(k) . . . H(2) H(1), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1); lwkopt = *m * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*m) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELQF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGELQF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGELQF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the LQ factorization of the current block */ /* A(i:i+ib-1,i:n) */ i__3 = *n - i__ + 1; _starpu_dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ 1], &iinfo); if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__3 = *n - i__ + 1; _starpu_dlarft_("Forward", "Rowwise", &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(i+ib:m,i:n) from the right */ i__3 = *m - i__ - ib + 1; i__4 = *n - i__ + 1; _starpu_dlarfb_("Right", "No transpose", "Forward", "Rowwise", &i__3, &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + 1], &ldwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; _starpu_dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] , &iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGELQF */ } /* _starpu_dgelqf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgels.c000066400000000000000000000360611413463044200204520ustar00rootroot00000000000000/* dgels.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b33 = 0.; static integer c__0 = 0; /* Subroutine */ int _starpu_dgels_(char *trans, integer *m, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer i__, j, nb, mn; doublereal anrm, bnrm; integer brow; logical tpsd; integer iascl, ibscl; extern logical _starpu_lsame_(char *, char *); integer wsize; doublereal rwork[1]; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer scllen; doublereal bignum; extern /* Subroutine */ int _starpu_dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal smlnum; logical lquery; extern /* Subroutine */ int _starpu_dtrtrs_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELS solves overdetermined or underdetermined real linear systems */ /* involving an M-by-N matrix A, or its transpose, using a QR or LQ */ /* factorization of A. It is assumed that A has full rank. */ /* The following options are provided: */ /* 1. If TRANS = 'N' and m >= n: find the least squares solution of */ /* an overdetermined system, i.e., solve the least squares problem */ /* minimize || B - A*X ||. */ /* 2. If TRANS = 'N' and m < n: find the minimum norm solution of */ /* an underdetermined system A * X = B. */ /* 3. If TRANS = 'T' and m >= n: find the minimum norm solution of */ /* an undetermined system A**T * X = B. */ /* 4. If TRANS = 'T' and m < n: find the least squares solution of */ /* an overdetermined system, i.e., solve the least squares problem */ /* minimize || B - A**T * X ||. */ /* Several right hand side vectors b and solution vectors x can be */ /* handled in a single call; they are stored as the columns of the */ /* M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ /* matrix X. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* = 'N': the linear system involves A; */ /* = 'T': the linear system involves A**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of */ /* columns of the matrices B and X. NRHS >=0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if M >= N, A is overwritten by details of its QR */ /* factorization as returned by DGEQRF; */ /* if M < N, A is overwritten by details of its LQ */ /* factorization as returned by DGELQF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the matrix B of right hand side vectors, stored */ /* columnwise; B is M-by-NRHS if TRANS = 'N', or N-by-NRHS */ /* if TRANS = 'T'. */ /* On exit, if INFO = 0, B is overwritten by the solution */ /* vectors, stored columnwise: */ /* if TRANS = 'N' and m >= n, rows 1 to n of B contain the least */ /* squares solution vectors; the residual sum of squares for the */ /* solution in each column is given by the sum of squares of */ /* elements N+1 to M in that column; */ /* if TRANS = 'N' and m < n, rows 1 to N of B contain the */ /* minimum norm solution vectors; */ /* if TRANS = 'T' and m >= n, rows 1 to M of B contain the */ /* minimum norm solution vectors; */ /* if TRANS = 'T' and m < n, rows 1 to M of B contain the */ /* least squares solution vectors; the residual sum of squares */ /* for the solution in each column is given by the sum of */ /* squares of elements M+1 to N in that column. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= MAX(1,M,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* LWORK >= max( 1, MN + max( MN, NRHS ) ). */ /* For optimal performance, */ /* LWORK >= max( 1, MN + max( MN, NRHS )*NB ). */ /* where MN = min(M,N) and NB is the optimum block size. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of the */ /* triangular factor of A is zero, so that A does not have */ /* full rank; the least squares solution could not be */ /* computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --work; /* Function Body */ *info = 0; mn = min(*m,*n); lquery = *lwork == -1; if (! (_starpu_lsame_(trans, "N") || _starpu_lsame_(trans, "T"))) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*ldb < max(i__1,*n)) { *info = -8; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = mn + max(mn,*nrhs); if (*lwork < max(i__1,i__2) && ! lquery) { *info = -10; } } } /* Figure out optimal block size */ if (*info == 0 || *info == -10) { tpsd = TRUE_; if (_starpu_lsame_(trans, "N")) { tpsd = FALSE_; } if (*m >= *n) { nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); if (tpsd) { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMQR", "LN", m, nrhs, n, & c_n1); nb = max(i__1,i__2); } else { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMQR", "LT", m, nrhs, n, & c_n1); nb = max(i__1,i__2); } } else { nb = _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1); if (tpsd) { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMLQ", "LT", n, nrhs, m, & c_n1); nb = max(i__1,i__2); } else { /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMLQ", "LN", n, nrhs, m, & c_n1); nb = max(i__1,i__2); } } /* Computing MAX */ i__1 = 1, i__2 = mn + max(mn,*nrhs) * nb; wsize = max(i__1,i__2); work[1] = (doublereal) wsize; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELS ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ /* Computing MIN */ i__1 = min(*m,*n); if (min(i__1,*nrhs) == 0) { i__1 = max(*m,*n); _starpu_dlaset_("Full", &i__1, nrhs, &c_b33, &c_b33, &b[b_offset], ldb); return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S") / _starpu_dlamch_("P"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Scale A, B if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, rwork); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b33, &c_b33, &b[b_offset], ldb); goto L50; } brow = *m; if (tpsd) { brow = *n; } bnrm = _starpu_dlange_("M", &brow, nrhs, &b[b_offset], ldb, rwork); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, &brow, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bignum, &brow, nrhs, &b[b_offset], ldb, info); ibscl = 2; } if (*m >= *n) { /* compute QR factorization of A */ i__1 = *lwork - mn; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[1], &work[mn + 1], &i__1, info) ; /* workspace at least N, optimally N*NB */ if (! tpsd) { /* Least-Squares Problem min || A * X - B || */ /* B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormqr_("Left", "Transpose", m, nrhs, n, &a[a_offset], lda, &work[ 1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ /* B(1:N,1:NRHS) := inv(R) * B(1:N,1:NRHS) */ _starpu_dtrtrs_("Upper", "No transpose", "Non-unit", n, nrhs, &a[a_offset] , lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } scllen = *n; } else { /* Overdetermined system of equations A' * X = B */ /* B(1:N,1:NRHS) := inv(R') * B(1:N,1:NRHS) */ _starpu_dtrtrs_("Upper", "Transpose", "Non-unit", n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } /* B(N+1:M,1:NRHS) = ZERO */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *n + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } /* B(1:M,1:NRHS) := Q(1:N,:) * B(1:N,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormqr_("Left", "No transpose", m, nrhs, n, &a[a_offset], lda, & work[1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ scllen = *m; } } else { /* Compute LQ factorization of A */ i__1 = *lwork - mn; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[1], &work[mn + 1], &i__1, info) ; /* workspace at least M, optimally M*NB. */ if (! tpsd) { /* underdetermined system of equations A * X = B */ /* B(1:M,1:NRHS) := inv(L) * B(1:M,1:NRHS) */ _starpu_dtrtrs_("Lower", "No transpose", "Non-unit", m, nrhs, &a[a_offset] , lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } /* B(M+1:N,1:NRHS) = 0 */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = *m + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L30: */ } /* L40: */ } /* B(1:N,1:NRHS) := Q(1:N,:)' * B(1:M,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormlq_("Left", "Transpose", n, nrhs, m, &a[a_offset], lda, &work[ 1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ scllen = *n; } else { /* overdetermined system min || A' * X - B || */ /* B(1:N,1:NRHS) := Q * B(1:N,1:NRHS) */ i__1 = *lwork - mn; _starpu_dormlq_("Left", "No transpose", n, nrhs, m, &a[a_offset], lda, & work[1], &b[b_offset], ldb, &work[mn + 1], &i__1, info); /* workspace at least NRHS, optimally NRHS*NB */ /* B(1:M,1:NRHS) := inv(L') * B(1:M,1:NRHS) */ _starpu_dtrtrs_("Lower", "Transpose", "Non-unit", m, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); if (*info > 0) { return 0; } scllen = *m; } } /* Undo scaling */ if (iascl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, &scllen, nrhs, &b[b_offset] , ldb, info); } else if (iascl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, &scllen, nrhs, &b[b_offset] , ldb, info); } if (ibscl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, &scllen, nrhs, &b[b_offset] , ldb, info); } else if (ibscl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &bnrm, &scllen, nrhs, &b[b_offset] , ldb, info); } L50: work[1] = (doublereal) wsize; return 0; /* End of DGELS */ } /* _starpu_dgels_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgelsd.c000066400000000000000000000556171413463044200206260ustar00rootroot00000000000000/* dgelsd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__6 = 6; static integer c_n1 = -1; static integer c__9 = 9; static integer c__0 = 0; static integer c__1 = 1; static doublereal c_b82 = 0.; /* Subroutine */ int _starpu_dgelsd_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; /* Builtin functions */ double log(doublereal); /* Local variables */ integer ie, il, mm; doublereal eps, anrm, bnrm; integer itau, nlvl, iascl, ibscl; doublereal sfmin; integer minmn, maxmn, itaup, itauq, mnthr, nwork; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dgebrd_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlalsd_(char *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqrf_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer wlalsd; extern /* Subroutine */ int _starpu_dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer ldwork; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer minwrk, maxwrk; doublereal smlnum; logical lquery; integer smlsiz; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELSD computes the minimum-norm solution to a real linear least */ /* squares problem: */ /* minimize 2-norm(| b - A*x |) */ /* using the singular value decomposition (SVD) of A. A is an M-by-N */ /* matrix which may be rank-deficient. */ /* Several right hand side vectors b and solution vectors x can be */ /* handled in a single call; they are stored as the columns of the */ /* M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ /* matrix X. */ /* The problem is solved in three steps: */ /* (1) Reduce the coefficient matrix A to bidiagonal form with */ /* Householder transformations, reducing the original problem */ /* into a "bidiagonal least squares problem" (BLS) */ /* (2) Solve the BLS using a divide and conquer approach. */ /* (3) Apply back all the Householder tranformations to solve */ /* the original least squares problem. */ /* The effective rank of A is determined by treating as zero those */ /* singular values which are less than RCOND times the largest singular */ /* value. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, A has been destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the M-by-NRHS right hand side matrix B. */ /* On exit, B is overwritten by the N-by-NRHS solution */ /* matrix X. If m >= n and RANK = n, the residual */ /* sum-of-squares for the solution in the i-th column is given */ /* by the sum of squares of elements n+1:m in that column. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,max(M,N)). */ /* S (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The singular values of A in decreasing order. */ /* The condition number of A in the 2-norm = S(1)/S(min(m,n)). */ /* RCOND (input) DOUBLE PRECISION */ /* RCOND is used to determine the effective rank of A. */ /* Singular values S(i) <= RCOND*S(1) are treated as zero. */ /* If RCOND < 0, machine precision is used instead. */ /* RANK (output) INTEGER */ /* The effective rank of A, i.e., the number of singular values */ /* which are greater than RCOND*S(1). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK must be at least 1. */ /* The exact minimum amount of workspace needed depends on M, */ /* N and NRHS. As long as LWORK is at least */ /* 12*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2, */ /* if M is greater than or equal to N or */ /* 12*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS + (SMLSIZ+1)**2, */ /* if M is less than N, the code will execute correctly. */ /* SMLSIZ is returned by ILAENV and is equal to the maximum */ /* size of the subproblems at the bottom of the computation */ /* tree (usually about 25), and */ /* NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 ) */ /* For good performance, LWORK should generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (MAX(1,LIWORK)) */ /* LIWORK >= 3 * MINMN * NLVL + 11 * MINMN, */ /* where MINMN = MIN( M,N ). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: the algorithm for computing the SVD failed to converge; */ /* if INFO = i, i off-diagonal elements of an intermediate */ /* bidiagonal form did not converge to zero. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Ren-Cang Li, Computer Science Division, University of */ /* California at Berkeley, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --s; --work; --iwork; /* Function Body */ *info = 0; minmn = min(*m,*n); maxmn = max(*m,*n); mnthr = _starpu_ilaenv_(&c__6, "DGELSD", " ", m, n, nrhs, &c_n1); lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*ldb < max(1,maxmn)) { *info = -7; } smlsiz = _starpu_ilaenv_(&c__9, "DGELSD", " ", &c__0, &c__0, &c__0, &c__0); /* Compute workspace. */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV.) */ minwrk = 1; minmn = max(1,minmn); /* Computing MAX */ i__1 = (integer) (log((doublereal) minmn / (doublereal) (smlsiz + 1)) / log(2.)) + 1; nlvl = max(i__1,0); if (*info == 0) { maxwrk = 0; mm = *m; if (*m >= *n && *m >= mnthr) { /* Path 1a - overdetermined, with many more rows than columns. */ mm = *n; /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *nrhs * _starpu_ilaenv_(&c__1, "DORMQR", "LT", m, nrhs, n, &c_n1); maxwrk = max(i__1,i__2); } if (*m >= *n) { /* Path 1 - overdetermined or exactly determined. */ /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * _starpu_ilaenv_(&c__1, "DGEBRD" , " ", &mm, n, &c_n1, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + *nrhs * _starpu_ilaenv_(&c__1, "DORMBR", "QLT", &mm, nrhs, n, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORMBR", "PLN", n, nrhs, n, &c_n1); maxwrk = max(i__1,i__2); /* Computing 2nd power */ i__1 = smlsiz + 1; wlalsd = *n * 9 + (*n << 1) * smlsiz + (*n << 3) * nlvl + *n * * nrhs + i__1 * i__1; /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + wlalsd; maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1,i__2), i__2 = *n * 3 + wlalsd; minwrk = max(i__1,i__2); } if (*n > *m) { /* Computing 2nd power */ i__1 = smlsiz + 1; wlalsd = *m * 9 + (*m << 1) * smlsiz + (*m << 3) * nlvl + *m * * nrhs + i__1 * i__1; if (*n >= mnthr) { /* Path 2a - underdetermined, with many more columns */ /* than rows. */ maxwrk = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, &c_n1, &c_n1); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + *nrhs * _starpu_ilaenv_(& c__1, "DORMBR", "QLT", m, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m - 1) * _starpu_ilaenv_(&c__1, "DORMBR", "PLN", m, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); if (*nrhs > 1) { /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; maxwrk = max(i__1,i__2); } else { /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 1); maxwrk = max(i__1,i__2); } /* Computing MAX */ i__1 = maxwrk, i__2 = *m + *nrhs * _starpu_ilaenv_(&c__1, "DORMLQ", "LT", n, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + wlalsd; maxwrk = max(i__1,i__2); /* XXX: Ensure the Path 2a case below is triggered. The workspace */ /* calculation should use queries for all routines eventually. */ /* Computing MAX */ /* Computing MAX */ i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = max(i__3,*nrhs), i__4 = *n - *m * 3; i__1 = maxwrk, i__2 = (*m << 2) + *m * *m + max(i__3,i__4); maxwrk = max(i__1,i__2); } else { /* Path 2 - remaining underdetermined cases. */ maxwrk = *m * 3 + (*n + *m) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * 3 + *nrhs * _starpu_ilaenv_(&c__1, "DORMBR" , "QLT", m, nrhs, n, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR", "PLN", n, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * 3 + wlalsd; maxwrk = max(i__1,i__2); } /* Computing MAX */ i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *m, i__1 = max(i__1,i__2), i__2 = *m * 3 + wlalsd; minwrk = max(i__1,i__2); } minwrk = min(minwrk,maxwrk); work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELSD", &i__1); return 0; } else if (lquery) { goto L10; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { *rank = 0; return 0; } /* Get machine parameters. */ eps = _starpu_dlamch_("P"); sfmin = _starpu_dlamch_("S"); smlnum = sfmin / eps; bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Scale A if max entry outside range [SMLNUM,BIGNUM]. */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, &work[1]); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM. */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM. */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b82, &c_b82, &b[b_offset], ldb); _starpu_dlaset_("F", &minmn, &c__1, &c_b82, &c_b82, &s[1], &c__1); *rank = 0; goto L10; } /* Scale B if max entry outside range [SMLNUM,BIGNUM]. */ bnrm = _starpu_dlange_("M", m, nrhs, &b[b_offset], ldb, &work[1]); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM. */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM. */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, info); ibscl = 2; } /* If M < N make sure certain entries of B are zero. */ if (*m < *n) { i__1 = *n - *m; _starpu_dlaset_("F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb); } /* Overdetermined case. */ if (*m >= *n) { /* Path 1 - overdetermined or exactly determined. */ mm = *m; if (*m >= mnthr) { /* Path 1a - overdetermined, with many more rows than columns. */ mm = *n; itau = 1; nwork = itau + *n; /* Compute A=Q*R. */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, info); /* Multiply B by transpose(Q). */ /* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormqr_("L", "T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ b_offset], ldb, &work[nwork], &i__1, info); /* Zero out below R. */ if (*n > 1) { i__1 = *n - 1; i__2 = *n - 1; _starpu_dlaset_("L", &i__1, &i__2, &c_b82, &c_b82, &a[a_dim1 + 2], lda); } } ie = 1; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; /* Bidiagonalize R in A. */ /* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[nwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors of R. */ /* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], &b[b_offset], ldb, &work[nwork], &i__1, info); /* Solve the bidiagonal least squares problem. */ _starpu_dlalsd_("U", &smlsiz, n, nrhs, &s[1], &work[ie], &b[b_offset], ldb, rcond, rank, &work[nwork], &iwork[1], info); if (*info != 0) { goto L10; } /* Multiply B by right bidiagonalizing vectors of R. */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "L", "N", n, nrhs, n, &a[a_offset], lda, &work[itaup], & b[b_offset], ldb, &work[nwork], &i__1, info); } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = *m, i__2 = (*m << 1) - 4, i__1 = max(i__1,i__2), i__1 = max( i__1,*nrhs), i__2 = *n - *m * 3, i__1 = max(i__1,i__2); if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__1,wlalsd)) { /* Path 2a - underdetermined, with many more columns than rows */ /* and sufficient workspace for an efficient algorithm. */ ldwork = *m; /* Computing MAX */ /* Computing MAX */ i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = max(i__3,*nrhs), i__4 = *n - *m * 3; i__1 = (*m << 2) + *m * *lda + max(i__3,i__4), i__2 = *m * *lda + *m + *m * *nrhs, i__1 = max(i__1,i__2), i__2 = (*m << 2) + *m * *lda + wlalsd; if (*lwork >= max(i__1,i__2)) { ldwork = *lda; } itau = 1; nwork = *m + 1; /* Compute A=L*Q. */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, info); il = nwork; /* Copy L to WORK(IL), zeroing out above its diagonal. */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[il], &ldwork); i__1 = *m - 1; i__2 = *m - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b82, &c_b82, &work[il + ldwork], & ldwork); ie = il + ldwork * *m; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize L in WORK(IL). */ /* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], &work[itaup], &work[nwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors of L. */ /* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "T", m, nrhs, m, &work[il], &ldwork, &work[ itauq], &b[b_offset], ldb, &work[nwork], &i__1, info); /* Solve the bidiagonal least squares problem. */ _starpu_dlalsd_("U", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], ldb, rcond, rank, &work[nwork], &iwork[1], info); if (*info != 0) { goto L10; } /* Multiply B by right bidiagonalizing vectors of L. */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "L", "N", m, nrhs, m, &work[il], &ldwork, &work[ itaup], &b[b_offset], ldb, &work[nwork], &i__1, info); /* Zero out below first M rows of B. */ i__1 = *n - *m; _starpu_dlaset_("F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb); nwork = itau + *m; /* Multiply transpose(Q) by B. */ /* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormlq_("L", "T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ b_offset], ldb, &work[nwork], &i__1, info); } else { /* Path 2 - remaining underdetermined cases. */ ie = 1; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize A. */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[nwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors. */ /* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "T", m, nrhs, n, &a[a_offset], lda, &work[itauq] , &b[b_offset], ldb, &work[nwork], &i__1, info); /* Solve the bidiagonal least squares problem. */ _starpu_dlalsd_("L", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], ldb, rcond, rank, &work[nwork], &iwork[1], info); if (*info != 0) { goto L10; } /* Multiply B by right bidiagonalizing vectors of A. */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "L", "N", n, nrhs, m, &a[a_offset], lda, &work[itaup] , &b[b_offset], ldb, &work[nwork], &i__1, info); } } /* Undo scaling. */ if (iascl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & minmn, info); } else if (iascl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & minmn, info); } if (ibscl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } else if (ibscl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } L10: work[1] = (doublereal) maxwrk; return 0; /* End of DGELSD */ } /* _starpu_dgelsd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgelss.c000066400000000000000000000643531413463044200206420ustar00rootroot00000000000000/* dgelss.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__6 = 6; static integer c_n1 = -1; static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b74 = 0.; static doublereal c_b108 = 1.; /* Subroutine */ int _starpu_dgelss_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; doublereal d__1; /* Local variables */ integer i__, bl, ie, il, mm; doublereal eps, thr, anrm, bnrm; integer itau; doublereal vdum[1]; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iascl, ibscl; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); integer chunk; doublereal sfmin; integer minmn; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer maxmn, itaup, itauq, mnthr, iwork; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dgebrd_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); integer bdspac; extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dorgbr_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal bignum; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer ldwork; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer minwrk, maxwrk; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELSS computes the minimum norm solution to a real linear least */ /* squares problem: */ /* Minimize 2-norm(| b - A*x |). */ /* using the singular value decomposition (SVD) of A. A is an M-by-N */ /* matrix which may be rank-deficient. */ /* Several right hand side vectors b and solution vectors x can be */ /* handled in a single call; they are stored as the columns of the */ /* M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix */ /* X. */ /* The effective rank of A is determined by treating as zero those */ /* singular values which are less than RCOND times the largest singular */ /* value. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the first min(m,n) rows of A are overwritten with */ /* its right singular vectors, stored rowwise. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the M-by-NRHS right hand side matrix B. */ /* On exit, B is overwritten by the N-by-NRHS solution */ /* matrix X. If m >= n and RANK = n, the residual */ /* sum-of-squares for the solution in the i-th column is given */ /* by the sum of squares of elements n+1:m in that column. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,max(M,N)). */ /* S (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The singular values of A in decreasing order. */ /* The condition number of A in the 2-norm = S(1)/S(min(m,n)). */ /* RCOND (input) DOUBLE PRECISION */ /* RCOND is used to determine the effective rank of A. */ /* Singular values S(i) <= RCOND*S(1) are treated as zero. */ /* If RCOND < 0, machine precision is used instead. */ /* RANK (output) INTEGER */ /* The effective rank of A, i.e., the number of singular values */ /* which are greater than RCOND*S(1). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= 1, and also: */ /* LWORK >= 3*min(M,N) + max( 2*min(M,N), max(M,N), NRHS ) */ /* For good performance, LWORK should generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: the algorithm for computing the SVD failed to converge; */ /* if INFO = i, i off-diagonal elements of an intermediate */ /* bidiagonal form did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --s; --work; /* Function Body */ *info = 0; minmn = min(*m,*n); maxmn = max(*m,*n); lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*ldb < max(1,maxmn)) { *info = -7; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { minwrk = 1; maxwrk = 1; if (minmn > 0) { mm = *m; mnthr = _starpu_ilaenv_(&c__6, "DGELSS", " ", m, n, nrhs, &c_n1); if (*m >= *n && *m >= mnthr) { /* Path 1a - overdetermined, with many more rows than */ /* columns */ mm = *n; /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *nrhs * _starpu_ilaenv_(&c__1, "DORMQR", "LT", m, nrhs, n, &c_n1); maxwrk = max(i__1,i__2); } if (*m >= *n) { /* Path 1 - overdetermined or exactly determined */ /* Compute workspace needed for DBDSQR */ /* Computing MAX */ i__1 = 1, i__2 = *n * 5; bdspac = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", &mm, n, &c_n1, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + *nrhs * _starpu_ilaenv_(&c__1, "DORMBR" , "QLT", &mm, nrhs, n, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); maxwrk = max(i__1,i__2); maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * *nrhs; maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, i__2); minwrk = max(i__1,bdspac); maxwrk = max(minwrk,maxwrk); } if (*n > *m) { /* Compute workspace needed for DBDSQR */ /* Computing MAX */ i__1 = 1, i__2 = *m * 5; bdspac = max(i__1,i__2); /* Computing MAX */ i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *n, i__1 = max(i__1, i__2); minwrk = max(i__1,bdspac); if (*n >= mnthr) { /* Path 2a - underdetermined, with many more columns */ /* than rows */ maxwrk = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + *nrhs * _starpu_ilaenv_(&c__1, "DORMBR", "QLT", m, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + *m + bdspac; maxwrk = max(i__1,i__2); if (*nrhs > 1) { /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; maxwrk = max(i__1,i__2); } else { /* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 1); maxwrk = max(i__1,i__2); } /* Computing MAX */ i__1 = maxwrk, i__2 = *m + *nrhs * _starpu_ilaenv_(&c__1, "DORMLQ" , "LT", n, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); } else { /* Path 2 - underdetermined */ maxwrk = *m * 3 + (*n + *m) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * 3 + *nrhs * _starpu_ilaenv_(&c__1, "DORMBR", "QLT", m, nrhs, m, &c_n1); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORG" "BR", "P", m, n, m, &c_n1); maxwrk = max(i__1,i__2); maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * *nrhs; maxwrk = max(i__1,i__2); } } maxwrk = max(minwrk,maxwrk); } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELSS", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { *rank = 0; return 0; } /* Get machine parameters */ eps = _starpu_dlamch_("P"); sfmin = _starpu_dlamch_("S"); smlnum = sfmin / eps; bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, &work[1]); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b74, &c_b74, &b[b_offset], ldb); _starpu_dlaset_("F", &minmn, &c__1, &c_b74, &c_b74, &s[1], &c__1); *rank = 0; goto L70; } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ bnrm = _starpu_dlange_("M", m, nrhs, &b[b_offset], ldb, &work[1]); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, info); ibscl = 2; } /* Overdetermined case */ if (*m >= *n) { /* Path 1 - overdetermined or exactly determined */ mm = *m; if (*m >= mnthr) { /* Path 1a - overdetermined, with many more rows than columns */ mm = *n; itau = 1; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__1 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__1, info); /* Multiply B by transpose(Q) */ /* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ i__1 = *lwork - iwork + 1; _starpu_dormqr_("L", "T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ b_offset], ldb, &work[iwork], &i__1, info); /* Zero out below R */ if (*n > 1) { i__1 = *n - 1; i__2 = *n - 1; _starpu_dlaset_("L", &i__1, &i__2, &c_b74, &c_b74, &a[a_dim1 + 2], lda); } } ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in A */ /* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ i__1 = *lwork - iwork + 1; _starpu_dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[iwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors of R */ /* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ i__1 = *lwork - iwork + 1; _starpu_dormbr_("Q", "L", "T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], &b[b_offset], ldb, &work[iwork], &i__1, info); /* Generate right bidiagonalizing vectors of R in A */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__1 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], & i__1, info); iwork = ie + *n; /* Perform bidiagonal QR iteration */ /* multiply B by transpose of left singular vectors */ /* compute right singular vectors in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, vdum, &c__1, &b[b_offset], ldb, &work[iwork], info) ; if (*info != 0) { goto L70; } /* Multiply B by reciprocals of singular values */ /* Computing MAX */ d__1 = *rcond * s[1]; thr = max(d__1,sfmin); if (*rcond < 0.) { /* Computing MAX */ d__1 = eps * s[1]; thr = max(d__1,sfmin); } *rank = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] > thr) { _starpu_drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); ++(*rank); } else { _starpu_dlaset_("F", &c__1, nrhs, &c_b74, &c_b74, &b[i__ + b_dim1], ldb); } /* L10: */ } /* Multiply B by right singular vectors */ /* (Workspace: need N, prefer N*NRHS) */ if (*lwork >= *ldb * *nrhs && *nrhs > 1) { _starpu_dgemm_("T", "N", n, nrhs, n, &c_b108, &a[a_offset], lda, &b[ b_offset], ldb, &c_b74, &work[1], ldb); _starpu_dlacpy_("G", n, nrhs, &work[1], ldb, &b[b_offset], ldb) ; } else if (*nrhs > 1) { chunk = *lwork / *n; i__1 = *nrhs; i__2 = chunk; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = *nrhs - i__ + 1; bl = min(i__3,chunk); _starpu_dgemm_("T", "N", n, &bl, n, &c_b108, &a[a_offset], lda, &b[ i__ * b_dim1 + 1], ldb, &c_b74, &work[1], n); _starpu_dlacpy_("G", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb); /* L20: */ } } else { _starpu_dgemv_("T", n, n, &c_b108, &a[a_offset], lda, &b[b_offset], &c__1, &c_b74, &work[1], &c__1); _starpu_dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); } } else /* if(complicated condition) */ { /* Computing MAX */ i__2 = *m, i__1 = (*m << 1) - 4, i__2 = max(i__2,i__1), i__2 = max( i__2,*nrhs), i__1 = *n - *m * 3; if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__2,i__1)) { /* Path 2a - underdetermined, with many more columns than rows */ /* and sufficient workspace for an efficient algorithm */ ldwork = *m; /* Computing MAX */ /* Computing MAX */ i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = max(i__3,*nrhs), i__4 = *n - *m * 3; i__2 = (*m << 2) + *m * *lda + max(i__3,i__4), i__1 = *m * *lda + *m + *m * *nrhs; if (*lwork >= max(i__2,i__1)) { ldwork = *lda; } itau = 1; iwork = *m + 1; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, info); il = iwork; /* Copy L to WORK(IL), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[il], &ldwork); i__2 = *m - 1; i__1 = *m - 1; _starpu_dlaset_("U", &i__2, &i__1, &c_b74, &c_b74, &work[il + ldwork], & ldwork); ie = il + ldwork * *m; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IL) */ /* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], &work[itaup], &work[iwork], &i__2, info); /* Multiply B by transpose of left bidiagonalizing vectors of L */ /* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "L", "T", m, nrhs, m, &work[il], &ldwork, &work[ itauq], &b[b_offset], ldb, &work[iwork], &i__2, info); /* Generate right bidiagonalizing vectors of R in WORK(IL) */ /* (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[il], &ldwork, &work[itaup], &work[ iwork], &i__2, info); iwork = ie + *m; /* Perform bidiagonal QR iteration, */ /* computing right singular vectors of L in WORK(IL) and */ /* multiplying B by transpose of left singular vectors */ /* (Workspace: need M*M+M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, &c__0, nrhs, &s[1], &work[ie], &work[il], & ldwork, &a[a_offset], lda, &b[b_offset], ldb, &work[iwork] , info); if (*info != 0) { goto L70; } /* Multiply B by reciprocals of singular values */ /* Computing MAX */ d__1 = *rcond * s[1]; thr = max(d__1,sfmin); if (*rcond < 0.) { /* Computing MAX */ d__1 = eps * s[1]; thr = max(d__1,sfmin); } *rank = 0; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { if (s[i__] > thr) { _starpu_drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); ++(*rank); } else { _starpu_dlaset_("F", &c__1, nrhs, &c_b74, &c_b74, &b[i__ + b_dim1] , ldb); } /* L30: */ } iwork = ie; /* Multiply B by right singular vectors of L in WORK(IL) */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS) */ if (*lwork >= *ldb * *nrhs + iwork - 1 && *nrhs > 1) { _starpu_dgemm_("T", "N", m, nrhs, m, &c_b108, &work[il], &ldwork, &b[ b_offset], ldb, &c_b74, &work[iwork], ldb); _starpu_dlacpy_("G", m, nrhs, &work[iwork], ldb, &b[b_offset], ldb); } else if (*nrhs > 1) { chunk = (*lwork - iwork + 1) / *m; i__2 = *nrhs; i__1 = chunk; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Computing MIN */ i__3 = *nrhs - i__ + 1; bl = min(i__3,chunk); _starpu_dgemm_("T", "N", m, &bl, m, &c_b108, &work[il], &ldwork, & b[i__ * b_dim1 + 1], ldb, &c_b74, &work[iwork], m); _starpu_dlacpy_("G", m, &bl, &work[iwork], m, &b[i__ * b_dim1 + 1] , ldb); /* L40: */ } } else { _starpu_dgemv_("T", m, m, &c_b108, &work[il], &ldwork, &b[b_dim1 + 1], &c__1, &c_b74, &work[iwork], &c__1); _starpu_dcopy_(m, &work[iwork], &c__1, &b[b_dim1 + 1], &c__1); } /* Zero out below first M rows of B */ i__1 = *n - *m; _starpu_dlaset_("F", &i__1, nrhs, &c_b74, &c_b74, &b[*m + 1 + b_dim1], ldb); iwork = itau + *m; /* Multiply transpose(Q) by B */ /* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ i__1 = *lwork - iwork + 1; _starpu_dormlq_("L", "T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ b_offset], ldb, &work[iwork], &i__1, info); } else { /* Path 2 - remaining underdetermined cases */ ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__1 = *lwork - iwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[iwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors */ /* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ i__1 = *lwork - iwork + 1; _starpu_dormbr_("Q", "L", "T", m, nrhs, n, &a[a_offset], lda, &work[itauq] , &b[b_offset], ldb, &work[iwork], &i__1, info); /* Generate right bidiagonalizing vectors in A */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__1 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ iwork], &i__1, info); iwork = ie + *m; /* Perform bidiagonal QR iteration, */ /* computing right singular vectors of A in A and */ /* multiplying B by transpose of left singular vectors */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("L", m, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, vdum, &c__1, &b[b_offset], ldb, &work[iwork], info); if (*info != 0) { goto L70; } /* Multiply B by reciprocals of singular values */ /* Computing MAX */ d__1 = *rcond * s[1]; thr = max(d__1,sfmin); if (*rcond < 0.) { /* Computing MAX */ d__1 = eps * s[1]; thr = max(d__1,sfmin); } *rank = 0; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] > thr) { _starpu_drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); ++(*rank); } else { _starpu_dlaset_("F", &c__1, nrhs, &c_b74, &c_b74, &b[i__ + b_dim1] , ldb); } /* L50: */ } /* Multiply B by right singular vectors of A */ /* (Workspace: need N, prefer N*NRHS) */ if (*lwork >= *ldb * *nrhs && *nrhs > 1) { _starpu_dgemm_("T", "N", n, nrhs, m, &c_b108, &a[a_offset], lda, &b[ b_offset], ldb, &c_b74, &work[1], ldb); _starpu_dlacpy_("F", n, nrhs, &work[1], ldb, &b[b_offset], ldb); } else if (*nrhs > 1) { chunk = *lwork / *n; i__1 = *nrhs; i__2 = chunk; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = *nrhs - i__ + 1; bl = min(i__3,chunk); _starpu_dgemm_("T", "N", n, &bl, m, &c_b108, &a[a_offset], lda, & b[i__ * b_dim1 + 1], ldb, &c_b74, &work[1], n); _starpu_dlacpy_("F", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb); /* L60: */ } } else { _starpu_dgemv_("T", m, n, &c_b108, &a[a_offset], lda, &b[b_offset], & c__1, &c_b74, &work[1], &c__1); _starpu_dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); } } } /* Undo scaling */ if (iascl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & minmn, info); } else if (iascl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & minmn, info); } if (ibscl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } else if (ibscl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } L70: work[1] = (doublereal) maxwrk; return 0; /* End of DGELSS */ } /* _starpu_dgelss_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgelsx.c000066400000000000000000000322151413463044200206370ustar00rootroot00000000000000/* dgelsx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__0 = 0; static doublereal c_b13 = 0.; static integer c__2 = 2; static integer c__1 = 1; static doublereal c_b36 = 1.; /* Subroutine */ int _starpu_dgelsx_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, k; doublereal c1, c2, s1, s2, t1, t2; integer mn; doublereal anrm, bnrm, smin, smax; integer iascl, ibscl, ismin, ismax; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaic1_( integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dorm2r_( char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqpf_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dlatzm_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *); doublereal sminpr, smaxpr, smlnum; extern /* Subroutine */ int _starpu_dtzrqf_(integer *, integer *, doublereal *, integer *, doublereal *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is deprecated and has been replaced by routine DGELSY. */ /* DGELSX computes the minimum-norm solution to a real linear least */ /* squares problem: */ /* minimize || A * X - B || */ /* using a complete orthogonal factorization of A. A is an M-by-N */ /* matrix which may be rank-deficient. */ /* Several right hand side vectors b and solution vectors x can be */ /* handled in a single call; they are stored as the columns of the */ /* M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ /* matrix X. */ /* The routine first computes a QR factorization with column pivoting: */ /* A * P = Q * [ R11 R12 ] */ /* [ 0 R22 ] */ /* with R11 defined as the largest leading submatrix whose estimated */ /* condition number is less than 1/RCOND. The order of R11, RANK, */ /* is the effective rank of A. */ /* Then, R22 is considered to be negligible, and R12 is annihilated */ /* by orthogonal transformations from the right, arriving at the */ /* complete orthogonal factorization: */ /* A * P = Q * [ T11 0 ] * Z */ /* [ 0 0 ] */ /* The minimum-norm solution is then */ /* X = P * Z' [ inv(T11)*Q1'*B ] */ /* [ 0 ] */ /* where Q1 consists of the first RANK columns of Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of */ /* columns of matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, A has been overwritten by details of its */ /* complete orthogonal factorization. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the M-by-NRHS right hand side matrix B. */ /* On exit, the N-by-NRHS solution matrix X. */ /* If m >= n and RANK = n, the residual sum-of-squares for */ /* the solution in the i-th column is given by the sum of */ /* squares of elements N+1:M in that column. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,M,N). */ /* JPVT (input/output) INTEGER array, dimension (N) */ /* On entry, if JPVT(i) .ne. 0, the i-th column of A is an */ /* initial column, otherwise it is a free column. Before */ /* the QR factorization of A, all initial columns are */ /* permuted to the leading positions; only the remaining */ /* free columns are moved as a result of column pivoting */ /* during the factorization. */ /* On exit, if JPVT(i) = k, then the i-th column of A*P */ /* was the k-th column of A. */ /* RCOND (input) DOUBLE PRECISION */ /* RCOND is used to determine the effective rank of A, which */ /* is defined as the order of the largest leading triangular */ /* submatrix R11 in the QR factorization with pivoting of A, */ /* whose estimated condition number < 1/RCOND. */ /* RANK (output) INTEGER */ /* The effective rank of A, i.e., the order of the submatrix */ /* R11. This is the same as the order of the submatrix T11 */ /* in the complete orthogonal factorization of A. */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (max( min(M,N)+3*N, 2*min(M,N)+NRHS )), */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --jpvt; --work; /* Function Body */ mn = min(*m,*n); ismin = mn + 1; ismax = (mn << 1) + 1; /* Test the input arguments. */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*ldb < max(i__1,*n)) { *info = -7; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELSX", &i__1); return 0; } /* Quick return if possible */ /* Computing MIN */ i__1 = min(*m,*n); if (min(i__1,*nrhs) == 0) { *rank = 0; return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S") / _starpu_dlamch_("P"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Scale A, B if max elements outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, &work[1]); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b13, &c_b13, &b[b_offset], ldb); *rank = 0; goto L100; } bnrm = _starpu_dlange_("M", m, nrhs, &b[b_offset], ldb, &work[1]); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, info); ibscl = 2; } /* Compute QR factorization with column pivoting of A: */ /* A * P = Q * R */ _starpu_dgeqpf_(m, n, &a[a_offset], lda, &jpvt[1], &work[1], &work[mn + 1], info); /* workspace 3*N. Details of Householder rotations stored */ /* in WORK(1:MN). */ /* Determine RANK using incremental condition estimation */ work[ismin] = 1.; work[ismax] = 1.; smax = (d__1 = a[a_dim1 + 1], abs(d__1)); smin = smax; if ((d__1 = a[a_dim1 + 1], abs(d__1)) == 0.) { *rank = 0; i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b13, &c_b13, &b[b_offset], ldb); goto L100; } else { *rank = 1; } L10: if (*rank < mn) { i__ = *rank + 1; _starpu_dlaic1_(&c__2, rank, &work[ismin], &smin, &a[i__ * a_dim1 + 1], &a[ i__ + i__ * a_dim1], &sminpr, &s1, &c1); _starpu_dlaic1_(&c__1, rank, &work[ismax], &smax, &a[i__ * a_dim1 + 1], &a[ i__ + i__ * a_dim1], &smaxpr, &s2, &c2); if (smaxpr * *rcond <= sminpr) { i__1 = *rank; for (i__ = 1; i__ <= i__1; ++i__) { work[ismin + i__ - 1] = s1 * work[ismin + i__ - 1]; work[ismax + i__ - 1] = s2 * work[ismax + i__ - 1]; /* L20: */ } work[ismin + *rank] = c1; work[ismax + *rank] = c2; smin = sminpr; smax = smaxpr; ++(*rank); goto L10; } } /* Logically partition R = [ R11 R12 ] */ /* [ 0 R22 ] */ /* where R11 = R(1:RANK,1:RANK) */ /* [R11,R12] = [ T11, 0 ] * Y */ if (*rank < *n) { _starpu_dtzrqf_(rank, n, &a[a_offset], lda, &work[mn + 1], info); } /* Details of Householder rotations stored in WORK(MN+1:2*MN) */ /* B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS) */ _starpu_dorm2r_("Left", "Transpose", m, nrhs, &mn, &a[a_offset], lda, &work[1], & b[b_offset], ldb, &work[(mn << 1) + 1], info); /* workspace NRHS */ /* B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS) */ _starpu_dtrsm_("Left", "Upper", "No transpose", "Non-unit", rank, nrhs, &c_b36, & a[a_offset], lda, &b[b_offset], ldb); i__1 = *n; for (i__ = *rank + 1; i__ <= i__1; ++i__) { i__2 = *nrhs; for (j = 1; j <= i__2; ++j) { b[i__ + j * b_dim1] = 0.; /* L30: */ } /* L40: */ } /* B(1:N,1:NRHS) := Y' * B(1:N,1:NRHS) */ if (*rank < *n) { i__1 = *rank; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n - *rank + 1; _starpu_dlatzm_("Left", &i__2, nrhs, &a[i__ + (*rank + 1) * a_dim1], lda, &work[mn + i__], &b[i__ + b_dim1], &b[*rank + 1 + b_dim1], ldb, &work[(mn << 1) + 1]); /* L50: */ } } /* workspace NRHS */ /* B(1:N,1:NRHS) := P * B(1:N,1:NRHS) */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[(mn << 1) + i__] = 1.; /* L60: */ } i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[(mn << 1) + i__] == 1.) { if (jpvt[i__] != i__) { k = i__; t1 = b[k + j * b_dim1]; t2 = b[jpvt[k] + j * b_dim1]; L70: b[jpvt[k] + j * b_dim1] = t1; work[(mn << 1) + k] = 0.; t1 = t2; k = jpvt[k]; t2 = b[jpvt[k] + j * b_dim1]; if (jpvt[k] != i__) { goto L70; } b[i__ + j * b_dim1] = t1; work[(mn << 1) + k] = 0.; } } /* L80: */ } /* L90: */ } /* Undo scaling */ if (iascl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("U", &c__0, &c__0, &smlnum, &anrm, rank, rank, &a[a_offset], lda, info); } else if (iascl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("U", &c__0, &c__0, &bignum, &anrm, rank, rank, &a[a_offset], lda, info); } if (ibscl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } else if (ibscl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } L100: return 0; /* End of DGELSX */ } /* _starpu_dgelsx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgelsy.c000066400000000000000000000371321413463044200206430ustar00rootroot00000000000000/* dgelsy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b31 = 0.; static integer c__2 = 2; static doublereal c_b54 = 1.; /* Subroutine */ int _starpu_dgelsy_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j; doublereal c1, c2, s1, s2; integer nb, mn, nb1, nb2, nb3, nb4; doublereal anrm, bnrm, smin, smax; integer iascl, ibscl; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer ismin, ismax; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaic1_( integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal wsize; extern /* Subroutine */ int _starpu_dgeqp3_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; integer lwkmin; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal sminpr, smaxpr, smlnum; extern /* Subroutine */ int _starpu_dormrz_(char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; extern /* Subroutine */ int _starpu_dtzrzf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGELSY computes the minimum-norm solution to a real linear least */ /* squares problem: */ /* minimize || A * X - B || */ /* using a complete orthogonal factorization of A. A is an M-by-N */ /* matrix which may be rank-deficient. */ /* Several right hand side vectors b and solution vectors x can be */ /* handled in a single call; they are stored as the columns of the */ /* M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ /* matrix X. */ /* The routine first computes a QR factorization with column pivoting: */ /* A * P = Q * [ R11 R12 ] */ /* [ 0 R22 ] */ /* with R11 defined as the largest leading submatrix whose estimated */ /* condition number is less than 1/RCOND. The order of R11, RANK, */ /* is the effective rank of A. */ /* Then, R22 is considered to be negligible, and R12 is annihilated */ /* by orthogonal transformations from the right, arriving at the */ /* complete orthogonal factorization: */ /* A * P = Q * [ T11 0 ] * Z */ /* [ 0 0 ] */ /* The minimum-norm solution is then */ /* X = P * Z' [ inv(T11)*Q1'*B ] */ /* [ 0 ] */ /* where Q1 consists of the first RANK columns of Q. */ /* This routine is basically identical to the original xGELSX except */ /* three differences: */ /* o The call to the subroutine xGEQPF has been substituted by the */ /* the call to the subroutine xGEQP3. This subroutine is a Blas-3 */ /* version of the QR factorization with column pivoting. */ /* o Matrix B (the right hand side) is updated with Blas-3. */ /* o The permutation of matrix B (the right hand side) is faster and */ /* more simple. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of */ /* columns of matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, A has been overwritten by details of its */ /* complete orthogonal factorization. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the M-by-NRHS right hand side matrix B. */ /* On exit, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,M,N). */ /* JPVT (input/output) INTEGER array, dimension (N) */ /* On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted */ /* to the front of AP, otherwise column i is a free column. */ /* On exit, if JPVT(i) = k, then the i-th column of AP */ /* was the k-th column of A. */ /* RCOND (input) DOUBLE PRECISION */ /* RCOND is used to determine the effective rank of A, which */ /* is defined as the order of the largest leading triangular */ /* submatrix R11 in the QR factorization with pivoting of A, */ /* whose estimated condition number < 1/RCOND. */ /* RANK (output) INTEGER */ /* The effective rank of A, i.e., the order of the submatrix */ /* R11. This is the same as the order of the submatrix T11 */ /* in the complete orthogonal factorization of A. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* The unblocked strategy requires that: */ /* LWORK >= MAX( MN+3*N+1, 2*MN+NRHS ), */ /* where MN = min( M, N ). */ /* The block algorithm requires that: */ /* LWORK >= MAX( MN+2*N+NB*(N+1), 2*MN+NB*NRHS ), */ /* where NB is an upper bound on the blocksize returned */ /* by ILAENV for the routines DGEQP3, DTZRZF, STZRQF, DORMQR, */ /* and DORMRZ. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: If INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* E. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ /* G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --jpvt; --work; /* Function Body */ mn = min(*m,*n); ismin = mn + 1; ismax = (mn << 1) + 1; /* Test the input arguments. */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m); if (*ldb < max(i__1,*n)) { *info = -7; } } /* Figure out optimal block size */ if (*info == 0) { if (mn == 0 || *nrhs == 0) { lwkmin = 1; lwkopt = 1; } else { nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DGERQF", " ", m, n, &c_n1, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORMQR", " ", m, n, nrhs, &c_n1); nb4 = _starpu_ilaenv_(&c__1, "DORMRQ", " ", m, n, nrhs, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2), i__1 = max(i__1,nb3); nb = max(i__1,nb4); /* Computing MAX */ i__1 = mn << 1, i__2 = *n + 1, i__1 = max(i__1,i__2), i__2 = mn + *nrhs; lwkmin = mn + max(i__1,i__2); /* Computing MAX */ i__1 = lwkmin, i__2 = mn + (*n << 1) + nb * (*n + 1), i__1 = max( i__1,i__2), i__2 = (mn << 1) + nb * *nrhs; lwkopt = max(i__1,i__2); } work[1] = (doublereal) lwkopt; if (*lwork < lwkmin && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGELSY", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (mn == 0 || *nrhs == 0) { *rank = 0; return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S") / _starpu_dlamch_("P"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Scale A, B if max entries outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, &work[1]); iascl = 0; if (anrm > 0. && anrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info); iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info); iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b31, &c_b31, &b[b_offset], ldb); *rank = 0; goto L70; } bnrm = _starpu_dlange_("M", m, nrhs, &b[b_offset], ldb, &work[1]); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { /* Scale matrix norm up to SMLNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, info); ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, info); ibscl = 2; } /* Compute QR factorization with column pivoting of A: */ /* A * P = Q * R */ i__1 = *lwork - mn; _starpu_dgeqp3_(m, n, &a[a_offset], lda, &jpvt[1], &work[1], &work[mn + 1], &i__1, info); wsize = mn + work[mn + 1]; /* workspace: MN+2*N+NB*(N+1). */ /* Details of Householder rotations stored in WORK(1:MN). */ /* Determine RANK using incremental condition estimation */ work[ismin] = 1.; work[ismax] = 1.; smax = (d__1 = a[a_dim1 + 1], abs(d__1)); smin = smax; if ((d__1 = a[a_dim1 + 1], abs(d__1)) == 0.) { *rank = 0; i__1 = max(*m,*n); _starpu_dlaset_("F", &i__1, nrhs, &c_b31, &c_b31, &b[b_offset], ldb); goto L70; } else { *rank = 1; } L10: if (*rank < mn) { i__ = *rank + 1; _starpu_dlaic1_(&c__2, rank, &work[ismin], &smin, &a[i__ * a_dim1 + 1], &a[ i__ + i__ * a_dim1], &sminpr, &s1, &c1); _starpu_dlaic1_(&c__1, rank, &work[ismax], &smax, &a[i__ * a_dim1 + 1], &a[ i__ + i__ * a_dim1], &smaxpr, &s2, &c2); if (smaxpr * *rcond <= sminpr) { i__1 = *rank; for (i__ = 1; i__ <= i__1; ++i__) { work[ismin + i__ - 1] = s1 * work[ismin + i__ - 1]; work[ismax + i__ - 1] = s2 * work[ismax + i__ - 1]; /* L20: */ } work[ismin + *rank] = c1; work[ismax + *rank] = c2; smin = sminpr; smax = smaxpr; ++(*rank); goto L10; } } /* workspace: 3*MN. */ /* Logically partition R = [ R11 R12 ] */ /* [ 0 R22 ] */ /* where R11 = R(1:RANK,1:RANK) */ /* [R11,R12] = [ T11, 0 ] * Y */ if (*rank < *n) { i__1 = *lwork - (mn << 1); _starpu_dtzrzf_(rank, n, &a[a_offset], lda, &work[mn + 1], &work[(mn << 1) + 1], &i__1, info); } /* workspace: 2*MN. */ /* Details of Householder rotations stored in WORK(MN+1:2*MN) */ /* B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS) */ i__1 = *lwork - (mn << 1); _starpu_dormqr_("Left", "Transpose", m, nrhs, &mn, &a[a_offset], lda, &work[1], & b[b_offset], ldb, &work[(mn << 1) + 1], &i__1, info); /* Computing MAX */ d__1 = wsize, d__2 = (mn << 1) + work[(mn << 1) + 1]; wsize = max(d__1,d__2); /* workspace: 2*MN+NB*NRHS. */ /* B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS) */ _starpu_dtrsm_("Left", "Upper", "No transpose", "Non-unit", rank, nrhs, &c_b54, & a[a_offset], lda, &b[b_offset], ldb); i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = *rank + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L30: */ } /* L40: */ } /* B(1:N,1:NRHS) := Y' * B(1:N,1:NRHS) */ if (*rank < *n) { i__1 = *n - *rank; i__2 = *lwork - (mn << 1); _starpu_dormrz_("Left", "Transpose", n, nrhs, rank, &i__1, &a[a_offset], lda, &work[mn + 1], &b[b_offset], ldb, &work[(mn << 1) + 1], &i__2, info); } /* workspace: 2*MN+NRHS. */ /* B(1:N,1:NRHS) := P * B(1:N,1:NRHS) */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[jpvt[i__]] = b[i__ + j * b_dim1]; /* L50: */ } _starpu_dcopy_(n, &work[1], &c__1, &b[j * b_dim1 + 1], &c__1); /* L60: */ } /* workspace: N. */ /* Undo scaling */ if (iascl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("U", &c__0, &c__0, &smlnum, &anrm, rank, rank, &a[a_offset], lda, info); } else if (iascl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, info); _starpu_dlascl_("U", &c__0, &c__0, &bignum, &anrm, rank, rank, &a[a_offset], lda, info); } if (ibscl == 1) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } else if (ibscl == 2) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, info); } L70: work[1] = (doublereal) lwkopt; return 0; /* End of DGELSY */ } /* _starpu_dgelsy_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeql2.c000066400000000000000000000111231413463044200205220ustar00rootroot00000000000000/* dgeql2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgeql2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, k; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQL2 computes a QL factorization of a real m by n matrix A: */ /* A = Q * L. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix A. */ /* On exit, if m >= n, the lower triangle of the subarray */ /* A(m-n+1:m,1:n) contains the n by n lower triangular matrix L; */ /* if m <= n, the elements on and below the (n-m)-th */ /* superdiagonal contain the m by n lower trapezoidal matrix L; */ /* the remaining elements, with the array TAU, represent the */ /* orthogonal matrix Q as a product of elementary reflectors */ /* (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(k) . . . H(2) H(1), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(m-k+i+1:m) = 0 and v(m-k+i) = 1; v(1:m-k+i-1) is stored on exit in */ /* A(1:m-k+i-1,n-k+i), and tau in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQL2", &i__1); return 0; } k = min(*m,*n); for (i__ = k; i__ >= 1; --i__) { /* Generate elementary reflector H(i) to annihilate */ /* A(1:m-k+i-1,n-k+i) */ i__1 = *m - k + i__; _starpu_dlarfp_(&i__1, &a[*m - k + i__ + (*n - k + i__) * a_dim1], &a[(*n - k + i__) * a_dim1 + 1], &c__1, &tau[i__]); /* Apply H(i) to A(1:m-k+i,1:n-k+i-1) from the left */ aii = a[*m - k + i__ + (*n - k + i__) * a_dim1]; a[*m - k + i__ + (*n - k + i__) * a_dim1] = 1.; i__1 = *m - k + i__; i__2 = *n - k + i__ - 1; _starpu_dlarf_("Left", &i__1, &i__2, &a[(*n - k + i__) * a_dim1 + 1], &c__1, & tau[i__], &a[a_offset], lda, &work[1]); a[*m - k + i__ + (*n - k + i__) * a_dim1] = aii; /* L10: */ } return 0; /* End of DGEQL2 */ } /* _starpu_dgeql2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeqlf.c000066400000000000000000000173341413463044200206200ustar00rootroot00000000000000/* dgeqlf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgeqlf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, ki, kk, mu, nu, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dgeql2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQLF computes a QL factorization of a real M-by-N matrix A: */ /* A = Q * L. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if m >= n, the lower triangle of the subarray */ /* A(m-n+1:m,1:n) contains the N-by-N lower triangular matrix L; */ /* if m <= n, the elements on and below the (n-m)-th */ /* superdiagonal contain the M-by-N lower trapezoidal matrix L; */ /* the remaining elements, with the array TAU, represent the */ /* orthogonal matrix Q as a product of elementary reflectors */ /* (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* For optimum performance LWORK >= N*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(k) . . . H(2) H(1), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(m-k+i+1:m) = 0 and v(m-k+i) = 1; v(1:m-k+i-1) is stored on exit in */ /* A(1:m-k+i-1,n-k+i), and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info == 0) { k = min(*m,*n); if (k == 0) { lwkopt = 1; } else { nb = _starpu_ilaenv_(&c__1, "DGEQLF", " ", m, n, &c_n1, &c_n1); lwkopt = *n * nb; } work[1] = (doublereal) lwkopt; if (*lwork < max(1,*n) && ! lquery) { *info = -7; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQLF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (k == 0) { return 0; } nbmin = 2; nx = 1; iws = *n; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGEQLF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGEQLF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially. */ /* The last kk columns are handled by the block method. */ ki = (k - nx - 1) / nb * nb; /* Computing MIN */ i__1 = k, i__2 = ki + nb; kk = min(i__1,i__2); i__1 = k - kk + 1; i__2 = -nb; for (i__ = k - kk + ki + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the QL factorization of the current block */ /* A(1:m-k+i+ib-1,n-k+i:n-k+i+ib-1) */ i__3 = *m - k + i__ + ib - 1; _starpu_dgeql2_(&i__3, &ib, &a[(*n - k + i__) * a_dim1 + 1], lda, &tau[ i__], &work[1], &iinfo); if (*n - k + i__ > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__3 = *m - k + i__ + ib - 1; _starpu_dlarft_("Backward", "Columnwise", &i__3, &ib, &a[(*n - k + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ i__3 = *m - k + i__ + ib - 1; i__4 = *n - k + i__ - 1; _starpu_dlarfb_("Left", "Transpose", "Backward", "Columnwise", &i__3, &i__4, &ib, &a[(*n - k + i__) * a_dim1 + 1], lda, & work[1], &ldwork, &a[a_offset], lda, &work[ib + 1], & ldwork); } /* L10: */ } mu = *m - k + i__ + nb - 1; nu = *n - k + i__ + nb - 1; } else { mu = *m; nu = *n; } /* Use unblocked code to factor the last or only block */ if (mu > 0 && nu > 0) { _starpu_dgeql2_(&mu, &nu, &a[a_offset], lda, &tau[1], &work[1], &iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGEQLF */ } /* _starpu_dgeqlf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeqp3.c000066400000000000000000000236131413463044200205360ustar00rootroot00000000000000/* dgeqp3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgeqp3_(integer *m, integer *n, doublereal *a, integer * lda, integer *jpvt, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer j, jb, na, nb, sm, sn, nx, fjb, iws, nfxd; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); integer nbmin, minmn; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer minws; extern /* Subroutine */ int _starpu_dlaqp2_(integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlaqps_(integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); integer topbmn, sminmn; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQP3 computes a QR factorization with column pivoting of a */ /* matrix A: A*P = Q*R using Level 3 BLAS. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the upper triangle of the array contains the */ /* min(M,N)-by-N upper trapezoidal matrix R; the elements below */ /* the diagonal, together with the array TAU, represent the */ /* orthogonal matrix Q as a product of min(M,N) elementary */ /* reflectors. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* JPVT (input/output) INTEGER array, dimension (N) */ /* On entry, if JPVT(J).ne.0, the J-th column of A is permuted */ /* to the front of A*P (a leading column); if JPVT(J)=0, */ /* the J-th column of A is a free column. */ /* On exit, if JPVT(J)=K, then the J-th column of A*P was the */ /* the K-th column of A. */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO=0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= 3*N+1. */ /* For optimal performance LWORK >= 2*N+( N+1 )*NB, where NB */ /* is the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real/complex scalar, and v is a real/complex vector */ /* with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in */ /* A(i+1:m,i), and tau in TAU(i). */ /* Based on contributions by */ /* G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ /* X. Sun, Computer Science Dept., Duke University, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test input arguments */ /* ==================== */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --jpvt; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info == 0) { minmn = min(*m,*n); if (minmn == 0) { iws = 1; lwkopt = 1; } else { iws = *n * 3 + 1; nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); lwkopt = (*n << 1) + (*n + 1) * nb; } work[1] = (doublereal) lwkopt; if (*lwork < iws && ! lquery) { *info = -8; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQP3", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible. */ if (minmn == 0) { return 0; } /* Move initial columns up front. */ nfxd = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (jpvt[j] != 0) { if (j != nfxd) { _starpu_dswap_(m, &a[j * a_dim1 + 1], &c__1, &a[nfxd * a_dim1 + 1], & c__1); jpvt[j] = jpvt[nfxd]; jpvt[nfxd] = j; } else { jpvt[j] = j; } ++nfxd; } else { jpvt[j] = j; } /* L10: */ } --nfxd; /* Factorize fixed columns */ /* ======================= */ /* Compute the QR factorization of fixed columns and update */ /* remaining columns. */ if (nfxd > 0) { na = min(*m,nfxd); /* CC CALL DGEQR2( M, NA, A, LDA, TAU, WORK, INFO ) */ _starpu_dgeqrf_(m, &na, &a[a_offset], lda, &tau[1], &work[1], lwork, info); /* Computing MAX */ i__1 = iws, i__2 = (integer) work[1]; iws = max(i__1,i__2); if (na < *n) { /* CC CALL DORM2R( 'Left', 'Transpose', M, N-NA, NA, A, LDA, */ /* CC $ TAU, A( 1, NA+1 ), LDA, WORK, INFO ) */ i__1 = *n - na; _starpu_dormqr_("Left", "Transpose", m, &i__1, &na, &a[a_offset], lda, & tau[1], &a[(na + 1) * a_dim1 + 1], lda, &work[1], lwork, info); /* Computing MAX */ i__1 = iws, i__2 = (integer) work[1]; iws = max(i__1,i__2); } } /* Factorize free columns */ /* ====================== */ if (nfxd < minmn) { sm = *m - nfxd; sn = *n - nfxd; sminmn = minmn - nfxd; /* Determine the block size. */ nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", &sm, &sn, &c_n1, &c_n1); nbmin = 2; nx = 0; if (nb > 1 && nb < sminmn) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGEQRF", " ", &sm, &sn, &c_n1, & c_n1); nx = max(i__1,i__2); if (nx < sminmn) { /* Determine if workspace is large enough for blocked code. */ minws = (sn << 1) + (sn + 1) * nb; iws = max(iws,minws); if (*lwork < minws) { /* Not enough workspace to use optimal NB: Reduce NB and */ /* determine the minimum value of NB. */ nb = (*lwork - (sn << 1)) / (sn + 1); /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGEQRF", " ", &sm, &sn, & c_n1, &c_n1); nbmin = max(i__1,i__2); } } } /* Initialize partial column norms. The first N elements of work */ /* store the exact column norms. */ i__1 = *n; for (j = nfxd + 1; j <= i__1; ++j) { work[j] = _starpu_dnrm2_(&sm, &a[nfxd + 1 + j * a_dim1], &c__1); work[*n + j] = work[j]; /* L20: */ } if (nb >= nbmin && nb < sminmn && nx < sminmn) { /* Use blocked code initially. */ j = nfxd + 1; /* Compute factorization: while loop. */ topbmn = minmn - nx; L30: if (j <= topbmn) { /* Computing MIN */ i__1 = nb, i__2 = topbmn - j + 1; jb = min(i__1,i__2); /* Factorize JB columns among columns J:N. */ i__1 = *n - j + 1; i__2 = j - 1; i__3 = *n - j + 1; _starpu_dlaqps_(m, &i__1, &i__2, &jb, &fjb, &a[j * a_dim1 + 1], lda, & jpvt[j], &tau[j], &work[j], &work[*n + j], &work[(*n << 1) + 1], &work[(*n << 1) + jb + 1], &i__3); j += fjb; goto L30; } } else { j = nfxd + 1; } /* Use unblocked code to factor the last or only block. */ if (j <= minmn) { i__1 = *n - j + 1; i__2 = j - 1; _starpu_dlaqp2_(m, &i__1, &i__2, &a[j * a_dim1 + 1], lda, &jpvt[j], &tau[ j], &work[j], &work[*n + j], &work[(*n << 1) + 1]); } } work[1] = (doublereal) iws; return 0; /* End of DGEQP3 */ } /* _starpu_dgeqp3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeqpf.c000066400000000000000000000207761413463044200206300ustar00rootroot00000000000000/* dgeqpf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgeqpf_(integer *m, integer *n, doublereal *a, integer * lda, integer *jpvt, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, ma, mn; doublereal aii; integer pvt; doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp2, tol3z; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); integer itemp; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorm2r_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK deprecated driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is deprecated and has been replaced by routine DGEQP3. */ /* DGEQPF computes a QR factorization with column pivoting of a */ /* real M-by-N matrix A: A*P = Q*R. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0 */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the upper triangle of the array contains the */ /* min(M,N)-by-N upper triangular matrix R; the elements */ /* below the diagonal, together with the array TAU, */ /* represent the orthogonal matrix Q as a product of */ /* min(m,n) elementary reflectors. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* JPVT (input/output) INTEGER array, dimension (N) */ /* On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted */ /* to the front of A*P (a leading column); if JPVT(i) = 0, */ /* the i-th column of A is a free column. */ /* On exit, if JPVT(i) = k, then the i-th column of A*P */ /* was the k-th column of A. */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(n) */ /* Each H(i) has the form */ /* H = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i). */ /* The matrix P is represented in jpvt as follows: If */ /* jpvt(j) = i */ /* then the jth column of P is the ith canonical unit vector. */ /* Partial column norm updating strategy modified by */ /* Z. Drmac and Z. Bujanovic, Dept. of Mathematics, */ /* University of Zagreb, Croatia. */ /* June 2006. */ /* For more details see LAPACK Working Note 176. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --jpvt; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQPF", &i__1); return 0; } mn = min(*m,*n); tol3z = sqrt(_starpu_dlamch_("Epsilon")); /* Move initial columns up front */ itemp = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (jpvt[i__] != 0) { if (i__ != itemp) { _starpu_dswap_(m, &a[i__ * a_dim1 + 1], &c__1, &a[itemp * a_dim1 + 1], &c__1); jpvt[i__] = jpvt[itemp]; jpvt[itemp] = i__; } else { jpvt[i__] = i__; } ++itemp; } else { jpvt[i__] = i__; } /* L10: */ } --itemp; /* Compute the QR factorization and update remaining columns */ if (itemp > 0) { ma = min(itemp,*m); _starpu_dgeqr2_(m, &ma, &a[a_offset], lda, &tau[1], &work[1], info); if (ma < *n) { i__1 = *n - ma; _starpu_dorm2r_("Left", "Transpose", m, &i__1, &ma, &a[a_offset], lda, & tau[1], &a[(ma + 1) * a_dim1 + 1], lda, &work[1], info); } } if (itemp < mn) { /* Initialize partial column norms. The first n elements of */ /* work store the exact column norms. */ i__1 = *n; for (i__ = itemp + 1; i__ <= i__1; ++i__) { i__2 = *m - itemp; work[i__] = _starpu_dnrm2_(&i__2, &a[itemp + 1 + i__ * a_dim1], &c__1); work[*n + i__] = work[i__]; /* L20: */ } /* Compute factorization */ i__1 = mn; for (i__ = itemp + 1; i__ <= i__1; ++i__) { /* Determine ith pivot column and swap if necessary */ i__2 = *n - i__ + 1; pvt = i__ - 1 + _starpu_idamax_(&i__2, &work[i__], &c__1); if (pvt != i__) { _starpu_dswap_(m, &a[pvt * a_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], & c__1); itemp = jpvt[pvt]; jpvt[pvt] = jpvt[i__]; jpvt[i__] = itemp; work[pvt] = work[i__]; work[*n + pvt] = work[*n + i__]; } /* Generate elementary reflector H(i) */ if (i__ < *m) { i__2 = *m - i__ + 1; _starpu_dlarfp_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__]); } else { _starpu_dlarfp_(&c__1, &a[*m + *m * a_dim1], &a[*m + *m * a_dim1], & c__1, &tau[*m]); } if (i__ < *n) { /* Apply H(i) to A(i:m,i+1:n) from the left */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__ + 1; i__3 = *n - i__; _starpu_dlarf_("LEFT", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, & tau[i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[(* n << 1) + 1]); a[i__ + i__ * a_dim1] = aii; } /* Update partial column norms */ i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { if (work[j] != 0.) { /* NOTE: The following 4 lines follow from the analysis in */ /* Lapack Working Note 176. */ temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)) / work[j]; /* Computing MAX */ d__1 = 0., d__2 = (temp + 1.) * (1. - temp); temp = max(d__1,d__2); /* Computing 2nd power */ d__1 = work[j] / work[*n + j]; temp2 = temp * (d__1 * d__1); if (temp2 <= tol3z) { if (*m - i__ > 0) { i__3 = *m - i__; work[j] = _starpu_dnrm2_(&i__3, &a[i__ + 1 + j * a_dim1], &c__1); work[*n + j] = work[j]; } else { work[j] = 0.; work[*n + j] = 0.; } } else { work[j] *= sqrt(temp); } } /* L30: */ } /* L40: */ } } return 0; /* End of DGEQPF */ } /* _starpu_dgeqpf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeqr2.c000066400000000000000000000107321413463044200205350ustar00rootroot00000000000000/* dgeqr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgeqr2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, k; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQR2 computes a QR factorization of a real m by n matrix A: */ /* A = Q * R. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(m,n) by n upper trapezoidal matrix R (R is */ /* upper triangular if m >= n); the elements below the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQR2", &i__1); return 0; } k = min(*m,*n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ i__2 = *m - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfp_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m)+ i__ * a_dim1] , &c__1, &tau[i__]); if (i__ < *n) { /* Apply H(i) to A(i:m,i+1:n) from the left */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__ + 1; i__3 = *n - i__; _starpu_dlarf_("Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[ i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1]); a[i__ + i__ * a_dim1] = aii; } /* L10: */ } return 0; /* End of DGEQR2 */ } /* _starpu_dgeqr2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgeqrf.c000066400000000000000000000164271413463044200206300ustar00rootroot00000000000000/* dgeqrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgeqrf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGEQRF computes a QR factorization of a real M-by-N matrix A: */ /* A = Q * R. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(M,N)-by-N upper trapezoidal matrix R (R is */ /* upper triangular if m >= n); the elements below the diagonal, */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of min(m,n) elementary reflectors (see Further */ /* Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* For optimum performance LWORK >= N*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ /* and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } else if (*lwork < max(1,*n) && ! lquery) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGEQRF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGEQRF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGEQRF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the QR factorization of the current block */ /* A(i:m,i:i+ib-1) */ i__3 = *m - i__ + 1; _starpu_dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ 1], &iinfo); if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__3 = *m - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(i:m,i+ib:n) from the left */ i__3 = *m - i__ + 1; i__4 = *n - i__ - ib + 1; _starpu_dlarfb_("Left", "Transpose", "Forward", "Columnwise", &i__3, & i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + 1], &ldwork); } /* L10: */ } } else { i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; _starpu_dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] , &iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGEQRF */ } /* _starpu_dgeqrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgerfs.c000066400000000000000000000304551413463044200206270ustar00rootroot00000000000000/* dgerfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b15 = -1.; static doublereal c_b17 = 1.; /* Subroutine */ int _starpu_dgerfs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s, xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dgetrs_( char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical notran; char transt[1]; doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGERFS improves the computed solution to a system of linear */ /* equations and provides error bounds and backward error estimates for */ /* the solution. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The original N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factors L and U from the factorization A = P*L*U */ /* as computed by DGETRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from DGETRF; for 1<=i<=N, row i of the */ /* matrix was interchanged with row IPIV(i). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGETRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; notran = _starpu_lsame_(trans, "N"); if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldaf < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -10; } else if (*ldx < max(1,*n)) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGERFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - op(A) * X, */ /* where op(A) = A, A**T, or A**H, depending on TRANS. */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dgemv_(trans, n, n, &c_b15, &a[a_offset], lda, &x[j * x_dim1 + 1], & c__1, &c_b17, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(op(A))*abs(X) + abs(B). */ if (notran) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * xk; /* L40: */ } /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * (d__2 = x[ i__ + j * x_dim1], abs(d__2)); /* L60: */ } work[k] += s; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dgetrs_(trans, n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b17, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(op(A)))* */ /* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(op(A)) is the inverse of op(A) */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(op(A))*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(op(A)) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(op(A)**T). */ _starpu_dgetrs_(transt, n, &c__1, &af[af_offset], ldaf, &ipiv[1], & work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L110: */ } } else { /* Multiply by inv(op(A))*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L120: */ } _starpu_dgetrs_(trans, n, &c__1, &af[af_offset], ldaf, &ipiv[1], & work[*n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DGERFS */ } /* _starpu_dgerfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgerfsx.c000066400000000000000000000641351413463044200210210ustar00rootroot00000000000000/* dgerfsx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c_n1 = -1; static integer c__0 = 0; static integer c__1 = 1; /* Subroutine */ int _starpu_dgerfsx_(char *trans, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal illrcond_thresh__, unstable_thresh__, err_lbnd__; integer ref_type__; extern integer _starpu_ilatrans_(char *); integer j; doublereal rcond_tmp__; integer prec_type__, trans_type__; extern doublereal _starpu_dla_gercond__(char *, integer *, doublereal *, integer * , doublereal *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, ftnlen); doublereal cwise_wrong__; extern /* Subroutine */ int _starpu_dla_gerfsx_extended__(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, logical *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, logical *, integer *); char norm[1]; logical ignore_cwise__; extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgecon_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); logical colequ, notran, rowequ; extern integer _starpu_ilaprec_(char *); integer ithresh, n_norms__; doublereal rthresh; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGERFSX improves the computed solution to a system of linear */ /* equations and provides error bounds and backward error estimates */ /* for the solution. In addition to normwise error bound, the code */ /* provides maximum componentwise error bound if possible. See */ /* comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the */ /* error bounds. */ /* The original system of linear equations may have been equilibrated */ /* before calling this routine, as described by arguments EQUED, R */ /* and C below. In this case, the solution and error bounds returned */ /* are for the original unequilibrated system. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* EQUED (input) CHARACTER*1 */ /* Specifies the form of equilibration that was done to A */ /* before calling this routine. This is needed to compute */ /* the solution and error bounds correctly. */ /* = 'N': No equilibration */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* The right hand side B has been changed accordingly. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The original N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factors L and U from the factorization A = P*L*U */ /* as computed by DGETRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from DGETRF; for 1<=i<=N, row i of the */ /* matrix was interchanged with row IPIV(i). */ /* R (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'R' or 'B', A is */ /* multiplied on the left by diag(R); if EQUED = 'N' or 'C', R */ /* is not accessed. R is an input argument if FACT = 'F'; */ /* otherwise, R is an output argument. If FACT = 'F' and */ /* EQUED = 'R' or 'B', each element of R must be positive. */ /* If R is output, each element of R is a power of the radix. */ /* If R is input, each element of R should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* C (input or output) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If EQUED = 'C' or 'B', A is */ /* multiplied on the right by diag(C); if EQUED = 'N' or 'R', C */ /* is not accessed. C is an input argument if FACT = 'F'; */ /* otherwise, C is an output argument. If FACT = 'F' and */ /* EQUED = 'C' or 'B', each element of C must be positive. */ /* If C is output, each element of C is a power of the radix. */ /* If C is input, each element of C should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGETRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* Componentwise relative backward error. This is the */ /* componentwise relative backward error of each solution vector X(j) */ /* (i.e., the smallest relative change in any element of A or B that */ /* makes X(j) an exact solution). */ /* N_ERR_BNDS (input) INTEGER */ /* Number of error bounds to return for each right hand side */ /* and each type (normwise or componentwise). See ERR_BNDS_NORM and */ /* ERR_BNDS_COMP below. */ /* ERR_BNDS_NORM (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* NPARAMS (input) INTEGER */ /* Specifies the number of parameters set in PARAMS. If .LE. 0, the */ /* PARAMS array is never referenced and default values are used. */ /* PARAMS (input / output) DOUBLE PRECISION array, dimension NPARAMS */ /* Specifies algorithm parameters. If an entry is .LT. 0.0, then */ /* that entry will be filled with default value used for that */ /* parameter. Only positions up to NPARAMS are accessed; defaults */ /* are used for higher-numbered parameters. */ /* PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative */ /* refinement or not. */ /* Default: 1.0D+0 */ /* = 0.0 : No refinement is performed, and no error bounds are */ /* computed. */ /* = 1.0 : Use the double-precision refinement algorithm, */ /* possibly with doubled-single computations if the */ /* compilation environment does not support DOUBLE */ /* PRECISION. */ /* (other values are reserved for future use) */ /* PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual */ /* computations allowed for refinement. */ /* Default: 10 */ /* Aggressive: Set to 100 to permit convergence using approximate */ /* factorizations or factorizations other than LU. If */ /* the factorization uses a technique other than */ /* Gaussian elimination, the guarantees in */ /* err_bnds_norm and err_bnds_comp may no longer be */ /* trustworthy. */ /* PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code */ /* will attempt to find a solution with small componentwise */ /* relative error in the double-precision algorithm. Positive */ /* is true, 0.0 is false. */ /* Default: 1.0 (attempt componentwise convergence) */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: Successful exit. The solution to every right-hand side is */ /* guaranteed. */ /* < 0: If INFO = -i, the i-th argument had an illegal value */ /* > 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Check the input parameters. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --r__; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; trans_type__ = _starpu_ilatrans_(trans); ref_type__ = 1; if (*nparams >= 1) { if (params[1] < 0.) { params[1] = 1.; } else { ref_type__ = (integer) params[1]; } } /* Set default parameters. */ illrcond_thresh__ = (doublereal) (*n) * _starpu_dlamch_("Epsilon"); ithresh = 10; rthresh = .5; unstable_thresh__ = .25; ignore_cwise__ = FALSE_; if (*nparams >= 2) { if (params[2] < 0.) { params[2] = (doublereal) ithresh; } else { ithresh = (integer) params[2]; } } if (*nparams >= 3) { if (params[3] < 0.) { if (ignore_cwise__) { params[3] = 0.; } else { params[3] = 1.; } } else { ignore_cwise__ = params[3] == 0.; } } if (ref_type__ == 0 || *n_err_bnds__ == 0) { n_norms__ = 0; } else if (ignore_cwise__) { n_norms__ = 1; } else { n_norms__ = 2; } notran = _starpu_lsame_(trans, "N"); rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); /* Test input parameters. */ if (trans_type__ == -1) { *info = -1; } else if (! rowequ && ! colequ && ! _starpu_lsame_(equed, "N")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -13; } else if (*ldx < max(1,*n)) { *info = -15; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGERFSX", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0 || *nrhs == 0) { *rcond = 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 0.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 0.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 0.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 1.; } } return 0; } /* Default to failure. */ *rcond = 0.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 1.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 0.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 0.; } } /* Compute the norm of A and the reciprocal of the condition */ /* number of A. */ if (notran) { *(unsigned char *)norm = 'I'; } else { *(unsigned char *)norm = '1'; } anorm = _starpu_dlange_(norm, n, n, &a[a_offset], lda, &work[1]); _starpu_dgecon_(norm, n, &af[af_offset], ldaf, &anorm, rcond, &work[1], &iwork[1], info); /* Perform refinement on each right-hand side */ if (ref_type__ != 0) { prec_type__ = _starpu_ilaprec_("E"); if (notran) { _starpu_dla_gerfsx_extended__(&prec_type__, &trans_type__, n, nrhs, &a[ a_offset], lda, &af[af_offset], ldaf, &ipiv[1], &colequ, & c__[1], &b[b_offset], ldb, &x[x_offset], ldx, &berr[1], & n_norms__, &err_bnds_norm__[err_bnds_norm_offset], & err_bnds_comp__[err_bnds_comp_offset], &work[*n + 1], & work[1], &work[(*n << 1) + 1], &work[1], rcond, &ithresh, &rthresh, &unstable_thresh__, &ignore_cwise__, info); } else { _starpu_dla_gerfsx_extended__(&prec_type__, &trans_type__, n, nrhs, &a[ a_offset], lda, &af[af_offset], ldaf, &ipiv[1], &rowequ, & r__[1], &b[b_offset], ldb, &x[x_offset], ldx, &berr[1], & n_norms__, &err_bnds_norm__[err_bnds_norm_offset], & err_bnds_comp__[err_bnds_comp_offset], &work[*n + 1], & work[1], &work[(*n << 1) + 1], &work[1], rcond, &ithresh, &rthresh, &unstable_thresh__, &ignore_cwise__, info); } } /* Computing MAX */ d__1 = 10., d__2 = sqrt((doublereal) (*n)); err_lbnd__ = max(d__1,d__2) * _starpu_dlamch_("Epsilon"); if (*n_err_bnds__ >= 1 && n_norms__ >= 1) { /* Compute scaled normwise condition number cond(A*C). */ if (colequ && notran) { rcond_tmp__ = _starpu_dla_gercond__(trans, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c_n1, &c__[1], info, &work[1] , &iwork[1], (ftnlen)1); } else if (rowequ && ! notran) { rcond_tmp__ = _starpu_dla_gercond__(trans, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c_n1, &r__[1], info, &work[1] , &iwork[1], (ftnlen)1); } else { rcond_tmp__ = _starpu_dla_gercond__(trans, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c__0, &r__[1], info, &work[1] , &iwork[1], (ftnlen)1); } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] > 1.) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_norm__[j + err_bnds_norm_dim1] = 0.; if (*info <= *n) { *info = *n + j; } } else if (err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] < err_lbnd__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = err_lbnd__; err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = rcond_tmp__; } } } if (*n_err_bnds__ >= 1 && n_norms__ >= 2) { /* Compute componentwise condition number cond(A*diag(Y(:,J))) for */ /* each right-hand side using the current solution as an estimate of */ /* the true solution. If the componentwise error estimate is too */ /* large, then the solution is a lousy estimate of truth and the */ /* estimated RCOND may be too optimistic. To avoid misleading users, */ /* the inverse condition number is set to 0.0 when the estimated */ /* cwise error is at least CWISE_WRONG. */ cwise_wrong__ = sqrt(_starpu_dlamch_("Epsilon")); i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < cwise_wrong__) { rcond_tmp__ = _starpu_dla_gercond__(trans, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c__1, &x[j * x_dim1 + 1], info, &work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = 0.; } /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] > 1.) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 0.; if (params[3] == 1. && *info < *n + j) { *info = *n + j; } } else if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < err_lbnd__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = err_lbnd__; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = rcond_tmp__; } } } return 0; /* End of DGERFSX */ } /* _starpu_dgerfsx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgerq2.c000066400000000000000000000110121413463044200205250ustar00rootroot00000000000000/* dgerq2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgerq2_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, k; doublereal aii; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGERQ2 computes an RQ factorization of a real m by n matrix A: */ /* A = R * Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix A. */ /* On exit, if m <= n, the upper triangle of the subarray */ /* A(1:m,n-m+1:n) contains the m by m upper triangular matrix R; */ /* if m >= n, the elements on and above the (m-n)-th subdiagonal */ /* contain the m by n upper trapezoidal matrix R; the remaining */ /* elements, with the array TAU, represent the orthogonal matrix */ /* Q as a product of elementary reflectors (see Further */ /* Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (M) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(n-k+i+1:n) = 0 and v(n-k+i) = 1; v(1:n-k+i-1) is stored on exit in */ /* A(m-k+i,1:n-k+i-1), and tau in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGERQ2", &i__1); return 0; } k = min(*m,*n); for (i__ = k; i__ >= 1; --i__) { /* Generate elementary reflector H(i) to annihilate */ /* A(m-k+i,1:n-k+i-1) */ i__1 = *n - k + i__; _starpu_dlarfp_(&i__1, &a[*m - k + i__ + (*n - k + i__) * a_dim1], &a[*m - k + i__ + a_dim1], lda, &tau[i__]); /* Apply H(i) to A(1:m-k+i-1,1:n-k+i) from the right */ aii = a[*m - k + i__ + (*n - k + i__) * a_dim1]; a[*m - k + i__ + (*n - k + i__) * a_dim1] = 1.; i__1 = *m - k + i__ - 1; i__2 = *n - k + i__; _starpu_dlarf_("Right", &i__1, &i__2, &a[*m - k + i__ + a_dim1], lda, &tau[ i__], &a[a_offset], lda, &work[1]); a[*m - k + i__ + (*n - k + i__) * a_dim1] = aii; /* L10: */ } return 0; /* End of DGERQ2 */ } /* _starpu_dgerq2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgerqf.c000066400000000000000000000173131413463044200206230ustar00rootroot00000000000000/* dgerqf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dgerqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, ki, kk, mu, nu, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dgerq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGERQF computes an RQ factorization of a real M-by-N matrix A: */ /* A = R * Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if m <= n, the upper triangle of the subarray */ /* A(1:m,n-m+1:n) contains the M-by-M upper triangular matrix R; */ /* if m >= n, the elements on and above the (m-n)-th subdiagonal */ /* contain the M-by-N upper trapezoidal matrix R; */ /* the remaining elements, with the array TAU, represent the */ /* orthogonal matrix Q as a product of min(m,n) elementary */ /* reflectors (see Further Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M). */ /* For optimum performance LWORK >= M*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(n-k+i+1:n) = 0 and v(n-k+i) = 1; v(1:n-k+i-1) is stored on exit in */ /* A(m-k+i,1:n-k+i-1), and tau in TAU(i). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info == 0) { k = min(*m,*n); if (k == 0) { lwkopt = 1; } else { nb = _starpu_ilaenv_(&c__1, "DGERQF", " ", m, n, &c_n1, &c_n1); lwkopt = *m * nb; } work[1] = (doublereal) lwkopt; if (*lwork < max(1,*m) && ! lquery) { *info = -7; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGERQF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (k == 0) { return 0; } nbmin = 2; nx = 1; iws = *m; if (nb > 1 && nb < k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGERQF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGERQF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially. */ /* The last kk rows are handled by the block method. */ ki = (k - nx - 1) / nb * nb; /* Computing MIN */ i__1 = k, i__2 = ki + nb; kk = min(i__1,i__2); i__1 = k - kk + 1; i__2 = -nb; for (i__ = k - kk + ki + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = k - i__ + 1; ib = min(i__3,nb); /* Compute the RQ factorization of the current block */ /* A(m-k+i:m-k+i+ib-1,1:n-k+i+ib-1) */ i__3 = *n - k + i__ + ib - 1; _starpu_dgerq2_(&ib, &i__3, &a[*m - k + i__ + a_dim1], lda, &tau[i__], & work[1], &iinfo); if (*m - k + i__ > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__3 = *n - k + i__ + ib - 1; _starpu_dlarft_("Backward", "Rowwise", &i__3, &ib, &a[*m - k + i__ + a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(1:m-k+i-1,1:n-k+i+ib-1) from the right */ i__3 = *m - k + i__ - 1; i__4 = *n - k + i__ + ib - 1; _starpu_dlarfb_("Right", "No transpose", "Backward", "Rowwise", &i__3, &i__4, &ib, &a[*m - k + i__ + a_dim1], lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + 1], &ldwork); } /* L10: */ } mu = *m - k + i__ + nb - 1; nu = *n - k + i__ + nb - 1; } else { mu = *m; nu = *n; } /* Use unblocked code to factor the last or only block */ if (mu > 0 && nu > 0) { _starpu_dgerq2_(&mu, &nu, &a[a_offset], lda, &tau[1], &work[1], &iinfo); } work[1] = (doublereal) iws; return 0; /* End of DGERQF */ } /* _starpu_dgerqf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgesc2.c000066400000000000000000000116051413463044200205200ustar00rootroot00000000000000/* dgesc2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgesc2_(integer *n, doublereal *a, integer *lda, doublereal *rhs, integer *ipiv, integer *jpiv, doublereal *scale) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j; doublereal eps, temp; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); doublereal smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGESC2 solves a system of linear equations */ /* A * X = scale* RHS */ /* with a general N-by-N matrix A using the LU factorization with */ /* complete pivoting computed by DGETC2. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the LU part of the factorization of the n-by-n */ /* matrix A computed by DGETC2: A = P * L * U * Q */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1, N). */ /* RHS (input/output) DOUBLE PRECISION array, dimension (N). */ /* On entry, the right hand side vector b. */ /* On exit, the solution vector X. */ /* IPIV (input) INTEGER array, dimension (N). */ /* The pivot indices; for 1 <= i <= N, row i of the */ /* matrix has been interchanged with row IPIV(i). */ /* JPIV (input) INTEGER array, dimension (N). */ /* The pivot indices; for 1 <= j <= N, column j of the */ /* matrix has been interchanged with column JPIV(j). */ /* SCALE (output) DOUBLE PRECISION */ /* On exit, SCALE contains the scale factor. SCALE is chosen */ /* 0 <= SCALE <= 1 to prevent owerflow in the solution. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Set constant to control owerflow */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --rhs; --ipiv; --jpiv; /* Function Body */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Apply permutations IPIV to RHS */ i__1 = *n - 1; _starpu_dlaswp_(&c__1, &rhs[1], lda, &c__1, &i__1, &ipiv[1], &c__1); /* Solve for L part */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { rhs[j] -= a[j + i__ * a_dim1] * rhs[i__]; /* L10: */ } /* L20: */ } /* Solve for U part */ *scale = 1.; /* Check for scaling */ i__ = _starpu_idamax_(n, &rhs[1], &c__1); if (smlnum * 2. * (d__1 = rhs[i__], abs(d__1)) > (d__2 = a[*n + *n * a_dim1], abs(d__2))) { temp = .5 / (d__1 = rhs[i__], abs(d__1)); _starpu_dscal_(n, &temp, &rhs[1], &c__1); *scale *= temp; } for (i__ = *n; i__ >= 1; --i__) { temp = 1. / a[i__ + i__ * a_dim1]; rhs[i__] *= temp; i__1 = *n; for (j = i__ + 1; j <= i__1; ++j) { rhs[i__] -= rhs[j] * (a[i__ + j * a_dim1] * temp); /* L30: */ } /* L40: */ } /* Apply permutations JPIV to the solution (RHS) */ i__1 = *n - 1; _starpu_dlaswp_(&c__1, &rhs[1], lda, &c__1, &i__1, &jpiv[1], &c_n1); return 0; /* End of DGESC2 */ } /* _starpu_dgesc2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgesdd.c000066400000000000000000001527111413463044200206070ustar00rootroot00000000000000/* dgesdd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b227 = 0.; static doublereal c_b248 = 1.; /* Subroutine */ int _starpu_dgesdd_(char *jobz, integer *m, integer *n, doublereal * a, integer *lda, doublereal *s, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2, i__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, ie, il, ir, iu, blk; doublereal dum[1], eps; integer ivt, iscl; doublereal anrm; integer idum[1], ierr, itau; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer chunk, minmn, wrkbl, itaup, itauq, mnthr; logical wntqa; integer nwork; logical wntqn, wntqo, wntqs; extern /* Subroutine */ int _starpu_dbdsdc_(char *, char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); integer bdspac; extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dorgbr_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer ldwrkl, ldwrkr, minwrk, ldwrku, maxwrk, ldwkvt; doublereal smlnum; logical wntqas, lquery; /* -- LAPACK driver routine (version 3.2.1) -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* March 2009 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGESDD computes the singular value decomposition (SVD) of a real */ /* M-by-N matrix A, optionally computing the left and right singular */ /* vectors. If singular vectors are desired, it uses a */ /* divide-and-conquer algorithm. */ /* The SVD is written */ /* A = U * SIGMA * transpose(V) */ /* where SIGMA is an M-by-N matrix which is zero except for its */ /* min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and */ /* V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA */ /* are the singular values of A; they are real and non-negative, and */ /* are returned in descending order. The first min(m,n) columns of */ /* U and V are the left and right singular vectors of A. */ /* Note that the routine returns VT = V**T, not V. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* Specifies options for computing all or part of the matrix U: */ /* = 'A': all M columns of U and all N rows of V**T are */ /* returned in the arrays U and VT; */ /* = 'S': the first min(M,N) columns of U and the first */ /* min(M,N) rows of V**T are returned in the arrays U */ /* and VT; */ /* = 'O': If M >= N, the first N columns of U are overwritten */ /* on the array A and all rows of V**T are returned in */ /* the array VT; */ /* otherwise, all columns of U are returned in the */ /* array U and the first M rows of V**T are overwritten */ /* in the array A; */ /* = 'N': no columns of U or rows of V**T are computed. */ /* M (input) INTEGER */ /* The number of rows of the input matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the input matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if JOBZ = 'O', A is overwritten with the first N columns */ /* of U (the left singular vectors, stored */ /* columnwise) if M >= N; */ /* A is overwritten with the first M rows */ /* of V**T (the right singular vectors, stored */ /* rowwise) otherwise. */ /* if JOBZ .ne. 'O', the contents of A are destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* S (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The singular values of A, sorted so that S(i) >= S(i+1). */ /* U (output) DOUBLE PRECISION array, dimension (LDU,UCOL) */ /* UCOL = M if JOBZ = 'A' or JOBZ = 'O' and M < N; */ /* UCOL = min(M,N) if JOBZ = 'S'. */ /* If JOBZ = 'A' or JOBZ = 'O' and M < N, U contains the M-by-M */ /* orthogonal matrix U; */ /* if JOBZ = 'S', U contains the first min(M,N) columns of U */ /* (the left singular vectors, stored columnwise); */ /* if JOBZ = 'O' and M >= N, or JOBZ = 'N', U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= 1; if */ /* JOBZ = 'S' or 'A' or JOBZ = 'O' and M < N, LDU >= M. */ /* VT (output) DOUBLE PRECISION array, dimension (LDVT,N) */ /* If JOBZ = 'A' or JOBZ = 'O' and M >= N, VT contains the */ /* N-by-N orthogonal matrix V**T; */ /* if JOBZ = 'S', VT contains the first min(M,N) rows of */ /* V**T (the right singular vectors, stored rowwise); */ /* if JOBZ = 'O' and M < N, or JOBZ = 'N', VT is not referenced. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. LDVT >= 1; if */ /* JOBZ = 'A' or JOBZ = 'O' and M >= N, LDVT >= N; */ /* if JOBZ = 'S', LDVT >= min(M,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK; */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= 1. */ /* If JOBZ = 'N', */ /* LWORK >= 3*min(M,N) + max(max(M,N),7*min(M,N)). */ /* If JOBZ = 'O', */ /* LWORK >= 3*min(M,N) + */ /* max(max(M,N),5*min(M,N)*min(M,N)+4*min(M,N)). */ /* If JOBZ = 'S' or 'A' */ /* LWORK >= 3*min(M,N) + */ /* max(max(M,N),4*min(M,N)*min(M,N)+4*min(M,N)). */ /* For good performance, LWORK should generally be larger. */ /* If LWORK = -1 but other input arguments are legal, WORK(1) */ /* returns the optimal LWORK. */ /* IWORK (workspace) INTEGER array, dimension (8*min(M,N)) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: DBDSDC did not converge, updating process failed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; --work; --iwork; /* Function Body */ *info = 0; minmn = min(*m,*n); wntqa = _starpu_lsame_(jobz, "A"); wntqs = _starpu_lsame_(jobz, "S"); wntqas = wntqa || wntqs; wntqo = _starpu_lsame_(jobz, "O"); wntqn = _starpu_lsame_(jobz, "N"); lquery = *lwork == -1; if (! (wntqa || wntqs || wntqo || wntqn)) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*ldu < 1 || wntqas && *ldu < *m || wntqo && *m < *n && *ldu < * m) { *info = -8; } else if (*ldvt < 1 || wntqa && *ldvt < *n || wntqs && *ldvt < minmn || wntqo && *m >= *n && *ldvt < *n) { *info = -10; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { minwrk = 1; maxwrk = 1; if (*m >= *n && minmn > 0) { /* Compute space needed for DBDSDC */ mnthr = (integer) (minmn * 11. / 6.); if (wntqn) { bdspac = *n * 7; } else { bdspac = *n * 3 * *n + (*n << 2); } if (*m >= mnthr) { if (wntqn) { /* Path 1 (M much larger than N, JOBZ='N') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n; maxwrk = max(i__1,i__2); minwrk = bdspac + *n; } else if (wntqo) { /* Path 2 (M much larger than N, JOBZ='O') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + (*n << 1) * *n; minwrk = bdspac + (*n << 1) * *n + *n * 3; } else if (wntqs) { /* Path 3 (M much larger than N, JOBZ='S') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + *n * *n; minwrk = bdspac + *n * *n + *n * 3; } else if (wntqa) { /* Path 4 (M much larger than N, JOBZ='A') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *n + *m * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + *n * *n; minwrk = bdspac + *n * *n + *n * 3; } } else { /* Path 5 (M at least N, but not much larger) */ wrkbl = *n * 3 + (*m + *n) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); if (wntqn) { /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n * 3; maxwrk = max(i__1,i__2); minwrk = *n * 3 + max(*m,bdspac); } else if (wntqo) { /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + *m * *n; /* Computing MAX */ i__1 = *m, i__2 = *n * *n + bdspac; minwrk = *n * 3 + max(i__1,i__2); } else if (wntqs) { /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *n * 3; maxwrk = max(i__1,i__2); minwrk = *n * 3 + max(*m,bdspac); } else if (wntqa) { /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = bdspac + *n * 3; maxwrk = max(i__1,i__2); minwrk = *n * 3 + max(*m,bdspac); } } } else if (minmn > 0) { /* Compute space needed for DBDSDC */ mnthr = (integer) (minmn * 11. / 6.); if (wntqn) { bdspac = *m * 7; } else { bdspac = *m * 3 * *m + (*m << 2); } if (*n >= mnthr) { if (wntqn) { /* Path 1t (N much larger than M, JOBZ='N') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m; maxwrk = max(i__1,i__2); minwrk = bdspac + *m; } else if (wntqo) { /* Path 2t (N much larger than M, JOBZ='O') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", m, m, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + (*m << 1) * *m; minwrk = bdspac + (*m << 1) * *m + *m * 3; } else if (wntqs) { /* Path 3t (N much larger than M, JOBZ='S') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", m, m, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + *m * *m; minwrk = bdspac + *m * *m + *m * 3; } else if (wntqa) { /* Path 4t (N much larger than M, JOBZ='A') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__1 = wrkbl, i__2 = *m + *n * _starpu_ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", m, m, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + *m * *m; minwrk = bdspac + *m * *m + *m * 3; } } else { /* Path 5t (N greater than M, but not much larger) */ wrkbl = *m * 3 + (*m + *n) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); if (wntqn) { /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; maxwrk = max(i__1,i__2); minwrk = *m * 3 + max(*n,bdspac); } else if (wntqo) { /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", m, n, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; wrkbl = max(i__1,i__2); maxwrk = wrkbl + *m * *n; /* Computing MAX */ i__1 = *n, i__2 = *m * *m + bdspac; minwrk = *m * 3 + max(i__1,i__2); } else if (wntqs) { /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", m, n, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; maxwrk = max(i__1,i__2); minwrk = *m * 3 + max(*n,bdspac); } else if (wntqa) { /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "QLN", m, m, n, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORMBR" , "PRT", n, n, m, &c_n1); wrkbl = max(i__1,i__2); /* Computing MAX */ i__1 = wrkbl, i__2 = bdspac + *m * 3; maxwrk = max(i__1,i__2); minwrk = *m * 3 + max(*n,bdspac); } } } maxwrk = max(maxwrk,minwrk); work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGESDD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = sqrt(_starpu_dlamch_("S")) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, dum); iscl = 0; if (anrm > 0. && anrm < smlnum) { iscl = 1; _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & ierr); } else if (anrm > bignum) { iscl = 1; _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & ierr); } if (*m >= *n) { /* A has at least as many rows as columns. If A has sufficiently */ /* more rows than columns, first reduce using the QR */ /* decomposition (if sufficient workspace available) */ if (*m >= mnthr) { if (wntqn) { /* Path 1 (M much larger than N, JOBZ='N') */ /* No singular vectors to be computed */ itau = 1; nwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__1, &ierr); /* Zero out below R */ i__1 = *n - 1; i__2 = *n - 1; _starpu_dlaset_("L", &i__1, &i__2, &c_b227, &c_b227, &a[a_dim1 + 2], lda); ie = 1; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__1, &ierr); nwork = ie + *n; /* Perform bidiagonal SVD, computing singular values only */ /* (Workspace: need N+BDSPAC) */ _starpu_dbdsdc_("U", "N", n, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, &work[nwork], &iwork[1], info); } else if (wntqo) { /* Path 2 (M much larger than N, JOBZ = 'O') */ /* N left singular vectors to be overwritten on A and */ /* N right singular vectors to be computed in VT */ ir = 1; /* WORK(IR) is LDWRKR by N */ if (*lwork >= *lda * *n + *n * *n + *n * 3 + bdspac) { ldwrkr = *lda; } else { ldwrkr = (*lwork - *n * *n - *n * 3 - bdspac) / *n; } itau = ir + ldwrkr * *n; nwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__1, &ierr); /* Copy R to WORK(IR), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr); i__1 = *n - 1; i__2 = *n - 1; _starpu_dlaset_("L", &i__1, &i__2, &c_b227, &c_b227, &work[ir + 1], & ldwrkr); /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; /* Bidiagonalize R in VT, copying result to WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__1, &ierr); /* WORK(IU) is N by N */ iu = nwork; nwork = iu + *n * *n; /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in WORK(IU) and computing right */ /* singular vectors of bidiagonal matrix in VT */ /* (Workspace: need N+N*N+BDSPAC) */ _starpu_dbdsdc_("U", "I", n, &s[1], &work[ie], &work[iu], n, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite WORK(IU) by left singular vectors of R */ /* and VT by right singular vectors of R */ /* (Workspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", n, n, n, &work[ir], &ldwrkr, &work[ itauq], &work[iu], n, &work[nwork], &i__1, &ierr); i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, n, &work[ir], &ldwrkr, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, & ierr); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IU), storing result in WORK(IR) and copying to A */ /* (Workspace: need 2*N*N, prefer N*N+M*N) */ i__1 = *m; i__2 = ldwrkr; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = *m - i__ + 1; chunk = min(i__3,ldwrkr); _starpu_dgemm_("N", "N", &chunk, n, n, &c_b248, &a[i__ + a_dim1], lda, &work[iu], n, &c_b227, &work[ir], &ldwrkr); _starpu_dlacpy_("F", &chunk, n, &work[ir], &ldwrkr, &a[i__ + a_dim1], lda); /* L10: */ } } else if (wntqs) { /* Path 3 (M much larger than N, JOBZ='S') */ /* N left singular vectors to be computed in U and */ /* N right singular vectors to be computed in VT */ ir = 1; /* WORK(IR) is N by N */ ldwrkr = *n; itau = ir + ldwrkr * *n; nwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__2, &ierr); /* Copy R to WORK(IR), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr); i__2 = *n - 1; i__1 = *n - 1; _starpu_dlaset_("L", &i__2, &i__1, &c_b227, &c_b227, &work[ir + 1], & ldwrkr); /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__2, &ierr); /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagoal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in VT */ /* (Workspace: need N+BDSPAC) */ _starpu_dbdsdc_("U", "I", n, &s[1], &work[ie], &u[u_offset], ldu, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite U by left singular vectors of R and VT */ /* by right singular vectors of R */ /* (Workspace: need N*N+3*N, prefer N*N+2*N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", n, n, n, &work[ir], &ldwrkr, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr); i__2 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, n, &work[ir], &ldwrkr, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, & ierr); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in U */ /* (Workspace: need N*N) */ _starpu_dlacpy_("F", n, n, &u[u_offset], ldu, &work[ir], &ldwrkr); _starpu_dgemm_("N", "N", m, n, n, &c_b248, &a[a_offset], lda, &work[ ir], &ldwrkr, &c_b227, &u[u_offset], ldu); } else if (wntqa) { /* Path 4 (M much larger than N, JOBZ='A') */ /* M left singular vectors to be computed in U and */ /* N right singular vectors to be computed in VT */ iu = 1; /* WORK(IU) is N by N */ ldwrku = *n; itau = iu + ldwrku * *n; nwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[nwork], &i__2, &ierr); /* Produce R in A, zeroing out other entries */ i__2 = *n - 1; i__1 = *n - 1; _starpu_dlaset_("L", &i__2, &i__1, &c_b227, &c_b227, &a[a_dim1 + 2], lda); ie = itau; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; /* Bidiagonalize R in A */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__2, &ierr); /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in WORK(IU) and computing right */ /* singular vectors of bidiagonal matrix in VT */ /* (Workspace: need N+N*N+BDSPAC) */ _starpu_dbdsdc_("U", "I", n, &s[1], &work[ie], &work[iu], n, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite WORK(IU) by left singular vectors of R and VT */ /* by right singular vectors of R */ /* (Workspace: need N*N+3*N, prefer N*N+2*N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", n, n, n, &a[a_offset], lda, &work[ itauq], &work[iu], &ldwrku, &work[nwork], &i__2, & ierr); i__2 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, n, &a[a_offset], lda, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, & ierr); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IU), storing result in A */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b248, &u[u_offset], ldu, &work[ iu], &ldwrku, &c_b227, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); } } else { /* M .LT. MNTHR */ /* Path 5 (M at least N, but not much larger) */ /* Reduce to bidiagonal form without QR decomposition */ ie = 1; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; /* Bidiagonalize A */ /* (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[nwork], &i__2, &ierr); if (wntqn) { /* Perform bidiagonal SVD, only computing singular values */ /* (Workspace: need N+BDSPAC) */ _starpu_dbdsdc_("U", "N", n, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, &work[nwork], &iwork[1], info); } else if (wntqo) { iu = nwork; if (*lwork >= *m * *n + *n * 3 + bdspac) { /* WORK( IU ) is M by N */ ldwrku = *m; nwork = iu + ldwrku * *n; _starpu_dlaset_("F", m, n, &c_b227, &c_b227, &work[iu], &ldwrku); } else { /* WORK( IU ) is N by N */ ldwrku = *n; nwork = iu + ldwrku * *n; /* WORK(IR) is LDWRKR by N */ ir = nwork; ldwrkr = (*lwork - *n * *n - *n * 3) / *n; } nwork = iu + ldwrku * *n; /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in WORK(IU) and computing right */ /* singular vectors of bidiagonal matrix in VT */ /* (Workspace: need N+N*N+BDSPAC) */ _starpu_dbdsdc_("U", "I", n, &s[1], &work[ie], &work[iu], &ldwrku, & vt[vt_offset], ldvt, dum, idum, &work[nwork], &iwork[ 1], info); /* Overwrite VT by right singular vectors of A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, n, &a[a_offset], lda, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, & ierr); if (*lwork >= *m * *n + *n * 3 + bdspac) { /* Overwrite WORK(IU) by left singular vectors of A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, n, n, &a[a_offset], lda, &work[ itauq], &work[iu], &ldwrku, &work[nwork], &i__2, & ierr); /* Copy left singular vectors of A from WORK(IU) to A */ _starpu_dlacpy_("F", m, n, &work[iu], &ldwrku, &a[a_offset], lda); } else { /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - nwork + 1; _starpu_dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], & work[nwork], &i__2, &ierr); /* Multiply Q in A by left singular vectors of */ /* bidiagonal matrix in WORK(IU), storing result in */ /* WORK(IR) and copying to A */ /* (Workspace: need 2*N*N, prefer N*N+M*N) */ i__2 = *m; i__1 = ldwrkr; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Computing MIN */ i__3 = *m - i__ + 1; chunk = min(i__3,ldwrkr); _starpu_dgemm_("N", "N", &chunk, n, n, &c_b248, &a[i__ + a_dim1], lda, &work[iu], &ldwrku, &c_b227, & work[ir], &ldwrkr); _starpu_dlacpy_("F", &chunk, n, &work[ir], &ldwrkr, &a[i__ + a_dim1], lda); /* L20: */ } } } else if (wntqs) { /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in VT */ /* (Workspace: need N+BDSPAC) */ _starpu_dlaset_("F", m, n, &c_b227, &c_b227, &u[u_offset], ldu); _starpu_dbdsdc_("U", "I", n, &s[1], &work[ie], &u[u_offset], ldu, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite U by left singular vectors of A and VT */ /* by right singular vectors of A */ /* (Workspace: need 3*N, prefer 2*N+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, n, n, &a[a_offset], lda, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr); i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, n, &a[a_offset], lda, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, & ierr); } else if (wntqa) { /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in VT */ /* (Workspace: need N+BDSPAC) */ _starpu_dlaset_("F", m, m, &c_b227, &c_b227, &u[u_offset], ldu); _starpu_dbdsdc_("U", "I", n, &s[1], &work[ie], &u[u_offset], ldu, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Set the right corner of U to identity matrix */ if (*m > *n) { i__1 = *m - *n; i__2 = *m - *n; _starpu_dlaset_("F", &i__1, &i__2, &c_b227, &c_b248, &u[*n + 1 + ( *n + 1) * u_dim1], ldu); } /* Overwrite U by left singular vectors of A and VT */ /* by right singular vectors of A */ /* (Workspace: need N*N+2*N+M, prefer N*N+2*N+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr); i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, m, &a[a_offset], lda, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, & ierr); } } } else { /* A has more columns than rows. If A has sufficiently more */ /* columns than rows, first reduce using the LQ decomposition (if */ /* sufficient workspace available) */ if (*n >= mnthr) { if (wntqn) { /* Path 1t (N much larger than M, JOBZ='N') */ /* No singular vectors to be computed */ itau = 1; nwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__1, &ierr); /* Zero out above L */ i__1 = *m - 1; i__2 = *m - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b227, &c_b227, &a[(a_dim1 << 1) + 1], lda); ie = 1; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__1, &ierr); nwork = ie + *m; /* Perform bidiagonal SVD, computing singular values only */ /* (Workspace: need M+BDSPAC) */ _starpu_dbdsdc_("U", "N", m, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, &work[nwork], &iwork[1], info); } else if (wntqo) { /* Path 2t (N much larger than M, JOBZ='O') */ /* M right singular vectors to be overwritten on A and */ /* M left singular vectors to be computed in U */ ivt = 1; /* IVT is M by M */ il = ivt + *m * *m; if (*lwork >= *m * *n + *m * *m + *m * 3 + bdspac) { /* WORK(IL) is M by N */ ldwrkl = *m; chunk = *n; } else { ldwrkl = *m; chunk = (*lwork - *m * *m) / *m; } itau = il + ldwrkl * *m; nwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__1, &ierr); /* Copy L to WORK(IL), zeroing about above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[il], &ldwrkl); i__1 = *m - 1; i__2 = *m - 1; _starpu_dlaset_("U", &i__1, &i__2, &c_b227, &c_b227, &work[il + ldwrkl], &ldwrkl); /* Generate Q in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize L in WORK(IL) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dgebrd_(m, m, &work[il], &ldwrkl, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__1, &ierr); /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U, and computing right singular */ /* vectors of bidiagonal matrix in WORK(IVT) */ /* (Workspace: need M+M*M+BDSPAC) */ _starpu_dbdsdc_("U", "I", m, &s[1], &work[ie], &u[u_offset], ldu, & work[ivt], m, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite U by left singular vectors of L and WORK(IVT) */ /* by right singular vectors of L */ /* (Workspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, m, &work[il], &ldwrkl, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr); i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", m, m, m, &work[il], &ldwrkl, &work[ itaup], &work[ivt], m, &work[nwork], &i__1, &ierr); /* Multiply right singular vectors of L in WORK(IVT) by Q */ /* in A, storing result in WORK(IL) and copying to A */ /* (Workspace: need 2*M*M, prefer M*M+M*N) */ i__1 = *n; i__2 = chunk; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = *n - i__ + 1; blk = min(i__3,chunk); _starpu_dgemm_("N", "N", m, &blk, m, &c_b248, &work[ivt], m, &a[ i__ * a_dim1 + 1], lda, &c_b227, &work[il], & ldwrkl); _starpu_dlacpy_("F", m, &blk, &work[il], &ldwrkl, &a[i__ * a_dim1 + 1], lda); /* L30: */ } } else if (wntqs) { /* Path 3t (N much larger than M, JOBZ='S') */ /* M right singular vectors to be computed in VT and */ /* M left singular vectors to be computed in U */ il = 1; /* WORK(IL) is M by M */ ldwrkl = *m; itau = il + ldwrkl * *m; nwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__2, &ierr); /* Copy L to WORK(IL), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[il], &ldwrkl); i__2 = *m - 1; i__1 = *m - 1; _starpu_dlaset_("U", &i__2, &i__1, &c_b227, &c_b227, &work[il + ldwrkl], &ldwrkl); /* Generate Q in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgebrd_(m, m, &work[il], &ldwrkl, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__2, &ierr); /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in VT */ /* (Workspace: need M+BDSPAC) */ _starpu_dbdsdc_("U", "I", m, &s[1], &work[ie], &u[u_offset], ldu, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite U by left singular vectors of L and VT */ /* by right singular vectors of L */ /* (Workspace: need M*M+3*M, prefer M*M+2*M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, m, &work[il], &ldwrkl, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr); i__2 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", m, m, m, &work[il], &ldwrkl, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, & ierr); /* Multiply right singular vectors of L in WORK(IL) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ _starpu_dlacpy_("F", m, m, &vt[vt_offset], ldvt, &work[il], &ldwrkl); _starpu_dgemm_("N", "N", m, n, m, &c_b248, &work[il], &ldwrkl, &a[ a_offset], lda, &c_b227, &vt[vt_offset], ldvt); } else if (wntqa) { /* Path 4t (N much larger than M, JOBZ='A') */ /* N right singular vectors to be computed in VT and */ /* M left singular vectors to be computed in U */ ivt = 1; /* WORK(IVT) is M by M */ ldwkvt = *m; itau = ivt + ldwkvt * *m; nwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], & i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[ nwork], &i__2, &ierr); /* Produce L in A, zeroing out other entries */ i__2 = *m - 1; i__1 = *m - 1; _starpu_dlaset_("U", &i__2, &i__1, &c_b227, &c_b227, &a[(a_dim1 << 1) + 1], lda); ie = itau; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize L in A */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[nwork], &i__2, &ierr); /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in WORK(IVT) */ /* (Workspace: need M+M*M+BDSPAC) */ _starpu_dbdsdc_("U", "I", m, &s[1], &work[ie], &u[u_offset], ldu, & work[ivt], &ldwkvt, dum, idum, &work[nwork], &iwork[1] , info); /* Overwrite U by left singular vectors of L and WORK(IVT) */ /* by right singular vectors of L */ /* (Workspace: need M*M+3*M, prefer M*M+2*M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, m, &a[a_offset], lda, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr); i__2 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", m, m, m, &a[a_offset], lda, &work[ itaup], &work[ivt], &ldwkvt, &work[nwork], &i__2, & ierr); /* Multiply right singular vectors of L in WORK(IVT) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b248, &work[ivt], &ldwkvt, &vt[ vt_offset], ldvt, &c_b227, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } } else { /* N .LT. MNTHR */ /* Path 5t (N greater than M, but not much larger) */ /* Reduce to bidiagonal form without LQ decomposition */ ie = 1; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__2 = *lwork - nwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[nwork], &i__2, &ierr); if (wntqn) { /* Perform bidiagonal SVD, only computing singular values */ /* (Workspace: need M+BDSPAC) */ _starpu_dbdsdc_("L", "N", m, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, &work[nwork], &iwork[1], info); } else if (wntqo) { ldwkvt = *m; ivt = nwork; if (*lwork >= *m * *n + *m * 3 + bdspac) { /* WORK( IVT ) is M by N */ _starpu_dlaset_("F", m, n, &c_b227, &c_b227, &work[ivt], &ldwkvt); nwork = ivt + ldwkvt * *n; } else { /* WORK( IVT ) is M by M */ nwork = ivt + ldwkvt * *m; il = nwork; /* WORK(IL) is M by CHUNK */ chunk = (*lwork - *m * *m - *m * 3) / *m; } /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in WORK(IVT) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsdc_("L", "I", m, &s[1], &work[ie], &u[u_offset], ldu, & work[ivt], &ldwkvt, dum, idum, &work[nwork], &iwork[1] , info); /* Overwrite U by left singular vectors of A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr); if (*lwork >= *m * *n + *m * 3 + bdspac) { /* Overwrite WORK(IVT) by left singular vectors of A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", m, n, m, &a[a_offset], lda, &work[ itaup], &work[ivt], &ldwkvt, &work[nwork], &i__2, &ierr); /* Copy right singular vectors of A from WORK(IVT) to A */ _starpu_dlacpy_("F", m, n, &work[ivt], &ldwkvt, &a[a_offset], lda); } else { /* Generate P**T in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - nwork + 1; _starpu_dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], & work[nwork], &i__2, &ierr); /* Multiply Q in A by right singular vectors of */ /* bidiagonal matrix in WORK(IVT), storing result in */ /* WORK(IL) and copying to A */ /* (Workspace: need 2*M*M, prefer M*M+M*N) */ i__2 = *n; i__1 = chunk; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Computing MIN */ i__3 = *n - i__ + 1; blk = min(i__3,chunk); _starpu_dgemm_("N", "N", m, &blk, m, &c_b248, &work[ivt], & ldwkvt, &a[i__ * a_dim1 + 1], lda, &c_b227, & work[il], m); _starpu_dlacpy_("F", m, &blk, &work[il], m, &a[i__ * a_dim1 + 1], lda); /* L40: */ } } } else if (wntqs) { /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in VT */ /* (Workspace: need M+BDSPAC) */ _starpu_dlaset_("F", m, n, &c_b227, &c_b227, &vt[vt_offset], ldvt); _starpu_dbdsdc_("L", "I", m, &s[1], &work[ie], &u[u_offset], ldu, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Overwrite U by left singular vectors of A and VT */ /* by right singular vectors of A */ /* (Workspace: need 3*M, prefer 2*M+M*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr); i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", m, n, m, &a[a_offset], lda, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, & ierr); } else if (wntqa) { /* Perform bidiagonal SVD, computing left singular vectors */ /* of bidiagonal matrix in U and computing right singular */ /* vectors of bidiagonal matrix in VT */ /* (Workspace: need M+BDSPAC) */ _starpu_dlaset_("F", n, n, &c_b227, &c_b227, &vt[vt_offset], ldvt); _starpu_dbdsdc_("L", "I", m, &s[1], &work[ie], &u[u_offset], ldu, &vt[ vt_offset], ldvt, dum, idum, &work[nwork], &iwork[1], info); /* Set the right corner of VT to identity matrix */ if (*n > *m) { i__1 = *n - *m; i__2 = *n - *m; _starpu_dlaset_("F", &i__1, &i__2, &c_b227, &c_b248, &vt[*m + 1 + (*m + 1) * vt_dim1], ldvt); } /* Overwrite U by left singular vectors of A and VT */ /* by right singular vectors of A */ /* (Workspace: need 2*M+N, prefer 2*M+N*NB) */ i__1 = *lwork - nwork + 1; _starpu_dormbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[ itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr); i__1 = *lwork - nwork + 1; _starpu_dormbr_("P", "R", "T", n, n, m, &a[a_offset], lda, &work[ itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, & ierr); } } } /* Undo scaling if necessary */ if (iscl == 1) { if (anrm > bignum) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & minmn, &ierr); } if (anrm < smlnum) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & minmn, &ierr); } } /* Return optimal workspace in WORK(1) */ work[1] = (doublereal) maxwrk; return 0; /* End of DGESDD */ } /* _starpu_dgesdd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgesv.c000066400000000000000000000106031413463044200204560ustar00rootroot00000000000000/* dgesv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern /* Subroutine */ int _starpu_dgetrf_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dgetrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGESV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N matrix and X and B are N-by-NRHS matrices. */ /* The LU decomposition with partial pivoting and row interchanges is */ /* used to factor A as */ /* A = P * L * U, */ /* where P is a permutation matrix, L is unit lower triangular, and U is */ /* upper triangular. The factored form of A is then used to solve the */ /* system of equations A * X = B. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N coefficient matrix A. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension (N) */ /* The pivot indices that define the permutation matrix P; */ /* row i of the matrix was interchanged with row IPIV(i). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS matrix of right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, so the solution could not be computed. */ /* ===================================================================== */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGESV ", &i__1); return 0; } /* Compute the LU factorization of A. */ _starpu_dgetrf_(n, n, &a[a_offset], lda, &ipiv[1], info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dgetrs_("No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &b[ b_offset], ldb, info); } return 0; /* End of DGESV */ } /* _starpu_dgesv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgesvd.c000066400000000000000000004010131413463044200206210ustar00rootroot00000000000000/* dgesvd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__6 = 6; static integer c__0 = 0; static integer c__2 = 2; static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b421 = 0.; static doublereal c_b443 = 1.; /* Subroutine */ int _starpu_dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], i__2, i__3, i__4; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); double sqrt(doublereal); /* Local variables */ integer i__, ie, ir, iu, blk, ncu; doublereal dum[1], eps; integer nru, iscl; doublereal anrm; integer ierr, itau, ncvt, nrvt; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork; logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs; extern /* Subroutine */ int _starpu_dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); integer bdspac; extern /* Subroutine */ int _starpu_dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dorgbr_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer ldwrkr, minwrk, ldwrku, maxwrk; doublereal smlnum; logical lquery, wntuas, wntvas; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGESVD computes the singular value decomposition (SVD) of a real */ /* M-by-N matrix A, optionally computing the left and/or right singular */ /* vectors. The SVD is written */ /* A = U * SIGMA * transpose(V) */ /* where SIGMA is an M-by-N matrix which is zero except for its */ /* min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and */ /* V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA */ /* are the singular values of A; they are real and non-negative, and */ /* are returned in descending order. The first min(m,n) columns of */ /* U and V are the left and right singular vectors of A. */ /* Note that the routine returns V**T, not V. */ /* Arguments */ /* ========= */ /* JOBU (input) CHARACTER*1 */ /* Specifies options for computing all or part of the matrix U: */ /* = 'A': all M columns of U are returned in array U: */ /* = 'S': the first min(m,n) columns of U (the left singular */ /* vectors) are returned in the array U; */ /* = 'O': the first min(m,n) columns of U (the left singular */ /* vectors) are overwritten on the array A; */ /* = 'N': no columns of U (no left singular vectors) are */ /* computed. */ /* JOBVT (input) CHARACTER*1 */ /* Specifies options for computing all or part of the matrix */ /* V**T: */ /* = 'A': all N rows of V**T are returned in the array VT; */ /* = 'S': the first min(m,n) rows of V**T (the right singular */ /* vectors) are returned in the array VT; */ /* = 'O': the first min(m,n) rows of V**T (the right singular */ /* vectors) are overwritten on the array A; */ /* = 'N': no rows of V**T (no right singular vectors) are */ /* computed. */ /* JOBVT and JOBU cannot both be 'O'. */ /* M (input) INTEGER */ /* The number of rows of the input matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the input matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if JOBU = 'O', A is overwritten with the first min(m,n) */ /* columns of U (the left singular vectors, */ /* stored columnwise); */ /* if JOBVT = 'O', A is overwritten with the first min(m,n) */ /* rows of V**T (the right singular vectors, */ /* stored rowwise); */ /* if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A */ /* are destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* S (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The singular values of A, sorted so that S(i) >= S(i+1). */ /* U (output) DOUBLE PRECISION array, dimension (LDU,UCOL) */ /* (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'. */ /* If JOBU = 'A', U contains the M-by-M orthogonal matrix U; */ /* if JOBU = 'S', U contains the first min(m,n) columns of U */ /* (the left singular vectors, stored columnwise); */ /* if JOBU = 'N' or 'O', U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= 1; if */ /* JOBU = 'S' or 'A', LDU >= M. */ /* VT (output) DOUBLE PRECISION array, dimension (LDVT,N) */ /* If JOBVT = 'A', VT contains the N-by-N orthogonal matrix */ /* V**T; */ /* if JOBVT = 'S', VT contains the first min(m,n) rows of */ /* V**T (the right singular vectors, stored rowwise); */ /* if JOBVT = 'N' or 'O', VT is not referenced. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. LDVT >= 1; if */ /* JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK; */ /* if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged */ /* superdiagonal elements of an upper bidiagonal matrix B */ /* whose diagonal is in S (not necessarily sorted). B */ /* satisfies A = U * B * VT, so it has the same singular values */ /* as A, and singular vectors related by U and VT. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* LWORK >= MAX(1,3*MIN(M,N)+MAX(M,N),5*MIN(M,N)). */ /* For good performance, LWORK should generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if DBDSQR did not converge, INFO specifies how many */ /* superdiagonals of an intermediate bidiagonal form B */ /* did not converge to zero. See the description of WORK */ /* above for details. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; --work; /* Function Body */ *info = 0; minmn = min(*m,*n); wntua = _starpu_lsame_(jobu, "A"); wntus = _starpu_lsame_(jobu, "S"); wntuas = wntua || wntus; wntuo = _starpu_lsame_(jobu, "O"); wntun = _starpu_lsame_(jobu, "N"); wntva = _starpu_lsame_(jobvt, "A"); wntvs = _starpu_lsame_(jobvt, "S"); wntvas = wntva || wntvs; wntvo = _starpu_lsame_(jobvt, "O"); wntvn = _starpu_lsame_(jobvt, "N"); lquery = *lwork == -1; if (! (wntua || wntus || wntuo || wntun)) { *info = -1; } else if (! (wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else if (*ldu < 1 || wntuas && *ldu < *m) { *info = -9; } else if (*ldvt < 1 || wntva && *ldvt < *n || wntvs && *ldvt < minmn) { *info = -11; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { minwrk = 1; maxwrk = 1; if (*m >= *n && minmn > 0) { /* Compute space needed for DBDSQR */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); mnthr = _starpu_ilaenv_(&c__6, "DGESVD", ch__1, m, n, &c__0, &c__0); bdspac = *n * 5; if (*m >= mnthr) { if (wntun) { /* Path 1 (M much larger than N, JOBU='N') */ maxwrk = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); maxwrk = max(i__2,i__3); if (wntvo || wntvas) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(& c__1, "DORGBR", "P", n, n, n, &c_n1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *n << 2; minwrk = max(i__2,bdspac); } else if (wntuo && wntvn) { /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntuo && wntvas) { /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or */ /* 'A') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntus && wntvn) { /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntus && wntvo) { /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*n << 1) * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntus && wntvas) { /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or */ /* 'A') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntua && wntvn) { /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *m * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntua && wntvo) { /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *m * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*n << 1) * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } else if (wntua && wntvas) { /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or */ /* 'A') */ wrkbl = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *n + *m * _starpu_ilaenv_(&c__1, "DORGQR", " ", m, m, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", n, n, n, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *n * *n + wrkbl; /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } } else { /* Path 10 (M at least N, but not much larger) */ maxwrk = *n * 3 + (*m + *n) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); if (wntus || wntuo) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + *n * _starpu_ilaenv_(&c__1, "DORG" "BR", "Q", m, n, n, &c_n1); maxwrk = max(i__2,i__3); } if (wntua) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + *m * _starpu_ilaenv_(&c__1, "DORG" "BR", "Q", m, m, n, &c_n1); maxwrk = max(i__2,i__3); } if (! wntvn) { /* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + (*n - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", n, n, n, &c_n1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *n * 3 + *m; minwrk = max(i__2,bdspac); } } else if (minmn > 0) { /* Compute space needed for DBDSQR */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); mnthr = _starpu_ilaenv_(&c__6, "DGESVD", ch__1, m, n, &c__0, &c__0); bdspac = *m * 5; if (*n >= mnthr) { if (wntvn) { /* Path 1t(N much larger than M, JOBVT='N') */ maxwrk = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); maxwrk = max(i__2,i__3); if (wntuo || wntuas) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORGBR", "Q", m, m, m, &c_n1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *m << 2; minwrk = max(i__2,bdspac); } else if (wntvo && wntun) { /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntvo && wntuas) { /* Path 3t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='O') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); /* Computing MAX */ i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; maxwrk = max(i__2,i__3); /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntvs && wntun) { /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntvs && wntuo) { /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*m << 1) * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntvs && wntuas) { /* Path 6t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='S') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *m * _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntva && wntun) { /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *n * _starpu_ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntva && wntuo) { /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *n * _starpu_ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = (*m << 1) * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } else if (wntva && wntuas) { /* Path 9t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='A') */ wrkbl = *m + *m * _starpu_ilaenv_(&c__1, "DGELQF", " ", m, n, & c_n1, &c_n1); /* Computing MAX */ i__2 = wrkbl, i__3 = *m + *n * _starpu_ilaenv_(&c__1, "DORGLQ", " ", n, n, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m << 1) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, m, &c_n1, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "P", m, m, m, &c_n1); wrkbl = max(i__2,i__3); /* Computing MAX */ i__2 = wrkbl, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORGBR" , "Q", m, m, m, &c_n1); wrkbl = max(i__2,i__3); wrkbl = max(wrkbl,bdspac); maxwrk = *m * *m + wrkbl; /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } } else { /* Path 10t(N greater than M, but not much larger) */ maxwrk = *m * 3 + (*m + *n) * _starpu_ilaenv_(&c__1, "DGEBRD", " ", m, n, &c_n1, &c_n1); if (wntvs || wntvo) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + *m * _starpu_ilaenv_(&c__1, "DORG" "BR", "P", m, n, m, &c_n1); maxwrk = max(i__2,i__3); } if (wntva) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + *n * _starpu_ilaenv_(&c__1, "DORG" "BR", "P", n, n, m, &c_n1); maxwrk = max(i__2,i__3); } if (! wntun) { /* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + (*m - 1) * _starpu_ilaenv_(&c__1, "DORGBR", "Q", m, m, m, &c_n1); maxwrk = max(i__2,i__3); } maxwrk = max(maxwrk,bdspac); /* Computing MAX */ i__2 = *m * 3 + *n; minwrk = max(i__2,bdspac); } } maxwrk = max(maxwrk,minwrk); work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -13; } } if (*info != 0) { i__2 = -(*info); _starpu_xerbla_("DGESVD", &i__2); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = sqrt(_starpu_dlamch_("S")) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", m, n, &a[a_offset], lda, dum); iscl = 0; if (anrm > 0. && anrm < smlnum) { iscl = 1; _starpu_dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & ierr); } else if (anrm > bignum) { iscl = 1; _starpu_dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & ierr); } if (*m >= *n) { /* A has at least as many rows as columns. If A has sufficiently */ /* more rows than columns, first reduce using the QR */ /* decomposition (if sufficient workspace available) */ if (*m >= mnthr) { if (wntun) { /* Path 1 (M much larger than N, JOBU='N') */ /* No left singular vectors to be computed */ itau = 1; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & i__2, &ierr); /* Zero out below R */ i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &a[a_dim1 + 2], lda); ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); ncvt = 0; if (wntvo || wntvas) { /* If right singular vectors desired, generate P'. */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], & work[iwork], &i__2, &ierr); ncvt = *n; } iwork = ie + *n; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in A if desired */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[ a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork], info); /* If right singular vectors desired in VT, copy them there */ if (wntvas) { _starpu_dlacpy_("F", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } } else if (wntuo && wntvn) { /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ /* N left singular vectors to be overwritten on A and */ /* no right singular vectors to be computed */ /* Computing MAX */ i__2 = *n << 2; if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *n; if (*lwork >= max(i__2,i__3) + *lda * *n) { /* WORK(IU) is LDA by N, WORK(IR) is LDA by N */ ldwrku = *lda; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *n; if (*lwork >= max(i__2,i__3) + *n * *n) { /* WORK(IU) is LDA by N, WORK(IR) is N by N */ ldwrku = *lda; ldwrkr = *n; } else { /* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */ ldwrku = (*lwork - *n * *n - *n) / *n; ldwrkr = *n; } } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy R to WORK(IR) and zero out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[ir + 1] , &ldwrkr); /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Generate left vectors bidiagonalizing R */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) */ /* (Workspace: need N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, & c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork] , info); iu = ie + *n; /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in WORK(IU) and copying to A */ /* (Workspace: need N*N+2*N, prefer N*N+M*N+N) */ i__2 = *m; i__3 = ldwrku; for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { /* Computing MIN */ i__4 = *m - i__ + 1; chunk = min(i__4,ldwrku); _starpu_dgemm_("N", "N", &chunk, n, n, &c_b443, &a[i__ + a_dim1], lda, &work[ir], &ldwrkr, &c_b421, & work[iu], &ldwrku); _starpu_dlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ + a_dim1], lda); /* L10: */ } } else { /* Insufficient workspace for a fast algorithm */ ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize A */ /* (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB) */ i__3 = *lwork - iwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__3, &ierr); /* Generate left vectors bidiagonalizing A */ /* (Workspace: need 4*N, prefer 3*N+N*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], & work[iwork], &i__3, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, & c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], info); } } else if (wntuo && wntvas) { /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */ /* N left singular vectors to be overwritten on A and */ /* N right singular vectors to be computed in VT */ /* Computing MAX */ i__3 = *n << 2; if (*lwork >= *n * *n + max(i__3,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *n; if (*lwork >= max(i__3,i__2) + *lda * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ ldwrku = *lda; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *n; if (*lwork >= max(i__3,i__2) + *n * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ ldwrku = *lda; ldwrkr = *n; } else { /* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */ ldwrku = (*lwork - *n * *n - *n) / *n; ldwrkr = *n; } } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__3 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__3, &ierr); /* Copy R to VT, zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); if (*n > 1) { i__3 = *n - 1; i__2 = *n - 1; _starpu_dlaset_("L", &i__3, &i__2, &c_b421, &c_b421, &vt[ vt_dim1 + 2], ldvt); } /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__3, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT, copying result to WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__3 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], &i__3, & ierr); _starpu_dlacpy_("L", n, n, &vt[vt_offset], ldvt, &work[ir], & ldwrkr); /* Generate left vectors bidiagonalizing R in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & work[iwork], &i__3, &ierr); /* Generate right vectors bidiagonalizing R in VT */ /* (Workspace: need N*N+4*N-1, prefer N*N+3*N+(N-1)*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__3, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) and computing right */ /* singular vectors of R in VT */ /* (Workspace: need N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info); iu = ie + *n; /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in WORK(IU) and copying to A */ /* (Workspace: need N*N+2*N, prefer N*N+M*N+N) */ i__3 = *m; i__2 = ldwrku; for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__2) { /* Computing MIN */ i__4 = *m - i__ + 1; chunk = min(i__4,ldwrku); _starpu_dgemm_("N", "N", &chunk, n, n, &c_b443, &a[i__ + a_dim1], lda, &work[ir], &ldwrkr, &c_b421, & work[iu], &ldwrku); _starpu_dlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ + a_dim1], lda); /* L20: */ } } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy R to VT, zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &vt[ vt_dim1 + 2], ldvt); } /* Generate Q in A */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], &i__2, & ierr); /* Multiply Q in A by left vectors bidiagonalizing R */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, & work[itauq], &a[a_offset], lda, &work[iwork], & i__2, &ierr); /* Generate right vectors bidiagonalizing R in VT */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in A and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & work[iwork], info); } } else if (wntus) { if (wntvn) { /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ /* N left singular vectors to be computed in U and */ /* no right singular vectors to be computed */ /* Computing MAX */ i__2 = *n << 2; if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IR) is LDA by N */ ldwrkr = *lda; } else { /* WORK(IR) is N by N */ ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy R to WORK(IR), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[ir + 1], &ldwrkr); /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate left vectors bidiagonalizing R in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) */ /* (Workspace: need N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & work[iwork], info); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in U */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b443, &a[a_offset], lda, &work[ir], &ldwrkr, &c_b421, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &a[ a_dim1 + 2], lda); /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left vectors bidiagonalizing R */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } } else if (wntvo) { /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ /* N left singular vectors to be computed in U and */ /* N right singular vectors to be overwritten on A */ /* Computing MAX */ i__2 = *n << 2; if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *n) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *n; } else { /* WORK(IU) is N by N and WORK(IR) is N by N */ ldwrku = *n; ir = iu + ldwrku * *n; ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[iu + 1], &ldwrku); /* Generate Q in A */ /* (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*N*N+4*N, */ /* prefer 2*N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*N*N+4*N-1, */ /* prefer 2*N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in WORK(IR) */ /* (Workspace: need 2*N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &work[ ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, &work[iwork], info); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IU), storing result in U */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b443, &a[a_offset], lda, &work[iu], &ldwrku, &c_b421, &u[u_offset], ldu); /* Copy right singular vectors of R to A */ /* (Workspace: need N*N) */ _starpu_dlacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &a[ a_dim1 + 2], lda); /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left vectors bidiagonalizing R */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; /* Generate right vectors bidiagonalizing R in A */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[iwork], info); } } else if (wntvas) { /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' */ /* or 'A') */ /* N left singular vectors to be computed in U and */ /* N right singular vectors to be computed in VT */ /* Computing MAX */ i__2 = *n << 2; if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IU) is LDA by N */ ldwrku = *lda; } else { /* WORK(IU) is N by N */ ldwrku = *n; } itau = iu + ldwrku * *n; iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[iu + 1], &ldwrku); /* Generate Q in A */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to VT */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need N*N+4*N-1, */ /* prefer N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in VT */ /* (Workspace: need N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &work[iu], &ldwrku, dum, & c__1, &work[iwork], info); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IU), storing result in U */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b443, &a[a_offset], lda, &work[iu], &ldwrku, &c_b421, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R to VT, zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &vt[ vt_dim1 + 2], ldvt); } ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in VT */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } else if (wntua) { if (wntvn) { /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ /* M left singular vectors to be computed in U and */ /* no right singular vectors to be computed */ /* Computing MAX */ i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IR) is LDA by N */ ldwrkr = *lda; } else { /* WORK(IR) is N by N */ ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Copy R to WORK(IR), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[ir + 1], &ldwrkr); /* Generate Q in U */ /* (Workspace: need N*N+N+M, prefer N*N+N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) */ /* (Workspace: need N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & work[iwork], info); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IR), storing result in A */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b443, &u[u_offset], ldu, &work[ir], &ldwrkr, &c_b421, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need N+M, prefer N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &a[ a_dim1 + 2], lda); /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in A */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } } else if (wntvo) { /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ /* M left singular vectors to be computed in U and */ /* N right singular vectors to be overwritten on A */ /* Computing MAX */ i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *n) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *n; } else { /* WORK(IU) is N by N and WORK(IR) is N by N */ ldwrku = *n; ir = iu + ldwrku * *n; ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[iu + 1], &ldwrku); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*N*N+4*N, */ /* prefer 2*N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*N*N+4*N, prefer 2*N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*N*N+4*N-1, */ /* prefer 2*N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in WORK(IR) */ /* (Workspace: need 2*N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &work[ ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, &work[iwork], info); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IU), storing result in A */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b443, &u[u_offset], ldu, &work[iu], &ldwrku, &c_b421, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Copy right singular vectors of R from WORK(IR) to A */ _starpu_dlacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need N+M, prefer N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Zero out below R in A */ i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &a[ a_dim1 + 2], lda); /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in A */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, & work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr) ; /* Generate right bidiagonalizing vectors in A */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, &ierr); iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[iwork], info); } } else if (wntvas) { /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' */ /* or 'A') */ /* M left singular vectors to be computed in U and */ /* N right singular vectors to be computed in VT */ /* Computing MAX */ i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *n) { /* WORK(IU) is LDA by N */ ldwrku = *lda; } else { /* WORK(IU) is N by N */ ldwrku = *n; } itau = iu + ldwrku * *n; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need N*N+2*N, prefer N*N+N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need N*N+N+M, prefer N*N+N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &work[iu + 1], &ldwrku); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to VT */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need N*N+4*N, prefer N*N+3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq] , &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need N*N+4*N-1, */ /* prefer N*N+3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in VT */ /* (Workspace: need N*N+BDSPAC) */ _starpu_dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &work[iu], &ldwrku, dum, & c__1, &work[iwork], info); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IU), storing result in A */ /* (Workspace: need N*N) */ _starpu_dgemm_("N", "N", m, n, n, &c_b443, &u[u_offset], ldu, &work[iu], &ldwrku, &c_b421, &a[a_offset], lda); /* Copy left singular vectors of A from A to U */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); /* Generate Q in U */ /* (Workspace: need N+M, prefer N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & work[iwork], &i__2, &ierr); /* Copy R from A to VT, zeroing out below it */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; _starpu_dlaset_("L", &i__2, &i__3, &c_b421, &c_b421, &vt[ vt_dim1 + 2], ldvt); } ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize R in VT */ /* (Workspace: need 4*N, prefer 3*N+2*N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in VT */ /* (Workspace: need 3*N+M, prefer 3*N+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], &u[u_offset], ldu, &work[iwork], &i__2, &ierr); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[ itaup], &work[iwork], &i__2, &ierr) ; iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } } else { /* M .LT. MNTHR */ /* Path 10 (M at least N, but not much larger) */ /* Reduce to bidiagonal form without QR decomposition */ ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; /* Bidiagonalize A */ /* (Workspace: need 3*N+M, prefer 3*N+(M+N)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[iwork], &i__2, &ierr); if (wntuas) { /* If left singular vectors desired in U, copy result to U */ /* and generate left bidiagonalizing vectors in U */ /* (Workspace: need 3*N+NCU, prefer 3*N+NCU*NB) */ _starpu_dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu); if (wntus) { ncu = *n; } if (wntua) { ncu = *m; } i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], & work[iwork], &i__2, &ierr); } if (wntvas) { /* If right singular vectors desired in VT, copy result to */ /* VT and generate right bidiagonalizing vectors in VT */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ _starpu_dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt); i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], & work[iwork], &i__2, &ierr); } if (wntuo) { /* If left singular vectors desired in A, generate left */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*N, prefer 3*N+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[ iwork], &i__2, &ierr); } if (wntvo) { /* If right singular vectors desired in A, generate right */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[ iwork], &i__2, &ierr); } iwork = ie + *n; if (wntuas || wntuo) { nru = *m; } if (wntun) { nru = 0; } if (wntvas || wntvo) { ncvt = *n; } if (wntvn) { ncvt = 0; } if (! wntuo && ! wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } else if (! wntuo && wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ iwork], info); } else { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in A and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & work[iwork], info); } } } else { /* A has more columns than rows. If A has sufficiently more */ /* columns than rows, first reduce using the LQ decomposition (if */ /* sufficient workspace available) */ if (*n >= mnthr) { if (wntvn) { /* Path 1t(N much larger than M, JOBVT='N') */ /* No right singular vectors to be computed */ itau = 1; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & i__2, &ierr); /* Zero out above L */ i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &a[(a_dim1 << 1) + 1], lda); ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); if (wntuo || wntuas) { /* If left singular vectors desired, generate Q */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], & work[iwork], &i__2, &ierr); } iwork = ie + *m; nru = 0; if (wntuo || wntuas) { nru = *m; } /* Perform bidiagonal QR iteration, computing left singular */ /* vectors of A in A if desired */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, & c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], info); /* If left singular vectors desired in U, copy them there */ if (wntuas) { _starpu_dlacpy_("F", m, m, &a[a_offset], lda, &u[u_offset], ldu); } } else if (wntvo && wntun) { /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ /* M right singular vectors to be overwritten on A and */ /* no left singular vectors to be computed */ /* Computing MAX */ i__2 = *m << 2; if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *m; if (*lwork >= max(i__2,i__3) + *lda * *m) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ ldwrku = *lda; chunk = *n; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *m; if (*lwork >= max(i__2,i__3) + *m * *m) { /* WORK(IU) is LDA by N and WORK(IR) is M by M */ ldwrku = *lda; chunk = *n; ldwrkr = *m; } else { /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ ldwrku = *m; chunk = (*lwork - *m * *m - *m) / *m; ldwrkr = *m; } } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy L to WORK(IR) and zero out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[ir + ldwrkr], &ldwrkr); /* Generate Q in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Generate right vectors bidiagonalizing L */ /* (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork] , info); iu = ie + *m; /* Multiply right singular vectors of L in WORK(IR) by Q */ /* in A, storing result in WORK(IU) and copying to A */ /* (Workspace: need M*M+2*M, prefer M*M+M*N+M) */ i__2 = *n; i__3 = chunk; for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { /* Computing MIN */ i__4 = *n - i__ + 1; blk = min(i__4,chunk); _starpu_dgemm_("N", "N", m, &blk, m, &c_b443, &work[ir], & ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b421, & work[iu], &ldwrku); _starpu_dlacpy_("F", m, &blk, &work[iu], &ldwrku, &a[i__ * a_dim1 + 1], lda); /* L30: */ } } else { /* Insufficient workspace for a fast algorithm */ ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__3 = *lwork - iwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__3, &ierr); /* Generate right vectors bidiagonalizing A */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], & work[iwork], &i__3, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[ a_offset], lda, dum, &c__1, dum, &c__1, &work[ iwork], info); } } else if (wntvo && wntuas) { /* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */ /* M right singular vectors to be overwritten on A and */ /* M left singular vectors to be computed in U */ /* Computing MAX */ i__3 = *m << 2; if (*lwork >= *m * *m + max(i__3,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *m; if (*lwork >= max(i__3,i__2) + *lda * *m) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ ldwrku = *lda; chunk = *n; ldwrkr = *lda; } else /* if(complicated condition) */ { /* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *m; if (*lwork >= max(i__3,i__2) + *m * *m) { /* WORK(IU) is LDA by N and WORK(IR) is M by M */ ldwrku = *lda; chunk = *n; ldwrkr = *m; } else { /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ ldwrku = *m; chunk = (*lwork - *m * *m - *m) / *m; ldwrkr = *m; } } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__3 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__3, &ierr); /* Copy L to U, zeroing about above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__3 = *m - 1; i__2 = *m - 1; _starpu_dlaset_("U", &i__3, &i__2, &c_b421, &c_b421, &u[(u_dim1 << 1) + 1], ldu); /* Generate Q in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ iwork], &i__3, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U, copying result to WORK(IR) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__3 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__3, &ierr); _starpu_dlacpy_("U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr); /* Generate right vectors bidiagonalizing L in WORK(IR) */ /* (Workspace: need M*M+4*M-1, prefer M*M+3*M+(M-1)*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & work[iwork], &i__3, &ierr); /* Generate left vectors bidiagonalizing L in U */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB) */ i__3 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], & work[iwork], &i__3, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in U, and computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[ iwork], info); iu = ie + *m; /* Multiply right singular vectors of L in WORK(IR) by Q */ /* in A, storing result in WORK(IU) and copying to A */ /* (Workspace: need M*M+2*M, prefer M*M+M*N+M)) */ i__3 = *n; i__2 = chunk; for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__2) { /* Computing MIN */ i__4 = *n - i__ + 1; blk = min(i__4,chunk); _starpu_dgemm_("N", "N", m, &blk, m, &c_b443, &work[ir], & ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b421, & work[iu], &ldwrku); _starpu_dlacpy_("F", m, &blk, &work[iu], &ldwrku, &a[i__ * a_dim1 + 1], lda); /* L40: */ } } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] , &i__2, &ierr); /* Copy L to U, zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &u[(u_dim1 << 1) + 1], ldu); /* Generate Q in A */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in A */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, &work[ itaup], &a[a_offset], lda, &work[iwork], &i__2, & ierr); /* Generate left vectors bidiagonalizing L in U */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], & work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } } else if (wntvs) { if (wntun) { /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ /* M right singular vectors to be computed in VT and */ /* no left singular vectors to be computed */ /* Computing MAX */ i__2 = *m << 2; if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IR) is LDA by M */ ldwrkr = *lda; } else { /* WORK(IR) is M by M */ ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy L to WORK(IR), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[ir + ldwrkr], &ldwrkr); /* Generate Q in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate right vectors bidiagonalizing L in */ /* WORK(IR) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], & work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IR) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b443, &work[ir], &ldwrkr, &a[a_offset], lda, &c_b421, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy result to VT */ _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &a[( a_dim1 << 1) + 1], lda); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in VT */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, &c__0, &c__0, &s[1], &work[ie], & vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & work[iwork], info); } } else if (wntuo) { /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ /* M right singular vectors to be computed in VT and */ /* M left singular vectors to be overwritten on A */ /* Computing MAX */ i__2 = *m << 2; if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *m) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is M by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *m; } else { /* WORK(IU) is M by M and WORK(IR) is M by M */ ldwrku = *m; ir = iu + ldwrku * *m; ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out below it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[iu + ldwrku], &ldwrku); /* Generate Q in A */ /* (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*M*M+4*M, */ /* prefer 2*M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*M*M+4*M-1, */ /* prefer 2*M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in WORK(IR) and computing */ /* right singular vectors of L in WORK(IU) */ /* (Workspace: need 2*M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b443, &work[iu], &ldwrku, &a[a_offset], lda, &c_b421, &vt[vt_offset], ldvt); /* Copy left singular vectors of L to A */ /* (Workspace: need M*M) */ _starpu_dlacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &a[( a_dim1 << 1) + 1], lda); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in VT */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors of L in A */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, compute left */ /* singular vectors of A in A and compute right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, & c__1, &work[iwork], info); } } else if (wntuas) { /* Path 6t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='S') */ /* M right singular vectors to be computed in VT and */ /* M left singular vectors to be computed in U */ /* Computing MAX */ i__2 = *m << 2; if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IU) is LDA by N */ ldwrku = *lda; } else { /* WORK(IU) is LDA by M */ ldwrku = *m; } itau = iu + ldwrku * *m; iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[iu + ldwrku], &ldwrku); /* Generate Q in A */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset], ldu); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need M*M+4*M-1, */ /* prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in U and computing right */ /* singular vectors of L in WORK(IU) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b443, &work[iu], &ldwrku, &a[a_offset], lda, &c_b421, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to U, zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &u[( u_dim1 << 1) + 1], ldu); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in U by Q */ /* in VT */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } else if (wntva) { if (wntun) { /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ /* N right singular vectors to be computed in VT and */ /* no left singular vectors to be computed */ /* Computing MAX */ i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ ir = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IR) is LDA by M */ ldwrkr = *lda; } else { /* WORK(IR) is M by M */ ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Copy L to WORK(IR), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], & ldwrkr); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[ir + ldwrkr], &ldwrkr); /* Generate Q in VT */ /* (Workspace: need M*M+M+N, prefer M*M+M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need M*M+4*M-1, */ /* prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], & work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IR) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b443, &work[ir], &ldwrkr, &vt[vt_offset], ldvt, &c_b421, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need M+N, prefer M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &a[( a_dim1 << 1) + 1], lda); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in A by Q */ /* in VT */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, &c__0, &c__0, &s[1], &work[ie], & vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & work[iwork], info); } } else if (wntuo) { /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ /* N right singular vectors to be computed in VT and */ /* M left singular vectors to be overwritten on A */ /* Computing MAX */ i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *m) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is M by M */ ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *m; } else { /* WORK(IU) is M by M and WORK(IR) is M by M */ ldwrku = *m; ir = iu + ldwrku * *m; ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[iu + ldwrku], &ldwrku); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*M*M+4*M, */ /* prefer 2*M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], & ldwrkr); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*M*M+4*M-1, */ /* prefer 2*M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*M*M+4*M, prefer 2*M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] , &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in WORK(IR) and computing */ /* right singular vectors of L in WORK(IU) */ /* (Workspace: need 2*M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b443, &work[iu], &ldwrku, &vt[vt_offset], ldvt, &c_b421, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Copy left singular vectors of A from WORK(IR) to A */ _starpu_dlacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset], lda); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need M+N, prefer M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Zero out above L in A */ i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &a[( a_dim1 << 1) + 1], lda); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in A by Q */ /* in VT */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in A */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in A and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, & c__1, &work[iwork], info); } } else if (wntuas) { /* Path 9t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='A') */ /* N right singular vectors to be computed in VT and */ /* M left singular vectors to be computed in U */ /* Computing MAX */ i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ iu = 1; if (*lwork >= wrkbl + *lda * *m) { /* WORK(IU) is LDA by M */ ldwrku = *lda; } else { /* WORK(IU) is M by M */ ldwrku = *m; } itau = iu + ldwrku * *m; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need M*M+M+N, prefer M*M+M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], & ldwrku); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &work[iu + ldwrku], &ldwrku); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); _starpu_dlacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset], ldu); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup] , &work[iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need M*M+4*M, prefer M*M+3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in U and computing right */ /* singular vectors of L in WORK(IU) */ /* (Workspace: need M*M+BDSPAC) */ _starpu_dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ _starpu_dgemm_("N", "N", m, n, m, &c_b443, &work[iu], &ldwrku, &vt[vt_offset], ldvt, &c_b421, &a[a_offset], lda); /* Copy right singular vectors of A from A to VT */ _starpu_dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); } else { /* Insufficient workspace for a fast algorithm */ itau = 1; iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ iwork], &i__2, &ierr); _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); /* Generate Q in VT */ /* (Workspace: need M+N, prefer M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & work[iwork], &i__2, &ierr); /* Copy L to U, zeroing out above it */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *m - 1; i__3 = *m - 1; _starpu_dlaset_("U", &i__2, &i__3, &c_b421, &c_b421, &u[( u_dim1 << 1) + 1], ldu); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize L in U */ /* (Workspace: need 4*M, prefer 3*M+2*M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & work[itauq], &work[itaup], &work[iwork], & i__2, &ierr); /* Multiply right bidiagonalizing vectors in U by Q */ /* in VT */ /* (Workspace: need 3*M+N, prefer 3*M+N*NB) */ i__2 = *lwork - iwork + 1; _starpu_dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, & work[itaup], &vt[vt_offset], ldvt, &work[ iwork], &i__2, &ierr); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr); iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, & c__1, &work[iwork], info); } } } } else { /* N .LT. MNTHR */ /* Path 10t(N greater than M, but not much larger) */ /* Reduce to bidiagonal form without LQ decomposition */ ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & work[itaup], &work[iwork], &i__2, &ierr); if (wntuas) { /* If left singular vectors desired in U, copy result to U */ /* and generate left bidiagonalizing vectors in U */ /* (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB) */ _starpu_dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu); i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[ iwork], &i__2, &ierr); } if (wntvas) { /* If right singular vectors desired in VT, copy result to */ /* VT and generate right bidiagonalizing vectors in VT */ /* (Workspace: need 3*M+NRVT, prefer 3*M+NRVT*NB) */ _starpu_dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt); if (wntva) { nrvt = *n; } if (wntvs) { nrvt = *m; } i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, &ierr); } if (wntuo) { /* If left singular vectors desired in A, generate left */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*M-1, prefer 3*M+(M-1)*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[ iwork], &i__2, &ierr); } if (wntvo) { /* If right singular vectors desired in A, generate right */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ i__2 = *lwork - iwork + 1; _starpu_dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ iwork], &i__2, &ierr); } iwork = ie + *m; if (wntuas || wntuo) { nru = *m; } if (wntun) { nru = 0; } if (wntvas || wntvo) { ncvt = *n; } if (wntvn) { ncvt = 0; } if (! wntuo && ! wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & work[iwork], info); } else if (! wntuo && wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in A */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ iwork], info); } else { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in A and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ _starpu_dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & work[iwork], info); } } } /* If DBDSQR failed to converge, copy unconverged superdiagonals */ /* to WORK( 2:MINMN ) */ if (*info != 0) { if (ie > 2) { i__2 = minmn - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[i__ + 1] = work[i__ + ie - 1]; /* L50: */ } } if (ie < 2) { for (i__ = minmn - 1; i__ >= 1; --i__) { work[i__ + 1] = work[i__ + ie - 1]; /* L60: */ } } } /* Undo scaling if necessary */ if (iscl == 1) { if (anrm > bignum) { _starpu_dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & minmn, &ierr); } if (*info != 0 && anrm > bignum) { i__2 = minmn - 1; _starpu_dlascl_("G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], &minmn, &ierr); } if (anrm < smlnum) { _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & minmn, &ierr); } if (*info != 0 && anrm < smlnum) { i__2 = minmn - 1; _starpu_dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], &minmn, &ierr); } } /* Return optimal workspace in WORK(1) */ work[1] = (doublereal) maxwrk; return 0; /* End of DGESVD */ } /* _starpu_dgesvd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgesvj.c000066400000000000000000001557441413463044200206500ustar00rootroot00000000000000/* dgesvj.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b17 = 0.; static doublereal c_b18 = 1.; static integer c__1 = 1; static integer c__0 = 0; static integer c__2 = 2; /* Subroutine */ int _starpu_dgesvj_(char *joba, char *jobu, char *jobv, integer *m, integer *n, doublereal *a, integer *lda, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal bigtheta; integer pskipped, i__, p, q; doublereal t; integer n2, n4; doublereal rootsfmin; integer n34; doublereal cs, sn; integer ir1, jbc; doublereal big; integer kbl, igl, ibr, jgl, nbl; doublereal tol; integer mvl; doublereal aapp, aapq, aaqq; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal ctol; integer ierr; doublereal aapp0; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp1; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal scale, large, apoaq, aqoap; extern logical _starpu_lsame_(char *, char *); doublereal theta, small, sfmin; logical lsvec; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal fastr[5]; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical applv, rsvec; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical uctol; extern /* Subroutine */ int _starpu_drotm_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *); logical lower, upper, rotok; extern /* Subroutine */ int _starpu_dgsvj0_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dgsvj1_( char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); integer ijblsk, swband, blskip; doublereal mxaapq; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal thsign, mxsinj; integer emptsw, notrot, iswrot, lkahead; logical goscale, noscale; doublereal rootbig, epsilon, rooteps; integer rowskip; doublereal roottol; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Zlatko Drmac of the University of Zagreb and -- */ /* -- Kresimir Veselic of the Fernuniversitaet Hagen -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* This routine is also part of SIGMA (version 1.23, October 23. 2008.) */ /* SIGMA is a library of algorithms for highly accurate algorithms for */ /* computation of SVD, PSVD, QSVD, (H,K)-SVD, and for solution of the */ /* eigenvalue problems Hx = lambda M x, H M x = lambda x with H, M > 0. */ /* -#- Scalar Arguments -#- */ /* -#- Array Arguments -#- */ /* .. */ /* Purpose */ /* ~~~~~~~ */ /* DGESVJ computes the singular value decomposition (SVD) of a real */ /* M-by-N matrix A, where M >= N. The SVD of A is written as */ /* [++] [xx] [x0] [xx] */ /* A = U * SIGMA * V^t, [++] = [xx] * [ox] * [xx] */ /* [++] [xx] */ /* where SIGMA is an N-by-N diagonal matrix, U is an M-by-N orthonormal */ /* matrix, and V is an N-by-N orthogonal matrix. The diagonal elements */ /* of SIGMA are the singular values of A. The columns of U and V are the */ /* left and the right singular vectors of A, respectively. */ /* Further Details */ /* ~~~~~~~~~~~~~~~ */ /* The orthogonal N-by-N matrix V is obtained as a product of Jacobi plane */ /* rotations. The rotations are implemented as fast scaled rotations of */ /* Anda and Park [1]. In the case of underflow of the Jacobi angle, a */ /* modified Jacobi transformation of Drmac [4] is used. Pivot strategy uses */ /* column interchanges of de Rijk [2]. The relative accuracy of the computed */ /* singular values and the accuracy of the computed singular vectors (in */ /* angle metric) is as guaranteed by the theory of Demmel and Veselic [3]. */ /* The condition number that determines the accuracy in the full rank case */ /* is essentially min_{D=diag} kappa(A*D), where kappa(.) is the */ /* spectral condition number. The best performance of this Jacobi SVD */ /* procedure is achieved if used in an accelerated version of Drmac and */ /* Veselic [5,6], and it is the kernel routine in the SIGMA library [7]. */ /* Some tunning parameters (marked with [TP]) are available for the */ /* implementer. */ /* The computational range for the nonzero singular values is the machine */ /* number interval ( UNDERFLOW , OVERFLOW ). In extreme cases, even */ /* denormalized singular values can be computed with the corresponding */ /* gradual loss of accurate digits. */ /* Contributors */ /* ~~~~~~~~~~~~ */ /* Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany) */ /* References */ /* ~~~~~~~~~~ */ /* [1] A. A. Anda and H. Park: Fast plane rotations with dynamic scaling. */ /* SIAM J. matrix Anal. Appl., Vol. 15 (1994), pp. 162-174. */ /* [2] P. P. M. De Rijk: A one-sided Jacobi algorithm for computing the */ /* singular value decomposition on a vector computer. */ /* SIAM J. Sci. Stat. Comp., Vol. 10 (1998), pp. 359-371. */ /* [3] J. Demmel and K. Veselic: Jacobi method is more accurate than QR. */ /* [4] Z. Drmac: Implementation of Jacobi rotations for accurate singular */ /* value computation in floating point arithmetic. */ /* SIAM J. Sci. Comp., Vol. 18 (1997), pp. 1200-1222. */ /* [5] Z. Drmac and K. Veselic: New fast and accurate Jacobi SVD algorithm I. */ /* SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp. 1322-1342. */ /* LAPACK Working note 169. */ /* [6] Z. Drmac and K. Veselic: New fast and accurate Jacobi SVD algorithm II. */ /* SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp. 1343-1362. */ /* LAPACK Working note 170. */ /* [7] Z. Drmac: SIGMA - mathematical software library for accurate SVD, PSV, */ /* QSVD, (H,K)-SVD computations. */ /* Department of Mathematics, University of Zagreb, 2008. */ /* Bugs, Examples and Comments */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* Please report all bugs and send interesting test examples and comments to */ /* drmac@math.hr. Thank you. */ /* Arguments */ /* ~~~~~~~~~ */ /* JOBA (input) CHARACTER* 1 */ /* Specifies the structure of A. */ /* = 'L': The input matrix A is lower triangular; */ /* = 'U': The input matrix A is upper triangular; */ /* = 'G': The input matrix A is general M-by-N matrix, M >= N. */ /* JOBU (input) CHARACTER*1 */ /* Specifies whether to compute the left singular vectors */ /* (columns of U): */ /* = 'U': The left singular vectors corresponding to the nonzero */ /* singular values are computed and returned in the leading */ /* columns of A. See more details in the description of A. */ /* The default numerical orthogonality threshold is set to */ /* approximately TOL=CTOL*EPS, CTOL=DSQRT(M), EPS=DLAMCH('E'). */ /* = 'C': Analogous to JOBU='U', except that user can control the */ /* level of numerical orthogonality of the computed left */ /* singular vectors. TOL can be set to TOL = CTOL*EPS, where */ /* CTOL is given on input in the array WORK. */ /* No CTOL smaller than ONE is allowed. CTOL greater */ /* than 1 / EPS is meaningless. The option 'C' */ /* can be used if M*EPS is satisfactory orthogonality */ /* of the computed left singular vectors, so CTOL=M could */ /* save few sweeps of Jacobi rotations. */ /* See the descriptions of A and WORK(1). */ /* = 'N': The matrix U is not computed. However, see the */ /* description of A. */ /* JOBV (input) CHARACTER*1 */ /* Specifies whether to compute the right singular vectors, that */ /* is, the matrix V: */ /* = 'V' : the matrix V is computed and returned in the array V */ /* = 'A' : the Jacobi rotations are applied to the MV-by-N */ /* array V. In other words, the right singular vector */ /* matrix V is not computed explicitly, instead it is */ /* applied to an MV-by-N matrix initially stored in the */ /* first MV rows of V. */ /* = 'N' : the matrix V is not computed and the array V is not */ /* referenced */ /* M (input) INTEGER */ /* The number of rows of the input matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the input matrix A. */ /* M >= N >= 0. */ /* A (input/output) REAL array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* If JOBU .EQ. 'U' .OR. JOBU .EQ. 'C': */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* If INFO .EQ. 0, */ /* ~~~~~~~~~~~~~~~ */ /* RANKA orthonormal columns of U are returned in the */ /* leading RANKA columns of the array A. Here RANKA <= N */ /* is the number of computed singular values of A that are */ /* above the underflow threshold DLAMCH('S'). The singular */ /* vectors corresponding to underflowed or zero singular */ /* values are not computed. The value of RANKA is returned */ /* in the array WORK as RANKA=NINT(WORK(2)). Also see the */ /* descriptions of SVA and WORK. The computed columns of U */ /* are mutually numerically orthogonal up to approximately */ /* TOL=DSQRT(M)*EPS (default); or TOL=CTOL*EPS (JOBU.EQ.'C'), */ /* see the description of JOBU. */ /* If INFO .GT. 0, */ /* ~~~~~~~~~~~~~~~ */ /* the procedure DGESVJ did not converge in the given number */ /* of iterations (sweeps). In that case, the computed */ /* columns of U may not be orthogonal up to TOL. The output */ /* U (stored in A), SIGMA (given by the computed singular */ /* values in SVA(1:N)) and V is still a decomposition of the */ /* input matrix A in the sense that the residual */ /* ||A-SCALE*U*SIGMA*V^T||_2 / ||A||_2 is small. */ /* If JOBU .EQ. 'N': */ /* ~~~~~~~~~~~~~~~~~ */ /* If INFO .EQ. 0 */ /* ~~~~~~~~~~~~~~ */ /* Note that the left singular vectors are 'for free' in the */ /* one-sided Jacobi SVD algorithm. However, if only the */ /* singular values are needed, the level of numerical */ /* orthogonality of U is not an issue and iterations are */ /* stopped when the columns of the iterated matrix are */ /* numerically orthogonal up to approximately M*EPS. Thus, */ /* on exit, A contains the columns of U scaled with the */ /* corresponding singular values. */ /* If INFO .GT. 0, */ /* ~~~~~~~~~~~~~~~ */ /* the procedure DGESVJ did not converge in the given number */ /* of iterations (sweeps). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* SVA (workspace/output) REAL array, dimension (N) */ /* On exit, */ /* If INFO .EQ. 0, */ /* ~~~~~~~~~~~~~~~ */ /* depending on the value SCALE = WORK(1), we have: */ /* If SCALE .EQ. ONE: */ /* ~~~~~~~~~~~~~~~~~~ */ /* SVA(1:N) contains the computed singular values of A. */ /* During the computation SVA contains the Euclidean column */ /* norms of the iterated matrices in the array A. */ /* If SCALE .NE. ONE: */ /* ~~~~~~~~~~~~~~~~~~ */ /* The singular values of A are SCALE*SVA(1:N), and this */ /* factored representation is due to the fact that some of the */ /* singular values of A might underflow or overflow. */ /* If INFO .GT. 0, */ /* ~~~~~~~~~~~~~~~ */ /* the procedure DGESVJ did not converge in the given number of */ /* iterations (sweeps) and SCALE*SVA(1:N) may not be accurate. */ /* MV (input) INTEGER */ /* If JOBV .EQ. 'A', then the product of Jacobi rotations in DGESVJ */ /* is applied to the first MV rows of V. See the description of JOBV. */ /* V (input/output) REAL array, dimension (LDV,N) */ /* If JOBV = 'V', then V contains on exit the N-by-N matrix of */ /* the right singular vectors; */ /* If JOBV = 'A', then V contains the product of the computed right */ /* singular vector matrix and the initial matrix in */ /* the array V. */ /* If JOBV = 'N', then V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V, LDV .GE. 1. */ /* If JOBV .EQ. 'V', then LDV .GE. max(1,N). */ /* If JOBV .EQ. 'A', then LDV .GE. max(1,MV) . */ /* WORK (input/workspace/output) REAL array, dimension max(4,M+N). */ /* On entry, */ /* If JOBU .EQ. 'C', */ /* ~~~~~~~~~~~~~~~~~ */ /* WORK(1) = CTOL, where CTOL defines the threshold for convergence. */ /* The process stops if all columns of A are mutually */ /* orthogonal up to CTOL*EPS, EPS=DLAMCH('E'). */ /* It is required that CTOL >= ONE, i.e. it is not */ /* allowed to force the routine to obtain orthogonality */ /* below EPSILON. */ /* On exit, */ /* WORK(1) = SCALE is the scaling factor such that SCALE*SVA(1:N) */ /* are the computed singular vcalues of A. */ /* (See description of SVA().) */ /* WORK(2) = NINT(WORK(2)) is the number of the computed nonzero */ /* singular values. */ /* WORK(3) = NINT(WORK(3)) is the number of the computed singular */ /* values that are larger than the underflow threshold. */ /* WORK(4) = NINT(WORK(4)) is the number of sweeps of Jacobi */ /* rotations needed for numerical convergence. */ /* WORK(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| in the last sweep. */ /* This is useful information in cases when DGESVJ did */ /* not converge, as it can be used to estimate whether */ /* the output is stil useful and for post festum analysis. */ /* WORK(6) = the largest absolute value over all sines of the */ /* Jacobi rotation angles in the last sweep. It can be */ /* useful for a post festum analysis. */ /* LWORK length of WORK, WORK >= MAX(6,M+N) */ /* INFO (output) INTEGER */ /* = 0 : successful exit. */ /* < 0 : if INFO = -i, then the i-th argument had an illegal value */ /* > 0 : DGESVJ did not converge in the maximal allowed number (30) */ /* of sweeps. The output may still be useful. See the */ /* description of WORK. */ /* Local Parameters */ /* Local Scalars */ /* Local Arrays */ /* Intrinsic Functions */ /* External Functions */ /* .. from BLAS */ /* .. from LAPACK */ /* External Subroutines */ /* .. from BLAS */ /* .. from LAPACK */ /* Test the input arguments */ /* Parameter adjustments */ --sva; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --work; /* Function Body */ lsvec = _starpu_lsame_(jobu, "U"); uctol = _starpu_lsame_(jobu, "C"); rsvec = _starpu_lsame_(jobv, "V"); applv = _starpu_lsame_(jobv, "A"); upper = _starpu_lsame_(joba, "U"); lower = _starpu_lsame_(joba, "L"); if (! (upper || lower || _starpu_lsame_(joba, "G"))) { *info = -1; } else if (! (lsvec || uctol || _starpu_lsame_(jobu, "N"))) { *info = -2; } else if (! (rsvec || applv || _starpu_lsame_(jobv, "N"))) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0 || *n > *m) { *info = -5; } else if (*lda < *m) { *info = -7; } else if (*mv < 0) { *info = -9; } else if (rsvec && *ldv < *n || applv && *ldv < *mv) { *info = -11; } else if (uctol && work[1] <= 1.) { *info = -12; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = *m + *n; if (*lwork < max(i__1,6)) { *info = -13; } else { *info = 0; } } /* #:( */ if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGESVJ", &i__1); return 0; } /* #:) Quick return for void matrix */ if (*m == 0 || *n == 0) { return 0; } /* Set numerical parameters */ /* The stopping criterion for Jacobi rotations is */ /* max_{i<>j}|A(:,i)^T * A(:,j)|/(||A(:,i)||*||A(:,j)||) < CTOL*EPS */ /* where EPS is the round-off and CTOL is defined as follows: */ if (uctol) { /* ... user controlled */ ctol = work[1]; } else { /* ... default */ if (lsvec || rsvec || applv) { ctol = sqrt((doublereal) (*m)); } else { ctol = (doublereal) (*m); } } /* ... and the machine dependent parameters are */ /* [!] (Make sure that DLAMCH() works properly on the target machine.) */ epsilon = _starpu_dlamch_("Epsilon"); rooteps = sqrt(epsilon); sfmin = _starpu_dlamch_("SafeMinimum"); rootsfmin = sqrt(sfmin); small = sfmin / epsilon; big = _starpu_dlamch_("Overflow"); /* BIG = ONE / SFMIN */ rootbig = 1. / rootsfmin; large = big / sqrt((doublereal) (*m * *n)); bigtheta = 1. / rooteps; tol = ctol * epsilon; roottol = sqrt(tol); if ((doublereal) (*m) * epsilon >= 1.) { *info = -5; i__1 = -(*info); _starpu_xerbla_("DGESVJ", &i__1); return 0; } /* Initialize the right singular vector matrix. */ if (rsvec) { mvl = *n; _starpu_dlaset_("A", &mvl, n, &c_b17, &c_b18, &v[v_offset], ldv); } else if (applv) { mvl = *mv; } rsvec = rsvec || applv; /* Initialize SVA( 1:N ) = ( ||A e_i||_2, i = 1:N ) */ /* (!) If necessary, scale A to protect the largest singular value */ /* from overflow. It is possible that saving the largest singular */ /* value destroys the information about the small ones. */ /* This initial scaling is almost minimal in the sense that the */ /* goal is to make sure that no column norm overflows, and that */ /* DSQRT(N)*max_i SVA(i) does not overflow. If INFinite entries */ /* in A are detected, the procedure returns with INFO=-6. */ scale = 1. / sqrt((doublereal) (*m) * (doublereal) (*n)); noscale = TRUE_; goscale = TRUE_; if (lower) { /* the input matrix is M-by-N lower triangular (trapezoidal) */ i__1 = *n; for (p = 1; p <= i__1; ++p) { aapp = 0.; aaqq = 0.; i__2 = *m - p + 1; _starpu_dlassq_(&i__2, &a[p + p * a_dim1], &c__1, &aapp, &aaqq); if (aapp > big) { *info = -6; i__2 = -(*info); _starpu_xerbla_("DGESVJ", &i__2); return 0; } aaqq = sqrt(aaqq); if (aapp < big / aaqq && noscale) { sva[p] = aapp * aaqq; } else { noscale = FALSE_; sva[p] = aapp * (aaqq * scale); if (goscale) { goscale = FALSE_; i__2 = p - 1; for (q = 1; q <= i__2; ++q) { sva[q] *= scale; /* L1873: */ } } } /* L1874: */ } } else if (upper) { /* the input matrix is M-by-N upper triangular (trapezoidal) */ i__1 = *n; for (p = 1; p <= i__1; ++p) { aapp = 0.; aaqq = 0.; _starpu_dlassq_(&p, &a[p * a_dim1 + 1], &c__1, &aapp, &aaqq); if (aapp > big) { *info = -6; i__2 = -(*info); _starpu_xerbla_("DGESVJ", &i__2); return 0; } aaqq = sqrt(aaqq); if (aapp < big / aaqq && noscale) { sva[p] = aapp * aaqq; } else { noscale = FALSE_; sva[p] = aapp * (aaqq * scale); if (goscale) { goscale = FALSE_; i__2 = p - 1; for (q = 1; q <= i__2; ++q) { sva[q] *= scale; /* L2873: */ } } } /* L2874: */ } } else { /* the input matrix is M-by-N general dense */ i__1 = *n; for (p = 1; p <= i__1; ++p) { aapp = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], &c__1, &aapp, &aaqq); if (aapp > big) { *info = -6; i__2 = -(*info); _starpu_xerbla_("DGESVJ", &i__2); return 0; } aaqq = sqrt(aaqq); if (aapp < big / aaqq && noscale) { sva[p] = aapp * aaqq; } else { noscale = FALSE_; sva[p] = aapp * (aaqq * scale); if (goscale) { goscale = FALSE_; i__2 = p - 1; for (q = 1; q <= i__2; ++q) { sva[q] *= scale; /* L3873: */ } } } /* L3874: */ } } if (noscale) { scale = 1.; } /* Move the smaller part of the spectrum from the underflow threshold */ /* (!) Start by determining the position of the nonzero entries of the */ /* array SVA() relative to ( SFMIN, BIG ). */ aapp = 0.; aaqq = big; i__1 = *n; for (p = 1; p <= i__1; ++p) { if (sva[p] != 0.) { /* Computing MIN */ d__1 = aaqq, d__2 = sva[p]; aaqq = min(d__1,d__2); } /* Computing MAX */ d__1 = aapp, d__2 = sva[p]; aapp = max(d__1,d__2); /* L4781: */ } /* #:) Quick return for zero matrix */ if (aapp == 0.) { if (lsvec) { _starpu_dlaset_("G", m, n, &c_b17, &c_b18, &a[a_offset], lda); } work[1] = 1.; work[2] = 0.; work[3] = 0.; work[4] = 0.; work[5] = 0.; work[6] = 0.; return 0; } /* #:) Quick return for one-column matrix */ if (*n == 1) { if (lsvec) { _starpu_dlascl_("G", &c__0, &c__0, &sva[1], &scale, m, &c__1, &a[a_dim1 + 1], lda, &ierr); } work[1] = 1. / scale; if (sva[1] >= sfmin) { work[2] = 1.; } else { work[2] = 0.; } work[3] = 0.; work[4] = 0.; work[5] = 0.; work[6] = 0.; return 0; } /* Protect small singular values from underflow, and try to */ /* avoid underflows/overflows in computing Jacobi rotations. */ sn = sqrt(sfmin / epsilon); temp1 = sqrt(big / (doublereal) (*n)); if (aapp <= sn || aaqq >= temp1 || sn <= aaqq && aapp <= temp1) { /* Computing MIN */ d__1 = big, d__2 = temp1 / aapp; temp1 = min(d__1,d__2); /* AAQQ = AAQQ*TEMP1 */ /* AAPP = AAPP*TEMP1 */ } else if (aaqq <= sn && aapp <= temp1) { /* Computing MIN */ d__1 = sn / aaqq, d__2 = big / (aapp * sqrt((doublereal) (*n))); temp1 = min(d__1,d__2); /* AAQQ = AAQQ*TEMP1 */ /* AAPP = AAPP*TEMP1 */ } else if (aaqq >= sn && aapp >= temp1) { /* Computing MAX */ d__1 = sn / aaqq, d__2 = temp1 / aapp; temp1 = max(d__1,d__2); /* AAQQ = AAQQ*TEMP1 */ /* AAPP = AAPP*TEMP1 */ } else if (aaqq <= sn && aapp >= temp1) { /* Computing MIN */ d__1 = sn / aaqq, d__2 = big / (sqrt((doublereal) (*n)) * aapp); temp1 = min(d__1,d__2); /* AAQQ = AAQQ*TEMP1 */ /* AAPP = AAPP*TEMP1 */ } else { temp1 = 1.; } /* Scale, if necessary */ if (temp1 != 1.) { _starpu_dlascl_("G", &c__0, &c__0, &c_b18, &temp1, n, &c__1, &sva[1], n, & ierr); } scale = temp1 * scale; if (scale != 1.) { _starpu_dlascl_(joba, &c__0, &c__0, &c_b18, &scale, m, n, &a[a_offset], lda, & ierr); scale = 1. / scale; } /* Row-cyclic Jacobi SVD algorithm with column pivoting */ emptsw = *n * (*n - 1) / 2; notrot = 0; fastr[0] = 0.; /* A is represented in factored form A = A * diag(WORK), where diag(WORK) */ /* is initialized to identity. WORK is updated during fast scaled */ /* rotations. */ i__1 = *n; for (q = 1; q <= i__1; ++q) { work[q] = 1.; /* L1868: */ } swband = 3; /* [TP] SWBAND is a tuning parameter [TP]. It is meaningful and effective */ /* if DGESVJ is used as a computational routine in the preconditioned */ /* Jacobi SVD algorithm DGESVJ. For sweeps i=1:SWBAND the procedure */ /* works on pivots inside a band-like region around the diagonal. */ /* The boundaries are determined dynamically, based on the number of */ /* pivots above a threshold. */ kbl = min(8,*n); /* [TP] KBL is a tuning parameter that defines the tile size in the */ /* tiling of the p-q loops of pivot pairs. In general, an optimal */ /* value of KBL depends on the matrix dimensions and on the */ /* parameters of the computer's memory. */ nbl = *n / kbl; if (nbl * kbl != *n) { ++nbl; } /* Computing 2nd power */ i__1 = kbl; blskip = i__1 * i__1; /* [TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL. */ rowskip = min(5,kbl); /* [TP] ROWSKIP is a tuning parameter. */ lkahead = 1; /* [TP] LKAHEAD is a tuning parameter. */ /* Quasi block transformations, using the lower (upper) triangular */ /* structure of the input matrix. The quasi-block-cycling usually */ /* invokes cubic convergence. Big part of this cycle is done inside */ /* canonical subspaces of dimensions less than M. */ /* Computing MAX */ i__1 = 64, i__2 = kbl << 2; if ((lower || upper) && *n > max(i__1,i__2)) { /* [TP] The number of partition levels and the actual partition are */ /* tuning parameters. */ n4 = *n / 4; n2 = *n / 2; n34 = n4 * 3; if (applv) { q = 0; } else { q = 1; } if (lower) { /* This works very well on lower triangular matrices, in particular */ /* in the framework of the preconditioned Jacobi SVD (xGEJSV). */ /* The idea is simple: */ /* [+ 0 0 0] Note that Jacobi transformations of [0 0] */ /* [+ + 0 0] [0 0] */ /* [+ + x 0] actually work on [x 0] [x 0] */ /* [+ + x x] [x x]. [x x] */ i__1 = *m - n34; i__2 = *n - n34; i__3 = *lwork - *n; _starpu_dgsvj0_(jobv, &i__1, &i__2, &a[n34 + 1 + (n34 + 1) * a_dim1], lda, &work[n34 + 1], &sva[n34 + 1], &mvl, &v[n34 * q + 1 + ( n34 + 1) * v_dim1], ldv, &epsilon, &sfmin, &tol, &c__2, & work[*n + 1], &i__3, &ierr); i__1 = *m - n2; i__2 = n34 - n2; i__3 = *lwork - *n; _starpu_dgsvj0_(jobv, &i__1, &i__2, &a[n2 + 1 + (n2 + 1) * a_dim1], lda, & work[n2 + 1], &sva[n2 + 1], &mvl, &v[n2 * q + 1 + (n2 + 1) * v_dim1], ldv, &epsilon, &sfmin, &tol, &c__2, &work[*n + 1], &i__3, &ierr); i__1 = *m - n2; i__2 = *n - n2; i__3 = *lwork - *n; _starpu_dgsvj1_(jobv, &i__1, &i__2, &n4, &a[n2 + 1 + (n2 + 1) * a_dim1], lda, &work[n2 + 1], &sva[n2 + 1], &mvl, &v[n2 * q + 1 + ( n2 + 1) * v_dim1], ldv, &epsilon, &sfmin, &tol, &c__1, & work[*n + 1], &i__3, &ierr); i__1 = *m - n4; i__2 = n2 - n4; i__3 = *lwork - *n; _starpu_dgsvj0_(jobv, &i__1, &i__2, &a[n4 + 1 + (n4 + 1) * a_dim1], lda, & work[n4 + 1], &sva[n4 + 1], &mvl, &v[n4 * q + 1 + (n4 + 1) * v_dim1], ldv, &epsilon, &sfmin, &tol, &c__1, &work[*n + 1], &i__3, &ierr); i__1 = *lwork - *n; _starpu_dgsvj0_(jobv, m, &n4, &a[a_offset], lda, &work[1], &sva[1], &mvl, &v[v_offset], ldv, &epsilon, &sfmin, &tol, &c__1, &work[* n + 1], &i__1, &ierr); i__1 = *lwork - *n; _starpu_dgsvj1_(jobv, m, &n2, &n4, &a[a_offset], lda, &work[1], &sva[1], & mvl, &v[v_offset], ldv, &epsilon, &sfmin, &tol, &c__1, & work[*n + 1], &i__1, &ierr); } else if (upper) { i__1 = *lwork - *n; _starpu_dgsvj0_(jobv, &n4, &n4, &a[a_offset], lda, &work[1], &sva[1], & mvl, &v[v_offset], ldv, &epsilon, &sfmin, &tol, &c__2, & work[*n + 1], &i__1, &ierr); i__1 = *lwork - *n; _starpu_dgsvj0_(jobv, &n2, &n4, &a[(n4 + 1) * a_dim1 + 1], lda, &work[n4 + 1], &sva[n4 + 1], &mvl, &v[n4 * q + 1 + (n4 + 1) * v_dim1], ldv, &epsilon, &sfmin, &tol, &c__1, &work[*n + 1] , &i__1, &ierr); i__1 = *lwork - *n; _starpu_dgsvj1_(jobv, &n2, &n2, &n4, &a[a_offset], lda, &work[1], &sva[1], &mvl, &v[v_offset], ldv, &epsilon, &sfmin, &tol, &c__1, & work[*n + 1], &i__1, &ierr); i__1 = n2 + n4; i__2 = *lwork - *n; _starpu_dgsvj0_(jobv, &i__1, &n4, &a[(n2 + 1) * a_dim1 + 1], lda, &work[ n2 + 1], &sva[n2 + 1], &mvl, &v[n2 * q + 1 + (n2 + 1) * v_dim1], ldv, &epsilon, &sfmin, &tol, &c__1, &work[*n + 1] , &i__2, &ierr); } } /* -#- Row-cyclic pivot strategy with de Rijk's pivoting -#- */ for (i__ = 1; i__ <= 30; ++i__) { /* .. go go go ... */ mxaapq = 0.; mxsinj = 0.; iswrot = 0; notrot = 0; pskipped = 0; /* Each sweep is unrolled using KBL-by-KBL tiles over the pivot pairs */ /* 1 <= p < q <= N. This is the first step toward a blocked implementation */ /* of the rotations. New implementation, based on block transformations, */ /* is under development. */ i__1 = nbl; for (ibr = 1; ibr <= i__1; ++ibr) { igl = (ibr - 1) * kbl + 1; /* Computing MIN */ i__3 = lkahead, i__4 = nbl - ibr; i__2 = min(i__3,i__4); for (ir1 = 0; ir1 <= i__2; ++ir1) { igl += ir1 * kbl; /* Computing MIN */ i__4 = igl + kbl - 1, i__5 = *n - 1; i__3 = min(i__4,i__5); for (p = igl; p <= i__3; ++p) { /* .. de Rijk's pivoting */ i__4 = *n - p + 1; q = _starpu_idamax_(&i__4, &sva[p], &c__1) + p - 1; if (p != q) { _starpu_dswap_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); if (rsvec) { _starpu_dswap_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1); } temp1 = sva[p]; sva[p] = sva[q]; sva[q] = temp1; temp1 = work[p]; work[p] = work[q]; work[q] = temp1; } if (ir1 == 0) { /* Column norms are periodically updated by explicit */ /* norm computation. */ /* Caveat: */ /* Unfortunately, some BLAS implementations compute DNRM2(M,A(1,p),1) */ /* as DSQRT(DDOT(M,A(1,p),1,A(1,p),1)), which may cause the result to */ /* overflow for ||A(:,p)||_2 > DSQRT(overflow_threshold), and to */ /* underflow for ||A(:,p)||_2 < DSQRT(underflow_threshold). */ /* Hence, DNRM2 cannot be trusted, not even in the case when */ /* the true norm is far from the under(over)flow boundaries. */ /* If properly implemented DNRM2 is available, the IF-THEN-ELSE */ /* below should read "AAPP = DNRM2( M, A(1,p), 1 ) * WORK(p)". */ if (sva[p] < rootbig && sva[p] > rootsfmin) { sva[p] = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * work[p]; } else { temp1 = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], &c__1, &temp1, & aapp); sva[p] = temp1 * sqrt(aapp) * work[p]; } aapp = sva[p]; } else { aapp = sva[p]; } if (aapp > 0.) { pskipped = 0; /* Computing MIN */ i__5 = igl + kbl - 1; i__4 = min(i__5,*n); for (q = p + 1; q <= i__4; ++q) { aaqq = sva[q]; if (aaqq > 0.) { aapp0 = aapp; if (aaqq >= 1.) { rotok = small * aapp <= aaqq; if (aapp < big / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * work[p] * work[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[*n + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & work[p], m, &c__1, &work[*n + 1], lda, &ierr); aapq = _starpu_ddot_(m, &work[*n + 1], &c__1, &a[q * a_dim1 + 1], &c__1) * work[q] / aaqq; } } else { rotok = aapp <= aaqq / small; if (aapp > small / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * work[p] * work[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], &c__1, & work[*n + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & work[q], m, &c__1, &work[*n + 1], lda, &ierr); aapq = _starpu_ddot_(m, &work[*n + 1], &c__1, &a[p * a_dim1 + 1], &c__1) * work[p] / aapp; } } /* Computing MAX */ d__1 = mxaapq, d__2 = abs(aapq); mxaapq = max(d__1,d__2); /* TO rotate or NOT to rotate, THAT is the question ... */ if (abs(aapq) > tol) { /* .. rotate */ /* [RTD] ROTATED = ROTATED + ONE */ if (ir1 == 0) { notrot = 0; pskipped = 0; ++iswrot; } if (rotok) { aqoap = aaqq / aapp; apoaq = aapp / aaqq; theta = (d__1 = aqoap - apoaq, abs( d__1)) * -.5 / aapq; if (abs(theta) > bigtheta) { t = .5 / theta; fastr[2] = t * work[p] / work[q]; fastr[3] = -t * work[q] / work[p]; _starpu_drotm_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1, fastr); } /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); aapp *= sqrt(1. - t * aqoap * aapq); /* Computing MAX */ d__1 = mxsinj, d__2 = abs(t); mxsinj = max(d__1,d__2); } else { /* .. choose correct signum for THETA and rotate */ thsign = -d_sign(&c_b18, &aapq); t = 1. / (theta + thsign * sqrt( theta * theta + 1.)); cs = sqrt(1. / (t * t + 1.)); sn = t * cs; /* Computing MAX */ d__1 = mxsinj, d__2 = abs(sn); mxsinj = max(d__1,d__2); /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); /* Computing MAX */ d__1 = 0., d__2 = 1. - t * aqoap * aapq; aapp *= sqrt((max(d__1,d__2))); apoaq = work[p] / work[q]; aqoap = work[q] / work[p]; if (work[p] >= 1.) { if (work[q] >= 1.) { fastr[2] = t * apoaq; fastr[3] = -t * aqoap; work[p] *= cs; work[q] *= cs; _starpu_drotm_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[ q * v_dim1 + 1], &c__1, fastr); } } else { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); work[p] *= cs; work[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); } } } else { if (work[q] >= 1.) { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); work[p] /= cs; work[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); } } else { if (work[p] >= work[q]) { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); work[p] *= cs; work[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } else { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); work[p] /= cs; work[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); } } } } } } else { /* .. have to use modified Gram-Schmidt like transformation */ _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[*n + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & c_b18, m, &c__1, &work[*n + 1] , lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & c_b18, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); temp1 = -aapq * work[p] / work[q]; _starpu_daxpy_(m, &temp1, &work[*n + 1], & c__1, &a[q * a_dim1 + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b18, & aaqq, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[q] = aaqq * sqrt((max(d__1,d__2))) ; mxsinj = max(mxsinj,sfmin); } /* END IF ROTOK THEN ... ELSE */ /* In the case of cancellation in updating SVA(q), SVA(p) */ /* recompute SVA(q), SVA(p). */ /* Computing 2nd power */ d__1 = sva[q] / aaqq; if (d__1 * d__1 <= rooteps) { if (aaqq < rootbig && aaqq > rootsfmin) { sva[q] = _starpu_dnrm2_(m, &a[q * a_dim1 + 1], &c__1) * work[q]; } else { t = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[q * a_dim1 + 1], & c__1, &t, &aaqq); sva[q] = t * sqrt(aaqq) * work[q]; } } if (aapp / aapp0 <= rooteps) { if (aapp < rootbig && aapp > rootsfmin) { aapp = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * work[p]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], & c__1, &t, &aapp); aapp = t * sqrt(aapp) * work[p]; } sva[p] = aapp; } } else { /* A(:,p) and A(:,q) already numerically orthogonal */ if (ir1 == 0) { ++notrot; } /* [RTD] SKIPPED = SKIPPED + 1 */ ++pskipped; } } else { /* A(:,q) is zero column */ if (ir1 == 0) { ++notrot; } ++pskipped; } if (i__ <= swband && pskipped > rowskip) { if (ir1 == 0) { aapp = -aapp; } notrot = 0; goto L2103; } /* L2002: */ } /* END q-LOOP */ L2103: /* bailed out of q-loop */ sva[p] = aapp; } else { sva[p] = aapp; if (ir1 == 0 && aapp == 0.) { /* Computing MIN */ i__4 = igl + kbl - 1; notrot = notrot + min(i__4,*n) - p; } } /* L2001: */ } /* end of the p-loop */ /* end of doing the block ( ibr, ibr ) */ /* L1002: */ } /* end of ir1-loop */ /* ... go to the off diagonal blocks */ igl = (ibr - 1) * kbl + 1; i__2 = nbl; for (jbc = ibr + 1; jbc <= i__2; ++jbc) { jgl = (jbc - 1) * kbl + 1; /* doing the block at ( ibr, jbc ) */ ijblsk = 0; /* Computing MIN */ i__4 = igl + kbl - 1; i__3 = min(i__4,*n); for (p = igl; p <= i__3; ++p) { aapp = sva[p]; if (aapp > 0.) { pskipped = 0; /* Computing MIN */ i__5 = jgl + kbl - 1; i__4 = min(i__5,*n); for (q = jgl; q <= i__4; ++q) { aaqq = sva[q]; if (aaqq > 0.) { aapp0 = aapp; /* -#- M x 2 Jacobi SVD -#- */ /* Safe Gram matrix computation */ if (aaqq >= 1.) { if (aapp >= aaqq) { rotok = small * aapp <= aaqq; } else { rotok = small * aaqq <= aapp; } if (aapp < big / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * work[p] * work[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[*n + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & work[p], m, &c__1, &work[*n + 1], lda, &ierr); aapq = _starpu_ddot_(m, &work[*n + 1], &c__1, &a[q * a_dim1 + 1], &c__1) * work[q] / aaqq; } } else { if (aapp >= aaqq) { rotok = aapp <= aaqq / small; } else { rotok = aaqq <= aapp / small; } if (aapp > small / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * work[p] * work[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], &c__1, & work[*n + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & work[q], m, &c__1, &work[*n + 1], lda, &ierr); aapq = _starpu_ddot_(m, &work[*n + 1], &c__1, &a[p * a_dim1 + 1], &c__1) * work[p] / aapp; } } /* Computing MAX */ d__1 = mxaapq, d__2 = abs(aapq); mxaapq = max(d__1,d__2); /* TO rotate or NOT to rotate, THAT is the question ... */ if (abs(aapq) > tol) { notrot = 0; /* [RTD] ROTATED = ROTATED + 1 */ pskipped = 0; ++iswrot; if (rotok) { aqoap = aaqq / aapp; apoaq = aapp / aaqq; theta = (d__1 = aqoap - apoaq, abs( d__1)) * -.5 / aapq; if (aaqq > aapp0) { theta = -theta; } if (abs(theta) > bigtheta) { t = .5 / theta; fastr[2] = t * work[p] / work[q]; fastr[3] = -t * work[q] / work[p]; _starpu_drotm_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1, fastr); } /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); /* Computing MAX */ d__1 = 0., d__2 = 1. - t * aqoap * aapq; aapp *= sqrt((max(d__1,d__2))); /* Computing MAX */ d__1 = mxsinj, d__2 = abs(t); mxsinj = max(d__1,d__2); } else { /* .. choose correct signum for THETA and rotate */ thsign = -d_sign(&c_b18, &aapq); if (aaqq > aapp0) { thsign = -thsign; } t = 1. / (theta + thsign * sqrt( theta * theta + 1.)); cs = sqrt(1. / (t * t + 1.)); sn = t * cs; /* Computing MAX */ d__1 = mxsinj, d__2 = abs(sn); mxsinj = max(d__1,d__2); /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); aapp *= sqrt(1. - t * aqoap * aapq); apoaq = work[p] / work[q]; aqoap = work[q] / work[p]; if (work[p] >= 1.) { if (work[q] >= 1.) { fastr[2] = t * apoaq; fastr[3] = -t * aqoap; work[p] *= cs; work[q] *= cs; _starpu_drotm_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[ q * v_dim1 + 1], &c__1, fastr); } } else { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); } work[p] *= cs; work[q] /= cs; } } else { if (work[q] >= 1.) { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); } work[p] /= cs; work[q] *= cs; } else { if (work[p] >= work[q]) { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); work[p] *= cs; work[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } else { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); work[p] /= cs; work[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); } } } } } } else { if (aapp > aaqq) { _starpu_dcopy_(m, &a[p * a_dim1 + 1], & c__1, &work[*n + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &c_b18, m, &c__1, &work[* n + 1], lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, &c_b18, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); temp1 = -aapq * work[p] / work[q]; _starpu_daxpy_(m, &temp1, &work[*n + 1], & c__1, &a[q * a_dim1 + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b18, &aaqq, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[q] = aaqq * sqrt((max(d__1, d__2))); mxsinj = max(mxsinj,sfmin); } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], & c__1, &work[*n + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, &c_b18, m, &c__1, &work[* n + 1], lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &c_b18, m, &c__1, &a[p * a_dim1 + 1], lda, &ierr); temp1 = -aapq * work[q] / work[p]; _starpu_daxpy_(m, &temp1, &work[*n + 1], & c__1, &a[p * a_dim1 + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b18, &aapp, m, &c__1, &a[p * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[p] = aapp * sqrt((max(d__1, d__2))); mxsinj = max(mxsinj,sfmin); } } /* END IF ROTOK THEN ... ELSE */ /* In the case of cancellation in updating SVA(q) */ /* .. recompute SVA(q) */ /* Computing 2nd power */ d__1 = sva[q] / aaqq; if (d__1 * d__1 <= rooteps) { if (aaqq < rootbig && aaqq > rootsfmin) { sva[q] = _starpu_dnrm2_(m, &a[q * a_dim1 + 1], &c__1) * work[q]; } else { t = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[q * a_dim1 + 1], & c__1, &t, &aaqq); sva[q] = t * sqrt(aaqq) * work[q]; } } /* Computing 2nd power */ d__1 = aapp / aapp0; if (d__1 * d__1 <= rooteps) { if (aapp < rootbig && aapp > rootsfmin) { aapp = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * work[p]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], & c__1, &t, &aapp); aapp = t * sqrt(aapp) * work[p]; } sva[p] = aapp; } /* end of OK rotation */ } else { ++notrot; /* [RTD] SKIPPED = SKIPPED + 1 */ ++pskipped; ++ijblsk; } } else { ++notrot; ++pskipped; ++ijblsk; } if (i__ <= swband && ijblsk >= blskip) { sva[p] = aapp; notrot = 0; goto L2011; } if (i__ <= swband && pskipped > rowskip) { aapp = -aapp; notrot = 0; goto L2203; } /* L2200: */ } /* end of the q-loop */ L2203: sva[p] = aapp; } else { if (aapp == 0.) { /* Computing MIN */ i__4 = jgl + kbl - 1; notrot = notrot + min(i__4,*n) - jgl + 1; } if (aapp < 0.) { notrot = 0; } } /* L2100: */ } /* end of the p-loop */ /* L2010: */ } /* end of the jbc-loop */ L2011: /* 2011 bailed out of the jbc-loop */ /* Computing MIN */ i__3 = igl + kbl - 1; i__2 = min(i__3,*n); for (p = igl; p <= i__2; ++p) { sva[p] = (d__1 = sva[p], abs(d__1)); /* L2012: */ } /* ** */ /* L2000: */ } /* 2000 :: end of the ibr-loop */ /* .. update SVA(N) */ if (sva[*n] < rootbig && sva[*n] > rootsfmin) { sva[*n] = _starpu_dnrm2_(m, &a[*n * a_dim1 + 1], &c__1) * work[*n]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[*n * a_dim1 + 1], &c__1, &t, &aapp); sva[*n] = t * sqrt(aapp) * work[*n]; } /* Additional steering devices */ if (i__ < swband && (mxaapq <= roottol || iswrot <= *n)) { swband = i__; } if (i__ > swband + 1 && mxaapq < sqrt((doublereal) (*n)) * tol && ( doublereal) (*n) * mxaapq * mxsinj < tol) { goto L1994; } if (notrot >= emptsw) { goto L1994; } /* L1993: */ } /* end i=1:NSWEEP loop */ /* #:( Reaching this point means that the procedure has not converged. */ *info = 29; goto L1995; L1994: /* #:) Reaching this point means numerical convergence after the i-th */ /* sweep. */ *info = 0; /* #:) INFO = 0 confirms successful iterations. */ L1995: /* Sort the singular values and find how many are above */ /* the underflow threshold. */ n2 = 0; n4 = 0; i__1 = *n - 1; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; q = _starpu_idamax_(&i__2, &sva[p], &c__1) + p - 1; if (p != q) { temp1 = sva[p]; sva[p] = sva[q]; sva[q] = temp1; temp1 = work[p]; work[p] = work[q]; work[q] = temp1; _starpu_dswap_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); if (rsvec) { _starpu_dswap_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } if (sva[p] != 0.) { ++n4; if (sva[p] * scale > sfmin) { ++n2; } } /* L5991: */ } if (sva[*n] != 0.) { ++n4; if (sva[*n] * scale > sfmin) { ++n2; } } /* Normalize the left singular vectors. */ if (lsvec || uctol) { i__1 = n2; for (p = 1; p <= i__1; ++p) { d__1 = work[p] / sva[p]; _starpu_dscal_(m, &d__1, &a[p * a_dim1 + 1], &c__1); /* L1998: */ } } /* Scale the product of Jacobi rotations (assemble the fast rotations). */ if (rsvec) { if (applv) { i__1 = *n; for (p = 1; p <= i__1; ++p) { _starpu_dscal_(&mvl, &work[p], &v[p * v_dim1 + 1], &c__1); /* L2398: */ } } else { i__1 = *n; for (p = 1; p <= i__1; ++p) { temp1 = 1. / _starpu_dnrm2_(&mvl, &v[p * v_dim1 + 1], &c__1); _starpu_dscal_(&mvl, &temp1, &v[p * v_dim1 + 1], &c__1); /* L2399: */ } } } /* Undo scaling, if necessary (and possible). */ if (scale > 1. && sva[1] < big / scale || scale < 1. && sva[n2] > sfmin / scale) { i__1 = *n; for (p = 1; p <= i__1; ++p) { sva[p] = scale * sva[p]; /* L2400: */ } scale = 1.; } work[1] = scale; /* The singular values of A are SCALE*SVA(1:N). If SCALE.NE.ONE */ /* then some of the singular values may overflow or underflow and */ /* the spectrum is given in this factored representation. */ work[2] = (doublereal) n4; /* N4 is the number of computed nonzero singular values of A. */ work[3] = (doublereal) n2; /* N2 is the number of singular values of A greater than SFMIN. */ /* If N2= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. If FACT = 'F' and EQUED is */ /* not 'N', then A must have been equilibrated by the scaling */ /* factors in R and/or C. A is not modified if FACT = 'F' or */ /* 'N', or if FACT = 'E' and EQUED = 'N' on exit. */ /* On exit, if EQUED .ne. 'N', A is scaled as follows: */ /* EQUED = 'R': A := diag(R) * A */ /* EQUED = 'C': A := A * diag(C) */ /* EQUED = 'B': A := diag(R) * A * diag(C). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input or output) DOUBLE PRECISION array, dimension (LDAF,N) */ /* If FACT = 'F', then AF is an input argument and on entry */ /* contains the factors L and U from the factorization */ /* A = P*L*U as computed by DGETRF. If EQUED .ne. 'N', then */ /* AF is the factored form of the equilibrated matrix A. */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the factors L and U from the factorization A = P*L*U */ /* of the original matrix A. */ /* If FACT = 'E', then AF is an output argument and on exit */ /* returns the factors L and U from the factorization A = P*L*U */ /* of the equilibrated matrix A (see the description of A for */ /* the form of the equilibrated matrix). */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains the pivot indices from the factorization A = P*L*U */ /* as computed by DGETRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = P*L*U */ /* of the original matrix A. */ /* If FACT = 'E', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = P*L*U */ /* of the equilibrated matrix A. */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* R (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'R' or 'B', A is */ /* multiplied on the left by diag(R); if EQUED = 'N' or 'C', R */ /* is not accessed. R is an input argument if FACT = 'F'; */ /* otherwise, R is an output argument. If FACT = 'F' and */ /* EQUED = 'R' or 'B', each element of R must be positive. */ /* C (input or output) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If EQUED = 'C' or 'B', A is */ /* multiplied on the right by diag(C); if EQUED = 'N' or 'R', C */ /* is not accessed. C is an input argument if FACT = 'F'; */ /* otherwise, C is an output argument. If FACT = 'F' and */ /* EQUED = 'C' or 'B', each element of C must be positive. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, */ /* if EQUED = 'N', B is not modified; */ /* if TRANS = 'N' and EQUED = 'R' or 'B', B is overwritten by */ /* diag(R)*B; */ /* if TRANS = 'T' or 'C' and EQUED = 'C' or 'B', B is */ /* overwritten by diag(C)*B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X */ /* to the original system of equations. Note that A and B are */ /* modified on exit if EQUED .ne. 'N', and the solution to the */ /* equilibrated system is inv(diag(C))*X if TRANS = 'N' and */ /* EQUED = 'C' or 'B', or inv(diag(R))*X if TRANS = 'T' or 'C' */ /* and EQUED = 'R' or 'B'. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A after equilibration (if done). If RCOND is less than the */ /* machine precision (in particular, if RCOND = 0), the matrix */ /* is singular to working precision. This condition is */ /* indicated by a return code of INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (4*N) */ /* On exit, WORK(1) contains the reciprocal pivot growth */ /* factor norm(A)/norm(U). The "max absolute element" norm is */ /* used. If WORK(1) is much less than 1, then the stability */ /* of the LU factorization of the (equilibrated) matrix A */ /* could be poor. This also means that the solution X, condition */ /* estimator RCOND, and forward error bound FERR could be */ /* unreliable. If factorization fails with 0 0: if INFO = i, and i is */ /* <= N: U(i,i) is exactly zero. The factorization has */ /* been completed, but the factor U is exactly */ /* singular, so the solution and error bounds */ /* could not be computed. RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --r__; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); notran = _starpu_lsame_(trans, "N"); if (nofact || equil) { *(unsigned char *)equed = 'N'; rowequ = FALSE_; colequ = FALSE_; } else { rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; } /* Test the input parameters. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (_starpu_lsame_(fact, "F") && ! (rowequ || colequ || _starpu_lsame_(equed, "N"))) { *info = -10; } else { if (rowequ) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = r__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = r__[j]; rcmax = max(d__1,d__2); /* L10: */ } if (rcmin <= 0.) { *info = -11; } else if (*n > 0) { rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { rowcnd = 1.; } } if (colequ && *info == 0) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L20: */ } if (rcmin <= 0.) { *info = -12; } else if (*n > 0) { colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { colcnd = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -14; } else if (*ldx < max(1,*n)) { *info = -16; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGESVX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dgeequ_(n, n, &a[a_offset], lda, &r__[1], &c__[1], &rowcnd, &colcnd, & amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqge_(n, n, &a[a_offset], lda, &r__[1], &c__[1], &rowcnd, & colcnd, &amax, equed); rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); } } /* Scale the right hand side. */ if (notran) { if (rowequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = r__[i__] * b[i__ + j * b_dim1]; /* L30: */ } /* L40: */ } } } else if (colequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = c__[i__] * b[i__ + j * b_dim1]; /* L50: */ } /* L60: */ } } if (nofact || equil) { /* Compute the LU factorization of A. */ _starpu_dlacpy_("Full", n, n, &a[a_offset], lda, &af[af_offset], ldaf); _starpu_dgetrf_(n, n, &af[af_offset], ldaf, &ipiv[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { /* Compute the reciprocal pivot growth factor of the */ /* leading rank-deficient INFO columns of A. */ rpvgrw = _starpu_dlantr_("M", "U", "N", info, info, &af[af_offset], ldaf, &work[1]); if (rpvgrw == 0.) { rpvgrw = 1.; } else { rpvgrw = _starpu_dlange_("M", n, info, &a[a_offset], lda, &work[1]) / rpvgrw; } work[1] = rpvgrw; *rcond = 0.; return 0; } } /* Compute the norm of the matrix A and the */ /* reciprocal pivot growth factor RPVGRW. */ if (notran) { *(unsigned char *)norm = '1'; } else { *(unsigned char *)norm = 'I'; } anorm = _starpu_dlange_(norm, n, n, &a[a_offset], lda, &work[1]); rpvgrw = _starpu_dlantr_("M", "U", "N", n, n, &af[af_offset], ldaf, &work[1]); if (rpvgrw == 0.) { rpvgrw = 1.; } else { rpvgrw = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]) / rpvgrw; } /* Compute the reciprocal of the condition number of A. */ _starpu_dgecon_(norm, n, &af[af_offset], ldaf, &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dgetrs_(trans, n, nrhs, &af[af_offset], ldaf, &ipiv[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dgerfs_(trans, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, &ipiv[1], &b[b_offset], ldb, &x[x_offset], ldx, &ferr[1], &berr[1], &work[ 1], &iwork[1], info); /* Transform the solution matrix X to a solution of the original */ /* system. */ if (notran) { if (colequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] = c__[i__] * x[i__ + j * x_dim1]; /* L70: */ } /* L80: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= colcnd; /* L90: */ } } } else if (rowequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] = r__[i__] * x[i__ + j * x_dim1]; /* L100: */ } /* L110: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= rowcnd; /* L120: */ } } work[1] = rpvgrw; /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DGESVX */ } /* _starpu_dgesvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgesvxx.c000066400000000000000000000721631413463044200210470ustar00rootroot00000000000000/* dgesvxx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgesvxx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer j; extern doublereal _starpu_dla_rpvgrw__(integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal amax; extern logical _starpu_lsame_(char *, char *); doublereal rcmin, rcmax; logical equil; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlaqge_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, char *); doublereal colcnd; logical nofact; extern /* Subroutine */ int _starpu_dgetrf_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; integer infequ; logical colequ; extern /* Subroutine */ int _starpu_dgetrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal rowcnd; logical notran; doublereal smlnum; logical rowequ; extern /* Subroutine */ int _starpu_dlascl2_(integer *, integer *, doublereal *, doublereal *, integer *), _starpu_dgeequb_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dgerfsx_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGESVXX uses the LU factorization to compute the solution to a */ /* double precision system of linear equations A * X = B, where A is an */ /* N-by-N matrix and X and B are N-by-NRHS matrices. */ /* If requested, both normwise and maximum componentwise error bounds */ /* are returned. DGESVXX will return a solution with a tiny */ /* guaranteed error (O(eps) where eps is the working machine */ /* precision) unless the matrix is very ill-conditioned, in which */ /* case a warning is returned. Relevant condition numbers also are */ /* calculated and returned. */ /* DGESVXX accepts user-provided factorizations and equilibration */ /* factors; see the definitions of the FACT and EQUED options. */ /* Solving with refinement and using a factorization from a previous */ /* DGESVXX call will also produce a solution with either O(eps) */ /* errors or warnings, but we cannot make that claim for general */ /* user-provided factorizations and equilibration factors if they */ /* differ from what DGESVXX would itself produce. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', double precision scaling factors are computed to equilibrate */ /* the system: */ /* TRANS = 'N': diag(R)*A*diag(C) *inv(diag(C))*X = diag(R)*B */ /* TRANS = 'T': (diag(R)*A*diag(C))**T *inv(diag(R))*X = diag(C)*B */ /* TRANS = 'C': (diag(R)*A*diag(C))**H *inv(diag(R))*X = diag(C)*B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(R)*A*diag(C) and B by diag(R)*B (if TRANS='N') */ /* or diag(C)*B (if TRANS = 'T' or 'C'). */ /* 2. If FACT = 'N' or 'E', the LU decomposition is used to factor */ /* the matrix A (after equilibration if FACT = 'E') as */ /* A = P * L * U, */ /* where P is a permutation matrix, L is a unit lower triangular */ /* matrix, and U is upper triangular. */ /* 3. If some U(i,i)=0, so that U is exactly singular, then the */ /* routine returns with INFO = i. Otherwise, the factored form of A */ /* is used to estimate the condition number of the matrix A (see */ /* argument RCOND). If the reciprocal of the condition number is less */ /* than machine precision, the routine still goes on to solve for X */ /* and compute error bounds as described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. By default (unless PARAMS(LA_LINRX_ITREF_I) is set to zero), */ /* the routine will use iterative refinement to try to get a small */ /* error and error bounds. Refinement calculates the residual to at */ /* least twice the working precision. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(C) (if TRANS = 'N') or diag(R) (if TRANS = 'T' or 'C') so */ /* that it solves the original system before equilibration. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AF and IPIV contain the factored form of A. */ /* If EQUED is not 'N', the matrix A has been */ /* equilibrated with scaling factors given by R and C. */ /* A, AF, and IPIV are not modified. */ /* = 'N': The matrix A will be copied to AF and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AF and factored. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate Transpose = Transpose) */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. If FACT = 'F' and EQUED is */ /* not 'N', then A must have been equilibrated by the scaling */ /* factors in R and/or C. A is not modified if FACT = 'F' or */ /* 'N', or if FACT = 'E' and EQUED = 'N' on exit. */ /* On exit, if EQUED .ne. 'N', A is scaled as follows: */ /* EQUED = 'R': A := diag(R) * A */ /* EQUED = 'C': A := A * diag(C) */ /* EQUED = 'B': A := diag(R) * A * diag(C). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input or output) DOUBLE PRECISION array, dimension (LDAF,N) */ /* If FACT = 'F', then AF is an input argument and on entry */ /* contains the factors L and U from the factorization */ /* A = P*L*U as computed by DGETRF. If EQUED .ne. 'N', then */ /* AF is the factored form of the equilibrated matrix A. */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the factors L and U from the factorization A = P*L*U */ /* of the original matrix A. */ /* If FACT = 'E', then AF is an output argument and on exit */ /* returns the factors L and U from the factorization A = P*L*U */ /* of the equilibrated matrix A (see the description of A for */ /* the form of the equilibrated matrix). */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains the pivot indices from the factorization A = P*L*U */ /* as computed by DGETRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = P*L*U */ /* of the original matrix A. */ /* If FACT = 'E', then IPIV is an output argument and on exit */ /* contains the pivot indices from the factorization A = P*L*U */ /* of the equilibrated matrix A. */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* R (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'R' or 'B', A is */ /* multiplied on the left by diag(R); if EQUED = 'N' or 'C', R */ /* is not accessed. R is an input argument if FACT = 'F'; */ /* otherwise, R is an output argument. If FACT = 'F' and */ /* EQUED = 'R' or 'B', each element of R must be positive. */ /* If R is output, each element of R is a power of the radix. */ /* If R is input, each element of R should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* C (input or output) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If EQUED = 'C' or 'B', A is */ /* multiplied on the right by diag(C); if EQUED = 'N' or 'R', C */ /* is not accessed. C is an input argument if FACT = 'F'; */ /* otherwise, C is an output argument. If FACT = 'F' and */ /* EQUED = 'C' or 'B', each element of C must be positive. */ /* If C is output, each element of C is a power of the radix. */ /* If C is input, each element of C should be a power of the radix */ /* to ensure a reliable solution and error estimates. Scaling by */ /* powers of the radix does not cause rounding errors unless the */ /* result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, */ /* if EQUED = 'N', B is not modified; */ /* if TRANS = 'N' and EQUED = 'R' or 'B', B is overwritten by */ /* diag(R)*B; */ /* if TRANS = 'T' or 'C' and EQUED = 'C' or 'B', B is */ /* overwritten by diag(C)*B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0, the N-by-NRHS solution matrix X to the original */ /* system of equations. Note that A and B are modified on exit */ /* if EQUED .ne. 'N', and the solution to the equilibrated system is */ /* inv(diag(C))*X if TRANS = 'N' and EQUED = 'C' or 'B', or */ /* inv(diag(R))*X if TRANS = 'T' or 'C' and EQUED = 'R' or 'B'. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* RPVGRW (output) DOUBLE PRECISION */ /* Reciprocal pivot growth. On exit, this contains the reciprocal */ /* pivot growth factor norm(A)/norm(U). The "max absolute element" */ /* norm is used. If this is much less than 1, then the stability of */ /* the LU factorization of the (equilibrated) matrix A could be poor. */ /* This also means that the solution X, estimated condition numbers, */ /* and error bounds could be unreliable. If factorization fails with */ /* 0 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --r__; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); notran = _starpu_lsame_(trans, "N"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; if (nofact || equil) { *(unsigned char *)equed = 'N'; rowequ = FALSE_; colequ = FALSE_; } else { rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); } /* Default is failure. If an input parameter is wrong or */ /* factorization fails, make everything look horrible. Only the */ /* pivot growth is set here, the rest is initialized in DGERFSX. */ *rpvgrw = 0.; /* Test the input parameters. PARAMS is not tested until DGERFSX. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (_starpu_lsame_(fact, "F") && ! (rowequ || colequ || _starpu_lsame_(equed, "N"))) { *info = -10; } else { if (rowequ) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = r__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = r__[j]; rcmax = max(d__1,d__2); /* L10: */ } if (rcmin <= 0.) { *info = -11; } else if (*n > 0) { rowcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { rowcnd = 1.; } } if (colequ && *info == 0) { rcmin = bignum; rcmax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = rcmin, d__2 = c__[j]; rcmin = min(d__1,d__2); /* Computing MAX */ d__1 = rcmax, d__2 = c__[j]; rcmax = max(d__1,d__2); /* L20: */ } if (rcmin <= 0.) { *info = -12; } else if (*n > 0) { colcnd = max(rcmin,smlnum) / min(rcmax,bignum); } else { colcnd = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -14; } else if (*ldx < max(1,*n)) { *info = -16; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGESVXX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dgeequb_(n, n, &a[a_offset], lda, &r__[1], &c__[1], &rowcnd, &colcnd, &amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqge_(n, n, &a[a_offset], lda, &r__[1], &c__[1], &rowcnd, & colcnd, &amax, equed); rowequ = _starpu_lsame_(equed, "R") || _starpu_lsame_(equed, "B"); colequ = _starpu_lsame_(equed, "C") || _starpu_lsame_(equed, "B"); } /* If the scaling factors are not applied, set them to 1.0. */ if (! rowequ) { i__1 = *n; for (j = 1; j <= i__1; ++j) { r__[j] = 1.; } } if (! colequ) { i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j] = 1.; } } } /* Scale the right-hand side. */ if (notran) { if (rowequ) { _starpu_dlascl2_(n, nrhs, &r__[1], &b[b_offset], ldb); } } else { if (colequ) { _starpu_dlascl2_(n, nrhs, &c__[1], &b[b_offset], ldb); } } if (nofact || equil) { /* Compute the LU factorization of A. */ _starpu_dlacpy_("Full", n, n, &a[a_offset], lda, &af[af_offset], ldaf); _starpu_dgetrf_(n, n, &af[af_offset], ldaf, &ipiv[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { /* Pivot in column INFO is exactly 0 */ /* Compute the reciprocal pivot growth factor of the */ /* leading rank-deficient INFO columns of A. */ *rpvgrw = _starpu_dla_rpvgrw__(n, info, &a[a_offset], lda, &af[af_offset], ldaf); return 0; } } /* Compute the reciprocal pivot growth factor RPVGRW. */ *rpvgrw = _starpu_dla_rpvgrw__(n, n, &a[a_offset], lda, &af[af_offset], ldaf); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dgetrs_(trans, n, nrhs, &af[af_offset], ldaf, &ipiv[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dgerfsx_(trans, equed, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, & ipiv[1], &r__[1], &c__[1], &b[b_offset], ldb, &x[x_offset], ldx, rcond, &berr[1], n_err_bnds__, &err_bnds_norm__[ err_bnds_norm_offset], &err_bnds_comp__[err_bnds_comp_offset], nparams, ¶ms[1], &work[1], &iwork[1], info); /* Scale solutions. */ if (colequ && notran) { _starpu_dlascl2_(n, nrhs, &c__[1], &x[x_offset], ldx); } else if (rowequ && ! notran) { _starpu_dlascl2_(n, nrhs, &r__[1], &x[x_offset], ldx); } return 0; /* End of DGESVXX */ } /* _starpu_dgesvxx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgetc2.c000066400000000000000000000130151413463044200205160ustar00rootroot00000000000000/* dgetc2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b10 = -1.; /* Subroutine */ int _starpu_dgetc2_(integer *n, doublereal *a, integer *lda, integer *ipiv, integer *jpiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, ip, jp; doublereal eps; integer ipv, jpv; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal smin, xmax; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); doublereal bignum, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETC2 computes an LU factorization with complete pivoting of the */ /* n-by-n matrix A. The factorization has the form A = P * L * U * Q, */ /* where P and Q are permutation matrices, L is lower triangular with */ /* unit diagonal elements and U is upper triangular. */ /* This is the Level 2 BLAS algorithm. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the n-by-n matrix A to be factored. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U*Q; the unit diagonal elements of L are not stored. */ /* If U(k, k) appears to be less than SMIN, U(k, k) is given the */ /* value of SMIN, i.e., giving a nonsingular perturbed system. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension(N). */ /* The pivot indices; for 1 <= i <= N, row i of the */ /* matrix has been interchanged with row IPIV(i). */ /* JPIV (output) INTEGER array, dimension(N). */ /* The pivot indices; for 1 <= j <= N, column j of the */ /* matrix has been interchanged with column JPIV(j). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: if INFO = k, U(k, k) is likely to produce owerflow if */ /* we try to solve for x in Ax = b. So U is perturbed to */ /* avoid the overflow. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Set constants to control overflow */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; --jpiv; /* Function Body */ *info = 0; eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Factorize A using complete pivoting. */ /* Set pivots less than SMIN to SMIN. */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Find max element in matrix A */ xmax = 0.; i__2 = *n; for (ip = i__; ip <= i__2; ++ip) { i__3 = *n; for (jp = i__; jp <= i__3; ++jp) { if ((d__1 = a[ip + jp * a_dim1], abs(d__1)) >= xmax) { xmax = (d__1 = a[ip + jp * a_dim1], abs(d__1)); ipv = ip; jpv = jp; } /* L10: */ } /* L20: */ } if (i__ == 1) { /* Computing MAX */ d__1 = eps * xmax; smin = max(d__1,smlnum); } /* Swap rows */ if (ipv != i__) { _starpu_dswap_(n, &a[ipv + a_dim1], lda, &a[i__ + a_dim1], lda); } ipiv[i__] = ipv; /* Swap columns */ if (jpv != i__) { _starpu_dswap_(n, &a[jpv * a_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], & c__1); } jpiv[i__] = jpv; /* Check for singularity */ if ((d__1 = a[i__ + i__ * a_dim1], abs(d__1)) < smin) { *info = i__; a[i__ + i__ * a_dim1] = smin; } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { a[j + i__ * a_dim1] /= a[i__ + i__ * a_dim1]; /* L30: */ } i__2 = *n - i__; i__3 = *n - i__; _starpu_dger_(&i__2, &i__3, &c_b10, &a[i__ + 1 + i__ * a_dim1], &c__1, &a[i__ + (i__ + 1) * a_dim1], lda, &a[i__ + 1 + (i__ + 1) * a_dim1], lda); /* L40: */ } if ((d__1 = a[*n + *n * a_dim1], abs(d__1)) < smin) { *info = *n; a[*n + *n * a_dim1] = smin; } return 0; /* End of DGETC2 */ } /* _starpu_dgetc2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgetf2.c000066400000000000000000000125051413463044200205240ustar00rootroot00000000000000/* dgetf2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = -1.; /* Subroutine */ int _starpu_dgetf2_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, jp; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sfmin; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETF2 computes an LU factorization of a general m-by-n matrix A */ /* using partial pivoting with row interchanges. */ /* The factorization has the form */ /* A = P * L * U */ /* where P is a permutation matrix, L is lower triangular with unit */ /* diagonal elements (lower trapezoidal if m > n), and U is upper */ /* triangular (upper trapezoidal if m < n). */ /* This is the right-looking Level 2 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n matrix to be factored. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* > 0: if INFO = k, U(k,k) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETF2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Compute machine safe minimum */ sfmin = _starpu_dlamch_("S"); i__1 = min(*m,*n); for (j = 1; j <= i__1; ++j) { /* Find pivot and test for singularity. */ i__2 = *m - j + 1; jp = j - 1 + _starpu_idamax_(&i__2, &a[j + j * a_dim1], &c__1); ipiv[j] = jp; if (a[jp + j * a_dim1] != 0.) { /* Apply the interchange to columns 1:N. */ if (jp != j) { _starpu_dswap_(n, &a[j + a_dim1], lda, &a[jp + a_dim1], lda); } /* Compute elements J+1:M of J-th column. */ if (j < *m) { if ((d__1 = a[j + j * a_dim1], abs(d__1)) >= sfmin) { i__2 = *m - j; d__1 = 1. / a[j + j * a_dim1]; _starpu_dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); } else { i__2 = *m - j; for (i__ = 1; i__ <= i__2; ++i__) { a[j + i__ + j * a_dim1] /= a[j + j * a_dim1]; /* L20: */ } } } } else if (*info == 0) { *info = j; } if (j < min(*m,*n)) { /* Update trailing submatrix. */ i__2 = *m - j; i__3 = *n - j; _starpu_dger_(&i__2, &i__3, &c_b8, &a[j + 1 + j * a_dim1], &c__1, &a[j + ( j + 1) * a_dim1], lda, &a[j + 1 + (j + 1) * a_dim1], lda); } /* L10: */ } return 0; /* End of DGETF2 */ } /* _starpu_dgetf2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgetrf.c000066400000000000000000000145371413463044200206330ustar00rootroot00000000000000/* dgetrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b16 = 1.; static doublereal c_b19 = -1.; /* Subroutine */ int _starpu_dgetrf_(integer *m, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, jb, nb; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iinfo; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dgetf2_( integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETRF computes an LU factorization of a general M-by-N matrix A */ /* using partial pivoting with row interchanges. */ /* The factorization has the form */ /* A = P * L * U */ /* where P is a permutation matrix, L is lower triangular with unit */ /* diagonal elements (lower trapezoidal if m > n), and U is upper */ /* triangular (upper trapezoidal if m < n). */ /* This is the right-looking Level 3 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix to be factored. */ /* On exit, the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* IPIV (output) INTEGER array, dimension (min(M,N)) */ /* The pivot indices; for 1 <= i <= min(M,N), row i of the */ /* matrix was interchanged with row IPIV(i). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETRF", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DGETRF", " ", m, n, &c_n1, &c_n1); if (nb <= 1 || nb >= min(*m,*n)) { /* Use unblocked code. */ _starpu_dgetf2_(m, n, &a[a_offset], lda, &ipiv[1], info); } else { /* Use blocked code. */ i__1 = min(*m,*n); i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = min(*m,*n) - j + 1; jb = min(i__3,nb); /* Factor diagonal and subdiagonal blocks and test for exact */ /* singularity. */ i__3 = *m - j + 1; _starpu_dgetf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); /* Adjust INFO and the pivot indices. */ if (*info == 0 && iinfo > 0) { *info = iinfo + j - 1; } /* Computing MIN */ i__4 = *m, i__5 = j + jb - 1; i__3 = min(i__4,i__5); for (i__ = j; i__ <= i__3; ++i__) { ipiv[i__] = j - 1 + ipiv[i__]; /* L10: */ } /* Apply interchanges to columns 1:J-1. */ i__3 = j - 1; i__4 = j + jb - 1; _starpu_dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); if (j + jb <= *n) { /* Apply interchanges to columns J+JB:N. */ i__3 = *n - j - jb + 1; i__4 = j + jb - 1; _starpu_dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, & ipiv[1], &c__1); /* Compute block row of U. */ i__3 = *n - j - jb + 1; _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", &jb, &i__3, & c_b16, &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda); if (j + jb <= *m) { /* Update trailing submatrix. */ i__3 = *m - j - jb + 1; i__4 = *n - j - jb + 1; _starpu_dgemm_("No transpose", "No transpose", &i__3, &i__4, &jb, &c_b19, &a[j + jb + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, &c_b16, &a[j + jb + (j + jb) * a_dim1], lda); } } /* L20: */ } } return 0; /* End of DGETRF */ } /* _starpu_dgetrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgetri.c000066400000000000000000000167101413463044200206310ustar00rootroot00000000000000/* dgetri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static doublereal c_b20 = -1.; static doublereal c_b22 = 1.; /* Subroutine */ int _starpu_dgetri_(integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, jb, nb, jj, jp, nn, iws; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nbmin; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_( char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork; extern /* Subroutine */ int _starpu_dtrtri_(char *, char *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETRI computes the inverse of a matrix using the LU factorization */ /* computed by DGETRF. */ /* This method inverts U and then computes inv(A) by solving the system */ /* inv(A)*L = inv(U) for inv(A). */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the factors L and U from the factorization */ /* A = P*L*U as computed by DGETRF. */ /* On exit, if INFO = 0, the inverse of the original matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from DGETRF; for 1<=i<=N, row i of the */ /* matrix was interchanged with row IPIV(i). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO=0, then WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* For optimal performance LWORK >= N*NB, where NB is */ /* the optimal blocksize returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero; the matrix is */ /* singular and its inverse could not be computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DGETRI", " ", n, &c_n1, &c_n1, &c_n1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*n < 0) { *info = -1; } else if (*lda < max(1,*n)) { *info = -3; } else if (*lwork < max(1,*n) && ! lquery) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETRI", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form inv(U). If INFO > 0 from DTRTRI, then U is singular, */ /* and the inverse is not computed. */ _starpu_dtrtri_("Upper", "Non-unit", n, &a[a_offset], lda, info); if (*info > 0) { return 0; } nbmin = 2; ldwork = *n; if (nb > 1 && nb < *n) { /* Computing MAX */ i__1 = ldwork * nb; iws = max(i__1,1); if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGETRI", " ", n, &c_n1, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } else { iws = *n; } /* Solve the equation inv(A)*L = inv(U) for inv(A). */ if (nb < nbmin || nb >= *n) { /* Use unblocked code. */ for (j = *n; j >= 1; --j) { /* Copy current column of L to WORK and replace with zeros. */ i__1 = *n; for (i__ = j + 1; i__ <= i__1; ++i__) { work[i__] = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = 0.; /* L10: */ } /* Compute current column of inv(A). */ if (j < *n) { i__1 = *n - j; _starpu_dgemv_("No transpose", n, &i__1, &c_b20, &a[(j + 1) * a_dim1 + 1], lda, &work[j + 1], &c__1, &c_b22, &a[j * a_dim1 + 1], &c__1); } /* L20: */ } } else { /* Use blocked code. */ nn = (*n - 1) / nb * nb + 1; i__1 = -nb; for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { /* Computing MIN */ i__2 = nb, i__3 = *n - j + 1; jb = min(i__2,i__3); /* Copy current block column of L to WORK and replace with */ /* zeros. */ i__2 = j + jb - 1; for (jj = j; jj <= i__2; ++jj) { i__3 = *n; for (i__ = jj + 1; i__ <= i__3; ++i__) { work[i__ + (jj - j) * ldwork] = a[i__ + jj * a_dim1]; a[i__ + jj * a_dim1] = 0.; /* L30: */ } /* L40: */ } /* Compute current block column of inv(A). */ if (j + jb <= *n) { i__2 = *n - j - jb + 1; _starpu_dgemm_("No transpose", "No transpose", n, &jb, &i__2, &c_b20, &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], & ldwork, &c_b22, &a[j * a_dim1 + 1], lda); } _starpu_dtrsm_("Right", "Lower", "No transpose", "Unit", n, &jb, &c_b22, & work[j], &ldwork, &a[j * a_dim1 + 1], lda); /* L50: */ } } /* Apply column interchanges. */ for (j = *n - 1; j >= 1; --j) { jp = ipiv[j]; if (jp != j) { _starpu_dswap_(n, &a[j * a_dim1 + 1], &c__1, &a[jp * a_dim1 + 1], &c__1); } /* L60: */ } work[1] = (doublereal) iws; return 0; /* End of DGETRI */ } /* _starpu_dgetri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgetrs.c000066400000000000000000000123641413463044200206440ustar00rootroot00000000000000/* dgetrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = 1.; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgetrs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_( char *, integer *), _starpu_dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGETRS solves a system of linear equations */ /* A * X = B or A' * X = B */ /* with a general N-by-N matrix A using the LU factorization computed */ /* by DGETRF. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A'* X = B (Transpose) */ /* = 'C': A'* X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The factors L and U from the factorization A = P*L*U */ /* as computed by DGETRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from DGETRF; for 1<=i<=N, row i of the */ /* matrix was interchanged with row IPIV(i). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; notran = _starpu_lsame_(trans, "N"); if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGETRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (notran) { /* Solve A * X = B. */ /* Apply row interchanges to the right hand sides. */ _starpu_dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c__1); /* Solve L*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Lower", "No transpose", "Unit", n, nrhs, &c_b12, &a[ a_offset], lda, &b[b_offset], ldb); /* Solve U*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b12, & a[a_offset], lda, &b[b_offset], ldb); } else { /* Solve A' * X = B. */ /* Solve U'*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b12, &a[ a_offset], lda, &b[b_offset], ldb); /* Solve L'*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Lower", "Transpose", "Unit", n, nrhs, &c_b12, &a[ a_offset], lda, &b[b_offset], ldb); /* Apply row interchanges to the solution vectors. */ _starpu_dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c_n1); } return 0; /* End of DGETRS */ } /* _starpu_dgetrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggbak.c000066400000000000000000000160101413463044200205630ustar00rootroot00000000000000/* dggbak.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dggbak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, doublereal *v, integer *ldv, integer *info) { /* System generated locals */ integer v_dim1, v_offset, i__1; /* Local variables */ integer i__, k; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical leftv; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical rightv; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGBAK forms the right or left eigenvectors of a real generalized */ /* eigenvalue problem A*x = lambda*B*x, by backward transformation on */ /* the computed eigenvectors of the balanced pair of matrices output by */ /* DGGBAL. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies the type of backward transformation required: */ /* = 'N': do nothing, return immediately; */ /* = 'P': do backward transformation for permutation only; */ /* = 'S': do backward transformation for scaling only; */ /* = 'B': do backward transformations for both permutation and */ /* scaling. */ /* JOB must be the same as the argument JOB supplied to DGGBAL. */ /* SIDE (input) CHARACTER*1 */ /* = 'R': V contains right eigenvectors; */ /* = 'L': V contains left eigenvectors. */ /* N (input) INTEGER */ /* The number of rows of the matrix V. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* The integers ILO and IHI determined by DGGBAL. */ /* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. */ /* LSCALE (input) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and/or scaling factors applied */ /* to the left side of A and B, as returned by DGGBAL. */ /* RSCALE (input) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and/or scaling factors applied */ /* to the right side of A and B, as returned by DGGBAL. */ /* M (input) INTEGER */ /* The number of columns of the matrix V. M >= 0. */ /* V (input/output) DOUBLE PRECISION array, dimension (LDV,M) */ /* On entry, the matrix of right or left eigenvectors to be */ /* transformed, as returned by DTGEVC. */ /* On exit, V is overwritten by the transformed eigenvectors. */ /* LDV (input) INTEGER */ /* The leading dimension of the matrix V. LDV >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* See R.C. Ward, Balancing the generalized eigenvalue problem, */ /* SIAM J. Sci. Stat. Comp. 2 (1981), 141-152. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ --lscale; --rscale; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; /* Function Body */ rightv = _starpu_lsame_(side, "R"); leftv = _starpu_lsame_(side, "L"); *info = 0; if (! _starpu_lsame_(job, "N") && ! _starpu_lsame_(job, "P") && ! _starpu_lsame_(job, "S") && ! _starpu_lsame_(job, "B")) { *info = -1; } else if (! rightv && ! leftv) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ilo < 1) { *info = -4; } else if (*n == 0 && *ihi == 0 && *ilo != 1) { *info = -4; } else if (*n > 0 && (*ihi < *ilo || *ihi > max(1,*n))) { *info = -5; } else if (*n == 0 && *ilo == 1 && *ihi != 0) { *info = -5; } else if (*m < 0) { *info = -8; } else if (*ldv < max(1,*n)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGBAK", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*m == 0) { return 0; } if (_starpu_lsame_(job, "N")) { return 0; } if (*ilo == *ihi) { goto L30; } /* Backward balance */ if (_starpu_lsame_(job, "S") || _starpu_lsame_(job, "B")) { /* Backward transformation on right eigenvectors */ if (rightv) { i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { _starpu_dscal_(m, &rscale[i__], &v[i__ + v_dim1], ldv); /* L10: */ } } /* Backward transformation on left eigenvectors */ if (leftv) { i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { _starpu_dscal_(m, &lscale[i__], &v[i__ + v_dim1], ldv); /* L20: */ } } } /* Backward permutation */ L30: if (_starpu_lsame_(job, "P") || _starpu_lsame_(job, "B")) { /* Backward permutation on right eigenvectors */ if (rightv) { if (*ilo == 1) { goto L50; } for (i__ = *ilo - 1; i__ >= 1; --i__) { k = (integer) rscale[i__]; if (k == i__) { goto L40; } _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); L40: ; } L50: if (*ihi == *n) { goto L70; } i__1 = *n; for (i__ = *ihi + 1; i__ <= i__1; ++i__) { k = (integer) rscale[i__]; if (k == i__) { goto L60; } _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); L60: ; } } /* Backward permutation on left eigenvectors */ L70: if (leftv) { if (*ilo == 1) { goto L90; } for (i__ = *ilo - 1; i__ >= 1; --i__) { k = (integer) lscale[i__]; if (k == i__) { goto L80; } _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); L80: ; } L90: if (*ihi == *n) { goto L110; } i__1 = *n; for (i__ = *ihi + 1; i__ <= i__1; ++i__) { k = (integer) lscale[i__]; if (k == i__) { goto L100; } _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); L100: ; } } } L110: return 0; /* End of DGGBAK */ } /* _starpu_dggbak_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggbal.c000066400000000000000000000374661413463044200206060ustar00rootroot00000000000000/* dggbal.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b35 = 10.; static doublereal c_b71 = .5; /* Subroutine */ int _starpu_dggbal_(char *job, integer *n, doublereal *a, integer * lda, doublereal *b, integer *ldb, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *work, integer * info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Builtin functions */ double d_lg10(doublereal *), d_sign(doublereal *, doublereal *), pow_di( doublereal *, integer *); /* Local variables */ integer i__, j, k, l, m; doublereal t; integer jc; doublereal ta, tb, tc; integer ir; doublereal ew; integer it, nr, ip1, jp1, lm1; doublereal cab, rab, ewc, cor, sum; integer nrp2, icab, lcab; doublereal beta, coef; integer irab, lrab; doublereal basl, cmax; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal coef2, coef5, gamma, alpha; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal sfmin, sfmax; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer iflow; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer kount; extern doublereal _starpu_dlamch_(char *); doublereal pgamma; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer lsfmin, lsfmax; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGBAL balances a pair of general real matrices (A,B). This */ /* involves, first, permuting A and B by similarity transformations to */ /* isolate eigenvalues in the first 1 to ILO$-$1 and last IHI+1 to N */ /* elements on the diagonal; and second, applying a diagonal similarity */ /* transformation to rows and columns ILO to IHI to make the rows */ /* and columns as close in norm as possible. Both steps are optional. */ /* Balancing may reduce the 1-norm of the matrices, and improve the */ /* accuracy of the computed eigenvalues and/or eigenvectors in the */ /* generalized eigenvalue problem A*x = lambda*B*x. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies the operations to be performed on A and B: */ /* = 'N': none: simply set ILO = 1, IHI = N, LSCALE(I) = 1.0 */ /* and RSCALE(I) = 1.0 for i = 1,...,N. */ /* = 'P': permute only; */ /* = 'S': scale only; */ /* = 'B': both permute and scale. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the input matrix A. */ /* On exit, A is overwritten by the balanced matrix. */ /* If JOB = 'N', A is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the input matrix B. */ /* On exit, B is overwritten by the balanced matrix. */ /* If JOB = 'N', B is not referenced. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* ILO (output) INTEGER */ /* IHI (output) INTEGER */ /* ILO and IHI are set to integers such that on exit */ /* A(i,j) = 0 and B(i,j) = 0 if i > j and */ /* j = 1,...,ILO-1 or i = IHI+1,...,N. */ /* If JOB = 'N' or 'S', ILO = 1 and IHI = N. */ /* LSCALE (output) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and scaling factors applied */ /* to the left side of A and B. If P(j) is the index of the */ /* row interchanged with row j, and D(j) */ /* is the scaling factor applied to row j, then */ /* LSCALE(j) = P(j) for J = 1,...,ILO-1 */ /* = D(j) for J = ILO,...,IHI */ /* = P(j) for J = IHI+1,...,N. */ /* The order in which the interchanges are made is N to IHI+1, */ /* then 1 to ILO-1. */ /* RSCALE (output) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and scaling factors applied */ /* to the right side of A and B. If P(j) is the index of the */ /* column interchanged with column j, and D(j) */ /* is the scaling factor applied to column j, then */ /* LSCALE(j) = P(j) for J = 1,...,ILO-1 */ /* = D(j) for J = ILO,...,IHI */ /* = P(j) for J = IHI+1,...,N. */ /* The order in which the interchanges are made is N to IHI+1, */ /* then 1 to ILO-1. */ /* WORK (workspace) REAL array, dimension (lwork) */ /* lwork must be at least max(1,6*N) when JOB = 'S' or 'B', and */ /* at least 1 when JOB = 'N' or 'P'. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* See R.C. WARD, Balancing the generalized eigenvalue problem, */ /* SIAM J. Sci. Stat. Comp. 2 (1981), 141-152. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --lscale; --rscale; --work; /* Function Body */ *info = 0; if (! _starpu_lsame_(job, "N") && ! _starpu_lsame_(job, "P") && ! _starpu_lsame_(job, "S") && ! _starpu_lsame_(job, "B")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*ldb < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGBAL", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *ilo = 1; *ihi = *n; return 0; } if (*n == 1) { *ilo = 1; *ihi = *n; lscale[1] = 1.; rscale[1] = 1.; return 0; } if (_starpu_lsame_(job, "N")) { *ilo = 1; *ihi = *n; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { lscale[i__] = 1.; rscale[i__] = 1.; /* L10: */ } return 0; } k = 1; l = *n; if (_starpu_lsame_(job, "S")) { goto L190; } goto L30; /* Permute the matrices A and B to isolate the eigenvalues. */ /* Find row with one nonzero in columns 1 through L */ L20: l = lm1; if (l != 1) { goto L30; } rscale[1] = 1.; lscale[1] = 1.; goto L190; L30: lm1 = l - 1; for (i__ = l; i__ >= 1; --i__) { i__1 = lm1; for (j = 1; j <= i__1; ++j) { jp1 = j + 1; if (a[i__ + j * a_dim1] != 0. || b[i__ + j * b_dim1] != 0.) { goto L50; } /* L40: */ } j = l; goto L70; L50: i__1 = l; for (j = jp1; j <= i__1; ++j) { if (a[i__ + j * a_dim1] != 0. || b[i__ + j * b_dim1] != 0.) { goto L80; } /* L60: */ } j = jp1 - 1; L70: m = l; iflow = 1; goto L160; L80: ; } goto L100; /* Find column with one nonzero in rows K through N */ L90: ++k; L100: i__1 = l; for (j = k; j <= i__1; ++j) { i__2 = lm1; for (i__ = k; i__ <= i__2; ++i__) { ip1 = i__ + 1; if (a[i__ + j * a_dim1] != 0. || b[i__ + j * b_dim1] != 0.) { goto L120; } /* L110: */ } i__ = l; goto L140; L120: i__2 = l; for (i__ = ip1; i__ <= i__2; ++i__) { if (a[i__ + j * a_dim1] != 0. || b[i__ + j * b_dim1] != 0.) { goto L150; } /* L130: */ } i__ = ip1 - 1; L140: m = k; iflow = 2; goto L160; L150: ; } goto L190; /* Permute rows M and I */ L160: lscale[m] = (doublereal) i__; if (i__ == m) { goto L170; } i__1 = *n - k + 1; _starpu_dswap_(&i__1, &a[i__ + k * a_dim1], lda, &a[m + k * a_dim1], lda); i__1 = *n - k + 1; _starpu_dswap_(&i__1, &b[i__ + k * b_dim1], ldb, &b[m + k * b_dim1], ldb); /* Permute columns M and J */ L170: rscale[m] = (doublereal) j; if (j == m) { goto L180; } _starpu_dswap_(&l, &a[j * a_dim1 + 1], &c__1, &a[m * a_dim1 + 1], &c__1); _starpu_dswap_(&l, &b[j * b_dim1 + 1], &c__1, &b[m * b_dim1 + 1], &c__1); L180: switch (iflow) { case 1: goto L20; case 2: goto L90; } L190: *ilo = k; *ihi = l; if (_starpu_lsame_(job, "P")) { i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { lscale[i__] = 1.; rscale[i__] = 1.; /* L195: */ } return 0; } if (*ilo == *ihi) { return 0; } /* Balance the submatrix in rows ILO to IHI. */ nr = *ihi - *ilo + 1; i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { rscale[i__] = 0.; lscale[i__] = 0.; work[i__] = 0.; work[i__ + *n] = 0.; work[i__ + (*n << 1)] = 0.; work[i__ + *n * 3] = 0.; work[i__ + (*n << 2)] = 0.; work[i__ + *n * 5] = 0.; /* L200: */ } /* Compute right side vector in resulting linear equations */ basl = d_lg10(&c_b35); i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { i__2 = *ihi; for (j = *ilo; j <= i__2; ++j) { tb = b[i__ + j * b_dim1]; ta = a[i__ + j * a_dim1]; if (ta == 0.) { goto L210; } d__1 = abs(ta); ta = d_lg10(&d__1) / basl; L210: if (tb == 0.) { goto L220; } d__1 = abs(tb); tb = d_lg10(&d__1) / basl; L220: work[i__ + (*n << 2)] = work[i__ + (*n << 2)] - ta - tb; work[j + *n * 5] = work[j + *n * 5] - ta - tb; /* L230: */ } /* L240: */ } coef = 1. / (doublereal) (nr << 1); coef2 = coef * coef; coef5 = coef2 * .5; nrp2 = nr + 2; beta = 0.; it = 1; /* Start generalized conjugate gradient iteration */ L250: gamma = _starpu_ddot_(&nr, &work[*ilo + (*n << 2)], &c__1, &work[*ilo + (*n << 2)] , &c__1) + _starpu_ddot_(&nr, &work[*ilo + *n * 5], &c__1, &work[*ilo + * n * 5], &c__1); ew = 0.; ewc = 0.; i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { ew += work[i__ + (*n << 2)]; ewc += work[i__ + *n * 5]; /* L260: */ } /* Computing 2nd power */ d__1 = ew; /* Computing 2nd power */ d__2 = ewc; /* Computing 2nd power */ d__3 = ew - ewc; gamma = coef * gamma - coef2 * (d__1 * d__1 + d__2 * d__2) - coef5 * ( d__3 * d__3); if (gamma == 0.) { goto L350; } if (it != 1) { beta = gamma / pgamma; } t = coef5 * (ewc - ew * 3.); tc = coef5 * (ew - ewc * 3.); _starpu_dscal_(&nr, &beta, &work[*ilo], &c__1); _starpu_dscal_(&nr, &beta, &work[*ilo + *n], &c__1); _starpu_daxpy_(&nr, &coef, &work[*ilo + (*n << 2)], &c__1, &work[*ilo + *n], & c__1); _starpu_daxpy_(&nr, &coef, &work[*ilo + *n * 5], &c__1, &work[*ilo], &c__1); i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { work[i__] += tc; work[i__ + *n] += t; /* L270: */ } /* Apply matrix to vector */ i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { kount = 0; sum = 0.; i__2 = *ihi; for (j = *ilo; j <= i__2; ++j) { if (a[i__ + j * a_dim1] == 0.) { goto L280; } ++kount; sum += work[j]; L280: if (b[i__ + j * b_dim1] == 0.) { goto L290; } ++kount; sum += work[j]; L290: ; } work[i__ + (*n << 1)] = (doublereal) kount * work[i__ + *n] + sum; /* L300: */ } i__1 = *ihi; for (j = *ilo; j <= i__1; ++j) { kount = 0; sum = 0.; i__2 = *ihi; for (i__ = *ilo; i__ <= i__2; ++i__) { if (a[i__ + j * a_dim1] == 0.) { goto L310; } ++kount; sum += work[i__ + *n]; L310: if (b[i__ + j * b_dim1] == 0.) { goto L320; } ++kount; sum += work[i__ + *n]; L320: ; } work[j + *n * 3] = (doublereal) kount * work[j] + sum; /* L330: */ } sum = _starpu_ddot_(&nr, &work[*ilo + *n], &c__1, &work[*ilo + (*n << 1)], &c__1) + _starpu_ddot_(&nr, &work[*ilo], &c__1, &work[*ilo + *n * 3], &c__1); alpha = gamma / sum; /* Determine correction to current iteration */ cmax = 0.; i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { cor = alpha * work[i__ + *n]; if (abs(cor) > cmax) { cmax = abs(cor); } lscale[i__] += cor; cor = alpha * work[i__]; if (abs(cor) > cmax) { cmax = abs(cor); } rscale[i__] += cor; /* L340: */ } if (cmax < .5) { goto L350; } d__1 = -alpha; _starpu_daxpy_(&nr, &d__1, &work[*ilo + (*n << 1)], &c__1, &work[*ilo + (*n << 2)] , &c__1); d__1 = -alpha; _starpu_daxpy_(&nr, &d__1, &work[*ilo + *n * 3], &c__1, &work[*ilo + *n * 5], & c__1); pgamma = gamma; ++it; if (it <= nrp2) { goto L250; } /* End generalized conjugate gradient iteration */ L350: sfmin = _starpu_dlamch_("S"); sfmax = 1. / sfmin; lsfmin = (integer) (d_lg10(&sfmin) / basl + 1.); lsfmax = (integer) (d_lg10(&sfmax) / basl); i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { i__2 = *n - *ilo + 1; irab = _starpu_idamax_(&i__2, &a[i__ + *ilo * a_dim1], lda); rab = (d__1 = a[i__ + (irab + *ilo - 1) * a_dim1], abs(d__1)); i__2 = *n - *ilo + 1; irab = _starpu_idamax_(&i__2, &b[i__ + *ilo * b_dim1], ldb); /* Computing MAX */ d__2 = rab, d__3 = (d__1 = b[i__ + (irab + *ilo - 1) * b_dim1], abs( d__1)); rab = max(d__2,d__3); d__1 = rab + sfmin; lrab = (integer) (d_lg10(&d__1) / basl + 1.); ir = (integer) (lscale[i__] + d_sign(&c_b71, &lscale[i__])); /* Computing MIN */ i__2 = max(ir,lsfmin), i__2 = min(i__2,lsfmax), i__3 = lsfmax - lrab; ir = min(i__2,i__3); lscale[i__] = pow_di(&c_b35, &ir); icab = _starpu_idamax_(ihi, &a[i__ * a_dim1 + 1], &c__1); cab = (d__1 = a[icab + i__ * a_dim1], abs(d__1)); icab = _starpu_idamax_(ihi, &b[i__ * b_dim1 + 1], &c__1); /* Computing MAX */ d__2 = cab, d__3 = (d__1 = b[icab + i__ * b_dim1], abs(d__1)); cab = max(d__2,d__3); d__1 = cab + sfmin; lcab = (integer) (d_lg10(&d__1) / basl + 1.); jc = (integer) (rscale[i__] + d_sign(&c_b71, &rscale[i__])); /* Computing MIN */ i__2 = max(jc,lsfmin), i__2 = min(i__2,lsfmax), i__3 = lsfmax - lcab; jc = min(i__2,i__3); rscale[i__] = pow_di(&c_b35, &jc); /* L360: */ } /* Row scaling of matrices A and B */ i__1 = *ihi; for (i__ = *ilo; i__ <= i__1; ++i__) { i__2 = *n - *ilo + 1; _starpu_dscal_(&i__2, &lscale[i__], &a[i__ + *ilo * a_dim1], lda); i__2 = *n - *ilo + 1; _starpu_dscal_(&i__2, &lscale[i__], &b[i__ + *ilo * b_dim1], ldb); /* L370: */ } /* Column scaling of matrices A and B */ i__1 = *ihi; for (j = *ilo; j <= i__1; ++j) { _starpu_dscal_(ihi, &rscale[j], &a[j * a_dim1 + 1], &c__1); _starpu_dscal_(ihi, &rscale[j], &b[j * b_dim1 + 1], &c__1); /* L380: */ } return 0; /* End of DGGBAL */ } /* _starpu_dggbal_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgges.c000066400000000000000000000547211413463044200204500ustar00rootroot00000000000000/* dgges.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; static doublereal c_b38 = 0.; static doublereal c_b39 = 1.; /* Subroutine */ int _starpu_dgges_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, integer *lwork, logical *bwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vsl_dim1, vsl_offset, vsr_dim1, vsr_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, ip; doublereal dif[2]; integer ihi, ilo; doublereal eps, anrm, bnrm; integer idum[1], ierr, itau, iwrk; doublereal pvsl, pvsr; extern logical _starpu_lsame_(char *, char *); integer ileft, icols; logical cursl, ilvsl, ilvsr; integer irows; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dggbak_( char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dggbal_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical lst2sl; extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical ilascl, ilbscl; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmax; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dtgsen_(integer *, logical *, logical *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *); integer ijobvl, iright; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ijobvr; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal anrmto, bnrmto; logical lastsl; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer minwrk, maxwrk; doublereal smlnum; logical wantst, lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* .. Function Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGES computes for a pair of N-by-N real nonsymmetric matrices (A,B), */ /* the generalized eigenvalues, the generalized real Schur form (S,T), */ /* optionally, the left and/or right matrices of Schur vectors (VSL and */ /* VSR). This gives the generalized Schur factorization */ /* (A,B) = ( (VSL)*S*(VSR)**T, (VSL)*T*(VSR)**T ) */ /* Optionally, it also orders the eigenvalues so that a selected cluster */ /* of eigenvalues appears in the leading diagonal blocks of the upper */ /* quasi-triangular matrix S and the upper triangular matrix T.The */ /* leading columns of VSL and VSR then form an orthonormal basis for the */ /* corresponding left and right eigenspaces (deflating subspaces). */ /* (If only the generalized eigenvalues are needed, use the driver */ /* DGGEV instead, which is faster.) */ /* A generalized eigenvalue for a pair of matrices (A,B) is a scalar w */ /* or a ratio alpha/beta = w, such that A - w*B is singular. It is */ /* usually represented as the pair (alpha,beta), as there is a */ /* reasonable interpretation for beta=0 or both being zero. */ /* A pair of matrices (S,T) is in generalized real Schur form if T is */ /* upper triangular with non-negative diagonal and S is block upper */ /* triangular with 1-by-1 and 2-by-2 blocks. 1-by-1 blocks correspond */ /* to real generalized eigenvalues, while 2-by-2 blocks of S will be */ /* "standardized" by making the corresponding elements of T have the */ /* form: */ /* [ a 0 ] */ /* [ 0 b ] */ /* and the pair of corresponding 2-by-2 blocks in S and T will have a */ /* complex conjugate pair of generalized eigenvalues. */ /* Arguments */ /* ========= */ /* JOBVSL (input) CHARACTER*1 */ /* = 'N': do not compute the left Schur vectors; */ /* = 'V': compute the left Schur vectors. */ /* JOBVSR (input) CHARACTER*1 */ /* = 'N': do not compute the right Schur vectors; */ /* = 'V': compute the right Schur vectors. */ /* SORT (input) CHARACTER*1 */ /* Specifies whether or not to order the eigenvalues on the */ /* diagonal of the generalized Schur form. */ /* = 'N': Eigenvalues are not ordered; */ /* = 'S': Eigenvalues are ordered (see SELCTG); */ /* SELCTG (external procedure) LOGICAL FUNCTION of three DOUBLE PRECISION arguments */ /* SELCTG must be declared EXTERNAL in the calling subroutine. */ /* If SORT = 'N', SELCTG is not referenced. */ /* If SORT = 'S', SELCTG is used to select eigenvalues to sort */ /* to the top left of the Schur form. */ /* An eigenvalue (ALPHAR(j)+ALPHAI(j))/BETA(j) is selected if */ /* SELCTG(ALPHAR(j),ALPHAI(j),BETA(j)) is true; i.e. if either */ /* one of a complex conjugate pair of eigenvalues is selected, */ /* then both complex eigenvalues are selected. */ /* Note that in the ill-conditioned case, a selected complex */ /* eigenvalue may no longer satisfy SELCTG(ALPHAR(j),ALPHAI(j), */ /* BETA(j)) = .TRUE. after ordering. INFO is to be set to N+2 */ /* in this case. */ /* N (input) INTEGER */ /* The order of the matrices A, B, VSL, and VSR. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the first of the pair of matrices. */ /* On exit, A has been overwritten by its generalized Schur */ /* form S. */ /* LDA (input) INTEGER */ /* The leading dimension of A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the second of the pair of matrices. */ /* On exit, B has been overwritten by its generalized Schur */ /* form T. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB >= max(1,N). */ /* SDIM (output) INTEGER */ /* If SORT = 'N', SDIM = 0. */ /* If SORT = 'S', SDIM = number of eigenvalues (after sorting) */ /* for which SELCTG is true. (Complex conjugate pairs for which */ /* SELCTG is true for either eigenvalue count as 2.) */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will */ /* be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i, */ /* and BETA(j),j=1,...,N are the diagonals of the complex Schur */ /* form (S,T) that would result if the 2-by-2 diagonal blocks of */ /* the real Schur form of (A,B) were further reduced to */ /* triangular form using 2-by-2 complex unitary transformations. */ /* If ALPHAI(j) is zero, then the j-th eigenvalue is real; if */ /* positive, then the j-th and (j+1)-st eigenvalues are a */ /* complex conjugate pair, with ALPHAI(j+1) negative. */ /* Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j) */ /* may easily over- or underflow, and BETA(j) may even be zero. */ /* Thus, the user should avoid naively computing the ratio. */ /* However, ALPHAR and ALPHAI will be always less than and */ /* usually comparable with norm(A) in magnitude, and BETA always */ /* less than and usually comparable with norm(B). */ /* VSL (output) DOUBLE PRECISION array, dimension (LDVSL,N) */ /* If JOBVSL = 'V', VSL will contain the left Schur vectors. */ /* Not referenced if JOBVSL = 'N'. */ /* LDVSL (input) INTEGER */ /* The leading dimension of the matrix VSL. LDVSL >=1, and */ /* if JOBVSL = 'V', LDVSL >= N. */ /* VSR (output) DOUBLE PRECISION array, dimension (LDVSR,N) */ /* If JOBVSR = 'V', VSR will contain the right Schur vectors. */ /* Not referenced if JOBVSR = 'N'. */ /* LDVSR (input) INTEGER */ /* The leading dimension of the matrix VSR. LDVSR >= 1, and */ /* if JOBVSR = 'V', LDVSR >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N = 0, LWORK >= 1, else LWORK >= 8*N+16. */ /* For good performance , LWORK must generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* BWORK (workspace) LOGICAL array, dimension (N) */ /* Not referenced if SORT = 'N'. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1,...,N: */ /* The QZ iteration failed. (A,B) are not in Schur */ /* form, but ALPHAR(j), ALPHAI(j), and BETA(j) should */ /* be correct for j=INFO+1,...,N. */ /* > N: =N+1: other than QZ iteration failed in DHGEQZ. */ /* =N+2: after reordering, roundoff changed values of */ /* some complex eigenvalues so that leading */ /* eigenvalues in the Generalized Schur form no */ /* longer satisfy SELCTG=.TRUE. This could also */ /* be caused due to scaling. */ /* =N+3: reordering failed in DTGSEN. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; vsl_dim1 = *ldvsl; vsl_offset = 1 + vsl_dim1; vsl -= vsl_offset; vsr_dim1 = *ldvsr; vsr_offset = 1 + vsr_dim1; vsr -= vsr_offset; --work; --bwork; /* Function Body */ if (_starpu_lsame_(jobvsl, "N")) { ijobvl = 1; ilvsl = FALSE_; } else if (_starpu_lsame_(jobvsl, "V")) { ijobvl = 2; ilvsl = TRUE_; } else { ijobvl = -1; ilvsl = FALSE_; } if (_starpu_lsame_(jobvsr, "N")) { ijobvr = 1; ilvsr = FALSE_; } else if (_starpu_lsame_(jobvsr, "V")) { ijobvr = 2; ilvsr = TRUE_; } else { ijobvr = -1; ilvsr = FALSE_; } wantst = _starpu_lsame_(sort, "S"); /* Test the input arguments */ *info = 0; lquery = *lwork == -1; if (ijobvl <= 0) { *info = -1; } else if (ijobvr <= 0) { *info = -2; } else if (! wantst && ! _starpu_lsame_(sort, "N")) { *info = -3; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldvsl < 1 || ilvsl && *ldvsl < *n) { *info = -15; } else if (*ldvsr < 1 || ilvsr && *ldvsr < *n) { *info = -17; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { if (*n > 0) { /* Computing MAX */ i__1 = *n << 3, i__2 = *n * 6 + 16; minwrk = max(i__1,i__2); maxwrk = minwrk - *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, & c__1, n, &c__0); /* Computing MAX */ i__1 = maxwrk, i__2 = minwrk - *n + *n * _starpu_ilaenv_(&c__1, "DORMQR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); if (ilvsl) { /* Computing MAX */ i__1 = maxwrk, i__2 = minwrk - *n + *n * _starpu_ilaenv_(&c__1, "DOR" "GQR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); } } else { minwrk = 1; maxwrk = 1; } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -19; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGES ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { *sdim = 0; return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); safmin = _starpu_dlamch_("S"); safmax = 1. / safmin; _starpu_dlabad_(&safmin, &safmax); smlnum = sqrt(safmin) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]); ilascl = FALSE_; if (anrm > 0. && anrm < smlnum) { anrmto = smlnum; ilascl = TRUE_; } else if (anrm > bignum) { anrmto = bignum; ilascl = TRUE_; } if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &anrmto, n, n, &a[a_offset], lda, & ierr); } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]); ilbscl = FALSE_; if (bnrm > 0. && bnrm < smlnum) { bnrmto = smlnum; ilbscl = TRUE_; } else if (bnrm > bignum) { bnrmto = bignum; ilbscl = TRUE_; } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bnrmto, n, n, &b[b_offset], ldb, & ierr); } /* Permute the matrix to make it more nearly triangular */ /* (Workspace: need 6*N + 2*N space for storing balancing factors) */ ileft = 1; iright = *n + 1; iwrk = iright + *n; _starpu_dggbal_("P", n, &a[a_offset], lda, &b[b_offset], ldb, &ilo, &ihi, &work[ ileft], &work[iright], &work[iwrk], &ierr); /* Reduce B to triangular form (QR decomposition of B) */ /* (Workspace: need N, prefer N*NB) */ irows = ihi + 1 - ilo; icols = *n + 1 - ilo; itau = iwrk; iwrk = itau + irows; i__1 = *lwork + 1 - iwrk; _starpu_dgeqrf_(&irows, &icols, &b[ilo + ilo * b_dim1], ldb, &work[itau], &work[ iwrk], &i__1, &ierr); /* Apply the orthogonal transformation to matrix A */ /* (Workspace: need N, prefer N*NB) */ i__1 = *lwork + 1 - iwrk; _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[ilo + ilo * b_dim1], ldb, & work[itau], &a[ilo + ilo * a_dim1], lda, &work[iwrk], &i__1, & ierr); /* Initialize VSL */ /* (Workspace: need N, prefer N*NB) */ if (ilvsl) { _starpu_dlaset_("Full", n, n, &c_b38, &c_b39, &vsl[vsl_offset], ldvsl); if (irows > 1) { i__1 = irows - 1; i__2 = irows - 1; _starpu_dlacpy_("L", &i__1, &i__2, &b[ilo + 1 + ilo * b_dim1], ldb, &vsl[ ilo + 1 + ilo * vsl_dim1], ldvsl); } i__1 = *lwork + 1 - iwrk; _starpu_dorgqr_(&irows, &irows, &irows, &vsl[ilo + ilo * vsl_dim1], ldvsl, & work[itau], &work[iwrk], &i__1, &ierr); } /* Initialize VSR */ if (ilvsr) { _starpu_dlaset_("Full", n, n, &c_b38, &c_b39, &vsr[vsr_offset], ldvsr); } /* Reduce to generalized Hessenberg form */ /* (Workspace: none needed) */ _starpu_dgghrd_(jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[b_offset], ldb, &vsl[vsl_offset], ldvsl, &vsr[vsr_offset], ldvsr, &ierr); /* Perform QZ algorithm, computing Schur vectors if desired */ /* (Workspace: need N) */ iwrk = itau; i__1 = *lwork + 1 - iwrk; _starpu_dhgeqz_("S", jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vsl[vsl_offset] , ldvsl, &vsr[vsr_offset], ldvsr, &work[iwrk], &i__1, &ierr); if (ierr != 0) { if (ierr > 0 && ierr <= *n) { *info = ierr; } else if (ierr > *n && ierr <= *n << 1) { *info = ierr - *n; } else { *info = *n + 1; } goto L50; } /* Sort eigenvalues ALPHA/BETA if desired */ /* (Workspace: need 4*N+16 ) */ *sdim = 0; if (wantst) { /* Undo scaling on eigenvalues before SELCTGing */ if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphar[1], n, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphai[1], n, &ierr); } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, n, &c__1, &beta[1], n, &ierr); } /* Select eigenvalues */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { bwork[i__] = (*selctg)(&alphar[i__], &alphai[i__], &beta[i__]); /* L10: */ } i__1 = *lwork - iwrk + 1; _starpu_dtgsen_(&c__0, &ilvsl, &ilvsr, &bwork[1], n, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vsl[ vsl_offset], ldvsl, &vsr[vsr_offset], ldvsr, sdim, &pvsl, & pvsr, dif, &work[iwrk], &i__1, idum, &c__1, &ierr); if (ierr == 1) { *info = *n + 3; } } /* Apply back-permutation to VSL and VSR */ /* (Workspace: none needed) */ if (ilvsl) { _starpu_dggbak_("P", "L", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsl[ vsl_offset], ldvsl, &ierr); } if (ilvsr) { _starpu_dggbak_("P", "R", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsr[ vsr_offset], ldvsr, &ierr); } /* Check if unscaling would cause over/underflow, if so, rescale */ /* (ALPHAR(I),ALPHAI(I),BETA(I)) so BETA(I) is on the order of */ /* B(I,I) and ALPHAR(I) and ALPHAI(I) are on the order of A(I,I) */ if (ilascl) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (alphai[i__] != 0.) { if (alphar[i__] / safmax > anrmto / anrm || safmin / alphar[ i__] > anrm / anrmto) { work[1] = (d__1 = a[i__ + i__ * a_dim1] / alphar[i__], abs(d__1)); beta[i__] *= work[1]; alphar[i__] *= work[1]; alphai[i__] *= work[1]; } else if (alphai[i__] / safmax > anrmto / anrm || safmin / alphai[i__] > anrm / anrmto) { work[1] = (d__1 = a[i__ + (i__ + 1) * a_dim1] / alphai[ i__], abs(d__1)); beta[i__] *= work[1]; alphar[i__] *= work[1]; alphai[i__] *= work[1]; } } /* L20: */ } } if (ilbscl) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (alphai[i__] != 0.) { if (beta[i__] / safmax > bnrmto / bnrm || safmin / beta[i__] > bnrm / bnrmto) { work[1] = (d__1 = b[i__ + i__ * b_dim1] / beta[i__], abs( d__1)); beta[i__] *= work[1]; alphar[i__] *= work[1]; alphai[i__] *= work[1]; } } /* L30: */ } } /* Undo scaling */ if (ilascl) { _starpu_dlascl_("H", &c__0, &c__0, &anrmto, &anrm, n, n, &a[a_offset], lda, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphar[1], n, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphai[1], n, & ierr); } if (ilbscl) { _starpu_dlascl_("U", &c__0, &c__0, &bnrmto, &bnrm, n, n, &b[b_offset], ldb, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, n, &c__1, &beta[1], n, & ierr); } if (wantst) { /* Check if reordering is correct */ lastsl = TRUE_; lst2sl = TRUE_; *sdim = 0; ip = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { cursl = (*selctg)(&alphar[i__], &alphai[i__], &beta[i__]); if (alphai[i__] == 0.) { if (cursl) { ++(*sdim); } ip = 0; if (cursl && ! lastsl) { *info = *n + 2; } } else { if (ip == 1) { /* Last eigenvalue of conjugate pair */ cursl = cursl || lastsl; lastsl = cursl; if (cursl) { *sdim += 2; } ip = -1; if (cursl && ! lst2sl) { *info = *n + 2; } } else { /* First eigenvalue of conjugate pair */ ip = 1; } } lst2sl = lastsl; lastsl = cursl; /* L40: */ } } L50: work[1] = (doublereal) maxwrk; return 0; /* End of DGGES */ } /* _starpu_dgges_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggesx.c000066400000000000000000000654111413463044200206360ustar00rootroot00000000000000/* dggesx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; static doublereal c_b42 = 0.; static doublereal c_b43 = 1.; /* Subroutine */ int _starpu_dggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp selctg, char *sense, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *rconde, doublereal * rcondv, doublereal *work, integer *lwork, integer *iwork, integer * liwork, logical *bwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vsl_dim1, vsl_offset, vsr_dim1, vsr_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, ip; doublereal pl, pr, dif[2]; integer ihi, ilo; doublereal eps; integer ijob; doublereal anrm, bnrm; integer ierr, itau, iwrk, lwrk; extern logical _starpu_lsame_(char *, char *); integer ileft, icols; logical cursl, ilvsl, ilvsr; integer irows; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dggbak_( char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dggbal_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical lst2sl; extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical ilascl, ilbscl; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmax; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer ijobvl, iright; extern /* Subroutine */ int _starpu_dtgsen_(integer *, logical *, logical *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ijobvr; logical wantsb; integer liwmin; logical wantse, lastsl; doublereal anrmto, bnrmto; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer minwrk, maxwrk; logical wantsn; doublereal smlnum; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical wantst, lquery, wantsv; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* .. Function Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGESX computes for a pair of N-by-N real nonsymmetric matrices */ /* (A,B), the generalized eigenvalues, the real Schur form (S,T), and, */ /* optionally, the left and/or right matrices of Schur vectors (VSL and */ /* VSR). This gives the generalized Schur factorization */ /* (A,B) = ( (VSL) S (VSR)**T, (VSL) T (VSR)**T ) */ /* Optionally, it also orders the eigenvalues so that a selected cluster */ /* of eigenvalues appears in the leading diagonal blocks of the upper */ /* quasi-triangular matrix S and the upper triangular matrix T; computes */ /* a reciprocal condition number for the average of the selected */ /* eigenvalues (RCONDE); and computes a reciprocal condition number for */ /* the right and left deflating subspaces corresponding to the selected */ /* eigenvalues (RCONDV). The leading columns of VSL and VSR then form */ /* an orthonormal basis for the corresponding left and right eigenspaces */ /* (deflating subspaces). */ /* A generalized eigenvalue for a pair of matrices (A,B) is a scalar w */ /* or a ratio alpha/beta = w, such that A - w*B is singular. It is */ /* usually represented as the pair (alpha,beta), as there is a */ /* reasonable interpretation for beta=0 or for both being zero. */ /* A pair of matrices (S,T) is in generalized real Schur form if T is */ /* upper triangular with non-negative diagonal and S is block upper */ /* triangular with 1-by-1 and 2-by-2 blocks. 1-by-1 blocks correspond */ /* to real generalized eigenvalues, while 2-by-2 blocks of S will be */ /* "standardized" by making the corresponding elements of T have the */ /* form: */ /* [ a 0 ] */ /* [ 0 b ] */ /* and the pair of corresponding 2-by-2 blocks in S and T will have a */ /* complex conjugate pair of generalized eigenvalues. */ /* Arguments */ /* ========= */ /* JOBVSL (input) CHARACTER*1 */ /* = 'N': do not compute the left Schur vectors; */ /* = 'V': compute the left Schur vectors. */ /* JOBVSR (input) CHARACTER*1 */ /* = 'N': do not compute the right Schur vectors; */ /* = 'V': compute the right Schur vectors. */ /* SORT (input) CHARACTER*1 */ /* Specifies whether or not to order the eigenvalues on the */ /* diagonal of the generalized Schur form. */ /* = 'N': Eigenvalues are not ordered; */ /* = 'S': Eigenvalues are ordered (see SELCTG). */ /* SELCTG (external procedure) LOGICAL FUNCTION of three DOUBLE PRECISION arguments */ /* SELCTG must be declared EXTERNAL in the calling subroutine. */ /* If SORT = 'N', SELCTG is not referenced. */ /* If SORT = 'S', SELCTG is used to select eigenvalues to sort */ /* to the top left of the Schur form. */ /* An eigenvalue (ALPHAR(j)+ALPHAI(j))/BETA(j) is selected if */ /* SELCTG(ALPHAR(j),ALPHAI(j),BETA(j)) is true; i.e. if either */ /* one of a complex conjugate pair of eigenvalues is selected, */ /* then both complex eigenvalues are selected. */ /* Note that a selected complex eigenvalue may no longer satisfy */ /* SELCTG(ALPHAR(j),ALPHAI(j),BETA(j)) = .TRUE. after ordering, */ /* since ordering may change the value of complex eigenvalues */ /* (especially if the eigenvalue is ill-conditioned), in this */ /* case INFO is set to N+3. */ /* SENSE (input) CHARACTER*1 */ /* Determines which reciprocal condition numbers are computed. */ /* = 'N' : None are computed; */ /* = 'E' : Computed for average of selected eigenvalues only; */ /* = 'V' : Computed for selected deflating subspaces only; */ /* = 'B' : Computed for both. */ /* If SENSE = 'E', 'V', or 'B', SORT must equal 'S'. */ /* N (input) INTEGER */ /* The order of the matrices A, B, VSL, and VSR. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the first of the pair of matrices. */ /* On exit, A has been overwritten by its generalized Schur */ /* form S. */ /* LDA (input) INTEGER */ /* The leading dimension of A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the second of the pair of matrices. */ /* On exit, B has been overwritten by its generalized Schur */ /* form T. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB >= max(1,N). */ /* SDIM (output) INTEGER */ /* If SORT = 'N', SDIM = 0. */ /* If SORT = 'S', SDIM = number of eigenvalues (after sorting) */ /* for which SELCTG is true. (Complex conjugate pairs for which */ /* SELCTG is true for either eigenvalue count as 2.) */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will */ /* be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i */ /* and BETA(j),j=1,...,N are the diagonals of the complex Schur */ /* form (S,T) that would result if the 2-by-2 diagonal blocks of */ /* the real Schur form of (A,B) were further reduced to */ /* triangular form using 2-by-2 complex unitary transformations. */ /* If ALPHAI(j) is zero, then the j-th eigenvalue is real; if */ /* positive, then the j-th and (j+1)-st eigenvalues are a */ /* complex conjugate pair, with ALPHAI(j+1) negative. */ /* Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j) */ /* may easily over- or underflow, and BETA(j) may even be zero. */ /* Thus, the user should avoid naively computing the ratio. */ /* However, ALPHAR and ALPHAI will be always less than and */ /* usually comparable with norm(A) in magnitude, and BETA always */ /* less than and usually comparable with norm(B). */ /* VSL (output) DOUBLE PRECISION array, dimension (LDVSL,N) */ /* If JOBVSL = 'V', VSL will contain the left Schur vectors. */ /* Not referenced if JOBVSL = 'N'. */ /* LDVSL (input) INTEGER */ /* The leading dimension of the matrix VSL. LDVSL >=1, and */ /* if JOBVSL = 'V', LDVSL >= N. */ /* VSR (output) DOUBLE PRECISION array, dimension (LDVSR,N) */ /* If JOBVSR = 'V', VSR will contain the right Schur vectors. */ /* Not referenced if JOBVSR = 'N'. */ /* LDVSR (input) INTEGER */ /* The leading dimension of the matrix VSR. LDVSR >= 1, and */ /* if JOBVSR = 'V', LDVSR >= N. */ /* RCONDE (output) DOUBLE PRECISION array, dimension ( 2 ) */ /* If SENSE = 'E' or 'B', RCONDE(1) and RCONDE(2) contain the */ /* reciprocal condition numbers for the average of the selected */ /* eigenvalues. */ /* Not referenced if SENSE = 'N' or 'V'. */ /* RCONDV (output) DOUBLE PRECISION array, dimension ( 2 ) */ /* If SENSE = 'V' or 'B', RCONDV(1) and RCONDV(2) contain the */ /* reciprocal condition numbers for the selected deflating */ /* subspaces. */ /* Not referenced if SENSE = 'N' or 'E'. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N = 0, LWORK >= 1, else if SENSE = 'E', 'V', or 'B', */ /* LWORK >= max( 8*N, 6*N+16, 2*SDIM*(N-SDIM) ), else */ /* LWORK >= max( 8*N, 6*N+16 ). */ /* Note that 2*SDIM*(N-SDIM) <= N*N/2. */ /* Note also that an error is only returned if */ /* LWORK < max( 8*N, 6*N+16), but if SENSE = 'E' or 'V' or 'B' */ /* this may not be large enough. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the bound on the optimal size of the WORK */ /* array and the minimum size of the IWORK array, returns these */ /* values as the first entries of the WORK and IWORK arrays, and */ /* no error message related to LWORK or LIWORK is issued by */ /* XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If SENSE = 'N' or N = 0, LIWORK >= 1, otherwise */ /* LIWORK >= N+6. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the bound on the optimal size of the */ /* WORK array and the minimum size of the IWORK array, returns */ /* these values as the first entries of the WORK and IWORK */ /* arrays, and no error message related to LWORK or LIWORK is */ /* issued by XERBLA. */ /* BWORK (workspace) LOGICAL array, dimension (N) */ /* Not referenced if SORT = 'N'. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1,...,N: */ /* The QZ iteration failed. (A,B) are not in Schur */ /* form, but ALPHAR(j), ALPHAI(j), and BETA(j) should */ /* be correct for j=INFO+1,...,N. */ /* > N: =N+1: other than QZ iteration failed in DHGEQZ */ /* =N+2: after reordering, roundoff changed values of */ /* some complex eigenvalues so that leading */ /* eigenvalues in the Generalized Schur form no */ /* longer satisfy SELCTG=.TRUE. This could also */ /* be caused due to scaling. */ /* =N+3: reordering failed in DTGSEN. */ /* Further details */ /* =============== */ /* An approximate (asymptotic) bound on the average absolute error of */ /* the selected eigenvalues is */ /* EPS * norm((A, B)) / RCONDE( 1 ). */ /* An approximate (asymptotic) bound on the maximum angular error in */ /* the computed deflating subspaces is */ /* EPS * norm((A, B)) / RCONDV( 2 ). */ /* See LAPACK User's Guide, section 4.11 for more information. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; vsl_dim1 = *ldvsl; vsl_offset = 1 + vsl_dim1; vsl -= vsl_offset; vsr_dim1 = *ldvsr; vsr_offset = 1 + vsr_dim1; vsr -= vsr_offset; --rconde; --rcondv; --work; --iwork; --bwork; /* Function Body */ if (_starpu_lsame_(jobvsl, "N")) { ijobvl = 1; ilvsl = FALSE_; } else if (_starpu_lsame_(jobvsl, "V")) { ijobvl = 2; ilvsl = TRUE_; } else { ijobvl = -1; ilvsl = FALSE_; } if (_starpu_lsame_(jobvsr, "N")) { ijobvr = 1; ilvsr = FALSE_; } else if (_starpu_lsame_(jobvsr, "V")) { ijobvr = 2; ilvsr = TRUE_; } else { ijobvr = -1; ilvsr = FALSE_; } wantst = _starpu_lsame_(sort, "S"); wantsn = _starpu_lsame_(sense, "N"); wantse = _starpu_lsame_(sense, "E"); wantsv = _starpu_lsame_(sense, "V"); wantsb = _starpu_lsame_(sense, "B"); lquery = *lwork == -1 || *liwork == -1; if (wantsn) { ijob = 0; } else if (wantse) { ijob = 1; } else if (wantsv) { ijob = 2; } else if (wantsb) { ijob = 4; } /* Test the input arguments */ *info = 0; if (ijobvl <= 0) { *info = -1; } else if (ijobvr <= 0) { *info = -2; } else if (! wantst && ! _starpu_lsame_(sort, "N")) { *info = -3; } else if (! (wantsn || wantse || wantsv || wantsb) || ! wantst && ! wantsn) { *info = -5; } else if (*n < 0) { *info = -6; } else if (*lda < max(1,*n)) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -10; } else if (*ldvsl < 1 || ilvsl && *ldvsl < *n) { *info = -16; } else if (*ldvsr < 1 || ilvsr && *ldvsr < *n) { *info = -18; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { if (*n > 0) { /* Computing MAX */ i__1 = *n << 3, i__2 = *n * 6 + 16; minwrk = max(i__1,i__2); maxwrk = minwrk - *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, & c__1, n, &c__0); /* Computing MAX */ i__1 = maxwrk, i__2 = minwrk - *n + *n * _starpu_ilaenv_(&c__1, "DORMQR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); if (ilvsl) { /* Computing MAX */ i__1 = maxwrk, i__2 = minwrk - *n + *n * _starpu_ilaenv_(&c__1, "DOR" "GQR", " ", n, &c__1, n, &c_n1); maxwrk = max(i__1,i__2); } lwrk = maxwrk; if (ijob >= 1) { /* Computing MAX */ i__1 = lwrk, i__2 = *n * *n / 2; lwrk = max(i__1,i__2); } } else { minwrk = 1; maxwrk = 1; lwrk = 1; } work[1] = (doublereal) lwrk; if (wantsn || *n == 0) { liwmin = 1; } else { liwmin = *n + 6; } iwork[1] = liwmin; if (*lwork < minwrk && ! lquery) { *info = -22; } else if (*liwork < liwmin && ! lquery) { *info = -24; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGESX", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { *sdim = 0; return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); safmin = _starpu_dlamch_("S"); safmax = 1. / safmin; _starpu_dlabad_(&safmin, &safmax); smlnum = sqrt(safmin) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]); ilascl = FALSE_; if (anrm > 0. && anrm < smlnum) { anrmto = smlnum; ilascl = TRUE_; } else if (anrm > bignum) { anrmto = bignum; ilascl = TRUE_; } if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &anrmto, n, n, &a[a_offset], lda, & ierr); } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]); ilbscl = FALSE_; if (bnrm > 0. && bnrm < smlnum) { bnrmto = smlnum; ilbscl = TRUE_; } else if (bnrm > bignum) { bnrmto = bignum; ilbscl = TRUE_; } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bnrmto, n, n, &b[b_offset], ldb, & ierr); } /* Permute the matrix to make it more nearly triangular */ /* (Workspace: need 6*N + 2*N for permutation parameters) */ ileft = 1; iright = *n + 1; iwrk = iright + *n; _starpu_dggbal_("P", n, &a[a_offset], lda, &b[b_offset], ldb, &ilo, &ihi, &work[ ileft], &work[iright], &work[iwrk], &ierr); /* Reduce B to triangular form (QR decomposition of B) */ /* (Workspace: need N, prefer N*NB) */ irows = ihi + 1 - ilo; icols = *n + 1 - ilo; itau = iwrk; iwrk = itau + irows; i__1 = *lwork + 1 - iwrk; _starpu_dgeqrf_(&irows, &icols, &b[ilo + ilo * b_dim1], ldb, &work[itau], &work[ iwrk], &i__1, &ierr); /* Apply the orthogonal transformation to matrix A */ /* (Workspace: need N, prefer N*NB) */ i__1 = *lwork + 1 - iwrk; _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[ilo + ilo * b_dim1], ldb, & work[itau], &a[ilo + ilo * a_dim1], lda, &work[iwrk], &i__1, & ierr); /* Initialize VSL */ /* (Workspace: need N, prefer N*NB) */ if (ilvsl) { _starpu_dlaset_("Full", n, n, &c_b42, &c_b43, &vsl[vsl_offset], ldvsl); if (irows > 1) { i__1 = irows - 1; i__2 = irows - 1; _starpu_dlacpy_("L", &i__1, &i__2, &b[ilo + 1 + ilo * b_dim1], ldb, &vsl[ ilo + 1 + ilo * vsl_dim1], ldvsl); } i__1 = *lwork + 1 - iwrk; _starpu_dorgqr_(&irows, &irows, &irows, &vsl[ilo + ilo * vsl_dim1], ldvsl, & work[itau], &work[iwrk], &i__1, &ierr); } /* Initialize VSR */ if (ilvsr) { _starpu_dlaset_("Full", n, n, &c_b42, &c_b43, &vsr[vsr_offset], ldvsr); } /* Reduce to generalized Hessenberg form */ /* (Workspace: none needed) */ _starpu_dgghrd_(jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[b_offset], ldb, &vsl[vsl_offset], ldvsl, &vsr[vsr_offset], ldvsr, &ierr); *sdim = 0; /* Perform QZ algorithm, computing Schur vectors if desired */ /* (Workspace: need N) */ iwrk = itau; i__1 = *lwork + 1 - iwrk; _starpu_dhgeqz_("S", jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vsl[vsl_offset] , ldvsl, &vsr[vsr_offset], ldvsr, &work[iwrk], &i__1, &ierr); if (ierr != 0) { if (ierr > 0 && ierr <= *n) { *info = ierr; } else if (ierr > *n && ierr <= *n << 1) { *info = ierr - *n; } else { *info = *n + 1; } goto L60; } /* Sort eigenvalues ALPHA/BETA and compute the reciprocal of */ /* condition number(s) */ /* (Workspace: If IJOB >= 1, need MAX( 8*(N+1), 2*SDIM*(N-SDIM) ) */ /* otherwise, need 8*(N+1) ) */ if (wantst) { /* Undo scaling on eigenvalues before SELCTGing */ if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphar[1], n, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphai[1], n, &ierr); } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, n, &c__1, &beta[1], n, &ierr); } /* Select eigenvalues */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { bwork[i__] = (*selctg)(&alphar[i__], &alphai[i__], &beta[i__]); /* L10: */ } /* Reorder eigenvalues, transform Generalized Schur vectors, and */ /* compute reciprocal condition numbers */ i__1 = *lwork - iwrk + 1; _starpu_dtgsen_(&ijob, &ilvsl, &ilvsr, &bwork[1], n, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vsl[ vsl_offset], ldvsl, &vsr[vsr_offset], ldvsr, sdim, &pl, &pr, dif, &work[iwrk], &i__1, &iwork[1], liwork, &ierr); if (ijob >= 1) { /* Computing MAX */ i__1 = maxwrk, i__2 = (*sdim << 1) * (*n - *sdim); maxwrk = max(i__1,i__2); } if (ierr == -22) { /* not enough real workspace */ *info = -22; } else { if (ijob == 1 || ijob == 4) { rconde[1] = pl; rconde[2] = pr; } if (ijob == 2 || ijob == 4) { rcondv[1] = dif[0]; rcondv[2] = dif[1]; } if (ierr == 1) { *info = *n + 3; } } } /* Apply permutation to VSL and VSR */ /* (Workspace: none needed) */ if (ilvsl) { _starpu_dggbak_("P", "L", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsl[ vsl_offset], ldvsl, &ierr); } if (ilvsr) { _starpu_dggbak_("P", "R", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsr[ vsr_offset], ldvsr, &ierr); } /* Check if unscaling would cause over/underflow, if so, rescale */ /* (ALPHAR(I),ALPHAI(I),BETA(I)) so BETA(I) is on the order of */ /* B(I,I) and ALPHAR(I) and ALPHAI(I) are on the order of A(I,I) */ if (ilascl) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (alphai[i__] != 0.) { if (alphar[i__] / safmax > anrmto / anrm || safmin / alphar[ i__] > anrm / anrmto) { work[1] = (d__1 = a[i__ + i__ * a_dim1] / alphar[i__], abs(d__1)); beta[i__] *= work[1]; alphar[i__] *= work[1]; alphai[i__] *= work[1]; } else if (alphai[i__] / safmax > anrmto / anrm || safmin / alphai[i__] > anrm / anrmto) { work[1] = (d__1 = a[i__ + (i__ + 1) * a_dim1] / alphai[ i__], abs(d__1)); beta[i__] *= work[1]; alphar[i__] *= work[1]; alphai[i__] *= work[1]; } } /* L20: */ } } if (ilbscl) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (alphai[i__] != 0.) { if (beta[i__] / safmax > bnrmto / bnrm || safmin / beta[i__] > bnrm / bnrmto) { work[1] = (d__1 = b[i__ + i__ * b_dim1] / beta[i__], abs( d__1)); beta[i__] *= work[1]; alphar[i__] *= work[1]; alphai[i__] *= work[1]; } } /* L30: */ } } /* Undo scaling */ if (ilascl) { _starpu_dlascl_("H", &c__0, &c__0, &anrmto, &anrm, n, n, &a[a_offset], lda, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphar[1], n, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphai[1], n, & ierr); } if (ilbscl) { _starpu_dlascl_("U", &c__0, &c__0, &bnrmto, &bnrm, n, n, &b[b_offset], ldb, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, n, &c__1, &beta[1], n, & ierr); } if (wantst) { /* Check if reordering is correct */ lastsl = TRUE_; lst2sl = TRUE_; *sdim = 0; ip = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { cursl = (*selctg)(&alphar[i__], &alphai[i__], &beta[i__]); if (alphai[i__] == 0.) { if (cursl) { ++(*sdim); } ip = 0; if (cursl && ! lastsl) { *info = *n + 2; } } else { if (ip == 1) { /* Last eigenvalue of conjugate pair */ cursl = cursl || lastsl; lastsl = cursl; if (cursl) { *sdim += 2; } ip = -1; if (cursl && ! lst2sl) { *info = *n + 2; } } else { /* First eigenvalue of conjugate pair */ ip = 1; } } lst2sl = lastsl; lastsl = cursl; /* L50: */ } } L60: work[1] = (doublereal) maxwrk; iwork[1] = liwmin; return 0; /* End of DGGESX */ } /* _starpu_dggesx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggev.c000066400000000000000000000470571413463044200204570ustar00rootroot00000000000000/* dggev.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static integer c_n1 = -1; static doublereal c_b36 = 0.; static doublereal c_b37 = 1.; /* Subroutine */ int _starpu_dggev_(char *jobvl, char *jobvr, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer jc, in, jr, ihi, ilo; doublereal eps; logical ilv; doublereal anrm, bnrm; integer ierr, itau; doublereal temp; logical ilvl, ilvr; integer iwrk; extern logical _starpu_lsame_(char *, char *); integer ileft, icols, irows; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dggbak_( char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dggbal_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical ilascl, ilbscl; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dtgevc_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); logical ldumma[1]; char chtemp[1]; doublereal bignum; extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ijobvl, iright, ijobvr; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal anrmto, bnrmto; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer minwrk, maxwrk; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGEV computes for a pair of N-by-N real nonsymmetric matrices (A,B) */ /* the generalized eigenvalues, and optionally, the left and/or right */ /* generalized eigenvectors. */ /* A generalized eigenvalue for a pair of matrices (A,B) is a scalar */ /* lambda or a ratio alpha/beta = lambda, such that A - lambda*B is */ /* singular. It is usually represented as the pair (alpha,beta), as */ /* there is a reasonable interpretation for beta=0, and even for both */ /* being zero. */ /* The right eigenvector v(j) corresponding to the eigenvalue lambda(j) */ /* of (A,B) satisfies */ /* A * v(j) = lambda(j) * B * v(j). */ /* The left eigenvector u(j) corresponding to the eigenvalue lambda(j) */ /* of (A,B) satisfies */ /* u(j)**H * A = lambda(j) * u(j)**H * B . */ /* where u(j)**H is the conjugate-transpose of u(j). */ /* Arguments */ /* ========= */ /* JOBVL (input) CHARACTER*1 */ /* = 'N': do not compute the left generalized eigenvectors; */ /* = 'V': compute the left generalized eigenvectors. */ /* JOBVR (input) CHARACTER*1 */ /* = 'N': do not compute the right generalized eigenvectors; */ /* = 'V': compute the right generalized eigenvectors. */ /* N (input) INTEGER */ /* The order of the matrices A, B, VL, and VR. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the matrix A in the pair (A,B). */ /* On exit, A has been overwritten. */ /* LDA (input) INTEGER */ /* The leading dimension of A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the matrix B in the pair (A,B). */ /* On exit, B has been overwritten. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB >= max(1,N). */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will */ /* be the generalized eigenvalues. If ALPHAI(j) is zero, then */ /* the j-th eigenvalue is real; if positive, then the j-th and */ /* (j+1)-st eigenvalues are a complex conjugate pair, with */ /* ALPHAI(j+1) negative. */ /* Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j) */ /* may easily over- or underflow, and BETA(j) may even be zero. */ /* Thus, the user should avoid naively computing the ratio */ /* alpha/beta. However, ALPHAR and ALPHAI will be always less */ /* than and usually comparable with norm(A) in magnitude, and */ /* BETA always less than and usually comparable with norm(B). */ /* VL (output) DOUBLE PRECISION array, dimension (LDVL,N) */ /* If JOBVL = 'V', the left eigenvectors u(j) are stored one */ /* after another in the columns of VL, in the same order as */ /* their eigenvalues. If the j-th eigenvalue is real, then */ /* u(j) = VL(:,j), the j-th column of VL. If the j-th and */ /* (j+1)-th eigenvalues form a complex conjugate pair, then */ /* u(j) = VL(:,j)+i*VL(:,j+1) and u(j+1) = VL(:,j)-i*VL(:,j+1). */ /* Each eigenvector is scaled so the largest component has */ /* abs(real part)+abs(imag. part)=1. */ /* Not referenced if JOBVL = 'N'. */ /* LDVL (input) INTEGER */ /* The leading dimension of the matrix VL. LDVL >= 1, and */ /* if JOBVL = 'V', LDVL >= N. */ /* VR (output) DOUBLE PRECISION array, dimension (LDVR,N) */ /* If JOBVR = 'V', the right eigenvectors v(j) are stored one */ /* after another in the columns of VR, in the same order as */ /* their eigenvalues. If the j-th eigenvalue is real, then */ /* v(j) = VR(:,j), the j-th column of VR. If the j-th and */ /* (j+1)-th eigenvalues form a complex conjugate pair, then */ /* v(j) = VR(:,j)+i*VR(:,j+1) and v(j+1) = VR(:,j)-i*VR(:,j+1). */ /* Each eigenvector is scaled so the largest component has */ /* abs(real part)+abs(imag. part)=1. */ /* Not referenced if JOBVR = 'N'. */ /* LDVR (input) INTEGER */ /* The leading dimension of the matrix VR. LDVR >= 1, and */ /* if JOBVR = 'V', LDVR >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,8*N). */ /* For good performance, LWORK must generally be larger. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1,...,N: */ /* The QZ iteration failed. No eigenvectors have been */ /* calculated, but ALPHAR(j), ALPHAI(j), and BETA(j) */ /* should be correct for j=INFO+1,...,N. */ /* > N: =N+1: other than QZ iteration failed in DHGEQZ. */ /* =N+2: error return from DTGEVC. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --work; /* Function Body */ if (_starpu_lsame_(jobvl, "N")) { ijobvl = 1; ilvl = FALSE_; } else if (_starpu_lsame_(jobvl, "V")) { ijobvl = 2; ilvl = TRUE_; } else { ijobvl = -1; ilvl = FALSE_; } if (_starpu_lsame_(jobvr, "N")) { ijobvr = 1; ilvr = FALSE_; } else if (_starpu_lsame_(jobvr, "V")) { ijobvr = 2; ilvr = TRUE_; } else { ijobvr = -1; ilvr = FALSE_; } ilv = ilvl || ilvr; /* Test the input arguments */ *info = 0; lquery = *lwork == -1; if (ijobvl <= 0) { *info = -1; } else if (ijobvr <= 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldvl < 1 || ilvl && *ldvl < *n) { *info = -12; } else if (*ldvr < 1 || ilvr && *ldvr < *n) { *info = -14; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV. The workspace is */ /* computed assuming ILO = 1 and IHI = N, the worst case.) */ if (*info == 0) { /* Computing MAX */ i__1 = 1, i__2 = *n << 3; minwrk = max(i__1,i__2); /* Computing MAX */ i__1 = 1, i__2 = *n * (_starpu_ilaenv_(&c__1, "DGEQRF", " ", n, &c__1, n, & c__0) + 7); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n * (_starpu_ilaenv_(&c__1, "DORMQR", " ", n, &c__1, n, &c__0) + 7); maxwrk = max(i__1,i__2); if (ilvl) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n * (_starpu_ilaenv_(&c__1, "DORGQR", " ", n, & c__1, n, &c_n1) + 7); maxwrk = max(i__1,i__2); } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -16; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGEV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = sqrt(smlnum) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]); ilascl = FALSE_; if (anrm > 0. && anrm < smlnum) { anrmto = smlnum; ilascl = TRUE_; } else if (anrm > bignum) { anrmto = bignum; ilascl = TRUE_; } if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &anrmto, n, n, &a[a_offset], lda, & ierr); } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]); ilbscl = FALSE_; if (bnrm > 0. && bnrm < smlnum) { bnrmto = smlnum; ilbscl = TRUE_; } else if (bnrm > bignum) { bnrmto = bignum; ilbscl = TRUE_; } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bnrmto, n, n, &b[b_offset], ldb, & ierr); } /* Permute the matrices A, B to isolate eigenvalues if possible */ /* (Workspace: need 6*N) */ ileft = 1; iright = *n + 1; iwrk = iright + *n; _starpu_dggbal_("P", n, &a[a_offset], lda, &b[b_offset], ldb, &ilo, &ihi, &work[ ileft], &work[iright], &work[iwrk], &ierr); /* Reduce B to triangular form (QR decomposition of B) */ /* (Workspace: need N, prefer N*NB) */ irows = ihi + 1 - ilo; if (ilv) { icols = *n + 1 - ilo; } else { icols = irows; } itau = iwrk; iwrk = itau + irows; i__1 = *lwork + 1 - iwrk; _starpu_dgeqrf_(&irows, &icols, &b[ilo + ilo * b_dim1], ldb, &work[itau], &work[ iwrk], &i__1, &ierr); /* Apply the orthogonal transformation to matrix A */ /* (Workspace: need N, prefer N*NB) */ i__1 = *lwork + 1 - iwrk; _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[ilo + ilo * b_dim1], ldb, & work[itau], &a[ilo + ilo * a_dim1], lda, &work[iwrk], &i__1, & ierr); /* Initialize VL */ /* (Workspace: need N, prefer N*NB) */ if (ilvl) { _starpu_dlaset_("Full", n, n, &c_b36, &c_b37, &vl[vl_offset], ldvl) ; if (irows > 1) { i__1 = irows - 1; i__2 = irows - 1; _starpu_dlacpy_("L", &i__1, &i__2, &b[ilo + 1 + ilo * b_dim1], ldb, &vl[ ilo + 1 + ilo * vl_dim1], ldvl); } i__1 = *lwork + 1 - iwrk; _starpu_dorgqr_(&irows, &irows, &irows, &vl[ilo + ilo * vl_dim1], ldvl, &work[ itau], &work[iwrk], &i__1, &ierr); } /* Initialize VR */ if (ilvr) { _starpu_dlaset_("Full", n, n, &c_b36, &c_b37, &vr[vr_offset], ldvr) ; } /* Reduce to generalized Hessenberg form */ /* (Workspace: none needed) */ if (ilv) { /* Eigenvectors requested -- work on whole matrix. */ _starpu_dgghrd_(jobvl, jobvr, n, &ilo, &ihi, &a[a_offset], lda, &b[b_offset], ldb, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, &ierr); } else { _starpu_dgghrd_("N", "N", &irows, &c__1, &irows, &a[ilo + ilo * a_dim1], lda, &b[ilo + ilo * b_dim1], ldb, &vl[vl_offset], ldvl, &vr[ vr_offset], ldvr, &ierr); } /* Perform QZ algorithm (Compute eigenvalues, and optionally, the */ /* Schur forms and Schur vectors) */ /* (Workspace: need N) */ iwrk = itau; if (ilv) { *(unsigned char *)chtemp = 'S'; } else { *(unsigned char *)chtemp = 'E'; } i__1 = *lwork + 1 - iwrk; _starpu_dhgeqz_(chtemp, jobvl, jobvr, n, &ilo, &ihi, &a[a_offset], lda, &b[ b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, &work[iwrk], &i__1, &ierr); if (ierr != 0) { if (ierr > 0 && ierr <= *n) { *info = ierr; } else if (ierr > *n && ierr <= *n << 1) { *info = ierr - *n; } else { *info = *n + 1; } goto L110; } /* Compute Eigenvectors */ /* (Workspace: need 6*N) */ if (ilv) { if (ilvl) { if (ilvr) { *(unsigned char *)chtemp = 'B'; } else { *(unsigned char *)chtemp = 'L'; } } else { *(unsigned char *)chtemp = 'R'; } _starpu_dtgevc_(chtemp, "B", ldumma, n, &a[a_offset], lda, &b[b_offset], ldb, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, n, &in, &work[ iwrk], &ierr); if (ierr != 0) { *info = *n + 2; goto L110; } /* Undo balancing on VL and VR and normalization */ /* (Workspace: none needed) */ if (ilvl) { _starpu_dggbak_("P", "L", n, &ilo, &ihi, &work[ileft], &work[iright], n, & vl[vl_offset], ldvl, &ierr); i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { if (alphai[jc] < 0.) { goto L50; } temp = 0.; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__2 = temp, d__3 = (d__1 = vl[jr + jc * vl_dim1], abs(d__1)); temp = max(d__2,d__3); /* L10: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__3 = temp, d__4 = (d__1 = vl[jr + jc * vl_dim1], abs(d__1)) + (d__2 = vl[jr + (jc + 1) * vl_dim1], abs(d__2)); temp = max(d__3,d__4); /* L20: */ } } if (temp < smlnum) { goto L50; } temp = 1. / temp; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + jc * vl_dim1] *= temp; /* L30: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + jc * vl_dim1] *= temp; vl[jr + (jc + 1) * vl_dim1] *= temp; /* L40: */ } } L50: ; } } if (ilvr) { _starpu_dggbak_("P", "R", n, &ilo, &ihi, &work[ileft], &work[iright], n, & vr[vr_offset], ldvr, &ierr); i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { if (alphai[jc] < 0.) { goto L100; } temp = 0.; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__2 = temp, d__3 = (d__1 = vr[jr + jc * vr_dim1], abs(d__1)); temp = max(d__2,d__3); /* L60: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__3 = temp, d__4 = (d__1 = vr[jr + jc * vr_dim1], abs(d__1)) + (d__2 = vr[jr + (jc + 1) * vr_dim1], abs(d__2)); temp = max(d__3,d__4); /* L70: */ } } if (temp < smlnum) { goto L100; } temp = 1. / temp; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + jc * vr_dim1] *= temp; /* L80: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + jc * vr_dim1] *= temp; vr[jr + (jc + 1) * vr_dim1] *= temp; /* L90: */ } } L100: ; } } /* End of eigenvector calculation */ } /* Undo scaling if necessary */ if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphar[1], n, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphai[1], n, & ierr); } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, n, &c__1, &beta[1], n, & ierr); } L110: work[1] = (doublereal) maxwrk; return 0; /* End of DGGEV */ } /* _starpu_dggev_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggevx.c000066400000000000000000000717501413463044200206440ustar00rootroot00000000000000/* dggevx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b59 = 0.; static doublereal c_b60 = 1.; /* Subroutine */ int _starpu_dggevx_(char *balanc, char *jobvl, char *jobvr, char * sense, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * rcondv, doublereal *work, integer *lwork, integer *iwork, logical * bwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, m, jc, in, mm, jr; doublereal eps; logical ilv, pair; doublereal anrm, bnrm; integer ierr, itau; doublereal temp; logical ilvl, ilvr; integer iwrk, iwrk1; extern logical _starpu_lsame_(char *, char *); integer icols; logical noscl; integer irows; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *), _starpu_dggbak_( char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dggbal_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical ilascl, ilbscl; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical ldumma[1]; char chtemp[1]; doublereal bignum; extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dtgevc_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); integer ijobvl; extern /* Subroutine */ int _starpu_dtgsna_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ijobvr; logical wantsb; extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); doublereal anrmto; logical wantse; doublereal bnrmto; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer minwrk, maxwrk; logical wantsn; doublereal smlnum; logical lquery, wantsv; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGEVX computes for a pair of N-by-N real nonsymmetric matrices (A,B) */ /* the generalized eigenvalues, and optionally, the left and/or right */ /* generalized eigenvectors. */ /* Optionally also, it computes a balancing transformation to improve */ /* the conditioning of the eigenvalues and eigenvectors (ILO, IHI, */ /* LSCALE, RSCALE, ABNRM, and BBNRM), reciprocal condition numbers for */ /* the eigenvalues (RCONDE), and reciprocal condition numbers for the */ /* right eigenvectors (RCONDV). */ /* A generalized eigenvalue for a pair of matrices (A,B) is a scalar */ /* lambda or a ratio alpha/beta = lambda, such that A - lambda*B is */ /* singular. It is usually represented as the pair (alpha,beta), as */ /* there is a reasonable interpretation for beta=0, and even for both */ /* being zero. */ /* The right eigenvector v(j) corresponding to the eigenvalue lambda(j) */ /* of (A,B) satisfies */ /* A * v(j) = lambda(j) * B * v(j) . */ /* The left eigenvector u(j) corresponding to the eigenvalue lambda(j) */ /* of (A,B) satisfies */ /* u(j)**H * A = lambda(j) * u(j)**H * B. */ /* where u(j)**H is the conjugate-transpose of u(j). */ /* Arguments */ /* ========= */ /* BALANC (input) CHARACTER*1 */ /* Specifies the balance option to be performed. */ /* = 'N': do not diagonally scale or permute; */ /* = 'P': permute only; */ /* = 'S': scale only; */ /* = 'B': both permute and scale. */ /* Computed reciprocal condition numbers will be for the */ /* matrices after permuting and/or balancing. Permuting does */ /* not change condition numbers (in exact arithmetic), but */ /* balancing does. */ /* JOBVL (input) CHARACTER*1 */ /* = 'N': do not compute the left generalized eigenvectors; */ /* = 'V': compute the left generalized eigenvectors. */ /* JOBVR (input) CHARACTER*1 */ /* = 'N': do not compute the right generalized eigenvectors; */ /* = 'V': compute the right generalized eigenvectors. */ /* SENSE (input) CHARACTER*1 */ /* Determines which reciprocal condition numbers are computed. */ /* = 'N': none are computed; */ /* = 'E': computed for eigenvalues only; */ /* = 'V': computed for eigenvectors only; */ /* = 'B': computed for eigenvalues and eigenvectors. */ /* N (input) INTEGER */ /* The order of the matrices A, B, VL, and VR. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the matrix A in the pair (A,B). */ /* On exit, A has been overwritten. If JOBVL='V' or JOBVR='V' */ /* or both, then A contains the first part of the real Schur */ /* form of the "balanced" versions of the input A and B. */ /* LDA (input) INTEGER */ /* The leading dimension of A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the matrix B in the pair (A,B). */ /* On exit, B has been overwritten. If JOBVL='V' or JOBVR='V' */ /* or both, then B contains the second part of the real Schur */ /* form of the "balanced" versions of the input A and B. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB >= max(1,N). */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will */ /* be the generalized eigenvalues. If ALPHAI(j) is zero, then */ /* the j-th eigenvalue is real; if positive, then the j-th and */ /* (j+1)-st eigenvalues are a complex conjugate pair, with */ /* ALPHAI(j+1) negative. */ /* Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j) */ /* may easily over- or underflow, and BETA(j) may even be zero. */ /* Thus, the user should avoid naively computing the ratio */ /* ALPHA/BETA. However, ALPHAR and ALPHAI will be always less */ /* than and usually comparable with norm(A) in magnitude, and */ /* BETA always less than and usually comparable with norm(B). */ /* VL (output) DOUBLE PRECISION array, dimension (LDVL,N) */ /* If JOBVL = 'V', the left eigenvectors u(j) are stored one */ /* after another in the columns of VL, in the same order as */ /* their eigenvalues. If the j-th eigenvalue is real, then */ /* u(j) = VL(:,j), the j-th column of VL. If the j-th and */ /* (j+1)-th eigenvalues form a complex conjugate pair, then */ /* u(j) = VL(:,j)+i*VL(:,j+1) and u(j+1) = VL(:,j)-i*VL(:,j+1). */ /* Each eigenvector will be scaled so the largest component have */ /* abs(real part) + abs(imag. part) = 1. */ /* Not referenced if JOBVL = 'N'. */ /* LDVL (input) INTEGER */ /* The leading dimension of the matrix VL. LDVL >= 1, and */ /* if JOBVL = 'V', LDVL >= N. */ /* VR (output) DOUBLE PRECISION array, dimension (LDVR,N) */ /* If JOBVR = 'V', the right eigenvectors v(j) are stored one */ /* after another in the columns of VR, in the same order as */ /* their eigenvalues. If the j-th eigenvalue is real, then */ /* v(j) = VR(:,j), the j-th column of VR. If the j-th and */ /* (j+1)-th eigenvalues form a complex conjugate pair, then */ /* v(j) = VR(:,j)+i*VR(:,j+1) and v(j+1) = VR(:,j)-i*VR(:,j+1). */ /* Each eigenvector will be scaled so the largest component have */ /* abs(real part) + abs(imag. part) = 1. */ /* Not referenced if JOBVR = 'N'. */ /* LDVR (input) INTEGER */ /* The leading dimension of the matrix VR. LDVR >= 1, and */ /* if JOBVR = 'V', LDVR >= N. */ /* ILO (output) INTEGER */ /* IHI (output) INTEGER */ /* ILO and IHI are integer values such that on exit */ /* A(i,j) = 0 and B(i,j) = 0 if i > j and */ /* j = 1,...,ILO-1 or i = IHI+1,...,N. */ /* If BALANC = 'N' or 'S', ILO = 1 and IHI = N. */ /* LSCALE (output) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and scaling factors applied */ /* to the left side of A and B. If PL(j) is the index of the */ /* row interchanged with row j, and DL(j) is the scaling */ /* factor applied to row j, then */ /* LSCALE(j) = PL(j) for j = 1,...,ILO-1 */ /* = DL(j) for j = ILO,...,IHI */ /* = PL(j) for j = IHI+1,...,N. */ /* The order in which the interchanges are made is N to IHI+1, */ /* then 1 to ILO-1. */ /* RSCALE (output) DOUBLE PRECISION array, dimension (N) */ /* Details of the permutations and scaling factors applied */ /* to the right side of A and B. If PR(j) is the index of the */ /* column interchanged with column j, and DR(j) is the scaling */ /* factor applied to column j, then */ /* RSCALE(j) = PR(j) for j = 1,...,ILO-1 */ /* = DR(j) for j = ILO,...,IHI */ /* = PR(j) for j = IHI+1,...,N */ /* The order in which the interchanges are made is N to IHI+1, */ /* then 1 to ILO-1. */ /* ABNRM (output) DOUBLE PRECISION */ /* The one-norm of the balanced matrix A. */ /* BBNRM (output) DOUBLE PRECISION */ /* The one-norm of the balanced matrix B. */ /* RCONDE (output) DOUBLE PRECISION array, dimension (N) */ /* If SENSE = 'E' or 'B', the reciprocal condition numbers of */ /* the eigenvalues, stored in consecutive elements of the array. */ /* For a complex conjugate pair of eigenvalues two consecutive */ /* elements of RCONDE are set to the same value. Thus RCONDE(j), */ /* RCONDV(j), and the j-th columns of VL and VR all correspond */ /* to the j-th eigenpair. */ /* If SENSE = 'N or 'V', RCONDE is not referenced. */ /* RCONDV (output) DOUBLE PRECISION array, dimension (N) */ /* If SENSE = 'V' or 'B', the estimated reciprocal condition */ /* numbers of the eigenvectors, stored in consecutive elements */ /* of the array. For a complex eigenvector two consecutive */ /* elements of RCONDV are set to the same value. If the */ /* eigenvalues cannot be reordered to compute RCONDV(j), */ /* RCONDV(j) is set to 0; this can only occur when the true */ /* value would be very small anyway. */ /* If SENSE = 'N' or 'E', RCONDV is not referenced. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,2*N). */ /* If BALANC = 'S' or 'B', or JOBVL = 'V', or JOBVR = 'V', */ /* LWORK >= max(1,6*N). */ /* If SENSE = 'E' or 'B', LWORK >= max(1,10*N). */ /* If SENSE = 'V' or 'B', LWORK >= 2*N*N+8*N+16. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (N+6) */ /* If SENSE = 'E', IWORK is not referenced. */ /* BWORK (workspace) LOGICAL array, dimension (N) */ /* If SENSE = 'N', BWORK is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1,...,N: */ /* The QZ iteration failed. No eigenvectors have been */ /* calculated, but ALPHAR(j), ALPHAI(j), and BETA(j) */ /* should be correct for j=INFO+1,...,N. */ /* > N: =N+1: other than QZ iteration failed in DHGEQZ. */ /* =N+2: error return from DTGEVC. */ /* Further Details */ /* =============== */ /* Balancing a matrix pair (A,B) includes, first, permuting rows and */ /* columns to isolate eigenvalues, second, applying diagonal similarity */ /* transformation to the rows and columns to make the rows and columns */ /* as close in norm as possible. The computed reciprocal condition */ /* numbers correspond to the balanced matrix. Permuting rows and columns */ /* will not change the condition numbers (in exact arithmetic) but */ /* diagonal scaling will. For further explanation of balancing, see */ /* section 4.11.1.2 of LAPACK Users' Guide. */ /* An approximate error bound on the chordal distance between the i-th */ /* computed generalized eigenvalue w and the corresponding exact */ /* eigenvalue lambda is */ /* chord(w, lambda) <= EPS * norm(ABNRM, BBNRM) / RCONDE(I) */ /* An approximate error bound for the angle between the i-th computed */ /* eigenvector VL(i) or VR(i) is given by */ /* EPS * norm(ABNRM, BBNRM) / DIF(i). */ /* For further explanation of the reciprocal condition numbers RCONDE */ /* and RCONDV, see section 4.11 of LAPACK User's Guide. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --lscale; --rscale; --rconde; --rcondv; --work; --iwork; --bwork; /* Function Body */ if (_starpu_lsame_(jobvl, "N")) { ijobvl = 1; ilvl = FALSE_; } else if (_starpu_lsame_(jobvl, "V")) { ijobvl = 2; ilvl = TRUE_; } else { ijobvl = -1; ilvl = FALSE_; } if (_starpu_lsame_(jobvr, "N")) { ijobvr = 1; ilvr = FALSE_; } else if (_starpu_lsame_(jobvr, "V")) { ijobvr = 2; ilvr = TRUE_; } else { ijobvr = -1; ilvr = FALSE_; } ilv = ilvl || ilvr; noscl = _starpu_lsame_(balanc, "N") || _starpu_lsame_(balanc, "P"); wantsn = _starpu_lsame_(sense, "N"); wantse = _starpu_lsame_(sense, "E"); wantsv = _starpu_lsame_(sense, "V"); wantsb = _starpu_lsame_(sense, "B"); /* Test the input arguments */ *info = 0; lquery = *lwork == -1; if (! (_starpu_lsame_(balanc, "N") || _starpu_lsame_(balanc, "S") || _starpu_lsame_(balanc, "P") || _starpu_lsame_(balanc, "B"))) { *info = -1; } else if (ijobvl <= 0) { *info = -2; } else if (ijobvr <= 0) { *info = -3; } else if (! (wantsn || wantse || wantsb || wantsv)) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldvl < 1 || ilvl && *ldvl < *n) { *info = -14; } else if (*ldvr < 1 || ilvr && *ldvr < *n) { *info = -16; } /* Compute workspace */ /* (Note: Comments in the code beginning "Workspace:" describe the */ /* minimal amount of workspace needed at that point in the code, */ /* as well as the preferred amount for good performance. */ /* NB refers to the optimal block size for the immediately */ /* following subroutine, as returned by ILAENV. The workspace is */ /* computed assuming ILO = 1 and IHI = N, the worst case.) */ if (*info == 0) { if (*n == 0) { minwrk = 1; maxwrk = 1; } else { if (noscl && ! ilv) { minwrk = *n << 1; } else { minwrk = *n * 6; } if (wantse || wantsb) { minwrk = *n * 10; } if (wantsv || wantsb) { /* Computing MAX */ i__1 = minwrk, i__2 = (*n << 1) * (*n + 4) + 16; minwrk = max(i__1,i__2); } maxwrk = minwrk; /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, & c__1, n, &c__0); maxwrk = max(i__1,i__2); /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DORMQR", " ", n, & c__1, n, &c__0); maxwrk = max(i__1,i__2); if (ilvl) { /* Computing MAX */ i__1 = maxwrk, i__2 = *n + *n * _starpu_ilaenv_(&c__1, "DORGQR", " ", n, &c__1, n, &c__0); maxwrk = max(i__1,i__2); } } work[1] = (doublereal) maxwrk; if (*lwork < minwrk && ! lquery) { *info = -26; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGEVX", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = sqrt(smlnum) / eps; bignum = 1. / smlnum; /* Scale A if max element outside range [SMLNUM,BIGNUM] */ anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]); ilascl = FALSE_; if (anrm > 0. && anrm < smlnum) { anrmto = smlnum; ilascl = TRUE_; } else if (anrm > bignum) { anrmto = bignum; ilascl = TRUE_; } if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrm, &anrmto, n, n, &a[a_offset], lda, & ierr); } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]); ilbscl = FALSE_; if (bnrm > 0. && bnrm < smlnum) { bnrmto = smlnum; ilbscl = TRUE_; } else if (bnrm > bignum) { bnrmto = bignum; ilbscl = TRUE_; } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrm, &bnrmto, n, n, &b[b_offset], ldb, & ierr); } /* Permute and/or balance the matrix pair (A,B) */ /* (Workspace: need 6*N if BALANC = 'S' or 'B', 1 otherwise) */ _starpu_dggbal_(balanc, n, &a[a_offset], lda, &b[b_offset], ldb, ilo, ihi, & lscale[1], &rscale[1], &work[1], &ierr); /* Compute ABNRM and BBNRM */ *abnrm = _starpu_dlange_("1", n, n, &a[a_offset], lda, &work[1]); if (ilascl) { work[1] = *abnrm; _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, &c__1, &c__1, &work[1], & c__1, &ierr); *abnrm = work[1]; } *bbnrm = _starpu_dlange_("1", n, n, &b[b_offset], ldb, &work[1]); if (ilbscl) { work[1] = *bbnrm; _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, &c__1, &c__1, &work[1], & c__1, &ierr); *bbnrm = work[1]; } /* Reduce B to triangular form (QR decomposition of B) */ /* (Workspace: need N, prefer N*NB ) */ irows = *ihi + 1 - *ilo; if (ilv || ! wantsn) { icols = *n + 1 - *ilo; } else { icols = irows; } itau = 1; iwrk = itau + irows; i__1 = *lwork + 1 - iwrk; _starpu_dgeqrf_(&irows, &icols, &b[*ilo + *ilo * b_dim1], ldb, &work[itau], &work[ iwrk], &i__1, &ierr); /* Apply the orthogonal transformation to A */ /* (Workspace: need N, prefer N*NB) */ i__1 = *lwork + 1 - iwrk; _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[*ilo + *ilo * b_dim1], ldb, & work[itau], &a[*ilo + *ilo * a_dim1], lda, &work[iwrk], &i__1, & ierr); /* Initialize VL and/or VR */ /* (Workspace: need N, prefer N*NB) */ if (ilvl) { _starpu_dlaset_("Full", n, n, &c_b59, &c_b60, &vl[vl_offset], ldvl) ; if (irows > 1) { i__1 = irows - 1; i__2 = irows - 1; _starpu_dlacpy_("L", &i__1, &i__2, &b[*ilo + 1 + *ilo * b_dim1], ldb, &vl[ *ilo + 1 + *ilo * vl_dim1], ldvl); } i__1 = *lwork + 1 - iwrk; _starpu_dorgqr_(&irows, &irows, &irows, &vl[*ilo + *ilo * vl_dim1], ldvl, & work[itau], &work[iwrk], &i__1, &ierr); } if (ilvr) { _starpu_dlaset_("Full", n, n, &c_b59, &c_b60, &vr[vr_offset], ldvr) ; } /* Reduce to generalized Hessenberg form */ /* (Workspace: none needed) */ if (ilv || ! wantsn) { /* Eigenvectors requested -- work on whole matrix. */ _starpu_dgghrd_(jobvl, jobvr, n, ilo, ihi, &a[a_offset], lda, &b[b_offset], ldb, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, &ierr); } else { _starpu_dgghrd_("N", "N", &irows, &c__1, &irows, &a[*ilo + *ilo * a_dim1], lda, &b[*ilo + *ilo * b_dim1], ldb, &vl[vl_offset], ldvl, &vr[ vr_offset], ldvr, &ierr); } /* Perform QZ algorithm (Compute eigenvalues, and optionally, the */ /* Schur forms and Schur vectors) */ /* (Workspace: need N) */ if (ilv || ! wantsn) { *(unsigned char *)chtemp = 'S'; } else { *(unsigned char *)chtemp = 'E'; } _starpu_dhgeqz_(chtemp, jobvl, jobvr, n, ilo, ihi, &a[a_offset], lda, &b[b_offset] , ldb, &alphar[1], &alphai[1], &beta[1], &vl[vl_offset], ldvl, & vr[vr_offset], ldvr, &work[1], lwork, &ierr); if (ierr != 0) { if (ierr > 0 && ierr <= *n) { *info = ierr; } else if (ierr > *n && ierr <= *n << 1) { *info = ierr - *n; } else { *info = *n + 1; } goto L130; } /* Compute Eigenvectors and estimate condition numbers if desired */ /* (Workspace: DTGEVC: need 6*N */ /* DTGSNA: need 2*N*(N+2)+16 if SENSE = 'V' or 'B', */ /* need N otherwise ) */ if (ilv || ! wantsn) { if (ilv) { if (ilvl) { if (ilvr) { *(unsigned char *)chtemp = 'B'; } else { *(unsigned char *)chtemp = 'L'; } } else { *(unsigned char *)chtemp = 'R'; } _starpu_dtgevc_(chtemp, "B", ldumma, n, &a[a_offset], lda, &b[b_offset], ldb, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, n, &in, & work[1], &ierr); if (ierr != 0) { *info = *n + 2; goto L130; } } if (! wantsn) { /* compute eigenvectors (DTGEVC) and estimate condition */ /* numbers (DTGSNA). Note that the definition of the condition */ /* number is not invariant under transformation (u,v) to */ /* (Q*u, Z*v), where (u,v) are eigenvectors of the generalized */ /* Schur form (S,T), Q and Z are orthogonal matrices. In order */ /* to avoid using extra 2*N*N workspace, we have to recalculate */ /* eigenvectors and estimate one condition numbers at a time. */ pair = FALSE_; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (pair) { pair = FALSE_; goto L20; } mm = 1; if (i__ < *n) { if (a[i__ + 1 + i__ * a_dim1] != 0.) { pair = TRUE_; mm = 2; } } i__2 = *n; for (j = 1; j <= i__2; ++j) { bwork[j] = FALSE_; /* L10: */ } if (mm == 1) { bwork[i__] = TRUE_; } else if (mm == 2) { bwork[i__] = TRUE_; bwork[i__ + 1] = TRUE_; } iwrk = mm * *n + 1; iwrk1 = iwrk + mm * *n; /* Compute a pair of left and right eigenvectors. */ /* (compute workspace: need up to 4*N + 6*N) */ if (wantse || wantsb) { _starpu_dtgevc_("B", "S", &bwork[1], n, &a[a_offset], lda, &b[ b_offset], ldb, &work[1], n, &work[iwrk], n, &mm, &m, &work[iwrk1], &ierr); if (ierr != 0) { *info = *n + 2; goto L130; } } i__2 = *lwork - iwrk1 + 1; _starpu_dtgsna_(sense, "S", &bwork[1], n, &a[a_offset], lda, &b[ b_offset], ldb, &work[1], n, &work[iwrk], n, &rconde[ i__], &rcondv[i__], &mm, &m, &work[iwrk1], &i__2, & iwork[1], &ierr); L20: ; } } } /* Undo balancing on VL and VR and normalization */ /* (Workspace: none needed) */ if (ilvl) { _starpu_dggbak_(balanc, "L", n, ilo, ihi, &lscale[1], &rscale[1], n, &vl[ vl_offset], ldvl, &ierr); i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { if (alphai[jc] < 0.) { goto L70; } temp = 0.; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__2 = temp, d__3 = (d__1 = vl[jr + jc * vl_dim1], abs( d__1)); temp = max(d__2,d__3); /* L30: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__3 = temp, d__4 = (d__1 = vl[jr + jc * vl_dim1], abs( d__1)) + (d__2 = vl[jr + (jc + 1) * vl_dim1], abs( d__2)); temp = max(d__3,d__4); /* L40: */ } } if (temp < smlnum) { goto L70; } temp = 1. / temp; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + jc * vl_dim1] *= temp; /* L50: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + jc * vl_dim1] *= temp; vl[jr + (jc + 1) * vl_dim1] *= temp; /* L60: */ } } L70: ; } } if (ilvr) { _starpu_dggbak_(balanc, "R", n, ilo, ihi, &lscale[1], &rscale[1], n, &vr[ vr_offset], ldvr, &ierr); i__1 = *n; for (jc = 1; jc <= i__1; ++jc) { if (alphai[jc] < 0.) { goto L120; } temp = 0.; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__2 = temp, d__3 = (d__1 = vr[jr + jc * vr_dim1], abs( d__1)); temp = max(d__2,d__3); /* L80: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { /* Computing MAX */ d__3 = temp, d__4 = (d__1 = vr[jr + jc * vr_dim1], abs( d__1)) + (d__2 = vr[jr + (jc + 1) * vr_dim1], abs( d__2)); temp = max(d__3,d__4); /* L90: */ } } if (temp < smlnum) { goto L120; } temp = 1. / temp; if (alphai[jc] == 0.) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + jc * vr_dim1] *= temp; /* L100: */ } } else { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + jc * vr_dim1] *= temp; vr[jr + (jc + 1) * vr_dim1] *= temp; /* L110: */ } } L120: ; } } /* Undo scaling if necessary */ if (ilascl) { _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphar[1], n, & ierr); _starpu_dlascl_("G", &c__0, &c__0, &anrmto, &anrm, n, &c__1, &alphai[1], n, & ierr); } if (ilbscl) { _starpu_dlascl_("G", &c__0, &c__0, &bnrmto, &bnrm, n, &c__1, &beta[1], n, & ierr); } L130: work[1] = (doublereal) maxwrk; return 0; /* End of DGGEVX */ } /* _starpu_dggevx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggglm.c000066400000000000000000000250721413463044200206150ustar00rootroot00000000000000/* dggglm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b32 = -1.; static doublereal c_b34 = 1.; /* Subroutine */ int _starpu_dggglm_(integer *n, integer *m, integer *p, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *d__, doublereal *x, doublereal *y, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, nb, np, nb1, nb2, nb3, nb4, lopt; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dggqrf_( integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer lwkmin; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dormrq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; extern /* Subroutine */ int _starpu_dtrtrs_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGGLM solves a general Gauss-Markov linear model (GLM) problem: */ /* minimize || y ||_2 subject to d = A*x + B*y */ /* x */ /* where A is an N-by-M matrix, B is an N-by-P matrix, and d is a */ /* given N-vector. It is assumed that M <= N <= M+P, and */ /* rank(A) = M and rank( A B ) = N. */ /* Under these assumptions, the constrained equation is always */ /* consistent, and there is a unique solution x and a minimal 2-norm */ /* solution y, which is obtained using a generalized QR factorization */ /* of the matrices (A, B) given by */ /* A = Q*(R), B = Q*T*Z. */ /* (0) */ /* In particular, if matrix B is square nonsingular, then the problem */ /* GLM is equivalent to the following weighted linear least squares */ /* problem */ /* minimize || inv(B)*(d-A*x) ||_2 */ /* x */ /* where inv(B) denotes the inverse of B. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of rows of the matrices A and B. N >= 0. */ /* M (input) INTEGER */ /* The number of columns of the matrix A. 0 <= M <= N. */ /* P (input) INTEGER */ /* The number of columns of the matrix B. P >= N-M. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,M) */ /* On entry, the N-by-M matrix A. */ /* On exit, the upper triangular part of the array A contains */ /* the M-by-M upper triangular matrix R. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,P) */ /* On entry, the N-by-P matrix B. */ /* On exit, if N <= P, the upper triangle of the subarray */ /* B(1:N,P-N+1:P) contains the N-by-N upper triangular matrix T; */ /* if N > P, the elements on and above the (N-P)th subdiagonal */ /* contain the N-by-P upper trapezoidal matrix T. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, D is the left hand side of the GLM equation. */ /* On exit, D is destroyed. */ /* X (output) DOUBLE PRECISION array, dimension (M) */ /* Y (output) DOUBLE PRECISION array, dimension (P) */ /* On exit, X and Y are the solutions of the GLM problem. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N+M+P). */ /* For optimum performance, LWORK >= M+min(N,P)+max(N,P)*NB, */ /* where NB is an upper bound for the optimal blocksizes for */ /* DGEQRF, SGERQF, DORMQR and SORMRQ. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1: the upper triangular factor R associated with A in the */ /* generalized QR factorization of the pair (A, B) is */ /* singular, so that rank(A) < M; the least squares */ /* solution could not be computed. */ /* = 2: the bottom (N-M) by (N-M) part of the upper trapezoidal */ /* factor T associated with B in the generalized QR */ /* factorization of the pair (A, B) is singular, so that */ /* rank( A B ) < N; the least squares solution could not */ /* be computed. */ /* =================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --d__; --x; --y; --work; /* Function Body */ *info = 0; np = min(*n,*p); lquery = *lwork == -1; if (*n < 0) { *info = -1; } else if (*m < 0 || *m > *n) { *info = -2; } else if (*p < 0 || *p < *n - *m) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } /* Calculate workspace */ if (*info == 0) { if (*n == 0) { lwkmin = 1; lwkopt = 1; } else { nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, m, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DGERQF", " ", n, m, &c_n1, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORMQR", " ", n, m, p, &c_n1); nb4 = _starpu_ilaenv_(&c__1, "DORMRQ", " ", n, m, p, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2), i__1 = max(i__1,nb3); nb = max(i__1,nb4); lwkmin = *m + *n + *p; lwkopt = *m + np + max(*n,*p) * nb; } work[1] = (doublereal) lwkopt; if (*lwork < lwkmin && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGGLM", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Compute the GQR factorization of matrices A and B: */ /* Q'*A = ( R11 ) M, Q'*B*Z' = ( T11 T12 ) M */ /* ( 0 ) N-M ( 0 T22 ) N-M */ /* M M+P-N N-M */ /* where R11 and T22 are upper triangular, and Q and Z are */ /* orthogonal. */ i__1 = *lwork - *m - np; _starpu_dggqrf_(n, m, p, &a[a_offset], lda, &work[1], &b[b_offset], ldb, &work[*m + 1], &work[*m + np + 1], &i__1, info); lopt = (integer) work[*m + np + 1]; /* Update left-hand-side vector d = Q'*d = ( d1 ) M */ /* ( d2 ) N-M */ i__1 = max(1,*n); i__2 = *lwork - *m - np; _starpu_dormqr_("Left", "Transpose", n, &c__1, m, &a[a_offset], lda, &work[1], & d__[1], &i__1, &work[*m + np + 1], &i__2, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[*m + np + 1]; lopt = max(i__1,i__2); /* Solve T22*y2 = d2 for y2 */ if (*n > *m) { i__1 = *n - *m; i__2 = *n - *m; _starpu_dtrtrs_("Upper", "No transpose", "Non unit", &i__1, &c__1, &b[*m + 1 + (*m + *p - *n + 1) * b_dim1], ldb, &d__[*m + 1], &i__2, info); if (*info > 0) { *info = 1; return 0; } i__1 = *n - *m; _starpu_dcopy_(&i__1, &d__[*m + 1], &c__1, &y[*m + *p - *n + 1], &c__1); } /* Set y1 = 0 */ i__1 = *m + *p - *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; /* L10: */ } /* Update d1 = d1 - T12*y2 */ i__1 = *n - *m; _starpu_dgemv_("No transpose", m, &i__1, &c_b32, &b[(*m + *p - *n + 1) * b_dim1 + 1], ldb, &y[*m + *p - *n + 1], &c__1, &c_b34, &d__[1], &c__1); /* Solve triangular system: R11*x = d1 */ if (*m > 0) { _starpu_dtrtrs_("Upper", "No Transpose", "Non unit", m, &c__1, &a[a_offset], lda, &d__[1], m, info); if (*info > 0) { *info = 2; return 0; } /* Copy D to X */ _starpu_dcopy_(m, &d__[1], &c__1, &x[1], &c__1); } /* Backward transformation y = Z'*y */ /* Computing MAX */ i__1 = 1, i__2 = *n - *p + 1; i__3 = max(1,*p); i__4 = *lwork - *m - np; _starpu_dormrq_("Left", "Transpose", p, &c__1, &np, &b[max(i__1, i__2)+ b_dim1], ldb, &work[*m + 1], &y[1], &i__3, &work[*m + np + 1], &i__4, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[*m + np + 1]; work[1] = (doublereal) (*m + np + max(i__1,i__2)); return 0; /* End of DGGGLM */ } /* _starpu_dggglm_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgghrd.c000066400000000000000000000242671413463044200206200ustar00rootroot00000000000000/* dgghrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b10 = 0.; static doublereal c_b11 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dgghrd_(char *compq, char *compz, integer *n, integer * ilo, integer *ihi, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *q, integer *ldq, doublereal *z__, integer * ldz, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, z_dim1, z_offset, i__1, i__2, i__3; /* Local variables */ doublereal c__, s; logical ilq, ilz; integer jcol; doublereal temp; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer jrow; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *); integer icompq, icompz; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGHRD reduces a pair of real matrices (A,B) to generalized upper */ /* Hessenberg form using orthogonal transformations, where A is a */ /* general matrix and B is upper triangular. The form of the */ /* generalized eigenvalue problem is */ /* A*x = lambda*B*x, */ /* and B is typically made upper triangular by computing its QR */ /* factorization and moving the orthogonal matrix Q to the left side */ /* of the equation. */ /* This subroutine simultaneously reduces A to a Hessenberg matrix H: */ /* Q**T*A*Z = H */ /* and transforms B to another upper triangular matrix T: */ /* Q**T*B*Z = T */ /* in order to reduce the problem to its standard form */ /* H*y = lambda*T*y */ /* where y = Z**T*x. */ /* The orthogonal matrices Q and Z are determined as products of Givens */ /* rotations. They may either be formed explicitly, or they may be */ /* postmultiplied into input matrices Q1 and Z1, so that */ /* Q1 * A * Z1**T = (Q1*Q) * H * (Z1*Z)**T */ /* Q1 * B * Z1**T = (Q1*Q) * T * (Z1*Z)**T */ /* If Q1 is the orthogonal matrix from the QR factorization of B in the */ /* original equation A*x = lambda*B*x, then DGGHRD reduces the original */ /* problem to generalized Hessenberg form. */ /* Arguments */ /* ========= */ /* COMPQ (input) CHARACTER*1 */ /* = 'N': do not compute Q; */ /* = 'I': Q is initialized to the unit matrix, and the */ /* orthogonal matrix Q is returned; */ /* = 'V': Q must contain an orthogonal matrix Q1 on entry, */ /* and the product Q1*Q is returned. */ /* COMPZ (input) CHARACTER*1 */ /* = 'N': do not compute Z; */ /* = 'I': Z is initialized to the unit matrix, and the */ /* orthogonal matrix Z is returned; */ /* = 'V': Z must contain an orthogonal matrix Z1 on entry, */ /* and the product Z1*Z is returned. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* ILO and IHI mark the rows and columns of A which are to be */ /* reduced. It is assumed that A is already upper triangular */ /* in rows and columns 1:ILO-1 and IHI+1:N. ILO and IHI are */ /* normally set by a previous call to SGGBAL; otherwise they */ /* should be set to 1 and N respectively. */ /* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the N-by-N general matrix to be reduced. */ /* On exit, the upper triangle and the first subdiagonal of A */ /* are overwritten with the upper Hessenberg matrix H, and the */ /* rest is set to zero. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the N-by-N upper triangular matrix B. */ /* On exit, the upper triangular matrix T = Q**T B Z. The */ /* elements below the diagonal are set to zero. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* On entry, if COMPQ = 'V', the orthogonal matrix Q1, */ /* typically from the QR factorization of B. */ /* On exit, if COMPQ='I', the orthogonal matrix Q, and if */ /* COMPQ = 'V', the product Q1*Q. */ /* Not referenced if COMPQ='N'. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. */ /* LDQ >= N if COMPQ='V' or 'I'; LDQ >= 1 otherwise. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* On entry, if COMPZ = 'V', the orthogonal matrix Z1. */ /* On exit, if COMPZ='I', the orthogonal matrix Z, and if */ /* COMPZ = 'V', the product Z1*Z. */ /* Not referenced if COMPZ='N'. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. */ /* LDZ >= N if COMPZ='V' or 'I'; LDZ >= 1 otherwise. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* This routine reduces A to Hessenberg and B to triangular form by */ /* an unblocked reduction, as described in _Matrix_Computations_, */ /* by Golub and Van Loan (Johns Hopkins Press.) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode COMPQ */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; /* Function Body */ if (_starpu_lsame_(compq, "N")) { ilq = FALSE_; icompq = 1; } else if (_starpu_lsame_(compq, "V")) { ilq = TRUE_; icompq = 2; } else if (_starpu_lsame_(compq, "I")) { ilq = TRUE_; icompq = 3; } else { icompq = 0; } /* Decode COMPZ */ if (_starpu_lsame_(compz, "N")) { ilz = FALSE_; icompz = 1; } else if (_starpu_lsame_(compz, "V")) { ilz = TRUE_; icompz = 2; } else if (_starpu_lsame_(compz, "I")) { ilz = TRUE_; icompz = 3; } else { icompz = 0; } /* Test the input parameters. */ *info = 0; if (icompq <= 0) { *info = -1; } else if (icompz <= 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ilo < 1) { *info = -4; } else if (*ihi > *n || *ihi < *ilo - 1) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (ilq && *ldq < *n || *ldq < 1) { *info = -11; } else if (ilz && *ldz < *n || *ldz < 1) { *info = -13; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGHRD", &i__1); return 0; } /* Initialize Q and Z if desired. */ if (icompq == 3) { _starpu_dlaset_("Full", n, n, &c_b10, &c_b11, &q[q_offset], ldq); } if (icompz == 3) { _starpu_dlaset_("Full", n, n, &c_b10, &c_b11, &z__[z_offset], ldz); } /* Quick return if possible */ if (*n <= 1) { return 0; } /* Zero out lower triangle of B */ i__1 = *n - 1; for (jcol = 1; jcol <= i__1; ++jcol) { i__2 = *n; for (jrow = jcol + 1; jrow <= i__2; ++jrow) { b[jrow + jcol * b_dim1] = 0.; /* L10: */ } /* L20: */ } /* Reduce A and B */ i__1 = *ihi - 2; for (jcol = *ilo; jcol <= i__1; ++jcol) { i__2 = jcol + 2; for (jrow = *ihi; jrow >= i__2; --jrow) { /* Step 1: rotate rows JROW-1, JROW to kill A(JROW,JCOL) */ temp = a[jrow - 1 + jcol * a_dim1]; _starpu_dlartg_(&temp, &a[jrow + jcol * a_dim1], &c__, &s, &a[jrow - 1 + jcol * a_dim1]); a[jrow + jcol * a_dim1] = 0.; i__3 = *n - jcol; _starpu_drot_(&i__3, &a[jrow - 1 + (jcol + 1) * a_dim1], lda, &a[jrow + ( jcol + 1) * a_dim1], lda, &c__, &s); i__3 = *n + 2 - jrow; _starpu_drot_(&i__3, &b[jrow - 1 + (jrow - 1) * b_dim1], ldb, &b[jrow + ( jrow - 1) * b_dim1], ldb, &c__, &s); if (ilq) { _starpu_drot_(n, &q[(jrow - 1) * q_dim1 + 1], &c__1, &q[jrow * q_dim1 + 1], &c__1, &c__, &s); } /* Step 2: rotate columns JROW, JROW-1 to kill B(JROW,JROW-1) */ temp = b[jrow + jrow * b_dim1]; _starpu_dlartg_(&temp, &b[jrow + (jrow - 1) * b_dim1], &c__, &s, &b[jrow + jrow * b_dim1]); b[jrow + (jrow - 1) * b_dim1] = 0.; _starpu_drot_(ihi, &a[jrow * a_dim1 + 1], &c__1, &a[(jrow - 1) * a_dim1 + 1], &c__1, &c__, &s); i__3 = jrow - 1; _starpu_drot_(&i__3, &b[jrow * b_dim1 + 1], &c__1, &b[(jrow - 1) * b_dim1 + 1], &c__1, &c__, &s); if (ilz) { _starpu_drot_(n, &z__[jrow * z_dim1 + 1], &c__1, &z__[(jrow - 1) * z_dim1 + 1], &c__1, &c__, &s); } /* L30: */ } /* L40: */ } return 0; /* End of DGGHRD */ } /* _starpu_dgghrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgglse.c000066400000000000000000000256431413463044200206250ustar00rootroot00000000000000/* dgglse.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b31 = -1.; static doublereal c_b33 = 1.; /* Subroutine */ int _starpu_dgglse_(integer *m, integer *n, integer *p, doublereal * a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, doublereal *d__, doublereal *x, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer nb, mn, nr, nb1, nb2, nb3, nb4, lopt; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *) , _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dggrqf_( integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer lwkmin; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dormrq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; extern /* Subroutine */ int _starpu_dtrtrs_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGLSE solves the linear equality-constrained least squares (LSE) */ /* problem: */ /* minimize || c - A*x ||_2 subject to B*x = d */ /* where A is an M-by-N matrix, B is a P-by-N matrix, c is a given */ /* M-vector, and d is a given P-vector. It is assumed that */ /* P <= N <= M+P, and */ /* rank(B) = P and rank( (A) ) = N. */ /* ( (B) ) */ /* These conditions ensure that the LSE problem has a unique solution, */ /* which is obtained using a generalized RQ factorization of the */ /* matrices (B, A) given by */ /* B = (0 R)*Q, A = Z*T*Q. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrices A and B. N >= 0. */ /* P (input) INTEGER */ /* The number of rows of the matrix B. 0 <= P <= N <= M+P. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(M,N)-by-N upper trapezoidal matrix T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the P-by-N matrix B. */ /* On exit, the upper triangle of the subarray B(1:P,N-P+1:N) */ /* contains the P-by-P upper triangular matrix R. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,P). */ /* C (input/output) DOUBLE PRECISION array, dimension (M) */ /* On entry, C contains the right hand side vector for the */ /* least squares part of the LSE problem. */ /* On exit, the residual sum of squares for the solution */ /* is given by the sum of squares of elements N-P+1 to M of */ /* vector C. */ /* D (input/output) DOUBLE PRECISION array, dimension (P) */ /* On entry, D contains the right hand side vector for the */ /* constrained equation. */ /* On exit, D is destroyed. */ /* X (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, X is the solution of the LSE problem. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M+N+P). */ /* For optimum performance LWORK >= P+min(M,N)+max(M,N)*NB, */ /* where NB is an upper bound for the optimal blocksizes for */ /* DGEQRF, SGERQF, DORMQR and SORMRQ. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1: the upper triangular factor R associated with B in the */ /* generalized RQ factorization of the pair (B, A) is */ /* singular, so that rank(B) < P; the least squares */ /* solution could not be computed. */ /* = 2: the (N-P) by (N-P) part of the upper trapezoidal factor */ /* T associated with A in the generalized RQ factorization */ /* of the pair (B, A) is singular, so that */ /* rank( (A) ) < N; the least squares solution could not */ /* ( (B) ) */ /* be computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --c__; --d__; --x; --work; /* Function Body */ *info = 0; mn = min(*m,*n); lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*p < 0 || *p > *n || *p < *n - *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*ldb < max(1,*p)) { *info = -7; } /* Calculate workspace */ if (*info == 0) { if (*n == 0) { lwkmin = 1; lwkopt = 1; } else { nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DGERQF", " ", m, n, &c_n1, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORMQR", " ", m, n, p, &c_n1); nb4 = _starpu_ilaenv_(&c__1, "DORMRQ", " ", m, n, p, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2), i__1 = max(i__1,nb3); nb = max(i__1,nb4); lwkmin = *m + *n + *p; lwkopt = *p + mn + max(*m,*n) * nb; } work[1] = (doublereal) lwkopt; if (*lwork < lwkmin && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGLSE", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Compute the GRQ factorization of matrices B and A: */ /* B*Q' = ( 0 T12 ) P Z'*A*Q' = ( R11 R12 ) N-P */ /* N-P P ( 0 R22 ) M+P-N */ /* N-P P */ /* where T12 and R11 are upper triangular, and Q and Z are */ /* orthogonal. */ i__1 = *lwork - *p - mn; _starpu_dggrqf_(p, m, n, &b[b_offset], ldb, &work[1], &a[a_offset], lda, &work[*p + 1], &work[*p + mn + 1], &i__1, info); lopt = (integer) work[*p + mn + 1]; /* Update c = Z'*c = ( c1 ) N-P */ /* ( c2 ) M+P-N */ i__1 = max(1,*m); i__2 = *lwork - *p - mn; _starpu_dormqr_("Left", "Transpose", m, &c__1, &mn, &a[a_offset], lda, &work[*p + 1], &c__[1], &i__1, &work[*p + mn + 1], &i__2, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[*p + mn + 1]; lopt = max(i__1,i__2); /* Solve T12*x2 = d for x2 */ if (*p > 0) { _starpu_dtrtrs_("Upper", "No transpose", "Non-unit", p, &c__1, &b[(*n - *p + 1) * b_dim1 + 1], ldb, &d__[1], p, info); if (*info > 0) { *info = 1; return 0; } /* Put the solution in X */ _starpu_dcopy_(p, &d__[1], &c__1, &x[*n - *p + 1], &c__1); /* Update c1 */ i__1 = *n - *p; _starpu_dgemv_("No transpose", &i__1, p, &c_b31, &a[(*n - *p + 1) * a_dim1 + 1], lda, &d__[1], &c__1, &c_b33, &c__[1], &c__1); } /* Solve R11*x1 = c1 for x1 */ if (*n > *p) { i__1 = *n - *p; i__2 = *n - *p; _starpu_dtrtrs_("Upper", "No transpose", "Non-unit", &i__1, &c__1, &a[ a_offset], lda, &c__[1], &i__2, info); if (*info > 0) { *info = 2; return 0; } /* Put the solutions in X */ i__1 = *n - *p; _starpu_dcopy_(&i__1, &c__[1], &c__1, &x[1], &c__1); } /* Compute the residual vector: */ if (*m < *n) { nr = *m + *p - *n; if (nr > 0) { i__1 = *n - *m; _starpu_dgemv_("No transpose", &nr, &i__1, &c_b31, &a[*n - *p + 1 + (*m + 1) * a_dim1], lda, &d__[nr + 1], &c__1, &c_b33, &c__[*n - *p + 1], &c__1); } } else { nr = *p; } if (nr > 0) { _starpu_dtrmv_("Upper", "No transpose", "Non unit", &nr, &a[*n - *p + 1 + (*n - *p + 1) * a_dim1], lda, &d__[1], &c__1); _starpu_daxpy_(&nr, &c_b31, &d__[1], &c__1, &c__[*n - *p + 1], &c__1); } /* Backward transformation x = Q'*x */ i__1 = *lwork - *p - mn; _starpu_dormrq_("Left", "Transpose", n, &c__1, p, &b[b_offset], ldb, &work[1], &x[ 1], n, &work[*p + mn + 1], &i__1, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[*p + mn + 1]; work[1] = (doublereal) (*p + mn + max(i__1,i__2)); return 0; /* End of DGGLSE */ } /* _starpu_dgglse_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggqrf.c000066400000000000000000000222131413463044200206200ustar00rootroot00000000000000/* dggqrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dggqrf_(integer *n, integer *m, integer *p, doublereal * a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, doublereal *taub, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer nb, nb1, nb2, nb3, lopt; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dgerqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGQRF computes a generalized QR factorization of an N-by-M matrix A */ /* and an N-by-P matrix B: */ /* A = Q*R, B = Q*T*Z, */ /* where Q is an N-by-N orthogonal matrix, Z is a P-by-P orthogonal */ /* matrix, and R and T assume one of the forms: */ /* if N >= M, R = ( R11 ) M , or if N < M, R = ( R11 R12 ) N, */ /* ( 0 ) N-M N M-N */ /* M */ /* where R11 is upper triangular, and */ /* if N <= P, T = ( 0 T12 ) N, or if N > P, T = ( T11 ) N-P, */ /* P-N N ( T21 ) P */ /* P */ /* where T12 or T21 is upper triangular. */ /* In particular, if B is square and nonsingular, the GQR factorization */ /* of A and B implicitly gives the QR factorization of inv(B)*A: */ /* inv(B)*A = Z'*(inv(T)*R) */ /* where inv(B) denotes the inverse of the matrix B, and Z' denotes the */ /* transpose of the matrix Z. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of rows of the matrices A and B. N >= 0. */ /* M (input) INTEGER */ /* The number of columns of the matrix A. M >= 0. */ /* P (input) INTEGER */ /* The number of columns of the matrix B. P >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,M) */ /* On entry, the N-by-M matrix A. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(N,M)-by-M upper trapezoidal matrix R (R is */ /* upper triangular if N >= M); the elements below the diagonal, */ /* with the array TAUA, represent the orthogonal matrix Q as a */ /* product of min(N,M) elementary reflectors (see Further */ /* Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAUA (output) DOUBLE PRECISION array, dimension (min(N,M)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Q (see Further Details). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,P) */ /* On entry, the N-by-P matrix B. */ /* On exit, if N <= P, the upper triangle of the subarray */ /* B(1:N,P-N+1:P) contains the N-by-N upper triangular matrix T; */ /* if N > P, the elements on and above the (N-P)-th subdiagonal */ /* contain the N-by-P upper trapezoidal matrix T; the remaining */ /* elements, with the array TAUB, represent the orthogonal */ /* matrix Z as a product of elementary reflectors (see Further */ /* Details). */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* TAUB (output) DOUBLE PRECISION array, dimension (min(N,P)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Z (see Further Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N,M,P). */ /* For optimum performance LWORK >= max(N,M,P)*max(NB1,NB2,NB3), */ /* where NB1 is the optimal blocksize for the QR factorization */ /* of an N-by-M matrix, NB2 is the optimal blocksize for the */ /* RQ factorization of an N-by-P matrix, and NB3 is the optimal */ /* blocksize for a call of DORMQR. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(n,m). */ /* Each H(i) has the form */ /* H(i) = I - taua * v * v' */ /* where taua is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), */ /* and taua in TAUA(i). */ /* To form Q explicitly, use LAPACK subroutine DORGQR. */ /* To use Q to update another matrix, use LAPACK subroutine DORMQR. */ /* The matrix Z is represented as a product of elementary reflectors */ /* Z = H(1) H(2) . . . H(k), where k = min(n,p). */ /* Each H(i) has the form */ /* H(i) = I - taub * v * v' */ /* where taub is a real scalar, and v is a real vector with */ /* v(p-k+i+1:p) = 0 and v(p-k+i) = 1; v(1:p-k+i-1) is stored on exit in */ /* B(n-k+i,1:p-k+i-1), and taub in TAUB(i). */ /* To form Z explicitly, use LAPACK subroutine DORGRQ. */ /* To use Z to update another matrix, use LAPACK subroutine DORMRQ. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --taua; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --taub; --work; /* Function Body */ *info = 0; nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, m, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DGERQF", " ", n, p, &c_n1, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORMQR", " ", n, m, p, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2); nb = max(i__1,nb3); /* Computing MAX */ i__1 = max(*n,*m); lwkopt = max(i__1,*p) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*n < 0) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*p < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*n), i__1 = max(i__1,*m); if (*lwork < max(i__1,*p) && ! lquery) { *info = -11; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGQRF", &i__1); return 0; } else if (lquery) { return 0; } /* QR factorization of N-by-M matrix A: A = Q*R */ _starpu_dgeqrf_(n, m, &a[a_offset], lda, &taua[1], &work[1], lwork, info); lopt = (integer) work[1]; /* Update B := Q'*B. */ i__1 = min(*n,*m); _starpu_dormqr_("Left", "Transpose", n, p, &i__1, &a[a_offset], lda, &taua[1], &b[ b_offset], ldb, &work[1], lwork, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[1]; lopt = max(i__1,i__2); /* RQ factorization of N-by-P matrix B: B = T*Z. */ _starpu_dgerqf_(n, p, &b[b_offset], ldb, &taub[1], &work[1], lwork, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[1]; work[1] = (doublereal) max(i__1,i__2); return 0; /* End of DGGQRF */ } /* _starpu_dggqrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggrqf.c000066400000000000000000000222671413463044200206310ustar00rootroot00000000000000/* dggrqf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dggrqf_(integer *m, integer *p, integer *n, doublereal * a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, doublereal *taub, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer nb, nb1, nb2, nb3, lopt; extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dgerqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormrq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGRQF computes a generalized RQ factorization of an M-by-N matrix A */ /* and a P-by-N matrix B: */ /* A = R*Q, B = Z*T*Q, */ /* where Q is an N-by-N orthogonal matrix, Z is a P-by-P orthogonal */ /* matrix, and R and T assume one of the forms: */ /* if M <= N, R = ( 0 R12 ) M, or if M > N, R = ( R11 ) M-N, */ /* N-M M ( R21 ) N */ /* N */ /* where R12 or R21 is upper triangular, and */ /* if P >= N, T = ( T11 ) N , or if P < N, T = ( T11 T12 ) P, */ /* ( 0 ) P-N P N-P */ /* N */ /* where T11 is upper triangular. */ /* In particular, if B is square and nonsingular, the GRQ factorization */ /* of A and B implicitly gives the RQ factorization of A*inv(B): */ /* A*inv(B) = (R*inv(T))*Z' */ /* where inv(B) denotes the inverse of the matrix B, and Z' denotes the */ /* transpose of the matrix Z. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* P (input) INTEGER */ /* The number of rows of the matrix B. P >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, if M <= N, the upper triangle of the subarray */ /* A(1:M,N-M+1:N) contains the M-by-M upper triangular matrix R; */ /* if M > N, the elements on and above the (M-N)-th subdiagonal */ /* contain the M-by-N upper trapezoidal matrix R; the remaining */ /* elements, with the array TAUA, represent the orthogonal */ /* matrix Q as a product of elementary reflectors (see Further */ /* Details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAUA (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Q (see Further Details). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the P-by-N matrix B. */ /* On exit, the elements on and above the diagonal of the array */ /* contain the min(P,N)-by-N upper trapezoidal matrix T (T is */ /* upper triangular if P >= N); the elements below the diagonal, */ /* with the array TAUB, represent the orthogonal matrix Z as a */ /* product of elementary reflectors (see Further Details). */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,P). */ /* TAUB (output) DOUBLE PRECISION array, dimension (min(P,N)) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Z (see Further Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N,M,P). */ /* For optimum performance LWORK >= max(N,M,P)*max(NB1,NB2,NB3), */ /* where NB1 is the optimal blocksize for the RQ factorization */ /* of an M-by-N matrix, NB2 is the optimal blocksize for the */ /* QR factorization of a P-by-N matrix, and NB3 is the optimal */ /* blocksize for a call of DORMRQ. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INF0= -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of elementary reflectors */ /* Q = H(1) H(2) . . . H(k), where k = min(m,n). */ /* Each H(i) has the form */ /* H(i) = I - taua * v * v' */ /* where taua is a real scalar, and v is a real vector with */ /* v(n-k+i+1:n) = 0 and v(n-k+i) = 1; v(1:n-k+i-1) is stored on exit in */ /* A(m-k+i,1:n-k+i-1), and taua in TAUA(i). */ /* To form Q explicitly, use LAPACK subroutine DORGRQ. */ /* To use Q to update another matrix, use LAPACK subroutine DORMRQ. */ /* The matrix Z is represented as a product of elementary reflectors */ /* Z = H(1) H(2) . . . H(k), where k = min(p,n). */ /* Each H(i) has the form */ /* H(i) = I - taub * v * v' */ /* where taub is a real scalar, and v is a real vector with */ /* v(1:i-1) = 0 and v(i) = 1; v(i+1:p) is stored on exit in B(i+1:p,i), */ /* and taub in TAUB(i). */ /* To form Z explicitly, use LAPACK subroutine DORGQR. */ /* To use Z to update another matrix, use LAPACK subroutine DORMQR. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --taua; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --taub; --work; /* Function Body */ *info = 0; nb1 = _starpu_ilaenv_(&c__1, "DGERQF", " ", m, n, &c_n1, &c_n1); nb2 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", p, n, &c_n1, &c_n1); nb3 = _starpu_ilaenv_(&c__1, "DORMRQ", " ", m, n, p, &c_n1); /* Computing MAX */ i__1 = max(nb1,nb2); nb = max(i__1,nb3); /* Computing MAX */ i__1 = max(*n,*m); lwkopt = max(i__1,*p) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*p < 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*ldb < max(1,*p)) { *info = -8; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = max(1,*m), i__1 = max(i__1,*p); if (*lwork < max(i__1,*n) && ! lquery) { *info = -11; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGRQF", &i__1); return 0; } else if (lquery) { return 0; } /* RQ factorization of M-by-N matrix A: A = R*Q */ _starpu_dgerqf_(m, n, &a[a_offset], lda, &taua[1], &work[1], lwork, info); lopt = (integer) work[1]; /* Update B := B*Q' */ i__1 = min(*m,*n); /* Computing MAX */ i__2 = 1, i__3 = *m - *n + 1; _starpu_dormrq_("Right", "Transpose", p, n, &i__1, &a[max(i__2, i__3)+ a_dim1], lda, &taua[1], &b[b_offset], ldb, &work[1], lwork, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[1]; lopt = max(i__1,i__2); /* QR factorization of P-by-N matrix B: B = Z*T */ _starpu_dgeqrf_(p, n, &b[b_offset], ldb, &taub[1], &work[1], lwork, info); /* Computing MAX */ i__1 = lopt, i__2 = (integer) work[1]; work[1] = (doublereal) max(i__1,i__2); return 0; /* End of DGGRQF */ } /* _starpu_dggrqf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggsvd.c000066400000000000000000000327011413463044200206270ustar00rootroot00000000000000/* dggsvd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dggsvd_(char *jobu, char *jobv, char *jobq, integer *m, integer *n, integer *p, integer *k, integer *l, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer *ldq, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, u_dim1, u_offset, v_dim1, v_offset, i__1, i__2; /* Local variables */ integer i__, j; doublereal ulp; integer ibnd; doublereal tola; integer isub; doublereal tolb, unfl, temp, smax; extern logical _starpu_lsame_(char *, char *); doublereal anorm, bnorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical wantq, wantu, wantv; extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dtgsja_(char *, char *, char *, integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer ncycle; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dggsvp_( char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGSVD computes the generalized singular value decomposition (GSVD) */ /* of an M-by-N real matrix A and P-by-N real matrix B: */ /* U'*A*Q = D1*( 0 R ), V'*B*Q = D2*( 0 R ) */ /* where U, V and Q are orthogonal matrices, and Z' is the transpose */ /* of Z. Let K+L = the effective numerical rank of the matrix (A',B')', */ /* then R is a K+L-by-K+L nonsingular upper triangular matrix, D1 and */ /* D2 are M-by-(K+L) and P-by-(K+L) "diagonal" matrices and of the */ /* following structures, respectively: */ /* If M-K-L >= 0, */ /* K L */ /* D1 = K ( I 0 ) */ /* L ( 0 C ) */ /* M-K-L ( 0 0 ) */ /* K L */ /* D2 = L ( 0 S ) */ /* P-L ( 0 0 ) */ /* N-K-L K L */ /* ( 0 R ) = K ( 0 R11 R12 ) */ /* L ( 0 0 R22 ) */ /* where */ /* C = diag( ALPHA(K+1), ... , ALPHA(K+L) ), */ /* S = diag( BETA(K+1), ... , BETA(K+L) ), */ /* C**2 + S**2 = I. */ /* R is stored in A(1:K+L,N-K-L+1:N) on exit. */ /* If M-K-L < 0, */ /* K M-K K+L-M */ /* D1 = K ( I 0 0 ) */ /* M-K ( 0 C 0 ) */ /* K M-K K+L-M */ /* D2 = M-K ( 0 S 0 ) */ /* K+L-M ( 0 0 I ) */ /* P-L ( 0 0 0 ) */ /* N-K-L K M-K K+L-M */ /* ( 0 R ) = K ( 0 R11 R12 R13 ) */ /* M-K ( 0 0 R22 R23 ) */ /* K+L-M ( 0 0 0 R33 ) */ /* where */ /* C = diag( ALPHA(K+1), ... , ALPHA(M) ), */ /* S = diag( BETA(K+1), ... , BETA(M) ), */ /* C**2 + S**2 = I. */ /* (R11 R12 R13 ) is stored in A(1:M, N-K-L+1:N), and R33 is stored */ /* ( 0 R22 R23 ) */ /* in B(M-K+1:L,N+M-K-L+1:N) on exit. */ /* The routine computes C, S, R, and optionally the orthogonal */ /* transformation matrices U, V and Q. */ /* In particular, if B is an N-by-N nonsingular matrix, then the GSVD of */ /* A and B implicitly gives the SVD of A*inv(B): */ /* A*inv(B) = U*(D1*inv(D2))*V'. */ /* If ( A',B')' has orthonormal columns, then the GSVD of A and B is */ /* also equal to the CS decomposition of A and B. Furthermore, the GSVD */ /* can be used to derive the solution of the eigenvalue problem: */ /* A'*A x = lambda* B'*B x. */ /* In some literature, the GSVD of A and B is presented in the form */ /* U'*A*X = ( 0 D1 ), V'*B*X = ( 0 D2 ) */ /* where U and V are orthogonal and X is nonsingular, D1 and D2 are */ /* ``diagonal''. The former GSVD form can be converted to the latter */ /* form by taking the nonsingular matrix X as */ /* X = Q*( I 0 ) */ /* ( 0 inv(R) ). */ /* Arguments */ /* ========= */ /* JOBU (input) CHARACTER*1 */ /* = 'U': Orthogonal matrix U is computed; */ /* = 'N': U is not computed. */ /* JOBV (input) CHARACTER*1 */ /* = 'V': Orthogonal matrix V is computed; */ /* = 'N': V is not computed. */ /* JOBQ (input) CHARACTER*1 */ /* = 'Q': Orthogonal matrix Q is computed; */ /* = 'N': Q is not computed. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrices A and B. N >= 0. */ /* P (input) INTEGER */ /* The number of rows of the matrix B. P >= 0. */ /* K (output) INTEGER */ /* L (output) INTEGER */ /* On exit, K and L specify the dimension of the subblocks */ /* described in the Purpose section. */ /* K + L = effective numerical rank of (A',B')'. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, A contains the triangular matrix R, or part of R. */ /* See Purpose for details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the P-by-N matrix B. */ /* On exit, B contains the triangular matrix R if M-K-L < 0. */ /* See Purpose for details. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,P). */ /* ALPHA (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, ALPHA and BETA contain the generalized singular */ /* value pairs of A and B; */ /* ALPHA(1:K) = 1, */ /* BETA(1:K) = 0, */ /* and if M-K-L >= 0, */ /* ALPHA(K+1:K+L) = C, */ /* BETA(K+1:K+L) = S, */ /* or if M-K-L < 0, */ /* ALPHA(K+1:M)=C, ALPHA(M+1:K+L)=0 */ /* BETA(K+1:M) =S, BETA(M+1:K+L) =1 */ /* and */ /* ALPHA(K+L+1:N) = 0 */ /* BETA(K+L+1:N) = 0 */ /* U (output) DOUBLE PRECISION array, dimension (LDU,M) */ /* If JOBU = 'U', U contains the M-by-M orthogonal matrix U. */ /* If JOBU = 'N', U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= max(1,M) if */ /* JOBU = 'U'; LDU >= 1 otherwise. */ /* V (output) DOUBLE PRECISION array, dimension (LDV,P) */ /* If JOBV = 'V', V contains the P-by-P orthogonal matrix V. */ /* If JOBV = 'N', V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. LDV >= max(1,P) if */ /* JOBV = 'V'; LDV >= 1 otherwise. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* If JOBQ = 'Q', Q contains the N-by-N orthogonal matrix Q. */ /* If JOBQ = 'N', Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N) if */ /* JOBQ = 'Q'; LDQ >= 1 otherwise. */ /* WORK (workspace) DOUBLE PRECISION array, */ /* dimension (max(3*N,M,P)+N) */ /* IWORK (workspace/output) INTEGER array, dimension (N) */ /* On exit, IWORK stores the sorting information. More */ /* precisely, the following loop will sort ALPHA */ /* for I = K+1, min(M,K+L) */ /* swap ALPHA(I) and ALPHA(IWORK(I)) */ /* endfor */ /* such that ALPHA(1) >= ALPHA(2) >= ... >= ALPHA(N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, the Jacobi-type procedure failed to */ /* converge. For further details, see subroutine DTGSJA. */ /* Internal Parameters */ /* =================== */ /* TOLA DOUBLE PRECISION */ /* TOLB DOUBLE PRECISION */ /* TOLA and TOLB are the thresholds to determine the effective */ /* rank of (A',B')'. Generally, they are set to */ /* TOLA = MAX(M,N)*norm(A)*MAZHEPS, */ /* TOLB = MAX(P,N)*norm(B)*MAZHEPS. */ /* The size of TOLA and TOLB may affect the size of backward */ /* errors of the decomposition. */ /* Further Details */ /* =============== */ /* 2-96 Based on modifications by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alpha; --beta; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --work; --iwork; /* Function Body */ wantu = _starpu_lsame_(jobu, "U"); wantv = _starpu_lsame_(jobv, "V"); wantq = _starpu_lsame_(jobq, "Q"); *info = 0; if (! (wantu || _starpu_lsame_(jobu, "N"))) { *info = -1; } else if (! (wantv || _starpu_lsame_(jobv, "N"))) { *info = -2; } else if (! (wantq || _starpu_lsame_(jobq, "N"))) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*p < 0) { *info = -6; } else if (*lda < max(1,*m)) { *info = -10; } else if (*ldb < max(1,*p)) { *info = -12; } else if (*ldu < 1 || wantu && *ldu < *m) { *info = -16; } else if (*ldv < 1 || wantv && *ldv < *p) { *info = -18; } else if (*ldq < 1 || wantq && *ldq < *n) { *info = -20; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGSVD", &i__1); return 0; } /* Compute the Frobenius norm of matrices A and B */ anorm = _starpu_dlange_("1", m, n, &a[a_offset], lda, &work[1]); bnorm = _starpu_dlange_("1", p, n, &b[b_offset], ldb, &work[1]); /* Get machine precision and set up threshold for determining */ /* the effective numerical rank of the matrices A and B. */ ulp = _starpu_dlamch_("Precision"); unfl = _starpu_dlamch_("Safe Minimum"); tola = max(*m,*n) * max(anorm,unfl) * ulp; tolb = max(*p,*n) * max(bnorm,unfl) * ulp; /* Preprocessing */ _starpu_dggsvp_(jobu, jobv, jobq, m, p, n, &a[a_offset], lda, &b[b_offset], ldb, & tola, &tolb, k, l, &u[u_offset], ldu, &v[v_offset], ldv, &q[ q_offset], ldq, &iwork[1], &work[1], &work[*n + 1], info); /* Compute the GSVD of two upper "triangular" matrices */ _starpu_dtgsja_(jobu, jobv, jobq, m, p, n, k, l, &a[a_offset], lda, &b[b_offset], ldb, &tola, &tolb, &alpha[1], &beta[1], &u[u_offset], ldu, &v[ v_offset], ldv, &q[q_offset], ldq, &work[1], &ncycle, info); /* Sort the singular values and store the pivot indices in IWORK */ /* Copy ALPHA to WORK, then sort ALPHA in WORK */ _starpu_dcopy_(n, &alpha[1], &c__1, &work[1], &c__1); /* Computing MIN */ i__1 = *l, i__2 = *m - *k; ibnd = min(i__1,i__2); i__1 = ibnd; for (i__ = 1; i__ <= i__1; ++i__) { /* Scan for largest ALPHA(K+I) */ isub = i__; smax = work[*k + i__]; i__2 = ibnd; for (j = i__ + 1; j <= i__2; ++j) { temp = work[*k + j]; if (temp > smax) { isub = j; smax = temp; } /* L10: */ } if (isub != i__) { work[*k + isub] = work[*k + i__]; work[*k + i__] = smax; iwork[*k + i__] = *k + isub; } else { iwork[*k + i__] = *k + i__; } /* L20: */ } return 0; /* End of DGGSVD */ } /* _starpu_dggsvd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dggsvp.c000066400000000000000000000351771413463044200206550ustar00rootroot00000000000000/* dggsvp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b12 = 0.; static doublereal c_b22 = 1.; /* Subroutine */ int _starpu_dggsvp_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *tola, doublereal *tolb, integer *k, integer *l, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer *ldq, integer *iwork, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, u_dim1, u_offset, v_dim1, v_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j; extern logical _starpu_lsame_(char *, char *); logical wantq, wantu, wantv; extern /* Subroutine */ int _starpu_dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dgerq2_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorm2r_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dormr2_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dgeqpf_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dlapmt_(logical *, integer *, integer *, doublereal *, integer *, integer *); logical forwrd; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGGSVP computes orthogonal matrices U, V and Q such that */ /* N-K-L K L */ /* U'*A*Q = K ( 0 A12 A13 ) if M-K-L >= 0; */ /* L ( 0 0 A23 ) */ /* M-K-L ( 0 0 0 ) */ /* N-K-L K L */ /* = K ( 0 A12 A13 ) if M-K-L < 0; */ /* M-K ( 0 0 A23 ) */ /* N-K-L K L */ /* V'*B*Q = L ( 0 0 B13 ) */ /* P-L ( 0 0 0 ) */ /* where the K-by-K matrix A12 and L-by-L matrix B13 are nonsingular */ /* upper triangular; A23 is L-by-L upper triangular if M-K-L >= 0, */ /* otherwise A23 is (M-K)-by-L upper trapezoidal. K+L = the effective */ /* numerical rank of the (M+P)-by-N matrix (A',B')'. Z' denotes the */ /* transpose of Z. */ /* This decomposition is the preprocessing step for computing the */ /* Generalized Singular Value Decomposition (GSVD), see subroutine */ /* DGGSVD. */ /* Arguments */ /* ========= */ /* JOBU (input) CHARACTER*1 */ /* = 'U': Orthogonal matrix U is computed; */ /* = 'N': U is not computed. */ /* JOBV (input) CHARACTER*1 */ /* = 'V': Orthogonal matrix V is computed; */ /* = 'N': V is not computed. */ /* JOBQ (input) CHARACTER*1 */ /* = 'Q': Orthogonal matrix Q is computed; */ /* = 'N': Q is not computed. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* P (input) INTEGER */ /* The number of rows of the matrix B. P >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, A contains the triangular (or trapezoidal) matrix */ /* described in the Purpose section. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the P-by-N matrix B. */ /* On exit, B contains the triangular matrix described in */ /* the Purpose section. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,P). */ /* TOLA (input) DOUBLE PRECISION */ /* TOLB (input) DOUBLE PRECISION */ /* TOLA and TOLB are the thresholds to determine the effective */ /* numerical rank of matrix B and a subblock of A. Generally, */ /* they are set to */ /* TOLA = MAX(M,N)*norm(A)*MAZHEPS, */ /* TOLB = MAX(P,N)*norm(B)*MAZHEPS. */ /* The size of TOLA and TOLB may affect the size of backward */ /* errors of the decomposition. */ /* K (output) INTEGER */ /* L (output) INTEGER */ /* On exit, K and L specify the dimension of the subblocks */ /* described in Purpose. */ /* K + L = effective numerical rank of (A',B')'. */ /* U (output) DOUBLE PRECISION array, dimension (LDU,M) */ /* If JOBU = 'U', U contains the orthogonal matrix U. */ /* If JOBU = 'N', U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= max(1,M) if */ /* JOBU = 'U'; LDU >= 1 otherwise. */ /* V (output) DOUBLE PRECISION array, dimension (LDV,P) */ /* If JOBV = 'V', V contains the orthogonal matrix V. */ /* If JOBV = 'N', V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. LDV >= max(1,P) if */ /* JOBV = 'V'; LDV >= 1 otherwise. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* If JOBQ = 'Q', Q contains the orthogonal matrix Q. */ /* If JOBQ = 'N', Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N) if */ /* JOBQ = 'Q'; LDQ >= 1 otherwise. */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* TAU (workspace) DOUBLE PRECISION array, dimension (N) */ /* WORK (workspace) DOUBLE PRECISION array, dimension (max(3*N,M,P)) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* The subroutine uses LAPACK subroutine DGEQPF for the QR factorization */ /* with column pivoting to detect the effective numerical rank of the */ /* a matrix. It may be replaced by a better rank determination strategy. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --iwork; --tau; --work; /* Function Body */ wantu = _starpu_lsame_(jobu, "U"); wantv = _starpu_lsame_(jobv, "V"); wantq = _starpu_lsame_(jobq, "Q"); forwrd = TRUE_; *info = 0; if (! (wantu || _starpu_lsame_(jobu, "N"))) { *info = -1; } else if (! (wantv || _starpu_lsame_(jobv, "N"))) { *info = -2; } else if (! (wantq || _starpu_lsame_(jobq, "N"))) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*p < 0) { *info = -5; } else if (*n < 0) { *info = -6; } else if (*lda < max(1,*m)) { *info = -8; } else if (*ldb < max(1,*p)) { *info = -10; } else if (*ldu < 1 || wantu && *ldu < *m) { *info = -16; } else if (*ldv < 1 || wantv && *ldv < *p) { *info = -18; } else if (*ldq < 1 || wantq && *ldq < *n) { *info = -20; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGGSVP", &i__1); return 0; } /* QR with column pivoting of B: B*P = V*( S11 S12 ) */ /* ( 0 0 ) */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { iwork[i__] = 0; /* L10: */ } _starpu_dgeqpf_(p, n, &b[b_offset], ldb, &iwork[1], &tau[1], &work[1], info); /* Update A := A*P */ _starpu_dlapmt_(&forwrd, m, n, &a[a_offset], lda, &iwork[1]); /* Determine the effective rank of matrix B. */ *l = 0; i__1 = min(*p,*n); for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = b[i__ + i__ * b_dim1], abs(d__1)) > *tolb) { ++(*l); } /* L20: */ } if (wantv) { /* Copy the details of V, and form V. */ _starpu_dlaset_("Full", p, p, &c_b12, &c_b12, &v[v_offset], ldv); if (*p > 1) { i__1 = *p - 1; _starpu_dlacpy_("Lower", &i__1, n, &b[b_dim1 + 2], ldb, &v[v_dim1 + 2], ldv); } i__1 = min(*p,*n); _starpu_dorg2r_(p, p, &i__1, &v[v_offset], ldv, &tau[1], &work[1], info); } /* Clean up B */ i__1 = *l - 1; for (j = 1; j <= i__1; ++j) { i__2 = *l; for (i__ = j + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L30: */ } /* L40: */ } if (*p > *l) { i__1 = *p - *l; _starpu_dlaset_("Full", &i__1, n, &c_b12, &c_b12, &b[*l + 1 + b_dim1], ldb); } if (wantq) { /* Set Q = I and Update Q := Q*P */ _starpu_dlaset_("Full", n, n, &c_b12, &c_b22, &q[q_offset], ldq); _starpu_dlapmt_(&forwrd, n, n, &q[q_offset], ldq, &iwork[1]); } if (*p >= *l && *n != *l) { /* RQ factorization of (S11 S12): ( S11 S12 ) = ( 0 S12 )*Z */ _starpu_dgerq2_(l, n, &b[b_offset], ldb, &tau[1], &work[1], info); /* Update A := A*Z' */ _starpu_dormr2_("Right", "Transpose", m, n, l, &b[b_offset], ldb, &tau[1], &a[ a_offset], lda, &work[1], info); if (wantq) { /* Update Q := Q*Z' */ _starpu_dormr2_("Right", "Transpose", n, n, l, &b[b_offset], ldb, &tau[1], &q[q_offset], ldq, &work[1], info); } /* Clean up B */ i__1 = *n - *l; _starpu_dlaset_("Full", l, &i__1, &c_b12, &c_b12, &b[b_offset], ldb); i__1 = *n; for (j = *n - *l + 1; j <= i__1; ++j) { i__2 = *l; for (i__ = j - *n + *l + 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L50: */ } /* L60: */ } } /* Let N-L L */ /* A = ( A11 A12 ) M, */ /* then the following does the complete QR decomposition of A11: */ /* A11 = U*( 0 T12 )*P1' */ /* ( 0 0 ) */ i__1 = *n - *l; for (i__ = 1; i__ <= i__1; ++i__) { iwork[i__] = 0; /* L70: */ } i__1 = *n - *l; _starpu_dgeqpf_(m, &i__1, &a[a_offset], lda, &iwork[1], &tau[1], &work[1], info); /* Determine the effective rank of A11 */ *k = 0; /* Computing MIN */ i__2 = *m, i__3 = *n - *l; i__1 = min(i__2,i__3); for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = a[i__ + i__ * a_dim1], abs(d__1)) > *tola) { ++(*k); } /* L80: */ } /* Update A12 := U'*A12, where A12 = A( 1:M, N-L+1:N ) */ /* Computing MIN */ i__2 = *m, i__3 = *n - *l; i__1 = min(i__2,i__3); _starpu_dorm2r_("Left", "Transpose", m, l, &i__1, &a[a_offset], lda, &tau[1], &a[( *n - *l + 1) * a_dim1 + 1], lda, &work[1], info); if (wantu) { /* Copy the details of U, and form U */ _starpu_dlaset_("Full", m, m, &c_b12, &c_b12, &u[u_offset], ldu); if (*m > 1) { i__1 = *m - 1; i__2 = *n - *l; _starpu_dlacpy_("Lower", &i__1, &i__2, &a[a_dim1 + 2], lda, &u[u_dim1 + 2] , ldu); } /* Computing MIN */ i__2 = *m, i__3 = *n - *l; i__1 = min(i__2,i__3); _starpu_dorg2r_(m, m, &i__1, &u[u_offset], ldu, &tau[1], &work[1], info); } if (wantq) { /* Update Q( 1:N, 1:N-L ) = Q( 1:N, 1:N-L )*P1 */ i__1 = *n - *l; _starpu_dlapmt_(&forwrd, n, &i__1, &q[q_offset], ldq, &iwork[1]); } /* Clean up A: set the strictly lower triangular part of */ /* A(1:K, 1:K) = 0, and A( K+1:M, 1:N-L ) = 0. */ i__1 = *k - 1; for (j = 1; j <= i__1; ++j) { i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L90: */ } /* L100: */ } if (*m > *k) { i__1 = *m - *k; i__2 = *n - *l; _starpu_dlaset_("Full", &i__1, &i__2, &c_b12, &c_b12, &a[*k + 1 + a_dim1], lda); } if (*n - *l > *k) { /* RQ factorization of ( T11 T12 ) = ( 0 T12 )*Z1 */ i__1 = *n - *l; _starpu_dgerq2_(k, &i__1, &a[a_offset], lda, &tau[1], &work[1], info); if (wantq) { /* Update Q( 1:N,1:N-L ) = Q( 1:N,1:N-L )*Z1' */ i__1 = *n - *l; _starpu_dormr2_("Right", "Transpose", n, &i__1, k, &a[a_offset], lda, & tau[1], &q[q_offset], ldq, &work[1], info); } /* Clean up A */ i__1 = *n - *l - *k; _starpu_dlaset_("Full", k, &i__1, &c_b12, &c_b12, &a[a_offset], lda); i__1 = *n - *l; for (j = *n - *l - *k + 1; j <= i__1; ++j) { i__2 = *k; for (i__ = j - *n + *l + *k + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L110: */ } /* L120: */ } } if (*m > *k) { /* QR factorization of A( K+1:M,N-L+1:N ) */ i__1 = *m - *k; _starpu_dgeqr2_(&i__1, l, &a[*k + 1 + (*n - *l + 1) * a_dim1], lda, &tau[1], & work[1], info); if (wantu) { /* Update U(:,K+1:M) := U(:,K+1:M)*U1 */ i__1 = *m - *k; /* Computing MIN */ i__3 = *m - *k; i__2 = min(i__3,*l); _starpu_dorm2r_("Right", "No transpose", m, &i__1, &i__2, &a[*k + 1 + (*n - *l + 1) * a_dim1], lda, &tau[1], &u[(*k + 1) * u_dim1 + 1], ldu, &work[1], info); } /* Clean up */ i__1 = *n; for (j = *n - *l + 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j - *n + *k + *l + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L130: */ } /* L140: */ } } return 0; /* End of DGGSVP */ } /* _starpu_dggsvp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgsvj0.c000066400000000000000000001017311413463044200205460ustar00rootroot00000000000000/* dgsvj0.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b42 = 1.; /* Subroutine */ int _starpu_dgsvj0_(char *jobv, integer *m, integer *n, doublereal * a, integer *lda, doublereal *d__, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *eps, doublereal *sfmin, doublereal *tol, integer *nsweep, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal bigtheta; integer pskipped, i__, p, q; doublereal t, rootsfmin, cs, sn; integer ir1, jbc; doublereal big; integer kbl, igl, ibr, jgl, nbl, mvl; doublereal aapp, aapq, aaqq; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer ierr; doublereal aapp0; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp1, apoaq, aqoap; extern logical _starpu_lsame_(char *, char *); doublereal theta, small; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal fastr[5]; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical applv, rsvec; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_drotm_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *); logical rotok; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer ijblsk, swband, blskip; doublereal mxaapq; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal thsign, mxsinj; integer emptsw, notrot, iswrot, lkahead; doublereal rootbig, rooteps; integer rowskip; doublereal roottol; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Zlatko Drmac of the University of Zagreb and -- */ /* -- Kresimir Veselic of the Fernuniversitaet Hagen -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* This routine is also part of SIGMA (version 1.23, October 23. 2008.) */ /* SIGMA is a library of algorithms for highly accurate algorithms for */ /* computation of SVD, PSVD, QSVD, (H,K)-SVD, and for solution of the */ /* eigenvalue problems Hx = lambda M x, H M x = lambda x with H, M > 0. */ /* Scalar Arguments */ /* Array Arguments */ /* .. */ /* Purpose */ /* ~~~~~~~ */ /* DGSVJ0 is called from DGESVJ as a pre-processor and that is its main */ /* purpose. It applies Jacobi rotations in the same way as DGESVJ does, but */ /* it does not check convergence (stopping criterion). Few tuning */ /* parameters (marked by [TP]) are available for the implementer. */ /* Further details */ /* ~~~~~~~~~~~~~~~ */ /* DGSVJ0 is used just to enable SGESVJ to call a simplified version of */ /* itself to work on a submatrix of the original matrix. */ /* Contributors */ /* ~~~~~~~~~~~~ */ /* Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany) */ /* Bugs, Examples and Comments */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* Please report all bugs and send interesting test examples and comments to */ /* drmac@math.hr. Thank you. */ /* Arguments */ /* ~~~~~~~~~ */ /* JOBV (input) CHARACTER*1 */ /* Specifies whether the output from this procedure is used */ /* to compute the matrix V: */ /* = 'V': the product of the Jacobi rotations is accumulated */ /* by postmulyiplying the N-by-N array V. */ /* (See the description of V.) */ /* = 'A': the product of the Jacobi rotations is accumulated */ /* by postmulyiplying the MV-by-N array V. */ /* (See the descriptions of MV and V.) */ /* = 'N': the Jacobi rotations are not accumulated. */ /* M (input) INTEGER */ /* The number of rows of the input matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the input matrix A. */ /* M >= N >= 0. */ /* A (input/output) REAL array, dimension (LDA,N) */ /* On entry, M-by-N matrix A, such that A*diag(D) represents */ /* the input matrix. */ /* On exit, */ /* A_onexit * D_onexit represents the input matrix A*diag(D) */ /* post-multiplied by a sequence of Jacobi rotations, where the */ /* rotation threshold and the total number of sweeps are given in */ /* TOL and NSWEEP, respectively. */ /* (See the descriptions of D, TOL and NSWEEP.) */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* D (input/workspace/output) REAL array, dimension (N) */ /* The array D accumulates the scaling factors from the fast scaled */ /* Jacobi rotations. */ /* On entry, A*diag(D) represents the input matrix. */ /* On exit, A_onexit*diag(D_onexit) represents the input matrix */ /* post-multiplied by a sequence of Jacobi rotations, where the */ /* rotation threshold and the total number of sweeps are given in */ /* TOL and NSWEEP, respectively. */ /* (See the descriptions of A, TOL and NSWEEP.) */ /* SVA (input/workspace/output) REAL array, dimension (N) */ /* On entry, SVA contains the Euclidean norms of the columns of */ /* the matrix A*diag(D). */ /* On exit, SVA contains the Euclidean norms of the columns of */ /* the matrix onexit*diag(D_onexit). */ /* MV (input) INTEGER */ /* If JOBV .EQ. 'A', then MV rows of V are post-multipled by a */ /* sequence of Jacobi rotations. */ /* If JOBV = 'N', then MV is not referenced. */ /* V (input/output) REAL array, dimension (LDV,N) */ /* If JOBV .EQ. 'V' then N rows of V are post-multipled by a */ /* sequence of Jacobi rotations. */ /* If JOBV .EQ. 'A' then MV rows of V are post-multipled by a */ /* sequence of Jacobi rotations. */ /* If JOBV = 'N', then V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V, LDV >= 1. */ /* If JOBV = 'V', LDV .GE. N. */ /* If JOBV = 'A', LDV .GE. MV. */ /* EPS (input) INTEGER */ /* EPS = SLAMCH('Epsilon') */ /* SFMIN (input) INTEGER */ /* SFMIN = SLAMCH('Safe Minimum') */ /* TOL (input) REAL */ /* TOL is the threshold for Jacobi rotations. For a pair */ /* A(:,p), A(:,q) of pivot columns, the Jacobi rotation is */ /* applied only if DABS(COS(angle(A(:,p),A(:,q)))) .GT. TOL. */ /* NSWEEP (input) INTEGER */ /* NSWEEP is the number of sweeps of Jacobi rotations to be */ /* performed. */ /* WORK (workspace) REAL array, dimension LWORK. */ /* LWORK (input) INTEGER */ /* LWORK is the dimension of WORK. LWORK .GE. M. */ /* INFO (output) INTEGER */ /* = 0 : successful exit. */ /* < 0 : if INFO = -i, then the i-th argument had an illegal value */ /* Local Parameters */ /* Local Scalars */ /* Local Arrays */ /* Intrinsic Functions */ /* External Functions */ /* External Subroutines */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| */ /* Parameter adjustments */ --sva; --d__; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --work; /* Function Body */ applv = _starpu_lsame_(jobv, "A"); rsvec = _starpu_lsame_(jobv, "V"); if (! (rsvec || applv || _starpu_lsame_(jobv, "N"))) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0 || *n > *m) { *info = -3; } else if (*lda < *m) { *info = -5; } else if (*mv < 0) { *info = -8; } else if (*ldv < *m) { *info = -10; } else if (*tol <= *eps) { *info = -13; } else if (*nsweep < 0) { *info = -14; } else if (*lwork < *m) { *info = -16; } else { *info = 0; } /* #:( */ if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGSVJ0", &i__1); return 0; } if (rsvec) { mvl = *n; } else if (applv) { mvl = *mv; } rsvec = rsvec || applv; rooteps = sqrt(*eps); rootsfmin = sqrt(*sfmin); small = *sfmin / *eps; big = 1. / *sfmin; rootbig = 1. / rootsfmin; bigtheta = 1. / rooteps; roottol = sqrt(*tol); /* -#- Row-cyclic Jacobi SVD algorithm with column pivoting -#- */ emptsw = *n * (*n - 1) / 2; notrot = 0; fastr[0] = 0.; /* -#- Row-cyclic pivot strategy with de Rijk's pivoting -#- */ swband = 0; /* [TP] SWBAND is a tuning parameter. It is meaningful and effective */ /* if SGESVJ is used as a computational routine in the preconditioned */ /* Jacobi SVD algorithm SGESVJ. For sweeps i=1:SWBAND the procedure */ /* ...... */ kbl = min(8,*n); /* [TP] KBL is a tuning parameter that defines the tile size in the */ /* tiling of the p-q loops of pivot pairs. In general, an optimal */ /* value of KBL depends on the matrix dimensions and on the */ /* parameters of the computer's memory. */ nbl = *n / kbl; if (nbl * kbl != *n) { ++nbl; } /* Computing 2nd power */ i__1 = kbl; blskip = i__1 * i__1 + 1; /* [TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL. */ rowskip = min(5,kbl); /* [TP] ROWSKIP is a tuning parameter. */ lkahead = 1; /* [TP] LKAHEAD is a tuning parameter. */ swband = 0; pskipped = 0; i__1 = *nsweep; for (i__ = 1; i__ <= i__1; ++i__) { /* .. go go go ... */ mxaapq = 0.; mxsinj = 0.; iswrot = 0; notrot = 0; pskipped = 0; i__2 = nbl; for (ibr = 1; ibr <= i__2; ++ibr) { igl = (ibr - 1) * kbl + 1; /* Computing MIN */ i__4 = lkahead, i__5 = nbl - ibr; i__3 = min(i__4,i__5); for (ir1 = 0; ir1 <= i__3; ++ir1) { igl += ir1 * kbl; /* Computing MIN */ i__5 = igl + kbl - 1, i__6 = *n - 1; i__4 = min(i__5,i__6); for (p = igl; p <= i__4; ++p) { /* .. de Rijk's pivoting */ i__5 = *n - p + 1; q = _starpu_idamax_(&i__5, &sva[p], &c__1) + p - 1; if (p != q) { _starpu_dswap_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); if (rsvec) { _starpu_dswap_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1); } temp1 = sva[p]; sva[p] = sva[q]; sva[q] = temp1; temp1 = d__[p]; d__[p] = d__[q]; d__[q] = temp1; } if (ir1 == 0) { /* Column norms are periodically updated by explicit */ /* norm computation. */ /* Caveat: */ /* Some BLAS implementations compute DNRM2(M,A(1,p),1) */ /* as DSQRT(DDOT(M,A(1,p),1,A(1,p),1)), which may result in */ /* overflow for ||A(:,p)||_2 > DSQRT(overflow_threshold), and */ /* undeflow for ||A(:,p)||_2 < DSQRT(underflow_threshold). */ /* Hence, DNRM2 cannot be trusted, not even in the case when */ /* the true norm is far from the under(over)flow boundaries. */ /* If properly implemented DNRM2 is available, the IF-THEN-ELSE */ /* below should read "AAPP = DNRM2( M, A(1,p), 1 ) * D(p)". */ if (sva[p] < rootbig && sva[p] > rootsfmin) { sva[p] = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * d__[p]; } else { temp1 = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], &c__1, &temp1, & aapp); sva[p] = temp1 * sqrt(aapp) * d__[p]; } aapp = sva[p]; } else { aapp = sva[p]; } if (aapp > 0.) { pskipped = 0; /* Computing MIN */ i__6 = igl + kbl - 1; i__5 = min(i__6,*n); for (q = p + 1; q <= i__5; ++q) { aaqq = sva[q]; if (aaqq > 0.) { aapp0 = aapp; if (aaqq >= 1.) { rotok = small * aapp <= aaqq; if (aapp < big / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * d__[p] * d__[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & d__[p], m, &c__1, &work[1], lda, &ierr); aapq = _starpu_ddot_(m, &work[1], &c__1, &a[q * a_dim1 + 1], &c__1) * d__[q] / aaqq; } } else { rotok = aapp <= aaqq / small; if (aapp > small / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * d__[p] * d__[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & d__[q], m, &c__1, &work[1], lda, &ierr); aapq = _starpu_ddot_(m, &work[1], &c__1, &a[p * a_dim1 + 1], &c__1) * d__[p] / aapp; } } /* Computing MAX */ d__1 = mxaapq, d__2 = abs(aapq); mxaapq = max(d__1,d__2); /* TO rotate or NOT to rotate, THAT is the question ... */ if (abs(aapq) > *tol) { /* .. rotate */ /* ROTATED = ROTATED + ONE */ if (ir1 == 0) { notrot = 0; pskipped = 0; ++iswrot; } if (rotok) { aqoap = aaqq / aapp; apoaq = aapp / aaqq; theta = (d__1 = aqoap - apoaq, abs( d__1)) * -.5 / aapq; if (abs(theta) > bigtheta) { t = .5 / theta; fastr[2] = t * d__[p] / d__[q]; fastr[3] = -t * d__[q] / d__[p]; _starpu_drotm_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1, fastr); } /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); aapp *= sqrt(1. - t * aqoap * aapq); /* Computing MAX */ d__1 = mxsinj, d__2 = abs(t); mxsinj = max(d__1,d__2); } else { /* .. choose correct signum for THETA and rotate */ thsign = -d_sign(&c_b42, &aapq); t = 1. / (theta + thsign * sqrt( theta * theta + 1.)); cs = sqrt(1. / (t * t + 1.)); sn = t * cs; /* Computing MAX */ d__1 = mxsinj, d__2 = abs(sn); mxsinj = max(d__1,d__2); /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); /* Computing MAX */ d__1 = 0., d__2 = 1. - t * aqoap * aapq; aapp *= sqrt((max(d__1,d__2))); apoaq = d__[p] / d__[q]; aqoap = d__[q] / d__[p]; if (d__[p] >= 1.) { if (d__[q] >= 1.) { fastr[2] = t * apoaq; fastr[3] = -t * aqoap; d__[p] *= cs; d__[q] *= cs; _starpu_drotm_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[ q * v_dim1 + 1], &c__1, fastr); } } else { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); d__[p] *= cs; d__[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); } } } else { if (d__[q] >= 1.) { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); d__[p] /= cs; d__[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); } } else { if (d__[p] >= d__[q]) { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__[p] *= cs; d__[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } else { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__[p] /= cs; d__[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); } } } } } } else { /* .. have to use modified Gram-Schmidt like transformation */ _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & c_b42, m, &c__1, &work[1], lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & c_b42, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); temp1 = -aapq * d__[p] / d__[q]; _starpu_daxpy_(m, &temp1, &work[1], &c__1, &a[ q * a_dim1 + 1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b42, & aaqq, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[q] = aaqq * sqrt((max(d__1,d__2))) ; mxsinj = max(mxsinj,*sfmin); } /* END IF ROTOK THEN ... ELSE */ /* In the case of cancellation in updating SVA(q), SVA(p) */ /* recompute SVA(q), SVA(p). */ /* Computing 2nd power */ d__1 = sva[q] / aaqq; if (d__1 * d__1 <= rooteps) { if (aaqq < rootbig && aaqq > rootsfmin) { sva[q] = _starpu_dnrm2_(m, &a[q * a_dim1 + 1], &c__1) * d__[q]; } else { t = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[q * a_dim1 + 1], & c__1, &t, &aaqq); sva[q] = t * sqrt(aaqq) * d__[q]; } } if (aapp / aapp0 <= rooteps) { if (aapp < rootbig && aapp > rootsfmin) { aapp = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * d__[p]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], & c__1, &t, &aapp); aapp = t * sqrt(aapp) * d__[p]; } sva[p] = aapp; } } else { /* A(:,p) and A(:,q) already numerically orthogonal */ if (ir1 == 0) { ++notrot; } ++pskipped; } } else { /* A(:,q) is zero column */ if (ir1 == 0) { ++notrot; } ++pskipped; } if (i__ <= swband && pskipped > rowskip) { if (ir1 == 0) { aapp = -aapp; } notrot = 0; goto L2103; } /* L2002: */ } /* END q-LOOP */ L2103: /* bailed out of q-loop */ sva[p] = aapp; } else { sva[p] = aapp; if (ir1 == 0 && aapp == 0.) { /* Computing MIN */ i__5 = igl + kbl - 1; notrot = notrot + min(i__5,*n) - p; } } /* L2001: */ } /* end of the p-loop */ /* end of doing the block ( ibr, ibr ) */ /* L1002: */ } /* end of ir1-loop */ /* ........................................................ */ /* ... go to the off diagonal blocks */ igl = (ibr - 1) * kbl + 1; i__3 = nbl; for (jbc = ibr + 1; jbc <= i__3; ++jbc) { jgl = (jbc - 1) * kbl + 1; /* doing the block at ( ibr, jbc ) */ ijblsk = 0; /* Computing MIN */ i__5 = igl + kbl - 1; i__4 = min(i__5,*n); for (p = igl; p <= i__4; ++p) { aapp = sva[p]; if (aapp > 0.) { pskipped = 0; /* Computing MIN */ i__6 = jgl + kbl - 1; i__5 = min(i__6,*n); for (q = jgl; q <= i__5; ++q) { aaqq = sva[q]; if (aaqq > 0.) { aapp0 = aapp; /* -#- M x 2 Jacobi SVD -#- */ /* -#- Safe Gram matrix computation -#- */ if (aaqq >= 1.) { if (aapp >= aaqq) { rotok = small * aapp <= aaqq; } else { rotok = small * aaqq <= aapp; } if (aapp < big / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * d__[p] * d__[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & d__[p], m, &c__1, &work[1], lda, &ierr); aapq = _starpu_ddot_(m, &work[1], &c__1, &a[q * a_dim1 + 1], &c__1) * d__[q] / aaqq; } } else { if (aapp >= aaqq) { rotok = aapp <= aaqq / small; } else { rotok = aaqq <= aapp / small; } if (aapp > small / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * d__[p] * d__[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & d__[q], m, &c__1, &work[1], lda, &ierr); aapq = _starpu_ddot_(m, &work[1], &c__1, &a[p * a_dim1 + 1], &c__1) * d__[p] / aapp; } } /* Computing MAX */ d__1 = mxaapq, d__2 = abs(aapq); mxaapq = max(d__1,d__2); /* TO rotate or NOT to rotate, THAT is the question ... */ if (abs(aapq) > *tol) { notrot = 0; /* ROTATED = ROTATED + 1 */ pskipped = 0; ++iswrot; if (rotok) { aqoap = aaqq / aapp; apoaq = aapp / aaqq; theta = (d__1 = aqoap - apoaq, abs( d__1)) * -.5 / aapq; if (aaqq > aapp0) { theta = -theta; } if (abs(theta) > bigtheta) { t = .5 / theta; fastr[2] = t * d__[p] / d__[q]; fastr[3] = -t * d__[q] / d__[p]; _starpu_drotm_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1, fastr); } /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); /* Computing MAX */ d__1 = 0., d__2 = 1. - t * aqoap * aapq; aapp *= sqrt((max(d__1,d__2))); /* Computing MAX */ d__1 = mxsinj, d__2 = abs(t); mxsinj = max(d__1,d__2); } else { /* .. choose correct signum for THETA and rotate */ thsign = -d_sign(&c_b42, &aapq); if (aaqq > aapp0) { thsign = -thsign; } t = 1. / (theta + thsign * sqrt( theta * theta + 1.)); cs = sqrt(1. / (t * t + 1.)); sn = t * cs; /* Computing MAX */ d__1 = mxsinj, d__2 = abs(sn); mxsinj = max(d__1,d__2); /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); aapp *= sqrt(1. - t * aqoap * aapq); apoaq = d__[p] / d__[q]; aqoap = d__[q] / d__[p]; if (d__[p] >= 1.) { if (d__[q] >= 1.) { fastr[2] = t * apoaq; fastr[3] = -t * aqoap; d__[p] *= cs; d__[q] *= cs; _starpu_drotm_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[ q * v_dim1 + 1], &c__1, fastr); } } else { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); } d__[p] *= cs; d__[q] /= cs; } } else { if (d__[q] >= 1.) { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); } d__[p] /= cs; d__[q] *= cs; } else { if (d__[p] >= d__[q]) { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__[p] *= cs; d__[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } else { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__[p] /= cs; d__[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); } } } } } } else { if (aapp > aaqq) { _starpu_dcopy_(m, &a[p * a_dim1 + 1], & c__1, &work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &c_b42, m, &c__1, &work[1] , lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, &c_b42, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); temp1 = -aapq * d__[p] / d__[q]; _starpu_daxpy_(m, &temp1, &work[1], &c__1, &a[q * a_dim1 + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b42, &aaqq, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[q] = aaqq * sqrt((max(d__1, d__2))); mxsinj = max(mxsinj,*sfmin); } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], & c__1, &work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, &c_b42, m, &c__1, &work[1] , lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &c_b42, m, &c__1, &a[p * a_dim1 + 1], lda, &ierr); temp1 = -aapq * d__[q] / d__[p]; _starpu_daxpy_(m, &temp1, &work[1], &c__1, &a[p * a_dim1 + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b42, &aapp, m, &c__1, &a[p * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[p] = aapp * sqrt((max(d__1, d__2))); mxsinj = max(mxsinj,*sfmin); } } /* END IF ROTOK THEN ... ELSE */ /* In the case of cancellation in updating SVA(q) */ /* .. recompute SVA(q) */ /* Computing 2nd power */ d__1 = sva[q] / aaqq; if (d__1 * d__1 <= rooteps) { if (aaqq < rootbig && aaqq > rootsfmin) { sva[q] = _starpu_dnrm2_(m, &a[q * a_dim1 + 1], &c__1) * d__[q]; } else { t = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[q * a_dim1 + 1], & c__1, &t, &aaqq); sva[q] = t * sqrt(aaqq) * d__[q]; } } /* Computing 2nd power */ d__1 = aapp / aapp0; if (d__1 * d__1 <= rooteps) { if (aapp < rootbig && aapp > rootsfmin) { aapp = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * d__[p]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], & c__1, &t, &aapp); aapp = t * sqrt(aapp) * d__[p]; } sva[p] = aapp; } /* end of OK rotation */ } else { ++notrot; ++pskipped; ++ijblsk; } } else { ++notrot; ++pskipped; ++ijblsk; } if (i__ <= swband && ijblsk >= blskip) { sva[p] = aapp; notrot = 0; goto L2011; } if (i__ <= swband && pskipped > rowskip) { aapp = -aapp; notrot = 0; goto L2203; } /* L2200: */ } /* end of the q-loop */ L2203: sva[p] = aapp; } else { if (aapp == 0.) { /* Computing MIN */ i__5 = jgl + kbl - 1; notrot = notrot + min(i__5,*n) - jgl + 1; } if (aapp < 0.) { notrot = 0; } } /* L2100: */ } /* end of the p-loop */ /* L2010: */ } /* end of the jbc-loop */ L2011: /* 2011 bailed out of the jbc-loop */ /* Computing MIN */ i__4 = igl + kbl - 1; i__3 = min(i__4,*n); for (p = igl; p <= i__3; ++p) { sva[p] = (d__1 = sva[p], abs(d__1)); /* L2012: */ } /* L2000: */ } /* 2000 :: end of the ibr-loop */ /* .. update SVA(N) */ if (sva[*n] < rootbig && sva[*n] > rootsfmin) { sva[*n] = _starpu_dnrm2_(m, &a[*n * a_dim1 + 1], &c__1) * d__[*n]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[*n * a_dim1 + 1], &c__1, &t, &aapp); sva[*n] = t * sqrt(aapp) * d__[*n]; } /* Additional steering devices */ if (i__ < swband && (mxaapq <= roottol || iswrot <= *n)) { swband = i__; } if (i__ > swband + 1 && mxaapq < (doublereal) (*n) * *tol && ( doublereal) (*n) * mxaapq * mxsinj < *tol) { goto L1994; } if (notrot >= emptsw) { goto L1994; } /* L1993: */ } /* end i=1:NSWEEP loop */ /* #:) Reaching this point means that the procedure has comleted the given */ /* number of iterations. */ *info = *nsweep - 1; goto L1995; L1994: /* #:) Reaching this point means that during the i-th sweep all pivots were */ /* below the given tolerance, causing early exit. */ *info = 0; /* #:) INFO = 0 confirms successful iterations. */ L1995: /* Sort the vector D. */ i__1 = *n - 1; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; q = _starpu_idamax_(&i__2, &sva[p], &c__1) + p - 1; if (p != q) { temp1 = sva[p]; sva[p] = sva[q]; sva[q] = temp1; temp1 = d__[p]; d__[p] = d__[q]; d__[q] = temp1; _starpu_dswap_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); if (rsvec) { _starpu_dswap_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } /* L5991: */ } return 0; /* .. */ /* .. END OF DGSVJ0 */ /* .. */ } /* _starpu_dgsvj0_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgsvj1.c000066400000000000000000000600271413463044200205510ustar00rootroot00000000000000/* dgsvj1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b35 = 1.; /* Subroutine */ int _starpu_dgsvj1_(char *jobv, integer *m, integer *n, integer *n1, doublereal *a, integer *lda, doublereal *d__, doublereal *sva, integer *mv, doublereal *v, integer *ldv, doublereal *eps, doublereal *sfmin, doublereal *tol, integer *nsweep, doublereal *work, integer * lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal bigtheta; integer pskipped, i__, p, q; doublereal t, rootsfmin, cs, sn; integer jbc; doublereal big; integer kbl, igl, ibr, jgl, mvl, nblc; doublereal aapp, aapq, aaqq; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer nblr, ierr; doublereal aapp0; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp1, large, apoaq, aqoap; extern logical _starpu_lsame_(char *, char *); doublereal theta, small; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal fastr[5]; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical applv, rsvec; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_drotm_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *); logical rotok; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer ijblsk, swband, blskip; doublereal mxaapq; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal thsign, mxsinj; integer emptsw, notrot, iswrot; doublereal rootbig, rooteps; integer rowskip; doublereal roottol; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Zlatko Drmac of the University of Zagreb and -- */ /* -- Kresimir Veselic of the Fernuniversitaet Hagen -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* This routine is also part of SIGMA (version 1.23, October 23. 2008.) */ /* SIGMA is a library of algorithms for highly accurate algorithms for */ /* computation of SVD, PSVD, QSVD, (H,K)-SVD, and for solution of the */ /* eigenvalue problems Hx = lambda M x, H M x = lambda x with H, M > 0. */ /* -#- Scalar Arguments -#- */ /* -#- Array Arguments -#- */ /* .. */ /* Purpose */ /* ~~~~~~~ */ /* DGSVJ1 is called from SGESVJ as a pre-processor and that is its main */ /* purpose. It applies Jacobi rotations in the same way as SGESVJ does, but */ /* it targets only particular pivots and it does not check convergence */ /* (stopping criterion). Few tunning parameters (marked by [TP]) are */ /* available for the implementer. */ /* Further details */ /* ~~~~~~~~~~~~~~~ */ /* DGSVJ1 applies few sweeps of Jacobi rotations in the column space of */ /* the input M-by-N matrix A. The pivot pairs are taken from the (1,2) */ /* off-diagonal block in the corresponding N-by-N Gram matrix A^T * A. The */ /* block-entries (tiles) of the (1,2) off-diagonal block are marked by the */ /* [x]'s in the following scheme: */ /* | * * * [x] [x] [x]| */ /* | * * * [x] [x] [x]| Row-cycling in the nblr-by-nblc [x] blocks. */ /* | * * * [x] [x] [x]| Row-cyclic pivoting inside each [x] block. */ /* |[x] [x] [x] * * * | */ /* |[x] [x] [x] * * * | */ /* |[x] [x] [x] * * * | */ /* In terms of the columns of A, the first N1 columns are rotated 'against' */ /* the remaining N-N1 columns, trying to increase the angle between the */ /* corresponding subspaces. The off-diagonal block is N1-by(N-N1) and it is */ /* tiled using quadratic tiles of side KBL. Here, KBL is a tunning parmeter. */ /* The number of sweeps is given in NSWEEP and the orthogonality threshold */ /* is given in TOL. */ /* Contributors */ /* ~~~~~~~~~~~~ */ /* Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany) */ /* Arguments */ /* ~~~~~~~~~ */ /* JOBV (input) CHARACTER*1 */ /* Specifies whether the output from this procedure is used */ /* to compute the matrix V: */ /* = 'V': the product of the Jacobi rotations is accumulated */ /* by postmulyiplying the N-by-N array V. */ /* (See the description of V.) */ /* = 'A': the product of the Jacobi rotations is accumulated */ /* by postmulyiplying the MV-by-N array V. */ /* (See the descriptions of MV and V.) */ /* = 'N': the Jacobi rotations are not accumulated. */ /* M (input) INTEGER */ /* The number of rows of the input matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the input matrix A. */ /* M >= N >= 0. */ /* N1 (input) INTEGER */ /* N1 specifies the 2 x 2 block partition, the first N1 columns are */ /* rotated 'against' the remaining N-N1 columns of A. */ /* A (input/output) REAL array, dimension (LDA,N) */ /* On entry, M-by-N matrix A, such that A*diag(D) represents */ /* the input matrix. */ /* On exit, */ /* A_onexit * D_onexit represents the input matrix A*diag(D) */ /* post-multiplied by a sequence of Jacobi rotations, where the */ /* rotation threshold and the total number of sweeps are given in */ /* TOL and NSWEEP, respectively. */ /* (See the descriptions of N1, D, TOL and NSWEEP.) */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* D (input/workspace/output) REAL array, dimension (N) */ /* The array D accumulates the scaling factors from the fast scaled */ /* Jacobi rotations. */ /* On entry, A*diag(D) represents the input matrix. */ /* On exit, A_onexit*diag(D_onexit) represents the input matrix */ /* post-multiplied by a sequence of Jacobi rotations, where the */ /* rotation threshold and the total number of sweeps are given in */ /* TOL and NSWEEP, respectively. */ /* (See the descriptions of N1, A, TOL and NSWEEP.) */ /* SVA (input/workspace/output) REAL array, dimension (N) */ /* On entry, SVA contains the Euclidean norms of the columns of */ /* the matrix A*diag(D). */ /* On exit, SVA contains the Euclidean norms of the columns of */ /* the matrix onexit*diag(D_onexit). */ /* MV (input) INTEGER */ /* If JOBV .EQ. 'A', then MV rows of V are post-multipled by a */ /* sequence of Jacobi rotations. */ /* If JOBV = 'N', then MV is not referenced. */ /* V (input/output) REAL array, dimension (LDV,N) */ /* If JOBV .EQ. 'V' then N rows of V are post-multipled by a */ /* sequence of Jacobi rotations. */ /* If JOBV .EQ. 'A' then MV rows of V are post-multipled by a */ /* sequence of Jacobi rotations. */ /* If JOBV = 'N', then V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V, LDV >= 1. */ /* If JOBV = 'V', LDV .GE. N. */ /* If JOBV = 'A', LDV .GE. MV. */ /* EPS (input) INTEGER */ /* EPS = SLAMCH('Epsilon') */ /* SFMIN (input) INTEGER */ /* SFMIN = SLAMCH('Safe Minimum') */ /* TOL (input) REAL */ /* TOL is the threshold for Jacobi rotations. For a pair */ /* A(:,p), A(:,q) of pivot columns, the Jacobi rotation is */ /* applied only if DABS(COS(angle(A(:,p),A(:,q)))) .GT. TOL. */ /* NSWEEP (input) INTEGER */ /* NSWEEP is the number of sweeps of Jacobi rotations to be */ /* performed. */ /* WORK (workspace) REAL array, dimension LWORK. */ /* LWORK (input) INTEGER */ /* LWORK is the dimension of WORK. LWORK .GE. M. */ /* INFO (output) INTEGER */ /* = 0 : successful exit. */ /* < 0 : if INFO = -i, then the i-th argument had an illegal value */ /* -#- Local Parameters -#- */ /* -#- Local Scalars -#- */ /* Local Arrays */ /* Intrinsic Functions */ /* External Functions */ /* External Subroutines */ /* Parameter adjustments */ --sva; --d__; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --work; /* Function Body */ applv = _starpu_lsame_(jobv, "A"); rsvec = _starpu_lsame_(jobv, "V"); if (! (rsvec || applv || _starpu_lsame_(jobv, "N"))) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0 || *n > *m) { *info = -3; } else if (*n1 < 0) { *info = -4; } else if (*lda < *m) { *info = -6; } else if (*mv < 0) { *info = -9; } else if (*ldv < *m) { *info = -11; } else if (*tol <= *eps) { *info = -14; } else if (*nsweep < 0) { *info = -15; } else if (*lwork < *m) { *info = -17; } else { *info = 0; } /* #:( */ if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGSVJ1", &i__1); return 0; } if (rsvec) { mvl = *n; } else if (applv) { mvl = *mv; } rsvec = rsvec || applv; rooteps = sqrt(*eps); rootsfmin = sqrt(*sfmin); small = *sfmin / *eps; big = 1. / *sfmin; rootbig = 1. / rootsfmin; large = big / sqrt((doublereal) (*m * *n)); bigtheta = 1. / rooteps; roottol = sqrt(*tol); /* -#- Initialize the right singular vector matrix -#- */ /* RSVEC = LSAME( JOBV, 'Y' ) */ emptsw = *n1 * (*n - *n1); notrot = 0; fastr[0] = 0.; /* -#- Row-cyclic pivot strategy with de Rijk's pivoting -#- */ kbl = min(8,*n); nblr = *n1 / kbl; if (nblr * kbl != *n1) { ++nblr; } /* .. the tiling is nblr-by-nblc [tiles] */ nblc = (*n - *n1) / kbl; if (nblc * kbl != *n - *n1) { ++nblc; } /* Computing 2nd power */ i__1 = kbl; blskip = i__1 * i__1 + 1; /* [TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL. */ rowskip = min(5,kbl); /* [TP] ROWSKIP is a tuning parameter. */ swband = 0; /* [TP] SWBAND is a tuning parameter. It is meaningful and effective */ /* if SGESVJ is used as a computational routine in the preconditioned */ /* Jacobi SVD algorithm SGESVJ. */ /* | * * * [x] [x] [x]| */ /* | * * * [x] [x] [x]| Row-cycling in the nblr-by-nblc [x] blocks. */ /* | * * * [x] [x] [x]| Row-cyclic pivoting inside each [x] block. */ /* |[x] [x] [x] * * * | */ /* |[x] [x] [x] * * * | */ /* |[x] [x] [x] * * * | */ i__1 = *nsweep; for (i__ = 1; i__ <= i__1; ++i__) { /* .. go go go ... */ mxaapq = 0.; mxsinj = 0.; iswrot = 0; notrot = 0; pskipped = 0; i__2 = nblr; for (ibr = 1; ibr <= i__2; ++ibr) { igl = (ibr - 1) * kbl + 1; /* ........................................................ */ /* ... go to the off diagonal blocks */ igl = (ibr - 1) * kbl + 1; i__3 = nblc; for (jbc = 1; jbc <= i__3; ++jbc) { jgl = *n1 + (jbc - 1) * kbl + 1; /* doing the block at ( ibr, jbc ) */ ijblsk = 0; /* Computing MIN */ i__5 = igl + kbl - 1; i__4 = min(i__5,*n1); for (p = igl; p <= i__4; ++p) { aapp = sva[p]; if (aapp > 0.) { pskipped = 0; /* Computing MIN */ i__6 = jgl + kbl - 1; i__5 = min(i__6,*n); for (q = jgl; q <= i__5; ++q) { aaqq = sva[q]; if (aaqq > 0.) { aapp0 = aapp; /* -#- M x 2 Jacobi SVD -#- */ /* -#- Safe Gram matrix computation -#- */ if (aaqq >= 1.) { if (aapp >= aaqq) { rotok = small * aapp <= aaqq; } else { rotok = small * aaqq <= aapp; } if (aapp < big / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * d__[p] * d__[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[p * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, & d__[p], m, &c__1, &work[1], lda, &ierr); aapq = _starpu_ddot_(m, &work[1], &c__1, &a[q * a_dim1 + 1], &c__1) * d__[q] / aaqq; } } else { if (aapp >= aaqq) { rotok = aapp <= aaqq / small; } else { rotok = aaqq <= aapp / small; } if (aapp > small / aaqq) { aapq = _starpu_ddot_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], & c__1) * d__[p] * d__[q] / aaqq / aapp; } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], &c__1, & work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, & d__[q], m, &c__1, &work[1], lda, &ierr); aapq = _starpu_ddot_(m, &work[1], &c__1, &a[p * a_dim1 + 1], &c__1) * d__[p] / aapp; } } /* Computing MAX */ d__1 = mxaapq, d__2 = abs(aapq); mxaapq = max(d__1,d__2); /* TO rotate or NOT to rotate, THAT is the question ... */ if (abs(aapq) > *tol) { notrot = 0; /* ROTATED = ROTATED + 1 */ pskipped = 0; ++iswrot; if (rotok) { aqoap = aaqq / aapp; apoaq = aapp / aaqq; theta = (d__1 = aqoap - apoaq, abs( d__1)) * -.5 / aapq; if (aaqq > aapp0) { theta = -theta; } if (abs(theta) > bigtheta) { t = .5 / theta; fastr[2] = t * d__[p] / d__[q]; fastr[3] = -t * d__[q] / d__[p]; _starpu_drotm_(m, &a[p * a_dim1 + 1], & c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], &c__1, fastr); } /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); /* Computing MAX */ d__1 = 0., d__2 = 1. - t * aqoap * aapq; aapp *= sqrt((max(d__1,d__2))); /* Computing MAX */ d__1 = mxsinj, d__2 = abs(t); mxsinj = max(d__1,d__2); } else { /* .. choose correct signum for THETA and rotate */ thsign = -d_sign(&c_b35, &aapq); if (aaqq > aapp0) { thsign = -thsign; } t = 1. / (theta + thsign * sqrt( theta * theta + 1.)); cs = sqrt(1. / (t * t + 1.)); sn = t * cs; /* Computing MAX */ d__1 = mxsinj, d__2 = abs(sn); mxsinj = max(d__1,d__2); /* Computing MAX */ d__1 = 0., d__2 = t * apoaq * aapq + 1.; sva[q] = aaqq * sqrt((max(d__1, d__2))); aapp *= sqrt(1. - t * aqoap * aapq); apoaq = d__[p] / d__[q]; aqoap = d__[q] / d__[p]; if (d__[p] >= 1.) { if (d__[q] >= 1.) { fastr[2] = t * apoaq; fastr[3] = -t * aqoap; d__[p] *= cs; d__[q] *= cs; _starpu_drotm_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1, fastr); if (rsvec) { _starpu_drotm_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[ q * v_dim1 + 1], &c__1, fastr); } } else { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); } d__[p] *= cs; d__[q] /= cs; } } else { if (d__[q] >= 1.) { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[ q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[ p * a_dim1 + 1], &c__1); if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], & c__1, &v[q * v_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], & c__1, &v[p * v_dim1 + 1], &c__1); } d__[p] /= cs; d__[q] *= cs; } else { if (d__[p] >= d__[q]) { d__1 = -t * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__[p] *= cs; d__[q] /= cs; if (rsvec) { d__1 = -t * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); d__1 = cs * sn * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } else { d__1 = t * apoaq; _starpu_daxpy_(m, &d__1, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(m, &d__1, &a[q * a_dim1 + 1], &c__1, &a[p * a_dim1 + 1], &c__1); d__[p] /= cs; d__[q] *= cs; if (rsvec) { d__1 = t * apoaq; _starpu_daxpy_(&mvl, &d__1, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); d__1 = -cs * sn * aqoap; _starpu_daxpy_(&mvl, &d__1, &v[q * v_dim1 + 1], &c__1, &v[p * v_dim1 + 1], & c__1); } } } } } } else { if (aapp > aaqq) { _starpu_dcopy_(m, &a[p * a_dim1 + 1], & c__1, &work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &c_b35, m, &c__1, &work[1] , lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, &c_b35, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); temp1 = -aapq * d__[p] / d__[q]; _starpu_daxpy_(m, &temp1, &work[1], &c__1, &a[q * a_dim1 + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b35, &aaqq, m, &c__1, &a[q * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[q] = aaqq * sqrt((max(d__1, d__2))); mxsinj = max(mxsinj,*sfmin); } else { _starpu_dcopy_(m, &a[q * a_dim1 + 1], & c__1, &work[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &aaqq, &c_b35, m, &c__1, &work[1] , lda, &ierr); _starpu_dlascl_("G", &c__0, &c__0, &aapp, &c_b35, m, &c__1, &a[p * a_dim1 + 1], lda, &ierr); temp1 = -aapq * d__[q] / d__[p]; _starpu_daxpy_(m, &temp1, &work[1], &c__1, &a[p * a_dim1 + 1], & c__1); _starpu_dlascl_("G", &c__0, &c__0, &c_b35, &aapp, m, &c__1, &a[p * a_dim1 + 1], lda, &ierr); /* Computing MAX */ d__1 = 0., d__2 = 1. - aapq * aapq; sva[p] = aapp * sqrt((max(d__1, d__2))); mxsinj = max(mxsinj,*sfmin); } } /* END IF ROTOK THEN ... ELSE */ /* In the case of cancellation in updating SVA(q) */ /* .. recompute SVA(q) */ /* Computing 2nd power */ d__1 = sva[q] / aaqq; if (d__1 * d__1 <= rooteps) { if (aaqq < rootbig && aaqq > rootsfmin) { sva[q] = _starpu_dnrm2_(m, &a[q * a_dim1 + 1], &c__1) * d__[q]; } else { t = 0.; aaqq = 0.; _starpu_dlassq_(m, &a[q * a_dim1 + 1], & c__1, &t, &aaqq); sva[q] = t * sqrt(aaqq) * d__[q]; } } /* Computing 2nd power */ d__1 = aapp / aapp0; if (d__1 * d__1 <= rooteps) { if (aapp < rootbig && aapp > rootsfmin) { aapp = _starpu_dnrm2_(m, &a[p * a_dim1 + 1], &c__1) * d__[p]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[p * a_dim1 + 1], & c__1, &t, &aapp); aapp = t * sqrt(aapp) * d__[p]; } sva[p] = aapp; } /* end of OK rotation */ } else { ++notrot; /* SKIPPED = SKIPPED + 1 */ ++pskipped; ++ijblsk; } } else { ++notrot; ++pskipped; ++ijblsk; } /* IF ( NOTROT .GE. EMPTSW ) GO TO 2011 */ if (i__ <= swband && ijblsk >= blskip) { sva[p] = aapp; notrot = 0; goto L2011; } if (i__ <= swband && pskipped > rowskip) { aapp = -aapp; notrot = 0; goto L2203; } /* L2200: */ } /* end of the q-loop */ L2203: sva[p] = aapp; } else { if (aapp == 0.) { /* Computing MIN */ i__5 = jgl + kbl - 1; notrot = notrot + min(i__5,*n) - jgl + 1; } if (aapp < 0.) { notrot = 0; } /* ** IF ( NOTROT .GE. EMPTSW ) GO TO 2011 */ } /* L2100: */ } /* end of the p-loop */ /* L2010: */ } /* end of the jbc-loop */ L2011: /* 2011 bailed out of the jbc-loop */ /* Computing MIN */ i__4 = igl + kbl - 1; i__3 = min(i__4,*n); for (p = igl; p <= i__3; ++p) { sva[p] = (d__1 = sva[p], abs(d__1)); /* L2012: */ } /* ** IF ( NOTROT .GE. EMPTSW ) GO TO 1994 */ /* L2000: */ } /* 2000 :: end of the ibr-loop */ /* .. update SVA(N) */ if (sva[*n] < rootbig && sva[*n] > rootsfmin) { sva[*n] = _starpu_dnrm2_(m, &a[*n * a_dim1 + 1], &c__1) * d__[*n]; } else { t = 0.; aapp = 0.; _starpu_dlassq_(m, &a[*n * a_dim1 + 1], &c__1, &t, &aapp); sva[*n] = t * sqrt(aapp) * d__[*n]; } /* Additional steering devices */ if (i__ < swband && (mxaapq <= roottol || iswrot <= *n)) { swband = i__; } if (i__ > swband + 1 && mxaapq < (doublereal) (*n) * *tol && ( doublereal) (*n) * mxaapq * mxsinj < *tol) { goto L1994; } if (notrot >= emptsw) { goto L1994; } /* L1993: */ } /* end i=1:NSWEEP loop */ /* #:) Reaching this point means that the procedure has completed the given */ /* number of sweeps. */ *info = *nsweep - 1; goto L1995; L1994: /* #:) Reaching this point means that during the i-th sweep all pivots were */ /* below the given threshold, causing early exit. */ *info = 0; /* #:) INFO = 0 confirms successful iterations. */ L1995: /* Sort the vector D */ i__1 = *n - 1; for (p = 1; p <= i__1; ++p) { i__2 = *n - p + 1; q = _starpu_idamax_(&i__2, &sva[p], &c__1) + p - 1; if (p != q) { temp1 = sva[p]; sva[p] = sva[q]; sva[q] = temp1; temp1 = d__[p]; d__[p] = d__[q]; d__[q] = temp1; _starpu_dswap_(m, &a[p * a_dim1 + 1], &c__1, &a[q * a_dim1 + 1], &c__1); if (rsvec) { _starpu_dswap_(&mvl, &v[p * v_dim1 + 1], &c__1, &v[q * v_dim1 + 1], & c__1); } } /* L5991: */ } return 0; /* .. */ /* .. END OF DGSVJ1 */ /* .. */ } /* _starpu_dgsvj1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgtcon.c000066400000000000000000000135431413463044200206320ustar00rootroot00000000000000/* dgtcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgtcon_(char *norm, integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, kase, kase1; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; logical onenrm; extern /* Subroutine */ int _starpu_dgttrs_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTCON estimates the reciprocal of the condition number of a real */ /* tridiagonal matrix A using the LU factorization as computed by */ /* DGTTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies whether the 1-norm condition number or the */ /* infinity-norm condition number is required: */ /* = '1' or 'O': 1-norm; */ /* = 'I': Infinity-norm. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) multipliers that define the matrix L from the */ /* LU factorization of A as computed by DGTTRF. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the upper triangular matrix U from */ /* the LU factorization of A. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) elements of the first superdiagonal of U. */ /* DU2 (input) DOUBLE PRECISION array, dimension (N-2) */ /* The (n-2) elements of the second superdiagonal of U. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= n, row i of the matrix was */ /* interchanged with row IPIV(i). IPIV(i) will always be either */ /* i or i+1; IPIV(i) = i indicates a row interchange was not */ /* required. */ /* ANORM (input) DOUBLE PRECISION */ /* If NORM = '1' or 'O', the 1-norm of the original matrix A. */ /* If NORM = 'I', the infinity-norm of the original matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an */ /* estimate of the 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* Parameter adjustments */ --iwork; --work; --ipiv; --du2; --du; --d__; --dl; /* Function Body */ *info = 0; onenrm = *(unsigned char *)norm == '1' || _starpu_lsame_(norm, "O"); if (! onenrm && ! _starpu_lsame_(norm, "I")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*anorm < 0.) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGTCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } /* Check that D(1:N) is non-zero. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] == 0.) { return 0; } /* L10: */ } ainvnm = 0.; if (onenrm) { kase1 = 1; } else { kase1 = 2; } kase = 0; L20: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { /* Multiply by inv(U)*inv(L). */ _starpu_dgttrs_("No transpose", n, &c__1, &dl[1], &d__[1], &du[1], &du2[1] , &ipiv[1], &work[1], n, info); } else { /* Multiply by inv(L')*inv(U'). */ _starpu_dgttrs_("Transpose", n, &c__1, &dl[1], &d__[1], &du[1], &du2[1], & ipiv[1], &work[1], n, info); } goto L20; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } return 0; /* End of DGTCON */ } /* _starpu_dgtcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgtrfs.c000066400000000000000000000337411413463044200206470ustar00rootroot00000000000000/* dgtrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b18 = -1.; static doublereal c_b19 = 1.; /* Subroutine */ int _starpu_dgtrfs_(char *trans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Local variables */ integer i__, j; doublereal s; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlagtm_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; char transn[1]; extern /* Subroutine */ int _starpu_dgttrs_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); char transt[1]; doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is tridiagonal, and provides */ /* error bounds and backward error estimates for the solution. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of A. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of A. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) superdiagonal elements of A. */ /* DLF (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) multipliers that define the matrix L from the */ /* LU factorization of A as computed by DGTTRF. */ /* DF (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the upper triangular matrix U from */ /* the LU factorization of A. */ /* DUF (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) elements of the first superdiagonal of U. */ /* DU2 (input) DOUBLE PRECISION array, dimension (N-2) */ /* The (n-2) elements of the second superdiagonal of U. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= n, row i of the matrix was */ /* interchanged with row IPIV(i). IPIV(i) will always be either */ /* i or i+1; IPIV(i) = i indicates a row interchange was not */ /* required. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGTTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --dl; --d__; --du; --dlf; --df; --duf; --du2; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; notran = _starpu_lsame_(trans, "N"); if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -13; } else if (*ldx < max(1,*n)) { *info = -15; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGTRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } if (notran) { *(unsigned char *)transn = 'N'; *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transn = 'T'; *(unsigned char *)transt = 'N'; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = 4; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - op(A) * X, */ /* where op(A) = A, A**T, or A**H, depending on TRANS. */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dlagtm_(trans, n, &c__1, &c_b18, &dl[1], &d__[1], &du[1], &x[j * x_dim1 + 1], ldx, &c_b19, &work[*n + 1], n); /* Compute abs(op(A))*abs(x) + abs(b) for use in the backward */ /* error bound. */ if (notran) { if (*n == 1) { work[1] = (d__1 = b[j * b_dim1 + 1], abs(d__1)) + (d__2 = d__[ 1] * x[j * x_dim1 + 1], abs(d__2)); } else { work[1] = (d__1 = b[j * b_dim1 + 1], abs(d__1)) + (d__2 = d__[ 1] * x[j * x_dim1 + 1], abs(d__2)) + (d__3 = du[1] * x[j * x_dim1 + 2], abs(d__3)); i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)) + ( d__2 = dl[i__ - 1] * x[i__ - 1 + j * x_dim1], abs( d__2)) + (d__3 = d__[i__] * x[i__ + j * x_dim1], abs(d__3)) + (d__4 = du[i__] * x[i__ + 1 + j * x_dim1], abs(d__4)); /* L30: */ } work[*n] = (d__1 = b[*n + j * b_dim1], abs(d__1)) + (d__2 = dl[*n - 1] * x[*n - 1 + j * x_dim1], abs(d__2)) + ( d__3 = d__[*n] * x[*n + j * x_dim1], abs(d__3)); } } else { if (*n == 1) { work[1] = (d__1 = b[j * b_dim1 + 1], abs(d__1)) + (d__2 = d__[ 1] * x[j * x_dim1 + 1], abs(d__2)); } else { work[1] = (d__1 = b[j * b_dim1 + 1], abs(d__1)) + (d__2 = d__[ 1] * x[j * x_dim1 + 1], abs(d__2)) + (d__3 = dl[1] * x[j * x_dim1 + 2], abs(d__3)); i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)) + ( d__2 = du[i__ - 1] * x[i__ - 1 + j * x_dim1], abs( d__2)) + (d__3 = d__[i__] * x[i__ + j * x_dim1], abs(d__3)) + (d__4 = dl[i__] * x[i__ + 1 + j * x_dim1], abs(d__4)); /* L40: */ } work[*n] = (d__1 = b[*n + j * b_dim1], abs(d__1)) + (d__2 = du[*n - 1] * x[*n - 1 + j * x_dim1], abs(d__2)) + ( d__3 = d__[*n] * x[*n + j * x_dim1], abs(d__3)); } } /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L50: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dgttrs_(trans, n, &c__1, &dlf[1], &df[1], &duf[1], &du2[1], &ipiv[ 1], &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b19, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(op(A)))* */ /* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(op(A)) is the inverse of op(A) */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(op(A))*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(op(A)) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L60: */ } kase = 0; L70: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(op(A)**T). */ _starpu_dgttrs_(transt, n, &c__1, &dlf[1], &df[1], &duf[1], &du2[1], & ipiv[1], &work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L80: */ } } else { /* Multiply by inv(op(A))*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L90: */ } _starpu_dgttrs_(transn, n, &c__1, &dlf[1], &df[1], &duf[1], &du2[1], & ipiv[1], &work[*n + 1], n, info); } goto L70; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L100: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L110: */ } return 0; /* End of DGTRFS */ } /* _starpu_dgtrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgtsv.c000066400000000000000000000200771413463044200205030ustar00rootroot00000000000000/* dgtsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgtsv_(integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j; doublereal fact, temp; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTSV solves the equation */ /* A*X = B, */ /* where A is an n by n tridiagonal matrix, by Gaussian elimination with */ /* partial pivoting. */ /* Note that the equation A'*X = B may be solved by interchanging the */ /* order of the arguments DU and DL. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* DL (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, DL must contain the (n-1) sub-diagonal elements of */ /* A. */ /* On exit, DL is overwritten by the (n-2) elements of the */ /* second super-diagonal of the upper triangular matrix U from */ /* the LU factorization of A, in DL(1), ..., DL(n-2). */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, D must contain the diagonal elements of A. */ /* On exit, D is overwritten by the n diagonal elements of U. */ /* DU (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, DU must contain the (n-1) super-diagonal elements */ /* of A. */ /* On exit, DU is overwritten by the (n-1) elements of the first */ /* super-diagonal of U. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N by NRHS matrix of right hand side matrix B. */ /* On exit, if INFO = 0, the N by NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) is exactly zero, and the solution */ /* has not been computed. The factorization has not been */ /* completed unless i = N. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --dl; --d__; --du; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGTSV ", &i__1); return 0; } if (*n == 0) { return 0; } if (*nrhs == 1) { i__1 = *n - 2; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) >= (d__2 = dl[i__], abs(d__2))) { /* No row interchange required */ if (d__[i__] != 0.) { fact = dl[i__] / d__[i__]; d__[i__ + 1] -= fact * du[i__]; b[i__ + 1 + b_dim1] -= fact * b[i__ + b_dim1]; } else { *info = i__; return 0; } dl[i__] = 0.; } else { /* Interchange rows I and I+1 */ fact = d__[i__] / dl[i__]; d__[i__] = dl[i__]; temp = d__[i__ + 1]; d__[i__ + 1] = du[i__] - fact * temp; dl[i__] = du[i__ + 1]; du[i__ + 1] = -fact * dl[i__]; du[i__] = temp; temp = b[i__ + b_dim1]; b[i__ + b_dim1] = b[i__ + 1 + b_dim1]; b[i__ + 1 + b_dim1] = temp - fact * b[i__ + 1 + b_dim1]; } /* L10: */ } if (*n > 1) { i__ = *n - 1; if ((d__1 = d__[i__], abs(d__1)) >= (d__2 = dl[i__], abs(d__2))) { if (d__[i__] != 0.) { fact = dl[i__] / d__[i__]; d__[i__ + 1] -= fact * du[i__]; b[i__ + 1 + b_dim1] -= fact * b[i__ + b_dim1]; } else { *info = i__; return 0; } } else { fact = d__[i__] / dl[i__]; d__[i__] = dl[i__]; temp = d__[i__ + 1]; d__[i__ + 1] = du[i__] - fact * temp; du[i__] = temp; temp = b[i__ + b_dim1]; b[i__ + b_dim1] = b[i__ + 1 + b_dim1]; b[i__ + 1 + b_dim1] = temp - fact * b[i__ + 1 + b_dim1]; } } if (d__[*n] == 0.) { *info = *n; return 0; } } else { i__1 = *n - 2; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) >= (d__2 = dl[i__], abs(d__2))) { /* No row interchange required */ if (d__[i__] != 0.) { fact = dl[i__] / d__[i__]; d__[i__ + 1] -= fact * du[i__]; i__2 = *nrhs; for (j = 1; j <= i__2; ++j) { b[i__ + 1 + j * b_dim1] -= fact * b[i__ + j * b_dim1]; /* L20: */ } } else { *info = i__; return 0; } dl[i__] = 0.; } else { /* Interchange rows I and I+1 */ fact = d__[i__] / dl[i__]; d__[i__] = dl[i__]; temp = d__[i__ + 1]; d__[i__ + 1] = du[i__] - fact * temp; dl[i__] = du[i__ + 1]; du[i__ + 1] = -fact * dl[i__]; du[i__] = temp; i__2 = *nrhs; for (j = 1; j <= i__2; ++j) { temp = b[i__ + j * b_dim1]; b[i__ + j * b_dim1] = b[i__ + 1 + j * b_dim1]; b[i__ + 1 + j * b_dim1] = temp - fact * b[i__ + 1 + j * b_dim1]; /* L30: */ } } /* L40: */ } if (*n > 1) { i__ = *n - 1; if ((d__1 = d__[i__], abs(d__1)) >= (d__2 = dl[i__], abs(d__2))) { if (d__[i__] != 0.) { fact = dl[i__] / d__[i__]; d__[i__ + 1] -= fact * du[i__]; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { b[i__ + 1 + j * b_dim1] -= fact * b[i__ + j * b_dim1]; /* L50: */ } } else { *info = i__; return 0; } } else { fact = d__[i__] / dl[i__]; d__[i__] = dl[i__]; temp = d__[i__ + 1]; d__[i__ + 1] = du[i__] - fact * temp; du[i__] = temp; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { temp = b[i__ + j * b_dim1]; b[i__ + j * b_dim1] = b[i__ + 1 + j * b_dim1]; b[i__ + 1 + j * b_dim1] = temp - fact * b[i__ + 1 + j * b_dim1]; /* L60: */ } } } if (d__[*n] == 0.) { *info = *n; return 0; } } /* Back solve with the matrix U from the factorization. */ if (*nrhs <= 2) { j = 1; L70: b[*n + j * b_dim1] /= d__[*n]; if (*n > 1) { b[*n - 1 + j * b_dim1] = (b[*n - 1 + j * b_dim1] - du[*n - 1] * b[ *n + j * b_dim1]) / d__[*n - 1]; } for (i__ = *n - 2; i__ >= 1; --i__) { b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__] * b[i__ + 1 + j * b_dim1] - dl[i__] * b[i__ + 2 + j * b_dim1]) / d__[ i__]; /* L80: */ } if (j < *nrhs) { ++j; goto L70; } } else { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { b[*n + j * b_dim1] /= d__[*n]; if (*n > 1) { b[*n - 1 + j * b_dim1] = (b[*n - 1 + j * b_dim1] - du[*n - 1] * b[*n + j * b_dim1]) / d__[*n - 1]; } for (i__ = *n - 2; i__ >= 1; --i__) { b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__] * b[i__ + 1 + j * b_dim1] - dl[i__] * b[i__ + 2 + j * b_dim1]) / d__[i__]; /* L90: */ } /* L100: */ } } return 0; /* End of DGTSV */ } /* _starpu_dgtsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgtsvx.c000066400000000000000000000322171413463044200206720ustar00rootroot00000000000000/* dgtsvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dgtsvx_(char *fact, char *trans, integer *n, integer * nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal * dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1; /* Local variables */ char norm[1]; extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlangt_(char *, integer *, doublereal *, doublereal *, doublereal *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dgtcon_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dgtrfs_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dgttrf_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); logical notran; extern /* Subroutine */ int _starpu_dgttrs_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTSVX uses the LU factorization to compute the solution to a real */ /* system of linear equations A * X = B or A**T * X = B, */ /* where A is a tridiagonal matrix of order N and X and B are N-by-NRHS */ /* matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'N', the LU decomposition is used to factor the matrix A */ /* as A = L * U, where L is a product of permutation and unit lower */ /* bidiagonal matrices and U is upper triangular with nonzeros in */ /* only the main diagonal and first two superdiagonals. */ /* 2. If some U(i,i)=0, so that U is exactly singular, then the routine */ /* returns with INFO = i. Otherwise, the factored form of A is used */ /* to estimate the condition number of the matrix A. If the */ /* reciprocal of the condition number is less than machine precision, */ /* INFO = N+1 is returned as a warning, but the routine still goes on */ /* to solve for X and compute error bounds as described below. */ /* 3. The system of equations is solved for X using the factored form */ /* of A. */ /* 4. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of A has been */ /* supplied on entry. */ /* = 'F': DLF, DF, DUF, DU2, and IPIV contain the factored */ /* form of A; DL, D, DU, DLF, DF, DUF, DU2 and IPIV */ /* will not be modified. */ /* = 'N': The matrix will be copied to DLF, DF, and DUF */ /* and factored. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of A. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of A. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) superdiagonal elements of A. */ /* DLF (input or output) DOUBLE PRECISION array, dimension (N-1) */ /* If FACT = 'F', then DLF is an input argument and on entry */ /* contains the (n-1) multipliers that define the matrix L from */ /* the LU factorization of A as computed by DGTTRF. */ /* If FACT = 'N', then DLF is an output argument and on exit */ /* contains the (n-1) multipliers that define the matrix L from */ /* the LU factorization of A. */ /* DF (input or output) DOUBLE PRECISION array, dimension (N) */ /* If FACT = 'F', then DF is an input argument and on entry */ /* contains the n diagonal elements of the upper triangular */ /* matrix U from the LU factorization of A. */ /* If FACT = 'N', then DF is an output argument and on exit */ /* contains the n diagonal elements of the upper triangular */ /* matrix U from the LU factorization of A. */ /* DUF (input or output) DOUBLE PRECISION array, dimension (N-1) */ /* If FACT = 'F', then DUF is an input argument and on entry */ /* contains the (n-1) elements of the first superdiagonal of U. */ /* If FACT = 'N', then DUF is an output argument and on exit */ /* contains the (n-1) elements of the first superdiagonal of U. */ /* DU2 (input or output) DOUBLE PRECISION array, dimension (N-2) */ /* If FACT = 'F', then DU2 is an input argument and on entry */ /* contains the (n-2) elements of the second superdiagonal of */ /* U. */ /* If FACT = 'N', then DU2 is an output argument and on exit */ /* contains the (n-2) elements of the second superdiagonal of */ /* U. */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains the pivot indices from the LU factorization of A as */ /* computed by DGTTRF. */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains the pivot indices from the LU factorization of A; */ /* row i of the matrix was interchanged with row IPIV(i). */ /* IPIV(i) will always be either i or i+1; IPIV(i) = i indicates */ /* a row interchange was not required. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The N-by-NRHS right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A. If RCOND is less than the machine precision (in */ /* particular, if RCOND = 0), the matrix is singular to working */ /* precision. This condition is indicated by a return code of */ /* INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: U(i,i) is exactly zero. The factorization */ /* has not been completed unless i = N, but the */ /* factor U is exactly singular, so the solution */ /* and error bounds could not be computed. */ /* RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --dl; --d__; --du; --dlf; --df; --duf; --du2; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); notran = _starpu_lsame_(trans, "N"); if (! nofact && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldb < max(1,*n)) { *info = -14; } else if (*ldx < max(1,*n)) { *info = -16; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGTSVX", &i__1); return 0; } if (nofact) { /* Compute the LU factorization of A. */ _starpu_dcopy_(n, &d__[1], &c__1, &df[1], &c__1); if (*n > 1) { i__1 = *n - 1; _starpu_dcopy_(&i__1, &dl[1], &c__1, &dlf[1], &c__1); i__1 = *n - 1; _starpu_dcopy_(&i__1, &du[1], &c__1, &duf[1], &c__1); } _starpu_dgttrf_(n, &dlf[1], &df[1], &duf[1], &du2[1], &ipiv[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ if (notran) { *(unsigned char *)norm = '1'; } else { *(unsigned char *)norm = 'I'; } anorm = _starpu_dlangt_(norm, n, &dl[1], &d__[1], &du[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dgtcon_(norm, n, &dlf[1], &df[1], &duf[1], &du2[1], &ipiv[1], &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution vectors X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dgttrs_(trans, n, nrhs, &dlf[1], &df[1], &duf[1], &du2[1], &ipiv[1], &x[ x_offset], ldx, info); /* Use iterative refinement to improve the computed solutions and */ /* compute error bounds and backward error estimates for them. */ _starpu_dgtrfs_(trans, n, nrhs, &dl[1], &d__[1], &du[1], &dlf[1], &df[1], &duf[1], &du2[1], &ipiv[1], &b[b_offset], ldb, &x[x_offset], ldx, &ferr[1] , &berr[1], &work[1], &iwork[1], info); /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DGTSVX */ } /* _starpu_dgtsvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgttrf.c000066400000000000000000000127371413463044200206520ustar00rootroot00000000000000/* dgttrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgttrf_(integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ integer i__; doublereal fact, temp; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTTRF computes an LU factorization of a real tridiagonal matrix A */ /* using elimination with partial pivoting and row interchanges. */ /* The factorization has the form */ /* A = L * U */ /* where L is a product of permutation and unit lower bidiagonal */ /* matrices and U is upper triangular with nonzeros in only the main */ /* diagonal and first two superdiagonals. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* DL (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, DL must contain the (n-1) sub-diagonal elements of */ /* A. */ /* On exit, DL is overwritten by the (n-1) multipliers that */ /* define the matrix L from the LU factorization of A. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, D must contain the diagonal elements of A. */ /* On exit, D is overwritten by the n diagonal elements of the */ /* upper triangular matrix U from the LU factorization of A. */ /* DU (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, DU must contain the (n-1) super-diagonal elements */ /* of A. */ /* On exit, DU is overwritten by the (n-1) elements of the first */ /* super-diagonal of U. */ /* DU2 (output) DOUBLE PRECISION array, dimension (N-2) */ /* On exit, DU2 is overwritten by the (n-2) elements of the */ /* second super-diagonal of U. */ /* IPIV (output) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= n, row i of the matrix was */ /* interchanged with row IPIV(i). IPIV(i) will always be either */ /* i or i+1; IPIV(i) = i indicates a row interchange was not */ /* required. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* > 0: if INFO = k, U(k,k) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly */ /* singular, and division by zero will occur if it is used */ /* to solve a system of equations. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --ipiv; --du2; --du; --d__; --dl; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; i__1 = -(*info); _starpu_xerbla_("DGTTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Initialize IPIV(i) = i and DU2(I) = 0 */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ipiv[i__] = i__; /* L10: */ } i__1 = *n - 2; for (i__ = 1; i__ <= i__1; ++i__) { du2[i__] = 0.; /* L20: */ } i__1 = *n - 2; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) >= (d__2 = dl[i__], abs(d__2))) { /* No row interchange required, eliminate DL(I) */ if (d__[i__] != 0.) { fact = dl[i__] / d__[i__]; dl[i__] = fact; d__[i__ + 1] -= fact * du[i__]; } } else { /* Interchange rows I and I+1, eliminate DL(I) */ fact = d__[i__] / dl[i__]; d__[i__] = dl[i__]; dl[i__] = fact; temp = du[i__]; du[i__] = d__[i__ + 1]; d__[i__ + 1] = temp - fact * d__[i__ + 1]; du2[i__] = du[i__ + 1]; du[i__ + 1] = -fact * du[i__ + 1]; ipiv[i__] = i__ + 1; } /* L30: */ } if (*n > 1) { i__ = *n - 1; if ((d__1 = d__[i__], abs(d__1)) >= (d__2 = dl[i__], abs(d__2))) { if (d__[i__] != 0.) { fact = dl[i__] / d__[i__]; dl[i__] = fact; d__[i__ + 1] -= fact * du[i__]; } } else { fact = d__[i__] / dl[i__]; d__[i__] = dl[i__]; dl[i__] = fact; temp = du[i__]; du[i__] = d__[i__ + 1]; d__[i__ + 1] = temp - fact * d__[i__ + 1]; ipiv[i__] = i__ + 1; } } /* Check for a zero on the diagonal of U. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] == 0.) { *info = i__; goto L50; } /* L40: */ } L50: return 0; /* End of DGTTRF */ } /* _starpu_dgttrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgttrs.c000066400000000000000000000126651413463044200206670ustar00rootroot00000000000000/* dgttrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dgttrs_(char *trans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer j, jb, nb; extern /* Subroutine */ int _starpu_dgtts2_(integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer itrans; logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTTRS solves one of the systems of equations */ /* A*X = B or A'*X = B, */ /* with a tridiagonal matrix A using the LU factorization computed */ /* by DGTTRF. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations. */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A'* X = B (Transpose) */ /* = 'C': A'* X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) multipliers that define the matrix L from the */ /* LU factorization of A. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the upper triangular matrix U from */ /* the LU factorization of A. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) elements of the first super-diagonal of U. */ /* DU2 (input) DOUBLE PRECISION array, dimension (N-2) */ /* The (n-2) elements of the second super-diagonal of U. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= n, row i of the matrix was */ /* interchanged with row IPIV(i). IPIV(i) will always be either */ /* i or i+1; IPIV(i) = i indicates a row interchange was not */ /* required. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the matrix of right hand side vectors B. */ /* On exit, B is overwritten by the solution vectors X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --dl; --d__; --du; --du2; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; notran = *(unsigned char *)trans == 'N' || *(unsigned char *)trans == 'n'; if (! notran && ! (*(unsigned char *)trans == 'T' || *(unsigned char *) trans == 't') && ! (*(unsigned char *)trans == 'C' || *(unsigned char *)trans == 'c')) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(*n,1)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DGTTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } /* Decode TRANS */ if (notran) { itrans = 0; } else { itrans = 1; } /* Determine the number of right-hand sides to solve at a time. */ if (*nrhs == 1) { nb = 1; } else { /* Computing MAX */ i__1 = 1, i__2 = _starpu_ilaenv_(&c__1, "DGTTRS", trans, n, nrhs, &c_n1, & c_n1); nb = max(i__1,i__2); } if (nb >= *nrhs) { _starpu_dgtts2_(&itrans, n, nrhs, &dl[1], &d__[1], &du[1], &du2[1], &ipiv[1], &b[b_offset], ldb); } else { i__1 = *nrhs; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = *nrhs - j + 1; jb = min(i__3,nb); _starpu_dgtts2_(&itrans, n, &jb, &dl[1], &d__[1], &du[1], &du2[1], &ipiv[ 1], &b[j * b_dim1 + 1], ldb); /* L10: */ } } /* End of DGTTRS */ return 0; } /* _starpu_dgttrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dgtts2.c000066400000000000000000000154231413463044200205620ustar00rootroot00000000000000/* dgtts2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dgtts2_(integer *itrans, integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, doublereal *b, integer *ldb) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; /* Local variables */ integer i__, j, ip; doublereal temp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DGTTS2 solves one of the systems of equations */ /* A*X = B or A'*X = B, */ /* with a tridiagonal matrix A using the LU factorization computed */ /* by DGTTRF. */ /* Arguments */ /* ========= */ /* ITRANS (input) INTEGER */ /* Specifies the form of the system of equations. */ /* = 0: A * X = B (No transpose) */ /* = 1: A'* X = B (Transpose) */ /* = 2: A'* X = B (Conjugate transpose = Transpose) */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) multipliers that define the matrix L from the */ /* LU factorization of A. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the upper triangular matrix U from */ /* the LU factorization of A. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) elements of the first super-diagonal of U. */ /* DU2 (input) DOUBLE PRECISION array, dimension (N-2) */ /* The (n-2) elements of the second super-diagonal of U. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices; for 1 <= i <= n, row i of the matrix was */ /* interchanged with row IPIV(i). IPIV(i) will always be either */ /* i or i+1; IPIV(i) = i indicates a row interchange was not */ /* required. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the matrix of right hand side vectors B. */ /* On exit, B is overwritten by the solution vectors X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --dl; --d__; --du; --du2; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ if (*n == 0 || *nrhs == 0) { return 0; } if (*itrans == 0) { /* Solve A*X = B using the LU factorization of A, */ /* overwriting each right hand side vector with its solution. */ if (*nrhs <= 1) { j = 1; L10: /* Solve L*x = b. */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { ip = ipiv[i__]; temp = b[i__ + 1 - ip + i__ + j * b_dim1] - dl[i__] * b[ip + j * b_dim1]; b[i__ + j * b_dim1] = b[ip + j * b_dim1]; b[i__ + 1 + j * b_dim1] = temp; /* L20: */ } /* Solve U*x = b. */ b[*n + j * b_dim1] /= d__[*n]; if (*n > 1) { b[*n - 1 + j * b_dim1] = (b[*n - 1 + j * b_dim1] - du[*n - 1] * b[*n + j * b_dim1]) / d__[*n - 1]; } for (i__ = *n - 2; i__ >= 1; --i__) { b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__] * b[i__ + 1 + j * b_dim1] - du2[i__] * b[i__ + 2 + j * b_dim1] ) / d__[i__]; /* L30: */ } if (j < *nrhs) { ++j; goto L10; } } else { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Solve L*x = b. */ i__2 = *n - 1; for (i__ = 1; i__ <= i__2; ++i__) { if (ipiv[i__] == i__) { b[i__ + 1 + j * b_dim1] -= dl[i__] * b[i__ + j * b_dim1]; } else { temp = b[i__ + j * b_dim1]; b[i__ + j * b_dim1] = b[i__ + 1 + j * b_dim1]; b[i__ + 1 + j * b_dim1] = temp - dl[i__] * b[i__ + j * b_dim1]; } /* L40: */ } /* Solve U*x = b. */ b[*n + j * b_dim1] /= d__[*n]; if (*n > 1) { b[*n - 1 + j * b_dim1] = (b[*n - 1 + j * b_dim1] - du[*n - 1] * b[*n + j * b_dim1]) / d__[*n - 1]; } for (i__ = *n - 2; i__ >= 1; --i__) { b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__] * b[ i__ + 1 + j * b_dim1] - du2[i__] * b[i__ + 2 + j * b_dim1]) / d__[i__]; /* L50: */ } /* L60: */ } } } else { /* Solve A' * X = B. */ if (*nrhs <= 1) { /* Solve U'*x = b. */ j = 1; L70: b[j * b_dim1 + 1] /= d__[1]; if (*n > 1) { b[j * b_dim1 + 2] = (b[j * b_dim1 + 2] - du[1] * b[j * b_dim1 + 1]) / d__[2]; } i__1 = *n; for (i__ = 3; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__ - 1] * b[ i__ - 1 + j * b_dim1] - du2[i__ - 2] * b[i__ - 2 + j * b_dim1]) / d__[i__]; /* L80: */ } /* Solve L'*x = b. */ for (i__ = *n - 1; i__ >= 1; --i__) { ip = ipiv[i__]; temp = b[i__ + j * b_dim1] - dl[i__] * b[i__ + 1 + j * b_dim1] ; b[i__ + j * b_dim1] = b[ip + j * b_dim1]; b[ip + j * b_dim1] = temp; /* L90: */ } if (j < *nrhs) { ++j; goto L70; } } else { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Solve U'*x = b. */ b[j * b_dim1 + 1] /= d__[1]; if (*n > 1) { b[j * b_dim1 + 2] = (b[j * b_dim1 + 2] - du[1] * b[j * b_dim1 + 1]) / d__[2]; } i__2 = *n; for (i__ = 3; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__ - 1] * b[i__ - 1 + j * b_dim1] - du2[i__ - 2] * b[i__ - 2 + j * b_dim1]) / d__[i__]; /* L100: */ } for (i__ = *n - 1; i__ >= 1; --i__) { if (ipiv[i__] == i__) { b[i__ + j * b_dim1] -= dl[i__] * b[i__ + 1 + j * b_dim1]; } else { temp = b[i__ + 1 + j * b_dim1]; b[i__ + 1 + j * b_dim1] = b[i__ + j * b_dim1] - dl[ i__] * temp; b[i__ + j * b_dim1] = temp; } /* L110: */ } /* L120: */ } } } /* End of DGTTS2 */ return 0; } /* _starpu_dgtts2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dhgeqz.c000066400000000000000000001273351413463044200206430ustar00rootroot00000000000000/* dhgeqz.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b12 = 0.; static doublereal c_b13 = 1.; static integer c__1 = 1; static integer c__3 = 3; /* Subroutine */ int _starpu_dhgeqz_(char *job, char *compq, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *t, integer *ldt, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer h_dim1, h_offset, q_dim1, q_offset, t_dim1, t_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal c__; integer j; doublereal s, v[3], s1, s2, t1, u1, u2, a11, a12, a21, a22, b11, b22, c12, c21; integer jc; doublereal an, bn, cl, cq, cr; integer in; doublereal u12, w11, w12, w21; integer jr; doublereal cz, w22, sl, wi, sr, vs, wr, b1a, b2a, a1i, a2i, b1i, b2i, a1r, a2r, b1r, b2r, wr2, ad11, ad12, ad21, ad22, c11i, c22i; integer jch; doublereal c11r, c22r; logical ilq; doublereal u12l, tau, sqi; logical ilz; doublereal ulp, sqr, szi, szr, ad11l, ad12l, ad21l, ad22l, ad32l, wabs, atol, btol, temp; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dlag2_( doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal temp2, s1inv, scale; extern logical _starpu_lsame_(char *, char *); integer iiter, ilast, jiter; doublereal anorm, bnorm; integer maxit; doublereal tempi, tempr; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlapy3_(doublereal *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); logical ilazr2; doublereal ascale, bscale; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); extern doublereal _starpu_dlanhs_(char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal safmax; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal eshift; logical ilschr; integer icompq, ilastm, ischur; logical ilazro; integer icompz, ifirst, ifrstm, istart; logical ilpivt, lquery; /* -- LAPACK routine (version 3.2.1) -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* -- April 2009 -- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DHGEQZ computes the eigenvalues of a real matrix pair (H,T), */ /* where H is an upper Hessenberg matrix and T is upper triangular, */ /* using the double-shift QZ method. */ /* Matrix pairs of this type are produced by the reduction to */ /* generalized upper Hessenberg form of a real matrix pair (A,B): */ /* A = Q1*H*Z1**T, B = Q1*T*Z1**T, */ /* as computed by DGGHRD. */ /* If JOB='S', then the Hessenberg-triangular pair (H,T) is */ /* also reduced to generalized Schur form, */ /* H = Q*S*Z**T, T = Q*P*Z**T, */ /* where Q and Z are orthogonal matrices, P is an upper triangular */ /* matrix, and S is a quasi-triangular matrix with 1-by-1 and 2-by-2 */ /* diagonal blocks. */ /* The 1-by-1 blocks correspond to real eigenvalues of the matrix pair */ /* (H,T) and the 2-by-2 blocks correspond to complex conjugate pairs of */ /* eigenvalues. */ /* Additionally, the 2-by-2 upper triangular diagonal blocks of P */ /* corresponding to 2-by-2 blocks of S are reduced to positive diagonal */ /* form, i.e., if S(j+1,j) is non-zero, then P(j+1,j) = P(j,j+1) = 0, */ /* P(j,j) > 0, and P(j+1,j+1) > 0. */ /* Optionally, the orthogonal matrix Q from the generalized Schur */ /* factorization may be postmultiplied into an input matrix Q1, and the */ /* orthogonal matrix Z may be postmultiplied into an input matrix Z1. */ /* If Q1 and Z1 are the orthogonal matrices from DGGHRD that reduced */ /* the matrix pair (A,B) to generalized upper Hessenberg form, then the */ /* output matrices Q1*Q and Z1*Z are the orthogonal factors from the */ /* generalized Schur factorization of (A,B): */ /* A = (Q1*Q)*S*(Z1*Z)**T, B = (Q1*Q)*P*(Z1*Z)**T. */ /* To avoid overflow, eigenvalues of the matrix pair (H,T) (equivalently, */ /* of (A,B)) are computed as a pair of values (alpha,beta), where alpha is */ /* complex and beta real. */ /* If beta is nonzero, lambda = alpha / beta is an eigenvalue of the */ /* generalized nonsymmetric eigenvalue problem (GNEP) */ /* A*x = lambda*B*x */ /* and if alpha is nonzero, mu = beta / alpha is an eigenvalue of the */ /* alternate form of the GNEP */ /* mu*A*y = B*y. */ /* Real eigenvalues can be read directly from the generalized Schur */ /* form: */ /* alpha = S(i,i), beta = P(i,i). */ /* Ref: C.B. Moler & G.W. Stewart, "An Algorithm for Generalized Matrix */ /* Eigenvalue Problems", SIAM J. Numer. Anal., 10(1973), */ /* pp. 241--256. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* = 'E': Compute eigenvalues only; */ /* = 'S': Compute eigenvalues and the Schur form. */ /* COMPQ (input) CHARACTER*1 */ /* = 'N': Left Schur vectors (Q) are not computed; */ /* = 'I': Q is initialized to the unit matrix and the matrix Q */ /* of left Schur vectors of (H,T) is returned; */ /* = 'V': Q must contain an orthogonal matrix Q1 on entry and */ /* the product Q1*Q is returned. */ /* COMPZ (input) CHARACTER*1 */ /* = 'N': Right Schur vectors (Z) are not computed; */ /* = 'I': Z is initialized to the unit matrix and the matrix Z */ /* of right Schur vectors of (H,T) is returned; */ /* = 'V': Z must contain an orthogonal matrix Z1 on entry and */ /* the product Z1*Z is returned. */ /* N (input) INTEGER */ /* The order of the matrices H, T, Q, and Z. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* ILO and IHI mark the rows and columns of H which are in */ /* Hessenberg form. It is assumed that A is already upper */ /* triangular in rows and columns 1:ILO-1 and IHI+1:N. */ /* If N > 0, 1 <= ILO <= IHI <= N; if N = 0, ILO=1 and IHI=0. */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH, N) */ /* On entry, the N-by-N upper Hessenberg matrix H. */ /* On exit, if JOB = 'S', H contains the upper quasi-triangular */ /* matrix S from the generalized Schur factorization; */ /* 2-by-2 diagonal blocks (corresponding to complex conjugate */ /* pairs of eigenvalues) are returned in standard form, with */ /* H(i,i) = H(i+1,i+1) and H(i+1,i)*H(i,i+1) < 0. */ /* If JOB = 'E', the diagonal blocks of H match those of S, but */ /* the rest of H is unspecified. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH >= max( 1, N ). */ /* T (input/output) DOUBLE PRECISION array, dimension (LDT, N) */ /* On entry, the N-by-N upper triangular matrix T. */ /* On exit, if JOB = 'S', T contains the upper triangular */ /* matrix P from the generalized Schur factorization; */ /* 2-by-2 diagonal blocks of P corresponding to 2-by-2 blocks of S */ /* are reduced to positive diagonal form, i.e., if H(j+1,j) is */ /* non-zero, then T(j+1,j) = T(j,j+1) = 0, T(j,j) > 0, and */ /* T(j+1,j+1) > 0. */ /* If JOB = 'E', the diagonal blocks of T match those of P, but */ /* the rest of T is unspecified. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= max( 1, N ). */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* The real parts of each scalar alpha defining an eigenvalue */ /* of GNEP. */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* The imaginary parts of each scalar alpha defining an */ /* eigenvalue of GNEP. */ /* If ALPHAI(j) is zero, then the j-th eigenvalue is real; if */ /* positive, then the j-th and (j+1)-st eigenvalues are a */ /* complex conjugate pair, with ALPHAI(j+1) = -ALPHAI(j). */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* The scalars beta that define the eigenvalues of GNEP. */ /* Together, the quantities alpha = (ALPHAR(j),ALPHAI(j)) and */ /* beta = BETA(j) represent the j-th eigenvalue of the matrix */ /* pair (A,B), in one of the forms lambda = alpha/beta or */ /* mu = beta/alpha. Since either lambda or mu may overflow, */ /* they should not, in general, be computed. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* On entry, if COMPZ = 'V', the orthogonal matrix Q1 used in */ /* the reduction of (A,B) to generalized Hessenberg form. */ /* On exit, if COMPZ = 'I', the orthogonal matrix of left Schur */ /* vectors of (H,T), and if COMPZ = 'V', the orthogonal matrix */ /* of left Schur vectors of (A,B). */ /* Not referenced if COMPZ = 'N'. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= 1. */ /* If COMPQ='V' or 'I', then LDQ >= N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* On entry, if COMPZ = 'V', the orthogonal matrix Z1 used in */ /* the reduction of (A,B) to generalized Hessenberg form. */ /* On exit, if COMPZ = 'I', the orthogonal matrix of */ /* right Schur vectors of (H,T), and if COMPZ = 'V', the */ /* orthogonal matrix of right Schur vectors of (A,B). */ /* Not referenced if COMPZ = 'N'. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1. */ /* If COMPZ='V' or 'I', then LDZ >= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO >= 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* = 1,...,N: the QZ iteration did not converge. (H,T) is not */ /* in Schur form, but ALPHAR(i), ALPHAI(i), and */ /* BETA(i), i=INFO+1,...,N should be correct. */ /* = N+1,...,2*N: the shift calculation failed. (H,T) is not */ /* in Schur form, but ALPHAR(i), ALPHAI(i), and */ /* BETA(i), i=INFO-N+1,...,N should be correct. */ /* Further Details */ /* =============== */ /* Iteration counters: */ /* JITER -- counts iterations. */ /* IITER -- counts iterations run since ILAST was last */ /* changed. This is therefore reset only when a 1-by-1 or */ /* 2-by-2 block deflates off the bottom. */ /* ===================================================================== */ /* .. Parameters .. */ /* $ SAFETY = 1.0E+0 ) */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode JOB, COMPQ, COMPZ */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; --alphar; --alphai; --beta; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ if (_starpu_lsame_(job, "E")) { ilschr = FALSE_; ischur = 1; } else if (_starpu_lsame_(job, "S")) { ilschr = TRUE_; ischur = 2; } else { ischur = 0; } if (_starpu_lsame_(compq, "N")) { ilq = FALSE_; icompq = 1; } else if (_starpu_lsame_(compq, "V")) { ilq = TRUE_; icompq = 2; } else if (_starpu_lsame_(compq, "I")) { ilq = TRUE_; icompq = 3; } else { icompq = 0; } if (_starpu_lsame_(compz, "N")) { ilz = FALSE_; icompz = 1; } else if (_starpu_lsame_(compz, "V")) { ilz = TRUE_; icompz = 2; } else if (_starpu_lsame_(compz, "I")) { ilz = TRUE_; icompz = 3; } else { icompz = 0; } /* Check Argument Values */ *info = 0; work[1] = (doublereal) max(1,*n); lquery = *lwork == -1; if (ischur == 0) { *info = -1; } else if (icompq == 0) { *info = -2; } else if (icompz == 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*ilo < 1) { *info = -5; } else if (*ihi > *n || *ihi < *ilo - 1) { *info = -6; } else if (*ldh < *n) { *info = -8; } else if (*ldt < *n) { *info = -10; } else if (*ldq < 1 || ilq && *ldq < *n) { *info = -15; } else if (*ldz < 1 || ilz && *ldz < *n) { *info = -17; } else if (*lwork < max(1,*n) && ! lquery) { *info = -19; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DHGEQZ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n <= 0) { work[1] = 1.; return 0; } /* Initialize Q and Z */ if (icompq == 3) { _starpu_dlaset_("Full", n, n, &c_b12, &c_b13, &q[q_offset], ldq); } if (icompz == 3) { _starpu_dlaset_("Full", n, n, &c_b12, &c_b13, &z__[z_offset], ldz); } /* Machine Constants */ in = *ihi + 1 - *ilo; safmin = _starpu_dlamch_("S"); safmax = 1. / safmin; ulp = _starpu_dlamch_("E") * _starpu_dlamch_("B"); anorm = _starpu_dlanhs_("F", &in, &h__[*ilo + *ilo * h_dim1], ldh, &work[1]); bnorm = _starpu_dlanhs_("F", &in, &t[*ilo + *ilo * t_dim1], ldt, &work[1]); /* Computing MAX */ d__1 = safmin, d__2 = ulp * anorm; atol = max(d__1,d__2); /* Computing MAX */ d__1 = safmin, d__2 = ulp * bnorm; btol = max(d__1,d__2); ascale = 1. / max(safmin,anorm); bscale = 1. / max(safmin,bnorm); /* Set Eigenvalues IHI+1:N */ i__1 = *n; for (j = *ihi + 1; j <= i__1; ++j) { if (t[j + j * t_dim1] < 0.) { if (ilschr) { i__2 = j; for (jr = 1; jr <= i__2; ++jr) { h__[jr + j * h_dim1] = -h__[jr + j * h_dim1]; t[jr + j * t_dim1] = -t[jr + j * t_dim1]; /* L10: */ } } else { h__[j + j * h_dim1] = -h__[j + j * h_dim1]; t[j + j * t_dim1] = -t[j + j * t_dim1]; } if (ilz) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { z__[jr + j * z_dim1] = -z__[jr + j * z_dim1]; /* L20: */ } } } alphar[j] = h__[j + j * h_dim1]; alphai[j] = 0.; beta[j] = t[j + j * t_dim1]; /* L30: */ } /* If IHI < ILO, skip QZ steps */ if (*ihi < *ilo) { goto L380; } /* MAIN QZ ITERATION LOOP */ /* Initialize dynamic indices */ /* Eigenvalues ILAST+1:N have been found. */ /* Column operations modify rows IFRSTM:whatever. */ /* Row operations modify columns whatever:ILASTM. */ /* If only eigenvalues are being computed, then */ /* IFRSTM is the row of the last splitting row above row ILAST; */ /* this is always at least ILO. */ /* IITER counts iterations since the last eigenvalue was found, */ /* to tell when to use an extraordinary shift. */ /* MAXIT is the maximum number of QZ sweeps allowed. */ ilast = *ihi; if (ilschr) { ifrstm = 1; ilastm = *n; } else { ifrstm = *ilo; ilastm = *ihi; } iiter = 0; eshift = 0.; maxit = (*ihi - *ilo + 1) * 30; i__1 = maxit; for (jiter = 1; jiter <= i__1; ++jiter) { /* Split the matrix if possible. */ /* Two tests: */ /* 1: H(j,j-1)=0 or j=ILO */ /* 2: T(j,j)=0 */ if (ilast == *ilo) { /* Special case: j=ILAST */ goto L80; } else { if ((d__1 = h__[ilast + (ilast - 1) * h_dim1], abs(d__1)) <= atol) { h__[ilast + (ilast - 1) * h_dim1] = 0.; goto L80; } } if ((d__1 = t[ilast + ilast * t_dim1], abs(d__1)) <= btol) { t[ilast + ilast * t_dim1] = 0.; goto L70; } /* General case: j= i__2; --j) { /* Test 1: for H(j,j-1)=0 or j=ILO */ if (j == *ilo) { ilazro = TRUE_; } else { if ((d__1 = h__[j + (j - 1) * h_dim1], abs(d__1)) <= atol) { h__[j + (j - 1) * h_dim1] = 0.; ilazro = TRUE_; } else { ilazro = FALSE_; } } /* Test 2: for T(j,j)=0 */ if ((d__1 = t[j + j * t_dim1], abs(d__1)) < btol) { t[j + j * t_dim1] = 0.; /* Test 1a: Check for 2 consecutive small subdiagonals in A */ ilazr2 = FALSE_; if (! ilazro) { temp = (d__1 = h__[j + (j - 1) * h_dim1], abs(d__1)); temp2 = (d__1 = h__[j + j * h_dim1], abs(d__1)); tempr = max(temp,temp2); if (tempr < 1. && tempr != 0.) { temp /= tempr; temp2 /= tempr; } if (temp * (ascale * (d__1 = h__[j + 1 + j * h_dim1], abs( d__1))) <= temp2 * (ascale * atol)) { ilazr2 = TRUE_; } } /* If both tests pass (1 & 2), i.e., the leading diagonal */ /* element of B in the block is zero, split a 1x1 block off */ /* at the top. (I.e., at the J-th row/column) The leading */ /* diagonal element of the remainder can also be zero, so */ /* this may have to be done repeatedly. */ if (ilazro || ilazr2) { i__3 = ilast - 1; for (jch = j; jch <= i__3; ++jch) { temp = h__[jch + jch * h_dim1]; _starpu_dlartg_(&temp, &h__[jch + 1 + jch * h_dim1], &c__, &s, &h__[jch + jch * h_dim1]); h__[jch + 1 + jch * h_dim1] = 0.; i__4 = ilastm - jch; _starpu_drot_(&i__4, &h__[jch + (jch + 1) * h_dim1], ldh, & h__[jch + 1 + (jch + 1) * h_dim1], ldh, &c__, &s); i__4 = ilastm - jch; _starpu_drot_(&i__4, &t[jch + (jch + 1) * t_dim1], ldt, &t[ jch + 1 + (jch + 1) * t_dim1], ldt, &c__, &s); if (ilq) { _starpu_drot_(n, &q[jch * q_dim1 + 1], &c__1, &q[(jch + 1) * q_dim1 + 1], &c__1, &c__, &s); } if (ilazr2) { h__[jch + (jch - 1) * h_dim1] *= c__; } ilazr2 = FALSE_; if ((d__1 = t[jch + 1 + (jch + 1) * t_dim1], abs(d__1) ) >= btol) { if (jch + 1 >= ilast) { goto L80; } else { ifirst = jch + 1; goto L110; } } t[jch + 1 + (jch + 1) * t_dim1] = 0.; /* L40: */ } goto L70; } else { /* Only test 2 passed -- chase the zero to T(ILAST,ILAST) */ /* Then process as in the case T(ILAST,ILAST)=0 */ i__3 = ilast - 1; for (jch = j; jch <= i__3; ++jch) { temp = t[jch + (jch + 1) * t_dim1]; _starpu_dlartg_(&temp, &t[jch + 1 + (jch + 1) * t_dim1], &c__, &s, &t[jch + (jch + 1) * t_dim1]); t[jch + 1 + (jch + 1) * t_dim1] = 0.; if (jch < ilastm - 1) { i__4 = ilastm - jch - 1; _starpu_drot_(&i__4, &t[jch + (jch + 2) * t_dim1], ldt, & t[jch + 1 + (jch + 2) * t_dim1], ldt, & c__, &s); } i__4 = ilastm - jch + 2; _starpu_drot_(&i__4, &h__[jch + (jch - 1) * h_dim1], ldh, & h__[jch + 1 + (jch - 1) * h_dim1], ldh, &c__, &s); if (ilq) { _starpu_drot_(n, &q[jch * q_dim1 + 1], &c__1, &q[(jch + 1) * q_dim1 + 1], &c__1, &c__, &s); } temp = h__[jch + 1 + jch * h_dim1]; _starpu_dlartg_(&temp, &h__[jch + 1 + (jch - 1) * h_dim1], & c__, &s, &h__[jch + 1 + jch * h_dim1]); h__[jch + 1 + (jch - 1) * h_dim1] = 0.; i__4 = jch + 1 - ifrstm; _starpu_drot_(&i__4, &h__[ifrstm + jch * h_dim1], &c__1, &h__[ ifrstm + (jch - 1) * h_dim1], &c__1, &c__, &s) ; i__4 = jch - ifrstm; _starpu_drot_(&i__4, &t[ifrstm + jch * t_dim1], &c__1, &t[ ifrstm + (jch - 1) * t_dim1], &c__1, &c__, &s) ; if (ilz) { _starpu_drot_(n, &z__[jch * z_dim1 + 1], &c__1, &z__[(jch - 1) * z_dim1 + 1], &c__1, &c__, &s); } /* L50: */ } goto L70; } } else if (ilazro) { /* Only test 1 passed -- work on J:ILAST */ ifirst = j; goto L110; } /* Neither test passed -- try next J */ /* L60: */ } /* (Drop-through is "impossible") */ *info = *n + 1; goto L420; /* T(ILAST,ILAST)=0 -- clear H(ILAST,ILAST-1) to split off a */ /* 1x1 block. */ L70: temp = h__[ilast + ilast * h_dim1]; _starpu_dlartg_(&temp, &h__[ilast + (ilast - 1) * h_dim1], &c__, &s, &h__[ ilast + ilast * h_dim1]); h__[ilast + (ilast - 1) * h_dim1] = 0.; i__2 = ilast - ifrstm; _starpu_drot_(&i__2, &h__[ifrstm + ilast * h_dim1], &c__1, &h__[ifrstm + ( ilast - 1) * h_dim1], &c__1, &c__, &s); i__2 = ilast - ifrstm; _starpu_drot_(&i__2, &t[ifrstm + ilast * t_dim1], &c__1, &t[ifrstm + (ilast - 1) * t_dim1], &c__1, &c__, &s); if (ilz) { _starpu_drot_(n, &z__[ilast * z_dim1 + 1], &c__1, &z__[(ilast - 1) * z_dim1 + 1], &c__1, &c__, &s); } /* H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHAR, ALPHAI, */ /* and BETA */ L80: if (t[ilast + ilast * t_dim1] < 0.) { if (ilschr) { i__2 = ilast; for (j = ifrstm; j <= i__2; ++j) { h__[j + ilast * h_dim1] = -h__[j + ilast * h_dim1]; t[j + ilast * t_dim1] = -t[j + ilast * t_dim1]; /* L90: */ } } else { h__[ilast + ilast * h_dim1] = -h__[ilast + ilast * h_dim1]; t[ilast + ilast * t_dim1] = -t[ilast + ilast * t_dim1]; } if (ilz) { i__2 = *n; for (j = 1; j <= i__2; ++j) { z__[j + ilast * z_dim1] = -z__[j + ilast * z_dim1]; /* L100: */ } } } alphar[ilast] = h__[ilast + ilast * h_dim1]; alphai[ilast] = 0.; beta[ilast] = t[ilast + ilast * t_dim1]; /* Go to next block -- exit if finished. */ --ilast; if (ilast < *ilo) { goto L380; } /* Reset counters */ iiter = 0; eshift = 0.; if (! ilschr) { ilastm = ilast; if (ifrstm > ilast) { ifrstm = *ilo; } } goto L350; /* QZ step */ /* This iteration only involves rows/columns IFIRST:ILAST. We */ /* assume IFIRST < ILAST, and that the diagonal of B is non-zero. */ L110: ++iiter; if (! ilschr) { ifrstm = ifirst; } /* Compute single shifts. */ /* At this point, IFIRST < ILAST, and the diagonal elements of */ /* T(IFIRST:ILAST,IFIRST,ILAST) are larger than BTOL (in */ /* magnitude) */ if (iiter / 10 * 10 == iiter) { /* Exceptional shift. Chosen for no particularly good reason. */ /* (Single shift only.) */ if ((doublereal) maxit * safmin * (d__1 = h__[ilast - 1 + ilast * h_dim1], abs(d__1)) < (d__2 = t[ilast - 1 + (ilast - 1) * t_dim1], abs(d__2))) { eshift += h__[ilast - 1 + ilast * h_dim1] / t[ilast - 1 + ( ilast - 1) * t_dim1]; } else { eshift += 1. / (safmin * (doublereal) maxit); } s1 = 1.; wr = eshift; } else { /* Shifts based on the generalized eigenvalues of the */ /* bottom-right 2x2 block of A and B. The first eigenvalue */ /* returned by DLAG2 is the Wilkinson shift (AEP p.512), */ d__1 = safmin * 100.; _starpu_dlag2_(&h__[ilast - 1 + (ilast - 1) * h_dim1], ldh, &t[ilast - 1 + (ilast - 1) * t_dim1], ldt, &d__1, &s1, &s2, &wr, &wr2, &wi); /* Computing MAX */ /* Computing MAX */ d__3 = 1., d__4 = abs(wr), d__3 = max(d__3,d__4), d__4 = abs(wi); d__1 = s1, d__2 = safmin * max(d__3,d__4); temp = max(d__1,d__2); if (wi != 0.) { goto L200; } } /* Fiddle with shift to avoid overflow */ temp = min(ascale,1.) * (safmax * .5); if (s1 > temp) { scale = temp / s1; } else { scale = 1.; } temp = min(bscale,1.) * (safmax * .5); if (abs(wr) > temp) { /* Computing MIN */ d__1 = scale, d__2 = temp / abs(wr); scale = min(d__1,d__2); } s1 = scale * s1; wr = scale * wr; /* Now check for two consecutive small subdiagonals. */ i__2 = ifirst + 1; for (j = ilast - 1; j >= i__2; --j) { istart = j; temp = (d__1 = s1 * h__[j + (j - 1) * h_dim1], abs(d__1)); temp2 = (d__1 = s1 * h__[j + j * h_dim1] - wr * t[j + j * t_dim1], abs(d__1)); tempr = max(temp,temp2); if (tempr < 1. && tempr != 0.) { temp /= tempr; temp2 /= tempr; } if ((d__1 = ascale * h__[j + 1 + j * h_dim1] * temp, abs(d__1)) <= ascale * atol * temp2) { goto L130; } /* L120: */ } istart = ifirst; L130: /* Do an implicit single-shift QZ sweep. */ /* Initial Q */ temp = s1 * h__[istart + istart * h_dim1] - wr * t[istart + istart * t_dim1]; temp2 = s1 * h__[istart + 1 + istart * h_dim1]; _starpu_dlartg_(&temp, &temp2, &c__, &s, &tempr); /* Sweep */ i__2 = ilast - 1; for (j = istart; j <= i__2; ++j) { if (j > istart) { temp = h__[j + (j - 1) * h_dim1]; _starpu_dlartg_(&temp, &h__[j + 1 + (j - 1) * h_dim1], &c__, &s, &h__[ j + (j - 1) * h_dim1]); h__[j + 1 + (j - 1) * h_dim1] = 0.; } i__3 = ilastm; for (jc = j; jc <= i__3; ++jc) { temp = c__ * h__[j + jc * h_dim1] + s * h__[j + 1 + jc * h_dim1]; h__[j + 1 + jc * h_dim1] = -s * h__[j + jc * h_dim1] + c__ * h__[j + 1 + jc * h_dim1]; h__[j + jc * h_dim1] = temp; temp2 = c__ * t[j + jc * t_dim1] + s * t[j + 1 + jc * t_dim1]; t[j + 1 + jc * t_dim1] = -s * t[j + jc * t_dim1] + c__ * t[j + 1 + jc * t_dim1]; t[j + jc * t_dim1] = temp2; /* L140: */ } if (ilq) { i__3 = *n; for (jr = 1; jr <= i__3; ++jr) { temp = c__ * q[jr + j * q_dim1] + s * q[jr + (j + 1) * q_dim1]; q[jr + (j + 1) * q_dim1] = -s * q[jr + j * q_dim1] + c__ * q[jr + (j + 1) * q_dim1]; q[jr + j * q_dim1] = temp; /* L150: */ } } temp = t[j + 1 + (j + 1) * t_dim1]; _starpu_dlartg_(&temp, &t[j + 1 + j * t_dim1], &c__, &s, &t[j + 1 + (j + 1) * t_dim1]); t[j + 1 + j * t_dim1] = 0.; /* Computing MIN */ i__4 = j + 2; i__3 = min(i__4,ilast); for (jr = ifrstm; jr <= i__3; ++jr) { temp = c__ * h__[jr + (j + 1) * h_dim1] + s * h__[jr + j * h_dim1]; h__[jr + j * h_dim1] = -s * h__[jr + (j + 1) * h_dim1] + c__ * h__[jr + j * h_dim1]; h__[jr + (j + 1) * h_dim1] = temp; /* L160: */ } i__3 = j; for (jr = ifrstm; jr <= i__3; ++jr) { temp = c__ * t[jr + (j + 1) * t_dim1] + s * t[jr + j * t_dim1] ; t[jr + j * t_dim1] = -s * t[jr + (j + 1) * t_dim1] + c__ * t[ jr + j * t_dim1]; t[jr + (j + 1) * t_dim1] = temp; /* L170: */ } if (ilz) { i__3 = *n; for (jr = 1; jr <= i__3; ++jr) { temp = c__ * z__[jr + (j + 1) * z_dim1] + s * z__[jr + j * z_dim1]; z__[jr + j * z_dim1] = -s * z__[jr + (j + 1) * z_dim1] + c__ * z__[jr + j * z_dim1]; z__[jr + (j + 1) * z_dim1] = temp; /* L180: */ } } /* L190: */ } goto L350; /* Use Francis double-shift */ /* Note: the Francis double-shift should work with real shifts, */ /* but only if the block is at least 3x3. */ /* This code may break if this point is reached with */ /* a 2x2 block with real eigenvalues. */ L200: if (ifirst + 1 == ilast) { /* Special case -- 2x2 block with complex eigenvectors */ /* Step 1: Standardize, that is, rotate so that */ /* ( B11 0 ) */ /* B = ( ) with B11 non-negative. */ /* ( 0 B22 ) */ _starpu_dlasv2_(&t[ilast - 1 + (ilast - 1) * t_dim1], &t[ilast - 1 + ilast * t_dim1], &t[ilast + ilast * t_dim1], &b22, &b11, & sr, &cr, &sl, &cl); if (b11 < 0.) { cr = -cr; sr = -sr; b11 = -b11; b22 = -b22; } i__2 = ilastm + 1 - ifirst; _starpu_drot_(&i__2, &h__[ilast - 1 + (ilast - 1) * h_dim1], ldh, &h__[ ilast + (ilast - 1) * h_dim1], ldh, &cl, &sl); i__2 = ilast + 1 - ifrstm; _starpu_drot_(&i__2, &h__[ifrstm + (ilast - 1) * h_dim1], &c__1, &h__[ ifrstm + ilast * h_dim1], &c__1, &cr, &sr); if (ilast < ilastm) { i__2 = ilastm - ilast; _starpu_drot_(&i__2, &t[ilast - 1 + (ilast + 1) * t_dim1], ldt, &t[ ilast + (ilast + 1) * t_dim1], ldt, &cl, &sl); } if (ifrstm < ilast - 1) { i__2 = ifirst - ifrstm; _starpu_drot_(&i__2, &t[ifrstm + (ilast - 1) * t_dim1], &c__1, &t[ ifrstm + ilast * t_dim1], &c__1, &cr, &sr); } if (ilq) { _starpu_drot_(n, &q[(ilast - 1) * q_dim1 + 1], &c__1, &q[ilast * q_dim1 + 1], &c__1, &cl, &sl); } if (ilz) { _starpu_drot_(n, &z__[(ilast - 1) * z_dim1 + 1], &c__1, &z__[ilast * z_dim1 + 1], &c__1, &cr, &sr); } t[ilast - 1 + (ilast - 1) * t_dim1] = b11; t[ilast - 1 + ilast * t_dim1] = 0.; t[ilast + (ilast - 1) * t_dim1] = 0.; t[ilast + ilast * t_dim1] = b22; /* If B22 is negative, negate column ILAST */ if (b22 < 0.) { i__2 = ilast; for (j = ifrstm; j <= i__2; ++j) { h__[j + ilast * h_dim1] = -h__[j + ilast * h_dim1]; t[j + ilast * t_dim1] = -t[j + ilast * t_dim1]; /* L210: */ } if (ilz) { i__2 = *n; for (j = 1; j <= i__2; ++j) { z__[j + ilast * z_dim1] = -z__[j + ilast * z_dim1]; /* L220: */ } } } /* Step 2: Compute ALPHAR, ALPHAI, and BETA (see refs.) */ /* Recompute shift */ d__1 = safmin * 100.; _starpu_dlag2_(&h__[ilast - 1 + (ilast - 1) * h_dim1], ldh, &t[ilast - 1 + (ilast - 1) * t_dim1], ldt, &d__1, &s1, &temp, &wr, & temp2, &wi); /* If standardization has perturbed the shift onto real line, */ /* do another (real single-shift) QR step. */ if (wi == 0.) { goto L350; } s1inv = 1. / s1; /* Do EISPACK (QZVAL) computation of alpha and beta */ a11 = h__[ilast - 1 + (ilast - 1) * h_dim1]; a21 = h__[ilast + (ilast - 1) * h_dim1]; a12 = h__[ilast - 1 + ilast * h_dim1]; a22 = h__[ilast + ilast * h_dim1]; /* Compute complex Givens rotation on right */ /* (Assume some element of C = (sA - wB) > unfl ) */ /* __ */ /* (sA - wB) ( CZ -SZ ) */ /* ( SZ CZ ) */ c11r = s1 * a11 - wr * b11; c11i = -wi * b11; c12 = s1 * a12; c21 = s1 * a21; c22r = s1 * a22 - wr * b22; c22i = -wi * b22; if (abs(c11r) + abs(c11i) + abs(c12) > abs(c21) + abs(c22r) + abs( c22i)) { t1 = _starpu_dlapy3_(&c12, &c11r, &c11i); cz = c12 / t1; szr = -c11r / t1; szi = -c11i / t1; } else { cz = _starpu_dlapy2_(&c22r, &c22i); if (cz <= safmin) { cz = 0.; szr = 1.; szi = 0.; } else { tempr = c22r / cz; tempi = c22i / cz; t1 = _starpu_dlapy2_(&cz, &c21); cz /= t1; szr = -c21 * tempr / t1; szi = c21 * tempi / t1; } } /* Compute Givens rotation on left */ /* ( CQ SQ ) */ /* ( __ ) A or B */ /* ( -SQ CQ ) */ an = abs(a11) + abs(a12) + abs(a21) + abs(a22); bn = abs(b11) + abs(b22); wabs = abs(wr) + abs(wi); if (s1 * an > wabs * bn) { cq = cz * b11; sqr = szr * b22; sqi = -szi * b22; } else { a1r = cz * a11 + szr * a12; a1i = szi * a12; a2r = cz * a21 + szr * a22; a2i = szi * a22; cq = _starpu_dlapy2_(&a1r, &a1i); if (cq <= safmin) { cq = 0.; sqr = 1.; sqi = 0.; } else { tempr = a1r / cq; tempi = a1i / cq; sqr = tempr * a2r + tempi * a2i; sqi = tempi * a2r - tempr * a2i; } } t1 = _starpu_dlapy3_(&cq, &sqr, &sqi); cq /= t1; sqr /= t1; sqi /= t1; /* Compute diagonal elements of QBZ */ tempr = sqr * szr - sqi * szi; tempi = sqr * szi + sqi * szr; b1r = cq * cz * b11 + tempr * b22; b1i = tempi * b22; b1a = _starpu_dlapy2_(&b1r, &b1i); b2r = cq * cz * b22 + tempr * b11; b2i = -tempi * b11; b2a = _starpu_dlapy2_(&b2r, &b2i); /* Normalize so beta > 0, and Im( alpha1 ) > 0 */ beta[ilast - 1] = b1a; beta[ilast] = b2a; alphar[ilast - 1] = wr * b1a * s1inv; alphai[ilast - 1] = wi * b1a * s1inv; alphar[ilast] = wr * b2a * s1inv; alphai[ilast] = -(wi * b2a) * s1inv; /* Step 3: Go to next block -- exit if finished. */ ilast = ifirst - 1; if (ilast < *ilo) { goto L380; } /* Reset counters */ iiter = 0; eshift = 0.; if (! ilschr) { ilastm = ilast; if (ifrstm > ilast) { ifrstm = *ilo; } } goto L350; } else { /* Usual case: 3x3 or larger block, using Francis implicit */ /* double-shift */ /* 2 */ /* Eigenvalue equation is w - c w + d = 0, */ /* -1 2 -1 */ /* so compute 1st column of (A B ) - c A B + d */ /* using the formula in QZIT (from EISPACK) */ /* We assume that the block is at least 3x3 */ ad11 = ascale * h__[ilast - 1 + (ilast - 1) * h_dim1] / (bscale * t[ilast - 1 + (ilast - 1) * t_dim1]); ad21 = ascale * h__[ilast + (ilast - 1) * h_dim1] / (bscale * t[ ilast - 1 + (ilast - 1) * t_dim1]); ad12 = ascale * h__[ilast - 1 + ilast * h_dim1] / (bscale * t[ ilast + ilast * t_dim1]); ad22 = ascale * h__[ilast + ilast * h_dim1] / (bscale * t[ilast + ilast * t_dim1]); u12 = t[ilast - 1 + ilast * t_dim1] / t[ilast + ilast * t_dim1]; ad11l = ascale * h__[ifirst + ifirst * h_dim1] / (bscale * t[ ifirst + ifirst * t_dim1]); ad21l = ascale * h__[ifirst + 1 + ifirst * h_dim1] / (bscale * t[ ifirst + ifirst * t_dim1]); ad12l = ascale * h__[ifirst + (ifirst + 1) * h_dim1] / (bscale * t[ifirst + 1 + (ifirst + 1) * t_dim1]); ad22l = ascale * h__[ifirst + 1 + (ifirst + 1) * h_dim1] / ( bscale * t[ifirst + 1 + (ifirst + 1) * t_dim1]); ad32l = ascale * h__[ifirst + 2 + (ifirst + 1) * h_dim1] / ( bscale * t[ifirst + 1 + (ifirst + 1) * t_dim1]); u12l = t[ifirst + (ifirst + 1) * t_dim1] / t[ifirst + 1 + (ifirst + 1) * t_dim1]; v[0] = (ad11 - ad11l) * (ad22 - ad11l) - ad12 * ad21 + ad21 * u12 * ad11l + (ad12l - ad11l * u12l) * ad21l; v[1] = (ad22l - ad11l - ad21l * u12l - (ad11 - ad11l) - (ad22 - ad11l) + ad21 * u12) * ad21l; v[2] = ad32l * ad21l; istart = ifirst; _starpu_dlarfg_(&c__3, v, &v[1], &c__1, &tau); v[0] = 1.; /* Sweep */ i__2 = ilast - 2; for (j = istart; j <= i__2; ++j) { /* All but last elements: use 3x3 Householder transforms. */ /* Zero (j-1)st column of A */ if (j > istart) { v[0] = h__[j + (j - 1) * h_dim1]; v[1] = h__[j + 1 + (j - 1) * h_dim1]; v[2] = h__[j + 2 + (j - 1) * h_dim1]; _starpu_dlarfg_(&c__3, &h__[j + (j - 1) * h_dim1], &v[1], &c__1, & tau); v[0] = 1.; h__[j + 1 + (j - 1) * h_dim1] = 0.; h__[j + 2 + (j - 1) * h_dim1] = 0.; } i__3 = ilastm; for (jc = j; jc <= i__3; ++jc) { temp = tau * (h__[j + jc * h_dim1] + v[1] * h__[j + 1 + jc * h_dim1] + v[2] * h__[j + 2 + jc * h_dim1]); h__[j + jc * h_dim1] -= temp; h__[j + 1 + jc * h_dim1] -= temp * v[1]; h__[j + 2 + jc * h_dim1] -= temp * v[2]; temp2 = tau * (t[j + jc * t_dim1] + v[1] * t[j + 1 + jc * t_dim1] + v[2] * t[j + 2 + jc * t_dim1]); t[j + jc * t_dim1] -= temp2; t[j + 1 + jc * t_dim1] -= temp2 * v[1]; t[j + 2 + jc * t_dim1] -= temp2 * v[2]; /* L230: */ } if (ilq) { i__3 = *n; for (jr = 1; jr <= i__3; ++jr) { temp = tau * (q[jr + j * q_dim1] + v[1] * q[jr + (j + 1) * q_dim1] + v[2] * q[jr + (j + 2) * q_dim1] ); q[jr + j * q_dim1] -= temp; q[jr + (j + 1) * q_dim1] -= temp * v[1]; q[jr + (j + 2) * q_dim1] -= temp * v[2]; /* L240: */ } } /* Zero j-th column of B (see DLAGBC for details) */ /* Swap rows to pivot */ ilpivt = FALSE_; /* Computing MAX */ d__3 = (d__1 = t[j + 1 + (j + 1) * t_dim1], abs(d__1)), d__4 = (d__2 = t[j + 1 + (j + 2) * t_dim1], abs(d__2)); temp = max(d__3,d__4); /* Computing MAX */ d__3 = (d__1 = t[j + 2 + (j + 1) * t_dim1], abs(d__1)), d__4 = (d__2 = t[j + 2 + (j + 2) * t_dim1], abs(d__2)); temp2 = max(d__3,d__4); if (max(temp,temp2) < safmin) { scale = 0.; u1 = 1.; u2 = 0.; goto L250; } else if (temp >= temp2) { w11 = t[j + 1 + (j + 1) * t_dim1]; w21 = t[j + 2 + (j + 1) * t_dim1]; w12 = t[j + 1 + (j + 2) * t_dim1]; w22 = t[j + 2 + (j + 2) * t_dim1]; u1 = t[j + 1 + j * t_dim1]; u2 = t[j + 2 + j * t_dim1]; } else { w21 = t[j + 1 + (j + 1) * t_dim1]; w11 = t[j + 2 + (j + 1) * t_dim1]; w22 = t[j + 1 + (j + 2) * t_dim1]; w12 = t[j + 2 + (j + 2) * t_dim1]; u2 = t[j + 1 + j * t_dim1]; u1 = t[j + 2 + j * t_dim1]; } /* Swap columns if nec. */ if (abs(w12) > abs(w11)) { ilpivt = TRUE_; temp = w12; temp2 = w22; w12 = w11; w22 = w21; w11 = temp; w21 = temp2; } /* LU-factor */ temp = w21 / w11; u2 -= temp * u1; w22 -= temp * w12; w21 = 0.; /* Compute SCALE */ scale = 1.; if (abs(w22) < safmin) { scale = 0.; u2 = 1.; u1 = -w12 / w11; goto L250; } if (abs(w22) < abs(u2)) { scale = (d__1 = w22 / u2, abs(d__1)); } if (abs(w11) < abs(u1)) { /* Computing MIN */ d__2 = scale, d__3 = (d__1 = w11 / u1, abs(d__1)); scale = min(d__2,d__3); } /* Solve */ u2 = scale * u2 / w22; u1 = (scale * u1 - w12 * u2) / w11; L250: if (ilpivt) { temp = u2; u2 = u1; u1 = temp; } /* Compute Householder Vector */ /* Computing 2nd power */ d__1 = scale; /* Computing 2nd power */ d__2 = u1; /* Computing 2nd power */ d__3 = u2; t1 = sqrt(d__1 * d__1 + d__2 * d__2 + d__3 * d__3); tau = scale / t1 + 1.; vs = -1. / (scale + t1); v[0] = 1.; v[1] = vs * u1; v[2] = vs * u2; /* Apply transformations from the right. */ /* Computing MIN */ i__4 = j + 3; i__3 = min(i__4,ilast); for (jr = ifrstm; jr <= i__3; ++jr) { temp = tau * (h__[jr + j * h_dim1] + v[1] * h__[jr + (j + 1) * h_dim1] + v[2] * h__[jr + (j + 2) * h_dim1]); h__[jr + j * h_dim1] -= temp; h__[jr + (j + 1) * h_dim1] -= temp * v[1]; h__[jr + (j + 2) * h_dim1] -= temp * v[2]; /* L260: */ } i__3 = j + 2; for (jr = ifrstm; jr <= i__3; ++jr) { temp = tau * (t[jr + j * t_dim1] + v[1] * t[jr + (j + 1) * t_dim1] + v[2] * t[jr + (j + 2) * t_dim1]); t[jr + j * t_dim1] -= temp; t[jr + (j + 1) * t_dim1] -= temp * v[1]; t[jr + (j + 2) * t_dim1] -= temp * v[2]; /* L270: */ } if (ilz) { i__3 = *n; for (jr = 1; jr <= i__3; ++jr) { temp = tau * (z__[jr + j * z_dim1] + v[1] * z__[jr + ( j + 1) * z_dim1] + v[2] * z__[jr + (j + 2) * z_dim1]); z__[jr + j * z_dim1] -= temp; z__[jr + (j + 1) * z_dim1] -= temp * v[1]; z__[jr + (j + 2) * z_dim1] -= temp * v[2]; /* L280: */ } } t[j + 1 + j * t_dim1] = 0.; t[j + 2 + j * t_dim1] = 0.; /* L290: */ } /* Last elements: Use Givens rotations */ /* Rotations from the left */ j = ilast - 1; temp = h__[j + (j - 1) * h_dim1]; _starpu_dlartg_(&temp, &h__[j + 1 + (j - 1) * h_dim1], &c__, &s, &h__[j + (j - 1) * h_dim1]); h__[j + 1 + (j - 1) * h_dim1] = 0.; i__2 = ilastm; for (jc = j; jc <= i__2; ++jc) { temp = c__ * h__[j + jc * h_dim1] + s * h__[j + 1 + jc * h_dim1]; h__[j + 1 + jc * h_dim1] = -s * h__[j + jc * h_dim1] + c__ * h__[j + 1 + jc * h_dim1]; h__[j + jc * h_dim1] = temp; temp2 = c__ * t[j + jc * t_dim1] + s * t[j + 1 + jc * t_dim1]; t[j + 1 + jc * t_dim1] = -s * t[j + jc * t_dim1] + c__ * t[j + 1 + jc * t_dim1]; t[j + jc * t_dim1] = temp2; /* L300: */ } if (ilq) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { temp = c__ * q[jr + j * q_dim1] + s * q[jr + (j + 1) * q_dim1]; q[jr + (j + 1) * q_dim1] = -s * q[jr + j * q_dim1] + c__ * q[jr + (j + 1) * q_dim1]; q[jr + j * q_dim1] = temp; /* L310: */ } } /* Rotations from the right. */ temp = t[j + 1 + (j + 1) * t_dim1]; _starpu_dlartg_(&temp, &t[j + 1 + j * t_dim1], &c__, &s, &t[j + 1 + (j + 1) * t_dim1]); t[j + 1 + j * t_dim1] = 0.; i__2 = ilast; for (jr = ifrstm; jr <= i__2; ++jr) { temp = c__ * h__[jr + (j + 1) * h_dim1] + s * h__[jr + j * h_dim1]; h__[jr + j * h_dim1] = -s * h__[jr + (j + 1) * h_dim1] + c__ * h__[jr + j * h_dim1]; h__[jr + (j + 1) * h_dim1] = temp; /* L320: */ } i__2 = ilast - 1; for (jr = ifrstm; jr <= i__2; ++jr) { temp = c__ * t[jr + (j + 1) * t_dim1] + s * t[jr + j * t_dim1] ; t[jr + j * t_dim1] = -s * t[jr + (j + 1) * t_dim1] + c__ * t[ jr + j * t_dim1]; t[jr + (j + 1) * t_dim1] = temp; /* L330: */ } if (ilz) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { temp = c__ * z__[jr + (j + 1) * z_dim1] + s * z__[jr + j * z_dim1]; z__[jr + j * z_dim1] = -s * z__[jr + (j + 1) * z_dim1] + c__ * z__[jr + j * z_dim1]; z__[jr + (j + 1) * z_dim1] = temp; /* L340: */ } } /* End of Double-Shift code */ } goto L350; /* End of iteration loop */ L350: /* L360: */ ; } /* Drop-through = non-convergence */ *info = ilast; goto L420; /* Successful completion of all QZ steps */ L380: /* Set Eigenvalues 1:ILO-1 */ i__1 = *ilo - 1; for (j = 1; j <= i__1; ++j) { if (t[j + j * t_dim1] < 0.) { if (ilschr) { i__2 = j; for (jr = 1; jr <= i__2; ++jr) { h__[jr + j * h_dim1] = -h__[jr + j * h_dim1]; t[jr + j * t_dim1] = -t[jr + j * t_dim1]; /* L390: */ } } else { h__[j + j * h_dim1] = -h__[j + j * h_dim1]; t[j + j * t_dim1] = -t[j + j * t_dim1]; } if (ilz) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { z__[jr + j * z_dim1] = -z__[jr + j * z_dim1]; /* L400: */ } } } alphar[j] = h__[j + j * h_dim1]; alphai[j] = 0.; beta[j] = t[j + j * t_dim1]; /* L410: */ } /* Normal Termination */ *info = 0; /* Exit (other than argument error) -- return optimal workspace size */ L420: work[1] = (doublereal) (*n); return 0; /* End of DHGEQZ */ } /* _starpu_dhgeqz_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dhsein.c000066400000000000000000000357511413463044200206330ustar00rootroot00000000000000/* dhsein.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static logical c_false = FALSE_; static logical c_true = TRUE_; /* Subroutine */ int _starpu_dhsein_(char *side, char *eigsrc, char *initv, logical * select, integer *n, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer * ifaill, integer *ifailr, integer *info) { /* System generated locals */ integer h_dim1, h_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, k, kl, kr, kln, ksi; doublereal wki; integer ksr; doublereal ulp, wkr, eps3; logical pair; doublereal unfl; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical leftv, bothv; doublereal hnorm; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlaein_(logical *, logical *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal * , doublereal *, doublereal *, integer *); extern doublereal _starpu_dlanhs_(char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; logical noinit; integer ldwork; logical rightv, fromqr; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DHSEIN uses inverse iteration to find specified right and/or left */ /* eigenvectors of a real upper Hessenberg matrix H. */ /* The right eigenvector x and the left eigenvector y of the matrix H */ /* corresponding to an eigenvalue w are defined by: */ /* H * x = w * x, y**h * H = w * y**h */ /* where y**h denotes the conjugate transpose of the vector y. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'R': compute right eigenvectors only; */ /* = 'L': compute left eigenvectors only; */ /* = 'B': compute both right and left eigenvectors. */ /* EIGSRC (input) CHARACTER*1 */ /* Specifies the source of eigenvalues supplied in (WR,WI): */ /* = 'Q': the eigenvalues were found using DHSEQR; thus, if */ /* H has zero subdiagonal elements, and so is */ /* block-triangular, then the j-th eigenvalue can be */ /* assumed to be an eigenvalue of the block containing */ /* the j-th row/column. This property allows DHSEIN to */ /* perform inverse iteration on just one diagonal block. */ /* = 'N': no assumptions are made on the correspondence */ /* between eigenvalues and diagonal blocks. In this */ /* case, DHSEIN must always perform inverse iteration */ /* using the whole matrix H. */ /* INITV (input) CHARACTER*1 */ /* = 'N': no initial vectors are supplied; */ /* = 'U': user-supplied initial vectors are stored in the arrays */ /* VL and/or VR. */ /* SELECT (input/output) LOGICAL array, dimension (N) */ /* Specifies the eigenvectors to be computed. To select the */ /* real eigenvector corresponding to a real eigenvalue WR(j), */ /* SELECT(j) must be set to .TRUE.. To select the complex */ /* eigenvector corresponding to a complex eigenvalue */ /* (WR(j),WI(j)), with complex conjugate (WR(j+1),WI(j+1)), */ /* either SELECT(j) or SELECT(j+1) or both must be set to */ /* .TRUE.; then on exit SELECT(j) is .TRUE. and SELECT(j+1) is */ /* .FALSE.. */ /* N (input) INTEGER */ /* The order of the matrix H. N >= 0. */ /* H (input) DOUBLE PRECISION array, dimension (LDH,N) */ /* The upper Hessenberg matrix H. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH >= max(1,N). */ /* WR (input/output) DOUBLE PRECISION array, dimension (N) */ /* WI (input) DOUBLE PRECISION array, dimension (N) */ /* On entry, the real and imaginary parts of the eigenvalues of */ /* H; a complex conjugate pair of eigenvalues must be stored in */ /* consecutive elements of WR and WI. */ /* On exit, WR may have been altered since close eigenvalues */ /* are perturbed slightly in searching for independent */ /* eigenvectors. */ /* VL (input/output) DOUBLE PRECISION array, dimension (LDVL,MM) */ /* On entry, if INITV = 'U' and SIDE = 'L' or 'B', VL must */ /* contain starting vectors for the inverse iteration for the */ /* left eigenvectors; the starting vector for each eigenvector */ /* must be in the same column(s) in which the eigenvector will */ /* be stored. */ /* On exit, if SIDE = 'L' or 'B', the left eigenvectors */ /* specified by SELECT will be stored consecutively in the */ /* columns of VL, in the same order as their eigenvalues. A */ /* complex eigenvector corresponding to a complex eigenvalue is */ /* stored in two consecutive columns, the first holding the real */ /* part and the second the imaginary part. */ /* If SIDE = 'R', VL is not referenced. */ /* LDVL (input) INTEGER */ /* The leading dimension of the array VL. */ /* LDVL >= max(1,N) if SIDE = 'L' or 'B'; LDVL >= 1 otherwise. */ /* VR (input/output) DOUBLE PRECISION array, dimension (LDVR,MM) */ /* On entry, if INITV = 'U' and SIDE = 'R' or 'B', VR must */ /* contain starting vectors for the inverse iteration for the */ /* right eigenvectors; the starting vector for each eigenvector */ /* must be in the same column(s) in which the eigenvector will */ /* be stored. */ /* On exit, if SIDE = 'R' or 'B', the right eigenvectors */ /* specified by SELECT will be stored consecutively in the */ /* columns of VR, in the same order as their eigenvalues. A */ /* complex eigenvector corresponding to a complex eigenvalue is */ /* stored in two consecutive columns, the first holding the real */ /* part and the second the imaginary part. */ /* If SIDE = 'L', VR is not referenced. */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. */ /* LDVR >= max(1,N) if SIDE = 'R' or 'B'; LDVR >= 1 otherwise. */ /* MM (input) INTEGER */ /* The number of columns in the arrays VL and/or VR. MM >= M. */ /* M (output) INTEGER */ /* The number of columns in the arrays VL and/or VR required to */ /* store the eigenvectors; each selected real eigenvector */ /* occupies one column and each selected complex eigenvector */ /* occupies two columns. */ /* WORK (workspace) DOUBLE PRECISION array, dimension ((N+2)*N) */ /* IFAILL (output) INTEGER array, dimension (MM) */ /* If SIDE = 'L' or 'B', IFAILL(i) = j > 0 if the left */ /* eigenvector in the i-th column of VL (corresponding to the */ /* eigenvalue w(j)) failed to converge; IFAILL(i) = 0 if the */ /* eigenvector converged satisfactorily. If the i-th and (i+1)th */ /* columns of VL hold a complex eigenvector, then IFAILL(i) and */ /* IFAILL(i+1) are set to the same value. */ /* If SIDE = 'R', IFAILL is not referenced. */ /* IFAILR (output) INTEGER array, dimension (MM) */ /* If SIDE = 'R' or 'B', IFAILR(i) = j > 0 if the right */ /* eigenvector in the i-th column of VR (corresponding to the */ /* eigenvalue w(j)) failed to converge; IFAILR(i) = 0 if the */ /* eigenvector converged satisfactorily. If the i-th and (i+1)th */ /* columns of VR hold a complex eigenvector, then IFAILR(i) and */ /* IFAILR(i+1) are set to the same value. */ /* If SIDE = 'L', IFAILR is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, i is the number of eigenvectors which */ /* failed to converge; see IFAILL and IFAILR for further */ /* details. */ /* Further Details */ /* =============== */ /* Each eigenvector is normalized so that the element of largest */ /* magnitude has magnitude 1; here the magnitude of a complex number */ /* (x,y) is taken to be |x|+|y|. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters. */ /* Parameter adjustments */ --select; h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --wr; --wi; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --work; --ifaill; --ifailr; /* Function Body */ bothv = _starpu_lsame_(side, "B"); rightv = _starpu_lsame_(side, "R") || bothv; leftv = _starpu_lsame_(side, "L") || bothv; fromqr = _starpu_lsame_(eigsrc, "Q"); noinit = _starpu_lsame_(initv, "N"); /* Set M to the number of columns required to store the selected */ /* eigenvectors, and standardize the array SELECT. */ *m = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; select[k] = FALSE_; } else { if (wi[k] == 0.) { if (select[k]) { ++(*m); } } else { pair = TRUE_; if (select[k] || select[k + 1]) { select[k] = TRUE_; *m += 2; } } } /* L10: */ } *info = 0; if (! rightv && ! leftv) { *info = -1; } else if (! fromqr && ! _starpu_lsame_(eigsrc, "N")) { *info = -2; } else if (! noinit && ! _starpu_lsame_(initv, "U")) { *info = -3; } else if (*n < 0) { *info = -5; } else if (*ldh < max(1,*n)) { *info = -7; } else if (*ldvl < 1 || leftv && *ldvl < *n) { *info = -11; } else if (*ldvr < 1 || rightv && *ldvr < *n) { *info = -13; } else if (*mm < *m) { *info = -14; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DHSEIN", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } /* Set machine-dependent constants. */ unfl = _starpu_dlamch_("Safe minimum"); ulp = _starpu_dlamch_("Precision"); smlnum = unfl * (*n / ulp); bignum = (1. - ulp) / smlnum; ldwork = *n + 1; kl = 1; kln = 0; if (fromqr) { kr = 0; } else { kr = *n; } ksr = 1; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (select[k]) { /* Compute eigenvector(s) corresponding to W(K). */ if (fromqr) { /* If affiliation of eigenvalues is known, check whether */ /* the matrix splits. */ /* Determine KL and KR such that 1 <= KL <= K <= KR <= N */ /* and H(KL,KL-1) and H(KR+1,KR) are zero (or KL = 1 or */ /* KR = N). */ /* Then inverse iteration can be performed with the */ /* submatrix H(KL:N,KL:N) for a left eigenvector, and with */ /* the submatrix H(1:KR,1:KR) for a right eigenvector. */ i__2 = kl + 1; for (i__ = k; i__ >= i__2; --i__) { if (h__[i__ + (i__ - 1) * h_dim1] == 0.) { goto L30; } /* L20: */ } L30: kl = i__; if (k > kr) { i__2 = *n - 1; for (i__ = k; i__ <= i__2; ++i__) { if (h__[i__ + 1 + i__ * h_dim1] == 0.) { goto L50; } /* L40: */ } L50: kr = i__; } } if (kl != kln) { kln = kl; /* Compute infinity-norm of submatrix H(KL:KR,KL:KR) if it */ /* has not ben computed before. */ i__2 = kr - kl + 1; hnorm = _starpu_dlanhs_("I", &i__2, &h__[kl + kl * h_dim1], ldh, & work[1]); if (hnorm > 0.) { eps3 = hnorm * ulp; } else { eps3 = smlnum; } } /* Perturb eigenvalue if it is close to any previous */ /* selected eigenvalues affiliated to the submatrix */ /* H(KL:KR,KL:KR). Close roots are modified by EPS3. */ wkr = wr[k]; wki = wi[k]; L60: i__2 = kl; for (i__ = k - 1; i__ >= i__2; --i__) { if (select[i__] && (d__1 = wr[i__] - wkr, abs(d__1)) + (d__2 = wi[i__] - wki, abs(d__2)) < eps3) { wkr += eps3; goto L60; } /* L70: */ } wr[k] = wkr; pair = wki != 0.; if (pair) { ksi = ksr + 1; } else { ksi = ksr; } if (leftv) { /* Compute left eigenvector. */ i__2 = *n - kl + 1; _starpu_dlaein_(&c_false, &noinit, &i__2, &h__[kl + kl * h_dim1], ldh, &wkr, &wki, &vl[kl + ksr * vl_dim1], &vl[kl + ksi * vl_dim1], &work[1], &ldwork, &work[*n * *n + *n + 1], &eps3, &smlnum, &bignum, &iinfo); if (iinfo > 0) { if (pair) { *info += 2; } else { ++(*info); } ifaill[ksr] = k; ifaill[ksi] = k; } else { ifaill[ksr] = 0; ifaill[ksi] = 0; } i__2 = kl - 1; for (i__ = 1; i__ <= i__2; ++i__) { vl[i__ + ksr * vl_dim1] = 0.; /* L80: */ } if (pair) { i__2 = kl - 1; for (i__ = 1; i__ <= i__2; ++i__) { vl[i__ + ksi * vl_dim1] = 0.; /* L90: */ } } } if (rightv) { /* Compute right eigenvector. */ _starpu_dlaein_(&c_true, &noinit, &kr, &h__[h_offset], ldh, &wkr, & wki, &vr[ksr * vr_dim1 + 1], &vr[ksi * vr_dim1 + 1], & work[1], &ldwork, &work[*n * *n + *n + 1], &eps3, & smlnum, &bignum, &iinfo); if (iinfo > 0) { if (pair) { *info += 2; } else { ++(*info); } ifailr[ksr] = k; ifailr[ksi] = k; } else { ifailr[ksr] = 0; ifailr[ksi] = 0; } i__2 = *n; for (i__ = kr + 1; i__ <= i__2; ++i__) { vr[i__ + ksr * vr_dim1] = 0.; /* L100: */ } if (pair) { i__2 = *n; for (i__ = kr + 1; i__ <= i__2; ++i__) { vr[i__ + ksi * vr_dim1] = 0.; /* L110: */ } } } if (pair) { ksr += 2; } else { ++ksr; } } /* L120: */ } return 0; /* End of DHSEIN */ } /* _starpu_dhsein_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dhseqr.c000066400000000000000000000452131413463044200206410ustar00rootroot00000000000000/* dhseqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b11 = 0.; static doublereal c_b12 = 1.; static integer c__12 = 12; static integer c__2 = 2; static integer c__49 = 49; /* Subroutine */ int _starpu_dhseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2[2], i__3; doublereal d__1; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal hl[2401] /* was [49][49] */; integer kbot, nmin; extern logical _starpu_lsame_(char *, char *); logical initz; doublereal workl[49]; logical wantt, wantz; extern /* Subroutine */ int _starpu_dlaqr0_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DHSEQR computes the eigenvalues of a Hessenberg matrix H */ /* and, optionally, the matrices T and Z from the Schur decomposition */ /* H = Z T Z**T, where T is an upper quasi-triangular matrix (the */ /* Schur form), and Z is the orthogonal matrix of Schur vectors. */ /* Optionally Z may be postmultiplied into an input orthogonal */ /* matrix Q so that this routine can give the Schur factorization */ /* of a matrix A which has been reduced to the Hessenberg form H */ /* by the orthogonal matrix Q: A = Q*H*Q**T = (QZ)*T*(QZ)**T. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* = 'E': compute eigenvalues only; */ /* = 'S': compute eigenvalues and the Schur form T. */ /* COMPZ (input) CHARACTER*1 */ /* = 'N': no Schur vectors are computed; */ /* = 'I': Z is initialized to the unit matrix and the matrix Z */ /* of Schur vectors of H is returned; */ /* = 'V': Z must contain an orthogonal matrix Q on entry, and */ /* the product Q*Z is returned. */ /* N (input) INTEGER */ /* The order of the matrix H. N .GE. 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that H is already upper triangular in rows */ /* and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally */ /* set by a previous call to DGEBAL, and then passed to DGEHRD */ /* when the matrix output by DGEBAL is reduced to Hessenberg */ /* form. Otherwise ILO and IHI should be set to 1 and N */ /* respectively. If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N. */ /* If N = 0, then ILO = 1 and IHI = 0. */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH,N) */ /* On entry, the upper Hessenberg matrix H. */ /* On exit, if INFO = 0 and JOB = 'S', then H contains the */ /* upper quasi-triangular matrix T from the Schur decomposition */ /* (the Schur form); 2-by-2 diagonal blocks (corresponding to */ /* complex conjugate pairs of eigenvalues) are returned in */ /* standard form, with H(i,i) = H(i+1,i+1) and */ /* H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and JOB = 'E', the */ /* contents of H are unspecified on exit. (The output value of */ /* H when INFO.GT.0 is given under the description of INFO */ /* below.) */ /* Unlike earlier versions of DHSEQR, this subroutine may */ /* explicitly H(i,j) = 0 for i.GT.j and j = 1, 2, ... ILO-1 */ /* or j = IHI+1, IHI+2, ... N. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH .GE. max(1,N). */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* The real and imaginary parts, respectively, of the computed */ /* eigenvalues. If two eigenvalues are computed as a complex */ /* conjugate pair, they are stored in consecutive elements of */ /* WR and WI, say the i-th and (i+1)th, with WI(i) .GT. 0 and */ /* WI(i+1) .LT. 0. If JOB = 'S', the eigenvalues are stored in */ /* the same order as on the diagonal of the Schur form returned */ /* in H, with WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 */ /* diagonal block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and */ /* WI(i+1) = -WI(i). */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* If COMPZ = 'N', Z is not referenced. */ /* If COMPZ = 'I', on entry Z need not be set and on exit, */ /* if INFO = 0, Z contains the orthogonal matrix Z of the Schur */ /* vectors of H. If COMPZ = 'V', on entry Z must contain an */ /* N-by-N matrix Q, which is assumed to be equal to the unit */ /* matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit, */ /* if INFO = 0, Z contains Q*Z. */ /* Normally Q is the orthogonal matrix generated by DORGHR */ /* after the call to DGEHRD which formed the Hessenberg matrix */ /* H. (The output value of Z when INFO.GT.0 is given under */ /* the description of INFO below.) */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. if COMPZ = 'I' or */ /* COMPZ = 'V', then LDZ.GE.MAX(1,N). Otherwize, LDZ.GE.1. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns an estimate of */ /* the optimal value for LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK .GE. max(1,N) */ /* is sufficient and delivers very good and sometimes */ /* optimal performance. However, LWORK as large as 11*N */ /* may be required for optimal performance. A workspace */ /* query is recommended to determine the optimal workspace */ /* size. */ /* If LWORK = -1, then DHSEQR does a workspace query. */ /* In this case, DHSEQR checks the input parameters and */ /* estimates the optimal workspace size for the given */ /* values of N, ILO and IHI. The estimate is returned */ /* in WORK(1). No error message related to LWORK is */ /* issued by XERBLA. Neither H nor Z are accessed. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* .LT. 0: if INFO = -i, the i-th argument had an illegal */ /* value */ /* .GT. 0: if INFO = i, DHSEQR failed to compute all of */ /* the eigenvalues. Elements 1:ilo-1 and i+1:n of WR */ /* and WI contain those eigenvalues which have been */ /* successfully computed. (Failures are rare.) */ /* If INFO .GT. 0 and JOB = 'E', then on exit, the */ /* remaining unconverged eigenvalues are the eigen- */ /* values of the upper Hessenberg matrix rows and */ /* columns ILO through INFO of the final, output */ /* value of H. */ /* If INFO .GT. 0 and JOB = 'S', then on exit */ /* (*) (initial value of H)*U = U*(final value of H) */ /* where U is an orthogonal matrix. The final */ /* value of H is upper Hessenberg and quasi-triangular */ /* in rows and columns INFO+1 through IHI. */ /* If INFO .GT. 0 and COMPZ = 'V', then on exit */ /* (final value of Z) = (initial value of Z)*U */ /* where U is the orthogonal matrix in (*) (regard- */ /* less of the value of JOB.) */ /* If INFO .GT. 0 and COMPZ = 'I', then on exit */ /* (final value of Z) = U */ /* where U is the orthogonal matrix in (*) (regard- */ /* less of the value of JOB.) */ /* If INFO .GT. 0 and COMPZ = 'N', then Z is not */ /* accessed. */ /* ================================================================ */ /* Default values supplied by */ /* ILAENV(ISPEC,'DHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK). */ /* It is suggested that these defaults be adjusted in order */ /* to attain best performance in each particular */ /* computational environment. */ /* ISPEC=12: The DLAHQR vs DLAQR0 crossover point. */ /* Default: 75. (Must be at least 11.) */ /* ISPEC=13: Recommended deflation window size. */ /* This depends on ILO, IHI and NS. NS is the */ /* number of simultaneous shifts returned */ /* by ILAENV(ISPEC=15). (See ISPEC=15 below.) */ /* The default for (IHI-ILO+1).LE.500 is NS. */ /* The default for (IHI-ILO+1).GT.500 is 3*NS/2. */ /* ISPEC=14: Nibble crossover point. (See IPARMQ for */ /* details.) Default: 14% of deflation window */ /* size. */ /* ISPEC=15: Number of simultaneous shifts in a multishift */ /* QR iteration. */ /* If IHI-ILO+1 is ... */ /* greater than ...but less ... the */ /* or equal to ... than default is */ /* 1 30 NS = 2(+) */ /* 30 60 NS = 4(+) */ /* 60 150 NS = 10(+) */ /* 150 590 NS = ** */ /* 590 3000 NS = 64 */ /* 3000 6000 NS = 128 */ /* 6000 infinity NS = 256 */ /* (+) By default some or all matrices of this order */ /* are passed to the implicit double shift routine */ /* DLAHQR and this parameter is ignored. See */ /* ISPEC=12 above and comments in IPARMQ for */ /* details. */ /* (**) The asterisks (**) indicate an ad-hoc */ /* function of N increasing from 10 to 64. */ /* ISPEC=16: Select structured matrix multiply. */ /* If the number of simultaneous shifts (specified */ /* by ISPEC=15) is less than 14, then the default */ /* for ISPEC=16 is 0. Otherwise the default for */ /* ISPEC=16 is 2. */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* References: */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part I: Maintaining Well Focused Shifts, and Level 3 */ /* Performance, SIAM Journal of Matrix Analysis, volume 23, pages */ /* 929--947, 2002. */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part II: Aggressive Early Deflation, SIAM Journal */ /* of Matrix Analysis, volume 23, pages 948--973, 2002. */ /* ================================================================ */ /* .. Parameters .. */ /* ==== Matrices of order NTINY or smaller must be processed by */ /* . DLAHQR because of insufficient subdiagonal scratch space. */ /* . (This is a hard limit.) ==== */ /* ==== NL allocates some local workspace to help small matrices */ /* . through a rare DLAHQR failure. NL .GT. NTINY = 11 is */ /* . required and NL .LE. NMIN = ILAENV(ISPEC=12,...) is recom- */ /* . mended. (The default value of NMIN is 75.) Using NL = 49 */ /* . allows up to six simultaneous shifts and a 16-by-16 */ /* . deflation window. ==== */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* ==== Decode and check the input parameters. ==== */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --wr; --wi; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ wantt = _starpu_lsame_(job, "S"); initz = _starpu_lsame_(compz, "I"); wantz = initz || _starpu_lsame_(compz, "V"); work[1] = (doublereal) max(1,*n); lquery = *lwork == -1; *info = 0; if (! _starpu_lsame_(job, "E") && ! wantt) { *info = -1; } else if (! _starpu_lsame_(compz, "N") && ! wantz) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ilo < 1 || *ilo > max(1,*n)) { *info = -4; } else if (*ihi < min(*ilo,*n) || *ihi > *n) { *info = -5; } else if (*ldh < max(1,*n)) { *info = -7; } else if (*ldz < 1 || wantz && *ldz < max(1,*n)) { *info = -11; } else if (*lwork < max(1,*n) && ! lquery) { *info = -13; } if (*info != 0) { /* ==== Quick return in case of invalid argument. ==== */ i__1 = -(*info); _starpu_xerbla_("DHSEQR", &i__1); return 0; } else if (*n == 0) { /* ==== Quick return in case N = 0; nothing to do. ==== */ return 0; } else if (lquery) { /* ==== Quick return in case of a workspace query ==== */ _starpu_dlaqr0_(&wantt, &wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[ 1], ilo, ihi, &z__[z_offset], ldz, &work[1], lwork, info); /* ==== Ensure reported workspace size is backward-compatible with */ /* . previous LAPACK versions. ==== */ /* Computing MAX */ d__1 = (doublereal) max(1,*n); work[1] = max(d__1,work[1]); return 0; } else { /* ==== copy eigenvalues isolated by DGEBAL ==== */ i__1 = *ilo - 1; for (i__ = 1; i__ <= i__1; ++i__) { wr[i__] = h__[i__ + i__ * h_dim1]; wi[i__] = 0.; /* L10: */ } i__1 = *n; for (i__ = *ihi + 1; i__ <= i__1; ++i__) { wr[i__] = h__[i__ + i__ * h_dim1]; wi[i__] = 0.; /* L20: */ } /* ==== Initialize Z, if requested ==== */ if (initz) { _starpu_dlaset_("A", n, n, &c_b11, &c_b12, &z__[z_offset], ldz) ; } /* ==== Quick return if possible ==== */ if (*ilo == *ihi) { wr[*ilo] = h__[*ilo + *ilo * h_dim1]; wi[*ilo] = 0.; return 0; } /* ==== DLAHQR/DLAQR0 crossover point ==== */ /* Writing concatenation */ i__2[0] = 1, a__1[0] = job; i__2[1] = 1, a__1[1] = compz; s_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); nmin = _starpu_ilaenv_(&c__12, "DHSEQR", ch__1, n, ilo, ihi, lwork); nmin = max(11,nmin); /* ==== DLAQR0 for big matrices; DLAHQR for small ones ==== */ if (*n > nmin) { _starpu_dlaqr0_(&wantt, &wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, ihi, &z__[z_offset], ldz, &work[1], lwork, info); } else { /* ==== Small matrix ==== */ _starpu_dlahqr_(&wantt, &wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, ihi, &z__[z_offset], ldz, info); if (*info > 0) { /* ==== A rare DLAHQR failure! DLAQR0 sometimes succeeds */ /* . when DLAHQR fails. ==== */ kbot = *info; if (*n >= 49) { /* ==== Larger matrices have enough subdiagonal scratch */ /* . space to call DLAQR0 directly. ==== */ _starpu_dlaqr0_(&wantt, &wantz, n, ilo, &kbot, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, ihi, &z__[z_offset], ldz, &work[1], lwork, info); } else { /* ==== Tiny matrices don't have enough subdiagonal */ /* . scratch space to benefit from DLAQR0. Hence, */ /* . tiny matrices must be copied into a larger */ /* . array before calling DLAQR0. ==== */ _starpu_dlacpy_("A", n, n, &h__[h_offset], ldh, hl, &c__49); hl[*n + 1 + *n * 49 - 50] = 0.; i__1 = 49 - *n; _starpu_dlaset_("A", &c__49, &i__1, &c_b11, &c_b11, &hl[(*n + 1) * 49 - 49], &c__49); _starpu_dlaqr0_(&wantt, &wantz, &c__49, ilo, &kbot, hl, &c__49, & wr[1], &wi[1], ilo, ihi, &z__[z_offset], ldz, workl, &c__49, info); if (wantt || *info != 0) { _starpu_dlacpy_("A", n, n, hl, &c__49, &h__[h_offset], ldh); } } } } /* ==== Clear out the trash, if necessary. ==== */ if ((wantt || *info != 0) && *n > 2) { i__1 = *n - 2; i__3 = *n - 2; _starpu_dlaset_("L", &i__1, &i__3, &c_b11, &c_b11, &h__[h_dim1 + 3], ldh); } /* ==== Ensure reported workspace size is backward-compatible with */ /* . previous LAPACK versions. ==== */ /* Computing MAX */ d__1 = (doublereal) max(1,*n); work[1] = max(d__1,work[1]); } /* ==== End of DHSEQR ==== */ return 0; } /* _starpu_dhseqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/disnan.c000066400000000000000000000026311413463044200206240ustar00rootroot00000000000000/* disnan.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" logical _starpu_disnan_(doublereal *din) { /* System generated locals */ logical ret_val; /* Local variables */ extern logical _starpu_dlaisnan_(doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DISNAN returns .TRUE. if its argument is NaN, and .FALSE. */ /* otherwise. To be replaced by the Fortran 2003 intrinsic in the */ /* future. */ /* Arguments */ /* ========= */ /* DIN (input) DOUBLE PRECISION */ /* Input to test for NaN. */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ ret_val = _starpu_dlaisnan_(din, din); return ret_val; } /* _starpu_disnan_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_gbamv.c000066400000000000000000000222721413463044200212670ustar00rootroot00000000000000/* _starpu_dla_gbamv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dla_gbamv__(integer *trans, integer *m, integer *n, integer *kl, integer *ku, doublereal *alpha, doublereal *ab, integer * ldab, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ extern integer _starpu_ilatrans_(char *); integer i__, j; logical symb_zero__; integer kd, iy, jx, kx, ky, info; doublereal temp; integer lenx, leny; doublereal safe1; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GEAMV performs one of the matrix-vector operations */ /* y := alpha*abs(A)*abs(x) + beta*abs(y), */ /* or y := alpha*abs(A)'*abs(x) + beta*abs(y), */ /* where alpha and beta are scalars, x and y are vectors and A is an */ /* m by n matrix. */ /* This function is primarily used in calculating error bounds. */ /* To protect against underflow during evaluation, components in */ /* the resulting vector are perturbed away from zero by (N+1) */ /* times the underflow threshold. To prevent unnecessarily large */ /* errors for block-structure embedded in general matrices, */ /* "symbolically" zero components are not perturbed. A zero */ /* entry is considered "symbolic" if all multiplications involved */ /* in computing that entry have at least one zero multiplicand. */ /* Parameters */ /* ========== */ /* TRANS - INTEGER */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* BLAS_NO_TRANS y := alpha*abs(A)*abs(x) + beta*abs(y) */ /* BLAS_TRANS y := alpha*abs(A')*abs(x) + beta*abs(y) */ /* BLAS_CONJ_TRANS y := alpha*abs(A')*abs(x) + beta*abs(y) */ /* Unchanged on exit. */ /* M - INTEGER */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* KL - INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU - INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* ALPHA - DOUBLE PRECISION */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ) */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. */ /* Unchanged on exit. */ /* LDA - INTEGER */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ /* Before entry with BETA non-zero, the incremented array Y */ /* must contain the vector y. On exit, Y is overwritten by the */ /* updated vector y. */ /* INCY - INTEGER */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --x; --y; /* Function Body */ info = 0; if (! (*trans == _starpu_ilatrans_("N") || *trans == _starpu_ilatrans_("T") || *trans == _starpu_ilatrans_("C"))) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; } else if (*kl < 0) { info = 4; } else if (*ku < 0) { info = 5; } else if (*ldab < *kl + *ku + 1) { info = 6; } else if (*incx == 0) { info = 8; } else if (*incy == 0) { info = 11; } if (info != 0) { _starpu_xerbla_("DLA_GBAMV ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set */ /* up the start points in X and Y. */ if (*trans == _starpu_ilatrans_("N")) { lenx = *n; leny = *m; } else { lenx = *m; leny = *n; } if (*incx > 0) { kx = 1; } else { kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (leny - 1) * *incy; } /* Set SAFE1 essentially to be the underflow threshold times the */ /* number of additions in each row. */ safe1 = _starpu_dlamch_("Safe minimum"); safe1 = (*n + 1) * safe1; /* Form y := alpha*abs(A)*abs(x) + beta*abs(y). */ /* The O(M*N) SYMB_ZERO tests could be replaced by O(N) queries to */ /* the inexact flag. Still doesn't help change the iteration order */ /* to per-column. */ kd = *ku + 1; iy = ky; if (*incx == 1) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { if (*beta == 0.) { symb_zero__ = TRUE_; y[iy] = 0.; } else if (y[iy] == 0.) { symb_zero__ = TRUE_; } else { symb_zero__ = FALSE_; y[iy] = *beta * (d__1 = y[iy], abs(d__1)); } if (*alpha != 0.) { /* Computing MAX */ i__2 = i__ - *ku; /* Computing MIN */ i__4 = i__ + *kl; i__3 = min(i__4,lenx); for (j = max(i__2,1); j <= i__3; ++j) { if (*trans == _starpu_ilatrans_("N")) { temp = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs( d__1)); } else { temp = (d__1 = ab[j + (kd + i__ - j) * ab_dim1], abs( d__1)); } symb_zero__ = symb_zero__ && (x[j] == 0. || temp == 0.); y[iy] += *alpha * (d__1 = x[j], abs(d__1)) * temp; } } if (! symb_zero__) { y[iy] += d_sign(&safe1, &y[iy]); } iy += *incy; } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { if (*beta == 0.) { symb_zero__ = TRUE_; y[iy] = 0.; } else if (y[iy] == 0.) { symb_zero__ = TRUE_; } else { symb_zero__ = FALSE_; y[iy] = *beta * (d__1 = y[iy], abs(d__1)); } if (*alpha != 0.) { jx = kx; /* Computing MAX */ i__3 = i__ - *ku; /* Computing MIN */ i__4 = i__ + *kl; i__2 = min(i__4,lenx); for (j = max(i__3,1); j <= i__2; ++j) { if (*trans == _starpu_ilatrans_("N")) { temp = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs( d__1)); } else { temp = (d__1 = ab[j + (kd + i__ - j) * ab_dim1], abs( d__1)); } symb_zero__ = symb_zero__ && (x[jx] == 0. || temp == 0.); y[iy] += *alpha * (d__1 = x[jx], abs(d__1)) * temp; jx += *incx; } } if (! symb_zero__) { y[iy] += d_sign(&safe1, &y[iy]); } iy += *incy; } } return 0; /* End of DLA_GBAMV */ } /* _starpu_dla_gbamv__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_gbrcond.c000066400000000000000000000231471413463044200216130ustar00rootroot00000000000000/* _starpu_dla_gbrcond.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dla_gbrcond__(char *trans, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen trans_len) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, i__1, i__2, i__3, i__4; doublereal ret_val, d__1; /* Local variables */ integer i__, j, kd, ke; doublereal tmp; integer kase; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dgbtrs_(char *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal ainvnm; logical notrans; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GERCOND Estimates the Skeel condition number of op(A) * op2(C) */ /* where op2 is determined by CMODE as follows */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* The Skeel condition number cond(A) = norminf( |inv(A)||A| ) */ /* is computed by computing scaling factors R such that */ /* diag(R)*A*op2(C) is row equilibrated and computing the standard */ /* infinity-norm condition number. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate Transpose = Transpose) */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl) */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* AFB (input) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* Details of the LU factorization of the band matrix A, as */ /* computed by DGBTRF. U is stored as an upper triangular */ /* band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, */ /* and the multipliers used during the factorization are stored */ /* in rows KL+KU+2 to 2*KL+KU+1. */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= 2*KL+KU+1. */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from the factorization A = P*L*U */ /* as computed by DGBTRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* CMODE (input) INTEGER */ /* Determines op2(C) in the formula op(A) * op2(C) as follows: */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The vector C in the formula op(A) * op2(C). */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* i > 0: The ith argument is invalid. */ /* WORK (input) DOUBLE PRECISION array, dimension (5*N). */ /* Workspace. */ /* IWORK (input) INTEGER array, dimension (N). */ /* Workspace. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --ipiv; --c__; --work; --iwork; /* Function Body */ ret_val = 0.; *info = 0; notrans = _starpu_lsame_(trans, "N"); if (! notrans && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kl < 0 || *kl > *n - 1) { *info = -3; } else if (*ku < 0 || *ku > *n - 1) { *info = -4; } else if (*ldab < *kl + *ku + 1) { *info = -6; } else if (*ldafb < (*kl << 1) + *ku + 1) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLA_GBRCOND", &i__1); return ret_val; } if (*n == 0) { ret_val = 1.; return ret_val; } /* Compute the equilibration matrix R such that */ /* inv(R)*A*C has unit 1-norm. */ kd = *ku + 1; ke = *kl + 1; if (notrans) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { /* Computing MAX */ i__2 = i__ - *kl; /* Computing MIN */ i__4 = i__ + *ku; i__3 = min(i__4,*n); for (j = max(i__2,1); j <= i__3; ++j) { tmp += (d__1 = ab[kd + i__ - j + j * ab_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { /* Computing MAX */ i__3 = i__ - *kl; /* Computing MIN */ i__4 = i__ + *ku; i__2 = min(i__4,*n); for (j = max(i__3,1); j <= i__2; ++j) { tmp += (d__1 = ab[kd + i__ - j + j * ab_dim1], abs(d__1)); } } else { /* Computing MAX */ i__2 = i__ - *kl; /* Computing MIN */ i__4 = i__ + *ku; i__3 = min(i__4,*n); for (j = max(i__2,1); j <= i__3; ++j) { tmp += (d__1 = ab[kd + i__ - j + j * ab_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { /* Computing MAX */ i__3 = i__ - *kl; /* Computing MIN */ i__4 = i__ + *ku; i__2 = min(i__4,*n); for (j = max(i__3,1); j <= i__2; ++j) { tmp += (d__1 = ab[ke - i__ + j + i__ * ab_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { /* Computing MAX */ i__2 = i__ - *kl; /* Computing MIN */ i__4 = i__ + *ku; i__3 = min(i__4,*n); for (j = max(i__2,1); j <= i__3; ++j) { tmp += (d__1 = ab[ke - i__ + j + i__ * ab_dim1], abs(d__1) ); } } else { /* Computing MAX */ i__3 = i__ - *kl; /* Computing MIN */ i__4 = i__ + *ku; i__2 = min(i__4,*n); for (j = max(i__3,1); j <= i__2; ++j) { tmp += (d__1 = ab[ke - i__ + j + i__ * ab_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } /* Estimate the norm of inv(op(A)). */ ainvnm = 0.; kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == 2) { /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } if (notrans) { _starpu_dgbtrs_("No transpose", n, kl, ku, &c__1, &afb[afb_offset], ldafb, &ipiv[1], &work[1], n, info); } else { _starpu_dgbtrs_("Transpose", n, kl, ku, &c__1, &afb[afb_offset], ldafb, &ipiv[1], &work[1], n, info); } /* Multiply by inv(C). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } } else { /* Multiply by inv(C'). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } if (notrans) { _starpu_dgbtrs_("Transpose", n, kl, ku, &c__1, &afb[afb_offset], ldafb, &ipiv[1], &work[1], n, info); } else { _starpu_dgbtrs_("No transpose", n, kl, ku, &c__1, &afb[afb_offset], ldafb, &ipiv[1], &work[1], n, info); } /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { ret_val = 1. / ainvnm; } return ret_val; } /* _starpu_dla_gbrcond__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_gbrfsx_extended.c000066400000000000000000000564541413463044200233570ustar00rootroot00000000000000/* _starpu_dla_gbrfsx_extended.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b6 = -1.; static doublereal c_b8 = 1.; /* Subroutine */ int _starpu_dla_gbrfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, y_dim1, y_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1, i__2, i__3; doublereal d__1, d__2; char ch__1[1]; /* Local variables */ doublereal dxratmax, dzratmax; integer i__, j, m; extern /* Subroutine */ int _starpu_dla_gbamv__(integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical incr_prec__; doublereal prev_dz_z__, yk, final_dx_x__; extern /* Subroutine */ int _starpu_dla_wwaddw__(integer *, doublereal *, doublereal *, doublereal *); doublereal final_dz_z__, prevnormdx; integer cnt; doublereal dyk, eps, incr_thresh__, dx_x__, dz_z__; extern /* Subroutine */ int _starpu_dla_lin_berr__(integer *, integer *, integer * , doublereal *, doublereal *, doublereal *); doublereal ymin; extern /* Subroutine */ int _starpu_blas_dgbmv_x__(integer *, integer *, integer * , integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer y_prec_state__; extern /* Subroutine */ int blas_dgbmv2_x__(integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dgbmv_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal dxrat, dzrat; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); char trans[1]; doublereal normx, normy; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dgbtrs_(char *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal normdx; extern /* Character */ VOID _starpu_chla_transtype__(char *, ftnlen, integer *); doublereal hugeval; integer x_state__, z_state__; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GBRFSX_EXTENDED improves the computed solution to a system of */ /* linear equations by performing extra-precise iterative refinement */ /* and provides error bounds and backward error estimates for the solution. */ /* This subroutine is called by DGBRFSX to perform iterative refinement. */ /* In addition to normwise error bound, the code provides maximum */ /* componentwise error bound if possible. See comments for ERR_BNDS_NORM */ /* and ERR_BNDS_COMP for details of the error bounds. Note that this */ /* subroutine is only resonsible for setting the second fields of */ /* ERR_BNDS_NORM and ERR_BNDS_COMP. */ /* Arguments */ /* ========= */ /* PREC_TYPE (input) INTEGER */ /* Specifies the intermediate precision to be used in refinement. */ /* The value is defined by ILAPREC(P) where P is a CHARACTER and */ /* P = 'S': Single */ /* = 'D': Double */ /* = 'I': Indigenous */ /* = 'X', 'E': Extra */ /* TRANS_TYPE (input) INTEGER */ /* Specifies the transposition operation on A. */ /* The value is defined by ILATRANS(T) where T is a CHARACTER and */ /* T = 'N': No transpose */ /* = 'T': Transpose */ /* = 'C': Conjugate transpose */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0 */ /* NRHS (input) INTEGER */ /* The number of right-hand-sides, i.e., the number of columns of the */ /* matrix B. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factors L and U from the factorization */ /* A = P*L*U as computed by DGBTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from the factorization A = P*L*U */ /* as computed by DGBTRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* COLEQU (input) LOGICAL */ /* If .TRUE. then column equilibration was done to A before calling */ /* this routine. This is needed to compute the solution and error */ /* bounds correctly. */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If COLEQU = .FALSE., C */ /* is not accessed. If C is input, each element of C should be a power */ /* of the radix to ensure a reliable solution and error estimates. */ /* Scaling by powers of the radix does not cause rounding errors unless */ /* the result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right-hand-side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Y (input/output) DOUBLE PRECISION array, dimension */ /* (LDY,NRHS) */ /* On entry, the solution matrix X, as computed by DGBTRS. */ /* On exit, the improved solution matrix Y. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= max(1,N). */ /* BERR_OUT (output) DOUBLE PRECISION array, dimension (NRHS) */ /* On exit, BERR_OUT(j) contains the componentwise relative backward */ /* error for right-hand-side j from the formula */ /* max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. This is computed by DLA_LIN_BERR. */ /* N_NORMS (input) INTEGER */ /* Determines which error bounds to return (see ERR_BNDS_NORM */ /* and ERR_BNDS_COMP). */ /* If N_NORMS >= 1 return normwise error bounds. */ /* If N_NORMS >= 2 return componentwise error bounds. */ /* ERR_BNDS_NORM (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* RES (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate residual. */ /* AYB (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace. This can be the same workspace passed for Y_TAIL. */ /* DY (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate solution. */ /* Y_TAIL (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the trailing bits of the intermediate solution. */ /* RCOND (input) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* ITHRESH (input) INTEGER */ /* The maximum number of residual computations allowed for */ /* refinement. The default is 10. For 'aggressive' set to 100 to */ /* permit convergence using approximate factorizations or */ /* factorizations other than LU. If the factorization uses a */ /* technique other than Gaussian elimination, the guarantees in */ /* ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy. */ /* RTHRESH (input) DOUBLE PRECISION */ /* Determines when to stop refinement if the error estimate stops */ /* decreasing. Refinement will stop when the next solution no longer */ /* satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is */ /* the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The */ /* default value is 0.5. For 'aggressive' set to 0.9 to permit */ /* convergence on extremely ill-conditioned matrices. See LAWN 165 */ /* for more details. */ /* DZ_UB (input) DOUBLE PRECISION */ /* Determines when to start considering componentwise convergence. */ /* Componentwise convergence is only considered after each component */ /* of the solution Y is stable, which we definte as the relative */ /* change in each component being less than DZ_UB. The default value */ /* is 0.25, requiring the first bit to be stable. See LAWN 165 for */ /* more details. */ /* IGNORE_CWISE (input) LOGICAL */ /* If .TRUE. then ignore componentwise convergence. Default value */ /* is .FALSE.. */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* < 0: if INFO = -i, the ith argument to DGBTRS had an illegal */ /* value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --ipiv; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; --berr_out__; --res; --ayb; --dy; --y_tail__; /* Function Body */ if (*info != 0) { return 0; } _starpu_chla_transtype__(ch__1, (ftnlen)1, trans_type__); *(unsigned char *)trans = *(unsigned char *)&ch__1[0]; eps = _starpu_dlamch_("Epsilon"); hugeval = _starpu_dlamch_("Overflow"); /* Force HUGEVAL to Inf */ hugeval *= hugeval; /* Using HUGEVAL may lead to spurious underflows. */ incr_thresh__ = (doublereal) (*n) * eps; m = *kl + *ku + 1; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { y_prec_state__ = 1; if (y_prec_state__ == 2) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { y_tail__[i__] = 0.; } } dxrat = 0.; dxratmax = 0.; dzrat = 0.; dzratmax = 0.; final_dx_x__ = hugeval; final_dz_z__ = hugeval; prevnormdx = hugeval; prev_dz_z__ = hugeval; dz_z__ = hugeval; dx_x__ = hugeval; x_state__ = 1; z_state__ = 0; incr_prec__ = FALSE_; i__2 = *ithresh; for (cnt = 1; cnt <= i__2; ++cnt) { /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); if (y_prec_state__ == 0) { _starpu_dgbmv_(trans, &m, n, kl, ku, &c_b6, &ab[ab_offset], ldab, &y[ j * y_dim1 + 1], &c__1, &c_b8, &res[1], &c__1); } else if (y_prec_state__ == 1) { _starpu_blas_dgbmv_x__(trans_type__, n, n, kl, ku, &c_b6, &ab[ ab_offset], ldab, &y[j * y_dim1 + 1], &c__1, &c_b8, & res[1], &c__1, prec_type__); } else { blas_dgbmv2_x__(trans_type__, n, n, kl, ku, &c_b6, &ab[ ab_offset], ldab, &y[j * y_dim1 + 1], &y_tail__[1], & c__1, &c_b8, &res[1], &c__1, prec_type__); } /* XXX: RES is no longer needed. */ _starpu_dcopy_(n, &res[1], &c__1, &dy[1], &c__1); _starpu_dgbtrs_(trans, n, kl, ku, &c__1, &afb[afb_offset], ldafb, &ipiv[1] , &dy[1], n, info); /* Calculate relative changes DX_X, DZ_Z and ratios DXRAT, DZRAT. */ normx = 0.; normy = 0.; normdx = 0.; dz_z__ = 0.; ymin = hugeval; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { yk = (d__1 = y[i__ + j * y_dim1], abs(d__1)); dyk = (d__1 = dy[i__], abs(d__1)); if (yk != 0.) { /* Computing MAX */ d__1 = dz_z__, d__2 = dyk / yk; dz_z__ = max(d__1,d__2); } else if (dyk != 0.) { dz_z__ = hugeval; } ymin = min(ymin,yk); normy = max(normy,yk); if (*colequ) { /* Computing MAX */ d__1 = normx, d__2 = yk * c__[i__]; normx = max(d__1,d__2); /* Computing MAX */ d__1 = normdx, d__2 = dyk * c__[i__]; normdx = max(d__1,d__2); } else { normx = normy; normdx = max(normdx,dyk); } } if (normx != 0.) { dx_x__ = normdx / normx; } else if (normdx == 0.) { dx_x__ = 0.; } else { dx_x__ = hugeval; } dxrat = normdx / prevnormdx; dzrat = dz_z__ / prev_dz_z__; /* Check termination criteria. */ if (! (*ignore_cwise__) && ymin * *rcond < incr_thresh__ * normy && y_prec_state__ < 2) { incr_prec__ = TRUE_; } if (x_state__ == 3 && dxrat <= *rthresh) { x_state__ = 1; } if (x_state__ == 1) { if (dx_x__ <= eps) { x_state__ = 2; } else if (dxrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { x_state__ = 3; } } else { if (dxrat > dxratmax) { dxratmax = dxrat; } } if (x_state__ > 1) { final_dx_x__ = dx_x__; } } if (z_state__ == 0 && dz_z__ <= *dz_ub__) { z_state__ = 1; } if (z_state__ == 3 && dzrat <= *rthresh) { z_state__ = 1; } if (z_state__ == 1) { if (dz_z__ <= eps) { z_state__ = 2; } else if (dz_z__ > *dz_ub__) { z_state__ = 0; dzratmax = 0.; final_dz_z__ = hugeval; } else if (dzrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { z_state__ = 3; } } else { if (dzrat > dzratmax) { dzratmax = dzrat; } } if (z_state__ > 1) { final_dz_z__ = dz_z__; } } /* Exit if both normwise and componentwise stopped working, */ /* but if componentwise is unstable, let it go at least two */ /* iterations. */ if (x_state__ != 1) { if (*ignore_cwise__) { goto L666; } if (z_state__ == 3 || z_state__ == 2) { goto L666; } if (z_state__ == 0 && cnt > 1) { goto L666; } } if (incr_prec__) { incr_prec__ = FALSE_; ++y_prec_state__; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { y_tail__[i__] = 0.; } } prevnormdx = normdx; prev_dz_z__ = dz_z__; /* Update soluton. */ if (y_prec_state__ < 2) { _starpu_daxpy_(n, &c_b8, &dy[1], &c__1, &y[j * y_dim1 + 1], &c__1); } else { _starpu_dla_wwaddw__(n, &y[j * y_dim1 + 1], &y_tail__[1], &dy[1]); } } /* Target of "IF (Z_STOP .AND. X_STOP)". Sun's f77 won't EXIT. */ L666: /* Set final_* when cnt hits ithresh. */ if (x_state__ == 1) { final_dx_x__ = dx_x__; } if (z_state__ == 1) { final_dz_z__ = dz_z__; } /* Compute error bounds. */ if (*n_norms__ >= 1) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = final_dx_x__ / ( 1 - dxratmax); } if (*n_norms__ >= 2) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = final_dz_z__ / ( 1 - dzratmax); } /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. */ /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); _starpu_dgbmv_(trans, n, n, kl, ku, &c_b6, &ab[ab_offset], ldab, &y[j * y_dim1 + 1], &c__1, &c_b8, &res[1], &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { ayb[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); } /* Compute abs(op(A_s))*abs(Y) + abs(B_s). */ _starpu_dla_gbamv__(trans_type__, n, n, kl, ku, &c_b8, &ab[ab_offset], ldab, & y[j * y_dim1 + 1], &c__1, &c_b8, &ayb[1], &c__1); _starpu_dla_lin_berr__(n, n, &c__1, &res[1], &ayb[1], &berr_out__[j]); /* End of loop for each RHS */ } return 0; } /* _starpu_dla_gbrfsx_extended__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_gbrpvgrw.c000066400000000000000000000105161413463044200220310ustar00rootroot00000000000000/* _starpu_dla_gbrpvgrw.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dla_gbrpvgrw__(integer *n, integer *kl, integer *ku, integer * ncols, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, i__1, i__2, i__3, i__4; doublereal ret_val, d__1, d__2; /* Local variables */ integer i__, j, kd; doublereal amax, umax, rpvgrw; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GBRPVGRW computes the reciprocal pivot growth factor */ /* norm(A)/norm(U). The "max absolute element" norm is used. If this is */ /* much less than 1, the stability of the LU factorization of the */ /* (equilibrated) matrix A could be poor. This also means that the */ /* solution X, estimated condition numbers, and error bounds could be */ /* unreliable. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* NCOLS (input) INTEGER */ /* The number of columns of the matrix A. NCOLS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl) */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* AFB (input) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* Details of the LU factorization of the band matrix A, as */ /* computed by DGBTRF. U is stored as an upper triangular */ /* band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, */ /* and the multipliers used during the factorization are stored */ /* in rows KL+KU+2 to 2*KL+KU+1. */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= 2*KL+KU+1. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; /* Function Body */ rpvgrw = 1.; kd = *ku + 1; i__1 = *ncols; for (j = 1; j <= i__1; ++j) { amax = 0.; umax = 0.; /* Computing MAX */ i__2 = j - *ku; /* Computing MIN */ i__4 = j + *kl; i__3 = min(i__4,*n); for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = (d__1 = ab[kd + i__ - j + j * ab_dim1], abs(d__1)); amax = max(d__2,amax); } /* Computing MAX */ i__3 = j - *ku; i__2 = j; for (i__ = max(i__3,1); i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = afb[kd + i__ - j + j * afb_dim1], abs(d__1)); umax = max(d__2,umax); } if (umax != 0.) { /* Computing MIN */ d__1 = amax / umax; rpvgrw = min(d__1,rpvgrw); } } ret_val = rpvgrw; return ret_val; } /* _starpu_dla_gbrpvgrw__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_geamv.c000066400000000000000000000211331413463044200212650ustar00rootroot00000000000000/* _starpu_dla_geamv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dla_geamv__(integer *trans, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ extern integer _starpu_ilatrans_(char *); integer i__, j; logical symb_zero__; integer iy, jx, kx, ky, info; doublereal temp; integer lenx, leny; doublereal safe1; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GEAMV performs one of the matrix-vector operations */ /* y := alpha*abs(A)*abs(x) + beta*abs(y), */ /* or y := alpha*abs(A)'*abs(x) + beta*abs(y), */ /* where alpha and beta are scalars, x and y are vectors and A is an */ /* m by n matrix. */ /* This function is primarily used in calculating error bounds. */ /* To protect against underflow during evaluation, components in */ /* the resulting vector are perturbed away from zero by (N+1) */ /* times the underflow threshold. To prevent unnecessarily large */ /* errors for block-structure embedded in general matrices, */ /* "symbolically" zero components are not perturbed. A zero */ /* entry is considered "symbolic" if all multiplications involved */ /* in computing that entry have at least one zero multiplicand. */ /* Parameters */ /* ========== */ /* TRANS - INTEGER */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* BLAS_NO_TRANS y := alpha*abs(A)*abs(x) + beta*abs(y) */ /* BLAS_TRANS y := alpha*abs(A')*abs(x) + beta*abs(y) */ /* BLAS_CONJ_TRANS y := alpha*abs(A')*abs(x) + beta*abs(y) */ /* Unchanged on exit. */ /* M - INTEGER */ /* On entry, M specifies the number of rows of the matrix A. */ /* M must be at least zero. */ /* Unchanged on exit. */ /* N - INTEGER */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ) */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. */ /* Unchanged on exit. */ /* LDA - INTEGER */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION */ /* Array of DIMENSION at least */ /* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ /* and at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ /* Before entry with BETA non-zero, the incremented array Y */ /* must contain the vector y. On exit, Y is overwritten by the */ /* updated vector y. */ /* INCY - INTEGER */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (! (*trans == _starpu_ilatrans_("N") || *trans == _starpu_ilatrans_("T") || *trans == _starpu_ilatrans_("C"))) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; } else if (*lda < max(1,*m)) { info = 6; } else if (*incx == 0) { info = 8; } else if (*incy == 0) { info = 11; } if (info != 0) { _starpu_xerbla_("DLA_GEAMV ", &info); return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set */ /* up the start points in X and Y. */ if (*trans == _starpu_ilatrans_("N")) { lenx = *n; leny = *m; } else { lenx = *m; leny = *n; } if (*incx > 0) { kx = 1; } else { kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (leny - 1) * *incy; } /* Set SAFE1 essentially to be the underflow threshold times the */ /* number of additions in each row. */ safe1 = _starpu_dlamch_("Safe minimum"); safe1 = (*n + 1) * safe1; /* Form y := alpha*abs(A)*abs(x) + beta*abs(y). */ /* The O(M*N) SYMB_ZERO tests could be replaced by O(N) queries to */ /* the inexact flag. Still doesn't help change the iteration order */ /* to per-column. */ iy = ky; if (*incx == 1) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { if (*beta == 0.) { symb_zero__ = TRUE_; y[iy] = 0.; } else if (y[iy] == 0.) { symb_zero__ = TRUE_; } else { symb_zero__ = FALSE_; y[iy] = *beta * (d__1 = y[iy], abs(d__1)); } if (*alpha != 0.) { i__2 = lenx; for (j = 1; j <= i__2; ++j) { if (*trans == _starpu_ilatrans_("N")) { temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); } else { temp = (d__1 = a[j + i__ * a_dim1], abs(d__1)); } symb_zero__ = symb_zero__ && (x[j] == 0. || temp == 0.); y[iy] += *alpha * (d__1 = x[j], abs(d__1)) * temp; } } if (! symb_zero__) { y[iy] += d_sign(&safe1, &y[iy]); } iy += *incy; } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { if (*beta == 0.) { symb_zero__ = TRUE_; y[iy] = 0.; } else if (y[iy] == 0.) { symb_zero__ = TRUE_; } else { symb_zero__ = FALSE_; y[iy] = *beta * (d__1 = y[iy], abs(d__1)); } if (*alpha != 0.) { jx = kx; i__2 = lenx; for (j = 1; j <= i__2; ++j) { if (*trans == _starpu_ilatrans_("N")) { temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); } else { temp = (d__1 = a[j + i__ * a_dim1], abs(d__1)); } symb_zero__ = symb_zero__ && (x[jx] == 0. || temp == 0.); y[iy] += *alpha * (d__1 = x[jx], abs(d__1)) * temp; jx += *incx; } } if (! symb_zero__) { y[iy] += d_sign(&safe1, &y[iy]); } iy += *incy; } } return 0; /* End of DLA_GEAMV */ } /* _starpu_dla_geamv__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_gercond.c000066400000000000000000000200461413463044200216110ustar00rootroot00000000000000/* _starpu_dla_gercond.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dla_gercond__(char *trans, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, i__1, i__2; doublereal ret_val, d__1; /* Local variables */ integer i__, j; doublereal tmp; integer kase; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dgetrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); logical notrans; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GERCOND estimates the Skeel condition number of op(A) * op2(C) */ /* where op2 is determined by CMODE as follows */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* The Skeel condition number cond(A) = norminf( |inv(A)||A| ) */ /* is computed by computing scaling factors R such that */ /* diag(R)*A*op2(C) is row equilibrated and computing the standard */ /* infinity-norm condition number. */ /* Arguments */ /* ========== */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate Transpose = Transpose) */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factors L and U from the factorization */ /* A = P*L*U as computed by DGETRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from the factorization A = P*L*U */ /* as computed by DGETRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* CMODE (input) INTEGER */ /* Determines op2(C) in the formula op(A) * op2(C) as follows: */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The vector C in the formula op(A) * op2(C). */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* i > 0: The ith argument is invalid. */ /* WORK (input) DOUBLE PRECISION array, dimension (3*N). */ /* Workspace. */ /* IWORK (input) INTEGER array, dimension (N). */ /* Workspace. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --c__; --work; --iwork; /* Function Body */ ret_val = 0.; *info = 0; notrans = _starpu_lsame_(trans, "N"); if (! notrans && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_( trans, "C")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*ldaf < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLA_GERCOND", &i__1); return ret_val; } if (*n == 0) { ret_val = 1.; return ret_val; } /* Compute the equilibration matrix R such that */ /* inv(R)*A*C has unit 1-norm. */ if (notrans) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { i__2 = *n; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { i__2 = *n; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1], abs(d__1)); } } else { i__2 = *n; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { i__2 = *n; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { i__2 = *n; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } else { i__2 = *n; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } /* Estimate the norm of inv(op(A)). */ ainvnm = 0.; kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == 2) { /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } if (notrans) { _starpu_dgetrs_("No transpose", n, &c__1, &af[af_offset], ldaf, &ipiv[ 1], &work[1], n, info); } else { _starpu_dgetrs_("Transpose", n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[1], n, info); } /* Multiply by inv(C). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } } else { /* Multiply by inv(C'). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } if (notrans) { _starpu_dgetrs_("Transpose", n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[1], n, info); } else { _starpu_dgetrs_("No transpose", n, &c__1, &af[af_offset], ldaf, &ipiv[ 1], &work[1], n, info); } /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { ret_val = 1. / ainvnm; } return ret_val; } /* _starpu_dla_gercond__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_gerfsx_extended.c000066400000000000000000000553001413463044200233470ustar00rootroot00000000000000/* _starpu_dla_gerfsx_extended.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b6 = -1.; static doublereal c_b8 = 1.; /* Subroutine */ int _starpu_dla_gerfsx_extended__(integer *prec_type__, integer * trans_type__, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer * ldy, doublereal *berr_out__, integer *n_norms__, doublereal *errs_n__, doublereal *errs_c__, doublereal *res, doublereal *ayb, doublereal * dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, y_dim1, y_offset, errs_n_dim1, errs_n_offset, errs_c_dim1, errs_c_offset, i__1, i__2, i__3; doublereal d__1, d__2; char ch__1[1]; /* Local variables */ doublereal dxratmax, dzratmax; integer i__, j; extern /* Subroutine */ int _starpu_dla_geamv__(integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical incr_prec__; doublereal prev_dz_z__, yk, final_dx_x__; extern /* Subroutine */ int _starpu_dla_wwaddw__(integer *, doublereal *, doublereal *, doublereal *); doublereal final_dz_z__, prevnormdx; integer cnt; doublereal dyk, eps, incr_thresh__, dx_x__, dz_z__; extern /* Subroutine */ int _starpu_dla_lin_berr__(integer *, integer *, integer * , doublereal *, doublereal *, doublereal *); doublereal ymin; extern /* Subroutine */ int _starpu_blas_dgemv_x__(integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer y_prec_state__; extern /* Subroutine */ int blas_dgemv2_x__(integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal dxrat, dzrat; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); char trans[1]; doublereal normx, normy; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dgetrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal normdx; extern /* Character */ VOID _starpu_chla_transtype__(char *, ftnlen, integer *); doublereal hugeval; integer x_state__, z_state__; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_GERFSX_EXTENDED improves the computed solution to a system of */ /* linear equations by performing extra-precise iterative refinement */ /* and provides error bounds and backward error estimates for the solution. */ /* This subroutine is called by DGERFSX to perform iterative refinement. */ /* In addition to normwise error bound, the code provides maximum */ /* componentwise error bound if possible. See comments for ERR_BNDS_NORM */ /* and ERR_BNDS_COMP for details of the error bounds. Note that this */ /* subroutine is only resonsible for setting the second fields of */ /* ERR_BNDS_NORM and ERR_BNDS_COMP. */ /* Arguments */ /* ========= */ /* PREC_TYPE (input) INTEGER */ /* Specifies the intermediate precision to be used in refinement. */ /* The value is defined by ILAPREC(P) where P is a CHARACTER and */ /* P = 'S': Single */ /* = 'D': Double */ /* = 'I': Indigenous */ /* = 'X', 'E': Extra */ /* TRANS_TYPE (input) INTEGER */ /* Specifies the transposition operation on A. */ /* The value is defined by ILATRANS(T) where T is a CHARACTER and */ /* T = 'N': No transpose */ /* = 'T': Transpose */ /* = 'C': Conjugate transpose */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right-hand-sides, i.e., the number of columns of the */ /* matrix B. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factors L and U from the factorization */ /* A = P*L*U as computed by DGETRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* The pivot indices from the factorization A = P*L*U */ /* as computed by DGETRF; row i of the matrix was interchanged */ /* with row IPIV(i). */ /* COLEQU (input) LOGICAL */ /* If .TRUE. then column equilibration was done to A before calling */ /* this routine. This is needed to compute the solution and error */ /* bounds correctly. */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If COLEQU = .FALSE., C */ /* is not accessed. If C is input, each element of C should be a power */ /* of the radix to ensure a reliable solution and error estimates. */ /* Scaling by powers of the radix does not cause rounding errors unless */ /* the result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right-hand-side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Y (input/output) DOUBLE PRECISION array, dimension */ /* (LDY,NRHS) */ /* On entry, the solution matrix X, as computed by DGETRS. */ /* On exit, the improved solution matrix Y. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= max(1,N). */ /* BERR_OUT (output) DOUBLE PRECISION array, dimension (NRHS) */ /* On exit, BERR_OUT(j) contains the componentwise relative backward */ /* error for right-hand-side j from the formula */ /* max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. This is computed by DLA_LIN_BERR. */ /* N_NORMS (input) INTEGER */ /* Determines which error bounds to return (see ERR_BNDS_NORM */ /* and ERR_BNDS_COMP). */ /* If N_NORMS >= 1 return normwise error bounds. */ /* If N_NORMS >= 2 return componentwise error bounds. */ /* ERR_BNDS_NORM (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* RES (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate residual. */ /* AYB (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace. This can be the same workspace passed for Y_TAIL. */ /* DY (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate solution. */ /* Y_TAIL (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the trailing bits of the intermediate solution. */ /* RCOND (input) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* ITHRESH (input) INTEGER */ /* The maximum number of residual computations allowed for */ /* refinement. The default is 10. For 'aggressive' set to 100 to */ /* permit convergence using approximate factorizations or */ /* factorizations other than LU. If the factorization uses a */ /* technique other than Gaussian elimination, the guarantees in */ /* ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy. */ /* RTHRESH (input) DOUBLE PRECISION */ /* Determines when to stop refinement if the error estimate stops */ /* decreasing. Refinement will stop when the next solution no longer */ /* satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is */ /* the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The */ /* default value is 0.5. For 'aggressive' set to 0.9 to permit */ /* convergence on extremely ill-conditioned matrices. See LAWN 165 */ /* for more details. */ /* DZ_UB (input) DOUBLE PRECISION */ /* Determines when to start considering componentwise convergence. */ /* Componentwise convergence is only considered after each component */ /* of the solution Y is stable, which we definte as the relative */ /* change in each component being less than DZ_UB. The default value */ /* is 0.25, requiring the first bit to be stable. See LAWN 165 for */ /* more details. */ /* IGNORE_CWISE (input) LOGICAL */ /* If .TRUE. then ignore componentwise convergence. Default value */ /* is .FALSE.. */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* < 0: if INFO = -i, the ith argument to DGETRS had an illegal */ /* value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ errs_c_dim1 = *nrhs; errs_c_offset = 1 + errs_c_dim1; errs_c__ -= errs_c_offset; errs_n_dim1 = *nrhs; errs_n_offset = 1 + errs_n_dim1; errs_n__ -= errs_n_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; --berr_out__; --res; --ayb; --dy; --y_tail__; /* Function Body */ if (*info != 0) { return 0; } _starpu_chla_transtype__(ch__1, (ftnlen)1, trans_type__); *(unsigned char *)trans = *(unsigned char *)&ch__1[0]; eps = _starpu_dlamch_("Epsilon"); hugeval = _starpu_dlamch_("Overflow"); /* Force HUGEVAL to Inf */ hugeval *= hugeval; /* Using HUGEVAL may lead to spurious underflows. */ incr_thresh__ = (doublereal) (*n) * eps; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { y_prec_state__ = 1; if (y_prec_state__ == 2) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { y_tail__[i__] = 0.; } } dxrat = 0.; dxratmax = 0.; dzrat = 0.; dzratmax = 0.; final_dx_x__ = hugeval; final_dz_z__ = hugeval; prevnormdx = hugeval; prev_dz_z__ = hugeval; dz_z__ = hugeval; dx_x__ = hugeval; x_state__ = 1; z_state__ = 0; incr_prec__ = FALSE_; i__2 = *ithresh; for (cnt = 1; cnt <= i__2; ++cnt) { /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); if (y_prec_state__ == 0) { _starpu_dgemv_(trans, n, n, &c_b6, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b8, &res[1], &c__1); } else if (y_prec_state__ == 1) { _starpu_blas_dgemv_x__(trans_type__, n, n, &c_b6, &a[a_offset], lda, & y[j * y_dim1 + 1], &c__1, &c_b8, &res[1], &c__1, prec_type__); } else { blas_dgemv2_x__(trans_type__, n, n, &c_b6, &a[a_offset], lda, &y[j * y_dim1 + 1], &y_tail__[1], &c__1, &c_b8, &res[ 1], &c__1, prec_type__); } /* XXX: RES is no longer needed. */ _starpu_dcopy_(n, &res[1], &c__1, &dy[1], &c__1); _starpu_dgetrs_(trans, n, &c__1, &af[af_offset], ldaf, &ipiv[1], &dy[1], n, info); /* Calculate relative changes DX_X, DZ_Z and ratios DXRAT, DZRAT. */ normx = 0.; normy = 0.; normdx = 0.; dz_z__ = 0.; ymin = hugeval; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { yk = (d__1 = y[i__ + j * y_dim1], abs(d__1)); dyk = (d__1 = dy[i__], abs(d__1)); if (yk != 0.) { /* Computing MAX */ d__1 = dz_z__, d__2 = dyk / yk; dz_z__ = max(d__1,d__2); } else if (dyk != 0.) { dz_z__ = hugeval; } ymin = min(ymin,yk); normy = max(normy,yk); if (*colequ) { /* Computing MAX */ d__1 = normx, d__2 = yk * c__[i__]; normx = max(d__1,d__2); /* Computing MAX */ d__1 = normdx, d__2 = dyk * c__[i__]; normdx = max(d__1,d__2); } else { normx = normy; normdx = max(normdx,dyk); } } if (normx != 0.) { dx_x__ = normdx / normx; } else if (normdx == 0.) { dx_x__ = 0.; } else { dx_x__ = hugeval; } dxrat = normdx / prevnormdx; dzrat = dz_z__ / prev_dz_z__; /* Check termination criteria */ if (! (*ignore_cwise__) && ymin * *rcond < incr_thresh__ * normy && y_prec_state__ < 2) { incr_prec__ = TRUE_; } if (x_state__ == 3 && dxrat <= *rthresh) { x_state__ = 1; } if (x_state__ == 1) { if (dx_x__ <= eps) { x_state__ = 2; } else if (dxrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { x_state__ = 3; } } else { if (dxrat > dxratmax) { dxratmax = dxrat; } } if (x_state__ > 1) { final_dx_x__ = dx_x__; } } if (z_state__ == 0 && dz_z__ <= *dz_ub__) { z_state__ = 1; } if (z_state__ == 3 && dzrat <= *rthresh) { z_state__ = 1; } if (z_state__ == 1) { if (dz_z__ <= eps) { z_state__ = 2; } else if (dz_z__ > *dz_ub__) { z_state__ = 0; dzratmax = 0.; final_dz_z__ = hugeval; } else if (dzrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { z_state__ = 3; } } else { if (dzrat > dzratmax) { dzratmax = dzrat; } } if (z_state__ > 1) { final_dz_z__ = dz_z__; } } /* Exit if both normwise and componentwise stopped working, */ /* but if componentwise is unstable, let it go at least two */ /* iterations. */ if (x_state__ != 1) { if (*ignore_cwise__) { goto L666; } if (z_state__ == 3 || z_state__ == 2) { goto L666; } if (z_state__ == 0 && cnt > 1) { goto L666; } } if (incr_prec__) { incr_prec__ = FALSE_; ++y_prec_state__; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { y_tail__[i__] = 0.; } } prevnormdx = normdx; prev_dz_z__ = dz_z__; /* Update soluton. */ if (y_prec_state__ < 2) { _starpu_daxpy_(n, &c_b8, &dy[1], &c__1, &y[j * y_dim1 + 1], &c__1); } else { _starpu_dla_wwaddw__(n, &y[j * y_dim1 + 1], &y_tail__[1], &dy[1]); } } /* Target of "IF (Z_STOP .AND. X_STOP)". Sun's f77 won't EXIT. */ L666: /* Set final_* when cnt hits ithresh. */ if (x_state__ == 1) { final_dx_x__ = dx_x__; } if (z_state__ == 1) { final_dz_z__ = dz_z__; } /* Compute error bounds */ if (*n_norms__ >= 1) { errs_n__[j + (errs_n_dim1 << 1)] = final_dx_x__ / (1 - dxratmax); } if (*n_norms__ >= 2) { errs_c__[j + (errs_c_dim1 << 1)] = final_dz_z__ / (1 - dzratmax); } /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. */ /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); _starpu_dgemv_(trans, n, n, &c_b6, &a[a_offset], lda, &y[j * y_dim1 + 1], & c__1, &c_b8, &res[1], &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { ayb[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); } /* Compute abs(op(A_s))*abs(Y) + abs(B_s). */ _starpu_dla_geamv__(trans_type__, n, n, &c_b8, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b8, &ayb[1], &c__1); _starpu_dla_lin_berr__(n, n, &c__1, &res[1], &ayb[1], &berr_out__[j]); /* End of loop for each RHS. */ } return 0; } /* _starpu_dla_gerfsx_extended__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_lin_berr.c000066400000000000000000000100521413463044200217600ustar00rootroot00000000000000/* _starpu_dla_lin_berr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dla_lin_berr__(integer *n, integer *nz, integer *nrhs, doublereal *res, doublereal *ayb, doublereal *berr) { /* System generated locals */ integer ayb_dim1, ayb_offset, res_dim1, res_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j; doublereal tmp, safe1; extern doublereal _starpu_dlamch_(char *); /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_LIN_BERR computes componentwise relative backward error from */ /* the formula */ /* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. */ /* Arguments */ /* ========== */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NZ (input) INTEGER */ /* We add (NZ+1)*SLAMCH( 'Safe minimum' ) to R(i) in the numerator to */ /* guard against spuriously zero residuals. Default value is N. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices AYB, RES, and BERR. NRHS >= 0. */ /* RES (input) DOUBLE PRECISION array, dimension (N,NRHS) */ /* The residual matrix, i.e., the matrix R in the relative backward */ /* error formula above. */ /* AYB (input) DOUBLE PRECISION array, dimension (N, NRHS) */ /* The denominator in the relative backward error formula above, i.e., */ /* the matrix abs(op(A_s))*abs(Y) + abs(B_s). The matrices A, Y, and B */ /* are from iterative refinement (see _starpu_dla_gerfsx_extended.f). */ /* RES (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error from the formula above. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Adding SAFE1 to the numerator guards against spuriously zero */ /* residuals. A similar safeguard is in the SLA_yyAMV routine used */ /* to compute AYB. */ /* Parameter adjustments */ --berr; ayb_dim1 = *n; ayb_offset = 1 + ayb_dim1; ayb -= ayb_offset; res_dim1 = *n; res_offset = 1 + res_dim1; res -= res_offset; /* Function Body */ safe1 = _starpu_dlamch_("Safe minimum"); safe1 = (*nz + 1) * safe1; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (ayb[i__ + j * ayb_dim1] != 0.) { tmp = (safe1 + (d__1 = res[i__ + j * res_dim1], abs(d__1))) / ayb[i__ + j * ayb_dim1]; /* Computing MAX */ d__1 = berr[j]; berr[j] = max(d__1,tmp); } /* If AYB is exactly 0.0 (and if computed by SLA_yyAMV), then we know */ /* the true residual also must be exactly 0.0. */ } } return 0; } /* _starpu_dla_lin_berr__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_porcond.c000066400000000000000000000201671413463044200216400ustar00rootroot00000000000000/* _starpu_dla_porcond.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dla_porcond__(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, i__1, i__2; doublereal ret_val, d__1; /* Local variables */ integer i__, j; logical up; doublereal tmp; integer kase; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_PORCOND Estimates the Skeel condition number of op(A) * op2(C) */ /* where op2 is determined by CMODE as follows */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* The Skeel condition number cond(A) = norminf( |inv(A)||A| ) */ /* is computed by computing scaling factors R such that */ /* diag(R)*A*op2(C) is row equilibrated and computing the standard */ /* infinity-norm condition number. */ /* Arguments */ /* ========== */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* A (input) REAL array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* CMODE (input) INTEGER */ /* Determines op2(C) in the formula op(A) * op2(C) as follows: */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The vector C in the formula op(A) * op2(C). */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* i > 0: The ith argument is invalid. */ /* WORK (input) DOUBLE PRECISION array, dimension (3*N). */ /* Workspace. */ /* IWORK (input) INTEGER array, dimension (N). */ /* Workspace. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --c__; --work; --iwork; /* Function Body */ ret_val = 0.; *info = 0; if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLA_PORCOND", &i__1); return ret_val; } if (*n == 0) { ret_val = 1.; return ret_val; } up = FALSE_; if (_starpu_lsame_(uplo, "U")) { up = TRUE_; } /* Compute the equilibration matrix R such that */ /* inv(R)*A*C has unit 1-norm. */ if (up) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] * c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1], abs(d__1)); } } else { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] / c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] * c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } else { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] / c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } /* Estimate the norm of inv(op(A)). */ ainvnm = 0.; kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == 2) { /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } if (up) { _starpu_dpotrs_("Upper", n, &c__1, &af[af_offset], ldaf, &work[1], n, info); } else { _starpu_dpotrs_("Lower", n, &c__1, &af[af_offset], ldaf, &work[1], n, info); } /* Multiply by inv(C). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } } else { /* Multiply by inv(C'). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } if (up) { _starpu_dpotrs_("Upper", n, &c__1, &af[af_offset], ldaf, &work[1], n, info); } else { _starpu_dpotrs_("Lower", n, &c__1, &af[af_offset], ldaf, &work[1], n, info); } /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { ret_val = 1. / ainvnm; } return ret_val; } /* _starpu_dla_porcond__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_porfsx_extended.c000066400000000000000000000541631413463044200234000ustar00rootroot00000000000000/* _starpu_dla_porfsx_extended.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b9 = -1.; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dla_porfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal * af, integer *ldaf, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal *berr_out__, integer *n_norms__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal *y_tail__, doublereal *rcond, integer *ithresh, doublereal *rthresh, doublereal *dz_ub__, logical *ignore_cwise__, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, y_dim1, y_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Local variables */ doublereal dxratmax, dzratmax; integer i__, j; logical incr_prec__; extern /* Subroutine */ int _starpu_dla_syamv__(integer *, integer *, doublereal * , doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal prev_dz_z__, yk, final_dx_x__; extern /* Subroutine */ int _starpu_dla_wwaddw__(integer *, doublereal *, doublereal *, doublereal *); doublereal final_dz_z__, prevnormdx; integer cnt; doublereal dyk, eps, incr_thresh__, dx_x__, dz_z__; extern /* Subroutine */ int _starpu_dla_lin_berr__(integer *, integer *, integer * , doublereal *, doublereal *, doublereal *); doublereal ymin; integer y_prec_state__; extern /* Subroutine */ int _starpu_blas_dsymv_x__(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer uplo2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int blas_dsymv2_x__(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer * ); doublereal dxrat, dzrat; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal normx, normy; extern doublereal _starpu_dlamch_(char *); doublereal normdx; extern /* Subroutine */ int _starpu_dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal hugeval; extern integer _starpu_ilauplo_(char *); integer x_state__, z_state__; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_PORFSX_EXTENDED improves the computed solution to a system of */ /* linear equations by performing extra-precise iterative refinement */ /* and provides error bounds and backward error estimates for the solution. */ /* This subroutine is called by DPORFSX to perform iterative refinement. */ /* In addition to normwise error bound, the code provides maximum */ /* componentwise error bound if possible. See comments for ERR_BNDS_NORM */ /* and ERR_BNDS_COMP for details of the error bounds. Note that this */ /* subroutine is only resonsible for setting the second fields of */ /* ERR_BNDS_NORM and ERR_BNDS_COMP. */ /* Arguments */ /* ========= */ /* PREC_TYPE (input) INTEGER */ /* Specifies the intermediate precision to be used in refinement. */ /* The value is defined by ILAPREC(P) where P is a CHARACTER and */ /* P = 'S': Single */ /* = 'D': Double */ /* = 'I': Indigenous */ /* = 'X', 'E': Extra */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right-hand-sides, i.e., the number of columns of the */ /* matrix B. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* COLEQU (input) LOGICAL */ /* If .TRUE. then column equilibration was done to A before calling */ /* this routine. This is needed to compute the solution and error */ /* bounds correctly. */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If COLEQU = .FALSE., C */ /* is not accessed. If C is input, each element of C should be a power */ /* of the radix to ensure a reliable solution and error estimates. */ /* Scaling by powers of the radix does not cause rounding errors unless */ /* the result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right-hand-side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Y (input/output) DOUBLE PRECISION array, dimension */ /* (LDY,NRHS) */ /* On entry, the solution matrix X, as computed by DPOTRS. */ /* On exit, the improved solution matrix Y. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= max(1,N). */ /* BERR_OUT (output) DOUBLE PRECISION array, dimension (NRHS) */ /* On exit, BERR_OUT(j) contains the componentwise relative backward */ /* error for right-hand-side j from the formula */ /* max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. This is computed by DLA_LIN_BERR. */ /* N_NORMS (input) INTEGER */ /* Determines which error bounds to return (see ERR_BNDS_NORM */ /* and ERR_BNDS_COMP). */ /* If N_NORMS >= 1 return normwise error bounds. */ /* If N_NORMS >= 2 return componentwise error bounds. */ /* ERR_BNDS_NORM (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* RES (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate residual. */ /* AYB (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace. This can be the same workspace passed for Y_TAIL. */ /* DY (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate solution. */ /* Y_TAIL (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the trailing bits of the intermediate solution. */ /* RCOND (input) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* ITHRESH (input) INTEGER */ /* The maximum number of residual computations allowed for */ /* refinement. The default is 10. For 'aggressive' set to 100 to */ /* permit convergence using approximate factorizations or */ /* factorizations other than LU. If the factorization uses a */ /* technique other than Gaussian elimination, the guarantees in */ /* ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy. */ /* RTHRESH (input) DOUBLE PRECISION */ /* Determines when to stop refinement if the error estimate stops */ /* decreasing. Refinement will stop when the next solution no longer */ /* satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is */ /* the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The */ /* default value is 0.5. For 'aggressive' set to 0.9 to permit */ /* convergence on extremely ill-conditioned matrices. See LAWN 165 */ /* for more details. */ /* DZ_UB (input) DOUBLE PRECISION */ /* Determines when to start considering componentwise convergence. */ /* Componentwise convergence is only considered after each component */ /* of the solution Y is stable, which we definte as the relative */ /* change in each component being less than DZ_UB. The default value */ /* is 0.25, requiring the first bit to be stable. See LAWN 165 for */ /* more details. */ /* IGNORE_CWISE (input) LOGICAL */ /* If .TRUE. then ignore componentwise convergence. Default value */ /* is .FALSE.. */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* < 0: if INFO = -i, the ith argument to DPOTRS had an illegal */ /* value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; --berr_out__; --res; --ayb; --dy; --y_tail__; /* Function Body */ if (*info != 0) { return 0; } eps = _starpu_dlamch_("Epsilon"); hugeval = _starpu_dlamch_("Overflow"); /* Force HUGEVAL to Inf */ hugeval *= hugeval; /* Using HUGEVAL may lead to spurious underflows. */ incr_thresh__ = (doublereal) (*n) * eps; if (_starpu_lsame_(uplo, "L")) { uplo2 = _starpu_ilauplo_("L"); } else { uplo2 = _starpu_ilauplo_("U"); } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { y_prec_state__ = 1; if (y_prec_state__ == 2) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { y_tail__[i__] = 0.; } } dxrat = 0.; dxratmax = 0.; dzrat = 0.; dzratmax = 0.; final_dx_x__ = hugeval; final_dz_z__ = hugeval; prevnormdx = hugeval; prev_dz_z__ = hugeval; dz_z__ = hugeval; dx_x__ = hugeval; x_state__ = 1; z_state__ = 0; incr_prec__ = FALSE_; i__2 = *ithresh; for (cnt = 1; cnt <= i__2; ++cnt) { /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); if (y_prec_state__ == 0) { _starpu_dsymv_(uplo, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b11, &res[1], &c__1); } else if (y_prec_state__ == 1) { _starpu_blas_dsymv_x__(&uplo2, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b11, &res[1], &c__1, prec_type__); } else { blas_dsymv2_x__(&uplo2, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &y_tail__[1], &c__1, &c_b11, &res[1], & c__1, prec_type__); } /* XXX: RES is no longer needed. */ _starpu_dcopy_(n, &res[1], &c__1, &dy[1], &c__1); _starpu_dpotrs_(uplo, n, nrhs, &af[af_offset], ldaf, &dy[1], n, info); /* Calculate relative changes DX_X, DZ_Z and ratios DXRAT, DZRAT. */ normx = 0.; normy = 0.; normdx = 0.; dz_z__ = 0.; ymin = hugeval; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { yk = (d__1 = y[i__ + j * y_dim1], abs(d__1)); dyk = (d__1 = dy[i__], abs(d__1)); if (yk != 0.) { /* Computing MAX */ d__1 = dz_z__, d__2 = dyk / yk; dz_z__ = max(d__1,d__2); } else if (dyk != 0.) { dz_z__ = hugeval; } ymin = min(ymin,yk); normy = max(normy,yk); if (*colequ) { /* Computing MAX */ d__1 = normx, d__2 = yk * c__[i__]; normx = max(d__1,d__2); /* Computing MAX */ d__1 = normdx, d__2 = dyk * c__[i__]; normdx = max(d__1,d__2); } else { normx = normy; normdx = max(normdx,dyk); } } if (normx != 0.) { dx_x__ = normdx / normx; } else if (normdx == 0.) { dx_x__ = 0.; } else { dx_x__ = hugeval; } dxrat = normdx / prevnormdx; dzrat = dz_z__ / prev_dz_z__; /* Check termination criteria. */ if (ymin * *rcond < incr_thresh__ * normy && y_prec_state__ < 2) { incr_prec__ = TRUE_; } if (x_state__ == 3 && dxrat <= *rthresh) { x_state__ = 1; } if (x_state__ == 1) { if (dx_x__ <= eps) { x_state__ = 2; } else if (dxrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { x_state__ = 3; } } else { if (dxrat > dxratmax) { dxratmax = dxrat; } } if (x_state__ > 1) { final_dx_x__ = dx_x__; } } if (z_state__ == 0 && dz_z__ <= *dz_ub__) { z_state__ = 1; } if (z_state__ == 3 && dzrat <= *rthresh) { z_state__ = 1; } if (z_state__ == 1) { if (dz_z__ <= eps) { z_state__ = 2; } else if (dz_z__ > *dz_ub__) { z_state__ = 0; dzratmax = 0.; final_dz_z__ = hugeval; } else if (dzrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { z_state__ = 3; } } else { if (dzrat > dzratmax) { dzratmax = dzrat; } } if (z_state__ > 1) { final_dz_z__ = dz_z__; } } if (x_state__ != 1 && (*ignore_cwise__ || z_state__ != 1)) { goto L666; } if (incr_prec__) { incr_prec__ = FALSE_; ++y_prec_state__; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { y_tail__[i__] = 0.; } } prevnormdx = normdx; prev_dz_z__ = dz_z__; /* Update soluton. */ if (y_prec_state__ < 2) { _starpu_daxpy_(n, &c_b11, &dy[1], &c__1, &y[j * y_dim1 + 1], &c__1); } else { _starpu_dla_wwaddw__(n, &y[j * y_dim1 + 1], &y_tail__[1], &dy[1]); } } /* Target of "IF (Z_STOP .AND. X_STOP)". Sun's f77 won't EXIT. */ L666: /* Set final_* when cnt hits ithresh. */ if (x_state__ == 1) { final_dx_x__ = dx_x__; } if (z_state__ == 1) { final_dz_z__ = dz_z__; } /* Compute error bounds. */ if (*n_norms__ >= 1) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = final_dx_x__ / ( 1 - dxratmax); } if (*n_norms__ >= 2) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = final_dz_z__ / ( 1 - dzratmax); } /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. */ /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); _starpu_dsymv_(uplo, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, & c_b11, &res[1], &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { ayb[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); } /* Compute abs(op(A_s))*abs(Y) + abs(B_s). */ _starpu_dla_syamv__(&uplo2, n, &c_b11, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b11, &ayb[1], &c__1); _starpu_dla_lin_berr__(n, n, &c__1, &res[1], &ayb[1], &berr_out__[j]); /* End of loop for each RHS. */ } return 0; } /* _starpu_dla_porfsx_extended__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_porpvgrw.c000066400000000000000000000132641413463044200220620ustar00rootroot00000000000000/* _starpu_dla_porpvgrw.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dla_porpvgrw__(char *uplo, integer *ncols, doublereal *a, integer * lda, doublereal *af, integer *ldaf, doublereal *work, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Local variables */ integer i__, j; doublereal amax, umax; extern logical _starpu_lsame_(char *, char *); logical upper; doublereal rpvgrw; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_PORPVGRW computes the reciprocal pivot growth factor */ /* norm(A)/norm(U). The "max absolute element" norm is used. If this is */ /* much less than 1, the stability of the LU factorization of the */ /* (equilibrated) matrix A could be poor. This also means that the */ /* solution X, estimated condition numbers, and error bounds could be */ /* unreliable. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* NCOLS (input) INTEGER */ /* The number of columns of the matrix A. NCOLS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* WORK (input) DOUBLE PRECISION array, dimension (2*N) */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --work; /* Function Body */ upper = _starpu_lsame_("Upper", uplo); /* DPOTRF will have factored only the NCOLSxNCOLS leading minor, so */ /* we restrict the growth search to that minor and use only the first */ /* 2*NCOLS workspace entries. */ rpvgrw = 1.; i__1 = *ncols << 1; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; } /* Find the max magnitude entry of each column. */ if (upper) { i__1 = *ncols; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)), d__3 = work[* ncols + j]; work[*ncols + j] = max(d__2,d__3); } } } else { i__1 = *ncols; for (j = 1; j <= i__1; ++j) { i__2 = *ncols; for (i__ = j; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)), d__3 = work[* ncols + j]; work[*ncols + j] = max(d__2,d__3); } } } /* Now find the max magnitude entry of each column of the factor in */ /* AF. No pivoting, so no permutations. */ if (_starpu_lsame_("Upper", uplo)) { i__1 = *ncols; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + j * af_dim1], abs(d__1)), d__3 = work[ j]; work[j] = max(d__2,d__3); } } } else { i__1 = *ncols; for (j = 1; j <= i__1; ++j) { i__2 = *ncols; for (i__ = j; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + j * af_dim1], abs(d__1)), d__3 = work[ j]; work[j] = max(d__2,d__3); } } } /* Compute the *inverse* of the max element growth factor. Dividing */ /* by zero would imply the largest entry of the factor's column is */ /* zero. Than can happen when either the column of A is zero or */ /* massive pivots made the factor underflow to zero. Neither counts */ /* as growth in itself, so simply ignore terms with zero */ /* denominators. */ if (_starpu_lsame_("Upper", uplo)) { i__1 = *ncols; for (i__ = 1; i__ <= i__1; ++i__) { umax = work[i__]; amax = work[*ncols + i__]; if (umax != 0.) { /* Computing MIN */ d__1 = amax / umax; rpvgrw = min(d__1,rpvgrw); } } } else { i__1 = *ncols; for (i__ = 1; i__ <= i__1; ++i__) { umax = work[i__]; amax = work[*ncols + i__]; if (umax != 0.) { /* Computing MIN */ d__1 = amax / umax; rpvgrw = min(d__1,rpvgrw); } } } ret_val = rpvgrw; return ret_val; } /* _starpu_dla_porpvgrw__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_rpvgrw.c000066400000000000000000000067351413463044200215300ustar00rootroot00000000000000/* _starpu_dla_rpvgrw.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dla_rpvgrw__(integer *n, integer *ncols, doublereal *a, integer * lda, doublereal *af, integer *ldaf) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, i__1, i__2; doublereal ret_val, d__1, d__2; /* Local variables */ integer i__, j; doublereal amax, umax, rpvgrw; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_RPVGRW computes the reciprocal pivot growth factor */ /* norm(A)/norm(U). The "max absolute element" norm is used. If this is */ /* much less than 1, the stability of the LU factorization of the */ /* (equilibrated) matrix A could be poor. This also means that the */ /* solution X, estimated condition numbers, and error bounds could be */ /* unreliable. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NCOLS (input) INTEGER */ /* The number of columns of the matrix A. NCOLS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factors L and U from the factorization */ /* A = P*L*U as computed by DGETRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; /* Function Body */ rpvgrw = 1.; i__1 = *ncols; for (j = 1; j <= i__1; ++j) { amax = 0.; umax = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); amax = max(d__2,amax); } i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + j * af_dim1], abs(d__1)); umax = max(d__2,umax); } if (umax != 0.) { /* Computing MIN */ d__1 = amax / umax; rpvgrw = min(d__1,rpvgrw); } } ret_val = rpvgrw; return ret_val; } /* _starpu_dla_rpvgrw__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_syamv.c000066400000000000000000000211571413463044200213330ustar00rootroot00000000000000/* _starpu_dla_syamv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dla_syamv__(integer *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j; logical symb_zero__; integer iy, jx, kx, ky, info; doublereal temp, safe1; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilauplo_(char *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_SYAMV performs the matrix-vector operation */ /* y := alpha*abs(A)*abs(x) + beta*abs(y), */ /* where alpha and beta are scalars, x and y are vectors and A is an */ /* n by n symmetric matrix. */ /* This function is primarily used in calculating error bounds. */ /* To protect against underflow during evaluation, components in */ /* the resulting vector are perturbed away from zero by (N+1) */ /* times the underflow threshold. To prevent unnecessarily large */ /* errors for block-structure embedded in general matrices, */ /* "symbolically" zero components are not perturbed. A zero */ /* entry is considered "symbolic" if all multiplications involved */ /* in computing that entry have at least one zero multiplicand. */ /* Parameters */ /* ========== */ /* UPLO - INTEGER */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array A is to be referenced as */ /* follows: */ /* UPLO = BLAS_UPPER Only the upper triangular part of A */ /* is to be referenced. */ /* UPLO = BLAS_LOWER Only the lower triangular part of A */ /* is to be referenced. */ /* Unchanged on exit. */ /* N - INTEGER. */ /* On entry, N specifies the number of columns of the matrix A. */ /* N must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - DOUBLE PRECISION . */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). */ /* Before entry, the leading m by n part of the array A must */ /* contain the matrix of coefficients. */ /* Unchanged on exit. */ /* LDA - INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. LDA must be at least */ /* max( 1, n ). */ /* Unchanged on exit. */ /* X - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCX ) ) */ /* Before entry, the incremented array X must contain the */ /* vector x. */ /* Unchanged on exit. */ /* INCX - INTEGER. */ /* On entry, INCX specifies the increment for the elements of */ /* X. INCX must not be zero. */ /* Unchanged on exit. */ /* BETA - DOUBLE PRECISION . */ /* On entry, BETA specifies the scalar beta. When BETA is */ /* supplied as zero then Y need not be set on input. */ /* Unchanged on exit. */ /* Y - DOUBLE PRECISION array of DIMENSION at least */ /* ( 1 + ( n - 1 )*abs( INCY ) ) */ /* Before entry with BETA non-zero, the incremented array Y */ /* must contain the vector y. On exit, Y is overwritten by the */ /* updated vector y. */ /* INCY - INTEGER. */ /* On entry, INCY specifies the increment for the elements of */ /* Y. INCY must not be zero. */ /* Unchanged on exit. */ /* Level 2 Blas routine. */ /* -- Written on 22-October-1986. */ /* Jack Dongarra, Argonne National Lab. */ /* Jeremy Du Croz, Nag Central Office. */ /* Sven Hammarling, Nag Central Office. */ /* Richard Hanson, Sandia National Labs. */ /* -- Modified for the absolute-value product, April 2006 */ /* Jason Riedy, UC Berkeley */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; /* Function Body */ info = 0; if (*uplo != _starpu_ilauplo_("U") && *uplo != _starpu_ilauplo_("L") ) { info = 1; } else if (*n < 0) { info = 2; } else if (*lda < max(1,*n)) { info = 5; } else if (*incx == 0) { info = 7; } else if (*incy == 0) { info = 10; } if (info != 0) { _starpu_xerbla_("DSYMV ", &info); return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0. && *beta == 1.) { return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { kx = 1; } else { kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { ky = 1; } else { ky = 1 - (*n - 1) * *incy; } /* Set SAFE1 essentially to be the underflow threshold times the */ /* number of additions in each row. */ safe1 = _starpu_dlamch_("Safe minimum"); safe1 = (*n + 1) * safe1; /* Form y := alpha*abs(A)*abs(x) + beta*abs(y). */ /* The O(N^2) SYMB_ZERO tests could be replaced by O(N) queries to */ /* the inexact flag. Still doesn't help change the iteration order */ /* to per-column. */ iy = ky; if (*incx == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (*beta == 0.) { symb_zero__ = TRUE_; y[iy] = 0.; } else if (y[iy] == 0.) { symb_zero__ = TRUE_; } else { symb_zero__ = FALSE_; y[iy] = *beta * (d__1 = y[iy], abs(d__1)); } if (*alpha != 0.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { if (*uplo == _starpu_ilauplo_("U")) { if (i__ <= j) { temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); } else { temp = (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } else { if (i__ >= j) { temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); } else { temp = (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } symb_zero__ = symb_zero__ && (x[j] == 0. || temp == 0.); y[iy] += *alpha * (d__1 = x[j], abs(d__1)) * temp; } } if (! symb_zero__) { y[iy] += d_sign(&safe1, &y[iy]); } iy += *incy; } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (*beta == 0.) { symb_zero__ = TRUE_; y[iy] = 0.; } else if (y[iy] == 0.) { symb_zero__ = TRUE_; } else { symb_zero__ = FALSE_; y[iy] = *beta * (d__1 = y[iy], abs(d__1)); } jx = kx; if (*alpha != 0.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { if (*uplo == _starpu_ilauplo_("U")) { if (i__ <= j) { temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); } else { temp = (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } else { if (i__ >= j) { temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); } else { temp = (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } symb_zero__ = symb_zero__ && (x[j] == 0. || temp == 0.); y[iy] += *alpha * (d__1 = x[jx], abs(d__1)) * temp; jx += *incx; } } if (! symb_zero__) { y[iy] += d_sign(&safe1, &y[iy]); } iy += *incy; } } return 0; /* End of DLA_SYAMV */ } /* _starpu_dla_syamv__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_syrcond.c000066400000000000000000000210411413463044200216450ustar00rootroot00000000000000/* _starpu_dla_syrcond.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dla_syrcond__(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, integer *cmode, doublereal *c__, integer *info, doublereal *work, integer *iwork, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, i__1, i__2; doublereal ret_val, d__1; /* Local variables */ integer i__, j; logical up; doublereal tmp; integer kase; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal ainvnm; char normin[1]; doublereal smlnum; extern /* Subroutine */ int _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments */ /* .. */ /* Purpose */ /* ======= */ /* DLA_SYRCOND estimates the Skeel condition number of op(A) * op2(C) */ /* where op2 is determined by CMODE as follows */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* The Skeel condition number cond(A) = norminf( |inv(A)||A| ) */ /* is computed by computing scaling factors R such that */ /* diag(R)*A*op2(C) is row equilibrated and computing the standard */ /* infinity-norm condition number. */ /* Arguments */ /* ========== */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSYTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* CMODE (input) INTEGER */ /* Determines op2(C) in the formula op(A) * op2(C) as follows: */ /* CMODE = 1 op2(C) = C */ /* CMODE = 0 op2(C) = I */ /* CMODE = -1 op2(C) = inv(C) */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The vector C in the formula op(A) * op2(C). */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* i > 0: The ith argument is invalid. */ /* WORK (input) DOUBLE PRECISION array, dimension (3*N). */ /* Workspace. */ /* IWORK (input) INTEGER array, dimension (N). */ /* Workspace. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --c__; --work; --iwork; /* Function Body */ ret_val = 0.; *info = 0; if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLA_SYRCOND", &i__1); return ret_val; } if (*n == 0) { ret_val = 1.; return ret_val; } up = FALSE_; if (_starpu_lsame_(uplo, "U")) { up = TRUE_; } /* Compute the equilibration matrix R such that */ /* inv(R)*A*C has unit 1-norm. */ if (up) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] * c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1], abs(d__1)); } } else { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] / c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tmp = 0.; if (*cmode == 1) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] * c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] * c__[j], abs(d__1)); } } else if (*cmode == 0) { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1], abs(d__1)); } } else { i__2 = i__; for (j = 1; j <= i__2; ++j) { tmp += (d__1 = a[i__ + j * a_dim1] / c__[j], abs(d__1)); } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { tmp += (d__1 = a[j + i__ * a_dim1] / c__[j], abs(d__1)); } } work[(*n << 1) + i__] = tmp; } } /* Estimate the norm of inv(op(A)). */ smlnum = _starpu_dlamch_("Safe minimum"); ainvnm = 0.; *(unsigned char *)normin = 'N'; kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == 2) { /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } if (up) { _starpu_dsytrs_("U", n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[ 1], n, info); } else { _starpu_dsytrs_("L", n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[ 1], n, info); } /* Multiply by inv(C). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } } else { /* Multiply by inv(C'). */ if (*cmode == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] /= c__[i__]; } } else if (*cmode == -1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= c__[i__]; } } if (up) { _starpu_dsytrs_("U", n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[ 1], n, info); } else { _starpu_dsytrs_("L", n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[ 1], n, info); } /* Multiply by R. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] *= work[(*n << 1) + i__]; } } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { ret_val = 1. / ainvnm; } return ret_val; } /* _starpu_dla_syrcond__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_syrfsx_extended.c000066400000000000000000000545141413463044200234150ustar00rootroot00000000000000/* _starpu_dla_syrfsx_extended.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b9 = -1.; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dla_syrfsx_extended__(integer *prec_type__, char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal * af, integer *ldaf, integer *ipiv, logical *colequ, doublereal *c__, doublereal *b, integer *ldb, doublereal *y, integer *ldy, doublereal * berr_out__, integer *n_norms__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, doublereal *res, doublereal *ayb, doublereal *dy, doublereal *y_tail__, doublereal *rcond, integer * ithresh, doublereal *rthresh, doublereal *dz_ub__, logical * ignore_cwise__, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, y_dim1, y_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Local variables */ doublereal dxratmax, dzratmax; integer i__, j; logical incr_prec__; extern /* Subroutine */ int _starpu_dla_syamv__(integer *, integer *, doublereal * , doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal prev_dz_z__, yk, final_dx_x__; extern /* Subroutine */ int _starpu_dla_wwaddw__(integer *, doublereal *, doublereal *, doublereal *); doublereal final_dz_z__, prevnormdx; integer cnt; doublereal dyk, eps, incr_thresh__, dx_x__, dz_z__; extern /* Subroutine */ int _starpu_dla_lin_berr__(integer *, integer *, integer * , doublereal *, doublereal *, doublereal *); doublereal ymin; integer y_prec_state__; extern /* Subroutine */ int _starpu_blas_dsymv_x__(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer uplo2; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int blas_dsymv2_x__(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer * ); doublereal dxrat, dzrat; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal normx, normy; extern doublereal _starpu_dlamch_(char *); doublereal normdx; extern /* Subroutine */ int _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal hugeval; extern integer _starpu_ilauplo_(char *); integer x_state__, z_state__; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_SYRFSX_EXTENDED improves the computed solution to a system of */ /* linear equations by performing extra-precise iterative refinement */ /* and provides error bounds and backward error estimates for the solution. */ /* This subroutine is called by DSYRFSX to perform iterative refinement. */ /* In addition to normwise error bound, the code provides maximum */ /* componentwise error bound if possible. See comments for ERR_BNDS_NORM */ /* and ERR_BNDS_COMP for details of the error bounds. Note that this */ /* subroutine is only resonsible for setting the second fields of */ /* ERR_BNDS_NORM and ERR_BNDS_COMP. */ /* Arguments */ /* ========= */ /* PREC_TYPE (input) INTEGER */ /* Specifies the intermediate precision to be used in refinement. */ /* The value is defined by ILAPREC(P) where P is a CHARACTER and */ /* P = 'S': Single */ /* = 'D': Double */ /* = 'I': Indigenous */ /* = 'X', 'E': Extra */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right-hand-sides, i.e., the number of columns of the */ /* matrix B. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSYTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* COLEQU (input) LOGICAL */ /* If .TRUE. then column equilibration was done to A before calling */ /* this routine. This is needed to compute the solution and error */ /* bounds correctly. */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. If COLEQU = .FALSE., C */ /* is not accessed. If C is input, each element of C should be a power */ /* of the radix to ensure a reliable solution and error estimates. */ /* Scaling by powers of the radix does not cause rounding errors unless */ /* the result underflows or overflows. Rounding errors during scaling */ /* lead to refining with a matrix that is not equivalent to the */ /* input matrix, producing error estimates that may not be */ /* reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right-hand-side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Y (input/output) DOUBLE PRECISION array, dimension */ /* (LDY,NRHS) */ /* On entry, the solution matrix X, as computed by DSYTRS. */ /* On exit, the improved solution matrix Y. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= max(1,N). */ /* BERR_OUT (output) DOUBLE PRECISION array, dimension (NRHS) */ /* On exit, BERR_OUT(j) contains the componentwise relative backward */ /* error for right-hand-side j from the formula */ /* max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. This is computed by DLA_LIN_BERR. */ /* N_NORMS (input) INTEGER */ /* Determines which error bounds to return (see ERR_BNDS_NORM */ /* and ERR_BNDS_COMP). */ /* If N_NORMS >= 1 return normwise error bounds. */ /* If N_NORMS >= 2 return componentwise error bounds. */ /* ERR_BNDS_NORM (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (input/output) DOUBLE PRECISION array, dimension */ /* (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * slamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * slamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * slamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* This subroutine is only responsible for setting the second field */ /* above. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* RES (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate residual. */ /* AYB (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace. This can be the same workspace passed for Y_TAIL. */ /* DY (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the intermediate solution. */ /* Y_TAIL (input) DOUBLE PRECISION array, dimension (N) */ /* Workspace to hold the trailing bits of the intermediate solution. */ /* RCOND (input) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* ITHRESH (input) INTEGER */ /* The maximum number of residual computations allowed for */ /* refinement. The default is 10. For 'aggressive' set to 100 to */ /* permit convergence using approximate factorizations or */ /* factorizations other than LU. If the factorization uses a */ /* technique other than Gaussian elimination, the guarantees in */ /* ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy. */ /* RTHRESH (input) DOUBLE PRECISION */ /* Determines when to stop refinement if the error estimate stops */ /* decreasing. Refinement will stop when the next solution no longer */ /* satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is */ /* the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The */ /* default value is 0.5. For 'aggressive' set to 0.9 to permit */ /* convergence on extremely ill-conditioned matrices. See LAWN 165 */ /* for more details. */ /* DZ_UB (input) DOUBLE PRECISION */ /* Determines when to start considering componentwise convergence. */ /* Componentwise convergence is only considered after each component */ /* of the solution Y is stable, which we definte as the relative */ /* change in each component being less than DZ_UB. The default value */ /* is 0.25, requiring the first bit to be stable. See LAWN 165 for */ /* more details. */ /* IGNORE_CWISE (input) LOGICAL */ /* If .TRUE. then ignore componentwise convergence. Default value */ /* is .FALSE.. */ /* INFO (output) INTEGER */ /* = 0: Successful exit. */ /* < 0: if INFO = -i, the ith argument to DSYTRS had an illegal */ /* value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --c__; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; --berr_out__; --res; --ayb; --dy; --y_tail__; /* Function Body */ if (*info != 0) { return 0; } eps = _starpu_dlamch_("Epsilon"); hugeval = _starpu_dlamch_("Overflow"); /* Force HUGEVAL to Inf */ hugeval *= hugeval; /* Using HUGEVAL may lead to spurious underflows. */ incr_thresh__ = (doublereal) (*n) * eps; if (_starpu_lsame_(uplo, "L")) { uplo2 = _starpu_ilauplo_("L"); } else { uplo2 = _starpu_ilauplo_("U"); } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { y_prec_state__ = 1; if (y_prec_state__ == 2) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { y_tail__[i__] = 0.; } } dxrat = 0.; dxratmax = 0.; dzrat = 0.; dzratmax = 0.; final_dx_x__ = hugeval; final_dz_z__ = hugeval; prevnormdx = hugeval; prev_dz_z__ = hugeval; dz_z__ = hugeval; dx_x__ = hugeval; x_state__ = 1; z_state__ = 0; incr_prec__ = FALSE_; i__2 = *ithresh; for (cnt = 1; cnt <= i__2; ++cnt) { /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); if (y_prec_state__ == 0) { _starpu_dsymv_(uplo, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b11, &res[1], &c__1); } else if (y_prec_state__ == 1) { _starpu_blas_dsymv_x__(&uplo2, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b11, &res[1], &c__1, prec_type__); } else { blas_dsymv2_x__(&uplo2, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &y_tail__[1], &c__1, &c_b11, &res[1], & c__1, prec_type__); } /* XXX: RES is no longer needed. */ _starpu_dcopy_(n, &res[1], &c__1, &dy[1], &c__1); _starpu_dsytrs_(uplo, n, nrhs, &af[af_offset], ldaf, &ipiv[1], &dy[1], n, info); /* Calculate relative changes DX_X, DZ_Z and ratios DXRAT, DZRAT. */ normx = 0.; normy = 0.; normdx = 0.; dz_z__ = 0.; ymin = hugeval; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { yk = (d__1 = y[i__ + j * y_dim1], abs(d__1)); dyk = (d__1 = dy[i__], abs(d__1)); if (yk != 0.) { /* Computing MAX */ d__1 = dz_z__, d__2 = dyk / yk; dz_z__ = max(d__1,d__2); } else if (dyk != 0.) { dz_z__ = hugeval; } ymin = min(ymin,yk); normy = max(normy,yk); if (*colequ) { /* Computing MAX */ d__1 = normx, d__2 = yk * c__[i__]; normx = max(d__1,d__2); /* Computing MAX */ d__1 = normdx, d__2 = dyk * c__[i__]; normdx = max(d__1,d__2); } else { normx = normy; normdx = max(normdx,dyk); } } if (normx != 0.) { dx_x__ = normdx / normx; } else if (normdx == 0.) { dx_x__ = 0.; } else { dx_x__ = hugeval; } dxrat = normdx / prevnormdx; dzrat = dz_z__ / prev_dz_z__; /* Check termination criteria. */ if (ymin * *rcond < incr_thresh__ * normy && y_prec_state__ < 2) { incr_prec__ = TRUE_; } if (x_state__ == 3 && dxrat <= *rthresh) { x_state__ = 1; } if (x_state__ == 1) { if (dx_x__ <= eps) { x_state__ = 2; } else if (dxrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { x_state__ = 3; } } else { if (dxrat > dxratmax) { dxratmax = dxrat; } } if (x_state__ > 1) { final_dx_x__ = dx_x__; } } if (z_state__ == 0 && dz_z__ <= *dz_ub__) { z_state__ = 1; } if (z_state__ == 3 && dzrat <= *rthresh) { z_state__ = 1; } if (z_state__ == 1) { if (dz_z__ <= eps) { z_state__ = 2; } else if (dz_z__ > *dz_ub__) { z_state__ = 0; dzratmax = 0.; final_dz_z__ = hugeval; } else if (dzrat > *rthresh) { if (y_prec_state__ != 2) { incr_prec__ = TRUE_; } else { z_state__ = 3; } } else { if (dzrat > dzratmax) { dzratmax = dzrat; } } if (z_state__ > 1) { final_dz_z__ = dz_z__; } } if (x_state__ != 1 && (*ignore_cwise__ || z_state__ != 1)) { goto L666; } if (incr_prec__) { incr_prec__ = FALSE_; ++y_prec_state__; i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { y_tail__[i__] = 0.; } } prevnormdx = normdx; prev_dz_z__ = dz_z__; /* Update soluton. */ if (y_prec_state__ < 2) { _starpu_daxpy_(n, &c_b11, &dy[1], &c__1, &y[j * y_dim1 + 1], &c__1); } else { _starpu_dla_wwaddw__(n, &y[j * y_dim1 + 1], &y_tail__[1], &dy[1]); } } /* Target of "IF (Z_STOP .AND. X_STOP)". Sun's f77 won't EXIT. */ L666: /* Set final_* when cnt hits ithresh. */ if (x_state__ == 1) { final_dx_x__ = dx_x__; } if (z_state__ == 1) { final_dz_z__ = dz_z__; } /* Compute error bounds. */ if (*n_norms__ >= 1) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = final_dx_x__ / ( 1 - dxratmax); } if (*n_norms__ >= 2) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = final_dz_z__ / ( 1 - dzratmax); } /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. */ /* Compute residual RES = B_s - op(A_s) * Y, */ /* op(A) = A, A**T, or A**H depending on TRANS (and type). */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &res[1], &c__1); _starpu_dsymv_(uplo, n, &c_b9, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, & c_b11, &res[1], &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { ayb[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); } /* Compute abs(op(A_s))*abs(Y) + abs(B_s). */ _starpu_dla_syamv__(&uplo2, n, &c_b11, &a[a_offset], lda, &y[j * y_dim1 + 1], &c__1, &c_b11, &ayb[1], &c__1); _starpu_dla_lin_berr__(n, n, &c__1, &res[1], &ayb[1], &berr_out__[j]); /* End of loop for each RHS. */ } return 0; } /* _starpu_dla_syrfsx_extended__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_syrpvgrw.c000066400000000000000000000214001413463044200220660ustar00rootroot00000000000000/* _starpu_dla_syrpvgrw.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dla_syrpvgrw__(char *uplo, integer *n, integer *info, doublereal * a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *work, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Local variables */ integer i__, j, k, kp; doublereal tmp, amax, umax; extern logical _starpu_lsame_(char *, char *); integer ncols; logical upper; doublereal rpvgrw; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_SYRPVGRW computes the reciprocal pivot growth factor */ /* norm(A)/norm(U). The "max absolute element" norm is used. If this is */ /* much less than 1, the stability of the LU factorization of the */ /* (equilibrated) matrix A could be poor. This also means that the */ /* solution X, estimated condition numbers, and error bounds could be */ /* unreliable. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* INFO (input) INTEGER */ /* The value of INFO returned from DSYTRF, .i.e., the pivot in */ /* column INFO is exactly 0. */ /* NCOLS (input) INTEGER */ /* The number of columns of the matrix A. NCOLS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSYTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* WORK (input) DOUBLE PRECISION array, dimension (2*N) */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --work; /* Function Body */ upper = _starpu_lsame_("Upper", uplo); if (*info == 0) { if (upper) { ncols = 1; } else { ncols = *n; } } else { ncols = *info; } rpvgrw = 1.; i__1 = *n << 1; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; } /* Find the max magnitude entry of each column of A. Compute the max */ /* for all N columns so we can apply the pivot permutation while */ /* looping below. Assume a full factorization is the common case. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)), d__3 = work[* n + i__]; work[*n + i__] = max(d__2,d__3); /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)), d__3 = work[* n + j]; work[*n + j] = max(d__2,d__3); } } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)), d__3 = work[* n + i__]; work[*n + i__] = max(d__2,d__3); /* Computing MAX */ d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)), d__3 = work[* n + j]; work[*n + j] = max(d__2,d__3); } } } /* Now find the max magnitude entry of each column of U or L. Also */ /* permute the magnitudes of A above so they're in the same order as */ /* the factor. */ /* The iteration orders and permutations were copied from dsytrs. */ /* Calls to SSWAP would be severe overkill. */ if (upper) { k = *n; while(k < ncols && k > 0) { if (ipiv[k] > 0) { /* 1x1 pivot */ kp = ipiv[k]; if (kp != k) { tmp = work[*n + k]; work[*n + k] = work[*n + kp]; work[*n + kp] = tmp; } i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + k * af_dim1], abs(d__1)), d__3 = work[k]; work[k] = max(d__2,d__3); } --k; } else { /* 2x2 pivot */ kp = -ipiv[k]; tmp = work[*n + k - 1]; work[*n + k - 1] = work[*n + kp]; work[*n + kp] = tmp; i__1 = k - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + k * af_dim1], abs(d__1)), d__3 = work[k]; work[k] = max(d__2,d__3); /* Computing MAX */ d__2 = (d__1 = af[i__ + (k - 1) * af_dim1], abs(d__1)), d__3 = work[k - 1]; work[k - 1] = max(d__2,d__3); } /* Computing MAX */ d__2 = (d__1 = af[k + k * af_dim1], abs(d__1)), d__3 = work[k] ; work[k] = max(d__2,d__3); k += -2; } } k = ncols; while(k <= *n) { if (ipiv[k] > 0) { kp = ipiv[k]; if (kp != k) { tmp = work[*n + k]; work[*n + k] = work[*n + kp]; work[*n + kp] = tmp; } ++k; } else { kp = -ipiv[k]; tmp = work[*n + k]; work[*n + k] = work[*n + kp]; work[*n + kp] = tmp; k += 2; } } } else { k = 1; while(k <= ncols) { if (ipiv[k] > 0) { /* 1x1 pivot */ kp = ipiv[k]; if (kp != k) { tmp = work[*n + k]; work[*n + k] = work[*n + kp]; work[*n + kp] = tmp; } i__1 = *n; for (i__ = k; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + k * af_dim1], abs(d__1)), d__3 = work[k]; work[k] = max(d__2,d__3); } ++k; } else { /* 2x2 pivot */ kp = -ipiv[k]; tmp = work[*n + k + 1]; work[*n + k + 1] = work[*n + kp]; work[*n + kp] = tmp; i__1 = *n; for (i__ = k + 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = (d__1 = af[i__ + k * af_dim1], abs(d__1)), d__3 = work[k]; work[k] = max(d__2,d__3); /* Computing MAX */ d__2 = (d__1 = af[i__ + (k + 1) * af_dim1], abs(d__1)), d__3 = work[k + 1]; work[k + 1] = max(d__2,d__3); } /* Computing MAX */ d__2 = (d__1 = af[k + k * af_dim1], abs(d__1)), d__3 = work[k] ; work[k] = max(d__2,d__3); k += 2; } } k = ncols; while(k >= 1) { if (ipiv[k] > 0) { kp = ipiv[k]; if (kp != k) { tmp = work[*n + k]; work[*n + k] = work[*n + kp]; work[*n + kp] = tmp; } --k; } else { kp = -ipiv[k]; tmp = work[*n + k]; work[*n + k] = work[*n + kp]; work[*n + kp] = tmp; k += -2; } } } /* Compute the *inverse* of the max element growth factor. Dividing */ /* by zero would imply the largest entry of the factor's column is */ /* zero. Than can happen when either the column of A is zero or */ /* massive pivots made the factor underflow to zero. Neither counts */ /* as growth in itself, so simply ignore terms with zero */ /* denominators. */ if (upper) { i__1 = *n; for (i__ = ncols; i__ <= i__1; ++i__) { umax = work[i__]; amax = work[*n + i__]; if (umax != 0.) { /* Computing MIN */ d__1 = amax / umax; rpvgrw = min(d__1,rpvgrw); } } } else { i__1 = ncols; for (i__ = 1; i__ <= i__1; ++i__) { umax = work[i__]; amax = work[*n + i__]; if (umax != 0.) { /* Computing MIN */ d__1 = amax / umax; rpvgrw = min(d__1,rpvgrw); } } } ret_val = rpvgrw; return ret_val; } /* _starpu_dla_syrpvgrw__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dla_wwaddw.c000066400000000000000000000043321413463044200214650ustar00rootroot00000000000000/* _starpu_dla_wwaddw.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dla_wwaddw__(integer *n, doublereal *x, doublereal *y, doublereal *w) { /* System generated locals */ integer i__1; /* Local variables */ integer i__; doublereal s; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLA_WWADDW adds a vector W into a doubled-single vector (X, Y). */ /* This works for all extant IBM's hex and binary floating point */ /* arithmetics, but not for decimal. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The length of vectors X, Y, and W. */ /* X, Y (input/output) DOUBLE PRECISION array, length N */ /* The doubled-single accumulation vector. */ /* W (input) DOUBLE PRECISION array, length N */ /* The vector to be added. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --w; --y; --x; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { s = x[i__] + w[i__]; s = s + s - s; y[i__] = x[i__] - s + w[i__] + y[i__]; x[i__] = s; /* L10: */ } return 0; } /* _starpu_dla_wwaddw__ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlabad.c000066400000000000000000000046161413463044200205640ustar00rootroot00000000000000/* dlabad.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlabad_(doublereal *small, doublereal *large) { /* Builtin functions */ double d_lg10(doublereal *), sqrt(doublereal); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLABAD takes as input the values computed by DLAMCH for underflow and */ /* overflow, and returns the square root of each of these values if the */ /* log of LARGE is sufficiently large. This subroutine is intended to */ /* identify machines with a large exponent range, such as the Crays, and */ /* redefine the underflow and overflow limits to be the square roots of */ /* the values computed by DLAMCH. This subroutine is needed because */ /* DLAMCH does not compensate for poor arithmetic in the upper half of */ /* the exponent range, as is found on a Cray. */ /* Arguments */ /* ========= */ /* SMALL (input/output) DOUBLE PRECISION */ /* On entry, the underflow threshold as computed by DLAMCH. */ /* On exit, if LOG10(LARGE) is sufficiently large, the square */ /* root of SMALL, otherwise unchanged. */ /* LARGE (input/output) DOUBLE PRECISION */ /* On entry, the overflow threshold as computed by DLAMCH. */ /* On exit, if LOG10(LARGE) is sufficiently large, the square */ /* root of LARGE, otherwise unchanged. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* If it looks like we're on a Cray, take the square root of */ /* SMALL and LARGE to avoid overflow and underflow problems. */ if (d_lg10(large) > 2e3) { *small = sqrt(*small); *large = sqrt(*large); } return 0; /* End of DLABAD */ } /* _starpu_dlabad_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlabrd.c000066400000000000000000000356651413463044200206150ustar00rootroot00000000000000/* dlabrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = -1.; static doublereal c_b5 = 1.; static integer c__1 = 1; static doublereal c_b16 = 0.; /* Subroutine */ int _starpu_dlabrd_(integer *m, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer *ldy) { /* System generated locals */ integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, i__3; /* Local variables */ integer i__; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLABRD reduces the first NB rows and columns of a real general */ /* m by n matrix A to upper or lower bidiagonal form by an orthogonal */ /* transformation Q' * A * P, and returns the matrices X and Y which */ /* are needed to apply the transformation to the unreduced part of A. */ /* If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower */ /* bidiagonal form. */ /* This is an auxiliary routine called by DGEBRD */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows in the matrix A. */ /* N (input) INTEGER */ /* The number of columns in the matrix A. */ /* NB (input) INTEGER */ /* The number of leading rows and columns of A to be reduced. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the m by n general matrix to be reduced. */ /* On exit, the first NB rows and columns of the matrix are */ /* overwritten; the rest of the array is unchanged. */ /* If m >= n, elements on and below the diagonal in the first NB */ /* columns, with the array TAUQ, represent the orthogonal */ /* matrix Q as a product of elementary reflectors; and */ /* elements above the diagonal in the first NB rows, with the */ /* array TAUP, represent the orthogonal matrix P as a product */ /* of elementary reflectors. */ /* If m < n, elements below the diagonal in the first NB */ /* columns, with the array TAUQ, represent the orthogonal */ /* matrix Q as a product of elementary reflectors, and */ /* elements on and above the diagonal in the first NB rows, */ /* with the array TAUP, represent the orthogonal matrix P as */ /* a product of elementary reflectors. */ /* See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* D (output) DOUBLE PRECISION array, dimension (NB) */ /* The diagonal elements of the first NB rows and columns of */ /* the reduced matrix. D(i) = A(i,i). */ /* E (output) DOUBLE PRECISION array, dimension (NB) */ /* The off-diagonal elements of the first NB rows and columns of */ /* the reduced matrix. */ /* TAUQ (output) DOUBLE PRECISION array dimension (NB) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix Q. See Further Details. */ /* TAUP (output) DOUBLE PRECISION array, dimension (NB) */ /* The scalar factors of the elementary reflectors which */ /* represent the orthogonal matrix P. See Further Details. */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NB) */ /* The m-by-nb matrix X required to update the unreduced part */ /* of A. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= M. */ /* Y (output) DOUBLE PRECISION array, dimension (LDY,NB) */ /* The n-by-nb matrix Y required to update the unreduced part */ /* of A. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= N. */ /* Further Details */ /* =============== */ /* The matrices Q and P are represented as products of elementary */ /* reflectors: */ /* Q = H(1) H(2) . . . H(nb) and P = G(1) G(2) . . . G(nb) */ /* Each H(i) and G(i) has the form: */ /* H(i) = I - tauq * v * v' and G(i) = I - taup * u * u' */ /* where tauq and taup are real scalars, and v and u are real vectors. */ /* If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in */ /* A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in */ /* A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). */ /* If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in */ /* A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in */ /* A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). */ /* The elements of the vectors v and u together form the m-by-nb matrix */ /* V and the nb-by-n matrix U' which are needed, with X and Y, to apply */ /* the transformation to the unreduced part of the matrix, using a block */ /* update of the form: A := A - V*Y' - X*U'. */ /* The contents of A on exit are illustrated by the following examples */ /* with nb = 2: */ /* m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ /* ( 1 1 u1 u1 u1 ) ( 1 u1 u1 u1 u1 u1 ) */ /* ( v1 1 1 u2 u2 ) ( 1 1 u2 u2 u2 u2 ) */ /* ( v1 v2 a a a ) ( v1 1 a a a a ) */ /* ( v1 v2 a a a ) ( v1 v2 a a a a ) */ /* ( v1 v2 a a a ) ( v1 v2 a a a a ) */ /* ( v1 v2 a a a ) */ /* where a denotes an element of the original matrix which is unchanged, */ /* vi denotes an element of the vector defining H(i), and ui an element */ /* of the vector defining G(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tauq; --taup; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } if (*m >= *n) { /* Reduce to upper bidiagonal form */ i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:m,i) */ i__2 = *m - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &a[i__ + a_dim1], lda, &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + i__ * a_dim1], & c__1); i__2 = *m - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &x[i__ + x_dim1], ldx, &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[i__ + i__ * a_dim1], &c__1); /* Generate reflection Q(i) to annihilate A(i+1:m,i) */ i__2 = *m - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m)+ i__ * a_dim1], &c__1, &tauq[i__]); d__[i__] = a[i__ + i__ * a_dim1]; if (i__ < *n) { a[i__ + i__ * a_dim1] = 1.; /* Compute Y(i+1:n,i) */ i__2 = *m - i__ + 1; i__3 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[i__ + (i__ + 1) * a_dim1], lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, & y[i__ + 1 + i__ * y_dim1], &c__1); i__2 = *m - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * y_dim1 + 1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ i__ + 1 + i__ * y_dim1], &c__1); i__2 = *m - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &x[i__ + x_dim1], ldx, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * y_dim1 + 1], &c__1); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * a_dim1 + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + 1 + i__ * y_dim1], &c__1); i__2 = *n - i__; _starpu_dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); /* Update A(i,i+1:n) */ i__2 = *n - i__; _starpu_dgemv_("No transpose", &i__2, &i__, &c_b4, &y[i__ + 1 + y_dim1], ldy, &a[i__ + a_dim1], lda, &c_b5, &a[i__ + ( i__ + 1) * a_dim1], lda); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * a_dim1 + 1], lda, &x[i__ + x_dim1], ldx, &c_b5, &a[ i__ + (i__ + 1) * a_dim1], lda); /* Generate reflection P(i) to annihilate A(i,i+2:n) */ i__2 = *n - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( i__3, *n)* a_dim1], lda, &taup[i__]); e[i__] = a[i__ + (i__ + 1) * a_dim1]; a[i__ + (i__ + 1) * a_dim1] = 1.; /* Compute X(i+1:m,i) */ i__2 = *m - i__; i__3 = *n - i__; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1); i__2 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__, &c_b5, &y[i__ + 1 + y_dim1], ldy, &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[ i__ * x_dim1 + 1], &c__1); i__2 = *m - i__; _starpu_dgemv_("No transpose", &i__2, &i__, &c_b4, &a[i__ + 1 + a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ i__ + 1 + i__ * x_dim1], &c__1); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, & c_b16, &x[i__ * x_dim1 + 1], &c__1); i__2 = *m - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ i__ + 1 + i__ * x_dim1], &c__1); i__2 = *m - i__; _starpu_dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); } /* L10: */ } } else { /* Reduce to lower bidiagonal form */ i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i,i:n) */ i__2 = *n - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &y[i__ + y_dim1], ldy, &a[i__ + a_dim1], lda, &c_b5, &a[i__ + i__ * a_dim1], lda); i__2 = i__ - 1; i__3 = *n - i__ + 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b4, &a[i__ * a_dim1 + 1], lda, &x[i__ + x_dim1], ldx, &c_b5, &a[i__ + i__ * a_dim1], lda); /* Generate reflection P(i) to annihilate A(i,i+1:n) */ i__2 = *n - i__ + 1; /* Computing MIN */ i__3 = i__ + 1; _starpu_dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n)* a_dim1], lda, &taup[i__]); d__[i__] = a[i__ + i__ * a_dim1]; if (i__ < *m) { a[i__ + i__ * a_dim1] = 1.; /* Compute X(i+1:m,i) */ i__2 = *m - i__; i__3 = *n - i__ + 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + i__ * a_dim1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, & x[i__ + 1 + i__ * x_dim1], &c__1); i__2 = *n - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &y[i__ + y_dim1], ldy, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * x_dim1 + 1], &c__1); i__2 = *m - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ i__ + 1 + i__ * x_dim1], &c__1); i__2 = i__ - 1; i__3 = *n - i__ + 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[i__ * a_dim1 + 1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * x_dim1 + 1], &c__1); i__2 = *m - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ i__ + 1 + i__ * x_dim1], &c__1); i__2 = *m - i__; _starpu_dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); /* Update A(i+1:m,i) */ i__2 = *m - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + a_dim1], lda, &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + 1 + i__ * a_dim1], &c__1); i__2 = *m - i__; _starpu_dgemv_("No transpose", &i__2, &i__, &c_b4, &x[i__ + 1 + x_dim1], ldx, &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[ i__ + 1 + i__ * a_dim1], &c__1); /* Generate reflection Q(i) to annihilate A(i+2:m,i) */ i__2 = *m - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *m)+ i__ * a_dim1], &c__1, &tauq[i__]); e[i__] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; /* Compute Y(i+1:n,i) */ i__2 = *m - i__; i__3 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1); i__2 = *m - i__; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ i__ * y_dim1 + 1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ i__ + 1 + i__ * y_dim1], &c__1); i__2 = *m - i__; _starpu_dgemv_("Transpose", &i__2, &i__, &c_b5, &x[i__ + 1 + x_dim1], ldx, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ i__ * y_dim1 + 1], &c__1); i__2 = *n - i__; _starpu_dgemv_("Transpose", &i__, &i__2, &c_b4, &a[(i__ + 1) * a_dim1 + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + 1 + i__ * y_dim1], &c__1); i__2 = *n - i__; _starpu_dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); } /* L20: */ } } return 0; /* End of DLABRD */ } /* _starpu_dlabrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlacn2.c000066400000000000000000000154171413463044200205210ustar00rootroot00000000000000/* dlacn2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dlacn2_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase, integer *isave) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); integer i_dnnt(doublereal *); /* Local variables */ integer i__; doublereal temp; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); integer jlast; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal altsgn, estold; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLACN2 estimates the 1-norm of a square, real matrix A. */ /* Reverse communication is used for evaluating matrix-vector products. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N >= 1. */ /* V (workspace) DOUBLE PRECISION array, dimension (N) */ /* On the final return, V = A*W, where EST = norm(V)/norm(W) */ /* (W is not returned). */ /* X (input/output) DOUBLE PRECISION array, dimension (N) */ /* On an intermediate return, X should be overwritten by */ /* A * X, if KASE=1, */ /* A' * X, if KASE=2, */ /* and DLACN2 must be re-called with all the other parameters */ /* unchanged. */ /* ISGN (workspace) INTEGER array, dimension (N) */ /* EST (input/output) DOUBLE PRECISION */ /* On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be */ /* unchanged from the previous call to DLACN2. */ /* On exit, EST is an estimate (a lower bound) for norm(A). */ /* KASE (input/output) INTEGER */ /* On the initial call to DLACN2, KASE should be 0. */ /* On an intermediate return, KASE will be 1 or 2, indicating */ /* whether X should be overwritten by A * X or A' * X. */ /* On the final return from DLACN2, KASE will again be 0. */ /* ISAVE (input/output) INTEGER array, dimension (3) */ /* ISAVE is used to save variables between calls to DLACN2 */ /* Further Details */ /* ======= ======= */ /* Contributed by Nick Higham, University of Manchester. */ /* Originally named SONEST, dated March 16, 1988. */ /* Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of */ /* a real or complex matrix, with applications to condition estimation", */ /* ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ /* This is a thread safe version of DLACON, which uses the array ISAVE */ /* in place of a SAVE statement, as follows: */ /* DLACON DLACN2 */ /* JUMP ISAVE(1) */ /* J ISAVE(2) */ /* ITER ISAVE(3) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --isave; --isgn; --x; --v; /* Function Body */ if (*kase == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = 1. / (doublereal) (*n); /* L10: */ } *kase = 1; isave[1] = 1; return 0; } switch (isave[1]) { case 1: goto L20; case 2: goto L40; case 3: goto L70; case 4: goto L110; case 5: goto L140; } /* ................ ENTRY (ISAVE( 1 ) = 1) */ /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. */ L20: if (*n == 1) { v[1] = x[1]; *est = abs(v[1]); /* ... QUIT */ goto L150; } *est = _starpu_dasum_(n, &x[1], &c__1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = d_sign(&c_b11, &x[i__]); isgn[i__] = i_dnnt(&x[i__]); /* L30: */ } *kase = 2; isave[1] = 2; return 0; /* ................ ENTRY (ISAVE( 1 ) = 2) */ /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ L40: isave[2] = _starpu_idamax_(n, &x[1], &c__1); isave[3] = 2; /* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. */ L50: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = 0.; /* L60: */ } x[isave[2]] = 1.; *kase = 1; isave[1] = 3; return 0; /* ................ ENTRY (ISAVE( 1 ) = 3) */ /* X HAS BEEN OVERWRITTEN BY A*X. */ L70: _starpu_dcopy_(n, &x[1], &c__1, &v[1], &c__1); estold = *est; *est = _starpu_dasum_(n, &v[1], &c__1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = d_sign(&c_b11, &x[i__]); if (i_dnnt(&d__1) != isgn[i__]) { goto L90; } /* L80: */ } /* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. */ goto L120; L90: /* TEST FOR CYCLING. */ if (*est <= estold) { goto L120; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = d_sign(&c_b11, &x[i__]); isgn[i__] = i_dnnt(&x[i__]); /* L100: */ } *kase = 2; isave[1] = 4; return 0; /* ................ ENTRY (ISAVE( 1 ) = 4) */ /* X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ L110: jlast = isave[2]; isave[2] = _starpu_idamax_(n, &x[1], &c__1); if (x[jlast] != (d__1 = x[isave[2]], abs(d__1)) && isave[3] < 5) { ++isave[3]; goto L50; } /* ITERATION COMPLETE. FINAL STAGE. */ L120: altsgn = 1.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = altsgn * ((doublereal) (i__ - 1) / (doublereal) (*n - 1) + 1.); altsgn = -altsgn; /* L130: */ } *kase = 1; isave[1] = 5; return 0; /* ................ ENTRY (ISAVE( 1 ) = 5) */ /* X HAS BEEN OVERWRITTEN BY A*X. */ L140: temp = _starpu_dasum_(n, &x[1], &c__1) / (doublereal) (*n * 3) * 2.; if (temp > *est) { _starpu_dcopy_(n, &x[1], &c__1, &v[1], &c__1); *est = temp; } L150: *kase = 0; return 0; /* End of DLACN2 */ } /* _starpu_dlacn2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlacon.c000066400000000000000000000146011413463044200206100ustar00rootroot00000000000000/* dlacon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dlacon_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); integer i_dnnt(doublereal *); /* Local variables */ static integer i__, j, iter; static doublereal temp; static integer jump; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); static integer jlast; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); static doublereal altsgn, estold; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLACON estimates the 1-norm of a square, real matrix A. */ /* Reverse communication is used for evaluating matrix-vector products. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N >= 1. */ /* V (workspace) DOUBLE PRECISION array, dimension (N) */ /* On the final return, V = A*W, where EST = norm(V)/norm(W) */ /* (W is not returned). */ /* X (input/output) DOUBLE PRECISION array, dimension (N) */ /* On an intermediate return, X should be overwritten by */ /* A * X, if KASE=1, */ /* A' * X, if KASE=2, */ /* and DLACON must be re-called with all the other parameters */ /* unchanged. */ /* ISGN (workspace) INTEGER array, dimension (N) */ /* EST (input/output) DOUBLE PRECISION */ /* On entry with KASE = 1 or 2 and JUMP = 3, EST should be */ /* unchanged from the previous call to DLACON. */ /* On exit, EST is an estimate (a lower bound) for norm(A). */ /* KASE (input/output) INTEGER */ /* On the initial call to DLACON, KASE should be 0. */ /* On an intermediate return, KASE will be 1 or 2, indicating */ /* whether X should be overwritten by A * X or A' * X. */ /* On the final return from DLACON, KASE will again be 0. */ /* Further Details */ /* ======= ======= */ /* Contributed by Nick Higham, University of Manchester. */ /* Originally named SONEST, dated March 16, 1988. */ /* Reference: N.J. Higham, "FORTRAN codes for estimating the one-norm of */ /* a real or complex matrix, with applications to condition estimation", */ /* ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Save statement .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --isgn; --x; --v; /* Function Body */ if (*kase == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = 1. / (doublereal) (*n); /* L10: */ } *kase = 1; jump = 1; return 0; } switch (jump) { case 1: goto L20; case 2: goto L40; case 3: goto L70; case 4: goto L110; case 5: goto L140; } /* ................ ENTRY (JUMP = 1) */ /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. */ L20: if (*n == 1) { v[1] = x[1]; *est = abs(v[1]); /* ... QUIT */ goto L150; } *est = _starpu_dasum_(n, &x[1], &c__1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = d_sign(&c_b11, &x[i__]); isgn[i__] = i_dnnt(&x[i__]); /* L30: */ } *kase = 2; jump = 2; return 0; /* ................ ENTRY (JUMP = 2) */ /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ L40: j = _starpu_idamax_(n, &x[1], &c__1); iter = 2; /* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. */ L50: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = 0.; /* L60: */ } x[j] = 1.; *kase = 1; jump = 3; return 0; /* ................ ENTRY (JUMP = 3) */ /* X HAS BEEN OVERWRITTEN BY A*X. */ L70: _starpu_dcopy_(n, &x[1], &c__1, &v[1], &c__1); estold = *est; *est = _starpu_dasum_(n, &v[1], &c__1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = d_sign(&c_b11, &x[i__]); if (i_dnnt(&d__1) != isgn[i__]) { goto L90; } /* L80: */ } /* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. */ goto L120; L90: /* TEST FOR CYCLING. */ if (*est <= estold) { goto L120; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = d_sign(&c_b11, &x[i__]); isgn[i__] = i_dnnt(&x[i__]); /* L100: */ } *kase = 2; jump = 4; return 0; /* ................ ENTRY (JUMP = 4) */ /* X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ L110: jlast = j; j = _starpu_idamax_(n, &x[1], &c__1); if (x[jlast] != (d__1 = x[j], abs(d__1)) && iter < 5) { ++iter; goto L50; } /* ITERATION COMPLETE. FINAL STAGE. */ L120: altsgn = 1.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = altsgn * ((doublereal) (i__ - 1) / (doublereal) (*n - 1) + 1.); altsgn = -altsgn; /* L130: */ } *kase = 1; jump = 5; return 0; /* ................ ENTRY (JUMP = 5) */ /* X HAS BEEN OVERWRITTEN BY A*X. */ L140: temp = _starpu_dasum_(n, &x[1], &c__1) / (doublereal) (*n * 3) * 2.; if (temp > *est) { _starpu_dcopy_(n, &x[1], &c__1, &v[1], &c__1); *est = temp; } L150: *kase = 0; return 0; /* End of DLACON */ } /* _starpu_dlacon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlacpy.c000066400000000000000000000065311413463044200206270ustar00rootroot00000000000000/* dlacpy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlacpy_(char *uplo, integer *m, integer *n, doublereal * a, integer *lda, doublereal *b, integer *ldb) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer i__, j; extern logical _starpu_lsame_(char *, char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLACPY copies all or part of a two-dimensional matrix A to another */ /* matrix B. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies the part of the matrix A to be copied to B. */ /* = 'U': Upper triangular part */ /* = 'L': Lower triangular part */ /* Otherwise: All of the matrix A */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. If UPLO = 'U', only the upper triangle */ /* or trapezoid is accessed; if UPLO = 'L', only the lower */ /* triangle or trapezoid is accessed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On exit, B = A in the locations specified by UPLO. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,M). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(j,*m); for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(uplo, "L")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; /* L30: */ } /* L40: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; /* L50: */ } /* L60: */ } } return 0; /* End of DLACPY */ } /* _starpu_dlacpy_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dladiv.c000066400000000000000000000040751413463044200206170ustar00rootroot00000000000000/* dladiv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dladiv_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p, doublereal *q) { doublereal e, f; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLADIV performs complex division in real arithmetic */ /* a + i*b */ /* p + i*q = --------- */ /* c + i*d */ /* The algorithm is due to Robert L. Smith and can be found */ /* in D. Knuth, The art of Computer Programming, Vol.2, p.195 */ /* Arguments */ /* ========= */ /* A (input) DOUBLE PRECISION */ /* B (input) DOUBLE PRECISION */ /* C (input) DOUBLE PRECISION */ /* D (input) DOUBLE PRECISION */ /* The scalars a, b, c, and d in the above expression. */ /* P (output) DOUBLE PRECISION */ /* Q (output) DOUBLE PRECISION */ /* The scalars p and q in the above expression. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ if (abs(*d__) < abs(*c__)) { e = *d__ / *c__; f = *c__ + *d__ * e; *p = (*a + *b * e) / f; *q = (*b - *a * e) / f; } else { e = *c__ / *d__; f = *d__ + *c__ * e; *p = (*b + *a * e) / f; *q = (-(*a) + *b * e) / f; } return 0; /* End of DLADIV */ } /* _starpu_dladiv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlae2.c000066400000000000000000000073071413463044200203440ustar00rootroot00000000000000/* dlae2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlae2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2) { /* System generated locals */ doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal ab, df, tb, sm, rt, adf, acmn, acmx; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix */ /* [ A B ] */ /* [ B C ]. */ /* On return, RT1 is the eigenvalue of larger absolute value, and RT2 */ /* is the eigenvalue of smaller absolute value. */ /* Arguments */ /* ========= */ /* A (input) DOUBLE PRECISION */ /* The (1,1) element of the 2-by-2 matrix. */ /* B (input) DOUBLE PRECISION */ /* The (1,2) and (2,1) elements of the 2-by-2 matrix. */ /* C (input) DOUBLE PRECISION */ /* The (2,2) element of the 2-by-2 matrix. */ /* RT1 (output) DOUBLE PRECISION */ /* The eigenvalue of larger absolute value. */ /* RT2 (output) DOUBLE PRECISION */ /* The eigenvalue of smaller absolute value. */ /* Further Details */ /* =============== */ /* RT1 is accurate to a few ulps barring over/underflow. */ /* RT2 may be inaccurate if there is massive cancellation in the */ /* determinant A*C-B*B; higher precision or correctly rounded or */ /* correctly truncated arithmetic would be needed to compute RT2 */ /* accurately in all cases. */ /* Overflow is possible only if RT1 is within a factor of 5 of overflow. */ /* Underflow is harmless if the input data is 0 or exceeds */ /* underflow_threshold / macheps. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Compute the eigenvalues */ sm = *a + *c__; df = *a - *c__; adf = abs(df); tb = *b + *b; ab = abs(tb); if (abs(*a) > abs(*c__)) { acmx = *a; acmn = *c__; } else { acmx = *c__; acmn = *a; } if (adf > ab) { /* Computing 2nd power */ d__1 = ab / adf; rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { /* Computing 2nd power */ d__1 = adf / ab; rt = ab * sqrt(d__1 * d__1 + 1.); } else { /* Includes case AB=ADF=0 */ rt = ab * sqrt(2.); } if (sm < 0.) { *rt1 = (sm - rt) * .5; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { *rt1 = (sm + rt) * .5; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { /* Includes case RT1 = RT2 = 0 */ *rt1 = rt * .5; *rt2 = rt * -.5; } return 0; /* End of DLAE2 */ } /* _starpu_dlae2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaebz.c000066400000000000000000000510111413463044200206050ustar00rootroot00000000000000/* dlaebz.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaebz_(integer *ijob, integer *nitmax, integer *n, integer *mmax, integer *minp, integer *nbmin, doublereal *abstol, doublereal *reltol, doublereal *pivmin, doublereal *d__, doublereal * e, doublereal *e2, integer *nval, doublereal *ab, doublereal *c__, integer *mout, integer *nab, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer nab_dim1, nab_offset, ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublereal d__1, d__2, d__3, d__4; /* Local variables */ integer j, kf, ji, kl, jp, jit; doublereal tmp1, tmp2; integer itmp1, itmp2, kfnew, klnew; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAEBZ contains the iteration loops which compute and use the */ /* function N(w), which is the count of eigenvalues of a symmetric */ /* tridiagonal matrix T less than or equal to its argument w. It */ /* performs a choice of two types of loops: */ /* IJOB=1, followed by */ /* IJOB=2: It takes as input a list of intervals and returns a list of */ /* sufficiently small intervals whose union contains the same */ /* eigenvalues as the union of the original intervals. */ /* The input intervals are (AB(j,1),AB(j,2)], j=1,...,MINP. */ /* The output interval (AB(j,1),AB(j,2)] will contain */ /* eigenvalues NAB(j,1)+1,...,NAB(j,2), where 1 <= j <= MOUT. */ /* IJOB=3: It performs a binary search in each input interval */ /* (AB(j,1),AB(j,2)] for a point w(j) such that */ /* N(w(j))=NVAL(j), and uses C(j) as the starting point of */ /* the search. If such a w(j) is found, then on output */ /* AB(j,1)=AB(j,2)=w. If no such w(j) is found, then on output */ /* (AB(j,1),AB(j,2)] will be a small interval containing the */ /* point where N(w) jumps through NVAL(j), unless that point */ /* lies outside the initial interval. */ /* Note that the intervals are in all cases half-open intervals, */ /* i.e., of the form (a,b] , which includes b but not a . */ /* To avoid underflow, the matrix should be scaled so that its largest */ /* element is no greater than overflow**(1/2) * underflow**(1/4) */ /* in absolute value. To assure the most accurate computation */ /* of small eigenvalues, the matrix should be scaled to be */ /* not much smaller than that, either. */ /* See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal */ /* Matrix", Report CS41, Computer Science Dept., Stanford */ /* University, July 21, 1966 */ /* Note: the arguments are, in general, *not* checked for unreasonable */ /* values. */ /* Arguments */ /* ========= */ /* IJOB (input) INTEGER */ /* Specifies what is to be done: */ /* = 1: Compute NAB for the initial intervals. */ /* = 2: Perform bisection iteration to find eigenvalues of T. */ /* = 3: Perform bisection iteration to invert N(w), i.e., */ /* to find a point which has a specified number of */ /* eigenvalues of T to its left. */ /* Other values will cause DLAEBZ to return with INFO=-1. */ /* NITMAX (input) INTEGER */ /* The maximum number of "levels" of bisection to be */ /* performed, i.e., an interval of width W will not be made */ /* smaller than 2^(-NITMAX) * W. If not all intervals */ /* have converged after NITMAX iterations, then INFO is set */ /* to the number of non-converged intervals. */ /* N (input) INTEGER */ /* The dimension n of the tridiagonal matrix T. It must be at */ /* least 1. */ /* MMAX (input) INTEGER */ /* The maximum number of intervals. If more than MMAX intervals */ /* are generated, then DLAEBZ will quit with INFO=MMAX+1. */ /* MINP (input) INTEGER */ /* The initial number of intervals. It may not be greater than */ /* MMAX. */ /* NBMIN (input) INTEGER */ /* The smallest number of intervals that should be processed */ /* using a vector loop. If zero, then only the scalar loop */ /* will be used. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The minimum (absolute) width of an interval. When an */ /* interval is narrower than ABSTOL, or than RELTOL times the */ /* larger (in magnitude) endpoint, then it is considered to be */ /* sufficiently small, i.e., converged. This must be at least */ /* zero. */ /* RELTOL (input) DOUBLE PRECISION */ /* The minimum relative width of an interval. When an interval */ /* is narrower than ABSTOL, or than RELTOL times the larger (in */ /* magnitude) endpoint, then it is considered to be */ /* sufficiently small, i.e., converged. Note: this should */ /* always be at least radix*machine epsilon. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum absolute value of a "pivot" in the Sturm */ /* sequence loop. This *must* be at least max |e(j)**2| * */ /* safe_min and at least safe_min, where safe_min is at least */ /* the smallest number that can divide one without overflow. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of the tridiagonal matrix T. */ /* E (input) DOUBLE PRECISION array, dimension (N) */ /* The offdiagonal elements of the tridiagonal matrix T in */ /* positions 1 through N-1. E(N) is arbitrary. */ /* E2 (input) DOUBLE PRECISION array, dimension (N) */ /* The squares of the offdiagonal elements of the tridiagonal */ /* matrix T. E2(N) is ignored. */ /* NVAL (input/output) INTEGER array, dimension (MINP) */ /* If IJOB=1 or 2, not referenced. */ /* If IJOB=3, the desired values of N(w). The elements of NVAL */ /* will be reordered to correspond with the intervals in AB. */ /* Thus, NVAL(j) on output will not, in general be the same as */ /* NVAL(j) on input, but it will correspond with the interval */ /* (AB(j,1),AB(j,2)] on output. */ /* AB (input/output) DOUBLE PRECISION array, dimension (MMAX,2) */ /* The endpoints of the intervals. AB(j,1) is a(j), the left */ /* endpoint of the j-th interval, and AB(j,2) is b(j), the */ /* right endpoint of the j-th interval. The input intervals */ /* will, in general, be modified, split, and reordered by the */ /* calculation. */ /* C (input/output) DOUBLE PRECISION array, dimension (MMAX) */ /* If IJOB=1, ignored. */ /* If IJOB=2, workspace. */ /* If IJOB=3, then on input C(j) should be initialized to the */ /* first search point in the binary search. */ /* MOUT (output) INTEGER */ /* If IJOB=1, the number of eigenvalues in the intervals. */ /* If IJOB=2 or 3, the number of intervals output. */ /* If IJOB=3, MOUT will equal MINP. */ /* NAB (input/output) INTEGER array, dimension (MMAX,2) */ /* If IJOB=1, then on output NAB(i,j) will be set to N(AB(i,j)). */ /* If IJOB=2, then on input, NAB(i,j) should be set. It must */ /* satisfy the condition: */ /* N(AB(i,1)) <= NAB(i,1) <= NAB(i,2) <= N(AB(i,2)), */ /* which means that in interval i only eigenvalues */ /* NAB(i,1)+1,...,NAB(i,2) will be considered. Usually, */ /* NAB(i,j)=N(AB(i,j)), from a previous call to DLAEBZ with */ /* IJOB=1. */ /* On output, NAB(i,j) will contain */ /* max(na(k),min(nb(k),N(AB(i,j)))), where k is the index of */ /* the input interval that the output interval */ /* (AB(j,1),AB(j,2)] came from, and na(k) and nb(k) are the */ /* the input values of NAB(k,1) and NAB(k,2). */ /* If IJOB=3, then on output, NAB(i,j) contains N(AB(i,j)), */ /* unless N(w) > NVAL(i) for all search points w , in which */ /* case NAB(i,1) will not be modified, i.e., the output */ /* value will be the same as the input value (modulo */ /* reorderings -- see NVAL and AB), or unless N(w) < NVAL(i) */ /* for all search points w , in which case NAB(i,2) will */ /* not be modified. Normally, NAB should be set to some */ /* distinctive value(s) before DLAEBZ is called. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MMAX) */ /* Workspace. */ /* IWORK (workspace) INTEGER array, dimension (MMAX) */ /* Workspace. */ /* INFO (output) INTEGER */ /* = 0: All intervals converged. */ /* = 1--MMAX: The last INFO intervals did not converge. */ /* = MMAX+1: More than MMAX intervals were generated. */ /* Further Details */ /* =============== */ /* This routine is intended to be called only by other LAPACK */ /* routines, thus the interface is less user-friendly. It is intended */ /* for two purposes: */ /* (a) finding eigenvalues. In this case, DLAEBZ should have one or */ /* more initial intervals set up in AB, and DLAEBZ should be called */ /* with IJOB=1. This sets up NAB, and also counts the eigenvalues. */ /* Intervals with no eigenvalues would usually be thrown out at */ /* this point. Also, if not all the eigenvalues in an interval i */ /* are desired, NAB(i,1) can be increased or NAB(i,2) decreased. */ /* For example, set NAB(i,1)=NAB(i,2)-1 to get the largest */ /* eigenvalue. DLAEBZ is then called with IJOB=2 and MMAX */ /* no smaller than the value of MOUT returned by the call with */ /* IJOB=1. After this (IJOB=2) call, eigenvalues NAB(i,1)+1 */ /* through NAB(i,2) are approximately AB(i,1) (or AB(i,2)) to the */ /* tolerance specified by ABSTOL and RELTOL. */ /* (b) finding an interval (a',b'] containing eigenvalues w(f),...,w(l). */ /* In this case, start with a Gershgorin interval (a,b). Set up */ /* AB to contain 2 search intervals, both initially (a,b). One */ /* NVAL element should contain f-1 and the other should contain l */ /* , while C should contain a and b, resp. NAB(i,1) should be -1 */ /* and NAB(i,2) should be N+1, to flag an error if the desired */ /* interval does not lie in (a,b). DLAEBZ is then called with */ /* IJOB=3. On exit, if w(f-1) < w(f), then one of the intervals -- */ /* j -- will have AB(j,1)=AB(j,2) and NAB(j,1)=NAB(j,2)=f-1, while */ /* if, to the specified tolerance, w(f-k)=...=w(f+r), k > 0 and r */ /* >= 0, then the interval will have N(AB(j,1))=NAB(j,1)=f-k and */ /* N(AB(j,2))=NAB(j,2)=f+r. The cases w(l) < w(l+1) and */ /* w(l-r)=...=w(l+k) are handled similarly. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Check for Errors */ /* Parameter adjustments */ nab_dim1 = *mmax; nab_offset = 1 + nab_dim1; nab -= nab_offset; ab_dim1 = *mmax; ab_offset = 1 + ab_dim1; ab -= ab_offset; --d__; --e; --e2; --nval; --c__; --work; --iwork; /* Function Body */ *info = 0; if (*ijob < 1 || *ijob > 3) { *info = -1; return 0; } /* Initialize NAB */ if (*ijob == 1) { /* Compute the number of eigenvalues in the initial intervals. */ *mout = 0; /* DIR$ NOVECTOR */ i__1 = *minp; for (ji = 1; ji <= i__1; ++ji) { for (jp = 1; jp <= 2; ++jp) { tmp1 = d__[1] - ab[ji + jp * ab_dim1]; if (abs(tmp1) < *pivmin) { tmp1 = -(*pivmin); } nab[ji + jp * nab_dim1] = 0; if (tmp1 <= 0.) { nab[ji + jp * nab_dim1] = 1; } i__2 = *n; for (j = 2; j <= i__2; ++j) { tmp1 = d__[j] - e2[j - 1] / tmp1 - ab[ji + jp * ab_dim1]; if (abs(tmp1) < *pivmin) { tmp1 = -(*pivmin); } if (tmp1 <= 0.) { ++nab[ji + jp * nab_dim1]; } /* L10: */ } /* L20: */ } *mout = *mout + nab[ji + (nab_dim1 << 1)] - nab[ji + nab_dim1]; /* L30: */ } return 0; } /* Initialize for loop */ /* KF and KL have the following meaning: */ /* Intervals 1,...,KF-1 have converged. */ /* Intervals KF,...,KL still need to be refined. */ kf = 1; kl = *minp; /* If IJOB=2, initialize C. */ /* If IJOB=3, use the user-supplied starting point. */ if (*ijob == 2) { i__1 = *minp; for (ji = 1; ji <= i__1; ++ji) { c__[ji] = (ab[ji + ab_dim1] + ab[ji + (ab_dim1 << 1)]) * .5; /* L40: */ } } /* Iteration loop */ i__1 = *nitmax; for (jit = 1; jit <= i__1; ++jit) { /* Loop over intervals */ if (kl - kf + 1 >= *nbmin && *nbmin > 0) { /* Begin of Parallel Version of the loop */ i__2 = kl; for (ji = kf; ji <= i__2; ++ji) { /* Compute N(c), the number of eigenvalues less than c */ work[ji] = d__[1] - c__[ji]; iwork[ji] = 0; if (work[ji] <= *pivmin) { iwork[ji] = 1; /* Computing MIN */ d__1 = work[ji], d__2 = -(*pivmin); work[ji] = min(d__1,d__2); } i__3 = *n; for (j = 2; j <= i__3; ++j) { work[ji] = d__[j] - e2[j - 1] / work[ji] - c__[ji]; if (work[ji] <= *pivmin) { ++iwork[ji]; /* Computing MIN */ d__1 = work[ji], d__2 = -(*pivmin); work[ji] = min(d__1,d__2); } /* L50: */ } /* L60: */ } if (*ijob <= 2) { /* IJOB=2: Choose all intervals containing eigenvalues. */ klnew = kl; i__2 = kl; for (ji = kf; ji <= i__2; ++ji) { /* Insure that N(w) is monotone */ /* Computing MIN */ /* Computing MAX */ i__5 = nab[ji + nab_dim1], i__6 = iwork[ji]; i__3 = nab[ji + (nab_dim1 << 1)], i__4 = max(i__5,i__6); iwork[ji] = min(i__3,i__4); /* Update the Queue -- add intervals if both halves */ /* contain eigenvalues. */ if (iwork[ji] == nab[ji + (nab_dim1 << 1)]) { /* No eigenvalue in the upper interval: */ /* just use the lower interval. */ ab[ji + (ab_dim1 << 1)] = c__[ji]; } else if (iwork[ji] == nab[ji + nab_dim1]) { /* No eigenvalue in the lower interval: */ /* just use the upper interval. */ ab[ji + ab_dim1] = c__[ji]; } else { ++klnew; if (klnew <= *mmax) { /* Eigenvalue in both intervals -- add upper to */ /* queue. */ ab[klnew + (ab_dim1 << 1)] = ab[ji + (ab_dim1 << 1)]; nab[klnew + (nab_dim1 << 1)] = nab[ji + (nab_dim1 << 1)]; ab[klnew + ab_dim1] = c__[ji]; nab[klnew + nab_dim1] = iwork[ji]; ab[ji + (ab_dim1 << 1)] = c__[ji]; nab[ji + (nab_dim1 << 1)] = iwork[ji]; } else { *info = *mmax + 1; } } /* L70: */ } if (*info != 0) { return 0; } kl = klnew; } else { /* IJOB=3: Binary search. Keep only the interval containing */ /* w s.t. N(w) = NVAL */ i__2 = kl; for (ji = kf; ji <= i__2; ++ji) { if (iwork[ji] <= nval[ji]) { ab[ji + ab_dim1] = c__[ji]; nab[ji + nab_dim1] = iwork[ji]; } if (iwork[ji] >= nval[ji]) { ab[ji + (ab_dim1 << 1)] = c__[ji]; nab[ji + (nab_dim1 << 1)] = iwork[ji]; } /* L80: */ } } } else { /* End of Parallel Version of the loop */ /* Begin of Serial Version of the loop */ klnew = kl; i__2 = kl; for (ji = kf; ji <= i__2; ++ji) { /* Compute N(w), the number of eigenvalues less than w */ tmp1 = c__[ji]; tmp2 = d__[1] - tmp1; itmp1 = 0; if (tmp2 <= *pivmin) { itmp1 = 1; /* Computing MIN */ d__1 = tmp2, d__2 = -(*pivmin); tmp2 = min(d__1,d__2); } /* A series of compiler directives to defeat vectorization */ /* for the next loop */ /* $PL$ CMCHAR=' ' */ /* DIR$ NEXTSCALAR */ /* $DIR SCALAR */ /* DIR$ NEXT SCALAR */ /* VD$L NOVECTOR */ /* DEC$ NOVECTOR */ /* VD$ NOVECTOR */ /* VDIR NOVECTOR */ /* VOCL LOOP,SCALAR */ /* IBM PREFER SCALAR */ /* $PL$ CMCHAR='*' */ i__3 = *n; for (j = 2; j <= i__3; ++j) { tmp2 = d__[j] - e2[j - 1] / tmp2 - tmp1; if (tmp2 <= *pivmin) { ++itmp1; /* Computing MIN */ d__1 = tmp2, d__2 = -(*pivmin); tmp2 = min(d__1,d__2); } /* L90: */ } if (*ijob <= 2) { /* IJOB=2: Choose all intervals containing eigenvalues. */ /* Insure that N(w) is monotone */ /* Computing MIN */ /* Computing MAX */ i__5 = nab[ji + nab_dim1]; i__3 = nab[ji + (nab_dim1 << 1)], i__4 = max(i__5,itmp1); itmp1 = min(i__3,i__4); /* Update the Queue -- add intervals if both halves */ /* contain eigenvalues. */ if (itmp1 == nab[ji + (nab_dim1 << 1)]) { /* No eigenvalue in the upper interval: */ /* just use the lower interval. */ ab[ji + (ab_dim1 << 1)] = tmp1; } else if (itmp1 == nab[ji + nab_dim1]) { /* No eigenvalue in the lower interval: */ /* just use the upper interval. */ ab[ji + ab_dim1] = tmp1; } else if (klnew < *mmax) { /* Eigenvalue in both intervals -- add upper to queue. */ ++klnew; ab[klnew + (ab_dim1 << 1)] = ab[ji + (ab_dim1 << 1)]; nab[klnew + (nab_dim1 << 1)] = nab[ji + (nab_dim1 << 1)]; ab[klnew + ab_dim1] = tmp1; nab[klnew + nab_dim1] = itmp1; ab[ji + (ab_dim1 << 1)] = tmp1; nab[ji + (nab_dim1 << 1)] = itmp1; } else { *info = *mmax + 1; return 0; } } else { /* IJOB=3: Binary search. Keep only the interval */ /* containing w s.t. N(w) = NVAL */ if (itmp1 <= nval[ji]) { ab[ji + ab_dim1] = tmp1; nab[ji + nab_dim1] = itmp1; } if (itmp1 >= nval[ji]) { ab[ji + (ab_dim1 << 1)] = tmp1; nab[ji + (nab_dim1 << 1)] = itmp1; } } /* L100: */ } kl = klnew; /* End of Serial Version of the loop */ } /* Check for convergence */ kfnew = kf; i__2 = kl; for (ji = kf; ji <= i__2; ++ji) { tmp1 = (d__1 = ab[ji + (ab_dim1 << 1)] - ab[ji + ab_dim1], abs( d__1)); /* Computing MAX */ d__3 = (d__1 = ab[ji + (ab_dim1 << 1)], abs(d__1)), d__4 = (d__2 = ab[ji + ab_dim1], abs(d__2)); tmp2 = max(d__3,d__4); /* Computing MAX */ d__1 = max(*abstol,*pivmin), d__2 = *reltol * tmp2; if (tmp1 < max(d__1,d__2) || nab[ji + nab_dim1] >= nab[ji + ( nab_dim1 << 1)]) { /* Converged -- Swap with position KFNEW, */ /* then increment KFNEW */ if (ji > kfnew) { tmp1 = ab[ji + ab_dim1]; tmp2 = ab[ji + (ab_dim1 << 1)]; itmp1 = nab[ji + nab_dim1]; itmp2 = nab[ji + (nab_dim1 << 1)]; ab[ji + ab_dim1] = ab[kfnew + ab_dim1]; ab[ji + (ab_dim1 << 1)] = ab[kfnew + (ab_dim1 << 1)]; nab[ji + nab_dim1] = nab[kfnew + nab_dim1]; nab[ji + (nab_dim1 << 1)] = nab[kfnew + (nab_dim1 << 1)]; ab[kfnew + ab_dim1] = tmp1; ab[kfnew + (ab_dim1 << 1)] = tmp2; nab[kfnew + nab_dim1] = itmp1; nab[kfnew + (nab_dim1 << 1)] = itmp2; if (*ijob == 3) { itmp1 = nval[ji]; nval[ji] = nval[kfnew]; nval[kfnew] = itmp1; } } ++kfnew; } /* L110: */ } kf = kfnew; /* Choose Midpoints */ i__2 = kl; for (ji = kf; ji <= i__2; ++ji) { c__[ji] = (ab[ji + ab_dim1] + ab[ji + (ab_dim1 << 1)]) * .5; /* L120: */ } /* If no more intervals to refine, quit. */ if (kf > kl) { goto L140; } /* L130: */ } /* Converged */ L140: /* Computing MAX */ i__1 = kl + 1 - kf; *info = max(i__1,0); *mout = kl; return 0; /* End of DLAEBZ */ } /* _starpu_dlaebz_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed0.c000066400000000000000000000323471413463044200205100ustar00rootroot00000000000000/* dlaed0.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__9 = 9; static integer c__0 = 0; static integer c__2 = 2; static doublereal c_b23 = 1.; static doublereal c_b24 = 0.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlaed0_(integer *icompq, integer *qsiz, integer *n, doublereal *d__, doublereal *e, doublereal *q, integer *ldq, doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double log(doublereal); integer pow_ii(integer *, integer *); /* Local variables */ integer i__, j, k, iq, lgn, msd2, smm1, spm1, spm2; doublereal temp; integer curr; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iperm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer indxq, iwrem; extern /* Subroutine */ int _starpu_dlaed1_(integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer iqptr; extern /* Subroutine */ int _starpu_dlaed7_(integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *); integer tlvls; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); integer igivcl; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer igivnm, submat, curprb, subpbs, igivpt; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer curlvl, matsiz, iprmpt, smlsiz; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED0 computes all eigenvalues and corresponding eigenvectors of a */ /* symmetric tridiagonal matrix using the divide and conquer method. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* = 0: Compute eigenvalues only. */ /* = 1: Compute eigenvectors of original dense symmetric matrix */ /* also. On entry, Q contains the orthogonal matrix used */ /* to reduce the original matrix to tridiagonal form. */ /* = 2: Compute eigenvalues and eigenvectors of tridiagonal */ /* matrix. */ /* QSIZ (input) INTEGER */ /* The dimension of the orthogonal matrix used to reduce */ /* the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the main diagonal of the tridiagonal matrix. */ /* On exit, its eigenvalues. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The off-diagonal elements of the tridiagonal matrix. */ /* On exit, E has been destroyed. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* On entry, Q must contain an N-by-N orthogonal matrix. */ /* If ICOMPQ = 0 Q is not referenced. */ /* If ICOMPQ = 1 On entry, Q is a subset of the columns of the */ /* orthogonal matrix used to reduce the full */ /* matrix to tridiagonal form corresponding to */ /* the subset of the full matrix which is being */ /* decomposed at this time. */ /* If ICOMPQ = 2 On entry, Q will be the identity matrix. */ /* On exit, Q contains the eigenvectors of the */ /* tridiagonal matrix. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. If eigenvectors are */ /* desired, then LDQ >= max(1,N). In any case, LDQ >= 1. */ /* QSTORE (workspace) DOUBLE PRECISION array, dimension (LDQS, N) */ /* Referenced only when ICOMPQ = 1. Used to store parts of */ /* the eigenvector matrix when the updating matrix multiplies */ /* take place. */ /* LDQS (input) INTEGER */ /* The leading dimension of the array QSTORE. If ICOMPQ = 1, */ /* then LDQS >= max(1,N). In any case, LDQS >= 1. */ /* WORK (workspace) DOUBLE PRECISION array, */ /* If ICOMPQ = 0 or 1, the dimension of WORK must be at least */ /* 1 + 3*N + 2*N*lg N + 2*N**2 */ /* ( lg( N ) = smallest integer k */ /* such that 2^k >= N ) */ /* If ICOMPQ = 2, the dimension of WORK must be at least */ /* 4*N + N**2. */ /* IWORK (workspace) INTEGER array, */ /* If ICOMPQ = 0 or 1, the dimension of IWORK must be at least */ /* 6 + 6*N + 5*N*lg N. */ /* ( lg( N ) = smallest integer k */ /* such that 2^k >= N ) */ /* If ICOMPQ = 2, the dimension of IWORK must be at least */ /* 3 + 5*N. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: The algorithm failed to compute an eigenvalue while */ /* working on the submatrix lying in rows and columns */ /* INFO/(N+1) through mod(INFO,N+1). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; qstore_dim1 = *ldqs; qstore_offset = 1 + qstore_dim1; qstore -= qstore_offset; --work; --iwork; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 2) { *info = -1; } else if (*icompq == 1 && *qsiz < max(0,*n)) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ldq < max(1,*n)) { *info = -7; } else if (*ldqs < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED0", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } smlsiz = _starpu_ilaenv_(&c__9, "DLAED0", " ", &c__0, &c__0, &c__0, &c__0); /* Determine the size and placement of the submatrices, and save in */ /* the leading elements of IWORK. */ iwork[1] = *n; subpbs = 1; tlvls = 0; L10: if (iwork[subpbs] > smlsiz) { for (j = subpbs; j >= 1; --j) { iwork[j * 2] = (iwork[j] + 1) / 2; iwork[(j << 1) - 1] = iwork[j] / 2; /* L20: */ } ++tlvls; subpbs <<= 1; goto L10; } i__1 = subpbs; for (j = 2; j <= i__1; ++j) { iwork[j] += iwork[j - 1]; /* L30: */ } /* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 */ /* using rank-1 modifications (cuts). */ spm1 = subpbs - 1; i__1 = spm1; for (i__ = 1; i__ <= i__1; ++i__) { submat = iwork[i__] + 1; smm1 = submat - 1; d__[smm1] -= (d__1 = e[smm1], abs(d__1)); d__[submat] -= (d__1 = e[smm1], abs(d__1)); /* L40: */ } indxq = (*n << 2) + 3; if (*icompq != 2) { /* Set up workspaces for eigenvalues only/accumulate new vectors */ /* routine */ temp = log((doublereal) (*n)) / log(2.); lgn = (integer) temp; if (pow_ii(&c__2, &lgn) < *n) { ++lgn; } if (pow_ii(&c__2, &lgn) < *n) { ++lgn; } iprmpt = indxq + *n + 1; iperm = iprmpt + *n * lgn; iqptr = iperm + *n * lgn; igivpt = iqptr + *n + 2; igivcl = igivpt + *n * lgn; igivnm = 1; iq = igivnm + (*n << 1) * lgn; /* Computing 2nd power */ i__1 = *n; iwrem = iq + i__1 * i__1 + 1; /* Initialize pointers */ i__1 = subpbs; for (i__ = 0; i__ <= i__1; ++i__) { iwork[iprmpt + i__] = 1; iwork[igivpt + i__] = 1; /* L50: */ } iwork[iqptr] = 1; } /* Solve each submatrix eigenproblem at the bottom of the divide and */ /* conquer tree. */ curr = 0; i__1 = spm1; for (i__ = 0; i__ <= i__1; ++i__) { if (i__ == 0) { submat = 1; matsiz = iwork[1]; } else { submat = iwork[i__] + 1; matsiz = iwork[i__ + 1] - iwork[i__]; } if (*icompq == 2) { _starpu_dsteqr_("I", &matsiz, &d__[submat], &e[submat], &q[submat + submat * q_dim1], ldq, &work[1], info); if (*info != 0) { goto L130; } } else { _starpu_dsteqr_("I", &matsiz, &d__[submat], &e[submat], &work[iq - 1 + iwork[iqptr + curr]], &matsiz, &work[1], info); if (*info != 0) { goto L130; } if (*icompq == 1) { _starpu_dgemm_("N", "N", qsiz, &matsiz, &matsiz, &c_b23, &q[submat * q_dim1 + 1], ldq, &work[iq - 1 + iwork[iqptr + curr]], &matsiz, &c_b24, &qstore[submat * qstore_dim1 + 1], ldqs); } /* Computing 2nd power */ i__2 = matsiz; iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; ++curr; } k = 1; i__2 = iwork[i__ + 1]; for (j = submat; j <= i__2; ++j) { iwork[indxq + j] = k; ++k; /* L60: */ } /* L70: */ } /* Successively merge eigensystems of adjacent submatrices */ /* into eigensystem for the corresponding larger matrix. */ /* while ( SUBPBS > 1 ) */ curlvl = 1; L80: if (subpbs > 1) { spm2 = subpbs - 2; i__1 = spm2; for (i__ = 0; i__ <= i__1; i__ += 2) { if (i__ == 0) { submat = 1; matsiz = iwork[2]; msd2 = iwork[1]; curprb = 0; } else { submat = iwork[i__] + 1; matsiz = iwork[i__ + 2] - iwork[i__]; msd2 = matsiz / 2; ++curprb; } /* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ /* into an eigensystem of size MATSIZ. */ /* DLAED1 is used only for the full eigensystem of a tridiagonal */ /* matrix. */ /* DLAED7 handles the cases in which eigenvalues only or eigenvalues */ /* and eigenvectors of a full symmetric matrix (which was reduced to */ /* tridiagonal form) are desired. */ if (*icompq == 2) { _starpu_dlaed1_(&matsiz, &d__[submat], &q[submat + submat * q_dim1], ldq, &iwork[indxq + submat], &e[submat + msd2 - 1], & msd2, &work[1], &iwork[subpbs + 1], info); } else { _starpu_dlaed7_(icompq, &matsiz, qsiz, &tlvls, &curlvl, &curprb, &d__[ submat], &qstore[submat * qstore_dim1 + 1], ldqs, & iwork[indxq + submat], &e[submat + msd2 - 1], &msd2, & work[iq], &iwork[iqptr], &iwork[iprmpt], &iwork[iperm] , &iwork[igivpt], &iwork[igivcl], &work[igivnm], & work[iwrem], &iwork[subpbs + 1], info); } if (*info != 0) { goto L130; } iwork[i__ / 2 + 1] = iwork[i__ + 2]; /* L90: */ } subpbs /= 2; ++curlvl; goto L80; } /* end while */ /* Re-merge the eigenvalues/vectors which were deflated at the final */ /* merge step. */ if (*icompq == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { j = iwork[indxq + i__]; work[i__] = d__[j]; _starpu_dcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1], &c__1); /* L100: */ } _starpu_dcopy_(n, &work[1], &c__1, &d__[1], &c__1); } else if (*icompq == 2) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { j = iwork[indxq + i__]; work[i__] = d__[j]; _starpu_dcopy_(n, &q[j * q_dim1 + 1], &c__1, &work[*n * i__ + 1], &c__1); /* L110: */ } _starpu_dcopy_(n, &work[1], &c__1, &d__[1], &c__1); _starpu_dlacpy_("A", n, n, &work[*n + 1], n, &q[q_offset], ldq); } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { j = iwork[indxq + i__]; work[i__] = d__[j]; /* L120: */ } _starpu_dcopy_(n, &work[1], &c__1, &d__[1], &c__1); } goto L140; L130: *info = submat * (*n + 1) + submat + matsiz - 1; L140: return 0; /* End of DLAED0 */ } /* _starpu_dlaed0_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed1.c000066400000000000000000000177201413463044200205070ustar00rootroot00000000000000/* dlaed1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dlaed1_(integer *n, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, zpp1, indx, indxc; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer indxp; extern /* Subroutine */ int _starpu_dlaed2_(integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, integer *), _starpu_dlaed3_(integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *); integer idlmda; extern /* Subroutine */ int _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); integer coltyp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED1 computes the updated eigensystem of a diagonal */ /* matrix after modification by a rank-one symmetric matrix. This */ /* routine is used only for the eigenproblem which requires all */ /* eigenvalues and eigenvectors of a tridiagonal matrix. DLAED7 handles */ /* the case in which eigenvalues only or eigenvalues and eigenvectors */ /* of a full symmetric matrix (which was reduced to tridiagonal form) */ /* are desired. */ /* T = Q(in) ( D(in) + RHO * Z*Z' ) Q'(in) = Q(out) * D(out) * Q'(out) */ /* where Z = Q'u, u is a vector of length N with ones in the */ /* CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ /* The eigenvectors of the original matrix are stored in Q, and the */ /* eigenvalues are in D. The algorithm consists of three stages: */ /* The first stage consists of deflating the size of the problem */ /* when there are multiple eigenvalues or if there is a zero in */ /* the Z vector. For each such occurence the dimension of the */ /* secular equation problem is reduced by one. This stage is */ /* performed by the routine DLAED2. */ /* The second stage consists of calculating the updated */ /* eigenvalues. This is done by finding the roots of the secular */ /* equation via the routine DLAED4 (as called by DLAED3). */ /* This routine also calculates the eigenvectors of the current */ /* problem. */ /* The final stage consists of computing the updated eigenvectors */ /* directly using the updated eigenvalues. The eigenvectors for */ /* the current problem are multiplied with the eigenvectors from */ /* the overall problem. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the eigenvalues of the rank-1-perturbed matrix. */ /* On exit, the eigenvalues of the repaired matrix. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, the eigenvectors of the rank-1-perturbed matrix. */ /* On exit, the eigenvectors of the repaired tridiagonal matrix. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* INDXQ (input/output) INTEGER array, dimension (N) */ /* On entry, the permutation which separately sorts the two */ /* subproblems in D into ascending order. */ /* On exit, the permutation which will reintegrate the */ /* subproblems back into sorted order, */ /* i.e. D( INDXQ( I = 1, N ) ) will be in ascending order. */ /* RHO (input) DOUBLE PRECISION */ /* The subdiagonal entry used to create the rank-1 modification. */ /* CUTPNT (input) INTEGER */ /* The location of the last eigenvalue in the leading sub-matrix. */ /* min(1,N) <= CUTPNT <= N/2. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N + N**2) */ /* IWORK (workspace) INTEGER array, dimension (4*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an eigenvalue did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* Modified by Francoise Tisseur, University of Tennessee. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --indxq; --work; --iwork; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*ldq < max(1,*n)) { *info = -4; } else /* if(complicated condition) */ { /* Computing MIN */ i__1 = 1, i__2 = *n / 2; if (min(i__1,i__2) > *cutpnt || *n / 2 < *cutpnt) { *info = -7; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED1", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* The following values are integer pointers which indicate */ /* the portion of the workspace */ /* used by a particular array in DLAED2 and DLAED3. */ iz = 1; idlmda = iz + *n; iw = idlmda + *n; iq2 = iw + *n; indx = 1; indxc = indx + *n; coltyp = indxc + *n; indxp = coltyp + *n; /* Form the z-vector which consists of the last row of Q_1 and the */ /* first row of Q_2. */ _starpu_dcopy_(cutpnt, &q[*cutpnt + q_dim1], ldq, &work[iz], &c__1); zpp1 = *cutpnt + 1; i__1 = *n - *cutpnt; _starpu_dcopy_(&i__1, &q[zpp1 + zpp1 * q_dim1], ldq, &work[iz + *cutpnt], &c__1); /* Deflate eigenvalues. */ _starpu_dlaed2_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, &indxq[1], rho, &work[ iz], &work[idlmda], &work[iw], &work[iq2], &iwork[indx], &iwork[ indxc], &iwork[indxp], &iwork[coltyp], info); if (*info != 0) { goto L20; } /* Solve Secular Equation. */ if (k != 0) { is = (iwork[coltyp] + iwork[coltyp + 1]) * *cutpnt + (iwork[coltyp + 1] + iwork[coltyp + 2]) * (*n - *cutpnt) + iq2; _starpu_dlaed3_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, rho, &work[idlmda], &work[iq2], &iwork[indxc], &iwork[coltyp], &work[iw], &work[ is], info); if (*info != 0) { goto L20; } /* Prepare the INDXQ sorting permutation. */ n1 = k; n2 = *n - k; _starpu_dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indxq[i__] = i__; /* L10: */ } } L20: return 0; /* End of DLAED1 */ } /* _starpu_dlaed1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed2.c000066400000000000000000000360461413463044200205120ustar00rootroot00000000000000/* dlaed2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b3 = -1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlaed2_(integer *k, integer *n, integer *n1, doublereal * d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, integer *indx, integer *indxc, integer *indxp, integer *coltyp, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal c__; integer i__, j; doublereal s, t; integer k2, n2, ct, nj, pj, js, iq1, iq2, n1p1; doublereal eps, tau, tol; integer psm[4], imax, jmax; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer ctot[4]; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED2 merges the two sets of eigenvalues together into a single */ /* sorted set. Then it tries to deflate the size of the problem. */ /* There are two ways in which deflation can occur: when two or more */ /* eigenvalues are close together or if there is a tiny entry in the */ /* Z vector. For each such occurrence the order of the related secular */ /* equation problem is reduced by one. */ /* Arguments */ /* ========= */ /* K (output) INTEGER */ /* The number of non-deflated eigenvalues, and the order of the */ /* related secular equation. 0 <= K <=N. */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* N1 (input) INTEGER */ /* The location of the last eigenvalue in the leading sub-matrix. */ /* min(1,N) <= N1 <= N/2. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, D contains the eigenvalues of the two submatrices to */ /* be combined. */ /* On exit, D contains the trailing (N-K) updated eigenvalues */ /* (those which were deflated) sorted into increasing order. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* On entry, Q contains the eigenvectors of two submatrices in */ /* the two square blocks with corners at (1,1), (N1,N1) */ /* and (N1+1, N1+1), (N,N). */ /* On exit, Q contains the trailing (N-K) updated eigenvectors */ /* (those which were deflated) in its last N-K columns. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* INDXQ (input/output) INTEGER array, dimension (N) */ /* The permutation which separately sorts the two sub-problems */ /* in D into ascending order. Note that elements in the second */ /* half of this permutation must first have N1 added to their */ /* values. Destroyed on exit. */ /* RHO (input/output) DOUBLE PRECISION */ /* On entry, the off-diagonal element associated with the rank-1 */ /* cut which originally split the two submatrices which are now */ /* being recombined. */ /* On exit, RHO has been modified to the value required by */ /* DLAED3. */ /* Z (input) DOUBLE PRECISION array, dimension (N) */ /* On entry, Z contains the updating vector (the last */ /* row of the first sub-eigenvector matrix and the first row of */ /* the second sub-eigenvector matrix). */ /* On exit, the contents of Z have been destroyed by the updating */ /* process. */ /* DLAMDA (output) DOUBLE PRECISION array, dimension (N) */ /* A copy of the first K eigenvalues which will be used by */ /* DLAED3 to form the secular equation. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first k values of the final deflation-altered z-vector */ /* which will be passed to DLAED3. */ /* Q2 (output) DOUBLE PRECISION array, dimension (N1**2+(N-N1)**2) */ /* A copy of the first K eigenvectors which will be used by */ /* DLAED3 in a matrix multiply (DGEMM) to solve for the new */ /* eigenvectors. */ /* INDX (workspace) INTEGER array, dimension (N) */ /* The permutation used to sort the contents of DLAMDA into */ /* ascending order. */ /* INDXC (output) INTEGER array, dimension (N) */ /* The permutation used to arrange the columns of the deflated */ /* Q matrix into three groups: the first group contains non-zero */ /* elements only at and above N1, the second contains */ /* non-zero elements only below N1, and the third is dense. */ /* INDXP (workspace) INTEGER array, dimension (N) */ /* The permutation used to place deflated values of D at the end */ /* of the array. INDXP(1:K) points to the nondeflated D-values */ /* and INDXP(K+1:N) points to the deflated eigenvalues. */ /* COLTYP (workspace/output) INTEGER array, dimension (N) */ /* During execution, a label which will indicate which of the */ /* following types a column in the Q2 matrix is: */ /* 1 : non-zero in the upper half only; */ /* 2 : dense; */ /* 3 : non-zero in the lower half only; */ /* 4 : deflated. */ /* On exit, COLTYP(i) is the number of columns of type i, */ /* for i=1 to 4 only. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* Modified by Francoise Tisseur, University of Tennessee. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --indxq; --z__; --dlamda; --w; --q2; --indx; --indxc; --indxp; --coltyp; /* Function Body */ *info = 0; if (*n < 0) { *info = -2; } else if (*ldq < max(1,*n)) { *info = -6; } else /* if(complicated condition) */ { /* Computing MIN */ i__1 = 1, i__2 = *n / 2; if (min(i__1,i__2) > *n1 || *n / 2 < *n1) { *info = -3; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED2", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } n2 = *n - *n1; n1p1 = *n1 + 1; if (*rho < 0.) { _starpu_dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } /* Normalize z so that norm(z) = 1. Since z is the concatenation of */ /* two normalized vectors, norm2(z) = sqrt(2). */ t = 1. / sqrt(2.); _starpu_dscal_(n, &t, &z__[1], &c__1); /* RHO = ABS( norm(z)**2 * RHO ) */ *rho = (d__1 = *rho * 2., abs(d__1)); /* Sort the eigenvalues into increasing order */ i__1 = *n; for (i__ = n1p1; i__ <= i__1; ++i__) { indxq[i__] += *n1; /* L10: */ } /* re-integrate the deflated parts from the last pass */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = d__[indxq[i__]]; /* L20: */ } _starpu_dlamrg_(n1, &n2, &dlamda[1], &c__1, &c__1, &indxc[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indx[i__] = indxq[indxc[i__]]; /* L30: */ } /* Calculate the allowable deflation tolerance */ imax = _starpu_idamax_(n, &z__[1], &c__1); jmax = _starpu_idamax_(n, &d__[1], &c__1); eps = _starpu_dlamch_("Epsilon"); /* Computing MAX */ d__3 = (d__1 = d__[jmax], abs(d__1)), d__4 = (d__2 = z__[imax], abs(d__2)) ; tol = eps * 8. * max(d__3,d__4); /* If the rank-1 modifier is small enough, no more needs to be done */ /* except to reorganize Q so that its columns correspond with the */ /* elements in D. */ if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { *k = 0; iq2 = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__ = indx[j]; _starpu_dcopy_(n, &q[i__ * q_dim1 + 1], &c__1, &q2[iq2], &c__1); dlamda[j] = d__[i__]; iq2 += *n; /* L40: */ } _starpu_dlacpy_("A", n, n, &q2[1], n, &q[q_offset], ldq); _starpu_dcopy_(n, &dlamda[1], &c__1, &d__[1], &c__1); goto L190; } /* If there are multiple eigenvalues then the problem deflates. Here */ /* the number of equal eigenvalues are found. As each equal */ /* eigenvalue is found, an elementary reflector is computed to rotate */ /* the corresponding eigensubspace so that the corresponding */ /* components of Z are zero in this new basis. */ i__1 = *n1; for (i__ = 1; i__ <= i__1; ++i__) { coltyp[i__] = 1; /* L50: */ } i__1 = *n; for (i__ = n1p1; i__ <= i__1; ++i__) { coltyp[i__] = 3; /* L60: */ } *k = 0; k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { nj = indx[j]; if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; coltyp[nj] = 4; indxp[k2] = nj; if (j == *n) { goto L100; } } else { pj = nj; goto L80; } /* L70: */ } L80: ++j; nj = indx[j]; if (j > *n) { goto L100; } if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; coltyp[nj] = 4; indxp[k2] = nj; } else { /* Check if eigenvalues are close enough to allow deflation. */ s = z__[pj]; c__ = z__[nj]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ tau = _starpu_dlapy2_(&c__, &s); t = d__[nj] - d__[pj]; c__ /= tau; s = -s / tau; if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { /* Deflation is possible. */ z__[nj] = tau; z__[pj] = 0.; if (coltyp[nj] != coltyp[pj]) { coltyp[nj] = 2; } coltyp[pj] = 4; _starpu_drot_(n, &q[pj * q_dim1 + 1], &c__1, &q[nj * q_dim1 + 1], &c__1, & c__, &s); /* Computing 2nd power */ d__1 = c__; /* Computing 2nd power */ d__2 = s; t = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); /* Computing 2nd power */ d__1 = s; /* Computing 2nd power */ d__2 = c__; d__[nj] = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); d__[pj] = t; --k2; i__ = 1; L90: if (k2 + i__ <= *n) { if (d__[pj] < d__[indxp[k2 + i__]]) { indxp[k2 + i__ - 1] = indxp[k2 + i__]; indxp[k2 + i__] = pj; ++i__; goto L90; } else { indxp[k2 + i__ - 1] = pj; } } else { indxp[k2 + i__ - 1] = pj; } pj = nj; } else { ++(*k); dlamda[*k] = d__[pj]; w[*k] = z__[pj]; indxp[*k] = pj; pj = nj; } } goto L80; L100: /* Record the last eigenvalue. */ ++(*k); dlamda[*k] = d__[pj]; w[*k] = z__[pj]; indxp[*k] = pj; /* Count up the total number of the various types of columns, then */ /* form a permutation which positions the four column types into */ /* four uniform groups (although one or more of these groups may be */ /* empty). */ for (j = 1; j <= 4; ++j) { ctot[j - 1] = 0; /* L110: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { ct = coltyp[j]; ++ctot[ct - 1]; /* L120: */ } /* PSM(*) = Position in SubMatrix (of types 1 through 4) */ psm[0] = 1; psm[1] = ctot[0] + 1; psm[2] = psm[1] + ctot[1]; psm[3] = psm[2] + ctot[2]; *k = *n - ctot[3]; /* Fill out the INDXC array so that the permutation which it induces */ /* will place all type-1 columns first, all type-2 columns next, */ /* then all type-3's, and finally all type-4's. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { js = indxp[j]; ct = coltyp[js]; indx[psm[ct - 1]] = js; indxc[psm[ct - 1]] = j; ++psm[ct - 1]; /* L130: */ } /* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ /* and Q2 respectively. The eigenvalues/vectors which were not */ /* deflated go into the first K slots of DLAMDA and Q2 respectively, */ /* while those which were deflated go into the last N - K slots. */ i__ = 1; iq1 = 1; iq2 = (ctot[0] + ctot[1]) * *n1 + 1; i__1 = ctot[0]; for (j = 1; j <= i__1; ++j) { js = indx[i__]; _starpu_dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); z__[i__] = d__[js]; ++i__; iq1 += *n1; /* L140: */ } i__1 = ctot[1]; for (j = 1; j <= i__1; ++j) { js = indx[i__]; _starpu_dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); _starpu_dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); z__[i__] = d__[js]; ++i__; iq1 += *n1; iq2 += n2; /* L150: */ } i__1 = ctot[2]; for (j = 1; j <= i__1; ++j) { js = indx[i__]; _starpu_dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); z__[i__] = d__[js]; ++i__; iq2 += n2; /* L160: */ } iq1 = iq2; i__1 = ctot[3]; for (j = 1; j <= i__1; ++j) { js = indx[i__]; _starpu_dcopy_(n, &q[js * q_dim1 + 1], &c__1, &q2[iq2], &c__1); iq2 += *n; z__[i__] = d__[js]; ++i__; /* L170: */ } /* The deflated eigenvalues and their corresponding vectors go back */ /* into the last N - K slots of D and Q respectively. */ _starpu_dlacpy_("A", n, &ctot[3], &q2[iq1], n, &q[(*k + 1) * q_dim1 + 1], ldq); i__1 = *n - *k; _starpu_dcopy_(&i__1, &z__[*k + 1], &c__1, &d__[*k + 1], &c__1); /* Copy CTOT into COLTYP for referencing in DLAED3. */ for (j = 1; j <= 4; ++j) { coltyp[j] = ctot[j - 1]; /* L180: */ } L190: return 0; /* End of DLAED2 */ } /* _starpu_dlaed2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed3.c000066400000000000000000000252531413463044200205110ustar00rootroot00000000000000/* dlaed3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b22 = 1.; static doublereal c_b23 = 0.; /* Subroutine */ int _starpu_dlaed3_(integer *k, integer *n, integer *n1, doublereal * d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, doublereal *q2, integer *indx, integer *ctot, doublereal *w, doublereal *s, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j, n2, n12, ii, n23, iq2; doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaed4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED3 finds the roots of the secular equation, as defined by the */ /* values in D, W, and RHO, between 1 and K. It makes the */ /* appropriate calls to DLAED4 and then updates the eigenvectors by */ /* multiplying the matrix of eigenvectors of the pair of eigensystems */ /* being combined by the matrix of eigenvectors of the K-by-K system */ /* which is solved here. */ /* This code makes very mild assumptions about floating point */ /* arithmetic. It will work on machines with a guard digit in */ /* add/subtract, or on those binary machines without guard digits */ /* which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ /* It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* K (input) INTEGER */ /* The number of terms in the rational function to be solved by */ /* DLAED4. K >= 0. */ /* N (input) INTEGER */ /* The number of rows and columns in the Q matrix. */ /* N >= K (deflation may result in N>K). */ /* N1 (input) INTEGER */ /* The location of the last eigenvalue in the leading submatrix. */ /* min(1,N) <= N1 <= N/2. */ /* D (output) DOUBLE PRECISION array, dimension (N) */ /* D(I) contains the updated eigenvalues for */ /* 1 <= I <= K. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* Initially the first K columns are used as workspace. */ /* On output the columns 1 to K contain */ /* the updated eigenvectors. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* RHO (input) DOUBLE PRECISION */ /* The value of the parameter in the rank one update equation. */ /* RHO >= 0 required. */ /* DLAMDA (input/output) DOUBLE PRECISION array, dimension (K) */ /* The first K elements of this array contain the old roots */ /* of the deflated updating problem. These are the poles */ /* of the secular equation. May be changed on output by */ /* having lowest order bit set to zero on Cray X-MP, Cray Y-MP, */ /* Cray-2, or Cray C-90, as described above. */ /* Q2 (input) DOUBLE PRECISION array, dimension (LDQ2, N) */ /* The first K columns of this matrix contain the non-deflated */ /* eigenvectors for the split problem. */ /* INDX (input) INTEGER array, dimension (N) */ /* The permutation used to arrange the columns of the deflated */ /* Q matrix into three groups (see DLAED2). */ /* The rows of the eigenvectors found by DLAED4 must be likewise */ /* permuted before the matrix multiply can take place. */ /* CTOT (input) INTEGER array, dimension (4) */ /* A count of the total number of the various types of columns */ /* in Q, as described in INDX. The fourth column type is any */ /* column which has been deflated. */ /* W (input/output) DOUBLE PRECISION array, dimension (K) */ /* The first K elements of this array contain the components */ /* of the deflation-adjusted updating vector. Destroyed on */ /* output. */ /* S (workspace) DOUBLE PRECISION array, dimension (N1 + 1)*K */ /* Will contain the eigenvectors of the repaired matrix which */ /* will be multiplied by the previously accumulated eigenvectors */ /* to update the system. */ /* LDS (input) INTEGER */ /* The leading dimension of S. LDS >= max(1,K). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an eigenvalue did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* Modified by Francoise Tisseur, University of Tennessee. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --dlamda; --q2; --indx; --ctot; --w; --s; /* Function Body */ *info = 0; if (*k < 0) { *info = -1; } else if (*n < *k) { *info = -2; } else if (*ldq < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED3", &i__1); return 0; } /* Quick return if possible */ if (*k == 0) { return 0; } /* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ /* be computed with high relative accuracy (barring over/underflow). */ /* This is a problem on machines without a guard digit in */ /* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ /* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ /* which on any of these machines zeros out the bottommost */ /* bit of DLAMDA(I) if it is 1; this makes the subsequent */ /* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ /* occurs. On binary machines with a guard digit (almost all */ /* machines) it does not change DLAMDA(I) at all. On hexadecimal */ /* and decimal machines with a guard digit, it slightly */ /* changes the bottommost bits of DLAMDA(I). It does not account */ /* for hexadecimal or decimal machines without guard digits */ /* (we know of none). We use a subroutine call to compute */ /* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ /* this code. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = _starpu_dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; /* L10: */ } i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], info); /* If the zero finder fails, the computation is terminated. */ if (*info != 0) { goto L120; } /* L20: */ } if (*k == 1) { goto L110; } if (*k == 2) { i__1 = *k; for (j = 1; j <= i__1; ++j) { w[1] = q[j * q_dim1 + 1]; w[2] = q[j * q_dim1 + 2]; ii = indx[1]; q[j * q_dim1 + 1] = w[ii]; ii = indx[2]; q[j * q_dim1 + 2] = w[ii]; /* L30: */ } goto L110; } /* Compute updated W. */ _starpu_dcopy_(k, &w[1], &c__1, &s[1], &c__1); /* Initialize W(I) = Q(I,I) */ i__1 = *ldq + 1; _starpu_dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L40: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L50: */ } /* L60: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = sqrt(-w[i__]); w[i__] = d_sign(&d__1, &s[i__]); /* L70: */ } /* Compute eigenvectors of the modified rank-1 modification. */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { s[i__] = w[i__] / q[i__ + j * q_dim1]; /* L80: */ } temp = _starpu_dnrm2_(k, &s[1], &c__1); i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { ii = indx[i__]; q[i__ + j * q_dim1] = s[ii] / temp; /* L90: */ } /* L100: */ } /* Compute the updated eigenvectors. */ L110: n2 = *n - *n1; n12 = ctot[1] + ctot[2]; n23 = ctot[2] + ctot[3]; _starpu_dlacpy_("A", &n23, k, &q[ctot[1] + 1 + q_dim1], ldq, &s[1], &n23); iq2 = *n1 * n12 + 1; if (n23 != 0) { _starpu_dgemm_("N", "N", &n2, k, &n23, &c_b22, &q2[iq2], &n2, &s[1], &n23, & c_b23, &q[*n1 + 1 + q_dim1], ldq); } else { _starpu_dlaset_("A", &n2, k, &c_b23, &c_b23, &q[*n1 + 1 + q_dim1], ldq); } _starpu_dlacpy_("A", &n12, k, &q[q_offset], ldq, &s[1], &n12); if (n12 != 0) { _starpu_dgemm_("N", "N", n1, k, &n12, &c_b22, &q2[1], n1, &s[1], &n12, &c_b23, &q[q_offset], ldq); } else { _starpu_dlaset_("A", n1, k, &c_b23, &c_b23, &q[q_dim1 + 1], ldq); } L120: return 0; /* End of DLAED3 */ } /* _starpu_dlaed3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed4.c000066400000000000000000000534431413463044200205140ustar00rootroot00000000000000/* dlaed4.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaed4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal a, b, c__; integer j; doublereal w; integer ii; doublereal dw, zz[3]; integer ip1; doublereal del, eta, phi, eps, tau, psi; integer iim1, iip1; doublereal dphi, dpsi; integer iter; doublereal temp, prew, temp1, dltlb, dltub, midpt; integer niter; logical swtch; extern /* Subroutine */ int _starpu_dlaed5_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaed6_(integer *, logical *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); logical swtch3; extern doublereal _starpu_dlamch_(char *); logical orgati; doublereal erretm, rhoinv; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine computes the I-th updated eigenvalue of a symmetric */ /* rank-one modification to a diagonal matrix whose elements are */ /* given in the array d, and that */ /* D(i) < D(j) for i < j */ /* and that RHO > 0. This is arranged by the calling routine, and is */ /* no loss in generality. The rank-one modified system is thus */ /* diag( D ) + RHO * Z * Z_transpose. */ /* where we assume the Euclidean norm of Z is 1. */ /* The method consists of approximating the rational functions in the */ /* secular equation by simpler interpolating rational functions. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The length of all arrays. */ /* I (input) INTEGER */ /* The index of the eigenvalue to be computed. 1 <= I <= N. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The original eigenvalues. It is assumed that they are in */ /* order, D(I) < D(J) for I < J. */ /* Z (input) DOUBLE PRECISION array, dimension (N) */ /* The components of the updating vector. */ /* DELTA (output) DOUBLE PRECISION array, dimension (N) */ /* If N .GT. 2, DELTA contains (D(j) - lambda_I) in its j-th */ /* component. If N = 1, then DELTA(1) = 1. If N = 2, see DLAED5 */ /* for detail. The vector DELTA contains the information necessary */ /* to construct the eigenvectors by DLAED3 and DLAED9. */ /* RHO (input) DOUBLE PRECISION */ /* The scalar in the symmetric updating formula. */ /* DLAM (output) DOUBLE PRECISION */ /* The computed lambda_I, the I-th updated eigenvalue. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: if INFO = 1, the updating process failed. */ /* Internal Parameters */ /* =================== */ /* Logical variable ORGATI (origin-at-i?) is used for distinguishing */ /* whether D(i) or D(i+1) is treated as the origin. */ /* ORGATI = .true. origin at i */ /* ORGATI = .false. origin at i+1 */ /* Logical variable SWTCH3 (switch-for-3-poles?) is for noting */ /* if we are working with THREE poles! */ /* MAXIT is the maximum number of iterations allowed for each */ /* eigenvalue. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ren-Cang Li, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Since this routine is called in an inner loop, we do no argument */ /* checking. */ /* Quick return for N=1 and 2. */ /* Parameter adjustments */ --delta; --z__; --d__; /* Function Body */ *info = 0; if (*n == 1) { /* Presumably, I=1 upon entry */ *dlam = d__[1] + *rho * z__[1] * z__[1]; delta[1] = 1.; return 0; } if (*n == 2) { _starpu_dlaed5_(i__, &d__[1], &z__[1], &delta[1], rho, dlam); return 0; } /* Compute machine epsilon */ eps = _starpu_dlamch_("Epsilon"); rhoinv = 1. / *rho; /* The case I = N */ if (*i__ == *n) { /* Initialize some basic variables */ ii = *n - 1; niter = 1; /* Calculate initial guess */ midpt = *rho / 2.; /* If ||Z||_2 is not one, then TEMP should be set to */ /* RHO * ||Z||_2^2 / TWO */ i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - midpt; /* L10: */ } psi = 0.; i__1 = *n - 2; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / delta[j]; /* L20: */ } c__ = rhoinv + psi; w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[* n]; if (w <= 0.) { temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) + z__[*n] * z__[*n] / *rho; if (c__ <= temp) { tau = *rho; } else { del = d__[*n] - d__[*n - 1]; a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n] ; b = z__[*n] * z__[*n] * del; if (a < 0.) { tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); } else { tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } } /* It can be proved that */ /* D(N)+RHO/2 <= LAMBDA(N) < D(N)+TAU <= D(N)+RHO */ dltlb = midpt; dltub = *rho; } else { del = d__[*n] - d__[*n - 1]; a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; b = z__[*n] * z__[*n] * del; if (a < 0.) { tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); } else { tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } /* It can be proved that */ /* D(N) < D(N)+TAU < LAMBDA(N) < D(N)+RHO/2 */ dltlb = 0.; dltub = midpt; } i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - tau; /* L30: */ } /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = ii; for (j = 1; j <= i__1; ++j) { temp = z__[j] / delta[j]; psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L40: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ temp = z__[*n] / delta[*n]; phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; /* Test for convergence */ if (abs(w) <= eps * erretm) { *dlam = d__[*i__] + tau; goto L250; } if (w <= 0.) { dltlb = max(dltlb,tau); } else { dltub = min(dltub,tau); } /* Calculate the new step */ ++niter; c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * ( dpsi + dphi); b = delta[*n - 1] * delta[*n] * w; if (c__ < 0.) { c__ = abs(c__); } if (c__ == 0.) { /* ETA = B/A */ /* ETA = RHO - TAU */ eta = dltub - tau; } else if (a >= 0.) { eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) ); } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta > 0.) { eta = -w / (dpsi + dphi); } temp = tau + eta; if (temp > dltub || temp < dltlb) { if (w < 0.) { eta = (dltub - tau) / 2.; } else { eta = (dltlb - tau) / 2.; } } i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; /* L50: */ } tau += eta; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = ii; for (j = 1; j <= i__1; ++j) { temp = z__[j] / delta[j]; psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L60: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ temp = z__[*n] / delta[*n]; phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; /* Main loop to update the values of the array DELTA */ iter = niter + 1; for (niter = iter; niter <= 30; ++niter) { /* Test for convergence */ if (abs(w) <= eps * erretm) { *dlam = d__[*i__] + tau; goto L250; } if (w <= 0.) { dltlb = max(dltlb,tau); } else { dltub = min(dltub,tau); } /* Calculate the new step */ c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * (dpsi + dphi); b = delta[*n - 1] * delta[*n] * w; if (a >= 0.) { eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } else { eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( d__1)))); } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta > 0.) { eta = -w / (dpsi + dphi); } temp = tau + eta; if (temp > dltub || temp < dltlb) { if (w < 0.) { eta = (dltub - tau) / 2.; } else { eta = (dltlb - tau) / 2.; } } i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; /* L70: */ } tau += eta; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = ii; for (j = 1; j <= i__1; ++j) { temp = z__[j] / delta[j]; psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L80: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ temp = z__[*n] / delta[*n]; phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * ( dpsi + dphi); w = rhoinv + phi + psi; /* L90: */ } /* Return with INFO = 1, NITER = MAXIT and not converged */ *info = 1; *dlam = d__[*i__] + tau; goto L250; /* End for the case I = N */ } else { /* The case for I < N */ niter = 1; ip1 = *i__ + 1; /* Calculate initial guess */ del = d__[ip1] - d__[*i__]; midpt = del / 2.; i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - midpt; /* L100: */ } psi = 0.; i__1 = *i__ - 1; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / delta[j]; /* L110: */ } phi = 0.; i__1 = *i__ + 2; for (j = *n; j >= i__1; --j) { phi += z__[j] * z__[j] / delta[j]; /* L120: */ } c__ = rhoinv + psi + phi; w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / delta[ip1]; if (w > 0.) { /* d(i)< the ith eigenvalue < (d(i)+d(i+1))/2 */ /* We choose d(i) as origin. */ orgati = TRUE_; a = c__ * del + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; b = z__[*i__] * z__[*i__] * del; if (a > 0.) { tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( d__1)))); } else { tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } dltlb = 0.; dltub = midpt; } else { /* (d(i)+d(i+1))/2 <= the ith eigenvalue < d(i+1) */ /* We choose d(i+1) as origin. */ orgati = FALSE_; a = c__ * del - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; b = z__[ip1] * z__[ip1] * del; if (a < 0.) { tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( d__1)))); } else { tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / (c__ * 2.); } dltlb = -midpt; dltub = 0.; } if (orgati) { i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - tau; /* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[ip1] - tau; /* L140: */ } } if (orgati) { ii = *i__; } else { ii = *i__ + 1; } iim1 = ii - 1; iip1 = ii + 1; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = iim1; for (j = 1; j <= i__1; ++j) { temp = z__[j] / delta[j]; psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L150: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ dphi = 0.; phi = 0.; i__1 = iip1; for (j = *n; j >= i__1; --j) { temp = z__[j] / delta[j]; phi += z__[j] * temp; dphi += temp * temp; erretm += phi; /* L160: */ } w = rhoinv + phi + psi; /* W is the value of the secular function with */ /* its ii-th element removed. */ swtch3 = FALSE_; if (orgati) { if (w < 0.) { swtch3 = TRUE_; } } else { if (w > 0.) { swtch3 = TRUE_; } } if (ii == 1 || ii == *n) { swtch3 = FALSE_; } temp = z__[ii] / delta[ii]; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w += temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; /* Test for convergence */ if (abs(w) <= eps * erretm) { if (orgati) { *dlam = d__[*i__] + tau; } else { *dlam = d__[ip1] + tau; } goto L250; } if (w <= 0.) { dltlb = max(dltlb,tau); } else { dltub = min(dltub,tau); } /* Calculate the new step */ ++niter; if (! swtch3) { if (orgati) { /* Computing 2nd power */ d__1 = z__[*i__] / delta[*i__]; c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * d__1); } else { /* Computing 2nd power */ d__1 = z__[ip1] / delta[ip1]; c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * d__1); } a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * dw; b = delta[*i__] * delta[ip1] * w; if (c__ == 0.) { if (a == 0.) { if (orgati) { a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * (dpsi + dphi); } else { a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * (dpsi + dphi); } } eta = b / a; } else if (a <= 0.) { eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } else { eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( d__1)))); } } else { /* Interpolation using THREE most relevant poles */ temp = rhoinv + psi + phi; if (orgati) { temp1 = z__[iim1] / delta[iim1]; temp1 *= temp1; c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[ iip1]) * temp1; zz[0] = z__[iim1] * z__[iim1]; zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); } else { temp1 = z__[iip1] / delta[iip1]; temp1 *= temp1; c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[ iim1]) * temp1; zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); zz[2] = z__[iip1] * z__[iip1]; } zz[1] = z__[ii] * z__[ii]; _starpu_dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info); if (*info != 0) { goto L250; } } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta >= 0.) { eta = -w / dw; } temp = tau + eta; if (temp > dltub || temp < dltlb) { if (w < 0.) { eta = (dltub - tau) / 2.; } else { eta = (dltlb - tau) / 2.; } } prew = w; i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; /* L180: */ } /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = iim1; for (j = 1; j <= i__1; ++j) { temp = z__[j] / delta[j]; psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L190: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ dphi = 0.; phi = 0.; i__1 = iip1; for (j = *n; j >= i__1; --j) { temp = z__[j] / delta[j]; phi += z__[j] * temp; dphi += temp * temp; erretm += phi; /* L200: */ } temp = z__[ii] / delta[ii]; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + ( d__1 = tau + eta, abs(d__1)) * dw; swtch = FALSE_; if (orgati) { if (-w > abs(prew) / 10.) { swtch = TRUE_; } } else { if (w > abs(prew) / 10.) { swtch = TRUE_; } } tau += eta; /* Main loop to update the values of the array DELTA */ iter = niter + 1; for (niter = iter; niter <= 30; ++niter) { /* Test for convergence */ if (abs(w) <= eps * erretm) { if (orgati) { *dlam = d__[*i__] + tau; } else { *dlam = d__[ip1] + tau; } goto L250; } if (w <= 0.) { dltlb = max(dltlb,tau); } else { dltub = min(dltub,tau); } /* Calculate the new step */ if (! swtch3) { if (! swtch) { if (orgati) { /* Computing 2nd power */ d__1 = z__[*i__] / delta[*i__]; c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * ( d__1 * d__1); } else { /* Computing 2nd power */ d__1 = z__[ip1] / delta[ip1]; c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * d__1); } } else { temp = z__[ii] / delta[ii]; if (orgati) { dpsi += temp * temp; } else { dphi += temp * temp; } c__ = w - delta[*i__] * dpsi - delta[ip1] * dphi; } a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * dw; b = delta[*i__] * delta[ip1] * w; if (c__ == 0.) { if (a == 0.) { if (! swtch) { if (orgati) { a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * (dpsi + dphi); } else { a = z__[ip1] * z__[ip1] + delta[*i__] * delta[ *i__] * (dpsi + dphi); } } else { a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] * delta[ip1] * dphi; } } eta = b / a; } else if (a <= 0.) { eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } else { /* Interpolation using THREE most relevant poles */ temp = rhoinv + psi + phi; if (swtch) { c__ = temp - delta[iim1] * dpsi - delta[iip1] * dphi; zz[0] = delta[iim1] * delta[iim1] * dpsi; zz[2] = delta[iip1] * delta[iip1] * dphi; } else { if (orgati) { temp1 = z__[iim1] / delta[iim1]; temp1 *= temp1; c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * temp1; zz[0] = z__[iim1] * z__[iim1]; zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); } else { temp1 = z__[iip1] / delta[iip1]; temp1 *= temp1; c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * temp1; zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); zz[2] = z__[iip1] * z__[iip1]; } } _starpu_dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info); if (*info != 0) { goto L250; } } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta >= 0.) { eta = -w / dw; } temp = tau + eta; if (temp > dltub || temp < dltlb) { if (w < 0.) { eta = (dltub - tau) / 2.; } else { eta = (dltlb - tau) / 2.; } } i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; /* L210: */ } tau += eta; prew = w; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = iim1; for (j = 1; j <= i__1; ++j) { temp = z__[j] / delta[j]; psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L220: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ dphi = 0.; phi = 0.; i__1 = iip1; for (j = *n; j >= i__1; --j) { temp = z__[j] / delta[j]; phi += z__[j] * temp; dphi += temp * temp; erretm += phi; /* L230: */ } temp = z__[ii] / delta[ii]; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; if (w * prew > 0. && abs(w) > abs(prew) / 10.) { swtch = ! swtch; } /* L240: */ } /* Return with INFO = 1, NITER = MAXIT and not converged */ *info = 1; if (orgati) { *dlam = d__[*i__] + tau; } else { *dlam = d__[ip1] + tau; } } L250: return 0; /* End of DLAED4 */ } /* _starpu_dlaed4_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed5.c000066400000000000000000000100511413463044200205010ustar00rootroot00000000000000/* dlaed5.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaed5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam) { /* System generated locals */ doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal b, c__, w, del, tau, temp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine computes the I-th eigenvalue of a symmetric rank-one */ /* modification of a 2-by-2 diagonal matrix */ /* diag( D ) + RHO * Z * transpose(Z) . */ /* The diagonal elements in the array D are assumed to satisfy */ /* D(i) < D(j) for i < j . */ /* We also assume RHO > 0 and that the Euclidean norm of the vector */ /* Z is one. */ /* Arguments */ /* ========= */ /* I (input) INTEGER */ /* The index of the eigenvalue to be computed. I = 1 or I = 2. */ /* D (input) DOUBLE PRECISION array, dimension (2) */ /* The original eigenvalues. We assume D(1) < D(2). */ /* Z (input) DOUBLE PRECISION array, dimension (2) */ /* The components of the updating vector. */ /* DELTA (output) DOUBLE PRECISION array, dimension (2) */ /* The vector DELTA contains the information necessary */ /* to construct the eigenvectors. */ /* RHO (input) DOUBLE PRECISION */ /* The scalar in the symmetric updating formula. */ /* DLAM (output) DOUBLE PRECISION */ /* The computed lambda_I, the I-th updated eigenvalue. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ren-Cang Li, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --delta; --z__; --d__; /* Function Body */ del = d__[2] - d__[1]; if (*i__ == 1) { w = *rho * 2. * (z__[2] * z__[2] - z__[1] * z__[1]) / del + 1.; if (w > 0.) { b = del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[1] * z__[1] * del; /* B > ZERO, always */ tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); *dlam = d__[1] + tau; delta[1] = -z__[1] / tau; delta[2] = z__[2] / (del - tau); } else { b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * del; if (b > 0.) { tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); } else { tau = (b - sqrt(b * b + c__ * 4.)) / 2.; } *dlam = d__[2] + tau; delta[1] = -z__[1] / (del + tau); delta[2] = -z__[2] / tau; } temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); delta[1] /= temp; delta[2] /= temp; } else { /* Now I=2 */ b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * del; if (b > 0.) { tau = (b + sqrt(b * b + c__ * 4.)) / 2.; } else { tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); } *dlam = d__[2] + tau; delta[1] = -z__[1] / (del + tau); delta[2] = -z__[2] / tau; temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); delta[1] /= temp; delta[2] /= temp; } return 0; /* End OF DLAED5 */ } /* _starpu_dlaed5_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed6.c000066400000000000000000000230101413463044200205010ustar00rootroot00000000000000/* dlaed6.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaed6_(integer *kniter, logical *orgati, doublereal * rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * tau, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal), log(doublereal), pow_di(doublereal *, integer *); /* Local variables */ doublereal a, b, c__, f; integer i__; doublereal fc, df, ddf, lbd, eta, ubd, eps, base; integer iter; doublereal temp, temp1, temp2, temp3, temp4; logical scale; integer niter; doublereal small1, small2, sminv1, sminv2; extern doublereal _starpu_dlamch_(char *); doublereal dscale[3], sclfac, zscale[3], erretm, sclinv; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* February 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED6 computes the positive or negative root (closest to the origin) */ /* of */ /* z(1) z(2) z(3) */ /* f(x) = rho + --------- + ---------- + --------- */ /* d(1)-x d(2)-x d(3)-x */ /* It is assumed that */ /* if ORGATI = .true. the root is between d(2) and d(3); */ /* otherwise it is between d(1) and d(2) */ /* This routine will be called by DLAED4 when necessary. In most cases, */ /* the root sought is the smallest in magnitude, though it might not be */ /* in some extremely rare situations. */ /* Arguments */ /* ========= */ /* KNITER (input) INTEGER */ /* Refer to DLAED4 for its significance. */ /* ORGATI (input) LOGICAL */ /* If ORGATI is true, the needed root is between d(2) and */ /* d(3); otherwise it is between d(1) and d(2). See */ /* DLAED4 for further details. */ /* RHO (input) DOUBLE PRECISION */ /* Refer to the equation f(x) above. */ /* D (input) DOUBLE PRECISION array, dimension (3) */ /* D satisfies d(1) < d(2) < d(3). */ /* Z (input) DOUBLE PRECISION array, dimension (3) */ /* Each of the elements in z must be positive. */ /* FINIT (input) DOUBLE PRECISION */ /* The value of f at 0. It is more accurate than the one */ /* evaluated inside this routine (if someone wants to do */ /* so). */ /* TAU (output) DOUBLE PRECISION */ /* The root of the equation f(x). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: if INFO = 1, failure to converge */ /* Further Details */ /* =============== */ /* 30/06/99: Based on contributions by */ /* Ren-Cang Li, Computer Science Division, University of California */ /* at Berkeley, USA */ /* 10/02/03: This version has a few statements commented out for thread */ /* safety (machine parameters are computed on each entry). SJH. */ /* 05/10/06: Modified from a new version of Ren-Cang Li, use */ /* Gragg-Thornton-Warner cubic convergent scheme for better stability. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --z__; --d__; /* Function Body */ *info = 0; if (*orgati) { lbd = d__[2]; ubd = d__[3]; } else { lbd = d__[1]; ubd = d__[2]; } if (*finit < 0.) { lbd = 0.; } else { ubd = 0.; } niter = 1; *tau = 0.; if (*kniter == 2) { if (*orgati) { temp = (d__[3] - d__[2]) / 2.; c__ = *rho + z__[1] / (d__[1] - d__[2] - temp); a = c__ * (d__[2] + d__[3]) + z__[2] + z__[3]; b = c__ * d__[2] * d__[3] + z__[2] * d__[3] + z__[3] * d__[2]; } else { temp = (d__[1] - d__[2]) / 2.; c__ = *rho + z__[3] / (d__[3] - d__[2] - temp); a = c__ * (d__[1] + d__[2]) + z__[1] + z__[2]; b = c__ * d__[1] * d__[2] + z__[1] * d__[2] + z__[2] * d__[1]; } /* Computing MAX */ d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); temp = max(d__1,d__2); a /= temp; b /= temp; c__ /= temp; if (c__ == 0.) { *tau = b / a; } else if (a <= 0.) { *tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } else { *tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)) )); } if (*tau < lbd || *tau > ubd) { *tau = (lbd + ubd) / 2.; } if (d__[1] == *tau || d__[2] == *tau || d__[3] == *tau) { *tau = 0.; } else { temp = *finit + *tau * z__[1] / (d__[1] * (d__[1] - *tau)) + *tau * z__[2] / (d__[2] * (d__[2] - *tau)) + *tau * z__[3] / ( d__[3] * (d__[3] - *tau)); if (temp <= 0.) { lbd = *tau; } else { ubd = *tau; } if (abs(*finit) <= abs(temp)) { *tau = 0.; } } } /* get machine parameters for possible scaling to avoid overflow */ /* modified by Sven: parameters SMALL1, SMINV1, SMALL2, */ /* SMINV2, EPS are not SAVEd anymore between one call to the */ /* others but recomputed at each call */ eps = _starpu_dlamch_("Epsilon"); base = _starpu_dlamch_("Base"); i__1 = (integer) (log(_starpu_dlamch_("SafMin")) / log(base) / 3.); small1 = pow_di(&base, &i__1); sminv1 = 1. / small1; small2 = small1 * small1; sminv2 = sminv1 * sminv1; /* Determine if scaling of inputs necessary to avoid overflow */ /* when computing 1/TEMP**3 */ if (*orgati) { /* Computing MIN */ d__3 = (d__1 = d__[2] - *tau, abs(d__1)), d__4 = (d__2 = d__[3] - * tau, abs(d__2)); temp = min(d__3,d__4); } else { /* Computing MIN */ d__3 = (d__1 = d__[1] - *tau, abs(d__1)), d__4 = (d__2 = d__[2] - * tau, abs(d__2)); temp = min(d__3,d__4); } scale = FALSE_; if (temp <= small1) { scale = TRUE_; if (temp <= small2) { /* Scale up by power of radix nearest 1/SAFMIN**(2/3) */ sclfac = sminv2; sclinv = small2; } else { /* Scale up by power of radix nearest 1/SAFMIN**(1/3) */ sclfac = sminv1; sclinv = small1; } /* Scaling up safe because D, Z, TAU scaled elsewhere to be O(1) */ for (i__ = 1; i__ <= 3; ++i__) { dscale[i__ - 1] = d__[i__] * sclfac; zscale[i__ - 1] = z__[i__] * sclfac; /* L10: */ } *tau *= sclfac; lbd *= sclfac; ubd *= sclfac; } else { /* Copy D and Z to DSCALE and ZSCALE */ for (i__ = 1; i__ <= 3; ++i__) { dscale[i__ - 1] = d__[i__]; zscale[i__ - 1] = z__[i__]; /* L20: */ } } fc = 0.; df = 0.; ddf = 0.; for (i__ = 1; i__ <= 3; ++i__) { temp = 1. / (dscale[i__ - 1] - *tau); temp1 = zscale[i__ - 1] * temp; temp2 = temp1 * temp; temp3 = temp2 * temp; fc += temp1 / dscale[i__ - 1]; df += temp2; ddf += temp3; /* L30: */ } f = *finit + *tau * fc; if (abs(f) <= 0.) { goto L60; } if (f <= 0.) { lbd = *tau; } else { ubd = *tau; } /* Iteration begins -- Use Gragg-Thornton-Warner cubic convergent */ /* scheme */ /* It is not hard to see that */ /* 1) Iterations will go up monotonically */ /* if FINIT < 0; */ /* 2) Iterations will go down monotonically */ /* if FINIT > 0. */ iter = niter + 1; for (niter = iter; niter <= 40; ++niter) { if (*orgati) { temp1 = dscale[1] - *tau; temp2 = dscale[2] - *tau; } else { temp1 = dscale[0] - *tau; temp2 = dscale[1] - *tau; } a = (temp1 + temp2) * f - temp1 * temp2 * df; b = temp1 * temp2 * f; c__ = f - (temp1 + temp2) * df + temp1 * temp2 * ddf; /* Computing MAX */ d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); temp = max(d__1,d__2); a /= temp; b /= temp; c__ /= temp; if (c__ == 0.) { eta = b / a; } else if (a <= 0.) { eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) ); } if (f * eta >= 0.) { eta = -f / df; } *tau += eta; if (*tau < lbd || *tau > ubd) { *tau = (lbd + ubd) / 2.; } fc = 0.; erretm = 0.; df = 0.; ddf = 0.; for (i__ = 1; i__ <= 3; ++i__) { temp = 1. / (dscale[i__ - 1] - *tau); temp1 = zscale[i__ - 1] * temp; temp2 = temp1 * temp; temp3 = temp2 * temp; temp4 = temp1 / dscale[i__ - 1]; fc += temp4; erretm += abs(temp4); df += temp2; ddf += temp3; /* L40: */ } f = *finit + *tau * fc; erretm = (abs(*finit) + abs(*tau) * erretm) * 8. + abs(*tau) * df; if (abs(f) <= eps * erretm) { goto L60; } if (f <= 0.) { lbd = *tau; } else { ubd = *tau; } /* L50: */ } *info = 1; L60: /* Undo scaling */ if (scale) { *tau *= sclinv; } return 0; /* End of DLAED6 */ } /* _starpu_dlaed6_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed7.c000066400000000000000000000300201413463044200205010ustar00rootroot00000000000000/* dlaed7.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__2 = 2; static integer c__1 = 1; static doublereal c_b10 = 1.; static doublereal c_b11 = 0.; static integer c_n1 = -1; /* Subroutine */ int _starpu_dlaed7_(integer *icompq, integer *n, integer *qsiz, integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; /* Builtin functions */ integer pow_ii(integer *, integer *); /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, ptr, ldq2, indx, curr; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer indxc, indxp; extern /* Subroutine */ int _starpu_dlaed8_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dlaed9_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlaeda_(integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *) ; integer idlmda; extern /* Subroutine */ int _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); integer coltyp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED7 computes the updated eigensystem of a diagonal */ /* matrix after modification by a rank-one symmetric matrix. This */ /* routine is used only for the eigenproblem which requires all */ /* eigenvalues and optionally eigenvectors of a dense symmetric matrix */ /* that has been reduced to tridiagonal form. DLAED1 handles */ /* the case in which all eigenvalues and eigenvectors of a symmetric */ /* tridiagonal matrix are desired. */ /* T = Q(in) ( D(in) + RHO * Z*Z' ) Q'(in) = Q(out) * D(out) * Q'(out) */ /* where Z = Q'u, u is a vector of length N with ones in the */ /* CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ /* The eigenvectors of the original matrix are stored in Q, and the */ /* eigenvalues are in D. The algorithm consists of three stages: */ /* The first stage consists of deflating the size of the problem */ /* when there are multiple eigenvalues or if there is a zero in */ /* the Z vector. For each such occurence the dimension of the */ /* secular equation problem is reduced by one. This stage is */ /* performed by the routine DLAED8. */ /* The second stage consists of calculating the updated */ /* eigenvalues. This is done by finding the roots of the secular */ /* equation via the routine DLAED4 (as called by DLAED9). */ /* This routine also calculates the eigenvectors of the current */ /* problem. */ /* The final stage consists of computing the updated eigenvectors */ /* directly using the updated eigenvalues. The eigenvectors for */ /* the current problem are multiplied with the eigenvectors from */ /* the overall problem. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* = 0: Compute eigenvalues only. */ /* = 1: Compute eigenvectors of original dense symmetric matrix */ /* also. On entry, Q contains the orthogonal matrix used */ /* to reduce the original matrix to tridiagonal form. */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* QSIZ (input) INTEGER */ /* The dimension of the orthogonal matrix used to reduce */ /* the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ /* TLVLS (input) INTEGER */ /* The total number of merging levels in the overall divide and */ /* conquer tree. */ /* CURLVL (input) INTEGER */ /* The current level in the overall merge routine, */ /* 0 <= CURLVL <= TLVLS. */ /* CURPBM (input) INTEGER */ /* The current problem in the current level in the overall */ /* merge routine (counting from upper left to lower right). */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the eigenvalues of the rank-1-perturbed matrix. */ /* On exit, the eigenvalues of the repaired matrix. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* On entry, the eigenvectors of the rank-1-perturbed matrix. */ /* On exit, the eigenvectors of the repaired tridiagonal matrix. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* INDXQ (output) INTEGER array, dimension (N) */ /* The permutation which will reintegrate the subproblem just */ /* solved back into sorted order, i.e., D( INDXQ( I = 1, N ) ) */ /* will be in ascending order. */ /* RHO (input) DOUBLE PRECISION */ /* The subdiagonal element used to create the rank-1 */ /* modification. */ /* CUTPNT (input) INTEGER */ /* Contains the location of the last eigenvalue in the leading */ /* sub-matrix. min(1,N) <= CUTPNT <= N. */ /* QSTORE (input/output) DOUBLE PRECISION array, dimension (N**2+1) */ /* Stores eigenvectors of submatrices encountered during */ /* divide and conquer, packed together. QPTR points to */ /* beginning of the submatrices. */ /* QPTR (input/output) INTEGER array, dimension (N+2) */ /* List of indices pointing to beginning of submatrices stored */ /* in QSTORE. The submatrices are numbered starting at the */ /* bottom left of the divide and conquer tree, from left to */ /* right and bottom to top. */ /* PRMPTR (input) INTEGER array, dimension (N lg N) */ /* Contains a list of pointers which indicate where in PERM a */ /* level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ /* indicates the size of the permutation and also the size of */ /* the full, non-deflated problem. */ /* PERM (input) INTEGER array, dimension (N lg N) */ /* Contains the permutations (from deflation and sorting) to be */ /* applied to each eigenblock. */ /* GIVPTR (input) INTEGER array, dimension (N lg N) */ /* Contains a list of pointers which indicate where in GIVCOL a */ /* level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ /* indicates the number of Givens rotations. */ /* GIVCOL (input) INTEGER array, dimension (2, N lg N) */ /* Each pair of numbers indicates a pair of columns to take place */ /* in a Givens rotation. */ /* GIVNUM (input) DOUBLE PRECISION array, dimension (2, N lg N) */ /* Each number indicates the S value to be used in the */ /* corresponding Givens rotation. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N+QSIZ*N) */ /* IWORK (workspace) INTEGER array, dimension (4*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an eigenvalue did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --indxq; --qstore; --qptr; --prmptr; --perm; --givptr; givcol -= 3; givnum -= 3; --work; --iwork; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*icompq == 1 && *qsiz < *n) { *info = -4; } else if (*ldq < max(1,*n)) { *info = -9; } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED7", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* The following values are for bookkeeping purposes only. They are */ /* integer pointers which indicate the portion of the workspace */ /* used by a particular array in DLAED8 and DLAED9. */ if (*icompq == 1) { ldq2 = *qsiz; } else { ldq2 = *n; } iz = 1; idlmda = iz + *n; iw = idlmda + *n; iq2 = iw + *n; is = iq2 + *n * ldq2; indx = 1; indxc = indx + *n; coltyp = indxc + *n; indxp = coltyp + *n; /* Form the z-vector which consists of the last row of Q_1 and the */ /* first row of Q_2. */ ptr = pow_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *tlvls - i__; ptr += pow_ii(&c__2, &i__2); /* L10: */ } curr = ptr + *curpbm; _starpu_dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & givcol[3], &givnum[3], &qstore[1], &qptr[1], &work[iz], &work[iz + *n], info); /* When solving the final problem, we no longer need the stored data, */ /* so we will overwrite the data from this level onto the previously */ /* used storage space. */ if (*curlvl == *tlvls) { qptr[curr] = 1; prmptr[curr] = 1; givptr[curr] = 1; } /* Sort and Deflate eigenvalues. */ _starpu_dlaed8_(icompq, &k, n, qsiz, &d__[1], &q[q_offset], ldq, &indxq[1], rho, cutpnt, &work[iz], &work[idlmda], &work[iq2], &ldq2, &work[iw], & perm[prmptr[curr]], &givptr[curr + 1], &givcol[(givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], &iwork[indxp], &iwork[ indx], info); prmptr[curr + 1] = prmptr[curr] + *n; givptr[curr + 1] += givptr[curr]; /* Solve Secular Equation. */ if (k != 0) { _starpu_dlaed9_(&k, &c__1, &k, n, &d__[1], &work[is], &k, rho, &work[idlmda], &work[iw], &qstore[qptr[curr]], &k, info); if (*info != 0) { goto L30; } if (*icompq == 1) { _starpu_dgemm_("N", "N", qsiz, &k, &k, &c_b10, &work[iq2], &ldq2, &qstore[ qptr[curr]], &k, &c_b11, &q[q_offset], ldq); } /* Computing 2nd power */ i__1 = k; qptr[curr + 1] = qptr[curr] + i__1 * i__1; /* Prepare the INDXQ sorting permutation. */ n1 = k; n2 = *n - k; _starpu_dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); } else { qptr[curr + 1] = qptr[curr]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indxq[i__] = i__; /* L20: */ } } L30: return 0; /* End of DLAED7 */ } /* _starpu_dlaed7_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed8.c000066400000000000000000000337741413463044200205250ustar00rootroot00000000000000/* dlaed8.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b3 = -1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlaed8_(integer *icompq, integer *k, integer *n, integer *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer *indx, integer *info) { /* System generated locals */ integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal c__; integer i__, j; doublereal s, t; integer k2, n1, n2, jp, n1p1; doublereal eps, tau, tol; integer jlam, imax, jmax; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dscal_( integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED8 merges the two sets of eigenvalues together into a single */ /* sorted set. Then it tries to deflate the size of the problem. */ /* There are two ways in which deflation can occur: when two or more */ /* eigenvalues are close together or if there is a tiny element in the */ /* Z vector. For each such occurrence the order of the related secular */ /* equation problem is reduced by one. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* = 0: Compute eigenvalues only. */ /* = 1: Compute eigenvectors of original dense symmetric matrix */ /* also. On entry, Q contains the orthogonal matrix used */ /* to reduce the original matrix to tridiagonal form. */ /* K (output) INTEGER */ /* The number of non-deflated eigenvalues, and the order of the */ /* related secular equation. */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* QSIZ (input) INTEGER */ /* The dimension of the orthogonal matrix used to reduce */ /* the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the eigenvalues of the two submatrices to be */ /* combined. On exit, the trailing (N-K) updated eigenvalues */ /* (those which were deflated) sorted into increasing order. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* If ICOMPQ = 0, Q is not referenced. Otherwise, */ /* on entry, Q contains the eigenvectors of the partially solved */ /* system which has been previously updated in matrix */ /* multiplies with other partially solved eigensystems. */ /* On exit, Q contains the trailing (N-K) updated eigenvectors */ /* (those which were deflated) in its last N-K columns. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* INDXQ (input) INTEGER array, dimension (N) */ /* The permutation which separately sorts the two sub-problems */ /* in D into ascending order. Note that elements in the second */ /* half of this permutation must first have CUTPNT added to */ /* their values in order to be accurate. */ /* RHO (input/output) DOUBLE PRECISION */ /* On entry, the off-diagonal element associated with the rank-1 */ /* cut which originally split the two submatrices which are now */ /* being recombined. */ /* On exit, RHO has been modified to the value required by */ /* DLAED3. */ /* CUTPNT (input) INTEGER */ /* The location of the last eigenvalue in the leading */ /* sub-matrix. min(1,N) <= CUTPNT <= N. */ /* Z (input) DOUBLE PRECISION array, dimension (N) */ /* On entry, Z contains the updating vector (the last row of */ /* the first sub-eigenvector matrix and the first row of the */ /* second sub-eigenvector matrix). */ /* On exit, the contents of Z are destroyed by the updating */ /* process. */ /* DLAMDA (output) DOUBLE PRECISION array, dimension (N) */ /* A copy of the first K eigenvalues which will be used by */ /* DLAED3 to form the secular equation. */ /* Q2 (output) DOUBLE PRECISION array, dimension (LDQ2,N) */ /* If ICOMPQ = 0, Q2 is not referenced. Otherwise, */ /* a copy of the first K eigenvectors which will be used by */ /* DLAED7 in a matrix multiply (DGEMM) to update the new */ /* eigenvectors. */ /* LDQ2 (input) INTEGER */ /* The leading dimension of the array Q2. LDQ2 >= max(1,N). */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first k values of the final deflation-altered z-vector and */ /* will be passed to DLAED3. */ /* PERM (output) INTEGER array, dimension (N) */ /* The permutations (from deflation and sorting) to be applied */ /* to each eigenblock. */ /* GIVPTR (output) INTEGER */ /* The number of Givens rotations which took place in this */ /* subproblem. */ /* GIVCOL (output) INTEGER array, dimension (2, N) */ /* Each pair of numbers indicates a pair of columns to take place */ /* in a Givens rotation. */ /* GIVNUM (output) DOUBLE PRECISION array, dimension (2, N) */ /* Each number indicates the S value to be used in the */ /* corresponding Givens rotation. */ /* INDXP (workspace) INTEGER array, dimension (N) */ /* The permutation used to place deflated values of D at the end */ /* of the array. INDXP(1:K) points to the nondeflated D-values */ /* and INDXP(K+1:N) points to the deflated eigenvalues. */ /* INDX (workspace) INTEGER array, dimension (N) */ /* The permutation used to sort the contents of D into ascending */ /* order. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --indxq; --z__; --dlamda; q2_dim1 = *ldq2; q2_offset = 1 + q2_dim1; q2 -= q2_offset; --w; --perm; givcol -= 3; givnum -= 3; --indxp; --indx; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*n < 0) { *info = -3; } else if (*icompq == 1 && *qsiz < *n) { *info = -4; } else if (*ldq < max(1,*n)) { *info = -7; } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { *info = -10; } else if (*ldq2 < max(1,*n)) { *info = -14; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED8", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } n1 = *cutpnt; n2 = *n - n1; n1p1 = n1 + 1; if (*rho < 0.) { _starpu_dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } /* Normalize z so that norm(z) = 1 */ t = 1. / sqrt(2.); i__1 = *n; for (j = 1; j <= i__1; ++j) { indx[j] = j; /* L10: */ } _starpu_dscal_(n, &t, &z__[1], &c__1); *rho = (d__1 = *rho * 2., abs(d__1)); /* Sort the eigenvalues into increasing order */ i__1 = *n; for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { indxq[i__] += *cutpnt; /* L20: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = d__[indxq[i__]]; w[i__] = z__[indxq[i__]]; /* L30: */ } i__ = 1; j = *cutpnt + 1; _starpu_dlamrg_(&n1, &n2, &dlamda[1], &c__1, &c__1, &indx[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = dlamda[indx[i__]]; z__[i__] = w[indx[i__]]; /* L40: */ } /* Calculate the allowable deflation tolerence */ imax = _starpu_idamax_(n, &z__[1], &c__1); jmax = _starpu_idamax_(n, &d__[1], &c__1); eps = _starpu_dlamch_("Epsilon"); tol = eps * 8. * (d__1 = d__[jmax], abs(d__1)); /* If the rank-1 modifier is small enough, no more needs to be done */ /* except to reorganize Q so that its columns correspond with the */ /* elements in D. */ if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { *k = 0; if (*icompq == 0) { i__1 = *n; for (j = 1; j <= i__1; ++j) { perm[j] = indxq[indx[j]]; /* L50: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { perm[j] = indxq[indx[j]]; _starpu_dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], &c__1); /* L60: */ } _starpu_dlacpy_("A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq); } return 0; } /* If there are multiple eigenvalues then the problem deflates. Here */ /* the number of equal eigenvalues are found. As each equal */ /* eigenvalue is found, an elementary reflector is computed to rotate */ /* the corresponding eigensubspace so that the corresponding */ /* components of Z are zero in this new basis. */ *k = 0; *givptr = 0; k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; indxp[k2] = j; if (j == *n) { goto L110; } } else { jlam = j; goto L80; } /* L70: */ } L80: ++j; if (j > *n) { goto L100; } if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; indxp[k2] = j; } else { /* Check if eigenvalues are close enough to allow deflation. */ s = z__[jlam]; c__ = z__[j]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ tau = _starpu_dlapy2_(&c__, &s); t = d__[j] - d__[jlam]; c__ /= tau; s = -s / tau; if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { /* Deflation is possible. */ z__[j] = tau; z__[jlam] = 0.; /* Record the appropriate Givens rotation */ ++(*givptr); givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; givcol[(*givptr << 1) + 2] = indxq[indx[j]]; givnum[(*givptr << 1) + 1] = c__; givnum[(*givptr << 1) + 2] = s; if (*icompq == 1) { _starpu_drot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[ indxq[indx[j]] * q_dim1 + 1], &c__1, &c__, &s); } t = d__[jlam] * c__ * c__ + d__[j] * s * s; d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; d__[jlam] = t; --k2; i__ = 1; L90: if (k2 + i__ <= *n) { if (d__[jlam] < d__[indxp[k2 + i__]]) { indxp[k2 + i__ - 1] = indxp[k2 + i__]; indxp[k2 + i__] = jlam; ++i__; goto L90; } else { indxp[k2 + i__ - 1] = jlam; } } else { indxp[k2 + i__ - 1] = jlam; } jlam = j; } else { ++(*k); w[*k] = z__[jlam]; dlamda[*k] = d__[jlam]; indxp[*k] = jlam; jlam = j; } } goto L80; L100: /* Record the last eigenvalue. */ ++(*k); w[*k] = z__[jlam]; dlamda[*k] = d__[jlam]; indxp[*k] = jlam; L110: /* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ /* and Q2 respectively. The eigenvalues/vectors which were not */ /* deflated go into the first K slots of DLAMDA and Q2 respectively, */ /* while those which were deflated go into the last N - K slots. */ if (*icompq == 0) { i__1 = *n; for (j = 1; j <= i__1; ++j) { jp = indxp[j]; dlamda[j] = d__[jp]; perm[j] = indxq[indx[jp]]; /* L120: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { jp = indxp[j]; dlamda[j] = d__[jp]; perm[j] = indxq[indx[jp]]; _starpu_dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] , &c__1); /* L130: */ } } /* The deflated eigenvalues and their corresponding vectors go back */ /* into the last N - K slots of D and Q respectively. */ if (*k < *n) { if (*icompq == 0) { i__1 = *n - *k; _starpu_dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); } else { i__1 = *n - *k; _starpu_dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); i__1 = *n - *k; _starpu_dlacpy_("A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(* k + 1) * q_dim1 + 1], ldq); } } return 0; /* End of DLAED8 */ } /* _starpu_dlaed8_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaed9.c000066400000000000000000000201341413463044200205100ustar00rootroot00000000000000/* dlaed9.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlaed9_(integer *k, integer *kstart, integer *kstop, integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, integer *info) { /* System generated locals */ integer q_dim1, q_offset, s_dim1, s_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j; doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaed4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAED9 finds the roots of the secular equation, as defined by the */ /* values in D, Z, and RHO, between KSTART and KSTOP. It makes the */ /* appropriate calls to DLAED4 and then stores the new matrix of */ /* eigenvectors for use in calculating the next level of Z vectors. */ /* Arguments */ /* ========= */ /* K (input) INTEGER */ /* The number of terms in the rational function to be solved by */ /* DLAED4. K >= 0. */ /* KSTART (input) INTEGER */ /* KSTOP (input) INTEGER */ /* The updated eigenvalues Lambda(I), KSTART <= I <= KSTOP */ /* are to be computed. 1 <= KSTART <= KSTOP <= K. */ /* N (input) INTEGER */ /* The number of rows and columns in the Q matrix. */ /* N >= K (delation may result in N > K). */ /* D (output) DOUBLE PRECISION array, dimension (N) */ /* D(I) contains the updated eigenvalues */ /* for KSTART <= I <= KSTOP. */ /* Q (workspace) DOUBLE PRECISION array, dimension (LDQ,N) */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max( 1, N ). */ /* RHO (input) DOUBLE PRECISION */ /* The value of the parameter in the rank one update equation. */ /* RHO >= 0 required. */ /* DLAMDA (input) DOUBLE PRECISION array, dimension (K) */ /* The first K elements of this array contain the old roots */ /* of the deflated updating problem. These are the poles */ /* of the secular equation. */ /* W (input) DOUBLE PRECISION array, dimension (K) */ /* The first K elements of this array contain the components */ /* of the deflation-adjusted updating vector. */ /* S (output) DOUBLE PRECISION array, dimension (LDS, K) */ /* Will contain the eigenvectors of the repaired matrix which */ /* will be stored for subsequent Z vector calculation and */ /* multiplied by the previously accumulated eigenvectors */ /* to update the system. */ /* LDS (input) INTEGER */ /* The leading dimension of S. LDS >= max( 1, K ). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an eigenvalue did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --dlamda; --w; s_dim1 = *lds; s_offset = 1 + s_dim1; s -= s_offset; /* Function Body */ *info = 0; if (*k < 0) { *info = -1; } else if (*kstart < 1 || *kstart > max(1,*k)) { *info = -2; } else if (max(1,*kstop) < *kstart || *kstop > max(1,*k)) { *info = -3; } else if (*n < *k) { *info = -4; } else if (*ldq < max(1,*k)) { *info = -7; } else if (*lds < max(1,*k)) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAED9", &i__1); return 0; } /* Quick return if possible */ if (*k == 0) { return 0; } /* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ /* be computed with high relative accuracy (barring over/underflow). */ /* This is a problem on machines without a guard digit in */ /* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ /* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ /* which on any of these machines zeros out the bottommost */ /* bit of DLAMDA(I) if it is 1; this makes the subsequent */ /* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ /* occurs. On binary machines with a guard digit (almost all */ /* machines) it does not change DLAMDA(I) at all. On hexadecimal */ /* and decimal machines with a guard digit, it slightly */ /* changes the bottommost bits of DLAMDA(I). It does not account */ /* for hexadecimal or decimal machines without guard digits */ /* (we know of none). We use a subroutine call to compute */ /* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ /* this code. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = _starpu_dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; /* L10: */ } i__1 = *kstop; for (j = *kstart; j <= i__1; ++j) { _starpu_dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], info); /* If the zero finder fails, the computation is terminated. */ if (*info != 0) { goto L120; } /* L20: */ } if (*k == 1 || *k == 2) { i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *k; for (j = 1; j <= i__2; ++j) { s[j + i__ * s_dim1] = q[j + i__ * q_dim1]; /* L30: */ } /* L40: */ } goto L120; } /* Compute updated W. */ _starpu_dcopy_(k, &w[1], &c__1, &s[s_offset], &c__1); /* Initialize W(I) = Q(I,I) */ i__1 = *ldq + 1; _starpu_dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L50: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L60: */ } /* L70: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = sqrt(-w[i__]); w[i__] = d_sign(&d__1, &s[i__ + s_dim1]); /* L80: */ } /* Compute eigenvectors of the modified rank-1 modification. */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { q[i__ + j * q_dim1] = w[i__] / q[i__ + j * q_dim1]; /* L90: */ } temp = _starpu_dnrm2_(k, &q[j * q_dim1 + 1], &c__1); i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { s[i__ + j * s_dim1] = q[i__ + j * q_dim1] / temp; /* L100: */ } /* L110: */ } L120: return 0; /* End of DLAED9 */ } /* _starpu_dlaed9_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaeda.c000066400000000000000000000217451413463044200205710ustar00rootroot00000000000000/* dlaeda.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__2 = 2; static integer c__1 = 1; static doublereal c_b24 = 1.; static doublereal c_b26 = 0.; /* Subroutine */ int _starpu_dlaeda_(integer *n, integer *tlvls, integer *curlvl, integer *curpbm, integer *prmptr, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, doublereal *z__, doublereal *ztemp, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; /* Builtin functions */ integer pow_ii(integer *, integer *); double sqrt(doublereal); /* Local variables */ integer i__, k, mid, ptr; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer curr, bsiz1, bsiz2, psiz1, psiz2, zptr1; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAEDA computes the Z vector corresponding to the merge step in the */ /* CURLVLth step of the merge process with TLVLS steps for the CURPBMth */ /* problem. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* TLVLS (input) INTEGER */ /* The total number of merging levels in the overall divide and */ /* conquer tree. */ /* CURLVL (input) INTEGER */ /* The current level in the overall merge routine, */ /* 0 <= curlvl <= tlvls. */ /* CURPBM (input) INTEGER */ /* The current problem in the current level in the overall */ /* merge routine (counting from upper left to lower right). */ /* PRMPTR (input) INTEGER array, dimension (N lg N) */ /* Contains a list of pointers which indicate where in PERM a */ /* level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ /* indicates the size of the permutation and incidentally the */ /* size of the full, non-deflated problem. */ /* PERM (input) INTEGER array, dimension (N lg N) */ /* Contains the permutations (from deflation and sorting) to be */ /* applied to each eigenblock. */ /* GIVPTR (input) INTEGER array, dimension (N lg N) */ /* Contains a list of pointers which indicate where in GIVCOL a */ /* level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ /* indicates the number of Givens rotations. */ /* GIVCOL (input) INTEGER array, dimension (2, N lg N) */ /* Each pair of numbers indicates a pair of columns to take place */ /* in a Givens rotation. */ /* GIVNUM (input) DOUBLE PRECISION array, dimension (2, N lg N) */ /* Each number indicates the S value to be used in the */ /* corresponding Givens rotation. */ /* Q (input) DOUBLE PRECISION array, dimension (N**2) */ /* Contains the square eigenblocks from previous levels, the */ /* starting positions for blocks are given by QPTR. */ /* QPTR (input) INTEGER array, dimension (N+2) */ /* Contains a list of pointers which indicate where in Q an */ /* eigenblock is stored. SQRT( QPTR(i+1) - QPTR(i) ) indicates */ /* the size of the block. */ /* Z (output) DOUBLE PRECISION array, dimension (N) */ /* On output this vector contains the updating vector (the last */ /* row of the first sub-eigenvector matrix and the first row of */ /* the second sub-eigenvector matrix). */ /* ZTEMP (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ztemp; --z__; --qptr; --q; givnum -= 3; givcol -= 3; --givptr; --perm; --prmptr; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAEDA", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine location of first number in second half. */ mid = *n / 2 + 1; /* Gather last/first rows of appropriate eigenblocks into center of Z */ ptr = 1; /* Determine location of lowest level subproblem in the full storage */ /* scheme */ i__1 = *curlvl - 1; curr = ptr + *curpbm * pow_ii(&c__2, curlvl) + pow_ii(&c__2, &i__1) - 1; /* Determine size of these matrices. We add HALF to the value of */ /* the SQRT in case the machine underestimates one of these square */ /* roots. */ bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + .5); bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1])) + .5); i__1 = mid - bsiz1 - 1; for (k = 1; k <= i__1; ++k) { z__[k] = 0.; /* L10: */ } _starpu_dcopy_(&bsiz1, &q[qptr[curr] + bsiz1 - 1], &bsiz1, &z__[mid - bsiz1], & c__1); _starpu_dcopy_(&bsiz2, &q[qptr[curr + 1]], &bsiz2, &z__[mid], &c__1); i__1 = *n; for (k = mid + bsiz2; k <= i__1; ++k) { z__[k] = 0.; /* L20: */ } /* Loop thru remaining levels 1 -> CURLVL applying the Givens */ /* rotations and permutation and then multiplying the center matrices */ /* against the current Z. */ ptr = pow_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (k = 1; k <= i__1; ++k) { i__2 = *curlvl - k; i__3 = *curlvl - k - 1; curr = ptr + *curpbm * pow_ii(&c__2, &i__2) + pow_ii(&c__2, &i__3) - 1; psiz1 = prmptr[curr + 1] - prmptr[curr]; psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; zptr1 = mid - psiz1; /* Apply Givens at CURR and CURR+1 */ i__2 = givptr[curr + 1] - 1; for (i__ = givptr[curr]; i__ <= i__2; ++i__) { _starpu_drot_(&c__1, &z__[zptr1 + givcol[(i__ << 1) + 1] - 1], &c__1, & z__[zptr1 + givcol[(i__ << 1) + 2] - 1], &c__1, &givnum[( i__ << 1) + 1], &givnum[(i__ << 1) + 2]); /* L30: */ } i__2 = givptr[curr + 2] - 1; for (i__ = givptr[curr + 1]; i__ <= i__2; ++i__) { _starpu_drot_(&c__1, &z__[mid - 1 + givcol[(i__ << 1) + 1]], &c__1, &z__[ mid - 1 + givcol[(i__ << 1) + 2]], &c__1, &givnum[(i__ << 1) + 1], &givnum[(i__ << 1) + 2]); /* L40: */ } psiz1 = prmptr[curr + 1] - prmptr[curr]; psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; i__2 = psiz1 - 1; for (i__ = 0; i__ <= i__2; ++i__) { ztemp[i__ + 1] = z__[zptr1 + perm[prmptr[curr] + i__] - 1]; /* L50: */ } i__2 = psiz2 - 1; for (i__ = 0; i__ <= i__2; ++i__) { ztemp[psiz1 + i__ + 1] = z__[mid + perm[prmptr[curr + 1] + i__] - 1]; /* L60: */ } /* Multiply Blocks at CURR and CURR+1 */ /* Determine size of these matrices. We add HALF to the value of */ /* the SQRT in case the machine underestimates one of these */ /* square roots. */ bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + .5); bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1]) ) + .5); if (bsiz1 > 0) { _starpu_dgemv_("T", &bsiz1, &bsiz1, &c_b24, &q[qptr[curr]], &bsiz1, & ztemp[1], &c__1, &c_b26, &z__[zptr1], &c__1); } i__2 = psiz1 - bsiz1; _starpu_dcopy_(&i__2, &ztemp[bsiz1 + 1], &c__1, &z__[zptr1 + bsiz1], &c__1); if (bsiz2 > 0) { _starpu_dgemv_("T", &bsiz2, &bsiz2, &c_b24, &q[qptr[curr + 1]], &bsiz2, & ztemp[psiz1 + 1], &c__1, &c_b26, &z__[mid], &c__1); } i__2 = psiz2 - bsiz2; _starpu_dcopy_(&i__2, &ztemp[psiz1 + bsiz2 + 1], &c__1, &z__[mid + bsiz2], & c__1); i__2 = *tlvls - k; ptr += pow_ii(&c__2, &i__2); /* L70: */ } return 0; /* End of DLAEDA */ } /* _starpu_dlaeda_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaein.c000066400000000000000000000440461413463044200206120ustar00rootroot00000000000000/* dlaein.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlaein_(logical *rightv, logical *noinit, integer *n, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, doublereal *vr, doublereal *vi, doublereal *b, integer *ldb, doublereal *work, doublereal *eps3, doublereal *smlnum, doublereal * bignum, integer *info) { /* System generated locals */ integer b_dim1, b_offset, h_dim1, h_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal w, x, y; integer i1, i2, i3; doublereal w1, ei, ej, xi, xr, rec; integer its, ierr; doublereal temp, norm, vmax; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal scale; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); char trans[1]; doublereal vcrit, rootn, vnorm; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *); doublereal absbii, absbjj; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlatrs_( char *, char *, char *, char *, integer *, doublereal *, integer * , doublereal *, doublereal *, doublereal *, integer *); char normin[1]; doublereal nrmsml, growto; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAEIN uses inverse iteration to find a right or left eigenvector */ /* corresponding to the eigenvalue (WR,WI) of a real upper Hessenberg */ /* matrix H. */ /* Arguments */ /* ========= */ /* RIGHTV (input) LOGICAL */ /* = .TRUE. : compute right eigenvector; */ /* = .FALSE.: compute left eigenvector. */ /* NOINIT (input) LOGICAL */ /* = .TRUE. : no initial vector supplied in (VR,VI). */ /* = .FALSE.: initial vector supplied in (VR,VI). */ /* N (input) INTEGER */ /* The order of the matrix H. N >= 0. */ /* H (input) DOUBLE PRECISION array, dimension (LDH,N) */ /* The upper Hessenberg matrix H. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH >= max(1,N). */ /* WR (input) DOUBLE PRECISION */ /* WI (input) DOUBLE PRECISION */ /* The real and imaginary parts of the eigenvalue of H whose */ /* corresponding right or left eigenvector is to be computed. */ /* VR (input/output) DOUBLE PRECISION array, dimension (N) */ /* VI (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, if NOINIT = .FALSE. and WI = 0.0, VR must contain */ /* a real starting vector for inverse iteration using the real */ /* eigenvalue WR; if NOINIT = .FALSE. and WI.ne.0.0, VR and VI */ /* must contain the real and imaginary parts of a complex */ /* starting vector for inverse iteration using the complex */ /* eigenvalue (WR,WI); otherwise VR and VI need not be set. */ /* On exit, if WI = 0.0 (real eigenvalue), VR contains the */ /* computed real eigenvector; if WI.ne.0.0 (complex eigenvalue), */ /* VR and VI contain the real and imaginary parts of the */ /* computed complex eigenvector. The eigenvector is normalized */ /* so that the component of largest magnitude has magnitude 1; */ /* here the magnitude of a complex number (x,y) is taken to be */ /* |x| + |y|. */ /* VI is not referenced if WI = 0.0. */ /* B (workspace) DOUBLE PRECISION array, dimension (LDB,N) */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= N+1. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* EPS3 (input) DOUBLE PRECISION */ /* A small machine-dependent value which is used to perturb */ /* close eigenvalues, and to replace zero pivots. */ /* SMLNUM (input) DOUBLE PRECISION */ /* A machine-dependent value close to the underflow threshold. */ /* BIGNUM (input) DOUBLE PRECISION */ /* A machine-dependent value close to the overflow threshold. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* = 1: inverse iteration did not converge; VR is set to the */ /* last iterate, and so is VI if WI.ne.0.0. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --vr; --vi; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --work; /* Function Body */ *info = 0; /* GROWTO is the threshold used in the acceptance test for an */ /* eigenvector. */ rootn = sqrt((doublereal) (*n)); growto = .1 / rootn; /* Computing MAX */ d__1 = 1., d__2 = *eps3 * rootn; nrmsml = max(d__1,d__2) * *smlnum; /* Form B = H - (WR,WI)*I (except that the subdiagonal elements and */ /* the imaginary parts of the diagonal elements are not stored). */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = h__[i__ + j * h_dim1]; /* L10: */ } b[j + j * b_dim1] = h__[j + j * h_dim1] - *wr; /* L20: */ } if (*wi == 0.) { /* Real eigenvalue. */ if (*noinit) { /* Set initial vector. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { vr[i__] = *eps3; /* L30: */ } } else { /* Scale supplied initial vector. */ vnorm = _starpu_dnrm2_(n, &vr[1], &c__1); d__1 = *eps3 * rootn / max(vnorm,nrmsml); _starpu_dscal_(n, &d__1, &vr[1], &c__1); } if (*rightv) { /* LU decomposition with partial pivoting of B, replacing zero */ /* pivots by EPS3. */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { ei = h__[i__ + 1 + i__ * h_dim1]; if ((d__1 = b[i__ + i__ * b_dim1], abs(d__1)) < abs(ei)) { /* Interchange rows and eliminate. */ x = b[i__ + i__ * b_dim1] / ei; b[i__ + i__ * b_dim1] = ei; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { temp = b[i__ + 1 + j * b_dim1]; b[i__ + 1 + j * b_dim1] = b[i__ + j * b_dim1] - x * temp; b[i__ + j * b_dim1] = temp; /* L40: */ } } else { /* Eliminate without interchange. */ if (b[i__ + i__ * b_dim1] == 0.) { b[i__ + i__ * b_dim1] = *eps3; } x = ei / b[i__ + i__ * b_dim1]; if (x != 0.) { i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { b[i__ + 1 + j * b_dim1] -= x * b[i__ + j * b_dim1] ; /* L50: */ } } } /* L60: */ } if (b[*n + *n * b_dim1] == 0.) { b[*n + *n * b_dim1] = *eps3; } *(unsigned char *)trans = 'N'; } else { /* UL decomposition with partial pivoting of B, replacing zero */ /* pivots by EPS3. */ for (j = *n; j >= 2; --j) { ej = h__[j + (j - 1) * h_dim1]; if ((d__1 = b[j + j * b_dim1], abs(d__1)) < abs(ej)) { /* Interchange columns and eliminate. */ x = b[j + j * b_dim1] / ej; b[j + j * b_dim1] = ej; i__1 = j - 1; for (i__ = 1; i__ <= i__1; ++i__) { temp = b[i__ + (j - 1) * b_dim1]; b[i__ + (j - 1) * b_dim1] = b[i__ + j * b_dim1] - x * temp; b[i__ + j * b_dim1] = temp; /* L70: */ } } else { /* Eliminate without interchange. */ if (b[j + j * b_dim1] == 0.) { b[j + j * b_dim1] = *eps3; } x = ej / b[j + j * b_dim1]; if (x != 0.) { i__1 = j - 1; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + (j - 1) * b_dim1] -= x * b[i__ + j * b_dim1]; /* L80: */ } } } /* L90: */ } if (b[b_dim1 + 1] == 0.) { b[b_dim1 + 1] = *eps3; } *(unsigned char *)trans = 'T'; } *(unsigned char *)normin = 'N'; i__1 = *n; for (its = 1; its <= i__1; ++its) { /* Solve U*x = scale*v for a right eigenvector */ /* or U'*x = scale*v for a left eigenvector, */ /* overwriting x on v. */ _starpu_dlatrs_("Upper", trans, "Nonunit", normin, n, &b[b_offset], ldb, & vr[1], &scale, &work[1], &ierr); *(unsigned char *)normin = 'Y'; /* Test for sufficient growth in the norm of v. */ vnorm = _starpu_dasum_(n, &vr[1], &c__1); if (vnorm >= growto * scale) { goto L120; } /* Choose new orthogonal starting vector and try again. */ temp = *eps3 / (rootn + 1.); vr[1] = *eps3; i__2 = *n; for (i__ = 2; i__ <= i__2; ++i__) { vr[i__] = temp; /* L100: */ } vr[*n - its + 1] -= *eps3 * rootn; /* L110: */ } /* Failure to find eigenvector in N iterations. */ *info = 1; L120: /* Normalize eigenvector. */ i__ = _starpu_idamax_(n, &vr[1], &c__1); d__2 = 1. / (d__1 = vr[i__], abs(d__1)); _starpu_dscal_(n, &d__2, &vr[1], &c__1); } else { /* Complex eigenvalue. */ if (*noinit) { /* Set initial vector. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { vr[i__] = *eps3; vi[i__] = 0.; /* L130: */ } } else { /* Scale supplied initial vector. */ d__1 = _starpu_dnrm2_(n, &vr[1], &c__1); d__2 = _starpu_dnrm2_(n, &vi[1], &c__1); norm = _starpu_dlapy2_(&d__1, &d__2); rec = *eps3 * rootn / max(norm,nrmsml); _starpu_dscal_(n, &rec, &vr[1], &c__1); _starpu_dscal_(n, &rec, &vi[1], &c__1); } if (*rightv) { /* LU decomposition with partial pivoting of B, replacing zero */ /* pivots by EPS3. */ /* The imaginary part of the (i,j)-th element of U is stored in */ /* B(j+1,i). */ b[b_dim1 + 2] = -(*wi); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { b[i__ + 1 + b_dim1] = 0.; /* L140: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { absbii = _starpu_dlapy2_(&b[i__ + i__ * b_dim1], &b[i__ + 1 + i__ * b_dim1]); ei = h__[i__ + 1 + i__ * h_dim1]; if (absbii < abs(ei)) { /* Interchange rows and eliminate. */ xr = b[i__ + i__ * b_dim1] / ei; xi = b[i__ + 1 + i__ * b_dim1] / ei; b[i__ + i__ * b_dim1] = ei; b[i__ + 1 + i__ * b_dim1] = 0.; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { temp = b[i__ + 1 + j * b_dim1]; b[i__ + 1 + j * b_dim1] = b[i__ + j * b_dim1] - xr * temp; b[j + 1 + (i__ + 1) * b_dim1] = b[j + 1 + i__ * b_dim1] - xi * temp; b[i__ + j * b_dim1] = temp; b[j + 1 + i__ * b_dim1] = 0.; /* L150: */ } b[i__ + 2 + i__ * b_dim1] = -(*wi); b[i__ + 1 + (i__ + 1) * b_dim1] -= xi * *wi; b[i__ + 2 + (i__ + 1) * b_dim1] += xr * *wi; } else { /* Eliminate without interchanging rows. */ if (absbii == 0.) { b[i__ + i__ * b_dim1] = *eps3; b[i__ + 1 + i__ * b_dim1] = 0.; absbii = *eps3; } ei = ei / absbii / absbii; xr = b[i__ + i__ * b_dim1] * ei; xi = -b[i__ + 1 + i__ * b_dim1] * ei; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { b[i__ + 1 + j * b_dim1] = b[i__ + 1 + j * b_dim1] - xr * b[i__ + j * b_dim1] + xi * b[j + 1 + i__ * b_dim1]; b[j + 1 + (i__ + 1) * b_dim1] = -xr * b[j + 1 + i__ * b_dim1] - xi * b[i__ + j * b_dim1]; /* L160: */ } b[i__ + 2 + (i__ + 1) * b_dim1] -= *wi; } /* Compute 1-norm of offdiagonal elements of i-th row. */ i__2 = *n - i__; i__3 = *n - i__; work[i__] = _starpu_dasum_(&i__2, &b[i__ + (i__ + 1) * b_dim1], ldb) + _starpu_dasum_(&i__3, &b[i__ + 2 + i__ * b_dim1], &c__1); /* L170: */ } if (b[*n + *n * b_dim1] == 0. && b[*n + 1 + *n * b_dim1] == 0.) { b[*n + *n * b_dim1] = *eps3; } work[*n] = 0.; i1 = *n; i2 = 1; i3 = -1; } else { /* UL decomposition with partial pivoting of conjg(B), */ /* replacing zero pivots by EPS3. */ /* The imaginary part of the (i,j)-th element of U is stored in */ /* B(j+1,i). */ b[*n + 1 + *n * b_dim1] = *wi; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { b[*n + 1 + j * b_dim1] = 0.; /* L180: */ } for (j = *n; j >= 2; --j) { ej = h__[j + (j - 1) * h_dim1]; absbjj = _starpu_dlapy2_(&b[j + j * b_dim1], &b[j + 1 + j * b_dim1]); if (absbjj < abs(ej)) { /* Interchange columns and eliminate */ xr = b[j + j * b_dim1] / ej; xi = b[j + 1 + j * b_dim1] / ej; b[j + j * b_dim1] = ej; b[j + 1 + j * b_dim1] = 0.; i__1 = j - 1; for (i__ = 1; i__ <= i__1; ++i__) { temp = b[i__ + (j - 1) * b_dim1]; b[i__ + (j - 1) * b_dim1] = b[i__ + j * b_dim1] - xr * temp; b[j + i__ * b_dim1] = b[j + 1 + i__ * b_dim1] - xi * temp; b[i__ + j * b_dim1] = temp; b[j + 1 + i__ * b_dim1] = 0.; /* L190: */ } b[j + 1 + (j - 1) * b_dim1] = *wi; b[j - 1 + (j - 1) * b_dim1] += xi * *wi; b[j + (j - 1) * b_dim1] -= xr * *wi; } else { /* Eliminate without interchange. */ if (absbjj == 0.) { b[j + j * b_dim1] = *eps3; b[j + 1 + j * b_dim1] = 0.; absbjj = *eps3; } ej = ej / absbjj / absbjj; xr = b[j + j * b_dim1] * ej; xi = -b[j + 1 + j * b_dim1] * ej; i__1 = j - 1; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + (j - 1) * b_dim1] = b[i__ + (j - 1) * b_dim1] - xr * b[i__ + j * b_dim1] + xi * b[j + 1 + i__ * b_dim1]; b[j + i__ * b_dim1] = -xr * b[j + 1 + i__ * b_dim1] - xi * b[i__ + j * b_dim1]; /* L200: */ } b[j + (j - 1) * b_dim1] += *wi; } /* Compute 1-norm of offdiagonal elements of j-th column. */ i__1 = j - 1; i__2 = j - 1; work[j] = _starpu_dasum_(&i__1, &b[j * b_dim1 + 1], &c__1) + _starpu_dasum_(& i__2, &b[j + 1 + b_dim1], ldb); /* L210: */ } if (b[b_dim1 + 1] == 0. && b[b_dim1 + 2] == 0.) { b[b_dim1 + 1] = *eps3; } work[1] = 0.; i1 = 1; i2 = *n; i3 = 1; } i__1 = *n; for (its = 1; its <= i__1; ++its) { scale = 1.; vmax = 1.; vcrit = *bignum; /* Solve U*(xr,xi) = scale*(vr,vi) for a right eigenvector, */ /* or U'*(xr,xi) = scale*(vr,vi) for a left eigenvector, */ /* overwriting (xr,xi) on (vr,vi). */ i__2 = i2; i__3 = i3; for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { if (work[i__] > vcrit) { rec = 1. / vmax; _starpu_dscal_(n, &rec, &vr[1], &c__1); _starpu_dscal_(n, &rec, &vi[1], &c__1); scale *= rec; vmax = 1.; vcrit = *bignum; } xr = vr[i__]; xi = vi[i__]; if (*rightv) { i__4 = *n; for (j = i__ + 1; j <= i__4; ++j) { xr = xr - b[i__ + j * b_dim1] * vr[j] + b[j + 1 + i__ * b_dim1] * vi[j]; xi = xi - b[i__ + j * b_dim1] * vi[j] - b[j + 1 + i__ * b_dim1] * vr[j]; /* L220: */ } } else { i__4 = i__ - 1; for (j = 1; j <= i__4; ++j) { xr = xr - b[j + i__ * b_dim1] * vr[j] + b[i__ + 1 + j * b_dim1] * vi[j]; xi = xi - b[j + i__ * b_dim1] * vi[j] - b[i__ + 1 + j * b_dim1] * vr[j]; /* L230: */ } } w = (d__1 = b[i__ + i__ * b_dim1], abs(d__1)) + (d__2 = b[i__ + 1 + i__ * b_dim1], abs(d__2)); if (w > *smlnum) { if (w < 1.) { w1 = abs(xr) + abs(xi); if (w1 > w * *bignum) { rec = 1. / w1; _starpu_dscal_(n, &rec, &vr[1], &c__1); _starpu_dscal_(n, &rec, &vi[1], &c__1); xr = vr[i__]; xi = vi[i__]; scale *= rec; vmax *= rec; } } /* Divide by diagonal element of B. */ _starpu_dladiv_(&xr, &xi, &b[i__ + i__ * b_dim1], &b[i__ + 1 + i__ * b_dim1], &vr[i__], &vi[i__]); /* Computing MAX */ d__3 = (d__1 = vr[i__], abs(d__1)) + (d__2 = vi[i__], abs( d__2)); vmax = max(d__3,vmax); vcrit = *bignum / vmax; } else { i__4 = *n; for (j = 1; j <= i__4; ++j) { vr[j] = 0.; vi[j] = 0.; /* L240: */ } vr[i__] = 1.; vi[i__] = 1.; scale = 0.; vmax = 1.; vcrit = *bignum; } /* L250: */ } /* Test for sufficient growth in the norm of (VR,VI). */ vnorm = _starpu_dasum_(n, &vr[1], &c__1) + _starpu_dasum_(n, &vi[1], &c__1); if (vnorm >= growto * scale) { goto L280; } /* Choose a new orthogonal starting vector and try again. */ y = *eps3 / (rootn + 1.); vr[1] = *eps3; vi[1] = 0.; i__3 = *n; for (i__ = 2; i__ <= i__3; ++i__) { vr[i__] = y; vi[i__] = 0.; /* L260: */ } vr[*n - its + 1] -= *eps3 * rootn; /* L270: */ } /* Failure to find eigenvector in N iterations */ *info = 1; L280: /* Normalize eigenvector. */ vnorm = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__3 = vnorm, d__4 = (d__1 = vr[i__], abs(d__1)) + (d__2 = vi[i__] , abs(d__2)); vnorm = max(d__3,d__4); /* L290: */ } d__1 = 1. / vnorm; _starpu_dscal_(n, &d__1, &vr[1], &c__1); d__1 = 1. / vnorm; _starpu_dscal_(n, &d__1, &vi[1], &c__1); } return 0; /* End of DLAEIN */ } /* _starpu_dlaein_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaev2.c000066400000000000000000000114031413463044200205220ustar00rootroot00000000000000/* dlaev2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaev2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1) { /* System generated locals */ doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal ab, df, cs, ct, tb, sm, tn, rt, adf, acs; integer sgn1, sgn2; doublereal acmn, acmx; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix */ /* [ A B ] */ /* [ B C ]. */ /* On return, RT1 is the eigenvalue of larger absolute value, RT2 is the */ /* eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right */ /* eigenvector for RT1, giving the decomposition */ /* [ CS1 SN1 ] [ A B ] [ CS1 -SN1 ] = [ RT1 0 ] */ /* [-SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ]. */ /* Arguments */ /* ========= */ /* A (input) DOUBLE PRECISION */ /* The (1,1) element of the 2-by-2 matrix. */ /* B (input) DOUBLE PRECISION */ /* The (1,2) element and the conjugate of the (2,1) element of */ /* the 2-by-2 matrix. */ /* C (input) DOUBLE PRECISION */ /* The (2,2) element of the 2-by-2 matrix. */ /* RT1 (output) DOUBLE PRECISION */ /* The eigenvalue of larger absolute value. */ /* RT2 (output) DOUBLE PRECISION */ /* The eigenvalue of smaller absolute value. */ /* CS1 (output) DOUBLE PRECISION */ /* SN1 (output) DOUBLE PRECISION */ /* The vector (CS1, SN1) is a unit right eigenvector for RT1. */ /* Further Details */ /* =============== */ /* RT1 is accurate to a few ulps barring over/underflow. */ /* RT2 may be inaccurate if there is massive cancellation in the */ /* determinant A*C-B*B; higher precision or correctly rounded or */ /* correctly truncated arithmetic would be needed to compute RT2 */ /* accurately in all cases. */ /* CS1 and SN1 are accurate to a few ulps barring over/underflow. */ /* Overflow is possible only if RT1 is within a factor of 5 of overflow. */ /* Underflow is harmless if the input data is 0 or exceeds */ /* underflow_threshold / macheps. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Compute the eigenvalues */ sm = *a + *c__; df = *a - *c__; adf = abs(df); tb = *b + *b; ab = abs(tb); if (abs(*a) > abs(*c__)) { acmx = *a; acmn = *c__; } else { acmx = *c__; acmn = *a; } if (adf > ab) { /* Computing 2nd power */ d__1 = ab / adf; rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { /* Computing 2nd power */ d__1 = adf / ab; rt = ab * sqrt(d__1 * d__1 + 1.); } else { /* Includes case AB=ADF=0 */ rt = ab * sqrt(2.); } if (sm < 0.) { *rt1 = (sm - rt) * .5; sgn1 = -1; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { *rt1 = (sm + rt) * .5; sgn1 = 1; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { /* Includes case RT1 = RT2 = 0 */ *rt1 = rt * .5; *rt2 = rt * -.5; sgn1 = 1; } /* Compute the eigenvector */ if (df >= 0.) { cs = df + rt; sgn2 = 1; } else { cs = df - rt; sgn2 = -1; } acs = abs(cs); if (acs > ab) { ct = -tb / cs; *sn1 = 1. / sqrt(ct * ct + 1.); *cs1 = ct * *sn1; } else { if (ab == 0.) { *cs1 = 1.; *sn1 = 0.; } else { tn = -cs / tb; *cs1 = 1. / sqrt(tn * tn + 1.); *sn1 = tn * *cs1; } } if (sgn1 == sgn2) { tn = *cs1; *cs1 = -(*sn1); *sn1 = tn; } return 0; /* End of DLAEV2 */ } /* _starpu_dlaev2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaexc.c000066400000000000000000000322211413463044200206060ustar00rootroot00000000000000/* dlaexc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__4 = 4; static logical c_false = FALSE_; static integer c_n1 = -1; static integer c__2 = 2; static integer c__3 = 3; /* Subroutine */ int _starpu_dlaexc_(logical *wantq, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, integer *j1, integer *n1, integer *n2, doublereal *work, integer *info) { /* System generated locals */ integer q_dim1, q_offset, t_dim1, t_offset, i__1; doublereal d__1, d__2, d__3; /* Local variables */ doublereal d__[16] /* was [4][4] */; integer k; doublereal u[3], x[4] /* was [2][2] */; integer j2, j3, j4; doublereal u1[3], u2[3]; integer nd; doublereal cs, t11, t22, t33, sn, wi1, wi2, wr1, wr2, eps, tau, tau1, tau2; integer ierr; doublereal temp; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal scale, dnorm, xnorm; extern /* Subroutine */ int _starpu_dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlasy2_( logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlarfx_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *); doublereal thresh, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAEXC swaps adjacent diagonal blocks T11 and T22 of order 1 or 2 in */ /* an upper quasi-triangular matrix T by an orthogonal similarity */ /* transformation. */ /* T must be in Schur canonical form, that is, block upper triangular */ /* with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block */ /* has its diagonal elemnts equal and its off-diagonal elements of */ /* opposite sign. */ /* Arguments */ /* ========= */ /* WANTQ (input) LOGICAL */ /* = .TRUE. : accumulate the transformation in the matrix Q; */ /* = .FALSE.: do not accumulate the transformation. */ /* N (input) INTEGER */ /* The order of the matrix T. N >= 0. */ /* T (input/output) DOUBLE PRECISION array, dimension (LDT,N) */ /* On entry, the upper quasi-triangular matrix T, in Schur */ /* canonical form. */ /* On exit, the updated matrix T, again in Schur canonical form. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= max(1,N). */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, if WANTQ is .TRUE., the orthogonal matrix Q. */ /* On exit, if WANTQ is .TRUE., the updated matrix Q. */ /* If WANTQ is .FALSE., Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. */ /* LDQ >= 1; and if WANTQ is .TRUE., LDQ >= N. */ /* J1 (input) INTEGER */ /* The index of the first row of the first block T11. */ /* N1 (input) INTEGER */ /* The order of the first block T11. N1 = 0, 1 or 2. */ /* N2 (input) INTEGER */ /* The order of the second block T22. N2 = 0, 1 or 2. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* = 1: the transformed matrix T would be too far from Schur */ /* form; the blocks are not swapped and T and Q are */ /* unchanged. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --work; /* Function Body */ *info = 0; /* Quick return if possible */ if (*n == 0 || *n1 == 0 || *n2 == 0) { return 0; } if (*j1 + *n1 > *n) { return 0; } j2 = *j1 + 1; j3 = *j1 + 2; j4 = *j1 + 3; if (*n1 == 1 && *n2 == 1) { /* Swap two 1-by-1 blocks. */ t11 = t[*j1 + *j1 * t_dim1]; t22 = t[j2 + j2 * t_dim1]; /* Determine the transformation to perform the interchange. */ d__1 = t22 - t11; _starpu_dlartg_(&t[*j1 + j2 * t_dim1], &d__1, &cs, &sn, &temp); /* Apply transformation to the matrix T. */ if (j3 <= *n) { i__1 = *n - *j1 - 1; _starpu_drot_(&i__1, &t[*j1 + j3 * t_dim1], ldt, &t[j2 + j3 * t_dim1], ldt, &cs, &sn); } i__1 = *j1 - 1; _starpu_drot_(&i__1, &t[*j1 * t_dim1 + 1], &c__1, &t[j2 * t_dim1 + 1], &c__1, &cs, &sn); t[*j1 + *j1 * t_dim1] = t22; t[j2 + j2 * t_dim1] = t11; if (*wantq) { /* Accumulate transformation in the matrix Q. */ _starpu_drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[j2 * q_dim1 + 1], &c__1, &cs, &sn); } } else { /* Swapping involves at least one 2-by-2 block. */ /* Copy the diagonal block of order N1+N2 to the local array D */ /* and compute its norm. */ nd = *n1 + *n2; _starpu_dlacpy_("Full", &nd, &nd, &t[*j1 + *j1 * t_dim1], ldt, d__, &c__4); dnorm = _starpu_dlange_("Max", &nd, &nd, d__, &c__4, &work[1]); /* Compute machine-dependent threshold for test for accepting */ /* swap. */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; /* Computing MAX */ d__1 = eps * 10. * dnorm; thresh = max(d__1,smlnum); /* Solve T11*X - X*T22 = scale*T12 for X. */ _starpu_dlasy2_(&c_false, &c_false, &c_n1, n1, n2, d__, &c__4, &d__[*n1 + 1 + (*n1 + 1 << 2) - 5], &c__4, &d__[(*n1 + 1 << 2) - 4], &c__4, & scale, x, &c__2, &xnorm, &ierr); /* Swap the adjacent diagonal blocks. */ k = *n1 + *n1 + *n2 - 3; switch (k) { case 1: goto L10; case 2: goto L20; case 3: goto L30; } L10: /* N1 = 1, N2 = 2: generate elementary reflector H so that: */ /* ( scale, X11, X12 ) H = ( 0, 0, * ) */ u[0] = scale; u[1] = x[0]; u[2] = x[2]; _starpu_dlarfg_(&c__3, &u[2], u, &c__1, &tau); u[2] = 1.; t11 = t[*j1 + *j1 * t_dim1]; /* Perform swap provisionally on diagonal block in D. */ _starpu_dlarfx_("L", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]); _starpu_dlarfx_("R", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]); /* Test whether to reject swap. */ /* Computing MAX */ d__2 = abs(d__[2]), d__3 = abs(d__[6]), d__2 = max(d__2,d__3), d__3 = (d__1 = d__[10] - t11, abs(d__1)); if (max(d__2,d__3) > thresh) { goto L50; } /* Accept swap: apply transformation to the entire matrix T. */ i__1 = *n - *j1 + 1; _starpu_dlarfx_("L", &c__3, &i__1, u, &tau, &t[*j1 + *j1 * t_dim1], ldt, & work[1]); _starpu_dlarfx_("R", &j2, &c__3, u, &tau, &t[*j1 * t_dim1 + 1], ldt, &work[1]); t[j3 + *j1 * t_dim1] = 0.; t[j3 + j2 * t_dim1] = 0.; t[j3 + j3 * t_dim1] = t11; if (*wantq) { /* Accumulate transformation in the matrix Q. */ _starpu_dlarfx_("R", n, &c__3, u, &tau, &q[*j1 * q_dim1 + 1], ldq, &work[ 1]); } goto L40; L20: /* N1 = 2, N2 = 1: generate elementary reflector H so that: */ /* H ( -X11 ) = ( * ) */ /* ( -X21 ) = ( 0 ) */ /* ( scale ) = ( 0 ) */ u[0] = -x[0]; u[1] = -x[1]; u[2] = scale; _starpu_dlarfg_(&c__3, u, &u[1], &c__1, &tau); u[0] = 1.; t33 = t[j3 + j3 * t_dim1]; /* Perform swap provisionally on diagonal block in D. */ _starpu_dlarfx_("L", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]); _starpu_dlarfx_("R", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]); /* Test whether to reject swap. */ /* Computing MAX */ d__2 = abs(d__[1]), d__3 = abs(d__[2]), d__2 = max(d__2,d__3), d__3 = (d__1 = d__[0] - t33, abs(d__1)); if (max(d__2,d__3) > thresh) { goto L50; } /* Accept swap: apply transformation to the entire matrix T. */ _starpu_dlarfx_("R", &j3, &c__3, u, &tau, &t[*j1 * t_dim1 + 1], ldt, &work[1]); i__1 = *n - *j1; _starpu_dlarfx_("L", &c__3, &i__1, u, &tau, &t[*j1 + j2 * t_dim1], ldt, &work[ 1]); t[*j1 + *j1 * t_dim1] = t33; t[j2 + *j1 * t_dim1] = 0.; t[j3 + *j1 * t_dim1] = 0.; if (*wantq) { /* Accumulate transformation in the matrix Q. */ _starpu_dlarfx_("R", n, &c__3, u, &tau, &q[*j1 * q_dim1 + 1], ldq, &work[ 1]); } goto L40; L30: /* N1 = 2, N2 = 2: generate elementary reflectors H(1) and H(2) so */ /* that: */ /* H(2) H(1) ( -X11 -X12 ) = ( * * ) */ /* ( -X21 -X22 ) ( 0 * ) */ /* ( scale 0 ) ( 0 0 ) */ /* ( 0 scale ) ( 0 0 ) */ u1[0] = -x[0]; u1[1] = -x[1]; u1[2] = scale; _starpu_dlarfg_(&c__3, u1, &u1[1], &c__1, &tau1); u1[0] = 1.; temp = -tau1 * (x[2] + u1[1] * x[3]); u2[0] = -temp * u1[1] - x[3]; u2[1] = -temp * u1[2]; u2[2] = scale; _starpu_dlarfg_(&c__3, u2, &u2[1], &c__1, &tau2); u2[0] = 1.; /* Perform swap provisionally on diagonal block in D. */ _starpu_dlarfx_("L", &c__3, &c__4, u1, &tau1, d__, &c__4, &work[1]) ; _starpu_dlarfx_("R", &c__4, &c__3, u1, &tau1, d__, &c__4, &work[1]) ; _starpu_dlarfx_("L", &c__3, &c__4, u2, &tau2, &d__[1], &c__4, &work[1]); _starpu_dlarfx_("R", &c__4, &c__3, u2, &tau2, &d__[4], &c__4, &work[1]); /* Test whether to reject swap. */ /* Computing MAX */ d__1 = abs(d__[2]), d__2 = abs(d__[6]), d__1 = max(d__1,d__2), d__2 = abs(d__[3]), d__1 = max(d__1,d__2), d__2 = abs(d__[7]); if (max(d__1,d__2) > thresh) { goto L50; } /* Accept swap: apply transformation to the entire matrix T. */ i__1 = *n - *j1 + 1; _starpu_dlarfx_("L", &c__3, &i__1, u1, &tau1, &t[*j1 + *j1 * t_dim1], ldt, & work[1]); _starpu_dlarfx_("R", &j4, &c__3, u1, &tau1, &t[*j1 * t_dim1 + 1], ldt, &work[ 1]); i__1 = *n - *j1 + 1; _starpu_dlarfx_("L", &c__3, &i__1, u2, &tau2, &t[j2 + *j1 * t_dim1], ldt, & work[1]); _starpu_dlarfx_("R", &j4, &c__3, u2, &tau2, &t[j2 * t_dim1 + 1], ldt, &work[1] ); t[j3 + *j1 * t_dim1] = 0.; t[j3 + j2 * t_dim1] = 0.; t[j4 + *j1 * t_dim1] = 0.; t[j4 + j2 * t_dim1] = 0.; if (*wantq) { /* Accumulate transformation in the matrix Q. */ _starpu_dlarfx_("R", n, &c__3, u1, &tau1, &q[*j1 * q_dim1 + 1], ldq, & work[1]); _starpu_dlarfx_("R", n, &c__3, u2, &tau2, &q[j2 * q_dim1 + 1], ldq, &work[ 1]); } L40: if (*n2 == 2) { /* Standardize new 2-by-2 block T11 */ _starpu_dlanv2_(&t[*j1 + *j1 * t_dim1], &t[*j1 + j2 * t_dim1], &t[j2 + * j1 * t_dim1], &t[j2 + j2 * t_dim1], &wr1, &wi1, &wr2, & wi2, &cs, &sn); i__1 = *n - *j1 - 1; _starpu_drot_(&i__1, &t[*j1 + (*j1 + 2) * t_dim1], ldt, &t[j2 + (*j1 + 2) * t_dim1], ldt, &cs, &sn); i__1 = *j1 - 1; _starpu_drot_(&i__1, &t[*j1 * t_dim1 + 1], &c__1, &t[j2 * t_dim1 + 1], & c__1, &cs, &sn); if (*wantq) { _starpu_drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[j2 * q_dim1 + 1], & c__1, &cs, &sn); } } if (*n1 == 2) { /* Standardize new 2-by-2 block T22 */ j3 = *j1 + *n2; j4 = j3 + 1; _starpu_dlanv2_(&t[j3 + j3 * t_dim1], &t[j3 + j4 * t_dim1], &t[j4 + j3 * t_dim1], &t[j4 + j4 * t_dim1], &wr1, &wi1, &wr2, &wi2, & cs, &sn); if (j3 + 2 <= *n) { i__1 = *n - j3 - 1; _starpu_drot_(&i__1, &t[j3 + (j3 + 2) * t_dim1], ldt, &t[j4 + (j3 + 2) * t_dim1], ldt, &cs, &sn); } i__1 = j3 - 1; _starpu_drot_(&i__1, &t[j3 * t_dim1 + 1], &c__1, &t[j4 * t_dim1 + 1], & c__1, &cs, &sn); if (*wantq) { _starpu_drot_(n, &q[j3 * q_dim1 + 1], &c__1, &q[j4 * q_dim1 + 1], & c__1, &cs, &sn); } } } return 0; /* Exit with INFO = 1 if swap was rejected. */ L50: *info = 1; return 0; /* End of DLAEXC */ } /* _starpu_dlaexc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlag2.c000066400000000000000000000263531413463044200203500ustar00rootroot00000000000000/* dlag2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlag2_(doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *safmin, doublereal *scale1, doublereal * scale2, doublereal *wr1, doublereal *wr2, doublereal *wi) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal r__, c1, c2, c3, c4, c5, s1, s2, a11, a12, a21, a22, b11, b12, b22, pp, qq, ss, as11, as12, as22, sum, abi22, diff, bmin, wbig, wabs, wdet, binv11, binv22, discr, anorm, bnorm, bsize, shift, rtmin, rtmax, wsize, ascale, bscale, wscale, safmax, wsmall; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAG2 computes the eigenvalues of a 2 x 2 generalized eigenvalue */ /* problem A - w B, with scaling as necessary to avoid over-/underflow. */ /* The scaling factor "s" results in a modified eigenvalue equation */ /* s A - w B */ /* where s is a non-negative scaling factor chosen so that w, w B, */ /* and s A do not overflow and, if possible, do not underflow, either. */ /* Arguments */ /* ========= */ /* A (input) DOUBLE PRECISION array, dimension (LDA, 2) */ /* On entry, the 2 x 2 matrix A. It is assumed that its 1-norm */ /* is less than 1/SAFMIN. Entries less than */ /* sqrt(SAFMIN)*norm(A) are subject to being treated as zero. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= 2. */ /* B (input) DOUBLE PRECISION array, dimension (LDB, 2) */ /* On entry, the 2 x 2 upper triangular matrix B. It is */ /* assumed that the one-norm of B is less than 1/SAFMIN. The */ /* diagonals should be at least sqrt(SAFMIN) times the largest */ /* element of B (in absolute value); if a diagonal is smaller */ /* than that, then +/- sqrt(SAFMIN) will be used instead of */ /* that diagonal. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= 2. */ /* SAFMIN (input) DOUBLE PRECISION */ /* The smallest positive number s.t. 1/SAFMIN does not */ /* overflow. (This should always be DLAMCH('S') -- it is an */ /* argument in order to avoid having to call DLAMCH frequently.) */ /* SCALE1 (output) DOUBLE PRECISION */ /* A scaling factor used to avoid over-/underflow in the */ /* eigenvalue equation which defines the first eigenvalue. If */ /* the eigenvalues are complex, then the eigenvalues are */ /* ( WR1 +/- WI i ) / SCALE1 (which may lie outside the */ /* exponent range of the machine), SCALE1=SCALE2, and SCALE1 */ /* will always be positive. If the eigenvalues are real, then */ /* the first (real) eigenvalue is WR1 / SCALE1 , but this may */ /* overflow or underflow, and in fact, SCALE1 may be zero or */ /* less than the underflow threshhold if the exact eigenvalue */ /* is sufficiently large. */ /* SCALE2 (output) DOUBLE PRECISION */ /* A scaling factor used to avoid over-/underflow in the */ /* eigenvalue equation which defines the second eigenvalue. If */ /* the eigenvalues are complex, then SCALE2=SCALE1. If the */ /* eigenvalues are real, then the second (real) eigenvalue is */ /* WR2 / SCALE2 , but this may overflow or underflow, and in */ /* fact, SCALE2 may be zero or less than the underflow */ /* threshhold if the exact eigenvalue is sufficiently large. */ /* WR1 (output) DOUBLE PRECISION */ /* If the eigenvalue is real, then WR1 is SCALE1 times the */ /* eigenvalue closest to the (2,2) element of A B**(-1). If the */ /* eigenvalue is complex, then WR1=WR2 is SCALE1 times the real */ /* part of the eigenvalues. */ /* WR2 (output) DOUBLE PRECISION */ /* If the eigenvalue is real, then WR2 is SCALE2 times the */ /* other eigenvalue. If the eigenvalue is complex, then */ /* WR1=WR2 is SCALE1 times the real part of the eigenvalues. */ /* WI (output) DOUBLE PRECISION */ /* If the eigenvalue is real, then WI is zero. If the */ /* eigenvalue is complex, then WI is SCALE1 times the imaginary */ /* part of the eigenvalues. WI will always be non-negative. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ rtmin = sqrt(*safmin); rtmax = 1. / rtmin; safmax = 1. / *safmin; /* Scale A */ /* Computing MAX */ d__5 = (d__1 = a[a_dim1 + 1], abs(d__1)) + (d__2 = a[a_dim1 + 2], abs( d__2)), d__6 = (d__3 = a[(a_dim1 << 1) + 1], abs(d__3)) + (d__4 = a[(a_dim1 << 1) + 2], abs(d__4)), d__5 = max(d__5,d__6); anorm = max(d__5,*safmin); ascale = 1. / anorm; a11 = ascale * a[a_dim1 + 1]; a21 = ascale * a[a_dim1 + 2]; a12 = ascale * a[(a_dim1 << 1) + 1]; a22 = ascale * a[(a_dim1 << 1) + 2]; /* Perturb B if necessary to insure non-singularity */ b11 = b[b_dim1 + 1]; b12 = b[(b_dim1 << 1) + 1]; b22 = b[(b_dim1 << 1) + 2]; /* Computing MAX */ d__1 = abs(b11), d__2 = abs(b12), d__1 = max(d__1,d__2), d__2 = abs(b22), d__1 = max(d__1,d__2); bmin = rtmin * max(d__1,rtmin); if (abs(b11) < bmin) { b11 = d_sign(&bmin, &b11); } if (abs(b22) < bmin) { b22 = d_sign(&bmin, &b22); } /* Scale B */ /* Computing MAX */ d__1 = abs(b11), d__2 = abs(b12) + abs(b22), d__1 = max(d__1,d__2); bnorm = max(d__1,*safmin); /* Computing MAX */ d__1 = abs(b11), d__2 = abs(b22); bsize = max(d__1,d__2); bscale = 1. / bsize; b11 *= bscale; b12 *= bscale; b22 *= bscale; /* Compute larger eigenvalue by method described by C. van Loan */ /* ( AS is A shifted by -SHIFT*B ) */ binv11 = 1. / b11; binv22 = 1. / b22; s1 = a11 * binv11; s2 = a22 * binv22; if (abs(s1) <= abs(s2)) { as12 = a12 - s1 * b12; as22 = a22 - s1 * b22; ss = a21 * (binv11 * binv22); abi22 = as22 * binv22 - ss * b12; pp = abi22 * .5; shift = s1; } else { as12 = a12 - s2 * b12; as11 = a11 - s2 * b11; ss = a21 * (binv11 * binv22); abi22 = -ss * b12; pp = (as11 * binv11 + abi22) * .5; shift = s2; } qq = ss * as12; if ((d__1 = pp * rtmin, abs(d__1)) >= 1.) { /* Computing 2nd power */ d__1 = rtmin * pp; discr = d__1 * d__1 + qq * *safmin; r__ = sqrt((abs(discr))) * rtmax; } else { /* Computing 2nd power */ d__1 = pp; if (d__1 * d__1 + abs(qq) <= *safmin) { /* Computing 2nd power */ d__1 = rtmax * pp; discr = d__1 * d__1 + qq * safmax; r__ = sqrt((abs(discr))) * rtmin; } else { /* Computing 2nd power */ d__1 = pp; discr = d__1 * d__1 + qq; r__ = sqrt((abs(discr))); } } /* Note: the test of R in the following IF is to cover the case when */ /* DISCR is small and negative and is flushed to zero during */ /* the calculation of R. On machines which have a consistent */ /* flush-to-zero threshhold and handle numbers above that */ /* threshhold correctly, it would not be necessary. */ if (discr >= 0. || r__ == 0.) { sum = pp + d_sign(&r__, &pp); diff = pp - d_sign(&r__, &pp); wbig = shift + sum; /* Compute smaller eigenvalue */ wsmall = shift + diff; /* Computing MAX */ d__1 = abs(wsmall); if (abs(wbig) * .5 > max(d__1,*safmin)) { wdet = (a11 * a22 - a12 * a21) * (binv11 * binv22); wsmall = wdet / wbig; } /* Choose (real) eigenvalue closest to 2,2 element of A*B**(-1) */ /* for WR1. */ if (pp > abi22) { *wr1 = min(wbig,wsmall); *wr2 = max(wbig,wsmall); } else { *wr1 = max(wbig,wsmall); *wr2 = min(wbig,wsmall); } *wi = 0.; } else { /* Complex eigenvalues */ *wr1 = shift + pp; *wr2 = *wr1; *wi = r__; } /* Further scaling to avoid underflow and overflow in computing */ /* SCALE1 and overflow in computing w*B. */ /* This scale factor (WSCALE) is bounded from above using C1 and C2, */ /* and from below using C3 and C4. */ /* C1 implements the condition s A must never overflow. */ /* C2 implements the condition w B must never overflow. */ /* C3, with C2, */ /* implement the condition that s A - w B must never overflow. */ /* C4 implements the condition s should not underflow. */ /* C5 implements the condition max(s,|w|) should be at least 2. */ c1 = bsize * (*safmin * max(1.,ascale)); c2 = *safmin * max(1.,bnorm); c3 = bsize * *safmin; if (ascale <= 1. && bsize <= 1.) { /* Computing MIN */ d__1 = 1., d__2 = ascale / *safmin * bsize; c4 = min(d__1,d__2); } else { c4 = 1.; } if (ascale <= 1. || bsize <= 1.) { /* Computing MIN */ d__1 = 1., d__2 = ascale * bsize; c5 = min(d__1,d__2); } else { c5 = 1.; } /* Scale first eigenvalue */ wabs = abs(*wr1) + abs(*wi); /* Computing MAX */ /* Computing MIN */ d__3 = c4, d__4 = max(wabs,c5) * .5; d__1 = max(*safmin,c1), d__2 = (wabs * c2 + c3) * 1.0000100000000001, d__1 = max(d__1,d__2), d__2 = min(d__3,d__4); wsize = max(d__1,d__2); if (wsize != 1.) { wscale = 1. / wsize; if (wsize > 1.) { *scale1 = max(ascale,bsize) * wscale * min(ascale,bsize); } else { *scale1 = min(ascale,bsize) * wscale * max(ascale,bsize); } *wr1 *= wscale; if (*wi != 0.) { *wi *= wscale; *wr2 = *wr1; *scale2 = *scale1; } } else { *scale1 = ascale * bsize; *scale2 = *scale1; } /* Scale second eigenvalue (if real) */ if (*wi == 0.) { /* Computing MAX */ /* Computing MIN */ /* Computing MAX */ d__5 = abs(*wr2); d__3 = c4, d__4 = max(d__5,c5) * .5; d__1 = max(*safmin,c1), d__2 = (abs(*wr2) * c2 + c3) * 1.0000100000000001, d__1 = max(d__1,d__2), d__2 = min(d__3, d__4); wsize = max(d__1,d__2); if (wsize != 1.) { wscale = 1. / wsize; if (wsize > 1.) { *scale2 = max(ascale,bsize) * wscale * min(ascale,bsize); } else { *scale2 = min(ascale,bsize) * wscale * max(ascale,bsize); } *wr2 *= wscale; } else { *scale2 = ascale * bsize; } } /* End of DLAG2 */ return 0; } /* _starpu_dlag2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlag2s.c000066400000000000000000000063011413463044200205220ustar00rootroot00000000000000/* dlag2s.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlag2s_(integer *m, integer *n, doublereal *a, integer * lda, real *sa, integer *ldsa, integer *info) { /* System generated locals */ integer sa_dim1, sa_offset, a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j; doublereal rmax; extern doublereal _starpu_slamch_(char *); /* -- LAPACK PROTOTYPE auxiliary routine (version 3.1.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* August 2007 */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAG2S converts a DOUBLE PRECISION matrix, SA, to a SINGLE */ /* PRECISION matrix, A. */ /* RMAX is the overflow for the SINGLE PRECISION arithmetic */ /* DLAG2S checks that all the entries of A are between -RMAX and */ /* RMAX. If not the convertion is aborted and a flag is raised. */ /* This is an auxiliary routine so there is no argument checking. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of lines of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N coefficient matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* SA (output) REAL array, dimension (LDSA,N) */ /* On exit, if INFO=0, the M-by-N coefficient matrix SA; if */ /* INFO>0, the content of SA is unspecified. */ /* LDSA (input) INTEGER */ /* The leading dimension of the array SA. LDSA >= max(1,M). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* = 1: an entry of the matrix A is greater than the SINGLE */ /* PRECISION overflow threshold, in this case, the content */ /* of SA in exit is unspecified. */ /* ========= */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; sa_dim1 = *ldsa; sa_offset = 1 + sa_dim1; sa -= sa_offset; /* Function Body */ rmax = _starpu_slamch_("O"); i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { if (a[i__ + j * a_dim1] < -rmax || a[i__ + j * a_dim1] > rmax) { *info = 1; goto L30; } sa[i__ + j * sa_dim1] = a[i__ + j * a_dim1]; /* L10: */ } /* L20: */ } *info = 0; L30: return 0; /* End of DLAG2S */ } /* _starpu_dlag2s_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlags2.c000066400000000000000000000201621413463044200205230ustar00rootroot00000000000000/* dlags2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlags2_(logical *upper, doublereal *a1, doublereal *a2, doublereal *a3, doublereal *b1, doublereal *b2, doublereal *b3, doublereal *csu, doublereal *snu, doublereal *csv, doublereal *snv, doublereal *csq, doublereal *snq) { /* System generated locals */ doublereal d__1; /* Local variables */ doublereal a, b, c__, d__, r__, s1, s2, ua11, ua12, ua21, ua22, vb11, vb12, vb21, vb22, csl, csr, snl, snr, aua11, aua12, aua21, aua22, avb11, avb12, avb21, avb22, ua11r, ua22r, vb11r, vb22r; extern /* Subroutine */ int _starpu_dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAGS2 computes 2-by-2 orthogonal matrices U, V and Q, such */ /* that if ( UPPER ) then */ /* U'*A*Q = U'*( A1 A2 )*Q = ( x 0 ) */ /* ( 0 A3 ) ( x x ) */ /* and */ /* V'*B*Q = V'*( B1 B2 )*Q = ( x 0 ) */ /* ( 0 B3 ) ( x x ) */ /* or if ( .NOT.UPPER ) then */ /* U'*A*Q = U'*( A1 0 )*Q = ( x x ) */ /* ( A2 A3 ) ( 0 x ) */ /* and */ /* V'*B*Q = V'*( B1 0 )*Q = ( x x ) */ /* ( B2 B3 ) ( 0 x ) */ /* The rows of the transformed A and B are parallel, where */ /* U = ( CSU SNU ), V = ( CSV SNV ), Q = ( CSQ SNQ ) */ /* ( -SNU CSU ) ( -SNV CSV ) ( -SNQ CSQ ) */ /* Z' denotes the transpose of Z. */ /* Arguments */ /* ========= */ /* UPPER (input) LOGICAL */ /* = .TRUE.: the input matrices A and B are upper triangular. */ /* = .FALSE.: the input matrices A and B are lower triangular. */ /* A1 (input) DOUBLE PRECISION */ /* A2 (input) DOUBLE PRECISION */ /* A3 (input) DOUBLE PRECISION */ /* On entry, A1, A2 and A3 are elements of the input 2-by-2 */ /* upper (lower) triangular matrix A. */ /* B1 (input) DOUBLE PRECISION */ /* B2 (input) DOUBLE PRECISION */ /* B3 (input) DOUBLE PRECISION */ /* On entry, B1, B2 and B3 are elements of the input 2-by-2 */ /* upper (lower) triangular matrix B. */ /* CSU (output) DOUBLE PRECISION */ /* SNU (output) DOUBLE PRECISION */ /* The desired orthogonal matrix U. */ /* CSV (output) DOUBLE PRECISION */ /* SNV (output) DOUBLE PRECISION */ /* The desired orthogonal matrix V. */ /* CSQ (output) DOUBLE PRECISION */ /* SNQ (output) DOUBLE PRECISION */ /* The desired orthogonal matrix Q. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ if (*upper) { /* Input matrices A and B are upper triangular matrices */ /* Form matrix C = A*adj(B) = ( a b ) */ /* ( 0 d ) */ a = *a1 * *b3; d__ = *a3 * *b1; b = *a2 * *b1 - *a1 * *b2; /* The SVD of real 2-by-2 triangular C */ /* ( CSL -SNL )*( A B )*( CSR SNR ) = ( R 0 ) */ /* ( SNL CSL ) ( 0 D ) ( -SNR CSR ) ( 0 T ) */ _starpu_dlasv2_(&a, &b, &d__, &s1, &s2, &snr, &csr, &snl, &csl); if (abs(csl) >= abs(snl) || abs(csr) >= abs(snr)) { /* Compute the (1,1) and (1,2) elements of U'*A and V'*B, */ /* and (1,2) element of |U|'*|A| and |V|'*|B|. */ ua11r = csl * *a1; ua12 = csl * *a2 + snl * *a3; vb11r = csr * *b1; vb12 = csr * *b2 + snr * *b3; aua12 = abs(csl) * abs(*a2) + abs(snl) * abs(*a3); avb12 = abs(csr) * abs(*b2) + abs(snr) * abs(*b3); /* zero (1,2) elements of U'*A and V'*B */ if (abs(ua11r) + abs(ua12) != 0.) { if (aua12 / (abs(ua11r) + abs(ua12)) <= avb12 / (abs(vb11r) + abs(vb12))) { d__1 = -ua11r; _starpu_dlartg_(&d__1, &ua12, csq, snq, &r__); } else { d__1 = -vb11r; _starpu_dlartg_(&d__1, &vb12, csq, snq, &r__); } } else { d__1 = -vb11r; _starpu_dlartg_(&d__1, &vb12, csq, snq, &r__); } *csu = csl; *snu = -snl; *csv = csr; *snv = -snr; } else { /* Compute the (2,1) and (2,2) elements of U'*A and V'*B, */ /* and (2,2) element of |U|'*|A| and |V|'*|B|. */ ua21 = -snl * *a1; ua22 = -snl * *a2 + csl * *a3; vb21 = -snr * *b1; vb22 = -snr * *b2 + csr * *b3; aua22 = abs(snl) * abs(*a2) + abs(csl) * abs(*a3); avb22 = abs(snr) * abs(*b2) + abs(csr) * abs(*b3); /* zero (2,2) elements of U'*A and V'*B, and then swap. */ if (abs(ua21) + abs(ua22) != 0.) { if (aua22 / (abs(ua21) + abs(ua22)) <= avb22 / (abs(vb21) + abs(vb22))) { d__1 = -ua21; _starpu_dlartg_(&d__1, &ua22, csq, snq, &r__); } else { d__1 = -vb21; _starpu_dlartg_(&d__1, &vb22, csq, snq, &r__); } } else { d__1 = -vb21; _starpu_dlartg_(&d__1, &vb22, csq, snq, &r__); } *csu = snl; *snu = csl; *csv = snr; *snv = csr; } } else { /* Input matrices A and B are lower triangular matrices */ /* Form matrix C = A*adj(B) = ( a 0 ) */ /* ( c d ) */ a = *a1 * *b3; d__ = *a3 * *b1; c__ = *a2 * *b3 - *a3 * *b2; /* The SVD of real 2-by-2 triangular C */ /* ( CSL -SNL )*( A 0 )*( CSR SNR ) = ( R 0 ) */ /* ( SNL CSL ) ( C D ) ( -SNR CSR ) ( 0 T ) */ _starpu_dlasv2_(&a, &c__, &d__, &s1, &s2, &snr, &csr, &snl, &csl); if (abs(csr) >= abs(snr) || abs(csl) >= abs(snl)) { /* Compute the (2,1) and (2,2) elements of U'*A and V'*B, */ /* and (2,1) element of |U|'*|A| and |V|'*|B|. */ ua21 = -snr * *a1 + csr * *a2; ua22r = csr * *a3; vb21 = -snl * *b1 + csl * *b2; vb22r = csl * *b3; aua21 = abs(snr) * abs(*a1) + abs(csr) * abs(*a2); avb21 = abs(snl) * abs(*b1) + abs(csl) * abs(*b2); /* zero (2,1) elements of U'*A and V'*B. */ if (abs(ua21) + abs(ua22r) != 0.) { if (aua21 / (abs(ua21) + abs(ua22r)) <= avb21 / (abs(vb21) + abs(vb22r))) { _starpu_dlartg_(&ua22r, &ua21, csq, snq, &r__); } else { _starpu_dlartg_(&vb22r, &vb21, csq, snq, &r__); } } else { _starpu_dlartg_(&vb22r, &vb21, csq, snq, &r__); } *csu = csr; *snu = -snr; *csv = csl; *snv = -snl; } else { /* Compute the (1,1) and (1,2) elements of U'*A and V'*B, */ /* and (1,1) element of |U|'*|A| and |V|'*|B|. */ ua11 = csr * *a1 + snr * *a2; ua12 = snr * *a3; vb11 = csl * *b1 + snl * *b2; vb12 = snl * *b3; aua11 = abs(csr) * abs(*a1) + abs(snr) * abs(*a2); avb11 = abs(csl) * abs(*b1) + abs(snl) * abs(*b2); /* zero (1,1) elements of U'*A and V'*B, and then swap. */ if (abs(ua11) + abs(ua12) != 0.) { if (aua11 / (abs(ua11) + abs(ua12)) <= avb11 / (abs(vb11) + abs(vb12))) { _starpu_dlartg_(&ua12, &ua11, csq, snq, &r__); } else { _starpu_dlartg_(&vb12, &vb11, csq, snq, &r__); } } else { _starpu_dlartg_(&vb12, &vb11, csq, snq, &r__); } *csu = snr; *snu = csr; *csv = snl; *snv = csl; } } return 0; /* End of DLAGS2 */ } /* _starpu_dlags2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlagtf.c000066400000000000000000000150451413463044200206140ustar00rootroot00000000000000/* dlagtf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlagtf_(integer *n, doublereal *a, doublereal *lambda, doublereal *b, doublereal *c__, doublereal *tol, doublereal *d__, integer *in, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ integer k; doublereal tl, eps, piv1, piv2, temp, mult, scale1, scale2; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAGTF factorizes the matrix (T - lambda*I), where T is an n by n */ /* tridiagonal matrix and lambda is a scalar, as */ /* T - lambda*I = PLU, */ /* where P is a permutation matrix, L is a unit lower tridiagonal matrix */ /* with at most one non-zero sub-diagonal elements per column and U is */ /* an upper triangular matrix with at most two non-zero super-diagonal */ /* elements per column. */ /* The factorization is obtained by Gaussian elimination with partial */ /* pivoting and implicit row scaling. */ /* The parameter LAMBDA is included in the routine so that DLAGTF may */ /* be used, in conjunction with DLAGTS, to obtain eigenvectors of T by */ /* inverse iteration. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix T. */ /* A (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, A must contain the diagonal elements of T. */ /* On exit, A is overwritten by the n diagonal elements of the */ /* upper triangular matrix U of the factorization of T. */ /* LAMBDA (input) DOUBLE PRECISION */ /* On entry, the scalar lambda. */ /* B (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, B must contain the (n-1) super-diagonal elements of */ /* T. */ /* On exit, B is overwritten by the (n-1) super-diagonal */ /* elements of the matrix U of the factorization of T. */ /* C (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, C must contain the (n-1) sub-diagonal elements of */ /* T. */ /* On exit, C is overwritten by the (n-1) sub-diagonal elements */ /* of the matrix L of the factorization of T. */ /* TOL (input) DOUBLE PRECISION */ /* On entry, a relative tolerance used to indicate whether or */ /* not the matrix (T - lambda*I) is nearly singular. TOL should */ /* normally be chose as approximately the largest relative error */ /* in the elements of T. For example, if the elements of T are */ /* correct to about 4 significant figures, then TOL should be */ /* set to about 5*10**(-4). If TOL is supplied as less than eps, */ /* where eps is the relative machine precision, then the value */ /* eps is used in place of TOL. */ /* D (output) DOUBLE PRECISION array, dimension (N-2) */ /* On exit, D is overwritten by the (n-2) second super-diagonal */ /* elements of the matrix U of the factorization of T. */ /* IN (output) INTEGER array, dimension (N) */ /* On exit, IN contains details of the permutation matrix P. If */ /* an interchange occurred at the kth step of the elimination, */ /* then IN(k) = 1, otherwise IN(k) = 0. The element IN(n) */ /* returns the smallest positive integer j such that */ /* abs( u(j,j) ).le. norm( (T - lambda*I)(j) )*TOL, */ /* where norm( A(j) ) denotes the sum of the absolute values of */ /* the jth row of the matrix A. If no such j exists then IN(n) */ /* is returned as zero. If IN(n) is returned as positive, then a */ /* diagonal element of U is small, indicating that */ /* (T - lambda*I) is singular or nearly singular, */ /* INFO (output) INTEGER */ /* = 0 : successful exit */ /* .lt. 0: if INFO = -k, the kth argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --in; --d__; --c__; --b; --a; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; i__1 = -(*info); _starpu_xerbla_("DLAGTF", &i__1); return 0; } if (*n == 0) { return 0; } a[1] -= *lambda; in[*n] = 0; if (*n == 1) { if (a[1] == 0.) { in[1] = 1; } return 0; } eps = _starpu_dlamch_("Epsilon"); tl = max(*tol,eps); scale1 = abs(a[1]) + abs(b[1]); i__1 = *n - 1; for (k = 1; k <= i__1; ++k) { a[k + 1] -= *lambda; scale2 = (d__1 = c__[k], abs(d__1)) + (d__2 = a[k + 1], abs(d__2)); if (k < *n - 1) { scale2 += (d__1 = b[k + 1], abs(d__1)); } if (a[k] == 0.) { piv1 = 0.; } else { piv1 = (d__1 = a[k], abs(d__1)) / scale1; } if (c__[k] == 0.) { in[k] = 0; piv2 = 0.; scale1 = scale2; if (k < *n - 1) { d__[k] = 0.; } } else { piv2 = (d__1 = c__[k], abs(d__1)) / scale2; if (piv2 <= piv1) { in[k] = 0; scale1 = scale2; c__[k] /= a[k]; a[k + 1] -= c__[k] * b[k]; if (k < *n - 1) { d__[k] = 0.; } } else { in[k] = 1; mult = a[k] / c__[k]; a[k] = c__[k]; temp = a[k + 1]; a[k + 1] = b[k] - mult * temp; if (k < *n - 1) { d__[k] = b[k + 1]; b[k + 1] = -mult * d__[k]; } b[k] = temp; c__[k] = mult; } } if (max(piv1,piv2) <= tl && in[*n] == 0) { in[*n] = k; } /* L10: */ } if ((d__1 = a[*n], abs(d__1)) <= scale1 * tl && in[*n] == 0) { in[*n] = *n; } return 0; /* End of DLAGTF */ } /* _starpu_dlagtf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlagtm.c000066400000000000000000000157661413463044200206350ustar00rootroot00000000000000/* dlagtm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlagtm_(char *trans, integer *n, integer *nrhs, doublereal *alpha, doublereal *dl, doublereal *d__, doublereal *du, doublereal *x, integer *ldx, doublereal *beta, doublereal *b, integer *ldb) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; /* Local variables */ integer i__, j; extern logical _starpu_lsame_(char *, char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAGTM performs a matrix-vector product of the form */ /* B := alpha * A * X + beta * B */ /* where A is a tridiagonal matrix of order N, B and X are N by NRHS */ /* matrices, and alpha and beta are real scalars, each of which may be */ /* 0., 1., or -1. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the operation applied to A. */ /* = 'N': No transpose, B := alpha * A * X + beta * B */ /* = 'T': Transpose, B := alpha * A'* X + beta * B */ /* = 'C': Conjugate transpose = Transpose */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices X and B. */ /* ALPHA (input) DOUBLE PRECISION */ /* The scalar alpha. ALPHA must be 0., 1., or -1.; otherwise, */ /* it is assumed to be 0. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) sub-diagonal elements of T. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of T. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) super-diagonal elements of T. */ /* X (input) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* The N by NRHS matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(N,1). */ /* BETA (input) DOUBLE PRECISION */ /* The scalar beta. BETA must be 0., 1., or -1.; otherwise, */ /* it is assumed to be 1. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N by NRHS matrix B. */ /* On exit, B is overwritten by the matrix expression */ /* B := alpha * A * X + beta * B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(N,1). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --dl; --d__; --du; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ if (*n == 0) { return 0; } /* Multiply B by BETA if BETA.NE.1. */ if (*beta == 0.) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } } else if (*beta == -1.) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = -b[i__ + j * b_dim1]; /* L30: */ } /* L40: */ } } if (*alpha == 1.) { if (_starpu_lsame_(trans, "N")) { /* Compute B := B + A*X */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (*n == 1) { b[j * b_dim1 + 1] += d__[1] * x[j * x_dim1 + 1]; } else { b[j * b_dim1 + 1] = b[j * b_dim1 + 1] + d__[1] * x[j * x_dim1 + 1] + du[1] * x[j * x_dim1 + 2]; b[*n + j * b_dim1] = b[*n + j * b_dim1] + dl[*n - 1] * x[* n - 1 + j * x_dim1] + d__[*n] * x[*n + j * x_dim1] ; i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = b[i__ + j * b_dim1] + dl[i__ - 1] * x[i__ - 1 + j * x_dim1] + d__[i__] * x[ i__ + j * x_dim1] + du[i__] * x[i__ + 1 + j * x_dim1]; /* L50: */ } } /* L60: */ } } else { /* Compute B := B + A'*X */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (*n == 1) { b[j * b_dim1 + 1] += d__[1] * x[j * x_dim1 + 1]; } else { b[j * b_dim1 + 1] = b[j * b_dim1 + 1] + d__[1] * x[j * x_dim1 + 1] + dl[1] * x[j * x_dim1 + 2]; b[*n + j * b_dim1] = b[*n + j * b_dim1] + du[*n - 1] * x[* n - 1 + j * x_dim1] + d__[*n] * x[*n + j * x_dim1] ; i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = b[i__ + j * b_dim1] + du[i__ - 1] * x[i__ - 1 + j * x_dim1] + d__[i__] * x[ i__ + j * x_dim1] + dl[i__] * x[i__ + 1 + j * x_dim1]; /* L70: */ } } /* L80: */ } } } else if (*alpha == -1.) { if (_starpu_lsame_(trans, "N")) { /* Compute B := B - A*X */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (*n == 1) { b[j * b_dim1 + 1] -= d__[1] * x[j * x_dim1 + 1]; } else { b[j * b_dim1 + 1] = b[j * b_dim1 + 1] - d__[1] * x[j * x_dim1 + 1] - du[1] * x[j * x_dim1 + 2]; b[*n + j * b_dim1] = b[*n + j * b_dim1] - dl[*n - 1] * x[* n - 1 + j * x_dim1] - d__[*n] * x[*n + j * x_dim1] ; i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = b[i__ + j * b_dim1] - dl[i__ - 1] * x[i__ - 1 + j * x_dim1] - d__[i__] * x[ i__ + j * x_dim1] - du[i__] * x[i__ + 1 + j * x_dim1]; /* L90: */ } } /* L100: */ } } else { /* Compute B := B - A'*X */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (*n == 1) { b[j * b_dim1 + 1] -= d__[1] * x[j * x_dim1 + 1]; } else { b[j * b_dim1 + 1] = b[j * b_dim1 + 1] - d__[1] * x[j * x_dim1 + 1] - dl[1] * x[j * x_dim1 + 2]; b[*n + j * b_dim1] = b[*n + j * b_dim1] - du[*n - 1] * x[* n - 1 + j * x_dim1] - d__[*n] * x[*n + j * x_dim1] ; i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = b[i__ + j * b_dim1] - du[i__ - 1] * x[i__ - 1 + j * x_dim1] - d__[i__] * x[ i__ + j * x_dim1] - dl[i__] * x[i__ + 1 + j * x_dim1]; /* L110: */ } } /* L120: */ } } } return 0; /* End of DLAGTM */ } /* _starpu_dlagtm_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlagts.c000066400000000000000000000226061413463044200206320ustar00rootroot00000000000000/* dlagts.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlagts_(integer *job, integer *n, doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, integer *in, doublereal *y, doublereal *tol, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ integer k; doublereal ak, eps, temp, pert, absak, sfmin; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAGTS may be used to solve one of the systems of equations */ /* (T - lambda*I)*x = y or (T - lambda*I)'*x = y, */ /* where T is an n by n tridiagonal matrix, for x, following the */ /* factorization of (T - lambda*I) as */ /* (T - lambda*I) = P*L*U , */ /* by routine DLAGTF. The choice of equation to be solved is */ /* controlled by the argument JOB, and in each case there is an option */ /* to perturb zero or very small diagonal elements of U, this option */ /* being intended for use in applications such as inverse iteration. */ /* Arguments */ /* ========= */ /* JOB (input) INTEGER */ /* Specifies the job to be performed by DLAGTS as follows: */ /* = 1: The equations (T - lambda*I)x = y are to be solved, */ /* but diagonal elements of U are not to be perturbed. */ /* = -1: The equations (T - lambda*I)x = y are to be solved */ /* and, if overflow would otherwise occur, the diagonal */ /* elements of U are to be perturbed. See argument TOL */ /* below. */ /* = 2: The equations (T - lambda*I)'x = y are to be solved, */ /* but diagonal elements of U are not to be perturbed. */ /* = -2: The equations (T - lambda*I)'x = y are to be solved */ /* and, if overflow would otherwise occur, the diagonal */ /* elements of U are to be perturbed. See argument TOL */ /* below. */ /* N (input) INTEGER */ /* The order of the matrix T. */ /* A (input) DOUBLE PRECISION array, dimension (N) */ /* On entry, A must contain the diagonal elements of U as */ /* returned from DLAGTF. */ /* B (input) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, B must contain the first super-diagonal elements of */ /* U as returned from DLAGTF. */ /* C (input) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, C must contain the sub-diagonal elements of L as */ /* returned from DLAGTF. */ /* D (input) DOUBLE PRECISION array, dimension (N-2) */ /* On entry, D must contain the second super-diagonal elements */ /* of U as returned from DLAGTF. */ /* IN (input) INTEGER array, dimension (N) */ /* On entry, IN must contain details of the matrix P as returned */ /* from DLAGTF. */ /* Y (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the right hand side vector y. */ /* On exit, Y is overwritten by the solution vector x. */ /* TOL (input/output) DOUBLE PRECISION */ /* On entry, with JOB .lt. 0, TOL should be the minimum */ /* perturbation to be made to very small diagonal elements of U. */ /* TOL should normally be chosen as about eps*norm(U), where eps */ /* is the relative machine precision, but if TOL is supplied as */ /* non-positive, then it is reset to eps*max( abs( u(i,j) ) ). */ /* If JOB .gt. 0 then TOL is not referenced. */ /* On exit, TOL is changed as described above, only if TOL is */ /* non-positive on entry. Otherwise TOL is unchanged. */ /* INFO (output) INTEGER */ /* = 0 : successful exit */ /* .lt. 0: if INFO = -i, the i-th argument had an illegal value */ /* .gt. 0: overflow would occur when computing the INFO(th) */ /* element of the solution vector x. This can only occur */ /* when JOB is supplied as positive and either means */ /* that a diagonal element of U is very small, or that */ /* the elements of the right-hand side vector y are very */ /* large. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --y; --in; --d__; --c__; --b; --a; /* Function Body */ *info = 0; if (abs(*job) > 2 || *job == 0) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAGTS", &i__1); return 0; } if (*n == 0) { return 0; } eps = _starpu_dlamch_("Epsilon"); sfmin = _starpu_dlamch_("Safe minimum"); bignum = 1. / sfmin; if (*job < 0) { if (*tol <= 0.) { *tol = abs(a[1]); if (*n > 1) { /* Computing MAX */ d__1 = *tol, d__2 = abs(a[2]), d__1 = max(d__1,d__2), d__2 = abs(b[1]); *tol = max(d__1,d__2); } i__1 = *n; for (k = 3; k <= i__1; ++k) { /* Computing MAX */ d__4 = *tol, d__5 = (d__1 = a[k], abs(d__1)), d__4 = max(d__4, d__5), d__5 = (d__2 = b[k - 1], abs(d__2)), d__4 = max(d__4,d__5), d__5 = (d__3 = d__[k - 2], abs(d__3)); *tol = max(d__4,d__5); /* L10: */ } *tol *= eps; if (*tol == 0.) { *tol = eps; } } } if (abs(*job) == 1) { i__1 = *n; for (k = 2; k <= i__1; ++k) { if (in[k - 1] == 0) { y[k] -= c__[k - 1] * y[k - 1]; } else { temp = y[k - 1]; y[k - 1] = y[k]; y[k] = temp - c__[k - 1] * y[k]; } /* L20: */ } if (*job == 1) { for (k = *n; k >= 1; --k) { if (k <= *n - 2) { temp = y[k] - b[k] * y[k + 1] - d__[k] * y[k + 2]; } else if (k == *n - 1) { temp = y[k] - b[k] * y[k + 1]; } else { temp = y[k]; } ak = a[k]; absak = abs(ak); if (absak < 1.) { if (absak < sfmin) { if (absak == 0. || abs(temp) * sfmin > absak) { *info = k; return 0; } else { temp *= bignum; ak *= bignum; } } else if (abs(temp) > absak * bignum) { *info = k; return 0; } } y[k] = temp / ak; /* L30: */ } } else { for (k = *n; k >= 1; --k) { if (k <= *n - 2) { temp = y[k] - b[k] * y[k + 1] - d__[k] * y[k + 2]; } else if (k == *n - 1) { temp = y[k] - b[k] * y[k + 1]; } else { temp = y[k]; } ak = a[k]; pert = d_sign(tol, &ak); L40: absak = abs(ak); if (absak < 1.) { if (absak < sfmin) { if (absak == 0. || abs(temp) * sfmin > absak) { ak += pert; pert *= 2; goto L40; } else { temp *= bignum; ak *= bignum; } } else if (abs(temp) > absak * bignum) { ak += pert; pert *= 2; goto L40; } } y[k] = temp / ak; /* L50: */ } } } else { /* Come to here if JOB = 2 or -2 */ if (*job == 2) { i__1 = *n; for (k = 1; k <= i__1; ++k) { if (k >= 3) { temp = y[k] - b[k - 1] * y[k - 1] - d__[k - 2] * y[k - 2]; } else if (k == 2) { temp = y[k] - b[k - 1] * y[k - 1]; } else { temp = y[k]; } ak = a[k]; absak = abs(ak); if (absak < 1.) { if (absak < sfmin) { if (absak == 0. || abs(temp) * sfmin > absak) { *info = k; return 0; } else { temp *= bignum; ak *= bignum; } } else if (abs(temp) > absak * bignum) { *info = k; return 0; } } y[k] = temp / ak; /* L60: */ } } else { i__1 = *n; for (k = 1; k <= i__1; ++k) { if (k >= 3) { temp = y[k] - b[k - 1] * y[k - 1] - d__[k - 2] * y[k - 2]; } else if (k == 2) { temp = y[k] - b[k - 1] * y[k - 1]; } else { temp = y[k]; } ak = a[k]; pert = d_sign(tol, &ak); L70: absak = abs(ak); if (absak < 1.) { if (absak < sfmin) { if (absak == 0. || abs(temp) * sfmin > absak) { ak += pert; pert *= 2; goto L70; } else { temp *= bignum; ak *= bignum; } } else if (abs(temp) > absak * bignum) { ak += pert; pert *= 2; goto L70; } } y[k] = temp / ak; /* L80: */ } } for (k = *n; k >= 2; --k) { if (in[k - 1] == 0) { y[k - 1] -= c__[k - 1] * y[k]; } else { temp = y[k - 1]; y[k - 1] = y[k]; y[k] = temp - c__[k - 1] * y[k]; } /* L90: */ } } /* End of DLAGTS */ return 0; } /* _starpu_dlagts_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlagv2.c000066400000000000000000000256511413463044200205360ustar00rootroot00000000000000/* dlagv2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__2 = 2; static integer c__1 = 1; /* Subroutine */ int _starpu_dlagv2_(doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *csl, doublereal *snl, doublereal *csr, doublereal * snr) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ doublereal r__, t, h1, h2, h3, wi, qq, rr, wr1, wr2, ulp; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dlag2_( doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal anorm, bnorm, scale1, scale2; extern /* Subroutine */ int _starpu_dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal _starpu_dlapy2_(doublereal *, doublereal *); doublereal ascale, bscale; extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAGV2 computes the Generalized Schur factorization of a real 2-by-2 */ /* matrix pencil (A,B) where B is upper triangular. This routine */ /* computes orthogonal (rotation) matrices given by CSL, SNL and CSR, */ /* SNR such that */ /* 1) if the pencil (A,B) has two real eigenvalues (include 0/0 or 1/0 */ /* types), then */ /* [ a11 a12 ] := [ CSL SNL ] [ a11 a12 ] [ CSR -SNR ] */ /* [ 0 a22 ] [ -SNL CSL ] [ a21 a22 ] [ SNR CSR ] */ /* [ b11 b12 ] := [ CSL SNL ] [ b11 b12 ] [ CSR -SNR ] */ /* [ 0 b22 ] [ -SNL CSL ] [ 0 b22 ] [ SNR CSR ], */ /* 2) if the pencil (A,B) has a pair of complex conjugate eigenvalues, */ /* then */ /* [ a11 a12 ] := [ CSL SNL ] [ a11 a12 ] [ CSR -SNR ] */ /* [ a21 a22 ] [ -SNL CSL ] [ a21 a22 ] [ SNR CSR ] */ /* [ b11 0 ] := [ CSL SNL ] [ b11 b12 ] [ CSR -SNR ] */ /* [ 0 b22 ] [ -SNL CSL ] [ 0 b22 ] [ SNR CSR ] */ /* where b11 >= b22 > 0. */ /* Arguments */ /* ========= */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, 2) */ /* On entry, the 2 x 2 matrix A. */ /* On exit, A is overwritten by the ``A-part'' of the */ /* generalized Schur form. */ /* LDA (input) INTEGER */ /* THe leading dimension of the array A. LDA >= 2. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, 2) */ /* On entry, the upper triangular 2 x 2 matrix B. */ /* On exit, B is overwritten by the ``B-part'' of the */ /* generalized Schur form. */ /* LDB (input) INTEGER */ /* THe leading dimension of the array B. LDB >= 2. */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (2) */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (2) */ /* BETA (output) DOUBLE PRECISION array, dimension (2) */ /* (ALPHAR(k)+i*ALPHAI(k))/BETA(k) are the eigenvalues of the */ /* pencil (A,B), k=1,2, i = sqrt(-1). Note that BETA(k) may */ /* be zero. */ /* CSL (output) DOUBLE PRECISION */ /* The cosine of the left rotation matrix. */ /* SNL (output) DOUBLE PRECISION */ /* The sine of the left rotation matrix. */ /* CSR (output) DOUBLE PRECISION */ /* The cosine of the right rotation matrix. */ /* SNR (output) DOUBLE PRECISION */ /* The sine of the right rotation matrix. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; /* Function Body */ safmin = _starpu_dlamch_("S"); ulp = _starpu_dlamch_("P"); /* Scale A */ /* Computing MAX */ d__5 = (d__1 = a[a_dim1 + 1], abs(d__1)) + (d__2 = a[a_dim1 + 2], abs( d__2)), d__6 = (d__3 = a[(a_dim1 << 1) + 1], abs(d__3)) + (d__4 = a[(a_dim1 << 1) + 2], abs(d__4)), d__5 = max(d__5,d__6); anorm = max(d__5,safmin); ascale = 1. / anorm; a[a_dim1 + 1] = ascale * a[a_dim1 + 1]; a[(a_dim1 << 1) + 1] = ascale * a[(a_dim1 << 1) + 1]; a[a_dim1 + 2] = ascale * a[a_dim1 + 2]; a[(a_dim1 << 1) + 2] = ascale * a[(a_dim1 << 1) + 2]; /* Scale B */ /* Computing MAX */ d__4 = (d__3 = b[b_dim1 + 1], abs(d__3)), d__5 = (d__1 = b[(b_dim1 << 1) + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1) + 2], abs(d__2)), d__4 = max(d__4,d__5); bnorm = max(d__4,safmin); bscale = 1. / bnorm; b[b_dim1 + 1] = bscale * b[b_dim1 + 1]; b[(b_dim1 << 1) + 1] = bscale * b[(b_dim1 << 1) + 1]; b[(b_dim1 << 1) + 2] = bscale * b[(b_dim1 << 1) + 2]; /* Check if A can be deflated */ if ((d__1 = a[a_dim1 + 2], abs(d__1)) <= ulp) { *csl = 1.; *snl = 0.; *csr = 1.; *snr = 0.; a[a_dim1 + 2] = 0.; b[b_dim1 + 2] = 0.; /* Check if B is singular */ } else if ((d__1 = b[b_dim1 + 1], abs(d__1)) <= ulp) { _starpu_dlartg_(&a[a_dim1 + 1], &a[a_dim1 + 2], csl, snl, &r__); *csr = 1.; *snr = 0.; _starpu_drot_(&c__2, &a[a_dim1 + 1], lda, &a[a_dim1 + 2], lda, csl, snl); _starpu_drot_(&c__2, &b[b_dim1 + 1], ldb, &b[b_dim1 + 2], ldb, csl, snl); a[a_dim1 + 2] = 0.; b[b_dim1 + 1] = 0.; b[b_dim1 + 2] = 0.; } else if ((d__1 = b[(b_dim1 << 1) + 2], abs(d__1)) <= ulp) { _starpu_dlartg_(&a[(a_dim1 << 1) + 2], &a[a_dim1 + 2], csr, snr, &t); *snr = -(*snr); _starpu_drot_(&c__2, &a[a_dim1 + 1], &c__1, &a[(a_dim1 << 1) + 1], &c__1, csr, snr); _starpu_drot_(&c__2, &b[b_dim1 + 1], &c__1, &b[(b_dim1 << 1) + 1], &c__1, csr, snr); *csl = 1.; *snl = 0.; a[a_dim1 + 2] = 0.; b[b_dim1 + 2] = 0.; b[(b_dim1 << 1) + 2] = 0.; } else { /* B is nonsingular, first compute the eigenvalues of (A,B) */ _starpu_dlag2_(&a[a_offset], lda, &b[b_offset], ldb, &safmin, &scale1, & scale2, &wr1, &wr2, &wi); if (wi == 0.) { /* two real eigenvalues, compute s*A-w*B */ h1 = scale1 * a[a_dim1 + 1] - wr1 * b[b_dim1 + 1]; h2 = scale1 * a[(a_dim1 << 1) + 1] - wr1 * b[(b_dim1 << 1) + 1]; h3 = scale1 * a[(a_dim1 << 1) + 2] - wr1 * b[(b_dim1 << 1) + 2]; rr = _starpu_dlapy2_(&h1, &h2); d__1 = scale1 * a[a_dim1 + 2]; qq = _starpu_dlapy2_(&d__1, &h3); if (rr > qq) { /* find right rotation matrix to zero 1,1 element of */ /* (sA - wB) */ _starpu_dlartg_(&h2, &h1, csr, snr, &t); } else { /* find right rotation matrix to zero 2,1 element of */ /* (sA - wB) */ d__1 = scale1 * a[a_dim1 + 2]; _starpu_dlartg_(&h3, &d__1, csr, snr, &t); } *snr = -(*snr); _starpu_drot_(&c__2, &a[a_dim1 + 1], &c__1, &a[(a_dim1 << 1) + 1], &c__1, csr, snr); _starpu_drot_(&c__2, &b[b_dim1 + 1], &c__1, &b[(b_dim1 << 1) + 1], &c__1, csr, snr); /* compute inf norms of A and B */ /* Computing MAX */ d__5 = (d__1 = a[a_dim1 + 1], abs(d__1)) + (d__2 = a[(a_dim1 << 1) + 1], abs(d__2)), d__6 = (d__3 = a[a_dim1 + 2], abs(d__3) ) + (d__4 = a[(a_dim1 << 1) + 2], abs(d__4)); h1 = max(d__5,d__6); /* Computing MAX */ d__5 = (d__1 = b[b_dim1 + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1) + 1], abs(d__2)), d__6 = (d__3 = b[b_dim1 + 2], abs(d__3) ) + (d__4 = b[(b_dim1 << 1) + 2], abs(d__4)); h2 = max(d__5,d__6); if (scale1 * h1 >= abs(wr1) * h2) { /* find left rotation matrix Q to zero out B(2,1) */ _starpu_dlartg_(&b[b_dim1 + 1], &b[b_dim1 + 2], csl, snl, &r__); } else { /* find left rotation matrix Q to zero out A(2,1) */ _starpu_dlartg_(&a[a_dim1 + 1], &a[a_dim1 + 2], csl, snl, &r__); } _starpu_drot_(&c__2, &a[a_dim1 + 1], lda, &a[a_dim1 + 2], lda, csl, snl); _starpu_drot_(&c__2, &b[b_dim1 + 1], ldb, &b[b_dim1 + 2], ldb, csl, snl); a[a_dim1 + 2] = 0.; b[b_dim1 + 2] = 0.; } else { /* a pair of complex conjugate eigenvalues */ /* first compute the SVD of the matrix B */ _starpu_dlasv2_(&b[b_dim1 + 1], &b[(b_dim1 << 1) + 1], &b[(b_dim1 << 1) + 2], &r__, &t, snr, csr, snl, csl); /* Form (A,B) := Q(A,B)Z' where Q is left rotation matrix and */ /* Z is right rotation matrix computed from DLASV2 */ _starpu_drot_(&c__2, &a[a_dim1 + 1], lda, &a[a_dim1 + 2], lda, csl, snl); _starpu_drot_(&c__2, &b[b_dim1 + 1], ldb, &b[b_dim1 + 2], ldb, csl, snl); _starpu_drot_(&c__2, &a[a_dim1 + 1], &c__1, &a[(a_dim1 << 1) + 1], &c__1, csr, snr); _starpu_drot_(&c__2, &b[b_dim1 + 1], &c__1, &b[(b_dim1 << 1) + 1], &c__1, csr, snr); b[b_dim1 + 2] = 0.; b[(b_dim1 << 1) + 1] = 0.; } } /* Unscaling */ a[a_dim1 + 1] = anorm * a[a_dim1 + 1]; a[a_dim1 + 2] = anorm * a[a_dim1 + 2]; a[(a_dim1 << 1) + 1] = anorm * a[(a_dim1 << 1) + 1]; a[(a_dim1 << 1) + 2] = anorm * a[(a_dim1 << 1) + 2]; b[b_dim1 + 1] = bnorm * b[b_dim1 + 1]; b[b_dim1 + 2] = bnorm * b[b_dim1 + 2]; b[(b_dim1 << 1) + 1] = bnorm * b[(b_dim1 << 1) + 1]; b[(b_dim1 << 1) + 2] = bnorm * b[(b_dim1 << 1) + 2]; if (wi == 0.) { alphar[1] = a[a_dim1 + 1]; alphar[2] = a[(a_dim1 << 1) + 2]; alphai[1] = 0.; alphai[2] = 0.; beta[1] = b[b_dim1 + 1]; beta[2] = b[(b_dim1 << 1) + 2]; } else { alphar[1] = anorm * wr1 / scale1 / bnorm; alphai[1] = anorm * wi / scale1 / bnorm; alphar[2] = alphar[1]; alphai[2] = -alphai[1]; beta[1] = 1.; beta[2] = 1.; } return 0; /* End of DLAGV2 */ } /* _starpu_dlagv2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlahqr.c000066400000000000000000000467321413463044200206350ustar00rootroot00000000000000/* dlahqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *info) { /* System generated locals */ integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k, l, m; doublereal s, v[3]; integer i1, i2; doublereal t1, t2, t3, v2, v3, aa, ab, ba, bb, h11, h12, h21, h22, cs; integer nh; doublereal sn; integer nr; doublereal tr; integer nz; doublereal det, h21s; integer its; doublereal ulp, sum, tst, rt1i, rt2i, rt1r, rt2r; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dcopy_( integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); doublereal safmin, safmax, rtdisc, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAHQR is an auxiliary routine called by DHSEQR to update the */ /* eigenvalues and Schur decomposition already computed by DHSEQR, by */ /* dealing with the Hessenberg submatrix in rows and columns ILO to */ /* IHI. */ /* Arguments */ /* ========= */ /* WANTT (input) LOGICAL */ /* = .TRUE. : the full Schur form T is required; */ /* = .FALSE.: only eigenvalues are required. */ /* WANTZ (input) LOGICAL */ /* = .TRUE. : the matrix of Schur vectors Z is required; */ /* = .FALSE.: Schur vectors are not required. */ /* N (input) INTEGER */ /* The order of the matrix H. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that H is already upper quasi-triangular in */ /* rows and columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless */ /* ILO = 1). DLAHQR works primarily with the Hessenberg */ /* submatrix in rows and columns ILO to IHI, but applies */ /* transformations to all of H if WANTT is .TRUE.. */ /* 1 <= ILO <= max(1,IHI); IHI <= N. */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH,N) */ /* On entry, the upper Hessenberg matrix H. */ /* On exit, if INFO is zero and if WANTT is .TRUE., H is upper */ /* quasi-triangular in rows and columns ILO:IHI, with any */ /* 2-by-2 diagonal blocks in standard form. If INFO is zero */ /* and WANTT is .FALSE., the contents of H are unspecified on */ /* exit. The output state of H if INFO is nonzero is given */ /* below under the description of INFO. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH >= max(1,N). */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* The real and imaginary parts, respectively, of the computed */ /* eigenvalues ILO to IHI are stored in the corresponding */ /* elements of WR and WI. If two eigenvalues are computed as a */ /* complex conjugate pair, they are stored in consecutive */ /* elements of WR and WI, say the i-th and (i+1)th, with */ /* WI(i) > 0 and WI(i+1) < 0. If WANTT is .TRUE., the */ /* eigenvalues are stored in the same order as on the diagonal */ /* of the Schur form returned in H, with WR(i) = H(i,i), and, if */ /* H(i:i+1,i:i+1) is a 2-by-2 diagonal block, */ /* WI(i) = sqrt(H(i+1,i)*H(i,i+1)) and WI(i+1) = -WI(i). */ /* ILOZ (input) INTEGER */ /* IHIZ (input) INTEGER */ /* Specify the rows of Z to which transformations must be */ /* applied if WANTZ is .TRUE.. */ /* 1 <= ILOZ <= ILO; IHI <= IHIZ <= N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* If WANTZ is .TRUE., on entry Z must contain the current */ /* matrix Z of transformations accumulated by DHSEQR, and on */ /* exit Z has been updated; transformations are applied only to */ /* the submatrix Z(ILOZ:IHIZ,ILO:IHI). */ /* If WANTZ is .FALSE., Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* .GT. 0: If INFO = i, DLAHQR failed to compute all the */ /* eigenvalues ILO to IHI in a total of 30 iterations */ /* per eigenvalue; elements i+1:ihi of WR and WI */ /* contain those eigenvalues which have been */ /* successfully computed. */ /* If INFO .GT. 0 and WANTT is .FALSE., then on exit, */ /* the remaining unconverged eigenvalues are the */ /* eigenvalues of the upper Hessenberg matrix rows */ /* and columns ILO thorugh INFO of the final, output */ /* value of H. */ /* If INFO .GT. 0 and WANTT is .TRUE., then on exit */ /* (*) (initial value of H)*U = U*(final value of H) */ /* where U is an orthognal matrix. The final */ /* value of H is upper Hessenberg and triangular in */ /* rows and columns INFO+1 through IHI. */ /* If INFO .GT. 0 and WANTZ is .TRUE., then on exit */ /* (final value of Z) = (initial value of Z)*U */ /* where U is the orthogonal matrix in (*) */ /* (regardless of the value of WANTT.) */ /* Further Details */ /* =============== */ /* 02-96 Based on modifications by */ /* David Day, Sandia National Laboratory, USA */ /* 12-04 Further modifications by */ /* Ralph Byers, University of Kansas, USA */ /* This is a modified version of DLAHQR from LAPACK version 3.0. */ /* It is (1) more robust against overflow and underflow and */ /* (2) adopts the more conservative Ahues & Tisseur stopping */ /* criterion (LAWN 122, 1997). */ /* ========================================================= */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --wr; --wi; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; /* Function Body */ *info = 0; /* Quick return if possible */ if (*n == 0) { return 0; } if (*ilo == *ihi) { wr[*ilo] = h__[*ilo + *ilo * h_dim1]; wi[*ilo] = 0.; return 0; } /* ==== clear out the trash ==== */ i__1 = *ihi - 3; for (j = *ilo; j <= i__1; ++j) { h__[j + 2 + j * h_dim1] = 0.; h__[j + 3 + j * h_dim1] = 0.; /* L10: */ } if (*ilo <= *ihi - 2) { h__[*ihi + (*ihi - 2) * h_dim1] = 0.; } nh = *ihi - *ilo + 1; nz = *ihiz - *iloz + 1; /* Set machine-dependent constants for the stopping criterion. */ safmin = _starpu_dlamch_("SAFE MINIMUM"); safmax = 1. / safmin; _starpu_dlabad_(&safmin, &safmax); ulp = _starpu_dlamch_("PRECISION"); smlnum = safmin * ((doublereal) nh / ulp); /* I1 and I2 are the indices of the first row and last column of H */ /* to which transformations must be applied. If eigenvalues only are */ /* being computed, I1 and I2 are set inside the main loop. */ if (*wantt) { i1 = 1; i2 = *n; } /* The main loop begins here. I is the loop index and decreases from */ /* IHI to ILO in steps of 1 or 2. Each iteration of the loop works */ /* with the active submatrix in rows and columns L to I. */ /* Eigenvalues I+1 to IHI have already converged. Either L = ILO or */ /* H(L,L-1) is negligible so that the matrix splits. */ i__ = *ihi; L20: l = *ilo; if (i__ < *ilo) { goto L160; } /* Perform QR iterations on rows and columns ILO to I until a */ /* submatrix of order 1 or 2 splits off at the bottom because a */ /* subdiagonal element has become negligible. */ for (its = 0; its <= 30; ++its) { /* Look for a single small subdiagonal element. */ i__1 = l + 1; for (k = i__; k >= i__1; --k) { if ((d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)) <= smlnum) { goto L40; } tst = (d__1 = h__[k - 1 + (k - 1) * h_dim1], abs(d__1)) + (d__2 = h__[k + k * h_dim1], abs(d__2)); if (tst == 0.) { if (k - 2 >= *ilo) { tst += (d__1 = h__[k - 1 + (k - 2) * h_dim1], abs(d__1)); } if (k + 1 <= *ihi) { tst += (d__1 = h__[k + 1 + k * h_dim1], abs(d__1)); } } /* ==== The following is a conservative small subdiagonal */ /* . deflation criterion due to Ahues & Tisseur (LAWN 122, */ /* . 1997). It has better mathematical foundation and */ /* . improves accuracy in some cases. ==== */ if ((d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)) <= ulp * tst) { /* Computing MAX */ d__3 = (d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)), d__4 = ( d__2 = h__[k - 1 + k * h_dim1], abs(d__2)); ab = max(d__3,d__4); /* Computing MIN */ d__3 = (d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)), d__4 = ( d__2 = h__[k - 1 + k * h_dim1], abs(d__2)); ba = min(d__3,d__4); /* Computing MAX */ d__3 = (d__1 = h__[k + k * h_dim1], abs(d__1)), d__4 = (d__2 = h__[k - 1 + (k - 1) * h_dim1] - h__[k + k * h_dim1], abs(d__2)); aa = max(d__3,d__4); /* Computing MIN */ d__3 = (d__1 = h__[k + k * h_dim1], abs(d__1)), d__4 = (d__2 = h__[k - 1 + (k - 1) * h_dim1] - h__[k + k * h_dim1], abs(d__2)); bb = min(d__3,d__4); s = aa + ab; /* Computing MAX */ d__1 = smlnum, d__2 = ulp * (bb * (aa / s)); if (ba * (ab / s) <= max(d__1,d__2)) { goto L40; } } /* L30: */ } L40: l = k; if (l > *ilo) { /* H(L,L-1) is negligible */ h__[l + (l - 1) * h_dim1] = 0.; } /* Exit from loop if a submatrix of order 1 or 2 has split off. */ if (l >= i__ - 1) { goto L150; } /* Now the active submatrix is in rows and columns L to I. If */ /* eigenvalues only are being computed, only the active submatrix */ /* need be transformed. */ if (! (*wantt)) { i1 = l; i2 = i__; } if (its == 10) { /* Exceptional shift. */ s = (d__1 = h__[l + 1 + l * h_dim1], abs(d__1)) + (d__2 = h__[l + 2 + (l + 1) * h_dim1], abs(d__2)); h11 = s * .75 + h__[l + l * h_dim1]; h12 = s * -.4375; h21 = s; h22 = h11; } else if (its == 20) { /* Exceptional shift. */ s = (d__1 = h__[i__ + (i__ - 1) * h_dim1], abs(d__1)) + (d__2 = h__[i__ - 1 + (i__ - 2) * h_dim1], abs(d__2)); h11 = s * .75 + h__[i__ + i__ * h_dim1]; h12 = s * -.4375; h21 = s; h22 = h11; } else { /* Prepare to use Francis' double shift */ /* (i.e. 2nd degree generalized Rayleigh quotient) */ h11 = h__[i__ - 1 + (i__ - 1) * h_dim1]; h21 = h__[i__ + (i__ - 1) * h_dim1]; h12 = h__[i__ - 1 + i__ * h_dim1]; h22 = h__[i__ + i__ * h_dim1]; } s = abs(h11) + abs(h12) + abs(h21) + abs(h22); if (s == 0.) { rt1r = 0.; rt1i = 0.; rt2r = 0.; rt2i = 0.; } else { h11 /= s; h21 /= s; h12 /= s; h22 /= s; tr = (h11 + h22) / 2.; det = (h11 - tr) * (h22 - tr) - h12 * h21; rtdisc = sqrt((abs(det))); if (det >= 0.) { /* ==== complex conjugate shifts ==== */ rt1r = tr * s; rt2r = rt1r; rt1i = rtdisc * s; rt2i = -rt1i; } else { /* ==== real shifts (use only one of them) ==== */ rt1r = tr + rtdisc; rt2r = tr - rtdisc; if ((d__1 = rt1r - h22, abs(d__1)) <= (d__2 = rt2r - h22, abs( d__2))) { rt1r *= s; rt2r = rt1r; } else { rt2r *= s; rt1r = rt2r; } rt1i = 0.; rt2i = 0.; } } /* Look for two consecutive small subdiagonal elements. */ i__1 = l; for (m = i__ - 2; m >= i__1; --m) { /* Determine the effect of starting the double-shift QR */ /* iteration at row M, and see if this would make H(M,M-1) */ /* negligible. (The following uses scaling to avoid */ /* overflows and most underflows.) */ h21s = h__[m + 1 + m * h_dim1]; s = (d__1 = h__[m + m * h_dim1] - rt2r, abs(d__1)) + abs(rt2i) + abs(h21s); h21s = h__[m + 1 + m * h_dim1] / s; v[0] = h21s * h__[m + (m + 1) * h_dim1] + (h__[m + m * h_dim1] - rt1r) * ((h__[m + m * h_dim1] - rt2r) / s) - rt1i * (rt2i / s); v[1] = h21s * (h__[m + m * h_dim1] + h__[m + 1 + (m + 1) * h_dim1] - rt1r - rt2r); v[2] = h21s * h__[m + 2 + (m + 1) * h_dim1]; s = abs(v[0]) + abs(v[1]) + abs(v[2]); v[0] /= s; v[1] /= s; v[2] /= s; if (m == l) { goto L60; } if ((d__1 = h__[m + (m - 1) * h_dim1], abs(d__1)) * (abs(v[1]) + abs(v[2])) <= ulp * abs(v[0]) * ((d__2 = h__[m - 1 + (m - 1) * h_dim1], abs(d__2)) + (d__3 = h__[m + m * h_dim1], abs(d__3)) + (d__4 = h__[m + 1 + (m + 1) * h_dim1], abs( d__4)))) { goto L60; } /* L50: */ } L60: /* Double-shift QR step */ i__1 = i__ - 1; for (k = m; k <= i__1; ++k) { /* The first iteration of this loop determines a reflection G */ /* from the vector V and applies it from left and right to H, */ /* thus creating a nonzero bulge below the subdiagonal. */ /* Each subsequent iteration determines a reflection G to */ /* restore the Hessenberg form in the (K-1)th column, and thus */ /* chases the bulge one step toward the bottom of the active */ /* submatrix. NR is the order of G. */ /* Computing MIN */ i__2 = 3, i__3 = i__ - k + 1; nr = min(i__2,i__3); if (k > m) { _starpu_dcopy_(&nr, &h__[k + (k - 1) * h_dim1], &c__1, v, &c__1); } _starpu_dlarfg_(&nr, v, &v[1], &c__1, &t1); if (k > m) { h__[k + (k - 1) * h_dim1] = v[0]; h__[k + 1 + (k - 1) * h_dim1] = 0.; if (k < i__ - 1) { h__[k + 2 + (k - 1) * h_dim1] = 0.; } } else if (m > l) { /* ==== Use the following instead of */ /* . H( K, K-1 ) = -H( K, K-1 ) to */ /* . avoid a bug when v(2) and v(3) */ /* . underflow. ==== */ h__[k + (k - 1) * h_dim1] *= 1. - t1; } v2 = v[1]; t2 = t1 * v2; if (nr == 3) { v3 = v[2]; t3 = t1 * v3; /* Apply G from the left to transform the rows of the matrix */ /* in columns K to I2. */ i__2 = i2; for (j = k; j <= i__2; ++j) { sum = h__[k + j * h_dim1] + v2 * h__[k + 1 + j * h_dim1] + v3 * h__[k + 2 + j * h_dim1]; h__[k + j * h_dim1] -= sum * t1; h__[k + 1 + j * h_dim1] -= sum * t2; h__[k + 2 + j * h_dim1] -= sum * t3; /* L70: */ } /* Apply G from the right to transform the columns of the */ /* matrix in rows I1 to min(K+3,I). */ /* Computing MIN */ i__3 = k + 3; i__2 = min(i__3,i__); for (j = i1; j <= i__2; ++j) { sum = h__[j + k * h_dim1] + v2 * h__[j + (k + 1) * h_dim1] + v3 * h__[j + (k + 2) * h_dim1]; h__[j + k * h_dim1] -= sum * t1; h__[j + (k + 1) * h_dim1] -= sum * t2; h__[j + (k + 2) * h_dim1] -= sum * t3; /* L80: */ } if (*wantz) { /* Accumulate transformations in the matrix Z */ i__2 = *ihiz; for (j = *iloz; j <= i__2; ++j) { sum = z__[j + k * z_dim1] + v2 * z__[j + (k + 1) * z_dim1] + v3 * z__[j + (k + 2) * z_dim1]; z__[j + k * z_dim1] -= sum * t1; z__[j + (k + 1) * z_dim1] -= sum * t2; z__[j + (k + 2) * z_dim1] -= sum * t3; /* L90: */ } } } else if (nr == 2) { /* Apply G from the left to transform the rows of the matrix */ /* in columns K to I2. */ i__2 = i2; for (j = k; j <= i__2; ++j) { sum = h__[k + j * h_dim1] + v2 * h__[k + 1 + j * h_dim1]; h__[k + j * h_dim1] -= sum * t1; h__[k + 1 + j * h_dim1] -= sum * t2; /* L100: */ } /* Apply G from the right to transform the columns of the */ /* matrix in rows I1 to min(K+3,I). */ i__2 = i__; for (j = i1; j <= i__2; ++j) { sum = h__[j + k * h_dim1] + v2 * h__[j + (k + 1) * h_dim1] ; h__[j + k * h_dim1] -= sum * t1; h__[j + (k + 1) * h_dim1] -= sum * t2; /* L110: */ } if (*wantz) { /* Accumulate transformations in the matrix Z */ i__2 = *ihiz; for (j = *iloz; j <= i__2; ++j) { sum = z__[j + k * z_dim1] + v2 * z__[j + (k + 1) * z_dim1]; z__[j + k * z_dim1] -= sum * t1; z__[j + (k + 1) * z_dim1] -= sum * t2; /* L120: */ } } } /* L130: */ } /* L140: */ } /* Failure to converge in remaining number of iterations */ *info = i__; return 0; L150: if (l == i__) { /* H(I,I-1) is negligible: one eigenvalue has converged. */ wr[i__] = h__[i__ + i__ * h_dim1]; wi[i__] = 0.; } else if (l == i__ - 1) { /* H(I-1,I-2) is negligible: a pair of eigenvalues have converged. */ /* Transform the 2-by-2 submatrix to standard Schur form, */ /* and compute and store the eigenvalues. */ _starpu_dlanv2_(&h__[i__ - 1 + (i__ - 1) * h_dim1], &h__[i__ - 1 + i__ * h_dim1], &h__[i__ + (i__ - 1) * h_dim1], &h__[i__ + i__ * h_dim1], &wr[i__ - 1], &wi[i__ - 1], &wr[i__], &wi[i__], &cs, &sn); if (*wantt) { /* Apply the transformation to the rest of H. */ if (i2 > i__) { i__1 = i2 - i__; _starpu_drot_(&i__1, &h__[i__ - 1 + (i__ + 1) * h_dim1], ldh, &h__[ i__ + (i__ + 1) * h_dim1], ldh, &cs, &sn); } i__1 = i__ - i1 - 1; _starpu_drot_(&i__1, &h__[i1 + (i__ - 1) * h_dim1], &c__1, &h__[i1 + i__ * h_dim1], &c__1, &cs, &sn); } if (*wantz) { /* Apply the transformation to Z. */ _starpu_drot_(&nz, &z__[*iloz + (i__ - 1) * z_dim1], &c__1, &z__[*iloz + i__ * z_dim1], &c__1, &cs, &sn); } } /* return to start of the main loop with new value of I. */ i__ = l - 1; goto L20; L160: return 0; /* End of DLAHQR */ } /* _starpu_dlahqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlahr2.c000066400000000000000000000246531413463044200205340ustar00rootroot00000000000000/* dlahr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = -1.; static doublereal c_b5 = 1.; static integer c__1 = 1; static doublereal c_b38 = 0.; /* Subroutine */ int _starpu_dlahr2_(integer *n, integer *k, integer *nb, doublereal * a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, doublereal *y, integer *ldy) { /* System generated locals */ integer a_dim1, a_offset, t_dim1, t_offset, y_dim1, y_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__; doublereal ei; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dgemv_( char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfg_( integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAHR2 reduces the first NB columns of A real general n-BY-(n-k+1) */ /* matrix A so that elements below the k-th subdiagonal are zero. The */ /* reduction is performed by an orthogonal similarity transformation */ /* Q' * A * Q. The routine returns the matrices V and T which determine */ /* Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T. */ /* This is an auxiliary routine called by DGEHRD. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* K (input) INTEGER */ /* The offset for the reduction. Elements below the k-th */ /* subdiagonal in the first NB columns are reduced to zero. */ /* K < N. */ /* NB (input) INTEGER */ /* The number of columns to be reduced. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N-K+1) */ /* On entry, the n-by-(n-k+1) general matrix A. */ /* On exit, the elements on and above the k-th subdiagonal in */ /* the first NB columns are overwritten with the corresponding */ /* elements of the reduced matrix; the elements below the k-th */ /* subdiagonal, with the array TAU, represent the matrix Q as a */ /* product of elementary reflectors. The other columns of A are */ /* unchanged. See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAU (output) DOUBLE PRECISION array, dimension (NB) */ /* The scalar factors of the elementary reflectors. See Further */ /* Details. */ /* T (output) DOUBLE PRECISION array, dimension (LDT,NB) */ /* The upper triangular matrix T. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= NB. */ /* Y (output) DOUBLE PRECISION array, dimension (LDY,NB) */ /* The n-by-nb matrix Y. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= N. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of nb elementary reflectors */ /* Q = H(1) H(2) . . . H(nb). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in */ /* A(i+k+1:n,i), and tau in TAU(i). */ /* The elements of the vectors v together form the (n-k+1)-by-nb matrix */ /* V which is needed, with T and Y, to apply the transformation to the */ /* unreduced part of the matrix, using an update of the form: */ /* A := (I - V*T*V') * (A - Y*V'). */ /* The contents of A on exit are illustrated by the following example */ /* with n = 7, k = 3 and nb = 2: */ /* ( a a a a a ) */ /* ( a a a a a ) */ /* ( a a a a a ) */ /* ( h h a a a ) */ /* ( v1 h a a a ) */ /* ( v1 v2 a a a ) */ /* ( v1 v2 a a a ) */ /* where a denotes an element of the original matrix A, h denotes a */ /* modified element of the upper Hessenberg matrix H, and vi denotes an */ /* element of the vector defining H(i). */ /* This file is a slight modification of LAPACK-3.0's DLAHRD */ /* incorporating improvements proposed by Quintana-Orti and Van de */ /* Gejin. Note that the entries of A(1:K,2:NB) differ from those */ /* returned by the original LAPACK routine. This function is */ /* not backward compatible with LAPACK3.0. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --tau; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; /* Function Body */ if (*n <= 1) { return 0; } i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { if (i__ > 1) { /* Update A(K+1:N,I) */ /* Update I-th column of A - Y * V' */ i__2 = *n - *k; i__3 = i__ - 1; _starpu_dgemv_("NO TRANSPOSE", &i__2, &i__3, &c_b4, &y[*k + 1 + y_dim1], ldy, &a[*k + i__ - 1 + a_dim1], lda, &c_b5, &a[*k + 1 + i__ * a_dim1], &c__1); /* Apply I - V * T' * V' to this column (call it b) from the */ /* left, using the last column of T as workspace */ /* Let V = ( V1 ) and b = ( b1 ) (first I-1 rows) */ /* ( V2 ) ( b2 ) */ /* where V1 is unit lower triangular */ /* w := V1' * b1 */ i__2 = i__ - 1; _starpu_dcopy_(&i__2, &a[*k + 1 + i__ * a_dim1], &c__1, &t[*nb * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_dtrmv_("Lower", "Transpose", "UNIT", &i__2, &a[*k + 1 + a_dim1], lda, &t[*nb * t_dim1 + 1], &c__1); /* w := w + V2'*b2 */ i__2 = *n - *k - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[*k + i__ + a_dim1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b5, &t[*nb * t_dim1 + 1], &c__1); /* w := T'*w */ i__2 = i__ - 1; _starpu_dtrmv_("Upper", "Transpose", "NON-UNIT", &i__2, &t[t_offset], ldt, &t[*nb * t_dim1 + 1], &c__1); /* b2 := b2 - V2*w */ i__2 = *n - *k - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("NO TRANSPOSE", &i__2, &i__3, &c_b4, &a[*k + i__ + a_dim1], lda, &t[*nb * t_dim1 + 1], &c__1, &c_b5, &a[*k + i__ + i__ * a_dim1], &c__1); /* b1 := b1 - V1*w */ i__2 = i__ - 1; _starpu_dtrmv_("Lower", "NO TRANSPOSE", "UNIT", &i__2, &a[*k + 1 + a_dim1] , lda, &t[*nb * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_daxpy_(&i__2, &c_b4, &t[*nb * t_dim1 + 1], &c__1, &a[*k + 1 + i__ * a_dim1], &c__1); a[*k + i__ - 1 + (i__ - 1) * a_dim1] = ei; } /* Generate the elementary reflector H(I) to annihilate */ /* A(K+I+1:N,I) */ i__2 = *n - *k - i__ + 1; /* Computing MIN */ i__3 = *k + i__ + 1; _starpu_dlarfg_(&i__2, &a[*k + i__ + i__ * a_dim1], &a[min(i__3, *n)+ i__ * a_dim1], &c__1, &tau[i__]); ei = a[*k + i__ + i__ * a_dim1]; a[*k + i__ + i__ * a_dim1] = 1.; /* Compute Y(K+1:N,I) */ i__2 = *n - *k; i__3 = *n - *k - i__ + 1; _starpu_dgemv_("NO TRANSPOSE", &i__2, &i__3, &c_b5, &a[*k + 1 + (i__ + 1) * a_dim1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b38, &y[* k + 1 + i__ * y_dim1], &c__1); i__2 = *n - *k - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[*k + i__ + a_dim1], lda, & a[*k + i__ + i__ * a_dim1], &c__1, &c_b38, &t[i__ * t_dim1 + 1], &c__1); i__2 = *n - *k; i__3 = i__ - 1; _starpu_dgemv_("NO TRANSPOSE", &i__2, &i__3, &c_b4, &y[*k + 1 + y_dim1], ldy, &t[i__ * t_dim1 + 1], &c__1, &c_b5, &y[*k + 1 + i__ * y_dim1], &c__1); i__2 = *n - *k; _starpu_dscal_(&i__2, &tau[i__], &y[*k + 1 + i__ * y_dim1], &c__1); /* Compute T(1:I,I) */ i__2 = i__ - 1; d__1 = -tau[i__]; _starpu_dscal_(&i__2, &d__1, &t[i__ * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_dtrmv_("Upper", "No Transpose", "NON-UNIT", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1) ; t[i__ + i__ * t_dim1] = tau[i__]; /* L10: */ } a[*k + *nb + *nb * a_dim1] = ei; /* Compute Y(1:K,1:NB) */ _starpu_dlacpy_("ALL", k, nb, &a[(a_dim1 << 1) + 1], lda, &y[y_offset], ldy); _starpu_dtrmm_("RIGHT", "Lower", "NO TRANSPOSE", "UNIT", k, nb, &c_b5, &a[*k + 1 + a_dim1], lda, &y[y_offset], ldy); if (*n > *k + *nb) { i__1 = *n - *k - *nb; _starpu_dgemm_("NO TRANSPOSE", "NO TRANSPOSE", k, nb, &i__1, &c_b5, &a[(*nb + 2) * a_dim1 + 1], lda, &a[*k + 1 + *nb + a_dim1], lda, &c_b5, &y[y_offset], ldy); } _starpu_dtrmm_("RIGHT", "Upper", "NO TRANSPOSE", "NON-UNIT", k, nb, &c_b5, &t[ t_offset], ldt, &y[y_offset], ldy); return 0; /* End of DLAHR2 */ } /* _starpu_dlahr2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlahrd.c000066400000000000000000000221001413463044200205770ustar00rootroot00000000000000/* dlahrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = -1.; static doublereal c_b5 = 1.; static integer c__1 = 1; static doublereal c_b38 = 0.; /* Subroutine */ int _starpu_dlahrd_(integer *n, integer *k, integer *nb, doublereal * a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, doublereal *y, integer *ldy) { /* System generated locals */ integer a_dim1, a_offset, t_dim1, t_offset, y_dim1, y_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__; doublereal ei; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAHRD reduces the first NB columns of a real general n-by-(n-k+1) */ /* matrix A so that elements below the k-th subdiagonal are zero. The */ /* reduction is performed by an orthogonal similarity transformation */ /* Q' * A * Q. The routine returns the matrices V and T which determine */ /* Q as a block reflector I - V*T*V', and also the matrix Y = A * V * T. */ /* This is an OBSOLETE auxiliary routine. */ /* This routine will be 'deprecated' in a future release. */ /* Please use the new routine DLAHR2 instead. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* K (input) INTEGER */ /* The offset for the reduction. Elements below the k-th */ /* subdiagonal in the first NB columns are reduced to zero. */ /* NB (input) INTEGER */ /* The number of columns to be reduced. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N-K+1) */ /* On entry, the n-by-(n-k+1) general matrix A. */ /* On exit, the elements on and above the k-th subdiagonal in */ /* the first NB columns are overwritten with the corresponding */ /* elements of the reduced matrix; the elements below the k-th */ /* subdiagonal, with the array TAU, represent the matrix Q as a */ /* product of elementary reflectors. The other columns of A are */ /* unchanged. See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAU (output) DOUBLE PRECISION array, dimension (NB) */ /* The scalar factors of the elementary reflectors. See Further */ /* Details. */ /* T (output) DOUBLE PRECISION array, dimension (LDT,NB) */ /* The upper triangular matrix T. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= NB. */ /* Y (output) DOUBLE PRECISION array, dimension (LDY,NB) */ /* The n-by-nb matrix Y. */ /* LDY (input) INTEGER */ /* The leading dimension of the array Y. LDY >= N. */ /* Further Details */ /* =============== */ /* The matrix Q is represented as a product of nb elementary reflectors */ /* Q = H(1) H(2) . . . H(nb). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in */ /* A(i+k+1:n,i), and tau in TAU(i). */ /* The elements of the vectors v together form the (n-k+1)-by-nb matrix */ /* V which is needed, with T and Y, to apply the transformation to the */ /* unreduced part of the matrix, using an update of the form: */ /* A := (I - V*T*V') * (A - Y*V'). */ /* The contents of A on exit are illustrated by the following example */ /* with n = 7, k = 3 and nb = 2: */ /* ( a h a a a ) */ /* ( a h a a a ) */ /* ( a h a a a ) */ /* ( h h a a a ) */ /* ( v1 h a a a ) */ /* ( v1 v2 a a a ) */ /* ( v1 v2 a a a ) */ /* where a denotes an element of the original matrix A, h denotes a */ /* modified element of the upper Hessenberg matrix H, and vi denotes an */ /* element of the vector defining H(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --tau; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; /* Function Body */ if (*n <= 1) { return 0; } i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { if (i__ > 1) { /* Update A(1:n,i) */ /* Compute i-th column of A - Y * V' */ i__2 = i__ - 1; _starpu_dgemv_("No transpose", n, &i__2, &c_b4, &y[y_offset], ldy, &a[*k + i__ - 1 + a_dim1], lda, &c_b5, &a[i__ * a_dim1 + 1], & c__1); /* Apply I - V * T' * V' to this column (call it b) from the */ /* left, using the last column of T as workspace */ /* Let V = ( V1 ) and b = ( b1 ) (first I-1 rows) */ /* ( V2 ) ( b2 ) */ /* where V1 is unit lower triangular */ /* w := V1' * b1 */ i__2 = i__ - 1; _starpu_dcopy_(&i__2, &a[*k + 1 + i__ * a_dim1], &c__1, &t[*nb * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_dtrmv_("Lower", "Transpose", "Unit", &i__2, &a[*k + 1 + a_dim1], lda, &t[*nb * t_dim1 + 1], &c__1); /* w := w + V2'*b2 */ i__2 = *n - *k - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[*k + i__ + a_dim1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b5, &t[*nb * t_dim1 + 1], &c__1); /* w := T'*w */ i__2 = i__ - 1; _starpu_dtrmv_("Upper", "Transpose", "Non-unit", &i__2, &t[t_offset], ldt, &t[*nb * t_dim1 + 1], &c__1); /* b2 := b2 - V2*w */ i__2 = *n - *k - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b4, &a[*k + i__ + a_dim1], lda, &t[*nb * t_dim1 + 1], &c__1, &c_b5, &a[*k + i__ + i__ * a_dim1], &c__1); /* b1 := b1 - V1*w */ i__2 = i__ - 1; _starpu_dtrmv_("Lower", "No transpose", "Unit", &i__2, &a[*k + 1 + a_dim1] , lda, &t[*nb * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_daxpy_(&i__2, &c_b4, &t[*nb * t_dim1 + 1], &c__1, &a[*k + 1 + i__ * a_dim1], &c__1); a[*k + i__ - 1 + (i__ - 1) * a_dim1] = ei; } /* Generate the elementary reflector H(i) to annihilate */ /* A(k+i+1:n,i) */ i__2 = *n - *k - i__ + 1; /* Computing MIN */ i__3 = *k + i__ + 1; _starpu_dlarfg_(&i__2, &a[*k + i__ + i__ * a_dim1], &a[min(i__3, *n)+ i__ * a_dim1], &c__1, &tau[i__]); ei = a[*k + i__ + i__ * a_dim1]; a[*k + i__ + i__ * a_dim1] = 1.; /* Compute Y(1:n,i) */ i__2 = *n - *k - i__ + 1; _starpu_dgemv_("No transpose", n, &i__2, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b38, &y[i__ * y_dim1 + 1], &c__1); i__2 = *n - *k - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b5, &a[*k + i__ + a_dim1], lda, & a[*k + i__ + i__ * a_dim1], &c__1, &c_b38, &t[i__ * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_dgemv_("No transpose", n, &i__2, &c_b4, &y[y_offset], ldy, &t[i__ * t_dim1 + 1], &c__1, &c_b5, &y[i__ * y_dim1 + 1], &c__1); _starpu_dscal_(n, &tau[i__], &y[i__ * y_dim1 + 1], &c__1); /* Compute T(1:i,i) */ i__2 = i__ - 1; d__1 = -tau[i__]; _starpu_dscal_(&i__2, &d__1, &t[i__ * t_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_dtrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1) ; t[i__ + i__ * t_dim1] = tau[i__]; /* L10: */ } a[*k + *nb + *nb * a_dim1] = ei; return 0; /* End of DLAHRD */ } /* _starpu_dlahrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaic1.c000066400000000000000000000177511413463044200205160ustar00rootroot00000000000000/* dlaic1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b5 = 1.; /* Subroutine */ int _starpu_dlaic1_(integer *job, integer *j, doublereal *x, doublereal *sest, doublereal *w, doublereal *gamma, doublereal * sestpr, doublereal *s, doublereal *c__) { /* System generated locals */ doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal b, t, s1, s2, eps, tmp; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal sine, test, zeta1, zeta2, alpha, norma; extern doublereal _starpu_dlamch_(char *); doublereal absgam, absalp, cosine, absest; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAIC1 applies one step of incremental condition estimation in */ /* its simplest version: */ /* Let x, twonorm(x) = 1, be an approximate singular vector of an j-by-j */ /* lower triangular matrix L, such that */ /* twonorm(L*x) = sest */ /* Then DLAIC1 computes sestpr, s, c such that */ /* the vector */ /* [ s*x ] */ /* xhat = [ c ] */ /* is an approximate singular vector of */ /* [ L 0 ] */ /* Lhat = [ w' gamma ] */ /* in the sense that */ /* twonorm(Lhat*xhat) = sestpr. */ /* Depending on JOB, an estimate for the largest or smallest singular */ /* value is computed. */ /* Note that [s c]' and sestpr**2 is an eigenpair of the system */ /* diag(sest*sest, 0) + [alpha gamma] * [ alpha ] */ /* [ gamma ] */ /* where alpha = x'*w. */ /* Arguments */ /* ========= */ /* JOB (input) INTEGER */ /* = 1: an estimate for the largest singular value is computed. */ /* = 2: an estimate for the smallest singular value is computed. */ /* J (input) INTEGER */ /* Length of X and W */ /* X (input) DOUBLE PRECISION array, dimension (J) */ /* The j-vector x. */ /* SEST (input) DOUBLE PRECISION */ /* Estimated singular value of j by j matrix L */ /* W (input) DOUBLE PRECISION array, dimension (J) */ /* The j-vector w. */ /* GAMMA (input) DOUBLE PRECISION */ /* The diagonal element gamma. */ /* SESTPR (output) DOUBLE PRECISION */ /* Estimated singular value of (j+1) by (j+1) matrix Lhat. */ /* S (output) DOUBLE PRECISION */ /* Sine needed in forming xhat. */ /* C (output) DOUBLE PRECISION */ /* Cosine needed in forming xhat. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --w; --x; /* Function Body */ eps = _starpu_dlamch_("Epsilon"); alpha = _starpu_ddot_(j, &x[1], &c__1, &w[1], &c__1); absalp = abs(alpha); absgam = abs(*gamma); absest = abs(*sest); if (*job == 1) { /* Estimating largest singular value */ /* special cases */ if (*sest == 0.) { s1 = max(absgam,absalp); if (s1 == 0.) { *s = 0.; *c__ = 1.; *sestpr = 0.; } else { *s = alpha / s1; *c__ = *gamma / s1; tmp = sqrt(*s * *s + *c__ * *c__); *s /= tmp; *c__ /= tmp; *sestpr = s1 * tmp; } return 0; } else if (absgam <= eps * absest) { *s = 1.; *c__ = 0.; tmp = max(absest,absalp); s1 = absest / tmp; s2 = absalp / tmp; *sestpr = tmp * sqrt(s1 * s1 + s2 * s2); return 0; } else if (absalp <= eps * absest) { s1 = absgam; s2 = absest; if (s1 <= s2) { *s = 1.; *c__ = 0.; *sestpr = s2; } else { *s = 0.; *c__ = 1.; *sestpr = s1; } return 0; } else if (absest <= eps * absalp || absest <= eps * absgam) { s1 = absgam; s2 = absalp; if (s1 <= s2) { tmp = s1 / s2; *s = sqrt(tmp * tmp + 1.); *sestpr = s2 * *s; *c__ = *gamma / s2 / *s; *s = d_sign(&c_b5, &alpha) / *s; } else { tmp = s2 / s1; *c__ = sqrt(tmp * tmp + 1.); *sestpr = s1 * *c__; *s = alpha / s1 / *c__; *c__ = d_sign(&c_b5, gamma) / *c__; } return 0; } else { /* normal case */ zeta1 = alpha / absest; zeta2 = *gamma / absest; b = (1. - zeta1 * zeta1 - zeta2 * zeta2) * .5; *c__ = zeta1 * zeta1; if (b > 0.) { t = *c__ / (b + sqrt(b * b + *c__)); } else { t = sqrt(b * b + *c__) - b; } sine = -zeta1 / t; cosine = -zeta2 / (t + 1.); tmp = sqrt(sine * sine + cosine * cosine); *s = sine / tmp; *c__ = cosine / tmp; *sestpr = sqrt(t + 1.) * absest; return 0; } } else if (*job == 2) { /* Estimating smallest singular value */ /* special cases */ if (*sest == 0.) { *sestpr = 0.; if (max(absgam,absalp) == 0.) { sine = 1.; cosine = 0.; } else { sine = -(*gamma); cosine = alpha; } /* Computing MAX */ d__1 = abs(sine), d__2 = abs(cosine); s1 = max(d__1,d__2); *s = sine / s1; *c__ = cosine / s1; tmp = sqrt(*s * *s + *c__ * *c__); *s /= tmp; *c__ /= tmp; return 0; } else if (absgam <= eps * absest) { *s = 0.; *c__ = 1.; *sestpr = absgam; return 0; } else if (absalp <= eps * absest) { s1 = absgam; s2 = absest; if (s1 <= s2) { *s = 0.; *c__ = 1.; *sestpr = s1; } else { *s = 1.; *c__ = 0.; *sestpr = s2; } return 0; } else if (absest <= eps * absalp || absest <= eps * absgam) { s1 = absgam; s2 = absalp; if (s1 <= s2) { tmp = s1 / s2; *c__ = sqrt(tmp * tmp + 1.); *sestpr = absest * (tmp / *c__); *s = -(*gamma / s2) / *c__; *c__ = d_sign(&c_b5, &alpha) / *c__; } else { tmp = s2 / s1; *s = sqrt(tmp * tmp + 1.); *sestpr = absest / *s; *c__ = alpha / s1 / *s; *s = -d_sign(&c_b5, gamma) / *s; } return 0; } else { /* normal case */ zeta1 = alpha / absest; zeta2 = *gamma / absest; /* Computing MAX */ d__3 = zeta1 * zeta1 + 1. + (d__1 = zeta1 * zeta2, abs(d__1)), d__4 = (d__2 = zeta1 * zeta2, abs(d__2)) + zeta2 * zeta2; norma = max(d__3,d__4); /* See if root is closer to zero or to ONE */ test = (zeta1 - zeta2) * 2. * (zeta1 + zeta2) + 1.; if (test >= 0.) { /* root is close to zero, compute directly */ b = (zeta1 * zeta1 + zeta2 * zeta2 + 1.) * .5; *c__ = zeta2 * zeta2; t = *c__ / (b + sqrt((d__1 = b * b - *c__, abs(d__1)))); sine = zeta1 / (1. - t); cosine = -zeta2 / t; *sestpr = sqrt(t + eps * 4. * eps * norma) * absest; } else { /* root is closer to ONE, shift by that amount */ b = (zeta2 * zeta2 + zeta1 * zeta1 - 1.) * .5; *c__ = zeta1 * zeta1; if (b >= 0.) { t = -(*c__) / (b + sqrt(b * b + *c__)); } else { t = b - sqrt(b * b + *c__); } sine = -zeta1 / t; cosine = -zeta2 / (t + 1.); *sestpr = sqrt(t + 1. + eps * 4. * eps * norma) * absest; } tmp = sqrt(sine * sine + cosine * cosine); *s = sine / tmp; *c__ = cosine / tmp; return 0; } } return 0; /* End of DLAIC1 */ } /* _starpu_dlaic1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaisnan.c000066400000000000000000000035401413463044200211410ustar00rootroot00000000000000/* dlaisnan.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" logical _starpu_dlaisnan_(doublereal *din1, doublereal *din2) { /* System generated locals */ logical ret_val; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is not for general use. It exists solely to avoid */ /* over-optimization in DISNAN. */ /* DLAISNAN checks for NaNs by comparing its two arguments for */ /* inequality. NaN is the only floating-point value where NaN != NaN */ /* returns .TRUE. To check for NaNs, pass the same variable as both */ /* arguments. */ /* A compiler must assume that the two arguments are */ /* not the same variable, and the test will not be optimized away. */ /* Interprocedural or whole-program optimization may delete this */ /* test. The ISNAN functions will be replaced by the correct */ /* Fortran 03 intrinsic once the intrinsic is widely available. */ /* Arguments */ /* ========= */ /* DIN1 (input) DOUBLE PRECISION */ /* DIN2 (input) DOUBLE PRECISION */ /* Two numbers to compare for inequality. */ /* ===================================================================== */ /* .. Executable Statements .. */ ret_val = *din1 != *din2; return ret_val; } /* _starpu_dlaisnan_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaln2.c000066400000000000000000000405151413463044200205270ustar00rootroot00000000000000/* dlaln2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaln2_(logical *ltrans, integer *na, integer *nw, doublereal *smin, doublereal *ca, doublereal *a, integer *lda, doublereal *d1, doublereal *d2, doublereal *b, integer *ldb, doublereal *wr, doublereal *wi, doublereal *x, integer *ldx, doublereal *scale, doublereal *xnorm, integer *info) { /* Initialized data */ static logical zswap[4] = { FALSE_,FALSE_,TRUE_,TRUE_ }; static logical rswap[4] = { FALSE_,TRUE_,FALSE_,TRUE_ }; static integer ipivot[16] /* was [4][4] */ = { 1,2,3,4,2,1,4,3,3,4,1,2, 4,3,2,1 }; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, x_dim1, x_offset; doublereal d__1, d__2, d__3, d__4, d__5, d__6; static doublereal equiv_0[4], equiv_1[4]; /* Local variables */ integer j; #define ci (equiv_0) #define cr (equiv_1) doublereal bi1, bi2, br1, br2, xi1, xi2, xr1, xr2, ci21, ci22, cr21, cr22, li21, csi, ui11, lr21, ui12, ui22; #define civ (equiv_0) doublereal csr, ur11, ur12, ur22; #define crv (equiv_1) doublereal bbnd, cmax, ui11r, ui12s, temp, ur11r, ur12s, u22abs; integer icmax; doublereal bnorm, cnorm, smini; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal bignum, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLALN2 solves a system of the form (ca A - w D ) X = s B */ /* or (ca A' - w D) X = s B with possible scaling ("s") and */ /* perturbation of A. (A' means A-transpose.) */ /* A is an NA x NA real matrix, ca is a real scalar, D is an NA x NA */ /* real diagonal matrix, w is a real or complex value, and X and B are */ /* NA x 1 matrices -- real if w is real, complex if w is complex. NA */ /* may be 1 or 2. */ /* If w is complex, X and B are represented as NA x 2 matrices, */ /* the first column of each being the real part and the second */ /* being the imaginary part. */ /* "s" is a scaling factor (.LE. 1), computed by DLALN2, which is */ /* so chosen that X can be computed without overflow. X is further */ /* scaled if necessary to assure that norm(ca A - w D)*norm(X) is less */ /* than overflow. */ /* If both singular values of (ca A - w D) are less than SMIN, */ /* SMIN*identity will be used instead of (ca A - w D). If only one */ /* singular value is less than SMIN, one element of (ca A - w D) will be */ /* perturbed enough to make the smallest singular value roughly SMIN. */ /* If both singular values are at least SMIN, (ca A - w D) will not be */ /* perturbed. In any case, the perturbation will be at most some small */ /* multiple of max( SMIN, ulp*norm(ca A - w D) ). The singular values */ /* are computed by infinity-norm approximations, and thus will only be */ /* correct to a factor of 2 or so. */ /* Note: all input quantities are assumed to be smaller than overflow */ /* by a reasonable factor. (See BIGNUM.) */ /* Arguments */ /* ========== */ /* LTRANS (input) LOGICAL */ /* =.TRUE.: A-transpose will be used. */ /* =.FALSE.: A will be used (not transposed.) */ /* NA (input) INTEGER */ /* The size of the matrix A. It may (only) be 1 or 2. */ /* NW (input) INTEGER */ /* 1 if "w" is real, 2 if "w" is complex. It may only be 1 */ /* or 2. */ /* SMIN (input) DOUBLE PRECISION */ /* The desired lower bound on the singular values of A. This */ /* should be a safe distance away from underflow or overflow, */ /* say, between (underflow/machine precision) and (machine */ /* precision * overflow ). (See BIGNUM and ULP.) */ /* CA (input) DOUBLE PRECISION */ /* The coefficient c, which A is multiplied by. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,NA) */ /* The NA x NA matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of A. It must be at least NA. */ /* D1 (input) DOUBLE PRECISION */ /* The 1,1 element in the diagonal matrix D. */ /* D2 (input) DOUBLE PRECISION */ /* The 2,2 element in the diagonal matrix D. Not used if NW=1. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NW) */ /* The NA x NW matrix B (right-hand side). If NW=2 ("w" is */ /* complex), column 1 contains the real part of B and column 2 */ /* contains the imaginary part. */ /* LDB (input) INTEGER */ /* The leading dimension of B. It must be at least NA. */ /* WR (input) DOUBLE PRECISION */ /* The real part of the scalar "w". */ /* WI (input) DOUBLE PRECISION */ /* The imaginary part of the scalar "w". Not used if NW=1. */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NW) */ /* The NA x NW matrix X (unknowns), as computed by DLALN2. */ /* If NW=2 ("w" is complex), on exit, column 1 will contain */ /* the real part of X and column 2 will contain the imaginary */ /* part. */ /* LDX (input) INTEGER */ /* The leading dimension of X. It must be at least NA. */ /* SCALE (output) DOUBLE PRECISION */ /* The scale factor that B must be multiplied by to insure */ /* that overflow does not occur when computing X. Thus, */ /* (ca A - w D) X will be SCALE*B, not B (ignoring */ /* perturbations of A.) It will be at most 1. */ /* XNORM (output) DOUBLE PRECISION */ /* The infinity-norm of X, when X is regarded as an NA x NW */ /* real matrix. */ /* INFO (output) INTEGER */ /* An error flag. It will be set to zero if no error occurs, */ /* a negative number if an argument is in error, or a positive */ /* number if ca A - w D had to be perturbed. */ /* The possible values are: */ /* = 0: No error occurred, and (ca A - w D) did not have to be */ /* perturbed. */ /* = 1: (ca A - w D) had to be perturbed to make its smallest */ /* (or only) singular value greater than SMIN. */ /* NOTE: In the interests of speed, this routine does not */ /* check the inputs for errors. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Equivalences .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; /* Function Body */ /* .. */ /* .. Executable Statements .. */ /* Compute BIGNUM */ smlnum = 2. * _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; smini = max(*smin,smlnum); /* Don't check for input errors */ *info = 0; /* Standard Initializations */ *scale = 1.; if (*na == 1) { /* 1 x 1 (i.e., scalar) system C X = B */ if (*nw == 1) { /* Real 1x1 system. */ /* C = ca A - w D */ csr = *ca * a[a_dim1 + 1] - *wr * *d1; cnorm = abs(csr); /* If | C | < SMINI, use C = SMINI */ if (cnorm < smini) { csr = smini; cnorm = smini; *info = 1; } /* Check scaling for X = B / C */ bnorm = (d__1 = b[b_dim1 + 1], abs(d__1)); if (cnorm < 1. && bnorm > 1.) { if (bnorm > bignum * cnorm) { *scale = 1. / bnorm; } } /* Compute X */ x[x_dim1 + 1] = b[b_dim1 + 1] * *scale / csr; *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)); } else { /* Complex 1x1 system (w is complex) */ /* C = ca A - w D */ csr = *ca * a[a_dim1 + 1] - *wr * *d1; csi = -(*wi) * *d1; cnorm = abs(csr) + abs(csi); /* If | C | < SMINI, use C = SMINI */ if (cnorm < smini) { csr = smini; csi = 0.; cnorm = smini; *info = 1; } /* Check scaling for X = B / C */ bnorm = (d__1 = b[b_dim1 + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1) + 1], abs(d__2)); if (cnorm < 1. && bnorm > 1.) { if (bnorm > bignum * cnorm) { *scale = 1. / bnorm; } } /* Compute X */ d__1 = *scale * b[b_dim1 + 1]; d__2 = *scale * b[(b_dim1 << 1) + 1]; _starpu_dladiv_(&d__1, &d__2, &csr, &csi, &x[x_dim1 + 1], &x[(x_dim1 << 1) + 1]); *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)) + (d__2 = x[(x_dim1 << 1) + 1], abs(d__2)); } } else { /* 2x2 System */ /* Compute the real part of C = ca A - w D (or ca A' - w D ) */ cr[0] = *ca * a[a_dim1 + 1] - *wr * *d1; cr[3] = *ca * a[(a_dim1 << 1) + 2] - *wr * *d2; if (*ltrans) { cr[2] = *ca * a[a_dim1 + 2]; cr[1] = *ca * a[(a_dim1 << 1) + 1]; } else { cr[1] = *ca * a[a_dim1 + 2]; cr[2] = *ca * a[(a_dim1 << 1) + 1]; } if (*nw == 1) { /* Real 2x2 system (w is real) */ /* Find the largest element in C */ cmax = 0.; icmax = 0; for (j = 1; j <= 4; ++j) { if ((d__1 = crv[j - 1], abs(d__1)) > cmax) { cmax = (d__1 = crv[j - 1], abs(d__1)); icmax = j; } /* L10: */ } /* If norm(C) < SMINI, use SMINI*identity. */ if (cmax < smini) { /* Computing MAX */ d__3 = (d__1 = b[b_dim1 + 1], abs(d__1)), d__4 = (d__2 = b[ b_dim1 + 2], abs(d__2)); bnorm = max(d__3,d__4); if (smini < 1. && bnorm > 1.) { if (bnorm > bignum * smini) { *scale = 1. / bnorm; } } temp = *scale / smini; x[x_dim1 + 1] = temp * b[b_dim1 + 1]; x[x_dim1 + 2] = temp * b[b_dim1 + 2]; *xnorm = temp * bnorm; *info = 1; return 0; } /* Gaussian elimination with complete pivoting. */ ur11 = crv[icmax - 1]; cr21 = crv[ipivot[(icmax << 2) - 3] - 1]; ur12 = crv[ipivot[(icmax << 2) - 2] - 1]; cr22 = crv[ipivot[(icmax << 2) - 1] - 1]; ur11r = 1. / ur11; lr21 = ur11r * cr21; ur22 = cr22 - ur12 * lr21; /* If smaller pivot < SMINI, use SMINI */ if (abs(ur22) < smini) { ur22 = smini; *info = 1; } if (rswap[icmax - 1]) { br1 = b[b_dim1 + 2]; br2 = b[b_dim1 + 1]; } else { br1 = b[b_dim1 + 1]; br2 = b[b_dim1 + 2]; } br2 -= lr21 * br1; /* Computing MAX */ d__2 = (d__1 = br1 * (ur22 * ur11r), abs(d__1)), d__3 = abs(br2); bbnd = max(d__2,d__3); if (bbnd > 1. && abs(ur22) < 1.) { if (bbnd >= bignum * abs(ur22)) { *scale = 1. / bbnd; } } xr2 = br2 * *scale / ur22; xr1 = *scale * br1 * ur11r - xr2 * (ur11r * ur12); if (zswap[icmax - 1]) { x[x_dim1 + 1] = xr2; x[x_dim1 + 2] = xr1; } else { x[x_dim1 + 1] = xr1; x[x_dim1 + 2] = xr2; } /* Computing MAX */ d__1 = abs(xr1), d__2 = abs(xr2); *xnorm = max(d__1,d__2); /* Further scaling if norm(A) norm(X) > overflow */ if (*xnorm > 1. && cmax > 1.) { if (*xnorm > bignum / cmax) { temp = cmax / bignum; x[x_dim1 + 1] = temp * x[x_dim1 + 1]; x[x_dim1 + 2] = temp * x[x_dim1 + 2]; *xnorm = temp * *xnorm; *scale = temp * *scale; } } } else { /* Complex 2x2 system (w is complex) */ /* Find the largest element in C */ ci[0] = -(*wi) * *d1; ci[1] = 0.; ci[2] = 0.; ci[3] = -(*wi) * *d2; cmax = 0.; icmax = 0; for (j = 1; j <= 4; ++j) { if ((d__1 = crv[j - 1], abs(d__1)) + (d__2 = civ[j - 1], abs( d__2)) > cmax) { cmax = (d__1 = crv[j - 1], abs(d__1)) + (d__2 = civ[j - 1] , abs(d__2)); icmax = j; } /* L20: */ } /* If norm(C) < SMINI, use SMINI*identity. */ if (cmax < smini) { /* Computing MAX */ d__5 = (d__1 = b[b_dim1 + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1) + 1], abs(d__2)), d__6 = (d__3 = b[b_dim1 + 2], abs(d__3)) + (d__4 = b[(b_dim1 << 1) + 2], abs(d__4)); bnorm = max(d__5,d__6); if (smini < 1. && bnorm > 1.) { if (bnorm > bignum * smini) { *scale = 1. / bnorm; } } temp = *scale / smini; x[x_dim1 + 1] = temp * b[b_dim1 + 1]; x[x_dim1 + 2] = temp * b[b_dim1 + 2]; x[(x_dim1 << 1) + 1] = temp * b[(b_dim1 << 1) + 1]; x[(x_dim1 << 1) + 2] = temp * b[(b_dim1 << 1) + 2]; *xnorm = temp * bnorm; *info = 1; return 0; } /* Gaussian elimination with complete pivoting. */ ur11 = crv[icmax - 1]; ui11 = civ[icmax - 1]; cr21 = crv[ipivot[(icmax << 2) - 3] - 1]; ci21 = civ[ipivot[(icmax << 2) - 3] - 1]; ur12 = crv[ipivot[(icmax << 2) - 2] - 1]; ui12 = civ[ipivot[(icmax << 2) - 2] - 1]; cr22 = crv[ipivot[(icmax << 2) - 1] - 1]; ci22 = civ[ipivot[(icmax << 2) - 1] - 1]; if (icmax == 1 || icmax == 4) { /* Code when off-diagonals of pivoted C are real */ if (abs(ur11) > abs(ui11)) { temp = ui11 / ur11; /* Computing 2nd power */ d__1 = temp; ur11r = 1. / (ur11 * (d__1 * d__1 + 1.)); ui11r = -temp * ur11r; } else { temp = ur11 / ui11; /* Computing 2nd power */ d__1 = temp; ui11r = -1. / (ui11 * (d__1 * d__1 + 1.)); ur11r = -temp * ui11r; } lr21 = cr21 * ur11r; li21 = cr21 * ui11r; ur12s = ur12 * ur11r; ui12s = ur12 * ui11r; ur22 = cr22 - ur12 * lr21; ui22 = ci22 - ur12 * li21; } else { /* Code when diagonals of pivoted C are real */ ur11r = 1. / ur11; ui11r = 0.; lr21 = cr21 * ur11r; li21 = ci21 * ur11r; ur12s = ur12 * ur11r; ui12s = ui12 * ur11r; ur22 = cr22 - ur12 * lr21 + ui12 * li21; ui22 = -ur12 * li21 - ui12 * lr21; } u22abs = abs(ur22) + abs(ui22); /* If smaller pivot < SMINI, use SMINI */ if (u22abs < smini) { ur22 = smini; ui22 = 0.; *info = 1; } if (rswap[icmax - 1]) { br2 = b[b_dim1 + 1]; br1 = b[b_dim1 + 2]; bi2 = b[(b_dim1 << 1) + 1]; bi1 = b[(b_dim1 << 1) + 2]; } else { br1 = b[b_dim1 + 1]; br2 = b[b_dim1 + 2]; bi1 = b[(b_dim1 << 1) + 1]; bi2 = b[(b_dim1 << 1) + 2]; } br2 = br2 - lr21 * br1 + li21 * bi1; bi2 = bi2 - li21 * br1 - lr21 * bi1; /* Computing MAX */ d__1 = (abs(br1) + abs(bi1)) * (u22abs * (abs(ur11r) + abs(ui11r)) ), d__2 = abs(br2) + abs(bi2); bbnd = max(d__1,d__2); if (bbnd > 1. && u22abs < 1.) { if (bbnd >= bignum * u22abs) { *scale = 1. / bbnd; br1 = *scale * br1; bi1 = *scale * bi1; br2 = *scale * br2; bi2 = *scale * bi2; } } _starpu_dladiv_(&br2, &bi2, &ur22, &ui22, &xr2, &xi2); xr1 = ur11r * br1 - ui11r * bi1 - ur12s * xr2 + ui12s * xi2; xi1 = ui11r * br1 + ur11r * bi1 - ui12s * xr2 - ur12s * xi2; if (zswap[icmax - 1]) { x[x_dim1 + 1] = xr2; x[x_dim1 + 2] = xr1; x[(x_dim1 << 1) + 1] = xi2; x[(x_dim1 << 1) + 2] = xi1; } else { x[x_dim1 + 1] = xr1; x[x_dim1 + 2] = xr2; x[(x_dim1 << 1) + 1] = xi1; x[(x_dim1 << 1) + 2] = xi2; } /* Computing MAX */ d__1 = abs(xr1) + abs(xi1), d__2 = abs(xr2) + abs(xi2); *xnorm = max(d__1,d__2); /* Further scaling if norm(A) norm(X) > overflow */ if (*xnorm > 1. && cmax > 1.) { if (*xnorm > bignum / cmax) { temp = cmax / bignum; x[x_dim1 + 1] = temp * x[x_dim1 + 1]; x[x_dim1 + 2] = temp * x[x_dim1 + 2]; x[(x_dim1 << 1) + 1] = temp * x[(x_dim1 << 1) + 1]; x[(x_dim1 << 1) + 2] = temp * x[(x_dim1 << 1) + 2]; *xnorm = temp * *xnorm; *scale = temp * *scale; } } } } return 0; /* End of DLALN2 */ } /* _starpu_dlaln2_ */ #undef crv #undef civ #undef cr #undef ci starpu-1.3.9+dfsg/min-dgels/base/SRC/dlals0.c000066400000000000000000000354311413463044200205330ustar00rootroot00000000000000/* dlals0.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b5 = -1.; static integer c__1 = 1; static doublereal c_b11 = 1.; static doublereal c_b13 = 0.; static integer c__0 = 0; /* Subroutine */ int _starpu_dlals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * k, doublereal *c__, doublereal *s, doublereal *work, integer *info) { /* System generated locals */ integer givcol_dim1, givcol_offset, b_dim1, b_offset, bx_dim1, bx_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, m, n; doublereal dj; integer nlp1; doublereal temp; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal diflj, difrj, dsigj; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal dsigjp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLALS0 applies back the multiplying factors of either the left or the */ /* right singular vector matrix of a diagonal matrix appended by a row */ /* to the right hand side matrix B in solving the least squares problem */ /* using the divide-and-conquer SVD approach. */ /* For the left singular vector matrix, three types of orthogonal */ /* matrices are involved: */ /* (1L) Givens rotations: the number of such rotations is GIVPTR; the */ /* pairs of columns/rows they were applied to are stored in GIVCOL; */ /* and the C- and S-values of these rotations are stored in GIVNUM. */ /* (2L) Permutation. The (NL+1)-st row of B is to be moved to the first */ /* row, and for J=2:N, PERM(J)-th row of B is to be moved to the */ /* J-th row. */ /* (3L) The left singular vector matrix of the remaining matrix. */ /* For the right singular vector matrix, four types of orthogonal */ /* matrices are involved: */ /* (1R) The right singular vector matrix of the remaining matrix. */ /* (2R) If SQRE = 1, one extra Givens rotation to generate the right */ /* null space. */ /* (3R) The inverse transformation of (2L). */ /* (4R) The inverse transformation of (1L). */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* Specifies whether singular vectors are to be computed in */ /* factored form: */ /* = 0: Left singular vector matrix. */ /* = 1: Right singular vector matrix. */ /* NL (input) INTEGER */ /* The row dimension of the upper block. NL >= 1. */ /* NR (input) INTEGER */ /* The row dimension of the lower block. NR >= 1. */ /* SQRE (input) INTEGER */ /* = 0: the lower block is an NR-by-NR square matrix. */ /* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ /* The bidiagonal matrix has row dimension N = NL + NR + 1, */ /* and column dimension M = N + SQRE. */ /* NRHS (input) INTEGER */ /* The number of columns of B and BX. NRHS must be at least 1. */ /* B (input/output) DOUBLE PRECISION array, dimension ( LDB, NRHS ) */ /* On input, B contains the right hand sides of the least */ /* squares problem in rows 1 through M. On output, B contains */ /* the solution X in rows 1 through N. */ /* LDB (input) INTEGER */ /* The leading dimension of B. LDB must be at least */ /* max(1,MAX( M, N ) ). */ /* BX (workspace) DOUBLE PRECISION array, dimension ( LDBX, NRHS ) */ /* LDBX (input) INTEGER */ /* The leading dimension of BX. */ /* PERM (input) INTEGER array, dimension ( N ) */ /* The permutations (from deflation and sorting) applied */ /* to the two blocks. */ /* GIVPTR (input) INTEGER */ /* The number of Givens rotations which took place in this */ /* subproblem. */ /* GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 ) */ /* Each pair of numbers indicates a pair of rows/columns */ /* involved in a Givens rotation. */ /* LDGCOL (input) INTEGER */ /* The leading dimension of GIVCOL, must be at least N. */ /* GIVNUM (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ /* Each number indicates the C or S value used in the */ /* corresponding Givens rotation. */ /* LDGNUM (input) INTEGER */ /* The leading dimension of arrays DIFR, POLES and */ /* GIVNUM, must be at least K. */ /* POLES (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ /* On entry, POLES(1:K, 1) contains the new singular */ /* values obtained from solving the secular equation, and */ /* POLES(1:K, 2) is an array containing the poles in the secular */ /* equation. */ /* DIFL (input) DOUBLE PRECISION array, dimension ( K ). */ /* On entry, DIFL(I) is the distance between I-th updated */ /* (undeflated) singular value and the I-th (undeflated) old */ /* singular value. */ /* DIFR (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ). */ /* On entry, DIFR(I, 1) contains the distances between I-th */ /* updated (undeflated) singular value and the I+1-th */ /* (undeflated) old singular value. And DIFR(I, 2) is the */ /* normalizing factor for the I-th right singular vector. */ /* Z (input) DOUBLE PRECISION array, dimension ( K ) */ /* Contain the components of the deflation-adjusted updating row */ /* vector. */ /* K (input) INTEGER */ /* Contains the dimension of the non-deflated matrix, */ /* This is the order of the related secular equation. 1 <= K <=N. */ /* C (input) DOUBLE PRECISION */ /* C contains garbage if SQRE =0 and the C-value of a Givens */ /* rotation related to the right null space if SQRE = 1. */ /* S (input) DOUBLE PRECISION */ /* S contains garbage if SQRE =0 and the S-value of a Givens */ /* rotation related to the right null space if SQRE = 1. */ /* WORK (workspace) DOUBLE PRECISION array, dimension ( K ) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Ren-Cang Li, Computer Science Division, University of */ /* California at Berkeley, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; bx_dim1 = *ldbx; bx_offset = 1 + bx_dim1; bx -= bx_offset; --perm; givcol_dim1 = *ldgcol; givcol_offset = 1 + givcol_dim1; givcol -= givcol_offset; difr_dim1 = *ldgnum; difr_offset = 1 + difr_dim1; difr -= difr_offset; poles_dim1 = *ldgnum; poles_offset = 1 + poles_dim1; poles -= poles_offset; givnum_dim1 = *ldgnum; givnum_offset = 1 + givnum_dim1; givnum -= givnum_offset; --difl; --z__; --work; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*nl < 1) { *info = -2; } else if (*nr < 1) { *info = -3; } else if (*sqre < 0 || *sqre > 1) { *info = -4; } n = *nl + *nr + 1; if (*nrhs < 1) { *info = -5; } else if (*ldb < n) { *info = -7; } else if (*ldbx < n) { *info = -9; } else if (*givptr < 0) { *info = -11; } else if (*ldgcol < n) { *info = -13; } else if (*ldgnum < n) { *info = -15; } else if (*k < 1) { *info = -20; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLALS0", &i__1); return 0; } m = n + *sqre; nlp1 = *nl + 1; if (*icompq == 0) { /* Apply back orthogonal transformations from the left. */ /* Step (1L): apply back the Givens rotations performed. */ i__1 = *givptr; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + (givnum_dim1 << 1)], &givnum[i__ + givnum_dim1]); /* L10: */ } /* Step (2L): permute rows of B. */ _starpu_dcopy_(nrhs, &b[nlp1 + b_dim1], ldb, &bx[bx_dim1 + 1], ldbx); i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { _starpu_dcopy_(nrhs, &b[perm[i__] + b_dim1], ldb, &bx[i__ + bx_dim1], ldbx); /* L20: */ } /* Step (3L): apply the inverse of the left singular vector */ /* matrix to BX. */ if (*k == 1) { _starpu_dcopy_(nrhs, &bx[bx_offset], ldbx, &b[b_offset], ldb); if (z__[1] < 0.) { _starpu_dscal_(nrhs, &c_b5, &b[b_offset], ldb); } } else { i__1 = *k; for (j = 1; j <= i__1; ++j) { diflj = difl[j]; dj = poles[j + poles_dim1]; dsigj = -poles[j + (poles_dim1 << 1)]; if (j < *k) { difrj = -difr[j + difr_dim1]; dsigjp = -poles[j + 1 + (poles_dim1 << 1)]; } if (z__[j] == 0. || poles[j + (poles_dim1 << 1)] == 0.) { work[j] = 0.; } else { work[j] = -poles[j + (poles_dim1 << 1)] * z__[j] / diflj / (poles[j + (poles_dim1 << 1)] + dj); } i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == 0.) { work[i__] = 0.; } else { work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] / (_starpu_dlamc3_(&poles[i__ + (poles_dim1 << 1)], & dsigj) - diflj) / (poles[i__ + (poles_dim1 << 1)] + dj); } /* L30: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == 0.) { work[i__] = 0.; } else { work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] / (_starpu_dlamc3_(&poles[i__ + (poles_dim1 << 1)], & dsigjp) + difrj) / (poles[i__ + (poles_dim1 << 1)] + dj); } /* L40: */ } work[1] = -1.; temp = _starpu_dnrm2_(k, &work[1], &c__1); _starpu_dgemv_("T", k, nrhs, &c_b11, &bx[bx_offset], ldbx, &work[1], & c__1, &c_b13, &b[j + b_dim1], ldb); _starpu_dlascl_("G", &c__0, &c__0, &temp, &c_b11, &c__1, nrhs, &b[j + b_dim1], ldb, info); /* L50: */ } } /* Move the deflated rows of BX to B also. */ if (*k < max(m,n)) { i__1 = n - *k; _starpu_dlacpy_("A", &i__1, nrhs, &bx[*k + 1 + bx_dim1], ldbx, &b[*k + 1 + b_dim1], ldb); } } else { /* Apply back the right orthogonal transformations. */ /* Step (1R): apply back the new right singular vector matrix */ /* to B. */ if (*k == 1) { _starpu_dcopy_(nrhs, &b[b_offset], ldb, &bx[bx_offset], ldbx); } else { i__1 = *k; for (j = 1; j <= i__1; ++j) { dsigj = poles[j + (poles_dim1 << 1)]; if (z__[j] == 0.) { work[j] = 0.; } else { work[j] = -z__[j] / difl[j] / (dsigj + poles[j + poles_dim1]) / difr[j + (difr_dim1 << 1)]; } i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { if (z__[j] == 0.) { work[i__] = 0.; } else { d__1 = -poles[i__ + 1 + (poles_dim1 << 1)]; work[i__] = z__[j] / (_starpu_dlamc3_(&dsigj, &d__1) - difr[ i__ + difr_dim1]) / (dsigj + poles[i__ + poles_dim1]) / difr[i__ + (difr_dim1 << 1)]; } /* L60: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { if (z__[j] == 0.) { work[i__] = 0.; } else { d__1 = -poles[i__ + (poles_dim1 << 1)]; work[i__] = z__[j] / (_starpu_dlamc3_(&dsigj, &d__1) - difl[ i__]) / (dsigj + poles[i__ + poles_dim1]) / difr[i__ + (difr_dim1 << 1)]; } /* L70: */ } _starpu_dgemv_("T", k, nrhs, &c_b11, &b[b_offset], ldb, &work[1], & c__1, &c_b13, &bx[j + bx_dim1], ldbx); /* L80: */ } } /* Step (2R): if SQRE = 1, apply back the rotation that is */ /* related to the right null space of the subproblem. */ if (*sqre == 1) { _starpu_dcopy_(nrhs, &b[m + b_dim1], ldb, &bx[m + bx_dim1], ldbx); _starpu_drot_(nrhs, &bx[bx_dim1 + 1], ldbx, &bx[m + bx_dim1], ldbx, c__, s); } if (*k < max(m,n)) { i__1 = n - *k; _starpu_dlacpy_("A", &i__1, nrhs, &b[*k + 1 + b_dim1], ldb, &bx[*k + 1 + bx_dim1], ldbx); } /* Step (3R): permute rows of B. */ _starpu_dcopy_(nrhs, &bx[bx_dim1 + 1], ldbx, &b[nlp1 + b_dim1], ldb); if (*sqre == 1) { _starpu_dcopy_(nrhs, &bx[m + bx_dim1], ldbx, &b[m + b_dim1], ldb); } i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { _starpu_dcopy_(nrhs, &bx[i__ + bx_dim1], ldbx, &b[perm[i__] + b_dim1], ldb); /* L90: */ } /* Step (4R): apply back the Givens rotations performed. */ for (i__ = *givptr; i__ >= 1; --i__) { d__1 = -givnum[i__ + givnum_dim1]; _starpu_drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + (givnum_dim1 << 1)], &d__1); /* L100: */ } } return 0; /* End of DLALS0 */ } /* _starpu_dlals0_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlalsa.c000066400000000000000000000351571413463044200206210ustar00rootroot00000000000000/* dlalsa.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = 1.; static doublereal c_b8 = 0.; static integer c__2 = 2; /* Subroutine */ int _starpu_dlalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal * poles, integer *givptr, integer *givcol, integer *ldgcol, integer * perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * work, integer *iwork, integer *info) { /* System generated locals */ integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, b_dim1, b_offset, bx_dim1, bx_offset, difl_dim1, difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, i__2; /* Builtin functions */ integer pow_ii(integer *, integer *); /* Local variables */ integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, nlp1, lvl2, nrp1, nlvl, sqre; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer inode, ndiml, ndimr; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlals0_(integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlasdt_(integer *, integer *, integer *, integer *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLALSA is an itermediate step in solving the least squares problem */ /* by computing the SVD of the coefficient matrix in compact form (The */ /* singular vectors are computed as products of simple orthorgonal */ /* matrices.). */ /* If ICOMPQ = 0, DLALSA applies the inverse of the left singular vector */ /* matrix of an upper bidiagonal matrix to the right hand side; and if */ /* ICOMPQ = 1, DLALSA applies the right singular vector matrix to the */ /* right hand side. The singular vector matrices were generated in */ /* compact form by DLALSA. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* Specifies whether the left or the right singular vector */ /* matrix is involved. */ /* = 0: Left singular vector matrix */ /* = 1: Right singular vector matrix */ /* SMLSIZ (input) INTEGER */ /* The maximum size of the subproblems at the bottom of the */ /* computation tree. */ /* N (input) INTEGER */ /* The row and column dimensions of the upper bidiagonal matrix. */ /* NRHS (input) INTEGER */ /* The number of columns of B and BX. NRHS must be at least 1. */ /* B (input/output) DOUBLE PRECISION array, dimension ( LDB, NRHS ) */ /* On input, B contains the right hand sides of the least */ /* squares problem in rows 1 through M. */ /* On output, B contains the solution X in rows 1 through N. */ /* LDB (input) INTEGER */ /* The leading dimension of B in the calling subprogram. */ /* LDB must be at least max(1,MAX( M, N ) ). */ /* BX (output) DOUBLE PRECISION array, dimension ( LDBX, NRHS ) */ /* On exit, the result of applying the left or right singular */ /* vector matrix to B. */ /* LDBX (input) INTEGER */ /* The leading dimension of BX. */ /* U (input) DOUBLE PRECISION array, dimension ( LDU, SMLSIZ ). */ /* On entry, U contains the left singular vector matrices of all */ /* subproblems at the bottom level. */ /* LDU (input) INTEGER, LDU = > N. */ /* The leading dimension of arrays U, VT, DIFL, DIFR, */ /* POLES, GIVNUM, and Z. */ /* VT (input) DOUBLE PRECISION array, dimension ( LDU, SMLSIZ+1 ). */ /* On entry, VT' contains the right singular vector matrices of */ /* all subproblems at the bottom level. */ /* K (input) INTEGER array, dimension ( N ). */ /* DIFL (input) DOUBLE PRECISION array, dimension ( LDU, NLVL ). */ /* where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1. */ /* DIFR (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ /* On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record */ /* distances between singular values on the I-th level and */ /* singular values on the (I -1)-th level, and DIFR(*, 2 * I) */ /* record the normalizing factors of the right singular vectors */ /* matrices of subproblems on I-th level. */ /* Z (input) DOUBLE PRECISION array, dimension ( LDU, NLVL ). */ /* On entry, Z(1, I) contains the components of the deflation- */ /* adjusted updating row vector for subproblems on the I-th */ /* level. */ /* POLES (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ /* On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old */ /* singular values involved in the secular equations on the I-th */ /* level. */ /* GIVPTR (input) INTEGER array, dimension ( N ). */ /* On entry, GIVPTR( I ) records the number of Givens */ /* rotations performed on the I-th problem on the computation */ /* tree. */ /* GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 * NLVL ). */ /* On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the */ /* locations of Givens rotations performed on the I-th level on */ /* the computation tree. */ /* LDGCOL (input) INTEGER, LDGCOL = > N. */ /* The leading dimension of arrays GIVCOL and PERM. */ /* PERM (input) INTEGER array, dimension ( LDGCOL, NLVL ). */ /* On entry, PERM(*, I) records permutations done on the I-th */ /* level of the computation tree. */ /* GIVNUM (input) DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ /* On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S- */ /* values of Givens rotations performed on the I-th level on the */ /* computation tree. */ /* C (input) DOUBLE PRECISION array, dimension ( N ). */ /* On entry, if the I-th subproblem is not square, */ /* C( I ) contains the C-value of a Givens rotation related to */ /* the right null space of the I-th subproblem. */ /* S (input) DOUBLE PRECISION array, dimension ( N ). */ /* On entry, if the I-th subproblem is not square, */ /* S( I ) contains the S-value of a Givens rotation related to */ /* the right null space of the I-th subproblem. */ /* WORK (workspace) DOUBLE PRECISION array. */ /* The dimension must be at least N. */ /* IWORK (workspace) INTEGER array. */ /* The dimension must be at least 3 * N */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Ren-Cang Li, Computer Science Division, University of */ /* California at Berkeley, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; bx_dim1 = *ldbx; bx_offset = 1 + bx_dim1; bx -= bx_offset; givnum_dim1 = *ldu; givnum_offset = 1 + givnum_dim1; givnum -= givnum_offset; poles_dim1 = *ldu; poles_offset = 1 + poles_dim1; poles -= poles_offset; z_dim1 = *ldu; z_offset = 1 + z_dim1; z__ -= z_offset; difr_dim1 = *ldu; difr_offset = 1 + difr_dim1; difr -= difr_offset; difl_dim1 = *ldu; difl_offset = 1 + difl_dim1; difl -= difl_offset; vt_dim1 = *ldu; vt_offset = 1 + vt_dim1; vt -= vt_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; --k; --givptr; perm_dim1 = *ldgcol; perm_offset = 1 + perm_dim1; perm -= perm_offset; givcol_dim1 = *ldgcol; givcol_offset = 1 + givcol_dim1; givcol -= givcol_offset; --c__; --s; --work; --iwork; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*smlsiz < 3) { *info = -2; } else if (*n < *smlsiz) { *info = -3; } else if (*nrhs < 1) { *info = -4; } else if (*ldb < *n) { *info = -6; } else if (*ldbx < *n) { *info = -8; } else if (*ldu < *n) { *info = -10; } else if (*ldgcol < *n) { *info = -19; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLALSA", &i__1); return 0; } /* Book-keeping and setting up the computation tree. */ inode = 1; ndiml = inode + *n; ndimr = ndiml + *n; _starpu_dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], smlsiz); /* The following code applies back the left singular vector factors. */ /* For applying back the right singular vector factors, go to 50. */ if (*icompq == 1) { goto L50; } /* The nodes on the bottom level of the tree were solved */ /* by DLASDQ. The corresponding left and right singular vector */ /* matrices are in explicit form. First apply back the left */ /* singular vector matrices. */ ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { /* IC : center row of each node */ /* NL : number of rows of left subproblem */ /* NR : number of rows of right subproblem */ /* NLF: starting row of the left subproblem */ /* NRF: starting row of the right subproblem */ i1 = i__ - 1; ic = iwork[inode + i1]; nl = iwork[ndiml + i1]; nr = iwork[ndimr + i1]; nlf = ic - nl; nrf = ic + 1; _starpu_dgemm_("T", "N", &nl, nrhs, &nl, &c_b7, &u[nlf + u_dim1], ldu, &b[nlf + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx); _starpu_dgemm_("T", "N", &nr, nrhs, &nr, &c_b7, &u[nrf + u_dim1], ldu, &b[nrf + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx); /* L10: */ } /* Next copy the rows of B that correspond to unchanged rows */ /* in the bidiagonal matrix to BX. */ i__1 = nd; for (i__ = 1; i__ <= i__1; ++i__) { ic = iwork[inode + i__ - 1]; _starpu_dcopy_(nrhs, &b[ic + b_dim1], ldb, &bx[ic + bx_dim1], ldbx); /* L20: */ } /* Finally go through the left singular vector matrices of all */ /* the other subproblems bottom-up on the tree. */ j = pow_ii(&c__2, &nlvl); sqre = 0; for (lvl = nlvl; lvl >= 1; --lvl) { lvl2 = (lvl << 1) - 1; /* find the first node LF and last node LL on */ /* the current level LVL */ if (lvl == 1) { lf = 1; ll = 1; } else { i__1 = lvl - 1; lf = pow_ii(&c__2, &i__1); ll = (lf << 1) - 1; } i__1 = ll; for (i__ = lf; i__ <= i__1; ++i__) { im1 = i__ - 1; ic = iwork[inode + im1]; nl = iwork[ndiml + im1]; nr = iwork[ndimr + im1]; nlf = ic - nl; nrf = ic + 1; --j; _starpu_dlals0_(icompq, &nl, &nr, &sqre, nrhs, &bx[nlf + bx_dim1], ldbx, & b[nlf + b_dim1], ldb, &perm[nlf + lvl * perm_dim1], & givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ j], &s[j], &work[1], info); /* L30: */ } /* L40: */ } goto L90; /* ICOMPQ = 1: applying back the right singular vector factors. */ L50: /* First now go through the right singular vector matrices of all */ /* the tree nodes top-down. */ j = 0; i__1 = nlvl; for (lvl = 1; lvl <= i__1; ++lvl) { lvl2 = (lvl << 1) - 1; /* Find the first node LF and last node LL on */ /* the current level LVL. */ if (lvl == 1) { lf = 1; ll = 1; } else { i__2 = lvl - 1; lf = pow_ii(&c__2, &i__2); ll = (lf << 1) - 1; } i__2 = lf; for (i__ = ll; i__ >= i__2; --i__) { im1 = i__ - 1; ic = iwork[inode + im1]; nl = iwork[ndiml + im1]; nr = iwork[ndimr + im1]; nlf = ic - nl; nrf = ic + 1; if (i__ == ll) { sqre = 0; } else { sqre = 1; } ++j; _starpu_dlals0_(icompq, &nl, &nr, &sqre, nrhs, &b[nlf + b_dim1], ldb, &bx[ nlf + bx_dim1], ldbx, &perm[nlf + lvl * perm_dim1], & givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ j], &s[j], &work[1], info); /* L60: */ } /* L70: */ } /* The nodes on the bottom level of the tree were solved */ /* by DLASDQ. The corresponding right singular vector */ /* matrices are in explicit form. Apply them back. */ ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { i1 = i__ - 1; ic = iwork[inode + i1]; nl = iwork[ndiml + i1]; nr = iwork[ndimr + i1]; nlp1 = nl + 1; if (i__ == nd) { nrp1 = nr; } else { nrp1 = nr + 1; } nlf = ic - nl; nrf = ic + 1; _starpu_dgemm_("T", "N", &nlp1, nrhs, &nlp1, &c_b7, &vt[nlf + vt_dim1], ldu, & b[nlf + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx); _starpu_dgemm_("T", "N", &nrp1, nrhs, &nrp1, &c_b7, &vt[nrf + vt_dim1], ldu, & b[nrf + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx); /* L80: */ } L90: return 0; /* End of DLALSA */ } /* _starpu_dlalsa_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlalsd.c000066400000000000000000000414131413463044200206140ustar00rootroot00000000000000/* dlalsd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b6 = 0.; static integer c__0 = 0; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dlalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, doublereal *rcond, integer *rank, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double log(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ integer c__, i__, j, k; doublereal r__; integer s, u, z__; doublereal cs; integer bx; doublereal sn; integer st, vt, nm1, st1; doublereal eps; integer iwk; doublereal tol; integer difl, difr; doublereal rcnd; integer perm, nsub; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer nlvl, sqre, bxst; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer poles, sizei, nsize, nwork, icmpq1, icmpq2; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlasda_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlalsa_(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); integer givcol; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlasrt_(char *, integer *, doublereal *, integer *); doublereal orgnrm; integer givnum, givptr, smlszp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLALSD uses the singular value decomposition of A to solve the least */ /* squares problem of finding X to minimize the Euclidean norm of each */ /* column of A*X-B, where A is N-by-N upper bidiagonal, and X and B */ /* are N-by-NRHS. The solution X overwrites B. */ /* The singular values of A smaller than RCOND times the largest */ /* singular value are treated as zero in solving the least squares */ /* problem; in this case a minimum norm solution is returned. */ /* The actual singular values are returned in D in ascending order. */ /* This code makes very mild assumptions about floating point */ /* arithmetic. It will work on machines with a guard digit in */ /* add/subtract, or on those binary machines without guard digits */ /* which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2. */ /* It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': D and E define an upper bidiagonal matrix. */ /* = 'L': D and E define a lower bidiagonal matrix. */ /* SMLSIZ (input) INTEGER */ /* The maximum size of the subproblems at the bottom of the */ /* computation tree. */ /* N (input) INTEGER */ /* The dimension of the bidiagonal matrix. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of columns of B. NRHS must be at least 1. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry D contains the main diagonal of the bidiagonal */ /* matrix. On exit, if INFO = 0, D contains its singular values. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* Contains the super-diagonal entries of the bidiagonal matrix. */ /* On exit, E has been destroyed. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On input, B contains the right hand sides of the least */ /* squares problem. On output, B contains the solution X. */ /* LDB (input) INTEGER */ /* The leading dimension of B in the calling subprogram. */ /* LDB must be at least max(1,N). */ /* RCOND (input) DOUBLE PRECISION */ /* The singular values of A less than or equal to RCOND times */ /* the largest singular value are treated as zero in solving */ /* the least squares problem. If RCOND is negative, */ /* machine precision is used instead. */ /* For example, if diag(S)*X=B were the least squares problem, */ /* where diag(S) is a diagonal matrix of singular values, the */ /* solution would be X(i) = B(i) / S(i) if S(i) is greater than */ /* RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to */ /* RCOND*max(S). */ /* RANK (output) INTEGER */ /* The number of singular values of A greater than RCOND times */ /* the largest singular value. */ /* WORK (workspace) DOUBLE PRECISION array, dimension at least */ /* (9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2), */ /* where NLVL = max(0, INT(log_2 (N/(SMLSIZ+1))) + 1). */ /* IWORK (workspace) INTEGER array, dimension at least */ /* (3*N*NLVL + 11*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: The algorithm failed to compute an singular value while */ /* working on the submatrix lying in rows and columns */ /* INFO/(N+1) through MOD(INFO,N+1). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Ren-Cang Li, Computer Science Division, University of */ /* California at Berkeley, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --work; --iwork; /* Function Body */ *info = 0; if (*n < 0) { *info = -3; } else if (*nrhs < 1) { *info = -4; } else if (*ldb < 1 || *ldb < *n) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLALSD", &i__1); return 0; } eps = _starpu_dlamch_("Epsilon"); /* Set up the tolerance. */ if (*rcond <= 0. || *rcond >= 1.) { rcnd = eps; } else { rcnd = *rcond; } *rank = 0; /* Quick return if possible. */ if (*n == 0) { return 0; } else if (*n == 1) { if (d__[1] == 0.) { _starpu_dlaset_("A", &c__1, nrhs, &c_b6, &c_b6, &b[b_offset], ldb); } else { *rank = 1; _starpu_dlascl_("G", &c__0, &c__0, &d__[1], &c_b11, &c__1, nrhs, &b[ b_offset], ldb, info); d__[1] = abs(d__[1]); } return 0; } /* Rotate the matrix if it is lower bidiagonal. */ if (*(unsigned char *)uplo == 'L') { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); d__[i__] = r__; e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; if (*nrhs == 1) { _starpu_drot_(&c__1, &b[i__ + b_dim1], &c__1, &b[i__ + 1 + b_dim1], & c__1, &cs, &sn); } else { work[(i__ << 1) - 1] = cs; work[i__ * 2] = sn; } /* L10: */ } if (*nrhs > 1) { i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n - 1; for (j = 1; j <= i__2; ++j) { cs = work[(j << 1) - 1]; sn = work[j * 2]; _starpu_drot_(&c__1, &b[j + i__ * b_dim1], &c__1, &b[j + 1 + i__ * b_dim1], &c__1, &cs, &sn); /* L20: */ } /* L30: */ } } } /* Scale. */ nm1 = *n - 1; orgnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (orgnrm == 0.) { _starpu_dlaset_("A", n, nrhs, &c_b6, &c_b6, &b[b_offset], ldb); return 0; } _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b11, n, &c__1, &d__[1], n, info); _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b11, &nm1, &c__1, &e[1], &nm1, info); /* If N is smaller than the minimum divide size SMLSIZ, then solve */ /* the problem with another solver. */ if (*n <= *smlsiz) { nwork = *n * *n + 1; _starpu_dlaset_("A", n, n, &c_b6, &c_b11, &work[1], n); _starpu_dlasdq_("U", &c__0, n, n, &c__0, nrhs, &d__[1], &e[1], &work[1], n, & work[1], n, &b[b_offset], ldb, &work[nwork], info); if (*info != 0) { return 0; } tol = rcnd * (d__1 = d__[_starpu_idamax_(n, &d__[1], &c__1)], abs(d__1)); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] <= tol) { _starpu_dlaset_("A", &c__1, nrhs, &c_b6, &c_b6, &b[i__ + b_dim1], ldb); } else { _starpu_dlascl_("G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &b[ i__ + b_dim1], ldb, info); ++(*rank); } /* L40: */ } _starpu_dgemm_("T", "N", n, nrhs, n, &c_b11, &work[1], n, &b[b_offset], ldb, & c_b6, &work[nwork], n); _starpu_dlacpy_("A", n, nrhs, &work[nwork], n, &b[b_offset], ldb); /* Unscale. */ _starpu_dlascl_("G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info); _starpu_dlasrt_("D", n, &d__[1], info); _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, info); return 0; } /* Book-keeping and setting up some constants. */ nlvl = (integer) (log((doublereal) (*n) / (doublereal) (*smlsiz + 1)) / log(2.)) + 1; smlszp = *smlsiz + 1; u = 1; vt = *smlsiz * *n + 1; difl = vt + smlszp * *n; difr = difl + nlvl * *n; z__ = difr + (nlvl * *n << 1); c__ = z__ + nlvl * *n; s = c__ + *n; poles = s + *n; givnum = poles + (nlvl << 1) * *n; bx = givnum + (nlvl << 1) * *n; nwork = bx + *n * *nrhs; sizei = *n + 1; k = sizei + *n; givptr = k + *n; perm = givptr + *n; givcol = perm + nlvl * *n; iwk = givcol + (nlvl * *n << 1); st = 1; sqre = 0; icmpq1 = 1; icmpq2 = 0; nsub = 0; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) < eps) { d__[i__] = d_sign(&eps, &d__[i__]); } /* L50: */ } i__1 = nm1; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { ++nsub; iwork[nsub] = st; /* Subproblem found. First determine its size and then */ /* apply divide and conquer on it. */ if (i__ < nm1) { /* A subproblem with E(I) small for I < NM1. */ nsize = i__ - st + 1; iwork[sizei + nsub - 1] = nsize; } else if ((d__1 = e[i__], abs(d__1)) >= eps) { /* A subproblem with E(NM1) not too small but I = NM1. */ nsize = *n - st + 1; iwork[sizei + nsub - 1] = nsize; } else { /* A subproblem with E(NM1) small. This implies an */ /* 1-by-1 subproblem at D(N), which is not solved */ /* explicitly. */ nsize = i__ - st + 1; iwork[sizei + nsub - 1] = nsize; ++nsub; iwork[nsub] = *n; iwork[sizei + nsub - 1] = 1; _starpu_dcopy_(nrhs, &b[*n + b_dim1], ldb, &work[bx + nm1], n); } st1 = st - 1; if (nsize == 1) { /* This is a 1-by-1 subproblem and is not solved */ /* explicitly. */ _starpu_dcopy_(nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n); } else if (nsize <= *smlsiz) { /* This is a small subproblem and is solved by DLASDQ. */ _starpu_dlaset_("A", &nsize, &nsize, &c_b6, &c_b11, &work[vt + st1], n); _starpu_dlasdq_("U", &c__0, &nsize, &nsize, &c__0, nrhs, &d__[st], &e[ st], &work[vt + st1], n, &work[nwork], n, &b[st + b_dim1], ldb, &work[nwork], info); if (*info != 0) { return 0; } _starpu_dlacpy_("A", &nsize, nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n); } else { /* A large problem. Solve it using divide and conquer. */ _starpu_dlasda_(&icmpq1, smlsiz, &nsize, &sqre, &d__[st], &e[st], & work[u + st1], n, &work[vt + st1], &iwork[k + st1], & work[difl + st1], &work[difr + st1], &work[z__ + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[ givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[iwk], info); if (*info != 0) { return 0; } bxst = bx + st1; _starpu_dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &b[st + b_dim1], ldb, & work[bxst], n, &work[u + st1], n, &work[vt + st1], & iwork[k + st1], &work[difl + st1], &work[difr + st1], &work[z__ + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[givcol + st1], n, &iwork[perm + st1], & work[givnum + st1], &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[iwk], info); if (*info != 0) { return 0; } } st = i__ + 1; } /* L60: */ } /* Apply the singular values and treat the tiny ones as zero. */ tol = rcnd * (d__1 = d__[_starpu_idamax_(n, &d__[1], &c__1)], abs(d__1)); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Some of the elements in D can be negative because 1-by-1 */ /* subproblems were not solved explicitly. */ if ((d__1 = d__[i__], abs(d__1)) <= tol) { _starpu_dlaset_("A", &c__1, nrhs, &c_b6, &c_b6, &work[bx + i__ - 1], n); } else { ++(*rank); _starpu_dlascl_("G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &work[ bx + i__ - 1], n, info); } d__[i__] = (d__1 = d__[i__], abs(d__1)); /* L70: */ } /* Now apply back the right singular vectors. */ icmpq2 = 1; i__1 = nsub; for (i__ = 1; i__ <= i__1; ++i__) { st = iwork[i__]; st1 = st - 1; nsize = iwork[sizei + i__ - 1]; bxst = bx + st1; if (nsize == 1) { _starpu_dcopy_(nrhs, &work[bxst], n, &b[st + b_dim1], ldb); } else if (nsize <= *smlsiz) { _starpu_dgemm_("T", "N", &nsize, nrhs, &nsize, &c_b11, &work[vt + st1], n, &work[bxst], n, &c_b6, &b[st + b_dim1], ldb); } else { _starpu_dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &work[bxst], n, &b[st + b_dim1], ldb, &work[u + st1], n, &work[vt + st1], &iwork[ k + st1], &work[difl + st1], &work[difr + st1], &work[z__ + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[ givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[ iwk], info); if (*info != 0) { return 0; } } /* L80: */ } /* Unscale and sort the singular values. */ _starpu_dlascl_("G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info); _starpu_dlasrt_("D", n, &d__[1], info); _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, info); return 0; /* End of DLALSD */ } /* _starpu_dlalsd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlamrg.c000066400000000000000000000064101413463044200206150ustar00rootroot00000000000000/* dlamrg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlamrg_(integer *n1, integer *n2, doublereal *a, integer *dtrd1, integer *dtrd2, integer *index) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, ind1, ind2, n1sv, n2sv; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAMRG will create a permutation list which will merge the elements */ /* of A (which is composed of two independently sorted sets) into a */ /* single set which is sorted in ascending order. */ /* Arguments */ /* ========= */ /* N1 (input) INTEGER */ /* N2 (input) INTEGER */ /* These arguements contain the respective lengths of the two */ /* sorted lists to be merged. */ /* A (input) DOUBLE PRECISION array, dimension (N1+N2) */ /* The first N1 elements of A contain a list of numbers which */ /* are sorted in either ascending or descending order. Likewise */ /* for the final N2 elements. */ /* DTRD1 (input) INTEGER */ /* DTRD2 (input) INTEGER */ /* These are the strides to be taken through the array A. */ /* Allowable strides are 1 and -1. They indicate whether a */ /* subset of A is sorted in ascending (DTRDx = 1) or descending */ /* (DTRDx = -1) order. */ /* INDEX (output) INTEGER array, dimension (N1+N2) */ /* On exit this array will contain a permutation such that */ /* if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be */ /* sorted in ascending order. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --index; --a; /* Function Body */ n1sv = *n1; n2sv = *n2; if (*dtrd1 > 0) { ind1 = 1; } else { ind1 = *n1; } if (*dtrd2 > 0) { ind2 = *n1 + 1; } else { ind2 = *n1 + *n2; } i__ = 1; /* while ( (N1SV > 0) & (N2SV > 0) ) */ L10: if (n1sv > 0 && n2sv > 0) { if (a[ind1] <= a[ind2]) { index[i__] = ind1; ++i__; ind1 += *dtrd1; --n1sv; } else { index[i__] = ind2; ++i__; ind2 += *dtrd2; --n2sv; } goto L10; } /* end while */ if (n1sv == 0) { i__1 = n2sv; for (n1sv = 1; n1sv <= i__1; ++n1sv) { index[i__] = ind2; ++i__; ind2 += *dtrd2; /* L20: */ } } else { /* N2SV .EQ. 0 */ i__1 = n1sv; for (n2sv = 1; n2sv <= i__1; ++n2sv) { index[i__] = ind1; ++i__; ind1 += *dtrd1; /* L30: */ } } return 0; /* End of DLAMRG */ } /* _starpu_dlamrg_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaneg.c000066400000000000000000000140231413463044200206000ustar00rootroot00000000000000/* dlaneg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_dlaneg_(integer *n, doublereal *d__, doublereal *lld, doublereal * sigma, doublereal *pivmin, integer *r__) { /* System generated locals */ integer ret_val, i__1, i__2, i__3, i__4; /* Local variables */ integer j; doublereal p, t; integer bj; doublereal tmp; integer neg1, neg2; doublereal bsav, gamma, dplus; extern logical _starpu_disnan_(doublereal *); integer negcnt; logical sawnan; doublereal dminus; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANEG computes the Sturm count, the number of negative pivots */ /* encountered while factoring tridiagonal T - sigma I = L D L^T. */ /* This implementation works directly on the factors without forming */ /* the tridiagonal matrix T. The Sturm count is also the number of */ /* eigenvalues of T less than sigma. */ /* This routine is called from DLARRB. */ /* The current routine does not use the PIVMIN parameter but rather */ /* requires IEEE-754 propagation of Infinities and NaNs. This */ /* routine also has no input range restrictions but does require */ /* default exception handling such that x/0 produces Inf when x is */ /* non-zero, and Inf/Inf produces NaN. For more information, see: */ /* Marques, Riedy, and Voemel, "Benefits of IEEE-754 Features in */ /* Modern Symmetric Tridiagonal Eigensolvers," SIAM Journal on */ /* Scientific Computing, v28, n5, 2006. DOI 10.1137/050641624 */ /* (Tech report version in LAWN 172 with the same title.) */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The N diagonal elements of the diagonal matrix D. */ /* LLD (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (N-1) elements L(i)*L(i)*D(i). */ /* SIGMA (input) DOUBLE PRECISION */ /* Shift amount in T - sigma I = L D L^T. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot in the Sturm sequence. May be used */ /* when zero pivots are encountered on non-IEEE-754 */ /* architectures. */ /* R (input) INTEGER */ /* The twist index for the twisted factorization that is used */ /* for the negcount. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* Jason Riedy, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* Some architectures propagate Infinities and NaNs very slowly, so */ /* the code computes counts in BLKLEN chunks. Then a NaN can */ /* propagate at most BLKLEN columns before being detected. This is */ /* not a general tuning parameter; it needs only to be just large */ /* enough that the overhead is tiny in common cases. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --lld; --d__; /* Function Body */ negcnt = 0; /* I) upper part: L D L^T - SIGMA I = L+ D+ L+^T */ t = -(*sigma); i__1 = *r__ - 1; for (bj = 1; bj <= i__1; bj += 128) { neg1 = 0; bsav = t; /* Computing MIN */ i__3 = bj + 127, i__4 = *r__ - 1; i__2 = min(i__3,i__4); for (j = bj; j <= i__2; ++j) { dplus = d__[j] + t; if (dplus < 0.) { ++neg1; } tmp = t / dplus; t = tmp * lld[j] - *sigma; /* L21: */ } sawnan = _starpu_disnan_(&t); /* Run a slower version of the above loop if a NaN is detected. */ /* A NaN should occur only with a zero pivot after an infinite */ /* pivot. In that case, substituting 1 for T/DPLUS is the */ /* correct limit. */ if (sawnan) { neg1 = 0; t = bsav; /* Computing MIN */ i__3 = bj + 127, i__4 = *r__ - 1; i__2 = min(i__3,i__4); for (j = bj; j <= i__2; ++j) { dplus = d__[j] + t; if (dplus < 0.) { ++neg1; } tmp = t / dplus; if (_starpu_disnan_(&tmp)) { tmp = 1.; } t = tmp * lld[j] - *sigma; /* L22: */ } } negcnt += neg1; /* L210: */ } /* II) lower part: L D L^T - SIGMA I = U- D- U-^T */ p = d__[*n] - *sigma; i__1 = *r__; for (bj = *n - 1; bj >= i__1; bj += -128) { neg2 = 0; bsav = p; /* Computing MAX */ i__3 = bj - 127; i__2 = max(i__3,*r__); for (j = bj; j >= i__2; --j) { dminus = lld[j] + p; if (dminus < 0.) { ++neg2; } tmp = p / dminus; p = tmp * d__[j] - *sigma; /* L23: */ } sawnan = _starpu_disnan_(&p); /* As above, run a slower version that substitutes 1 for Inf/Inf. */ if (sawnan) { neg2 = 0; p = bsav; /* Computing MAX */ i__3 = bj - 127; i__2 = max(i__3,*r__); for (j = bj; j >= i__2; --j) { dminus = lld[j] + p; if (dminus < 0.) { ++neg2; } tmp = p / dminus; if (_starpu_disnan_(&tmp)) { tmp = 1.; } p = tmp * d__[j] - *sigma; /* L24: */ } } negcnt += neg2; /* L230: */ } /* III) Twist index */ /* T was shifted by SIGMA initially. */ gamma = t + *sigma + p; if (gamma < 0.) { ++negcnt; } ret_val = negcnt; return ret_val; } /* _starpu_dlaneg_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlangb.c000066400000000000000000000140571413463044200206040ustar00rootroot00000000000000/* dlangb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlangb_(char *norm, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *work) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k, l; doublereal sum, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANGB returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of an */ /* n by n band matrix A, with kl sub-diagonals and ku super-diagonals. */ /* Description */ /* =========== */ /* DLANGB returns the value */ /* DLANGB = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANGB as described */ /* above. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANGB is */ /* set to zero. */ /* KL (input) INTEGER */ /* The number of sub-diagonals of the matrix A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of super-diagonals of the matrix A. KU >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The band matrix A, stored in rows 1 to KL+KU+1. The j-th */ /* column of A is stored in the j-th column of the array AB as */ /* follows: */ /* AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(n,j+kl). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KL+KU+1. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --work; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = *ku + 2 - j; /* Computing MIN */ i__4 = *n + *ku + 1 - j, i__5 = *kl + *ku + 1; i__3 = min(i__4,i__5); for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs(d__1)) ; value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; /* Computing MAX */ i__3 = *ku + 2 - j; /* Computing MIN */ i__4 = *n + *ku + 1 - j, i__5 = *kl + *ku + 1; i__2 = min(i__4,i__5); for (i__ = max(i__3,1); i__ <= i__2; ++i__) { sum += (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); /* L30: */ } value = max(value,sum); /* L40: */ } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L50: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { k = *ku + 1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *ku; /* Computing MIN */ i__5 = *n, i__6 = j + *kl; i__4 = min(i__5,i__6); for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { work[i__] += (d__1 = ab[k + i__ + j * ab_dim1], abs(d__1)); /* L60: */ } /* L70: */ } value = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L80: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__4 = 1, i__2 = j - *ku; l = max(i__4,i__2); k = *ku + 1 - j + l; /* Computing MIN */ i__2 = *n, i__3 = j + *kl; i__4 = min(i__2,i__3) - l + 1; _starpu_dlassq_(&i__4, &ab[k + j * ab_dim1], &c__1, &scale, &sum); /* L90: */ } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANGB */ } /* _starpu_dlangb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlange.c000066400000000000000000000121061413463044200206000ustar00rootroot00000000000000/* dlange.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlange_(char *norm, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal sum, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANGE returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real matrix A. */ /* Description */ /* =========== */ /* DLANGE returns the value */ /* DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANGE as described */ /* above. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. When M = 0, */ /* DLANGE is set to zero. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. When N = 0, */ /* DLANGE is set to zero. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(M,1). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; /* Function Body */ if (min(*m,*n) == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L30: */ } value = max(value,sum); /* L40: */ } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L50: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L60: */ } /* L70: */ } value = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L80: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(m, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L90: */ } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANGE */ } /* _starpu_dlange_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlangt.c000066400000000000000000000125101413463044200206160ustar00rootroot00000000000000/* dlangt.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlangt_(char *norm, integer *n, doublereal *dl, doublereal *d__, doublereal *du) { /* System generated locals */ integer i__1; doublereal ret_val, d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal sum, scale; extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANGT returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real tridiagonal matrix A. */ /* Description */ /* =========== */ /* DLANGT returns the value */ /* DLANGT = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANGT as described */ /* above. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANGT is */ /* set to zero. */ /* DL (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) sub-diagonal elements of A. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of A. */ /* DU (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) super-diagonal elements of A. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --du; --d__; --dl; /* Function Body */ if (*n <= 0) { anorm = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ anorm = (d__1 = d__[*n], abs(d__1)); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = dl[i__], abs(d__1)); anorm = max(d__2,d__3); /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = d__[i__], abs(d__1)); anorm = max(d__2,d__3); /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = du[i__], abs(d__1)); anorm = max(d__2,d__3); /* L10: */ } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ if (*n == 1) { anorm = abs(d__[1]); } else { /* Computing MAX */ d__3 = abs(d__[1]) + abs(dl[1]), d__4 = (d__1 = d__[*n], abs(d__1) ) + (d__2 = du[*n - 1], abs(d__2)); anorm = max(d__3,d__4); i__1 = *n - 1; for (i__ = 2; i__ <= i__1; ++i__) { /* Computing MAX */ d__4 = anorm, d__5 = (d__1 = d__[i__], abs(d__1)) + (d__2 = dl[i__], abs(d__2)) + (d__3 = du[i__ - 1], abs(d__3)); anorm = max(d__4,d__5); /* L20: */ } } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ if (*n == 1) { anorm = abs(d__[1]); } else { /* Computing MAX */ d__3 = abs(d__[1]) + abs(du[1]), d__4 = (d__1 = d__[*n], abs(d__1) ) + (d__2 = dl[*n - 1], abs(d__2)); anorm = max(d__3,d__4); i__1 = *n - 1; for (i__ = 2; i__ <= i__1; ++i__) { /* Computing MAX */ d__4 = anorm, d__5 = (d__1 = d__[i__], abs(d__1)) + (d__2 = du[i__], abs(d__2)) + (d__3 = dl[i__ - 1], abs(d__3)); anorm = max(d__4,d__5); /* L30: */ } } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; _starpu_dlassq_(n, &d__[1], &c__1, &scale, &sum); if (*n > 1) { i__1 = *n - 1; _starpu_dlassq_(&i__1, &dl[1], &c__1, &scale, &sum); i__1 = *n - 1; _starpu_dlassq_(&i__1, &du[1], &c__1, &scale, &sum); } anorm = scale * sqrt(sum); } ret_val = anorm; return ret_val; /* End of DLANGT */ } /* _starpu_dlangt_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlanhs.c000066400000000000000000000124231413463044200206210ustar00rootroot00000000000000/* dlanhs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlanhs_(char *norm, integer *n, doublereal *a, integer *lda, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal sum, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANHS returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* Hessenberg matrix A. */ /* Description */ /* =========== */ /* DLANHS returns the value */ /* DLANHS = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANHS as described */ /* above. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANHS is */ /* set to zero. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The n by n upper Hessenberg matrix A; the part of A below the */ /* first sub-diagonal is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(N,1). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *n, i__4 = j + 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; /* Computing MIN */ i__3 = *n, i__4 = j + 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L30: */ } value = max(value,sum); /* L40: */ } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L50: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *n, i__4 = j + 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L60: */ } /* L70: */ } value = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L80: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *n, i__4 = j + 1; i__2 = min(i__3,i__4); _starpu_dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L90: */ } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANHS */ } /* _starpu_dlanhs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlansb.c000066400000000000000000000161601413463044200206150ustar00rootroot00000000000000/* dlansb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlansb_(char *norm, char *uplo, integer *n, integer *k, doublereal *ab, integer *ldab, doublereal *work) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, l; doublereal sum, absa, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANSB returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of an */ /* n by n symmetric band matrix A, with k super-diagonals. */ /* Description */ /* =========== */ /* DLANSB returns the value */ /* DLANSB = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANSB as described */ /* above. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* band matrix A is supplied. */ /* = 'U': Upper triangular part is supplied */ /* = 'L': Lower triangular part is supplied */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANSB is */ /* set to zero. */ /* K (input) INTEGER */ /* The number of super-diagonals or sub-diagonals of the */ /* band matrix A. K >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangle of the symmetric band matrix A, */ /* stored in the first K+1 rows of AB. The j-th column of A is */ /* stored in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(k+1+i-j,j) = A(i,j) for max(1,j-k)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+k). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= K+1. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ /* WORK is not referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --work; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = *k + 2 - j; i__3 = *k + 1; for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs( d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = *n + 1 - j, i__4 = *k + 1; i__3 = min(i__2,i__4); for (i__ = 1; i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs( d__1)); value = max(d__2,d__3); /* L30: */ } /* L40: */ } } } else if (_starpu_lsame_(norm, "I") || _starpu_lsame_(norm, "O") || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is symmetric). */ value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; l = *k + 1 - j; /* Computing MAX */ i__3 = 1, i__2 = j - *k; i__4 = j - 1; for (i__ = max(i__3,i__2); i__ <= i__4; ++i__) { absa = (d__1 = ab[l + i__ + j * ab_dim1], abs(d__1)); sum += absa; work[i__] += absa; /* L50: */ } work[j] = sum + (d__1 = ab[*k + 1 + j * ab_dim1], abs(d__1)); /* L60: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L70: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = work[j] + (d__1 = ab[j * ab_dim1 + 1], abs(d__1)); l = 1 - j; /* Computing MIN */ i__3 = *n, i__2 = j + *k; i__4 = min(i__3,i__2); for (i__ = j + 1; i__ <= i__4; ++i__) { absa = (d__1 = ab[l + i__ + j * ab_dim1], abs(d__1)); sum += absa; work[i__] += absa; /* L90: */ } value = max(value,sum); /* L100: */ } } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; if (*k > 0) { if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing MIN */ i__3 = j - 1; i__4 = min(i__3,*k); /* Computing MAX */ i__2 = *k + 2 - j; _starpu_dlassq_(&i__4, &ab[max(i__2, 1)+ j * ab_dim1], &c__1, & scale, &sum); /* L110: */ } l = *k + 1; } else { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *n - j; i__4 = min(i__3,*k); _starpu_dlassq_(&i__4, &ab[j * ab_dim1 + 2], &c__1, &scale, &sum); /* L120: */ } l = 1; } sum *= 2; } else { l = 1; } _starpu_dlassq_(n, &ab[l + ab_dim1], ldab, &scale, &sum); value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANSB */ } /* _starpu_dlansb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlansf.c000066400000000000000000000676041413463044200206320ustar00rootroot00000000000000/* dlansf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlansf_(char *norm, char *transr, char *uplo, integer *n, doublereal *a, doublereal *work) { /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k, l; doublereal s; integer n1; doublereal aa; integer lda, ifm, noe, ilu; doublereal scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANSF returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real symmetric matrix A in RFP format. */ /* Description */ /* =========== */ /* DLANSF returns the value */ /* DLANSF = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER */ /* Specifies the value to be returned in DLANSF as described */ /* above. */ /* TRANSR (input) CHARACTER */ /* Specifies whether the RFP format of A is normal or */ /* transposed format. */ /* = 'N': RFP format is Normal; */ /* = 'T': RFP format is Transpose. */ /* UPLO (input) CHARACTER */ /* On entry, UPLO specifies whether the RFP matrix A came from */ /* an upper or lower triangular matrix as follows: */ /* = 'U': RFP A came from an upper triangular matrix; */ /* = 'L': RFP A came from a lower triangular matrix. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANSF is */ /* set to zero. */ /* A (input) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ); */ /* On entry, the upper (if UPLO = 'U') or lower (if UPLO = 'L') */ /* part of the symmetric matrix A stored in RFP format. See the */ /* "Notes" below for more details. */ /* Unchanged on exit. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ /* WORK is not referenced. */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* Reference */ /* ========= */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ if (*n == 0) { ret_val = 0.; return ret_val; } /* set noe = 1 if n is odd. if n is even set noe=0 */ noe = 1; if (*n % 2 == 0) { noe = 0; } /* set ifm = 0 when form='T or 't' and 1 otherwise */ ifm = 1; if (_starpu_lsame_(transr, "T")) { ifm = 0; } /* set ilu = 0 when uplo='U or 'u' and 1 otherwise */ ilu = 1; if (_starpu_lsame_(uplo, "U")) { ilu = 0; } /* set lda = (n+1)/2 when ifm = 0 */ /* set lda = n when ifm = 1 and noe = 1 */ /* set lda = n+1 when ifm = 1 and noe = 0 */ if (ifm == 1) { if (noe == 1) { lda = *n; } else { /* noe=0 */ lda = *n + 1; } } else { /* ifm=0 */ lda = (*n + 1) / 2; } if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ k = (*n + 1) / 2; value = 0.; if (noe == 1) { /* n is odd */ if (ifm == 1) { /* A is n by k */ i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = 0; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * lda], abs( d__1)); value = max(d__2,d__3); } } } else { /* xpose case; A is k by n */ i__1 = *n - 1; for (j = 0; j <= i__1; ++j) { i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * lda], abs( d__1)); value = max(d__2,d__3); } } } } else { /* n is even */ if (ifm == 1) { /* A is n+1 by k */ i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = *n; for (i__ = 0; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * lda], abs( d__1)); value = max(d__2,d__3); } } } else { /* xpose case; A is k by n+1 */ i__1 = *n; for (j = 0; j <= i__1; ++j) { i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * lda], abs( d__1)); value = max(d__2,d__3); } } } } } else if (_starpu_lsame_(norm, "I") || _starpu_lsame_(norm, "O") || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is symmetric). */ if (ifm == 1) { k = *n / 2; if (noe == 1) { /* n is odd */ if (ilu == 0) { i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { work[i__] = 0.; } i__1 = k; for (j = 0; j <= i__1; ++j) { s = 0.; i__2 = k + j - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(i,j+k) */ s += aa; work[i__] += aa; } aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j+k,j+k) */ work[j + k] = s + aa; if (i__ == k + k) { goto L10; } ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j,j) */ work[j] += aa; s = 0.; i__2 = k - 1; for (l = j + 1; l <= i__2; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(l,j) */ s += aa; work[l] += aa; } work[j] += s; } L10: i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } else { /* ilu = 1 */ ++k; /* k=(n+1)/2 for n odd and ilu=1 */ i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { work[i__] = 0.; } for (j = k - 1; j >= 0; --j) { s = 0.; i__1 = j - 2; for (i__ = 0; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j+k,i+k) */ s += aa; work[i__ + k] += aa; } if (j > 0) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j+k,j+k) */ s += aa; work[i__ + k] += s; /* i=j */ ++i__; } aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j,j) */ work[j] = aa; s = 0.; i__1 = *n - 1; for (l = j + 1; l <= i__1; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(l,j) */ s += aa; work[l] += aa; } work[j] += s; } i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } } else { /* n is even */ if (ilu == 0) { i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { work[i__] = 0.; } i__1 = k - 1; for (j = 0; j <= i__1; ++j) { s = 0.; i__2 = k + j - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(i,j+k) */ s += aa; work[i__] += aa; } aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j+k,j+k) */ work[j + k] = s + aa; ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j,j) */ work[j] += aa; s = 0.; i__2 = k - 1; for (l = j + 1; l <= i__2; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(l,j) */ s += aa; work[l] += aa; } work[j] += s; } i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } else { /* ilu = 1 */ i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { work[i__] = 0.; } for (j = k - 1; j >= 0; --j) { s = 0.; i__1 = j - 1; for (i__ = 0; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j+k,i+k) */ s += aa; work[i__ + k] += aa; } aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j+k,j+k) */ s += aa; work[i__ + k] += s; /* i=j */ ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(j,j) */ work[j] = aa; s = 0.; i__1 = *n - 1; for (l = j + 1; l <= i__1; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* -> A(l,j) */ s += aa; work[l] += aa; } work[j] += s; } i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } } } else { /* ifm=0 */ k = *n / 2; if (noe == 1) { /* n is odd */ if (ilu == 0) { n1 = k; /* n/2 */ ++k; /* k is the row size and lda */ i__1 = *n - 1; for (i__ = n1; i__ <= i__1; ++i__) { work[i__] = 0.; } i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { s = 0.; i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,n1+i) */ work[i__ + n1] += aa; s += aa; } work[j] = s; } /* j=n1=k-1 is special */ s = (d__1 = a[j * lda], abs(d__1)); /* A(k-1,k-1) */ i__1 = k - 1; for (i__ = 1; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k-1,i+n1) */ work[i__ + n1] += aa; s += aa; } work[j] += s; i__1 = *n - 1; for (j = k; j <= i__1; ++j) { s = 0.; i__2 = j - k - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(i,j-k) */ work[i__] += aa; s += aa; } /* i=j-k */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j-k,j-k) */ s += aa; work[j - k] += s; ++i__; s = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,j) */ i__2 = *n - 1; for (l = j + 1; l <= i__2; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,l) */ work[l] += aa; s += aa; } work[j] += s; } i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } else { /* ilu=1 */ ++k; /* k=(n+1)/2 for n odd and ilu=1 */ i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { work[i__] = 0.; } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { /* process */ s = 0.; i__2 = j - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,i) */ work[i__] += aa; s += aa; } aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* i=j so process of A(j,j) */ s += aa; work[j] = s; /* is initialised here */ ++i__; /* i=j process A(j+k,j+k) */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); s = aa; i__2 = *n - 1; for (l = k + j + 1; l <= i__2; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(l,k+j) */ s += aa; work[l] += aa; } work[k + j] += s; } /* j=k-1 is special :process col A(k-1,0:k-1) */ s = 0.; i__1 = k - 2; for (i__ = 0; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k,i) */ work[i__] += aa; s += aa; } /* i=k-1 */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k-1,k-1) */ s += aa; work[i__] = s; /* done with col j=k+1 */ i__1 = *n - 1; for (j = k; j <= i__1; ++j) { /* process col j of A = A(j,0:k-1) */ s = 0.; i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,i) */ work[i__] += aa; s += aa; } work[j] += s; } i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } } else { /* n is even */ if (ilu == 0) { i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { work[i__] = 0.; } i__1 = k - 1; for (j = 0; j <= i__1; ++j) { s = 0.; i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,i+k) */ work[i__ + k] += aa; s += aa; } work[j] = s; } /* j=k */ aa = (d__1 = a[j * lda], abs(d__1)); /* A(k,k) */ s = aa; i__1 = k - 1; for (i__ = 1; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k,k+i) */ work[i__ + k] += aa; s += aa; } work[j] += s; i__1 = *n - 1; for (j = k + 1; j <= i__1; ++j) { s = 0.; i__2 = j - 2 - k; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(i,j-k-1) */ work[i__] += aa; s += aa; } /* i=j-1-k */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j-k-1,j-k-1) */ s += aa; work[j - k - 1] += s; ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,j) */ s = aa; i__2 = *n - 1; for (l = j + 1; l <= i__2; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j,l) */ work[l] += aa; s += aa; } work[j] += s; } /* j=n */ s = 0.; i__1 = k - 2; for (i__ = 0; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(i,k-1) */ work[i__] += aa; s += aa; } /* i=k-1 */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k-1,k-1) */ s += aa; work[i__] += s; i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } else { /* ilu=1 */ i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { work[i__] = 0.; } /* j=0 is special :process col A(k:n-1,k) */ s = abs(a[0]); /* A(k,k) */ i__1 = k - 1; for (i__ = 1; i__ <= i__1; ++i__) { aa = (d__1 = a[i__], abs(d__1)); /* A(k+i,k) */ work[i__ + k] += aa; s += aa; } work[k] += s; i__1 = k - 1; for (j = 1; j <= i__1; ++j) { /* process */ s = 0.; i__2 = j - 2; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j-1,i) */ work[i__] += aa; s += aa; } aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* i=j-1 so process of A(j-1,j-1) */ s += aa; work[j - 1] = s; /* is initialised here */ ++i__; /* i=j process A(j+k,j+k) */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); s = aa; i__2 = *n - 1; for (l = k + j + 1; l <= i__2; ++l) { ++i__; aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(l,k+j) */ s += aa; work[l] += aa; } work[k + j] += s; } /* j=k is special :process col A(k,0:k-1) */ s = 0.; i__1 = k - 2; for (i__ = 0; i__ <= i__1; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k,i) */ work[i__] += aa; s += aa; } /* i=k-1 */ aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(k-1,k-1) */ s += aa; work[i__] = s; /* done with col j=k+1 */ i__1 = *n; for (j = k + 1; j <= i__1; ++j) { /* process col j-1 of A = A(j-1,0:k-1) */ s = 0.; i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { aa = (d__1 = a[i__ + j * lda], abs(d__1)); /* A(j-1,i) */ work[i__] += aa; s += aa; } work[j - 1] += s; } i__ = _starpu_idamax_(n, work, &c__1); value = work[i__ - 1]; } } } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ k = (*n + 1) / 2; scale = 0.; s = 1.; if (noe == 1) { /* n is odd */ if (ifm == 1) { /* A is normal */ if (ilu == 0) { /* A is upper */ i__1 = k - 3; for (j = 0; j <= i__1; ++j) { i__2 = k - j - 2; _starpu_dlassq_(&i__2, &a[k + j + 1 + j * lda], &c__1, &scale, &s); /* L at A(k,0) */ } i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = k + j - 1; _starpu_dlassq_(&i__2, &a[j * lda], &c__1, &scale, &s); /* trap U at A(0,0) */ } s += s; /* double s for the off diagonal elements */ i__1 = k - 1; i__2 = lda + 1; _starpu_dlassq_(&i__1, &a[k], &i__2, &scale, &s); /* tri L at A(k,0) */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[k - 1], &i__1, &scale, &s); /* tri U at A(k-1,0) */ } else { /* ilu=1 & A is lower */ i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = *n - j - 1; _starpu_dlassq_(&i__2, &a[j + 1 + j * lda], &c__1, &scale, &s) ; /* trap L at A(0,0) */ } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { _starpu_dlassq_(&j, &a[(j + 1) * lda], &c__1, &scale, &s); /* U at A(0,1) */ } s += s; /* double s for the off diagonal elements */ i__1 = lda + 1; _starpu_dlassq_(&k, a, &i__1, &scale, &s); /* tri L at A(0,0) */ i__1 = k - 1; i__2 = lda + 1; _starpu_dlassq_(&i__1, &a[lda], &i__2, &scale, &s); /* tri U at A(0,1) */ } } else { /* A is xpose */ if (ilu == 0) { /* A' is upper */ i__1 = k - 2; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(&j, &a[(k + j) * lda], &c__1, &scale, &s); /* U at A(0,k) */ } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { _starpu_dlassq_(&k, &a[j * lda], &c__1, &scale, &s); /* k by k-1 rect. at A(0,0) */ } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = k - j - 1; _starpu_dlassq_(&i__2, &a[j + 1 + (j + k - 1) * lda], &c__1, & scale, &s); /* L at A(0,k-1) */ } s += s; /* double s for the off diagonal elements */ i__1 = k - 1; i__2 = lda + 1; _starpu_dlassq_(&i__1, &a[k * lda], &i__2, &scale, &s); /* tri U at A(0,k) */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[(k - 1) * lda], &i__1, &scale, &s); /* tri L at A(0,k-1) */ } else { /* A' is lower */ i__1 = k - 1; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(&j, &a[j * lda], &c__1, &scale, &s); /* U at A(0,0) */ } i__1 = *n - 1; for (j = k; j <= i__1; ++j) { _starpu_dlassq_(&k, &a[j * lda], &c__1, &scale, &s); /* k by k-1 rect. at A(0,k) */ } i__1 = k - 3; for (j = 0; j <= i__1; ++j) { i__2 = k - j - 2; _starpu_dlassq_(&i__2, &a[j + 2 + j * lda], &c__1, &scale, &s) ; /* L at A(1,0) */ } s += s; /* double s for the off diagonal elements */ i__1 = lda + 1; _starpu_dlassq_(&k, a, &i__1, &scale, &s); /* tri U at A(0,0) */ i__1 = k - 1; i__2 = lda + 1; _starpu_dlassq_(&i__1, &a[1], &i__2, &scale, &s); /* tri L at A(1,0) */ } } } else { /* n is even */ if (ifm == 1) { /* A is normal */ if (ilu == 0) { /* A is upper */ i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = k - j - 1; _starpu_dlassq_(&i__2, &a[k + j + 2 + j * lda], &c__1, &scale, &s); /* L at A(k+1,0) */ } i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = k + j; _starpu_dlassq_(&i__2, &a[j * lda], &c__1, &scale, &s); /* trap U at A(0,0) */ } s += s; /* double s for the off diagonal elements */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[k + 1], &i__1, &scale, &s); /* tri L at A(k+1,0) */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[k], &i__1, &scale, &s); /* tri U at A(k,0) */ } else { /* ilu=1 & A is lower */ i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = *n - j - 1; _starpu_dlassq_(&i__2, &a[j + 2 + j * lda], &c__1, &scale, &s) ; /* trap L at A(1,0) */ } i__1 = k - 1; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(&j, &a[j * lda], &c__1, &scale, &s); /* U at A(0,0) */ } s += s; /* double s for the off diagonal elements */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[1], &i__1, &scale, &s); /* tri L at A(1,0) */ i__1 = lda + 1; _starpu_dlassq_(&k, a, &i__1, &scale, &s); /* tri U at A(0,0) */ } } else { /* A is xpose */ if (ilu == 0) { /* A' is upper */ i__1 = k - 1; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(&j, &a[(k + 1 + j) * lda], &c__1, &scale, &s); /* U at A(0,k+1) */ } i__1 = k - 1; for (j = 0; j <= i__1; ++j) { _starpu_dlassq_(&k, &a[j * lda], &c__1, &scale, &s); /* k by k rect. at A(0,0) */ } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = k - j - 1; _starpu_dlassq_(&i__2, &a[j + 1 + (j + k) * lda], &c__1, & scale, &s); /* L at A(0,k) */ } s += s; /* double s for the off diagonal elements */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[(k + 1) * lda], &i__1, &scale, &s); /* tri U at A(0,k+1) */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[k * lda], &i__1, &scale, &s); /* tri L at A(0,k) */ } else { /* A' is lower */ i__1 = k - 1; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(&j, &a[(j + 1) * lda], &c__1, &scale, &s); /* U at A(0,1) */ } i__1 = *n; for (j = k + 1; j <= i__1; ++j) { _starpu_dlassq_(&k, &a[j * lda], &c__1, &scale, &s); /* k by k rect. at A(0,k+1) */ } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = k - j - 1; _starpu_dlassq_(&i__2, &a[j + 1 + j * lda], &c__1, &scale, &s) ; /* L at A(0,0) */ } s += s; /* double s for the off diagonal elements */ i__1 = lda + 1; _starpu_dlassq_(&k, &a[lda], &i__1, &scale, &s); /* tri L at A(0,1) */ i__1 = lda + 1; _starpu_dlassq_(&k, a, &i__1, &scale, &s); /* tri U at A(0,0) */ } } } value = scale * sqrt(s); } ret_val = value; return ret_val; /* End of DLANSF */ } /* _starpu_dlansf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlansp.c000066400000000000000000000152371413463044200206370ustar00rootroot00000000000000/* dlansp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlansp_(char *norm, char *uplo, integer *n, doublereal *ap, doublereal *work) { /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal sum, absa, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANSP returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real symmetric matrix A, supplied in packed form. */ /* Description */ /* =========== */ /* DLANSP returns the value */ /* DLANSP = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANSP as described */ /* above. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is supplied. */ /* = 'U': Upper triangular part of A is supplied */ /* = 'L': Lower triangular part of A is supplied */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANSP is */ /* set to zero. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangle of the symmetric matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ /* WORK is not referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --work; --ap; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; if (_starpu_lsame_(uplo, "U")) { k = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = k + j - 1; for (i__ = k; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ap[i__], abs(d__1)); value = max(d__2,d__3); /* L10: */ } k += j; /* L20: */ } } else { k = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = k + *n - j; for (i__ = k; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ap[i__], abs(d__1)); value = max(d__2,d__3); /* L30: */ } k = k + *n - j + 1; /* L40: */ } } } else if (_starpu_lsame_(norm, "I") || _starpu_lsame_(norm, "O") || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is symmetric). */ value = 0.; k = 1; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { absa = (d__1 = ap[k], abs(d__1)); sum += absa; work[i__] += absa; ++k; /* L50: */ } work[j] = sum + (d__1 = ap[k], abs(d__1)); ++k; /* L60: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L70: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = work[j] + (d__1 = ap[k], abs(d__1)); ++k; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { absa = (d__1 = ap[k], abs(d__1)); sum += absa; work[i__] += absa; ++k; /* L90: */ } value = max(value,sum); /* L100: */ } } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; k = 2; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 2; j <= i__1; ++j) { i__2 = j - 1; _starpu_dlassq_(&i__2, &ap[k], &c__1, &scale, &sum); k += j; /* L110: */ } } else { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; _starpu_dlassq_(&i__2, &ap[k], &c__1, &scale, &sum); k = k + *n - j + 1; /* L120: */ } } sum *= 2; k = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ap[k] != 0.) { absa = (d__1 = ap[k], abs(d__1)); if (scale < absa) { /* Computing 2nd power */ d__1 = scale / absa; sum = sum * (d__1 * d__1) + 1.; scale = absa; } else { /* Computing 2nd power */ d__1 = absa / scale; sum += d__1 * d__1; } } if (_starpu_lsame_(uplo, "U")) { k = k + i__ + 1; } else { k = k + *n - i__ + 1; } /* L130: */ } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANSP */ } /* _starpu_dlansp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlanst.c000066400000000000000000000110451413463044200206340ustar00rootroot00000000000000/* dlanst.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e) { /* System generated locals */ integer i__1; doublereal ret_val, d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal sum, scale; extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANST returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real symmetric tridiagonal matrix A. */ /* Description */ /* =========== */ /* DLANST returns the value */ /* DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANST as described */ /* above. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANST is */ /* set to zero. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of A. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) sub-diagonal or super-diagonal elements of A. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --e; --d__; /* Function Body */ if (*n <= 0) { anorm = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ anorm = (d__1 = d__[*n], abs(d__1)); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = d__[i__], abs(d__1)); anorm = max(d__2,d__3); /* Computing MAX */ d__2 = anorm, d__3 = (d__1 = e[i__], abs(d__1)); anorm = max(d__2,d__3); /* L10: */ } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1' || _starpu_lsame_(norm, "I")) { /* Find norm1(A). */ if (*n == 1) { anorm = abs(d__[1]); } else { /* Computing MAX */ d__3 = abs(d__[1]) + abs(e[1]), d__4 = (d__1 = e[*n - 1], abs( d__1)) + (d__2 = d__[*n], abs(d__2)); anorm = max(d__3,d__4); i__1 = *n - 1; for (i__ = 2; i__ <= i__1; ++i__) { /* Computing MAX */ d__4 = anorm, d__5 = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[ i__], abs(d__2)) + (d__3 = e[i__ - 1], abs(d__3)); anorm = max(d__4,d__5); /* L20: */ } } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; if (*n > 1) { i__1 = *n - 1; _starpu_dlassq_(&i__1, &e[1], &c__1, &scale, &sum); sum *= 2; } _starpu_dlassq_(n, &d__[1], &c__1, &scale, &sum); anorm = scale * sqrt(sum); } ret_val = anorm; return ret_val; /* End of DLANST */ } /* _starpu_dlanst_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlansy.c000066400000000000000000000150461413463044200206460ustar00rootroot00000000000000/* dlansy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal sum, absa, scale; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANSY returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* real symmetric matrix A. */ /* Description */ /* =========== */ /* DLANSY returns the value */ /* DLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANSY as described */ /* above. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is to be referenced. */ /* = 'U': Upper triangular part of A is referenced */ /* = 'L': Lower triangular part of A is referenced */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANSY is */ /* set to zero. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading n by n */ /* upper triangular part of A contains the upper triangular part */ /* of the matrix A, and the strictly lower triangular part of A */ /* is not referenced. If UPLO = 'L', the leading n by n lower */ /* triangular part of A contains the lower triangular part of */ /* the matrix A, and the strictly upper triangular part of A is */ /* not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(N,1). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ /* WORK is not referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs( d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs( d__1)); value = max(d__2,d__3); /* L30: */ } /* L40: */ } } } else if (_starpu_lsame_(norm, "I") || _starpu_lsame_(norm, "O") || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is symmetric). */ value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = 0.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); sum += absa; work[i__] += absa; /* L50: */ } work[j] = sum + (d__1 = a[j + j * a_dim1], abs(d__1)); /* L60: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L70: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = work[j] + (d__1 = a[j + j * a_dim1], abs(d__1)); i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); sum += absa; work[i__] += absa; /* L90: */ } value = max(value,sum); /* L100: */ } } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ scale = 0.; sum = 1.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 2; j <= i__1; ++j) { i__2 = j - 1; _starpu_dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L110: */ } } else { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; _starpu_dlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); /* L120: */ } } sum *= 2; i__1 = *lda + 1; _starpu_dlassq_(n, &a[a_offset], &i__1, &scale, &sum); value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANSY */ } /* _starpu_dlansy_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlantb.c000066400000000000000000000254331413463044200206210ustar00rootroot00000000000000/* dlantb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, doublereal *ab, integer *ldab, doublereal *work) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, l; doublereal sum, scale; logical udiag; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANTB returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of an */ /* n by n triangular band matrix A, with ( k + 1 ) diagonals. */ /* Description */ /* =========== */ /* DLANTB returns the value */ /* DLANTB = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANTB as described */ /* above. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A is unit triangular. */ /* = 'N': Non-unit triangular */ /* = 'U': Unit triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANTB is */ /* set to zero. */ /* K (input) INTEGER */ /* The number of super-diagonals of the matrix A if UPLO = 'U', */ /* or the number of sub-diagonals of the matrix A if UPLO = 'L'. */ /* K >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangular band matrix A, stored in the */ /* first k+1 rows of AB. The j-th column of A is stored */ /* in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(k+1+i-j,j) = A(i,j) for max(1,j-k)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+k). */ /* Note that when DIAG = 'U', the elements of the array AB */ /* corresponding to the diagonal elements of the matrix A are */ /* not referenced, but are assumed to be one. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= K+1. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --work; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ if (_starpu_lsame_(diag, "U")) { value = 1.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = *k + 2 - j; i__3 = *k; for (i__ = max(i__2,1); i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = *n + 1 - j, i__4 = *k + 1; i__3 = min(i__2,i__4); for (i__ = 2; i__ <= i__3; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); value = max(d__2,d__3); /* L30: */ } /* L40: */ } } } else { value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__3 = *k + 2 - j; i__2 = *k + 1; for (i__ = max(i__3,1); i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); value = max(d__2,d__3); /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *n + 1 - j, i__4 = *k + 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); value = max(d__2,d__3); /* L70: */ } /* L80: */ } } } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; udiag = _starpu_lsame_(diag, "U"); if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (udiag) { sum = 1.; /* Computing MAX */ i__2 = *k + 2 - j; i__3 = *k; for (i__ = max(i__2,1); i__ <= i__3; ++i__) { sum += (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); /* L90: */ } } else { sum = 0.; /* Computing MAX */ i__3 = *k + 2 - j; i__2 = *k + 1; for (i__ = max(i__3,1); i__ <= i__2; ++i__) { sum += (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); /* L100: */ } } value = max(value,sum); /* L110: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (udiag) { sum = 1.; /* Computing MIN */ i__3 = *n + 1 - j, i__4 = *k + 1; i__2 = min(i__3,i__4); for (i__ = 2; i__ <= i__2; ++i__) { sum += (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); /* L120: */ } } else { sum = 0.; /* Computing MIN */ i__3 = *n + 1 - j, i__4 = *k + 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = ab[i__ + j * ab_dim1], abs(d__1)); /* L130: */ } } value = max(value,sum); /* L140: */ } } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ value = 0.; if (_starpu_lsame_(uplo, "U")) { if (_starpu_lsame_(diag, "U")) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 1.; /* L150: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { l = *k + 1 - j; /* Computing MAX */ i__2 = 1, i__3 = j - *k; i__4 = j - 1; for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { work[i__] += (d__1 = ab[l + i__ + j * ab_dim1], abs( d__1)); /* L160: */ } /* L170: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L180: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { l = *k + 1 - j; /* Computing MAX */ i__4 = 1, i__2 = j - *k; i__3 = j; for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { work[i__] += (d__1 = ab[l + i__ + j * ab_dim1], abs( d__1)); /* L190: */ } /* L200: */ } } } else { if (_starpu_lsame_(diag, "U")) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 1.; /* L210: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { l = 1 - j; /* Computing MIN */ i__4 = *n, i__2 = j + *k; i__3 = min(i__4,i__2); for (i__ = j + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ab[l + i__ + j * ab_dim1], abs( d__1)); /* L220: */ } /* L230: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L240: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { l = 1 - j; /* Computing MIN */ i__4 = *n, i__2 = j + *k; i__3 = min(i__4,i__2); for (i__ = j; i__ <= i__3; ++i__) { work[i__] += (d__1 = ab[l + i__ + j * ab_dim1], abs( d__1)); /* L250: */ } /* L260: */ } } } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L270: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ if (_starpu_lsame_(uplo, "U")) { if (_starpu_lsame_(diag, "U")) { scale = 1.; sum = (doublereal) (*n); if (*k > 0) { i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing MIN */ i__4 = j - 1; i__3 = min(i__4,*k); /* Computing MAX */ i__2 = *k + 2 - j; _starpu_dlassq_(&i__3, &ab[max(i__2, 1)+ j * ab_dim1], &c__1, &scale, &sum); /* L280: */ } } } else { scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__4 = j, i__2 = *k + 1; i__3 = min(i__4,i__2); /* Computing MAX */ i__5 = *k + 2 - j; _starpu_dlassq_(&i__3, &ab[max(i__5, 1)+ j * ab_dim1], &c__1, & scale, &sum); /* L290: */ } } } else { if (_starpu_lsame_(diag, "U")) { scale = 1.; sum = (doublereal) (*n); if (*k > 0) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__4 = *n - j; i__3 = min(i__4,*k); _starpu_dlassq_(&i__3, &ab[j * ab_dim1 + 2], &c__1, &scale, & sum); /* L300: */ } } } else { scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__4 = *n - j + 1, i__2 = *k + 1; i__3 = min(i__4,i__2); _starpu_dlassq_(&i__3, &ab[j * ab_dim1 + 1], &c__1, &scale, &sum); /* L310: */ } } } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANTB */ } /* _starpu_dlantb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlantp.c000066400000000000000000000222511413463044200206320ustar00rootroot00000000000000/* dlantp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlantp_(char *norm, char *uplo, char *diag, integer *n, doublereal *ap, doublereal *work) { /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal sum, scale; logical udiag; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANTP returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* triangular matrix A, supplied in packed form. */ /* Description */ /* =========== */ /* DLANTP returns the value */ /* DLANTP = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANTP as described */ /* above. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A is unit triangular. */ /* = 'N': Non-unit triangular */ /* = 'U': Unit triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. When N = 0, DLANTP is */ /* set to zero. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangular matrix A, packed columnwise in */ /* a linear array. The j-th column of A is stored in the array */ /* AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* Note that when DIAG = 'U', the elements of the array AP */ /* corresponding to the diagonal elements of the matrix A are */ /* not referenced, but are assumed to be one. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --work; --ap; /* Function Body */ if (*n == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ k = 1; if (_starpu_lsame_(diag, "U")) { value = 1.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = k + j - 2; for (i__ = k; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ap[i__], abs(d__1)); value = max(d__2,d__3); /* L10: */ } k += j; /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = k + *n - j; for (i__ = k + 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ap[i__], abs(d__1)); value = max(d__2,d__3); /* L30: */ } k = k + *n - j + 1; /* L40: */ } } } else { value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = k + j - 1; for (i__ = k; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ap[i__], abs(d__1)); value = max(d__2,d__3); /* L50: */ } k += j; /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = k + *n - j; for (i__ = k; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = ap[i__], abs(d__1)); value = max(d__2,d__3); /* L70: */ } k = k + *n - j + 1; /* L80: */ } } } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; k = 1; udiag = _starpu_lsame_(diag, "U"); if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (udiag) { sum = 1.; i__2 = k + j - 2; for (i__ = k; i__ <= i__2; ++i__) { sum += (d__1 = ap[i__], abs(d__1)); /* L90: */ } } else { sum = 0.; i__2 = k + j - 1; for (i__ = k; i__ <= i__2; ++i__) { sum += (d__1 = ap[i__], abs(d__1)); /* L100: */ } } k += j; value = max(value,sum); /* L110: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (udiag) { sum = 1.; i__2 = k + *n - j; for (i__ = k + 1; i__ <= i__2; ++i__) { sum += (d__1 = ap[i__], abs(d__1)); /* L120: */ } } else { sum = 0.; i__2 = k + *n - j; for (i__ = k; i__ <= i__2; ++i__) { sum += (d__1 = ap[i__], abs(d__1)); /* L130: */ } } k = k + *n - j + 1; value = max(value,sum); /* L140: */ } } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ k = 1; if (_starpu_lsame_(uplo, "U")) { if (_starpu_lsame_(diag, "U")) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 1.; /* L150: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = ap[k], abs(d__1)); ++k; /* L160: */ } ++k; /* L170: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L180: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = ap[k], abs(d__1)); ++k; /* L190: */ } /* L200: */ } } } else { if (_starpu_lsame_(diag, "U")) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 1.; /* L210: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { ++k; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = ap[k], abs(d__1)); ++k; /* L220: */ } /* L230: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L240: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { work[i__] += (d__1 = ap[k], abs(d__1)); ++k; /* L250: */ } /* L260: */ } } } value = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L270: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ if (_starpu_lsame_(uplo, "U")) { if (_starpu_lsame_(diag, "U")) { scale = 1.; sum = (doublereal) (*n); k = 2; i__1 = *n; for (j = 2; j <= i__1; ++j) { i__2 = j - 1; _starpu_dlassq_(&i__2, &ap[k], &c__1, &scale, &sum); k += j; /* L280: */ } } else { scale = 0.; sum = 1.; k = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dlassq_(&j, &ap[k], &c__1, &scale, &sum); k += j; /* L290: */ } } } else { if (_starpu_lsame_(diag, "U")) { scale = 1.; sum = (doublereal) (*n); k = 2; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; _starpu_dlassq_(&i__2, &ap[k], &c__1, &scale, &sum); k = k + *n - j + 1; /* L300: */ } } else { scale = 0.; sum = 1.; k = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n - j + 1; _starpu_dlassq_(&i__2, &ap[k], &c__1, &scale, &sum); k = k + *n - j + 1; /* L310: */ } } } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANTP */ } /* _starpu_dlantp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlantr.c000066400000000000000000000240141413463044200206330ustar00rootroot00000000000000/* dlantr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; doublereal _starpu_dlantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, doublereal *a, integer *lda, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal sum, scale; logical udiag; extern logical _starpu_lsame_(char *, char *); doublereal value; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANTR returns the value of the one norm, or the Frobenius norm, or */ /* the infinity norm, or the element of largest absolute value of a */ /* trapezoidal or triangular matrix A. */ /* Description */ /* =========== */ /* DLANTR returns the value */ /* DLANTR = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ /* ( */ /* ( norm1(A), NORM = '1', 'O' or 'o' */ /* ( */ /* ( normI(A), NORM = 'I' or 'i' */ /* ( */ /* ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ /* where norm1 denotes the one norm of a matrix (maximum column sum), */ /* normI denotes the infinity norm of a matrix (maximum row sum) and */ /* normF denotes the Frobenius norm of a matrix (square root of sum of */ /* squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies the value to be returned in DLANTR as described */ /* above. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower trapezoidal. */ /* = 'U': Upper trapezoidal */ /* = 'L': Lower trapezoidal */ /* Note that A is triangular instead of trapezoidal if M = N. */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A has unit diagonal. */ /* = 'N': Non-unit diagonal */ /* = 'U': Unit diagonal */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0, and if */ /* UPLO = 'U', M <= N. When M = 0, DLANTR is set to zero. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0, and if */ /* UPLO = 'L', N <= M. When N = 0, DLANTR is set to zero. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The trapezoidal matrix A (A is triangular if M = N). */ /* If UPLO = 'U', the leading m by n upper trapezoidal part of */ /* the array A contains the upper trapezoidal matrix, and the */ /* strictly lower triangular part of A is not referenced. */ /* If UPLO = 'L', the leading m by n lower trapezoidal part of */ /* the array A contains the lower trapezoidal matrix, and the */ /* strictly upper triangular part of A is not referenced. Note */ /* that when DIAG = 'U', the diagonal elements of A are not */ /* referenced and are assumed to be one. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(M,1). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ /* where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ /* referenced. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; /* Function Body */ if (min(*m,*n) == 0) { value = 0.; } else if (_starpu_lsame_(norm, "M")) { /* Find max(abs(A(i,j))). */ if (_starpu_lsame_(diag, "U")) { value = 1.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *m, i__4 = j - 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs( d__1)); value = max(d__2,d__3); /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs( d__1)); value = max(d__2,d__3); /* L30: */ } /* L40: */ } } } else { value = 0.; if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(*m,j); for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs( d__1)); value = max(d__2,d__3); /* L50: */ } /* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = value, d__3 = (d__1 = a[i__ + j * a_dim1], abs( d__1)); value = max(d__2,d__3); /* L70: */ } /* L80: */ } } } } else if (_starpu_lsame_(norm, "O") || *(unsigned char *) norm == '1') { /* Find norm1(A). */ value = 0.; udiag = _starpu_lsame_(diag, "U"); if (_starpu_lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (udiag && j <= *m) { sum = 1.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L90: */ } } else { sum = 0.; i__2 = min(*m,j); for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L100: */ } } value = max(value,sum); /* L110: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (udiag) { sum = 1.; i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L120: */ } } else { sum = 0.; i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L130: */ } } value = max(value,sum); /* L140: */ } } } else if (_starpu_lsame_(norm, "I")) { /* Find normI(A). */ if (_starpu_lsame_(uplo, "U")) { if (_starpu_lsame_(diag, "U")) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 1.; /* L150: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = *m, i__4 = j - 1; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L160: */ } /* L170: */ } } else { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L180: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(*m,j); for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L190: */ } /* L200: */ } } } else { if (_starpu_lsame_(diag, "U")) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 1.; /* L210: */ } i__1 = *m; for (i__ = *n + 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L220: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L230: */ } /* L240: */ } } else { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L250: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L260: */ } /* L270: */ } } } value = 0.; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = value, d__2 = work[i__]; value = max(d__1,d__2); /* L280: */ } } else if (_starpu_lsame_(norm, "F") || _starpu_lsame_(norm, "E")) { /* Find normF(A). */ if (_starpu_lsame_(uplo, "U")) { if (_starpu_lsame_(diag, "U")) { scale = 1.; sum = (doublereal) min(*m,*n); i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing MIN */ i__3 = *m, i__4 = j - 1; i__2 = min(i__3,i__4); _starpu_dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L290: */ } } else { scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(*m,j); _starpu_dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L300: */ } } } else { if (_starpu_lsame_(diag, "U")) { scale = 1.; sum = (doublereal) min(*m,*n); i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m - j; /* Computing MIN */ i__3 = *m, i__4 = j + 1; _starpu_dlassq_(&i__2, &a[min(i__3, i__4)+ j * a_dim1], &c__1, & scale, &sum); /* L310: */ } } else { scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m - j + 1; _starpu_dlassq_(&i__2, &a[j + j * a_dim1], &c__1, &scale, &sum); /* L320: */ } } } value = scale * sqrt(sum); } ret_val = value; return ret_val; /* End of DLANTR */ } /* _starpu_dlantr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlanv2.c000066400000000000000000000141411413463044200205350ustar00rootroot00000000000000/* dlanv2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = 1.; /* Subroutine */ int _starpu_dlanv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *rt1r, doublereal *rt1i, doublereal *rt2r, doublereal *rt2i, doublereal *cs, doublereal *sn) { /* System generated locals */ doublereal d__1, d__2; /* Builtin functions */ double d_sign(doublereal *, doublereal *), sqrt(doublereal); /* Local variables */ doublereal p, z__, aa, bb, cc, dd, cs1, sn1, sab, sac, eps, tau, temp, scale, bcmax, bcmis, sigma; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric */ /* matrix in standard form: */ /* [ A B ] = [ CS -SN ] [ AA BB ] [ CS SN ] */ /* [ C D ] [ SN CS ] [ CC DD ] [-SN CS ] */ /* where either */ /* 1) CC = 0 so that AA and DD are real eigenvalues of the matrix, or */ /* 2) AA = DD and BB*CC < 0, so that AA + or - sqrt(BB*CC) are complex */ /* conjugate eigenvalues. */ /* Arguments */ /* ========= */ /* A (input/output) DOUBLE PRECISION */ /* B (input/output) DOUBLE PRECISION */ /* C (input/output) DOUBLE PRECISION */ /* D (input/output) DOUBLE PRECISION */ /* On entry, the elements of the input matrix. */ /* On exit, they are overwritten by the elements of the */ /* standardised Schur form. */ /* RT1R (output) DOUBLE PRECISION */ /* RT1I (output) DOUBLE PRECISION */ /* RT2R (output) DOUBLE PRECISION */ /* RT2I (output) DOUBLE PRECISION */ /* The real and imaginary parts of the eigenvalues. If the */ /* eigenvalues are a complex conjugate pair, RT1I > 0. */ /* CS (output) DOUBLE PRECISION */ /* SN (output) DOUBLE PRECISION */ /* Parameters of the rotation matrix. */ /* Further Details */ /* =============== */ /* Modified by V. Sima, Research Institute for Informatics, Bucharest, */ /* Romania, to reduce the risk of cancellation errors, */ /* when computing real eigenvalues, and to ensure, if possible, that */ /* abs(RT1R) >= abs(RT2R). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ eps = _starpu_dlamch_("P"); if (*c__ == 0.) { *cs = 1.; *sn = 0.; goto L10; } else if (*b == 0.) { /* Swap rows and columns */ *cs = 0.; *sn = 1.; temp = *d__; *d__ = *a; *a = temp; *b = -(*c__); *c__ = 0.; goto L10; } else if (*a - *d__ == 0. && d_sign(&c_b4, b) != d_sign(&c_b4, c__)) { *cs = 1.; *sn = 0.; goto L10; } else { temp = *a - *d__; p = temp * .5; /* Computing MAX */ d__1 = abs(*b), d__2 = abs(*c__); bcmax = max(d__1,d__2); /* Computing MIN */ d__1 = abs(*b), d__2 = abs(*c__); bcmis = min(d__1,d__2) * d_sign(&c_b4, b) * d_sign(&c_b4, c__); /* Computing MAX */ d__1 = abs(p); scale = max(d__1,bcmax); z__ = p / scale * p + bcmax / scale * bcmis; /* If Z is of the order of the machine accuracy, postpone the */ /* decision on the nature of eigenvalues */ if (z__ >= eps * 4.) { /* Real eigenvalues. Compute A and D. */ d__1 = sqrt(scale) * sqrt(z__); z__ = p + d_sign(&d__1, &p); *a = *d__ + z__; *d__ -= bcmax / z__ * bcmis; /* Compute B and the rotation matrix */ tau = _starpu_dlapy2_(c__, &z__); *cs = z__ / tau; *sn = *c__ / tau; *b -= *c__; *c__ = 0.; } else { /* Complex eigenvalues, or real (almost) equal eigenvalues. */ /* Make diagonal elements equal. */ sigma = *b + *c__; tau = _starpu_dlapy2_(&sigma, &temp); *cs = sqrt((abs(sigma) / tau + 1.) * .5); *sn = -(p / (tau * *cs)) * d_sign(&c_b4, &sigma); /* Compute [ AA BB ] = [ A B ] [ CS -SN ] */ /* [ CC DD ] [ C D ] [ SN CS ] */ aa = *a * *cs + *b * *sn; bb = -(*a) * *sn + *b * *cs; cc = *c__ * *cs + *d__ * *sn; dd = -(*c__) * *sn + *d__ * *cs; /* Compute [ A B ] = [ CS SN ] [ AA BB ] */ /* [ C D ] [-SN CS ] [ CC DD ] */ *a = aa * *cs + cc * *sn; *b = bb * *cs + dd * *sn; *c__ = -aa * *sn + cc * *cs; *d__ = -bb * *sn + dd * *cs; temp = (*a + *d__) * .5; *a = temp; *d__ = temp; if (*c__ != 0.) { if (*b != 0.) { if (d_sign(&c_b4, b) == d_sign(&c_b4, c__)) { /* Real eigenvalues: reduce to upper triangular form */ sab = sqrt((abs(*b))); sac = sqrt((abs(*c__))); d__1 = sab * sac; p = d_sign(&d__1, c__); tau = 1. / sqrt((d__1 = *b + *c__, abs(d__1))); *a = temp + p; *d__ = temp - p; *b -= *c__; *c__ = 0.; cs1 = sab * tau; sn1 = sac * tau; temp = *cs * cs1 - *sn * sn1; *sn = *cs * sn1 + *sn * cs1; *cs = temp; } } else { *b = -(*c__); *c__ = 0.; temp = *cs; *cs = -(*sn); *sn = temp; } } } } L10: /* Store eigenvalues in (RT1R,RT1I) and (RT2R,RT2I). */ *rt1r = *a; *rt2r = *d__; if (*c__ == 0.) { *rt1i = 0.; *rt2i = 0.; } else { *rt1i = sqrt((abs(*b))) * sqrt((abs(*c__))); *rt2i = -(*rt1i); } return 0; /* End of DLANV2 */ } /* _starpu_dlanv2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlapll.c000066400000000000000000000073131413463044200206220ustar00rootroot00000000000000/* dlapll.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlapll_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *ssmin) { /* System generated locals */ integer i__1; /* Local variables */ doublereal c__, a11, a12, a22, tau; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlas2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal ssmax; extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Given two column vectors X and Y, let */ /* A = ( X Y ). */ /* The subroutine first computes the QR factorization of A = Q*R, */ /* and then computes the SVD of the 2-by-2 upper triangular matrix R. */ /* The smaller singular value of R is returned in SSMIN, which is used */ /* as the measurement of the linear dependency of the vectors X and Y. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The length of the vectors X and Y. */ /* X (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCX) */ /* On entry, X contains the N-vector X. */ /* On exit, X is overwritten. */ /* INCX (input) INTEGER */ /* The increment between successive elements of X. INCX > 0. */ /* Y (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCY) */ /* On entry, Y contains the N-vector Y. */ /* On exit, Y is overwritten. */ /* INCY (input) INTEGER */ /* The increment between successive elements of Y. INCY > 0. */ /* SSMIN (output) DOUBLE PRECISION */ /* The smallest singular value of the N-by-2 matrix A = ( X Y ). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --y; --x; /* Function Body */ if (*n <= 1) { *ssmin = 0.; return 0; } /* Compute the QR factorization of the N-by-2 matrix ( X Y ) */ _starpu_dlarfg_(n, &x[1], &x[*incx + 1], incx, &tau); a11 = x[1]; x[1] = 1.; c__ = -tau * _starpu_ddot_(n, &x[1], incx, &y[1], incy); _starpu_daxpy_(n, &c__, &x[1], incx, &y[1], incy); i__1 = *n - 1; _starpu_dlarfg_(&i__1, &y[*incy + 1], &y[(*incy << 1) + 1], incy, &tau); a12 = y[1]; a22 = y[*incy + 1]; /* Compute the SVD of 2-by-2 Upper triangular matrix. */ _starpu_dlas2_(&a11, &a12, &a22, ssmin, &ssmax); return 0; /* End of DLAPLL */ } /* _starpu_dlapll_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlapmt.c000066400000000000000000000072531413463044200206360ustar00rootroot00000000000000/* dlapmt.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlapmt_(logical *forwrd, integer *m, integer *n, doublereal *x, integer *ldx, integer *k) { /* System generated locals */ integer x_dim1, x_offset, i__1, i__2; /* Local variables */ integer i__, j, ii, in; doublereal temp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAPMT rearranges the columns of the M by N matrix X as specified */ /* by the permutation K(1),K(2),...,K(N) of the integers 1,...,N. */ /* If FORWRD = .TRUE., forward permutation: */ /* X(*,K(J)) is moved X(*,J) for J = 1,2,...,N. */ /* If FORWRD = .FALSE., backward permutation: */ /* X(*,J) is moved to X(*,K(J)) for J = 1,2,...,N. */ /* Arguments */ /* ========= */ /* FORWRD (input) LOGICAL */ /* = .TRUE., forward permutation */ /* = .FALSE., backward permutation */ /* M (input) INTEGER */ /* The number of rows of the matrix X. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix X. N >= 0. */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,N) */ /* On entry, the M by N matrix X. */ /* On exit, X contains the permuted matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X, LDX >= MAX(1,M). */ /* K (input/output) INTEGER array, dimension (N) */ /* On entry, K contains the permutation vector. K is used as */ /* internal workspace, but reset to its original value on */ /* output. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --k; /* Function Body */ if (*n <= 1) { return 0; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { k[i__] = -k[i__]; /* L10: */ } if (*forwrd) { /* Forward permutation */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (k[i__] > 0) { goto L40; } j = i__; k[j] = -k[j]; in = k[j]; L20: if (k[in] > 0) { goto L40; } i__2 = *m; for (ii = 1; ii <= i__2; ++ii) { temp = x[ii + j * x_dim1]; x[ii + j * x_dim1] = x[ii + in * x_dim1]; x[ii + in * x_dim1] = temp; /* L30: */ } k[in] = -k[in]; j = in; in = k[in]; goto L20; L40: /* L50: */ ; } } else { /* Backward permutation */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (k[i__] > 0) { goto L80; } k[i__] = -k[i__]; j = k[i__]; L60: if (j == i__) { goto L80; } i__2 = *m; for (ii = 1; ii <= i__2; ++ii) { temp = x[ii + i__ * x_dim1]; x[ii + i__ * x_dim1] = x[ii + j * x_dim1]; x[ii + j * x_dim1] = temp; /* L70: */ } k[j] = -k[j]; j = k[j]; goto L60; L80: /* L90: */ ; } } return 0; /* End of DLAPMT */ } /* _starpu_dlapmt_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlapy2.c000066400000000000000000000033661413463044200205510ustar00rootroot00000000000000/* dlapy2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dlapy2_(doublereal *x, doublereal *y) { /* System generated locals */ doublereal ret_val, d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal w, z__, xabs, yabs; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary */ /* overflow. */ /* Arguments */ /* ========= */ /* X (input) DOUBLE PRECISION */ /* Y (input) DOUBLE PRECISION */ /* X and Y specify the values x and y. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ xabs = abs(*x); yabs = abs(*y); w = max(xabs,yabs); z__ = min(xabs,yabs); if (z__ == 0.) { ret_val = w; } else { /* Computing 2nd power */ d__1 = z__ / w; ret_val = w * sqrt(d__1 * d__1 + 1.); } return ret_val; /* End of DLAPY2 */ } /* _starpu_dlapy2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlapy3.c000066400000000000000000000041671413463044200205520ustar00rootroot00000000000000/* dlapy3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dlapy3_(doublereal *x, doublereal *y, doublereal *z__) { /* System generated locals */ doublereal ret_val, d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal w, xabs, yabs, zabs; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause */ /* unnecessary overflow. */ /* Arguments */ /* ========= */ /* X (input) DOUBLE PRECISION */ /* Y (input) DOUBLE PRECISION */ /* Z (input) DOUBLE PRECISION */ /* X, Y and Z specify the values x, y and z. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ xabs = abs(*x); yabs = abs(*y); zabs = abs(*z__); /* Computing MAX */ d__1 = max(xabs,yabs); w = max(d__1,zabs); if (w == 0.) { /* W can be zero for max(0,nan,0) */ /* adding all three entries together will make sure */ /* NaN will not disappear. */ ret_val = xabs + yabs + zabs; } else { /* Computing 2nd power */ d__1 = xabs / w; /* Computing 2nd power */ d__2 = yabs / w; /* Computing 2nd power */ d__3 = zabs / w; ret_val = w * sqrt(d__1 * d__1 + d__2 * d__2 + d__3 * d__3); } return ret_val; /* End of DLAPY3 */ } /* _starpu_dlapy3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqgb.c000066400000000000000000000142371413463044200206070ustar00rootroot00000000000000/* dlaqgb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaqgb_(integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6; /* Local variables */ integer i__, j; doublereal cj, large, small; extern doublereal _starpu_dlamch_(char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQGB equilibrates a general M by N band matrix A with KL */ /* subdiagonals and KU superdiagonals using the row and scaling factors */ /* in the vectors R and C. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* KL (input) INTEGER */ /* The number of subdiagonals within the band of A. KL >= 0. */ /* KU (input) INTEGER */ /* The number of superdiagonals within the band of A. KU >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ /* The j-th column of A is stored in the j-th column of the */ /* array AB as follows: */ /* AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl) */ /* On exit, the equilibrated matrix, in the same storage format */ /* as A. See EQUED for the form of the equilibrated matrix. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDA >= KL+KU+1. */ /* R (input) DOUBLE PRECISION array, dimension (M) */ /* The row scale factors for A. */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. */ /* ROWCND (input) DOUBLE PRECISION */ /* Ratio of the smallest R(i) to the largest R(i). */ /* COLCND (input) DOUBLE PRECISION */ /* Ratio of the smallest C(i) to the largest C(i). */ /* AMAX (input) DOUBLE PRECISION */ /* Absolute value of largest matrix entry. */ /* EQUED (output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* Internal Parameters */ /* =================== */ /* THRESH is a threshold value used to decide if row or column scaling */ /* should be done based on the ratio of the row or column scaling */ /* factors. If ROWCND < THRESH, row scaling is done, and if */ /* COLCND < THRESH, column scaling is done. */ /* LARGE and SMALL are threshold values used to decide if row scaling */ /* should be done based on the absolute size of the largest matrix */ /* element. If AMAX > LARGE or AMAX < SMALL, row scaling is done. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --r__; --c__; /* Function Body */ if (*m <= 0 || *n <= 0) { *(unsigned char *)equed = 'N'; return 0; } /* Initialize LARGE and SMALL. */ small = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); large = 1. / small; if (*rowcnd >= .1 && *amax >= small && *amax <= large) { /* No row scaling */ if (*colcnd >= .1) { /* No column scaling */ *(unsigned char *)equed = 'N'; } else { /* Column scaling */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = c__[j]; /* Computing MAX */ i__2 = 1, i__3 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__4 = min(i__5,i__6); for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { ab[*ku + 1 + i__ - j + j * ab_dim1] = cj * ab[*ku + 1 + i__ - j + j * ab_dim1]; /* L10: */ } /* L20: */ } *(unsigned char *)equed = 'C'; } } else if (*colcnd >= .1) { /* Row scaling, no column scaling */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__4 = 1, i__2 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__3 = min(i__5,i__6); for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) { ab[*ku + 1 + i__ - j + j * ab_dim1] = r__[i__] * ab[*ku + 1 + i__ - j + j * ab_dim1]; /* L30: */ } /* L40: */ } *(unsigned char *)equed = 'R'; } else { /* Row and column scaling */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = c__[j]; /* Computing MAX */ i__3 = 1, i__4 = j - *ku; /* Computing MIN */ i__5 = *m, i__6 = j + *kl; i__2 = min(i__5,i__6); for (i__ = max(i__3,i__4); i__ <= i__2; ++i__) { ab[*ku + 1 + i__ - j + j * ab_dim1] = cj * r__[i__] * ab[*ku + 1 + i__ - j + j * ab_dim1]; /* L50: */ } /* L60: */ } *(unsigned char *)equed = 'B'; } return 0; /* End of DLAQGB */ } /* _starpu_dlaqgb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqge.c000066400000000000000000000121141413463044200206020ustar00rootroot00000000000000/* dlaqge.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaqge_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j; doublereal cj, large, small; extern doublereal _starpu_dlamch_(char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQGE equilibrates a general M by N matrix A using the row and */ /* column scaling factors in the vectors R and C. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M by N matrix A. */ /* On exit, the equilibrated matrix. See EQUED for the form of */ /* the equilibrated matrix. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(M,1). */ /* R (input) DOUBLE PRECISION array, dimension (M) */ /* The row scale factors for A. */ /* C (input) DOUBLE PRECISION array, dimension (N) */ /* The column scale factors for A. */ /* ROWCND (input) DOUBLE PRECISION */ /* Ratio of the smallest R(i) to the largest R(i). */ /* COLCND (input) DOUBLE PRECISION */ /* Ratio of the smallest C(i) to the largest C(i). */ /* AMAX (input) DOUBLE PRECISION */ /* Absolute value of largest matrix entry. */ /* EQUED (output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration */ /* = 'R': Row equilibration, i.e., A has been premultiplied by */ /* diag(R). */ /* = 'C': Column equilibration, i.e., A has been postmultiplied */ /* by diag(C). */ /* = 'B': Both row and column equilibration, i.e., A has been */ /* replaced by diag(R) * A * diag(C). */ /* Internal Parameters */ /* =================== */ /* THRESH is a threshold value used to decide if row or column scaling */ /* should be done based on the ratio of the row or column scaling */ /* factors. If ROWCND < THRESH, row scaling is done, and if */ /* COLCND < THRESH, column scaling is done. */ /* LARGE and SMALL are threshold values used to decide if row scaling */ /* should be done based on the absolute size of the largest matrix */ /* element. If AMAX > LARGE or AMAX < SMALL, row scaling is done. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --r__; --c__; /* Function Body */ if (*m <= 0 || *n <= 0) { *(unsigned char *)equed = 'N'; return 0; } /* Initialize LARGE and SMALL. */ small = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); large = 1. / small; if (*rowcnd >= .1 && *amax >= small && *amax <= large) { /* No row scaling */ if (*colcnd >= .1) { /* No column scaling */ *(unsigned char *)equed = 'N'; } else { /* Column scaling */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = c__[j]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = cj * a[i__ + j * a_dim1]; /* L10: */ } /* L20: */ } *(unsigned char *)equed = 'C'; } } else if (*colcnd >= .1) { /* Row scaling, no column scaling */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = r__[i__] * a[i__ + j * a_dim1]; /* L30: */ } /* L40: */ } *(unsigned char *)equed = 'R'; } else { /* Row and column scaling */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = c__[j]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = cj * r__[i__] * a[i__ + j * a_dim1]; /* L50: */ } /* L60: */ } *(unsigned char *)equed = 'B'; } return 0; /* End of DLAQGE */ } /* _starpu_dlaqge_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqp2.c000066400000000000000000000156621413463044200205430ustar00rootroot00000000000000/* dlaqp2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlaqp2_(integer *m, integer *n, integer *offset, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, mn; doublereal aii; integer pvt; doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp2, tol3z; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); integer offpi, itemp; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQP2 computes a QR factorization with column pivoting of */ /* the block A(OFFSET+1:M,1:N). */ /* The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* OFFSET (input) INTEGER */ /* The number of rows of the matrix A that must be pivoted */ /* but no factorized. OFFSET >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, the upper triangle of block A(OFFSET+1:M,1:N) is */ /* the triangular factor obtained; the elements in block */ /* A(OFFSET+1:M,1:N) below the diagonal, together with the */ /* array TAU, represent the orthogonal matrix Q as a product of */ /* elementary reflectors. Block A(1:OFFSET,1:N) has been */ /* accordingly pivoted, but no factorized. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* JPVT (input/output) INTEGER array, dimension (N) */ /* On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted */ /* to the front of A*P (a leading column); if JPVT(i) = 0, */ /* the i-th column of A is a free column. */ /* On exit, if JPVT(i) = k, then the i-th column of A*P */ /* was the k-th column of A. */ /* TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) */ /* The scalar factors of the elementary reflectors. */ /* VN1 (input/output) DOUBLE PRECISION array, dimension (N) */ /* The vector with the partial column norms. */ /* VN2 (input/output) DOUBLE PRECISION array, dimension (N) */ /* The vector with the exact column norms. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ /* X. Sun, Computer Science Dept., Duke University, USA */ /* Partial column norm updating strategy modified by */ /* Z. Drmac and Z. Bujanovic, Dept. of Mathematics, */ /* University of Zagreb, Croatia. */ /* June 2006. */ /* For more details see LAPACK Working Note 176. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --jpvt; --tau; --vn1; --vn2; --work; /* Function Body */ /* Computing MIN */ i__1 = *m - *offset; mn = min(i__1,*n); tol3z = sqrt(_starpu_dlamch_("Epsilon")); /* Compute factorization. */ i__1 = mn; for (i__ = 1; i__ <= i__1; ++i__) { offpi = *offset + i__; /* Determine ith pivot column and swap if necessary. */ i__2 = *n - i__ + 1; pvt = i__ - 1 + _starpu_idamax_(&i__2, &vn1[i__], &c__1); if (pvt != i__) { _starpu_dswap_(m, &a[pvt * a_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], & c__1); itemp = jpvt[pvt]; jpvt[pvt] = jpvt[i__]; jpvt[i__] = itemp; vn1[pvt] = vn1[i__]; vn2[pvt] = vn2[i__]; } /* Generate elementary reflector H(i). */ if (offpi < *m) { i__2 = *m - offpi + 1; _starpu_dlarfp_(&i__2, &a[offpi + i__ * a_dim1], &a[offpi + 1 + i__ * a_dim1], &c__1, &tau[i__]); } else { _starpu_dlarfp_(&c__1, &a[*m + i__ * a_dim1], &a[*m + i__ * a_dim1], & c__1, &tau[i__]); } if (i__ <= *n) { /* Apply H(i)' to A(offset+i:m,i+1:n) from the left. */ aii = a[offpi + i__ * a_dim1]; a[offpi + i__ * a_dim1] = 1.; i__2 = *m - offpi + 1; i__3 = *n - i__; _starpu_dlarf_("Left", &i__2, &i__3, &a[offpi + i__ * a_dim1], &c__1, & tau[i__], &a[offpi + (i__ + 1) * a_dim1], lda, &work[1]); a[offpi + i__ * a_dim1] = aii; } /* Update partial column norms. */ i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { if (vn1[j] != 0.) { /* NOTE: The following 4 lines follow from the analysis in */ /* Lapack Working Note 176. */ /* Computing 2nd power */ d__2 = (d__1 = a[offpi + j * a_dim1], abs(d__1)) / vn1[j]; temp = 1. - d__2 * d__2; temp = max(temp,0.); /* Computing 2nd power */ d__1 = vn1[j] / vn2[j]; temp2 = temp * (d__1 * d__1); if (temp2 <= tol3z) { if (offpi < *m) { i__3 = *m - offpi; vn1[j] = _starpu_dnrm2_(&i__3, &a[offpi + 1 + j * a_dim1], & c__1); vn2[j] = vn1[j]; } else { vn1[j] = 0.; vn2[j] = 0.; } } else { vn1[j] *= sqrt(temp); } } /* L10: */ } /* L20: */ } return 0; /* End of DLAQP2 */ } /* _starpu_dlaqp2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqps.c000066400000000000000000000241111413463044200206310ustar00rootroot00000000000000/* dlaqps.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = -1.; static doublereal c_b9 = 1.; static doublereal c_b16 = 0.; /* Subroutine */ int _starpu_dlaqps_(integer *m, integer *n, integer *offset, integer *nb, integer *kb, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *auxv, doublereal *f, integer *ldf) { /* System generated locals */ integer a_dim1, a_offset, f_dim1, f_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); integer i_dnnt(doublereal *); /* Local variables */ integer j, k, rk; doublereal akk; integer pvt; doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal temp2, tol3z; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer itemp; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *); integer lsticc, lastrk; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQPS computes a step of QR factorization with column pivoting */ /* of a real M-by-N matrix A by using Blas-3. It tries to factorize */ /* NB columns from A starting from the row OFFSET+1, and updates all */ /* of the matrix with Blas-3 xGEMM. */ /* In some cases, due to catastrophic cancellations, it cannot */ /* factorize NB columns. Hence, the actual number of factorized */ /* columns is returned in KB. */ /* Block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0 */ /* OFFSET (input) INTEGER */ /* The number of rows of A that have been factorized in */ /* previous steps. */ /* NB (input) INTEGER */ /* The number of columns to factorize. */ /* KB (output) INTEGER */ /* The number of columns actually factorized. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, block A(OFFSET+1:M,1:KB) is the triangular */ /* factor obtained and block A(1:OFFSET,1:N) has been */ /* accordingly pivoted, but no factorized. */ /* The rest of the matrix, block A(OFFSET+1:M,KB+1:N) has */ /* been updated. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* JPVT (input/output) INTEGER array, dimension (N) */ /* JPVT(I) = K <==> Column K of the full matrix A has been */ /* permuted into position I in AP. */ /* TAU (output) DOUBLE PRECISION array, dimension (KB) */ /* The scalar factors of the elementary reflectors. */ /* VN1 (input/output) DOUBLE PRECISION array, dimension (N) */ /* The vector with the partial column norms. */ /* VN2 (input/output) DOUBLE PRECISION array, dimension (N) */ /* The vector with the exact column norms. */ /* AUXV (input/output) DOUBLE PRECISION array, dimension (NB) */ /* Auxiliar vector. */ /* F (input/output) DOUBLE PRECISION array, dimension (LDF,NB) */ /* Matrix F' = L*Y'*A. */ /* LDF (input) INTEGER */ /* The leading dimension of the array F. LDF >= max(1,N). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ /* X. Sun, Computer Science Dept., Duke University, USA */ /* Partial column norm updating strategy modified by */ /* Z. Drmac and Z. Bujanovic, Dept. of Mathematics, */ /* University of Zagreb, Croatia. */ /* June 2006. */ /* For more details see LAPACK Working Note 176. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --jpvt; --tau; --vn1; --vn2; --auxv; f_dim1 = *ldf; f_offset = 1 + f_dim1; f -= f_offset; /* Function Body */ /* Computing MIN */ i__1 = *m, i__2 = *n + *offset; lastrk = min(i__1,i__2); lsticc = 0; k = 0; tol3z = sqrt(_starpu_dlamch_("Epsilon")); /* Beginning of while loop. */ L10: if (k < *nb && lsticc == 0) { ++k; rk = *offset + k; /* Determine ith pivot column and swap if necessary */ i__1 = *n - k + 1; pvt = k - 1 + _starpu_idamax_(&i__1, &vn1[k], &c__1); if (pvt != k) { _starpu_dswap_(m, &a[pvt * a_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); i__1 = k - 1; _starpu_dswap_(&i__1, &f[pvt + f_dim1], ldf, &f[k + f_dim1], ldf); itemp = jpvt[pvt]; jpvt[pvt] = jpvt[k]; jpvt[k] = itemp; vn1[pvt] = vn1[k]; vn2[pvt] = vn2[k]; } /* Apply previous Householder reflectors to column K: */ /* A(RK:M,K) := A(RK:M,K) - A(RK:M,1:K-1)*F(K,1:K-1)'. */ if (k > 1) { i__1 = *m - rk + 1; i__2 = k - 1; _starpu_dgemv_("No transpose", &i__1, &i__2, &c_b8, &a[rk + a_dim1], lda, &f[k + f_dim1], ldf, &c_b9, &a[rk + k * a_dim1], &c__1); } /* Generate elementary reflector H(k). */ if (rk < *m) { i__1 = *m - rk + 1; _starpu_dlarfp_(&i__1, &a[rk + k * a_dim1], &a[rk + 1 + k * a_dim1], & c__1, &tau[k]); } else { _starpu_dlarfp_(&c__1, &a[rk + k * a_dim1], &a[rk + k * a_dim1], &c__1, & tau[k]); } akk = a[rk + k * a_dim1]; a[rk + k * a_dim1] = 1.; /* Compute Kth column of F: */ /* Compute F(K+1:N,K) := tau(K)*A(RK:M,K+1:N)'*A(RK:M,K). */ if (k < *n) { i__1 = *m - rk + 1; i__2 = *n - k; _starpu_dgemv_("Transpose", &i__1, &i__2, &tau[k], &a[rk + (k + 1) * a_dim1], lda, &a[rk + k * a_dim1], &c__1, &c_b16, &f[k + 1 + k * f_dim1], &c__1); } /* Padding F(1:K,K) with zeros. */ i__1 = k; for (j = 1; j <= i__1; ++j) { f[j + k * f_dim1] = 0.; /* L20: */ } /* Incremental updating of F: */ /* F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)' */ /* *A(RK:M,K). */ if (k > 1) { i__1 = *m - rk + 1; i__2 = k - 1; d__1 = -tau[k]; _starpu_dgemv_("Transpose", &i__1, &i__2, &d__1, &a[rk + a_dim1], lda, &a[ rk + k * a_dim1], &c__1, &c_b16, &auxv[1], &c__1); i__1 = k - 1; _starpu_dgemv_("No transpose", n, &i__1, &c_b9, &f[f_dim1 + 1], ldf, & auxv[1], &c__1, &c_b9, &f[k * f_dim1 + 1], &c__1); } /* Update the current row of A: */ /* A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)'. */ if (k < *n) { i__1 = *n - k; _starpu_dgemv_("No transpose", &i__1, &k, &c_b8, &f[k + 1 + f_dim1], ldf, &a[rk + a_dim1], lda, &c_b9, &a[rk + (k + 1) * a_dim1], lda); } /* Update partial column norms. */ if (rk < lastrk) { i__1 = *n; for (j = k + 1; j <= i__1; ++j) { if (vn1[j] != 0.) { /* NOTE: The following 4 lines follow from the analysis in */ /* Lapack Working Note 176. */ temp = (d__1 = a[rk + j * a_dim1], abs(d__1)) / vn1[j]; /* Computing MAX */ d__1 = 0., d__2 = (temp + 1.) * (1. - temp); temp = max(d__1,d__2); /* Computing 2nd power */ d__1 = vn1[j] / vn2[j]; temp2 = temp * (d__1 * d__1); if (temp2 <= tol3z) { vn2[j] = (doublereal) lsticc; lsticc = j; } else { vn1[j] *= sqrt(temp); } } /* L30: */ } } a[rk + k * a_dim1] = akk; /* End of while loop. */ goto L10; } *kb = k; rk = *offset + *kb; /* Apply the block reflector to the rest of the matrix: */ /* A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) - */ /* A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)'. */ /* Computing MIN */ i__1 = *n, i__2 = *m - *offset; if (*kb < min(i__1,i__2)) { i__1 = *m - rk; i__2 = *n - *kb; _starpu_dgemm_("No transpose", "Transpose", &i__1, &i__2, kb, &c_b8, &a[rk + 1 + a_dim1], lda, &f[*kb + 1 + f_dim1], ldf, &c_b9, &a[rk + 1 + (*kb + 1) * a_dim1], lda); } /* Recomputation of difficult columns. */ L40: if (lsticc > 0) { itemp = i_dnnt(&vn2[lsticc]); i__1 = *m - rk; vn1[lsticc] = _starpu_dnrm2_(&i__1, &a[rk + 1 + lsticc * a_dim1], &c__1); /* NOTE: The computation of VN1( LSTICC ) relies on the fact that */ /* SNRM2 does not fail on vectors with norm below the value of */ /* SQRT(DLAMCH('S')) */ vn2[lsticc] = vn1[lsticc]; lsticc = itemp; goto L40; } return 0; /* End of DLAQPS */ } /* _starpu_dlaqps_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqr0.c000066400000000000000000000635351413463044200205450ustar00rootroot00000000000000/* dlaqr0.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__13 = 13; static integer c__15 = 15; static integer c_n1 = -1; static integer c__12 = 12; static integer c__14 = 14; static integer c__16 = 16; static logical c_false = FALSE_; static integer c__1 = 1; static integer c__3 = 3; /* Subroutine */ int _starpu_dlaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3, d__4; /* Local variables */ integer i__, k; doublereal aa, bb, cc, dd; integer ld; doublereal cs; integer nh, it, ks, kt; doublereal sn; integer ku, kv, ls, ns; doublereal ss; integer nw, inf, kdu, nho, nve, kwh, nsr, nwr, kwv, ndec, ndfl, kbot, nmin; doublereal swap; integer ktop; doublereal zdum[1] /* was [1][1] */; integer kacc22, itmax, nsmax, nwmax, kwtop; extern /* Subroutine */ int _starpu_dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaqr3_( logical *, logical *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaqr4_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlaqr5_(logical *, logical *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *); integer nibble; extern /* Subroutine */ int _starpu_dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); char jbcmpz[1]; integer nwupbd; logical sorted; integer lwkopt; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQR0 computes the eigenvalues of a Hessenberg matrix H */ /* and, optionally, the matrices T and Z from the Schur decomposition */ /* H = Z T Z**T, where T is an upper quasi-triangular matrix (the */ /* Schur form), and Z is the orthogonal matrix of Schur vectors. */ /* Optionally Z may be postmultiplied into an input orthogonal */ /* matrix Q so that this routine can give the Schur factorization */ /* of a matrix A which has been reduced to the Hessenberg form H */ /* by the orthogonal matrix Q: A = Q*H*Q**T = (QZ)*T*(QZ)**T. */ /* Arguments */ /* ========= */ /* WANTT (input) LOGICAL */ /* = .TRUE. : the full Schur form T is required; */ /* = .FALSE.: only eigenvalues are required. */ /* WANTZ (input) LOGICAL */ /* = .TRUE. : the matrix of Schur vectors Z is required; */ /* = .FALSE.: Schur vectors are not required. */ /* N (input) INTEGER */ /* The order of the matrix H. N .GE. 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that H is already upper triangular in rows */ /* and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1, */ /* H(ILO,ILO-1) is zero. ILO and IHI are normally set by a */ /* previous call to DGEBAL, and then passed to DGEHRD when the */ /* matrix output by DGEBAL is reduced to Hessenberg form. */ /* Otherwise, ILO and IHI should be set to 1 and N, */ /* respectively. If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N. */ /* If N = 0, then ILO = 1 and IHI = 0. */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH,N) */ /* On entry, the upper Hessenberg matrix H. */ /* On exit, if INFO = 0 and WANTT is .TRUE., then H contains */ /* the upper quasi-triangular matrix T from the Schur */ /* decomposition (the Schur form); 2-by-2 diagonal blocks */ /* (corresponding to complex conjugate pairs of eigenvalues) */ /* are returned in standard form, with H(i,i) = H(i+1,i+1) */ /* and H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and WANTT is */ /* .FALSE., then the contents of H are unspecified on exit. */ /* (The output value of H when INFO.GT.0 is given under the */ /* description of INFO below.) */ /* This subroutine may explicitly set H(i,j) = 0 for i.GT.j and */ /* j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH .GE. max(1,N). */ /* WR (output) DOUBLE PRECISION array, dimension (IHI) */ /* WI (output) DOUBLE PRECISION array, dimension (IHI) */ /* The real and imaginary parts, respectively, of the computed */ /* eigenvalues of H(ILO:IHI,ILO:IHI) are stored in WR(ILO:IHI) */ /* and WI(ILO:IHI). If two eigenvalues are computed as a */ /* complex conjugate pair, they are stored in consecutive */ /* elements of WR and WI, say the i-th and (i+1)th, with */ /* WI(i) .GT. 0 and WI(i+1) .LT. 0. If WANTT is .TRUE., then */ /* the eigenvalues are stored in the same order as on the */ /* diagonal of the Schur form returned in H, with */ /* WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 diagonal */ /* block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and */ /* WI(i+1) = -WI(i). */ /* ILOZ (input) INTEGER */ /* IHIZ (input) INTEGER */ /* Specify the rows of Z to which transformations must be */ /* applied if WANTZ is .TRUE.. */ /* 1 .LE. ILOZ .LE. ILO; IHI .LE. IHIZ .LE. N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,IHI) */ /* If WANTZ is .FALSE., then Z is not referenced. */ /* If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is */ /* replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the */ /* orthogonal Schur factor of H(ILO:IHI,ILO:IHI). */ /* (The output value of Z when INFO.GT.0 is given under */ /* the description of INFO below.) */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. if WANTZ is .TRUE. */ /* then LDZ.GE.MAX(1,IHIZ). Otherwize, LDZ.GE.1. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension LWORK */ /* On exit, if LWORK = -1, WORK(1) returns an estimate of */ /* the optimal value for LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK .GE. max(1,N) */ /* is sufficient, but LWORK typically as large as 6*N may */ /* be required for optimal performance. A workspace query */ /* to determine the optimal workspace size is recommended. */ /* If LWORK = -1, then DLAQR0 does a workspace query. */ /* In this case, DLAQR0 checks the input parameters and */ /* estimates the optimal workspace size for the given */ /* values of N, ILO and IHI. The estimate is returned */ /* in WORK(1). No error message related to LWORK is */ /* issued by XERBLA. Neither H nor Z are accessed. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* .GT. 0: if INFO = i, DLAQR0 failed to compute all of */ /* the eigenvalues. Elements 1:ilo-1 and i+1:n of WR */ /* and WI contain those eigenvalues which have been */ /* successfully computed. (Failures are rare.) */ /* If INFO .GT. 0 and WANT is .FALSE., then on exit, */ /* the remaining unconverged eigenvalues are the eigen- */ /* values of the upper Hessenberg matrix rows and */ /* columns ILO through INFO of the final, output */ /* value of H. */ /* If INFO .GT. 0 and WANTT is .TRUE., then on exit */ /* (*) (initial value of H)*U = U*(final value of H) */ /* where U is an orthogonal matrix. The final */ /* value of H is upper Hessenberg and quasi-triangular */ /* in rows and columns INFO+1 through IHI. */ /* If INFO .GT. 0 and WANTZ is .TRUE., then on exit */ /* (final value of Z(ILO:IHI,ILOZ:IHIZ) */ /* = (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U */ /* where U is the orthogonal matrix in (*) (regard- */ /* less of the value of WANTT.) */ /* If INFO .GT. 0 and WANTZ is .FALSE., then Z is not */ /* accessed. */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* References: */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part I: Maintaining Well Focused Shifts, and Level 3 */ /* Performance, SIAM Journal of Matrix Analysis, volume 23, pages */ /* 929--947, 2002. */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part II: Aggressive Early Deflation, SIAM Journal */ /* of Matrix Analysis, volume 23, pages 948--973, 2002. */ /* ================================================================ */ /* .. Parameters .. */ /* ==== Matrices of order NTINY or smaller must be processed by */ /* . DLAHQR because of insufficient subdiagonal scratch space. */ /* . (This is a hard limit.) ==== */ /* ==== Exceptional deflation windows: try to cure rare */ /* . slow convergence by varying the size of the */ /* . deflation window after KEXNW iterations. ==== */ /* ==== Exceptional shifts: try to cure rare slow convergence */ /* . with ad-hoc exceptional shifts every KEXSH iterations. */ /* . ==== */ /* ==== The constants WILK1 and WILK2 are used to form the */ /* . exceptional shifts. ==== */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --wr; --wi; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ *info = 0; /* ==== Quick return for N = 0: nothing to do. ==== */ if (*n == 0) { work[1] = 1.; return 0; } if (*n <= 11) { /* ==== Tiny matrices must use DLAHQR. ==== */ lwkopt = 1; if (*lwork != -1) { _starpu_dlahqr_(wantt, wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], & wi[1], iloz, ihiz, &z__[z_offset], ldz, info); } } else { /* ==== Use small bulge multi-shift QR with aggressive early */ /* . deflation on larger-than-tiny matrices. ==== */ /* ==== Hope for the best. ==== */ *info = 0; /* ==== Set up job flags for ILAENV. ==== */ if (*wantt) { *(unsigned char *)jbcmpz = 'S'; } else { *(unsigned char *)jbcmpz = 'E'; } if (*wantz) { *(unsigned char *)&jbcmpz[1] = 'V'; } else { *(unsigned char *)&jbcmpz[1] = 'N'; } /* ==== NWR = recommended deflation window size. At this */ /* . point, N .GT. NTINY = 11, so there is enough */ /* . subdiagonal workspace for NWR.GE.2 as required. */ /* . (In fact, there is enough subdiagonal space for */ /* . NWR.GE.3.) ==== */ nwr = _starpu_ilaenv_(&c__13, "DLAQR0", jbcmpz, n, ilo, ihi, lwork); nwr = max(2,nwr); /* Computing MIN */ i__1 = *ihi - *ilo + 1, i__2 = (*n - 1) / 3, i__1 = min(i__1,i__2); nwr = min(i__1,nwr); /* ==== NSR = recommended number of simultaneous shifts. */ /* . At this point N .GT. NTINY = 11, so there is at */ /* . enough subdiagonal workspace for NSR to be even */ /* . and greater than or equal to two as required. ==== */ nsr = _starpu_ilaenv_(&c__15, "DLAQR0", jbcmpz, n, ilo, ihi, lwork); /* Computing MIN */ i__1 = nsr, i__2 = (*n + 6) / 9, i__1 = min(i__1,i__2), i__2 = *ihi - *ilo; nsr = min(i__1,i__2); /* Computing MAX */ i__1 = 2, i__2 = nsr - nsr % 2; nsr = max(i__1,i__2); /* ==== Estimate optimal workspace ==== */ /* ==== Workspace query call to DLAQR3 ==== */ i__1 = nwr + 1; _starpu_dlaqr3_(wantt, wantz, n, ilo, ihi, &i__1, &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], ldz, &ls, &ld, &wr[1], &wi[1], &h__[ h_offset], ldh, n, &h__[h_offset], ldh, n, &h__[h_offset], ldh, &work[1], &c_n1); /* ==== Optimal workspace = MAX(DLAQR5, DLAQR3) ==== */ /* Computing MAX */ i__1 = nsr * 3 / 2, i__2 = (integer) work[1]; lwkopt = max(i__1,i__2); /* ==== Quick return in case of workspace query. ==== */ if (*lwork == -1) { work[1] = (doublereal) lwkopt; return 0; } /* ==== DLAHQR/DLAQR0 crossover point ==== */ nmin = _starpu_ilaenv_(&c__12, "DLAQR0", jbcmpz, n, ilo, ihi, lwork); nmin = max(11,nmin); /* ==== Nibble crossover point ==== */ nibble = _starpu_ilaenv_(&c__14, "DLAQR0", jbcmpz, n, ilo, ihi, lwork); nibble = max(0,nibble); /* ==== Accumulate reflections during ttswp? Use block */ /* . 2-by-2 structure during matrix-matrix multiply? ==== */ kacc22 = _starpu_ilaenv_(&c__16, "DLAQR0", jbcmpz, n, ilo, ihi, lwork); kacc22 = max(0,kacc22); kacc22 = min(2,kacc22); /* ==== NWMAX = the largest possible deflation window for */ /* . which there is sufficient workspace. ==== */ /* Computing MIN */ i__1 = (*n - 1) / 3, i__2 = *lwork / 2; nwmax = min(i__1,i__2); nw = nwmax; /* ==== NSMAX = the Largest number of simultaneous shifts */ /* . for which there is sufficient workspace. ==== */ /* Computing MIN */ i__1 = (*n + 6) / 9, i__2 = (*lwork << 1) / 3; nsmax = min(i__1,i__2); nsmax -= nsmax % 2; /* ==== NDFL: an iteration count restarted at deflation. ==== */ ndfl = 1; /* ==== ITMAX = iteration limit ==== */ /* Computing MAX */ i__1 = 10, i__2 = *ihi - *ilo + 1; itmax = max(i__1,i__2) * 30; /* ==== Last row and column in the active block ==== */ kbot = *ihi; /* ==== Main Loop ==== */ i__1 = itmax; for (it = 1; it <= i__1; ++it) { /* ==== Done when KBOT falls below ILO ==== */ if (kbot < *ilo) { goto L90; } /* ==== Locate active block ==== */ i__2 = *ilo + 1; for (k = kbot; k >= i__2; --k) { if (h__[k + (k - 1) * h_dim1] == 0.) { goto L20; } /* L10: */ } k = *ilo; L20: ktop = k; /* ==== Select deflation window size: */ /* . Typical Case: */ /* . If possible and advisable, nibble the entire */ /* . active block. If not, use size MIN(NWR,NWMAX) */ /* . or MIN(NWR+1,NWMAX) depending upon which has */ /* . the smaller corresponding subdiagonal entry */ /* . (a heuristic). */ /* . */ /* . Exceptional Case: */ /* . If there have been no deflations in KEXNW or */ /* . more iterations, then vary the deflation window */ /* . size. At first, because, larger windows are, */ /* . in general, more powerful than smaller ones, */ /* . rapidly increase the window to the maximum possible. */ /* . Then, gradually reduce the window size. ==== */ nh = kbot - ktop + 1; nwupbd = min(nh,nwmax); if (ndfl < 5) { nw = min(nwupbd,nwr); } else { /* Computing MIN */ i__2 = nwupbd, i__3 = nw << 1; nw = min(i__2,i__3); } if (nw < nwmax) { if (nw >= nh - 1) { nw = nh; } else { kwtop = kbot - nw + 1; if ((d__1 = h__[kwtop + (kwtop - 1) * h_dim1], abs(d__1)) > (d__2 = h__[kwtop - 1 + (kwtop - 2) * h_dim1], abs(d__2))) { ++nw; } } } if (ndfl < 5) { ndec = -1; } else if (ndec >= 0 || nw >= nwupbd) { ++ndec; if (nw - ndec < 2) { ndec = 0; } nw -= ndec; } /* ==== Aggressive early deflation: */ /* . split workspace under the subdiagonal into */ /* . - an nw-by-nw work array V in the lower */ /* . left-hand-corner, */ /* . - an NW-by-at-least-NW-but-more-is-better */ /* . (NW-by-NHO) horizontal work array along */ /* . the bottom edge, */ /* . - an at-least-NW-but-more-is-better (NHV-by-NW) */ /* . vertical work array along the left-hand-edge. */ /* . ==== */ kv = *n - nw + 1; kt = nw + 1; nho = *n - nw - 1 - kt + 1; kwv = nw + 2; nve = *n - nw - kwv + 1; /* ==== Aggressive early deflation ==== */ _starpu_dlaqr3_(wantt, wantz, n, &ktop, &kbot, &nw, &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], ldz, &ls, &ld, &wr[1], &wi[1], &h__[kv + h_dim1], ldh, &nho, &h__[kv + kt * h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &work[1], lwork); /* ==== Adjust KBOT accounting for new deflations. ==== */ kbot -= ld; /* ==== KS points to the shifts. ==== */ ks = kbot - ls + 1; /* ==== Skip an expensive QR sweep if there is a (partly */ /* . heuristic) reason to expect that many eigenvalues */ /* . will deflate without it. Here, the QR sweep is */ /* . skipped if many eigenvalues have just been deflated */ /* . or if the remaining active block is small. */ if (ld == 0 || ld * 100 <= nw * nibble && kbot - ktop + 1 > min( nmin,nwmax)) { /* ==== NS = nominal number of simultaneous shifts. */ /* . This may be lowered (slightly) if DLAQR3 */ /* . did not provide that many shifts. ==== */ /* Computing MIN */ /* Computing MAX */ i__4 = 2, i__5 = kbot - ktop; i__2 = min(nsmax,nsr), i__3 = max(i__4,i__5); ns = min(i__2,i__3); ns -= ns % 2; /* ==== If there have been no deflations */ /* . in a multiple of KEXSH iterations, */ /* . then try exceptional shifts. */ /* . Otherwise use shifts provided by */ /* . DLAQR3 above or from the eigenvalues */ /* . of a trailing principal submatrix. ==== */ if (ndfl % 6 == 0) { ks = kbot - ns + 1; /* Computing MAX */ i__3 = ks + 1, i__4 = ktop + 2; i__2 = max(i__3,i__4); for (i__ = kbot; i__ >= i__2; i__ += -2) { ss = (d__1 = h__[i__ + (i__ - 1) * h_dim1], abs(d__1)) + (d__2 = h__[i__ - 1 + (i__ - 2) * h_dim1], abs(d__2)); aa = ss * .75 + h__[i__ + i__ * h_dim1]; bb = ss; cc = ss * -.4375; dd = aa; _starpu_dlanv2_(&aa, &bb, &cc, &dd, &wr[i__ - 1], &wi[i__ - 1] , &wr[i__], &wi[i__], &cs, &sn); /* L30: */ } if (ks == ktop) { wr[ks + 1] = h__[ks + 1 + (ks + 1) * h_dim1]; wi[ks + 1] = 0.; wr[ks] = wr[ks + 1]; wi[ks] = wi[ks + 1]; } } else { /* ==== Got NS/2 or fewer shifts? Use DLAQR4 or */ /* . DLAHQR on a trailing principal submatrix to */ /* . get more. (Since NS.LE.NSMAX.LE.(N+6)/9, */ /* . there is enough space below the subdiagonal */ /* . to fit an NS-by-NS scratch array.) ==== */ if (kbot - ks + 1 <= ns / 2) { ks = kbot - ns + 1; kt = *n - ns + 1; _starpu_dlacpy_("A", &ns, &ns, &h__[ks + ks * h_dim1], ldh, & h__[kt + h_dim1], ldh); if (ns > nmin) { _starpu_dlaqr4_(&c_false, &c_false, &ns, &c__1, &ns, &h__[ kt + h_dim1], ldh, &wr[ks], &wi[ks], & c__1, &c__1, zdum, &c__1, &work[1], lwork, &inf); } else { _starpu_dlahqr_(&c_false, &c_false, &ns, &c__1, &ns, &h__[ kt + h_dim1], ldh, &wr[ks], &wi[ks], & c__1, &c__1, zdum, &c__1, &inf); } ks += inf; /* ==== In case of a rare QR failure use */ /* . eigenvalues of the trailing 2-by-2 */ /* . principal submatrix. ==== */ if (ks >= kbot) { aa = h__[kbot - 1 + (kbot - 1) * h_dim1]; cc = h__[kbot + (kbot - 1) * h_dim1]; bb = h__[kbot - 1 + kbot * h_dim1]; dd = h__[kbot + kbot * h_dim1]; _starpu_dlanv2_(&aa, &bb, &cc, &dd, &wr[kbot - 1], &wi[ kbot - 1], &wr[kbot], &wi[kbot], &cs, &sn) ; ks = kbot - 1; } } if (kbot - ks + 1 > ns) { /* ==== Sort the shifts (Helps a little) */ /* . Bubble sort keeps complex conjugate */ /* . pairs together. ==== */ sorted = FALSE_; i__2 = ks + 1; for (k = kbot; k >= i__2; --k) { if (sorted) { goto L60; } sorted = TRUE_; i__3 = k - 1; for (i__ = ks; i__ <= i__3; ++i__) { if ((d__1 = wr[i__], abs(d__1)) + (d__2 = wi[ i__], abs(d__2)) < (d__3 = wr[i__ + 1] , abs(d__3)) + (d__4 = wi[i__ + 1], abs(d__4))) { sorted = FALSE_; swap = wr[i__]; wr[i__] = wr[i__ + 1]; wr[i__ + 1] = swap; swap = wi[i__]; wi[i__] = wi[i__ + 1]; wi[i__ + 1] = swap; } /* L40: */ } /* L50: */ } L60: ; } /* ==== Shuffle shifts into pairs of real shifts */ /* . and pairs of complex conjugate shifts */ /* . assuming complex conjugate shifts are */ /* . already adjacent to one another. (Yes, */ /* . they are.) ==== */ i__2 = ks + 2; for (i__ = kbot; i__ >= i__2; i__ += -2) { if (wi[i__] != -wi[i__ - 1]) { swap = wr[i__]; wr[i__] = wr[i__ - 1]; wr[i__ - 1] = wr[i__ - 2]; wr[i__ - 2] = swap; swap = wi[i__]; wi[i__] = wi[i__ - 1]; wi[i__ - 1] = wi[i__ - 2]; wi[i__ - 2] = swap; } /* L70: */ } } /* ==== If there are only two shifts and both are */ /* . real, then use only one. ==== */ if (kbot - ks + 1 == 2) { if (wi[kbot] == 0.) { if ((d__1 = wr[kbot] - h__[kbot + kbot * h_dim1], abs( d__1)) < (d__2 = wr[kbot - 1] - h__[kbot + kbot * h_dim1], abs(d__2))) { wr[kbot - 1] = wr[kbot]; } else { wr[kbot] = wr[kbot - 1]; } } } /* ==== Use up to NS of the the smallest magnatiude */ /* . shifts. If there aren't NS shifts available, */ /* . then use them all, possibly dropping one to */ /* . make the number of shifts even. ==== */ /* Computing MIN */ i__2 = ns, i__3 = kbot - ks + 1; ns = min(i__2,i__3); ns -= ns % 2; ks = kbot - ns + 1; /* ==== Small-bulge multi-shift QR sweep: */ /* . split workspace under the subdiagonal into */ /* . - a KDU-by-KDU work array U in the lower */ /* . left-hand-corner, */ /* . - a KDU-by-at-least-KDU-but-more-is-better */ /* . (KDU-by-NHo) horizontal work array WH along */ /* . the bottom edge, */ /* . - and an at-least-KDU-but-more-is-better-by-KDU */ /* . (NVE-by-KDU) vertical work WV arrow along */ /* . the left-hand-edge. ==== */ kdu = ns * 3 - 3; ku = *n - kdu + 1; kwh = kdu + 1; nho = *n - kdu - 3 - (kdu + 1) + 1; kwv = kdu + 4; nve = *n - kdu - kwv + 1; /* ==== Small-bulge multi-shift QR sweep ==== */ _starpu_dlaqr5_(wantt, wantz, &kacc22, n, &ktop, &kbot, &ns, &wr[ks], &wi[ks], &h__[h_offset], ldh, iloz, ihiz, &z__[ z_offset], ldz, &work[1], &c__3, &h__[ku + h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &nho, &h__[ku + kwh * h_dim1], ldh); } /* ==== Note progress (or the lack of it). ==== */ if (ld > 0) { ndfl = 1; } else { ++ndfl; } /* ==== End of main loop ==== */ /* L80: */ } /* ==== Iteration limit exceeded. Set INFO to show where */ /* . the problem occurred and exit. ==== */ *info = kbot; L90: ; } /* ==== Return the optimal value of LWORK. ==== */ work[1] = (doublereal) lwkopt; /* ==== End of DLAQR0 ==== */ return 0; } /* _starpu_dlaqr0_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqr1.c000066400000000000000000000076741413463044200205500ustar00rootroot00000000000000/* dlaqr1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaqr1_(integer *n, doublereal *h__, integer *ldh, doublereal *sr1, doublereal *si1, doublereal *sr2, doublereal *si2, doublereal *v) { /* System generated locals */ integer h_dim1, h_offset; doublereal d__1, d__2, d__3; /* Local variables */ doublereal s, h21s, h31s; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Given a 2-by-2 or 3-by-3 matrix H, DLAQR1 sets v to a */ /* scalar multiple of the first column of the product */ /* (*) K = (H - (sr1 + i*si1)*I)*(H - (sr2 + i*si2)*I) */ /* scaling to avoid overflows and most underflows. It */ /* is assumed that either */ /* 1) sr1 = sr2 and si1 = -si2 */ /* or */ /* 2) si1 = si2 = 0. */ /* This is useful for starting double implicit shift bulges */ /* in the QR algorithm. */ /* N (input) integer */ /* Order of the matrix H. N must be either 2 or 3. */ /* H (input) DOUBLE PRECISION array of dimension (LDH,N) */ /* The 2-by-2 or 3-by-3 matrix H in (*). */ /* LDH (input) integer */ /* The leading dimension of H as declared in */ /* the calling procedure. LDH.GE.N */ /* SR1 (input) DOUBLE PRECISION */ /* SI1 The shifts in (*). */ /* SR2 */ /* SI2 */ /* V (output) DOUBLE PRECISION array of dimension N */ /* A scalar multiple of the first column of the */ /* matrix K in (*). */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --v; /* Function Body */ if (*n == 2) { s = (d__1 = h__[h_dim1 + 1] - *sr2, abs(d__1)) + abs(*si2) + (d__2 = h__[h_dim1 + 2], abs(d__2)); if (s == 0.) { v[1] = 0.; v[2] = 0.; } else { h21s = h__[h_dim1 + 2] / s; v[1] = h21s * h__[(h_dim1 << 1) + 1] + (h__[h_dim1 + 1] - *sr1) * ((h__[h_dim1 + 1] - *sr2) / s) - *si1 * (*si2 / s); v[2] = h21s * (h__[h_dim1 + 1] + h__[(h_dim1 << 1) + 2] - *sr1 - * sr2); } } else { s = (d__1 = h__[h_dim1 + 1] - *sr2, abs(d__1)) + abs(*si2) + (d__2 = h__[h_dim1 + 2], abs(d__2)) + (d__3 = h__[h_dim1 + 3], abs( d__3)); if (s == 0.) { v[1] = 0.; v[2] = 0.; v[3] = 0.; } else { h21s = h__[h_dim1 + 2] / s; h31s = h__[h_dim1 + 3] / s; v[1] = (h__[h_dim1 + 1] - *sr1) * ((h__[h_dim1 + 1] - *sr2) / s) - *si1 * (*si2 / s) + h__[(h_dim1 << 1) + 1] * h21s + h__[ h_dim1 * 3 + 1] * h31s; v[2] = h21s * (h__[h_dim1 + 1] + h__[(h_dim1 << 1) + 2] - *sr1 - * sr2) + h__[h_dim1 * 3 + 2] * h31s; v[3] = h31s * (h__[h_dim1 + 1] + h__[h_dim1 * 3 + 3] - *sr1 - * sr2) + h21s * h__[(h_dim1 << 1) + 3]; } } return 0; } /* _starpu_dlaqr1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqr2.c000066400000000000000000000531401413463044200205360ustar00rootroot00000000000000/* dlaqr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b12 = 0.; static doublereal c_b13 = 1.; static logical c_true = TRUE_; /* Subroutine */ int _starpu_dlaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork) { /* System generated locals */ integer h_dim1, h_offset, t_dim1, t_offset, v_dim1, v_offset, wv_dim1, wv_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal s, aa, bb, cc, dd, cs, sn; integer jw; doublereal evi, evk, foo; integer kln; doublereal tau, ulp; integer lwk1, lwk2; doublereal beta; integer kend, kcol, info, ifst, ilst, ltop, krow; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dgemm_(char *, char *, integer *, integer * , integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical bulge; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer infqr, kwtop; extern /* Subroutine */ int _starpu_dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlabad_( doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmax; extern /* Subroutine */ int _starpu_dtrexc_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), _starpu_dormhr_(char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical sorted; doublereal smlnum; integer lwkopt; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* -- April 2009 -- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* This subroutine is identical to DLAQR3 except that it avoids */ /* recursion by calling DLAHQR instead of DLAQR4. */ /* ****************************************************************** */ /* Aggressive early deflation: */ /* This subroutine accepts as input an upper Hessenberg matrix */ /* H and performs an orthogonal similarity transformation */ /* designed to detect and deflate fully converged eigenvalues from */ /* a trailing principal submatrix. On output H has been over- */ /* written by a new Hessenberg matrix that is a perturbation of */ /* an orthogonal similarity transformation of H. It is to be */ /* hoped that the final version of H has many zero subdiagonal */ /* entries. */ /* ****************************************************************** */ /* WANTT (input) LOGICAL */ /* If .TRUE., then the Hessenberg matrix H is fully updated */ /* so that the quasi-triangular Schur factor may be */ /* computed (in cooperation with the calling subroutine). */ /* If .FALSE., then only enough of H is updated to preserve */ /* the eigenvalues. */ /* WANTZ (input) LOGICAL */ /* If .TRUE., then the orthogonal matrix Z is updated so */ /* so that the orthogonal Schur factor may be computed */ /* (in cooperation with the calling subroutine). */ /* If .FALSE., then Z is not referenced. */ /* N (input) INTEGER */ /* The order of the matrix H and (if WANTZ is .TRUE.) the */ /* order of the orthogonal matrix Z. */ /* KTOP (input) INTEGER */ /* It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0. */ /* KBOT and KTOP together determine an isolated block */ /* along the diagonal of the Hessenberg matrix. */ /* KBOT (input) INTEGER */ /* It is assumed without a check that either */ /* KBOT = N or H(KBOT+1,KBOT)=0. KBOT and KTOP together */ /* determine an isolated block along the diagonal of the */ /* Hessenberg matrix. */ /* NW (input) INTEGER */ /* Deflation window size. 1 .LE. NW .LE. (KBOT-KTOP+1). */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH,N) */ /* On input the initial N-by-N section of H stores the */ /* Hessenberg matrix undergoing aggressive early deflation. */ /* On output H has been transformed by an orthogonal */ /* similarity transformation, perturbed, and the returned */ /* to Hessenberg form that (it is to be hoped) has some */ /* zero subdiagonal entries. */ /* LDH (input) integer */ /* Leading dimension of H just as declared in the calling */ /* subroutine. N .LE. LDH */ /* ILOZ (input) INTEGER */ /* IHIZ (input) INTEGER */ /* Specify the rows of Z to which transformations must be */ /* applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* IF WANTZ is .TRUE., then on output, the orthogonal */ /* similarity transformation mentioned above has been */ /* accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right. */ /* If WANTZ is .FALSE., then Z is unreferenced. */ /* LDZ (input) integer */ /* The leading dimension of Z just as declared in the */ /* calling subroutine. 1 .LE. LDZ. */ /* NS (output) integer */ /* The number of unconverged (ie approximate) eigenvalues */ /* returned in SR and SI that may be used as shifts by the */ /* calling subroutine. */ /* ND (output) integer */ /* The number of converged eigenvalues uncovered by this */ /* subroutine. */ /* SR (output) DOUBLE PRECISION array, dimension KBOT */ /* SI (output) DOUBLE PRECISION array, dimension KBOT */ /* On output, the real and imaginary parts of approximate */ /* eigenvalues that may be used for shifts are stored in */ /* SR(KBOT-ND-NS+1) through SR(KBOT-ND) and */ /* SI(KBOT-ND-NS+1) through SI(KBOT-ND), respectively. */ /* The real and imaginary parts of converged eigenvalues */ /* are stored in SR(KBOT-ND+1) through SR(KBOT) and */ /* SI(KBOT-ND+1) through SI(KBOT), respectively. */ /* V (workspace) DOUBLE PRECISION array, dimension (LDV,NW) */ /* An NW-by-NW work array. */ /* LDV (input) integer scalar */ /* The leading dimension of V just as declared in the */ /* calling subroutine. NW .LE. LDV */ /* NH (input) integer scalar */ /* The number of columns of T. NH.GE.NW. */ /* T (workspace) DOUBLE PRECISION array, dimension (LDT,NW) */ /* LDT (input) integer */ /* The leading dimension of T just as declared in the */ /* calling subroutine. NW .LE. LDT */ /* NV (input) integer */ /* The number of rows of work array WV available for */ /* workspace. NV.GE.NW. */ /* WV (workspace) DOUBLE PRECISION array, dimension (LDWV,NW) */ /* LDWV (input) integer */ /* The leading dimension of W just as declared in the */ /* calling subroutine. NW .LE. LDV */ /* WORK (workspace) DOUBLE PRECISION array, dimension LWORK. */ /* On exit, WORK(1) is set to an estimate of the optimal value */ /* of LWORK for the given values of N, NW, KTOP and KBOT. */ /* LWORK (input) integer */ /* The dimension of the work array WORK. LWORK = 2*NW */ /* suffices, but greater efficiency may result from larger */ /* values of LWORK. */ /* If LWORK = -1, then a workspace query is assumed; DLAQR2 */ /* only estimates the optimal workspace size for the given */ /* values of N, NW, KTOP and KBOT. The estimate is returned */ /* in WORK(1). No error message related to LWORK is issued */ /* by XERBLA. Neither H nor Z are accessed. */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* ==== Estimate optimal workspace. ==== */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --sr; --si; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; wv_dim1 = *ldwv; wv_offset = 1 + wv_dim1; wv -= wv_offset; --work; /* Function Body */ /* Computing MIN */ i__1 = *nw, i__2 = *kbot - *ktop + 1; jw = min(i__1,i__2); if (jw <= 2) { lwkopt = 1; } else { /* ==== Workspace query call to DGEHRD ==== */ i__1 = jw - 1; _starpu_dgehrd_(&jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &work[1], & c_n1, &info); lwk1 = (integer) work[1]; /* ==== Workspace query call to DORMHR ==== */ i__1 = jw - 1; _starpu_dormhr_("R", "N", &jw, &jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, &work[1], &c_n1, &info); lwk2 = (integer) work[1]; /* ==== Optimal workspace ==== */ lwkopt = jw + max(lwk1,lwk2); } /* ==== Quick return in case of workspace query. ==== */ if (*lwork == -1) { work[1] = (doublereal) lwkopt; return 0; } /* ==== Nothing to do ... */ /* ... for an empty active block ... ==== */ *ns = 0; *nd = 0; work[1] = 1.; if (*ktop > *kbot) { return 0; } /* ... nor for an empty deflation window. ==== */ if (*nw < 1) { return 0; } /* ==== Machine constants ==== */ safmin = _starpu_dlamch_("SAFE MINIMUM"); safmax = 1. / safmin; _starpu_dlabad_(&safmin, &safmax); ulp = _starpu_dlamch_("PRECISION"); smlnum = safmin * ((doublereal) (*n) / ulp); /* ==== Setup deflation window ==== */ /* Computing MIN */ i__1 = *nw, i__2 = *kbot - *ktop + 1; jw = min(i__1,i__2); kwtop = *kbot - jw + 1; if (kwtop == *ktop) { s = 0.; } else { s = h__[kwtop + (kwtop - 1) * h_dim1]; } if (*kbot == kwtop) { /* ==== 1-by-1 deflation window: not much to do ==== */ sr[kwtop] = h__[kwtop + kwtop * h_dim1]; si[kwtop] = 0.; *ns = 1; *nd = 0; /* Computing MAX */ d__2 = smlnum, d__3 = ulp * (d__1 = h__[kwtop + kwtop * h_dim1], abs( d__1)); if (abs(s) <= max(d__2,d__3)) { *ns = 0; *nd = 1; if (kwtop > *ktop) { h__[kwtop + (kwtop - 1) * h_dim1] = 0.; } } work[1] = 1.; return 0; } /* ==== Convert to spike-triangular form. (In case of a */ /* . rare QR failure, this routine continues to do */ /* . aggressive early deflation using that part of */ /* . the deflation window that converged using INFQR */ /* . here and there to keep track.) ==== */ _starpu_dlacpy_("U", &jw, &jw, &h__[kwtop + kwtop * h_dim1], ldh, &t[t_offset], ldt); i__1 = jw - 1; i__2 = *ldh + 1; i__3 = *ldt + 1; _starpu_dcopy_(&i__1, &h__[kwtop + 1 + kwtop * h_dim1], &i__2, &t[t_dim1 + 2], & i__3); _starpu_dlaset_("A", &jw, &jw, &c_b12, &c_b13, &v[v_offset], ldv); _starpu_dlahqr_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[kwtop], &si[kwtop], &c__1, &jw, &v[v_offset], ldv, &infqr); /* ==== DTREXC needs a clean margin near the diagonal ==== */ i__1 = jw - 3; for (j = 1; j <= i__1; ++j) { t[j + 2 + j * t_dim1] = 0.; t[j + 3 + j * t_dim1] = 0.; /* L10: */ } if (jw > 2) { t[jw + (jw - 2) * t_dim1] = 0.; } /* ==== Deflation detection loop ==== */ *ns = jw; ilst = infqr + 1; L20: if (ilst <= *ns) { if (*ns == 1) { bulge = FALSE_; } else { bulge = t[*ns + (*ns - 1) * t_dim1] != 0.; } /* ==== Small spike tip test for deflation ==== */ if (! bulge) { /* ==== Real eigenvalue ==== */ foo = (d__1 = t[*ns + *ns * t_dim1], abs(d__1)); if (foo == 0.) { foo = abs(s); } /* Computing MAX */ d__2 = smlnum, d__3 = ulp * foo; if ((d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)) <= max(d__2,d__3)) { /* ==== Deflatable ==== */ --(*ns); } else { /* ==== Undeflatable. Move it up out of the way. */ /* . (DTREXC can not fail in this case.) ==== */ ifst = *ns; _starpu_dtrexc_("V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], &info); ++ilst; } } else { /* ==== Complex conjugate pair ==== */ foo = (d__3 = t[*ns + *ns * t_dim1], abs(d__3)) + sqrt((d__1 = t[* ns + (*ns - 1) * t_dim1], abs(d__1))) * sqrt((d__2 = t[* ns - 1 + *ns * t_dim1], abs(d__2))); if (foo == 0.) { foo = abs(s); } /* Computing MAX */ d__3 = (d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)), d__4 = (d__2 = s * v[(*ns - 1) * v_dim1 + 1], abs(d__2)); /* Computing MAX */ d__5 = smlnum, d__6 = ulp * foo; if (max(d__3,d__4) <= max(d__5,d__6)) { /* ==== Deflatable ==== */ *ns += -2; } else { /* ==== Undeflatable. Move them up out of the way. */ /* . Fortunately, DTREXC does the right thing with */ /* . ILST in case of a rare exchange failure. ==== */ ifst = *ns; _starpu_dtrexc_("V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], &info); ilst += 2; } } /* ==== End deflation detection loop ==== */ goto L20; } /* ==== Return to Hessenberg form ==== */ if (*ns == 0) { s = 0.; } if (*ns < jw) { /* ==== sorting diagonal blocks of T improves accuracy for */ /* . graded matrices. Bubble sort deals well with */ /* . exchange failures. ==== */ sorted = FALSE_; i__ = *ns + 1; L30: if (sorted) { goto L50; } sorted = TRUE_; kend = i__ - 1; i__ = infqr + 1; if (i__ == *ns) { k = i__ + 1; } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { k = i__ + 1; } else { k = i__ + 2; } L40: if (k <= kend) { if (k == i__ + 1) { evi = (d__1 = t[i__ + i__ * t_dim1], abs(d__1)); } else { evi = (d__3 = t[i__ + i__ * t_dim1], abs(d__3)) + sqrt((d__1 = t[i__ + 1 + i__ * t_dim1], abs(d__1))) * sqrt((d__2 = t[i__ + (i__ + 1) * t_dim1], abs(d__2))); } if (k == kend) { evk = (d__1 = t[k + k * t_dim1], abs(d__1)); } else if (t[k + 1 + k * t_dim1] == 0.) { evk = (d__1 = t[k + k * t_dim1], abs(d__1)); } else { evk = (d__3 = t[k + k * t_dim1], abs(d__3)) + sqrt((d__1 = t[ k + 1 + k * t_dim1], abs(d__1))) * sqrt((d__2 = t[k + (k + 1) * t_dim1], abs(d__2))); } if (evi >= evk) { i__ = k; } else { sorted = FALSE_; ifst = i__; ilst = k; _starpu_dtrexc_("V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], &info); if (info == 0) { i__ = ilst; } else { i__ = k; } } if (i__ == kend) { k = i__ + 1; } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { k = i__ + 1; } else { k = i__ + 2; } goto L40; } goto L30; L50: ; } /* ==== Restore shift/eigenvalue array from T ==== */ i__ = jw; L60: if (i__ >= infqr + 1) { if (i__ == infqr + 1) { sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; si[kwtop + i__ - 1] = 0.; --i__; } else if (t[i__ + (i__ - 1) * t_dim1] == 0.) { sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; si[kwtop + i__ - 1] = 0.; --i__; } else { aa = t[i__ - 1 + (i__ - 1) * t_dim1]; cc = t[i__ + (i__ - 1) * t_dim1]; bb = t[i__ - 1 + i__ * t_dim1]; dd = t[i__ + i__ * t_dim1]; _starpu_dlanv2_(&aa, &bb, &cc, &dd, &sr[kwtop + i__ - 2], &si[kwtop + i__ - 2], &sr[kwtop + i__ - 1], &si[kwtop + i__ - 1], &cs, & sn); i__ += -2; } goto L60; } if (*ns < jw || s == 0.) { if (*ns > 1 && s != 0.) { /* ==== Reflect spike back into lower triangle ==== */ _starpu_dcopy_(ns, &v[v_offset], ldv, &work[1], &c__1); beta = work[1]; _starpu_dlarfg_(ns, &beta, &work[2], &c__1, &tau); work[1] = 1.; i__1 = jw - 2; i__2 = jw - 2; _starpu_dlaset_("L", &i__1, &i__2, &c_b12, &c_b12, &t[t_dim1 + 3], ldt); _starpu_dlarf_("L", ns, &jw, &work[1], &c__1, &tau, &t[t_offset], ldt, & work[jw + 1]); _starpu_dlarf_("R", ns, ns, &work[1], &c__1, &tau, &t[t_offset], ldt, & work[jw + 1]); _starpu_dlarf_("R", &jw, ns, &work[1], &c__1, &tau, &v[v_offset], ldv, & work[jw + 1]); i__1 = *lwork - jw; _starpu_dgehrd_(&jw, &c__1, ns, &t[t_offset], ldt, &work[1], &work[jw + 1] , &i__1, &info); } /* ==== Copy updated reduced window into place ==== */ if (kwtop > 1) { h__[kwtop + (kwtop - 1) * h_dim1] = s * v[v_dim1 + 1]; } _starpu_dlacpy_("U", &jw, &jw, &t[t_offset], ldt, &h__[kwtop + kwtop * h_dim1] , ldh); i__1 = jw - 1; i__2 = *ldt + 1; i__3 = *ldh + 1; _starpu_dcopy_(&i__1, &t[t_dim1 + 2], &i__2, &h__[kwtop + 1 + kwtop * h_dim1], &i__3); /* ==== Accumulate orthogonal matrix in order update */ /* . H and Z, if requested. ==== */ if (*ns > 1 && s != 0.) { i__1 = *lwork - jw; _starpu_dormhr_("R", "N", &jw, ns, &c__1, ns, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, &work[jw + 1], &i__1, &info); } /* ==== Update vertical slab in H ==== */ if (*wantt) { ltop = 1; } else { ltop = *ktop; } i__1 = kwtop - 1; i__2 = *nv; for (krow = ltop; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { /* Computing MIN */ i__3 = *nv, i__4 = kwtop - krow; kln = min(i__3,i__4); _starpu_dgemm_("N", "N", &kln, &jw, &jw, &c_b13, &h__[krow + kwtop * h_dim1], ldh, &v[v_offset], ldv, &c_b12, &wv[wv_offset], ldwv); _starpu_dlacpy_("A", &kln, &jw, &wv[wv_offset], ldwv, &h__[krow + kwtop * h_dim1], ldh); /* L70: */ } /* ==== Update horizontal slab in H ==== */ if (*wantt) { i__2 = *n; i__1 = *nh; for (kcol = *kbot + 1; i__1 < 0 ? kcol >= i__2 : kcol <= i__2; kcol += i__1) { /* Computing MIN */ i__3 = *nh, i__4 = *n - kcol + 1; kln = min(i__3,i__4); _starpu_dgemm_("C", "N", &jw, &kln, &jw, &c_b13, &v[v_offset], ldv, & h__[kwtop + kcol * h_dim1], ldh, &c_b12, &t[t_offset], ldt); _starpu_dlacpy_("A", &jw, &kln, &t[t_offset], ldt, &h__[kwtop + kcol * h_dim1], ldh); /* L80: */ } } /* ==== Update vertical slab in Z ==== */ if (*wantz) { i__1 = *ihiz; i__2 = *nv; for (krow = *iloz; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { /* Computing MIN */ i__3 = *nv, i__4 = *ihiz - krow + 1; kln = min(i__3,i__4); _starpu_dgemm_("N", "N", &kln, &jw, &jw, &c_b13, &z__[krow + kwtop * z_dim1], ldz, &v[v_offset], ldv, &c_b12, &wv[ wv_offset], ldwv); _starpu_dlacpy_("A", &kln, &jw, &wv[wv_offset], ldwv, &z__[krow + kwtop * z_dim1], ldz); /* L90: */ } } } /* ==== Return the number of deflations ... ==== */ *nd = jw - *ns; /* ==== ... and the number of shifts. (Subtracting */ /* . INFQR from the spike length takes care */ /* . of the case of a rare QR failure while */ /* . calculating eigenvalues of the deflation */ /* . window.) ==== */ *ns -= infqr; /* ==== Return optimal workspace. ==== */ work[1] = (doublereal) lwkopt; /* ==== End of DLAQR2 ==== */ return 0; } /* _starpu_dlaqr2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqr3.c000066400000000000000000000545321413463044200205450ustar00rootroot00000000000000/* dlaqr3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static logical c_true = TRUE_; static doublereal c_b17 = 0.; static doublereal c_b18 = 1.; static integer c__12 = 12; /* Subroutine */ int _starpu_dlaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork) { /* System generated locals */ integer h_dim1, h_offset, t_dim1, t_offset, v_dim1, v_offset, wv_dim1, wv_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal s, aa, bb, cc, dd, cs, sn; integer jw; doublereal evi, evk, foo; integer kln; doublereal tau, ulp; integer lwk1, lwk2, lwk3; doublereal beta; integer kend, kcol, info, nmin, ifst, ilst, ltop, krow; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dgemm_(char *, char *, integer *, integer * , integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical bulge; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer infqr, kwtop; extern /* Subroutine */ int _starpu_dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaqr4_( logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); doublereal safmax; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dtrexc_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), _starpu_dormhr_(char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical sorted; doublereal smlnum; integer lwkopt; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* -- April 2009 -- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* ****************************************************************** */ /* Aggressive early deflation: */ /* This subroutine accepts as input an upper Hessenberg matrix */ /* H and performs an orthogonal similarity transformation */ /* designed to detect and deflate fully converged eigenvalues from */ /* a trailing principal submatrix. On output H has been over- */ /* written by a new Hessenberg matrix that is a perturbation of */ /* an orthogonal similarity transformation of H. It is to be */ /* hoped that the final version of H has many zero subdiagonal */ /* entries. */ /* ****************************************************************** */ /* WANTT (input) LOGICAL */ /* If .TRUE., then the Hessenberg matrix H is fully updated */ /* so that the quasi-triangular Schur factor may be */ /* computed (in cooperation with the calling subroutine). */ /* If .FALSE., then only enough of H is updated to preserve */ /* the eigenvalues. */ /* WANTZ (input) LOGICAL */ /* If .TRUE., then the orthogonal matrix Z is updated so */ /* so that the orthogonal Schur factor may be computed */ /* (in cooperation with the calling subroutine). */ /* If .FALSE., then Z is not referenced. */ /* N (input) INTEGER */ /* The order of the matrix H and (if WANTZ is .TRUE.) the */ /* order of the orthogonal matrix Z. */ /* KTOP (input) INTEGER */ /* It is assumed that either KTOP = 1 or H(KTOP,KTOP-1)=0. */ /* KBOT and KTOP together determine an isolated block */ /* along the diagonal of the Hessenberg matrix. */ /* KBOT (input) INTEGER */ /* It is assumed without a check that either */ /* KBOT = N or H(KBOT+1,KBOT)=0. KBOT and KTOP together */ /* determine an isolated block along the diagonal of the */ /* Hessenberg matrix. */ /* NW (input) INTEGER */ /* Deflation window size. 1 .LE. NW .LE. (KBOT-KTOP+1). */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH,N) */ /* On input the initial N-by-N section of H stores the */ /* Hessenberg matrix undergoing aggressive early deflation. */ /* On output H has been transformed by an orthogonal */ /* similarity transformation, perturbed, and the returned */ /* to Hessenberg form that (it is to be hoped) has some */ /* zero subdiagonal entries. */ /* LDH (input) integer */ /* Leading dimension of H just as declared in the calling */ /* subroutine. N .LE. LDH */ /* ILOZ (input) INTEGER */ /* IHIZ (input) INTEGER */ /* Specify the rows of Z to which transformations must be */ /* applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* IF WANTZ is .TRUE., then on output, the orthogonal */ /* similarity transformation mentioned above has been */ /* accumulated into Z(ILOZ:IHIZ,ILO:IHI) from the right. */ /* If WANTZ is .FALSE., then Z is unreferenced. */ /* LDZ (input) integer */ /* The leading dimension of Z just as declared in the */ /* calling subroutine. 1 .LE. LDZ. */ /* NS (output) integer */ /* The number of unconverged (ie approximate) eigenvalues */ /* returned in SR and SI that may be used as shifts by the */ /* calling subroutine. */ /* ND (output) integer */ /* The number of converged eigenvalues uncovered by this */ /* subroutine. */ /* SR (output) DOUBLE PRECISION array, dimension KBOT */ /* SI (output) DOUBLE PRECISION array, dimension KBOT */ /* On output, the real and imaginary parts of approximate */ /* eigenvalues that may be used for shifts are stored in */ /* SR(KBOT-ND-NS+1) through SR(KBOT-ND) and */ /* SI(KBOT-ND-NS+1) through SI(KBOT-ND), respectively. */ /* The real and imaginary parts of converged eigenvalues */ /* are stored in SR(KBOT-ND+1) through SR(KBOT) and */ /* SI(KBOT-ND+1) through SI(KBOT), respectively. */ /* V (workspace) DOUBLE PRECISION array, dimension (LDV,NW) */ /* An NW-by-NW work array. */ /* LDV (input) integer scalar */ /* The leading dimension of V just as declared in the */ /* calling subroutine. NW .LE. LDV */ /* NH (input) integer scalar */ /* The number of columns of T. NH.GE.NW. */ /* T (workspace) DOUBLE PRECISION array, dimension (LDT,NW) */ /* LDT (input) integer */ /* The leading dimension of T just as declared in the */ /* calling subroutine. NW .LE. LDT */ /* NV (input) integer */ /* The number of rows of work array WV available for */ /* workspace. NV.GE.NW. */ /* WV (workspace) DOUBLE PRECISION array, dimension (LDWV,NW) */ /* LDWV (input) integer */ /* The leading dimension of W just as declared in the */ /* calling subroutine. NW .LE. LDV */ /* WORK (workspace) DOUBLE PRECISION array, dimension LWORK. */ /* On exit, WORK(1) is set to an estimate of the optimal value */ /* of LWORK for the given values of N, NW, KTOP and KBOT. */ /* LWORK (input) integer */ /* The dimension of the work array WORK. LWORK = 2*NW */ /* suffices, but greater efficiency may result from larger */ /* values of LWORK. */ /* If LWORK = -1, then a workspace query is assumed; DLAQR3 */ /* only estimates the optimal workspace size for the given */ /* values of N, NW, KTOP and KBOT. The estimate is returned */ /* in WORK(1). No error message related to LWORK is issued */ /* by XERBLA. Neither H nor Z are accessed. */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* ==== Estimate optimal workspace. ==== */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --sr; --si; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; wv_dim1 = *ldwv; wv_offset = 1 + wv_dim1; wv -= wv_offset; --work; /* Function Body */ /* Computing MIN */ i__1 = *nw, i__2 = *kbot - *ktop + 1; jw = min(i__1,i__2); if (jw <= 2) { lwkopt = 1; } else { /* ==== Workspace query call to DGEHRD ==== */ i__1 = jw - 1; _starpu_dgehrd_(&jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &work[1], & c_n1, &info); lwk1 = (integer) work[1]; /* ==== Workspace query call to DORMHR ==== */ i__1 = jw - 1; _starpu_dormhr_("R", "N", &jw, &jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, &work[1], &c_n1, &info); lwk2 = (integer) work[1]; /* ==== Workspace query call to DLAQR4 ==== */ _starpu_dlaqr4_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[1], &si[1], &c__1, &jw, &v[v_offset], ldv, &work[1], &c_n1, & infqr); lwk3 = (integer) work[1]; /* ==== Optimal workspace ==== */ /* Computing MAX */ i__1 = jw + max(lwk1,lwk2); lwkopt = max(i__1,lwk3); } /* ==== Quick return in case of workspace query. ==== */ if (*lwork == -1) { work[1] = (doublereal) lwkopt; return 0; } /* ==== Nothing to do ... */ /* ... for an empty active block ... ==== */ *ns = 0; *nd = 0; work[1] = 1.; if (*ktop > *kbot) { return 0; } /* ... nor for an empty deflation window. ==== */ if (*nw < 1) { return 0; } /* ==== Machine constants ==== */ safmin = _starpu_dlamch_("SAFE MINIMUM"); safmax = 1. / safmin; _starpu_dlabad_(&safmin, &safmax); ulp = _starpu_dlamch_("PRECISION"); smlnum = safmin * ((doublereal) (*n) / ulp); /* ==== Setup deflation window ==== */ /* Computing MIN */ i__1 = *nw, i__2 = *kbot - *ktop + 1; jw = min(i__1,i__2); kwtop = *kbot - jw + 1; if (kwtop == *ktop) { s = 0.; } else { s = h__[kwtop + (kwtop - 1) * h_dim1]; } if (*kbot == kwtop) { /* ==== 1-by-1 deflation window: not much to do ==== */ sr[kwtop] = h__[kwtop + kwtop * h_dim1]; si[kwtop] = 0.; *ns = 1; *nd = 0; /* Computing MAX */ d__2 = smlnum, d__3 = ulp * (d__1 = h__[kwtop + kwtop * h_dim1], abs( d__1)); if (abs(s) <= max(d__2,d__3)) { *ns = 0; *nd = 1; if (kwtop > *ktop) { h__[kwtop + (kwtop - 1) * h_dim1] = 0.; } } work[1] = 1.; return 0; } /* ==== Convert to spike-triangular form. (In case of a */ /* . rare QR failure, this routine continues to do */ /* . aggressive early deflation using that part of */ /* . the deflation window that converged using INFQR */ /* . here and there to keep track.) ==== */ _starpu_dlacpy_("U", &jw, &jw, &h__[kwtop + kwtop * h_dim1], ldh, &t[t_offset], ldt); i__1 = jw - 1; i__2 = *ldh + 1; i__3 = *ldt + 1; _starpu_dcopy_(&i__1, &h__[kwtop + 1 + kwtop * h_dim1], &i__2, &t[t_dim1 + 2], & i__3); _starpu_dlaset_("A", &jw, &jw, &c_b17, &c_b18, &v[v_offset], ldv); nmin = _starpu_ilaenv_(&c__12, "DLAQR3", "SV", &jw, &c__1, &jw, lwork); if (jw > nmin) { _starpu_dlaqr4_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[ kwtop], &si[kwtop], &c__1, &jw, &v[v_offset], ldv, &work[1], lwork, &infqr); } else { _starpu_dlahqr_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[ kwtop], &si[kwtop], &c__1, &jw, &v[v_offset], ldv, &infqr); } /* ==== DTREXC needs a clean margin near the diagonal ==== */ i__1 = jw - 3; for (j = 1; j <= i__1; ++j) { t[j + 2 + j * t_dim1] = 0.; t[j + 3 + j * t_dim1] = 0.; /* L10: */ } if (jw > 2) { t[jw + (jw - 2) * t_dim1] = 0.; } /* ==== Deflation detection loop ==== */ *ns = jw; ilst = infqr + 1; L20: if (ilst <= *ns) { if (*ns == 1) { bulge = FALSE_; } else { bulge = t[*ns + (*ns - 1) * t_dim1] != 0.; } /* ==== Small spike tip test for deflation ==== */ if (! bulge) { /* ==== Real eigenvalue ==== */ foo = (d__1 = t[*ns + *ns * t_dim1], abs(d__1)); if (foo == 0.) { foo = abs(s); } /* Computing MAX */ d__2 = smlnum, d__3 = ulp * foo; if ((d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)) <= max(d__2,d__3)) { /* ==== Deflatable ==== */ --(*ns); } else { /* ==== Undeflatable. Move it up out of the way. */ /* . (DTREXC can not fail in this case.) ==== */ ifst = *ns; _starpu_dtrexc_("V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], &info); ++ilst; } } else { /* ==== Complex conjugate pair ==== */ foo = (d__3 = t[*ns + *ns * t_dim1], abs(d__3)) + sqrt((d__1 = t[* ns + (*ns - 1) * t_dim1], abs(d__1))) * sqrt((d__2 = t[* ns - 1 + *ns * t_dim1], abs(d__2))); if (foo == 0.) { foo = abs(s); } /* Computing MAX */ d__3 = (d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)), d__4 = (d__2 = s * v[(*ns - 1) * v_dim1 + 1], abs(d__2)); /* Computing MAX */ d__5 = smlnum, d__6 = ulp * foo; if (max(d__3,d__4) <= max(d__5,d__6)) { /* ==== Deflatable ==== */ *ns += -2; } else { /* ==== Undeflatable. Move them up out of the way. */ /* . Fortunately, DTREXC does the right thing with */ /* . ILST in case of a rare exchange failure. ==== */ ifst = *ns; _starpu_dtrexc_("V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], &info); ilst += 2; } } /* ==== End deflation detection loop ==== */ goto L20; } /* ==== Return to Hessenberg form ==== */ if (*ns == 0) { s = 0.; } if (*ns < jw) { /* ==== sorting diagonal blocks of T improves accuracy for */ /* . graded matrices. Bubble sort deals well with */ /* . exchange failures. ==== */ sorted = FALSE_; i__ = *ns + 1; L30: if (sorted) { goto L50; } sorted = TRUE_; kend = i__ - 1; i__ = infqr + 1; if (i__ == *ns) { k = i__ + 1; } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { k = i__ + 1; } else { k = i__ + 2; } L40: if (k <= kend) { if (k == i__ + 1) { evi = (d__1 = t[i__ + i__ * t_dim1], abs(d__1)); } else { evi = (d__3 = t[i__ + i__ * t_dim1], abs(d__3)) + sqrt((d__1 = t[i__ + 1 + i__ * t_dim1], abs(d__1))) * sqrt((d__2 = t[i__ + (i__ + 1) * t_dim1], abs(d__2))); } if (k == kend) { evk = (d__1 = t[k + k * t_dim1], abs(d__1)); } else if (t[k + 1 + k * t_dim1] == 0.) { evk = (d__1 = t[k + k * t_dim1], abs(d__1)); } else { evk = (d__3 = t[k + k * t_dim1], abs(d__3)) + sqrt((d__1 = t[ k + 1 + k * t_dim1], abs(d__1))) * sqrt((d__2 = t[k + (k + 1) * t_dim1], abs(d__2))); } if (evi >= evk) { i__ = k; } else { sorted = FALSE_; ifst = i__; ilst = k; _starpu_dtrexc_("V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], &info); if (info == 0) { i__ = ilst; } else { i__ = k; } } if (i__ == kend) { k = i__ + 1; } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { k = i__ + 1; } else { k = i__ + 2; } goto L40; } goto L30; L50: ; } /* ==== Restore shift/eigenvalue array from T ==== */ i__ = jw; L60: if (i__ >= infqr + 1) { if (i__ == infqr + 1) { sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; si[kwtop + i__ - 1] = 0.; --i__; } else if (t[i__ + (i__ - 1) * t_dim1] == 0.) { sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; si[kwtop + i__ - 1] = 0.; --i__; } else { aa = t[i__ - 1 + (i__ - 1) * t_dim1]; cc = t[i__ + (i__ - 1) * t_dim1]; bb = t[i__ - 1 + i__ * t_dim1]; dd = t[i__ + i__ * t_dim1]; _starpu_dlanv2_(&aa, &bb, &cc, &dd, &sr[kwtop + i__ - 2], &si[kwtop + i__ - 2], &sr[kwtop + i__ - 1], &si[kwtop + i__ - 1], &cs, & sn); i__ += -2; } goto L60; } if (*ns < jw || s == 0.) { if (*ns > 1 && s != 0.) { /* ==== Reflect spike back into lower triangle ==== */ _starpu_dcopy_(ns, &v[v_offset], ldv, &work[1], &c__1); beta = work[1]; _starpu_dlarfg_(ns, &beta, &work[2], &c__1, &tau); work[1] = 1.; i__1 = jw - 2; i__2 = jw - 2; _starpu_dlaset_("L", &i__1, &i__2, &c_b17, &c_b17, &t[t_dim1 + 3], ldt); _starpu_dlarf_("L", ns, &jw, &work[1], &c__1, &tau, &t[t_offset], ldt, & work[jw + 1]); _starpu_dlarf_("R", ns, ns, &work[1], &c__1, &tau, &t[t_offset], ldt, & work[jw + 1]); _starpu_dlarf_("R", &jw, ns, &work[1], &c__1, &tau, &v[v_offset], ldv, & work[jw + 1]); i__1 = *lwork - jw; _starpu_dgehrd_(&jw, &c__1, ns, &t[t_offset], ldt, &work[1], &work[jw + 1] , &i__1, &info); } /* ==== Copy updated reduced window into place ==== */ if (kwtop > 1) { h__[kwtop + (kwtop - 1) * h_dim1] = s * v[v_dim1 + 1]; } _starpu_dlacpy_("U", &jw, &jw, &t[t_offset], ldt, &h__[kwtop + kwtop * h_dim1] , ldh); i__1 = jw - 1; i__2 = *ldt + 1; i__3 = *ldh + 1; _starpu_dcopy_(&i__1, &t[t_dim1 + 2], &i__2, &h__[kwtop + 1 + kwtop * h_dim1], &i__3); /* ==== Accumulate orthogonal matrix in order update */ /* . H and Z, if requested. ==== */ if (*ns > 1 && s != 0.) { i__1 = *lwork - jw; _starpu_dormhr_("R", "N", &jw, ns, &c__1, ns, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, &work[jw + 1], &i__1, &info); } /* ==== Update vertical slab in H ==== */ if (*wantt) { ltop = 1; } else { ltop = *ktop; } i__1 = kwtop - 1; i__2 = *nv; for (krow = ltop; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { /* Computing MIN */ i__3 = *nv, i__4 = kwtop - krow; kln = min(i__3,i__4); _starpu_dgemm_("N", "N", &kln, &jw, &jw, &c_b18, &h__[krow + kwtop * h_dim1], ldh, &v[v_offset], ldv, &c_b17, &wv[wv_offset], ldwv); _starpu_dlacpy_("A", &kln, &jw, &wv[wv_offset], ldwv, &h__[krow + kwtop * h_dim1], ldh); /* L70: */ } /* ==== Update horizontal slab in H ==== */ if (*wantt) { i__2 = *n; i__1 = *nh; for (kcol = *kbot + 1; i__1 < 0 ? kcol >= i__2 : kcol <= i__2; kcol += i__1) { /* Computing MIN */ i__3 = *nh, i__4 = *n - kcol + 1; kln = min(i__3,i__4); _starpu_dgemm_("C", "N", &jw, &kln, &jw, &c_b18, &v[v_offset], ldv, & h__[kwtop + kcol * h_dim1], ldh, &c_b17, &t[t_offset], ldt); _starpu_dlacpy_("A", &jw, &kln, &t[t_offset], ldt, &h__[kwtop + kcol * h_dim1], ldh); /* L80: */ } } /* ==== Update vertical slab in Z ==== */ if (*wantz) { i__1 = *ihiz; i__2 = *nv; for (krow = *iloz; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { /* Computing MIN */ i__3 = *nv, i__4 = *ihiz - krow + 1; kln = min(i__3,i__4); _starpu_dgemm_("N", "N", &kln, &jw, &jw, &c_b18, &z__[krow + kwtop * z_dim1], ldz, &v[v_offset], ldv, &c_b17, &wv[ wv_offset], ldwv); _starpu_dlacpy_("A", &kln, &jw, &wv[wv_offset], ldwv, &z__[krow + kwtop * z_dim1], ldz); /* L90: */ } } } /* ==== Return the number of deflations ... ==== */ *nd = jw - *ns; /* ==== ... and the number of shifts. (Subtracting */ /* . INFQR from the spike length takes care */ /* . of the case of a rare QR failure while */ /* . calculating eigenvalues of the deflation */ /* . window.) ==== */ *ns -= infqr; /* ==== Return optimal workspace. ==== */ work[1] = (doublereal) lwkopt; /* ==== End of DLAQR3 ==== */ return 0; } /* _starpu_dlaqr3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqr4.c000066400000000000000000000634111413463044200205420ustar00rootroot00000000000000/* dlaqr4.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__13 = 13; static integer c__15 = 15; static integer c_n1 = -1; static integer c__12 = 12; static integer c__14 = 14; static integer c__16 = 16; static logical c_false = FALSE_; static integer c__1 = 1; static integer c__3 = 3; /* Subroutine */ int _starpu_dlaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3, d__4; /* Local variables */ integer i__, k; doublereal aa, bb, cc, dd; integer ld; doublereal cs; integer nh, it, ks, kt; doublereal sn; integer ku, kv, ls, ns; doublereal ss; integer nw, inf, kdu, nho, nve, kwh, nsr, nwr, kwv, ndec, ndfl, kbot, nmin; doublereal swap; integer ktop; doublereal zdum[1] /* was [1][1] */; integer kacc22, itmax, nsmax, nwmax, kwtop; extern /* Subroutine */ int _starpu_dlaqr2_(logical *, logical *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaqr5_( logical *, logical *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *); integer nibble; extern /* Subroutine */ int _starpu_dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); char jbcmpz[1]; integer nwupbd; logical sorted; integer lwkopt; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* This subroutine implements one level of recursion for DLAQR0. */ /* It is a complete implementation of the small bulge multi-shift */ /* QR algorithm. It may be called by DLAQR0 and, for large enough */ /* deflation window size, it may be called by DLAQR3. This */ /* subroutine is identical to DLAQR0 except that it calls DLAQR2 */ /* instead of DLAQR3. */ /* Purpose */ /* ======= */ /* DLAQR4 computes the eigenvalues of a Hessenberg matrix H */ /* and, optionally, the matrices T and Z from the Schur decomposition */ /* H = Z T Z**T, where T is an upper quasi-triangular matrix (the */ /* Schur form), and Z is the orthogonal matrix of Schur vectors. */ /* Optionally Z may be postmultiplied into an input orthogonal */ /* matrix Q so that this routine can give the Schur factorization */ /* of a matrix A which has been reduced to the Hessenberg form H */ /* by the orthogonal matrix Q: A = Q*H*Q**T = (QZ)*T*(QZ)**T. */ /* Arguments */ /* ========= */ /* WANTT (input) LOGICAL */ /* = .TRUE. : the full Schur form T is required; */ /* = .FALSE.: only eigenvalues are required. */ /* WANTZ (input) LOGICAL */ /* = .TRUE. : the matrix of Schur vectors Z is required; */ /* = .FALSE.: Schur vectors are not required. */ /* N (input) INTEGER */ /* The order of the matrix H. N .GE. 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that H is already upper triangular in rows */ /* and columns 1:ILO-1 and IHI+1:N and, if ILO.GT.1, */ /* H(ILO,ILO-1) is zero. ILO and IHI are normally set by a */ /* previous call to DGEBAL, and then passed to DGEHRD when the */ /* matrix output by DGEBAL is reduced to Hessenberg form. */ /* Otherwise, ILO and IHI should be set to 1 and N, */ /* respectively. If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N. */ /* If N = 0, then ILO = 1 and IHI = 0. */ /* H (input/output) DOUBLE PRECISION array, dimension (LDH,N) */ /* On entry, the upper Hessenberg matrix H. */ /* On exit, if INFO = 0 and WANTT is .TRUE., then H contains */ /* the upper quasi-triangular matrix T from the Schur */ /* decomposition (the Schur form); 2-by-2 diagonal blocks */ /* (corresponding to complex conjugate pairs of eigenvalues) */ /* are returned in standard form, with H(i,i) = H(i+1,i+1) */ /* and H(i+1,i)*H(i,i+1).LT.0. If INFO = 0 and WANTT is */ /* .FALSE., then the contents of H are unspecified on exit. */ /* (The output value of H when INFO.GT.0 is given under the */ /* description of INFO below.) */ /* This subroutine may explicitly set H(i,j) = 0 for i.GT.j and */ /* j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N. */ /* LDH (input) INTEGER */ /* The leading dimension of the array H. LDH .GE. max(1,N). */ /* WR (output) DOUBLE PRECISION array, dimension (IHI) */ /* WI (output) DOUBLE PRECISION array, dimension (IHI) */ /* The real and imaginary parts, respectively, of the computed */ /* eigenvalues of H(ILO:IHI,ILO:IHI) are stored in WR(ILO:IHI) */ /* and WI(ILO:IHI). If two eigenvalues are computed as a */ /* complex conjugate pair, they are stored in consecutive */ /* elements of WR and WI, say the i-th and (i+1)th, with */ /* WI(i) .GT. 0 and WI(i+1) .LT. 0. If WANTT is .TRUE., then */ /* the eigenvalues are stored in the same order as on the */ /* diagonal of the Schur form returned in H, with */ /* WR(i) = H(i,i) and, if H(i:i+1,i:i+1) is a 2-by-2 diagonal */ /* block, WI(i) = sqrt(-H(i+1,i)*H(i,i+1)) and */ /* WI(i+1) = -WI(i). */ /* ILOZ (input) INTEGER */ /* IHIZ (input) INTEGER */ /* Specify the rows of Z to which transformations must be */ /* applied if WANTZ is .TRUE.. */ /* 1 .LE. ILOZ .LE. ILO; IHI .LE. IHIZ .LE. N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,IHI) */ /* If WANTZ is .FALSE., then Z is not referenced. */ /* If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is */ /* replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the */ /* orthogonal Schur factor of H(ILO:IHI,ILO:IHI). */ /* (The output value of Z when INFO.GT.0 is given under */ /* the description of INFO below.) */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. if WANTZ is .TRUE. */ /* then LDZ.GE.MAX(1,IHIZ). Otherwize, LDZ.GE.1. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension LWORK */ /* On exit, if LWORK = -1, WORK(1) returns an estimate of */ /* the optimal value for LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK .GE. max(1,N) */ /* is sufficient, but LWORK typically as large as 6*N may */ /* be required for optimal performance. A workspace query */ /* to determine the optimal workspace size is recommended. */ /* If LWORK = -1, then DLAQR4 does a workspace query. */ /* In this case, DLAQR4 checks the input parameters and */ /* estimates the optimal workspace size for the given */ /* values of N, ILO and IHI. The estimate is returned */ /* in WORK(1). No error message related to LWORK is */ /* issued by XERBLA. Neither H nor Z are accessed. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* .GT. 0: if INFO = i, DLAQR4 failed to compute all of */ /* the eigenvalues. Elements 1:ilo-1 and i+1:n of WR */ /* and WI contain those eigenvalues which have been */ /* successfully computed. (Failures are rare.) */ /* If INFO .GT. 0 and WANT is .FALSE., then on exit, */ /* the remaining unconverged eigenvalues are the eigen- */ /* values of the upper Hessenberg matrix rows and */ /* columns ILO through INFO of the final, output */ /* value of H. */ /* If INFO .GT. 0 and WANTT is .TRUE., then on exit */ /* (*) (initial value of H)*U = U*(final value of H) */ /* where U is an orthogonal matrix. The final */ /* value of H is upper Hessenberg and quasi-triangular */ /* in rows and columns INFO+1 through IHI. */ /* If INFO .GT. 0 and WANTZ is .TRUE., then on exit */ /* (final value of Z(ILO:IHI,ILOZ:IHIZ) */ /* = (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U */ /* where U is the orthogonal matrix in (*) (regard- */ /* less of the value of WANTT.) */ /* If INFO .GT. 0 and WANTZ is .FALSE., then Z is not */ /* accessed. */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* References: */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part I: Maintaining Well Focused Shifts, and Level 3 */ /* Performance, SIAM Journal of Matrix Analysis, volume 23, pages */ /* 929--947, 2002. */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part II: Aggressive Early Deflation, SIAM Journal */ /* of Matrix Analysis, volume 23, pages 948--973, 2002. */ /* ================================================================ */ /* .. Parameters .. */ /* ==== Matrices of order NTINY or smaller must be processed by */ /* . DLAHQR because of insufficient subdiagonal scratch space. */ /* . (This is a hard limit.) ==== */ /* ==== Exceptional deflation windows: try to cure rare */ /* . slow convergence by varying the size of the */ /* . deflation window after KEXNW iterations. ==== */ /* ==== Exceptional shifts: try to cure rare slow convergence */ /* . with ad-hoc exceptional shifts every KEXSH iterations. */ /* . ==== */ /* ==== The constants WILK1 and WILK2 are used to form the */ /* . exceptional shifts. ==== */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; --wr; --wi; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ *info = 0; /* ==== Quick return for N = 0: nothing to do. ==== */ if (*n == 0) { work[1] = 1.; return 0; } if (*n <= 11) { /* ==== Tiny matrices must use DLAHQR. ==== */ lwkopt = 1; if (*lwork != -1) { _starpu_dlahqr_(wantt, wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], & wi[1], iloz, ihiz, &z__[z_offset], ldz, info); } } else { /* ==== Use small bulge multi-shift QR with aggressive early */ /* . deflation on larger-than-tiny matrices. ==== */ /* ==== Hope for the best. ==== */ *info = 0; /* ==== Set up job flags for ILAENV. ==== */ if (*wantt) { *(unsigned char *)jbcmpz = 'S'; } else { *(unsigned char *)jbcmpz = 'E'; } if (*wantz) { *(unsigned char *)&jbcmpz[1] = 'V'; } else { *(unsigned char *)&jbcmpz[1] = 'N'; } /* ==== NWR = recommended deflation window size. At this */ /* . point, N .GT. NTINY = 11, so there is enough */ /* . subdiagonal workspace for NWR.GE.2 as required. */ /* . (In fact, there is enough subdiagonal space for */ /* . NWR.GE.3.) ==== */ nwr = _starpu_ilaenv_(&c__13, "DLAQR4", jbcmpz, n, ilo, ihi, lwork); nwr = max(2,nwr); /* Computing MIN */ i__1 = *ihi - *ilo + 1, i__2 = (*n - 1) / 3, i__1 = min(i__1,i__2); nwr = min(i__1,nwr); /* ==== NSR = recommended number of simultaneous shifts. */ /* . At this point N .GT. NTINY = 11, so there is at */ /* . enough subdiagonal workspace for NSR to be even */ /* . and greater than or equal to two as required. ==== */ nsr = _starpu_ilaenv_(&c__15, "DLAQR4", jbcmpz, n, ilo, ihi, lwork); /* Computing MIN */ i__1 = nsr, i__2 = (*n + 6) / 9, i__1 = min(i__1,i__2), i__2 = *ihi - *ilo; nsr = min(i__1,i__2); /* Computing MAX */ i__1 = 2, i__2 = nsr - nsr % 2; nsr = max(i__1,i__2); /* ==== Estimate optimal workspace ==== */ /* ==== Workspace query call to DLAQR2 ==== */ i__1 = nwr + 1; _starpu_dlaqr2_(wantt, wantz, n, ilo, ihi, &i__1, &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], ldz, &ls, &ld, &wr[1], &wi[1], &h__[ h_offset], ldh, n, &h__[h_offset], ldh, n, &h__[h_offset], ldh, &work[1], &c_n1); /* ==== Optimal workspace = MAX(DLAQR5, DLAQR2) ==== */ /* Computing MAX */ i__1 = nsr * 3 / 2, i__2 = (integer) work[1]; lwkopt = max(i__1,i__2); /* ==== Quick return in case of workspace query. ==== */ if (*lwork == -1) { work[1] = (doublereal) lwkopt; return 0; } /* ==== DLAHQR/DLAQR0 crossover point ==== */ nmin = _starpu_ilaenv_(&c__12, "DLAQR4", jbcmpz, n, ilo, ihi, lwork); nmin = max(11,nmin); /* ==== Nibble crossover point ==== */ nibble = _starpu_ilaenv_(&c__14, "DLAQR4", jbcmpz, n, ilo, ihi, lwork); nibble = max(0,nibble); /* ==== Accumulate reflections during ttswp? Use block */ /* . 2-by-2 structure during matrix-matrix multiply? ==== */ kacc22 = _starpu_ilaenv_(&c__16, "DLAQR4", jbcmpz, n, ilo, ihi, lwork); kacc22 = max(0,kacc22); kacc22 = min(2,kacc22); /* ==== NWMAX = the largest possible deflation window for */ /* . which there is sufficient workspace. ==== */ /* Computing MIN */ i__1 = (*n - 1) / 3, i__2 = *lwork / 2; nwmax = min(i__1,i__2); nw = nwmax; /* ==== NSMAX = the Largest number of simultaneous shifts */ /* . for which there is sufficient workspace. ==== */ /* Computing MIN */ i__1 = (*n + 6) / 9, i__2 = (*lwork << 1) / 3; nsmax = min(i__1,i__2); nsmax -= nsmax % 2; /* ==== NDFL: an iteration count restarted at deflation. ==== */ ndfl = 1; /* ==== ITMAX = iteration limit ==== */ /* Computing MAX */ i__1 = 10, i__2 = *ihi - *ilo + 1; itmax = max(i__1,i__2) * 30; /* ==== Last row and column in the active block ==== */ kbot = *ihi; /* ==== Main Loop ==== */ i__1 = itmax; for (it = 1; it <= i__1; ++it) { /* ==== Done when KBOT falls below ILO ==== */ if (kbot < *ilo) { goto L90; } /* ==== Locate active block ==== */ i__2 = *ilo + 1; for (k = kbot; k >= i__2; --k) { if (h__[k + (k - 1) * h_dim1] == 0.) { goto L20; } /* L10: */ } k = *ilo; L20: ktop = k; /* ==== Select deflation window size: */ /* . Typical Case: */ /* . If possible and advisable, nibble the entire */ /* . active block. If not, use size MIN(NWR,NWMAX) */ /* . or MIN(NWR+1,NWMAX) depending upon which has */ /* . the smaller corresponding subdiagonal entry */ /* . (a heuristic). */ /* . */ /* . Exceptional Case: */ /* . If there have been no deflations in KEXNW or */ /* . more iterations, then vary the deflation window */ /* . size. At first, because, larger windows are, */ /* . in general, more powerful than smaller ones, */ /* . rapidly increase the window to the maximum possible. */ /* . Then, gradually reduce the window size. ==== */ nh = kbot - ktop + 1; nwupbd = min(nh,nwmax); if (ndfl < 5) { nw = min(nwupbd,nwr); } else { /* Computing MIN */ i__2 = nwupbd, i__3 = nw << 1; nw = min(i__2,i__3); } if (nw < nwmax) { if (nw >= nh - 1) { nw = nh; } else { kwtop = kbot - nw + 1; if ((d__1 = h__[kwtop + (kwtop - 1) * h_dim1], abs(d__1)) > (d__2 = h__[kwtop - 1 + (kwtop - 2) * h_dim1], abs(d__2))) { ++nw; } } } if (ndfl < 5) { ndec = -1; } else if (ndec >= 0 || nw >= nwupbd) { ++ndec; if (nw - ndec < 2) { ndec = 0; } nw -= ndec; } /* ==== Aggressive early deflation: */ /* . split workspace under the subdiagonal into */ /* . - an nw-by-nw work array V in the lower */ /* . left-hand-corner, */ /* . - an NW-by-at-least-NW-but-more-is-better */ /* . (NW-by-NHO) horizontal work array along */ /* . the bottom edge, */ /* . - an at-least-NW-but-more-is-better (NHV-by-NW) */ /* . vertical work array along the left-hand-edge. */ /* . ==== */ kv = *n - nw + 1; kt = nw + 1; nho = *n - nw - 1 - kt + 1; kwv = nw + 2; nve = *n - nw - kwv + 1; /* ==== Aggressive early deflation ==== */ _starpu_dlaqr2_(wantt, wantz, n, &ktop, &kbot, &nw, &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], ldz, &ls, &ld, &wr[1], &wi[1], &h__[kv + h_dim1], ldh, &nho, &h__[kv + kt * h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &work[1], lwork); /* ==== Adjust KBOT accounting for new deflations. ==== */ kbot -= ld; /* ==== KS points to the shifts. ==== */ ks = kbot - ls + 1; /* ==== Skip an expensive QR sweep if there is a (partly */ /* . heuristic) reason to expect that many eigenvalues */ /* . will deflate without it. Here, the QR sweep is */ /* . skipped if many eigenvalues have just been deflated */ /* . or if the remaining active block is small. */ if (ld == 0 || ld * 100 <= nw * nibble && kbot - ktop + 1 > min( nmin,nwmax)) { /* ==== NS = nominal number of simultaneous shifts. */ /* . This may be lowered (slightly) if DLAQR2 */ /* . did not provide that many shifts. ==== */ /* Computing MIN */ /* Computing MAX */ i__4 = 2, i__5 = kbot - ktop; i__2 = min(nsmax,nsr), i__3 = max(i__4,i__5); ns = min(i__2,i__3); ns -= ns % 2; /* ==== If there have been no deflations */ /* . in a multiple of KEXSH iterations, */ /* . then try exceptional shifts. */ /* . Otherwise use shifts provided by */ /* . DLAQR2 above or from the eigenvalues */ /* . of a trailing principal submatrix. ==== */ if (ndfl % 6 == 0) { ks = kbot - ns + 1; /* Computing MAX */ i__3 = ks + 1, i__4 = ktop + 2; i__2 = max(i__3,i__4); for (i__ = kbot; i__ >= i__2; i__ += -2) { ss = (d__1 = h__[i__ + (i__ - 1) * h_dim1], abs(d__1)) + (d__2 = h__[i__ - 1 + (i__ - 2) * h_dim1], abs(d__2)); aa = ss * .75 + h__[i__ + i__ * h_dim1]; bb = ss; cc = ss * -.4375; dd = aa; _starpu_dlanv2_(&aa, &bb, &cc, &dd, &wr[i__ - 1], &wi[i__ - 1] , &wr[i__], &wi[i__], &cs, &sn); /* L30: */ } if (ks == ktop) { wr[ks + 1] = h__[ks + 1 + (ks + 1) * h_dim1]; wi[ks + 1] = 0.; wr[ks] = wr[ks + 1]; wi[ks] = wi[ks + 1]; } } else { /* ==== Got NS/2 or fewer shifts? Use DLAHQR */ /* . on a trailing principal submatrix to */ /* . get more. (Since NS.LE.NSMAX.LE.(N+6)/9, */ /* . there is enough space below the subdiagonal */ /* . to fit an NS-by-NS scratch array.) ==== */ if (kbot - ks + 1 <= ns / 2) { ks = kbot - ns + 1; kt = *n - ns + 1; _starpu_dlacpy_("A", &ns, &ns, &h__[ks + ks * h_dim1], ldh, & h__[kt + h_dim1], ldh); _starpu_dlahqr_(&c_false, &c_false, &ns, &c__1, &ns, &h__[kt + h_dim1], ldh, &wr[ks], &wi[ks], &c__1, & c__1, zdum, &c__1, &inf); ks += inf; /* ==== In case of a rare QR failure use */ /* . eigenvalues of the trailing 2-by-2 */ /* . principal submatrix. ==== */ if (ks >= kbot) { aa = h__[kbot - 1 + (kbot - 1) * h_dim1]; cc = h__[kbot + (kbot - 1) * h_dim1]; bb = h__[kbot - 1 + kbot * h_dim1]; dd = h__[kbot + kbot * h_dim1]; _starpu_dlanv2_(&aa, &bb, &cc, &dd, &wr[kbot - 1], &wi[ kbot - 1], &wr[kbot], &wi[kbot], &cs, &sn) ; ks = kbot - 1; } } if (kbot - ks + 1 > ns) { /* ==== Sort the shifts (Helps a little) */ /* . Bubble sort keeps complex conjugate */ /* . pairs together. ==== */ sorted = FALSE_; i__2 = ks + 1; for (k = kbot; k >= i__2; --k) { if (sorted) { goto L60; } sorted = TRUE_; i__3 = k - 1; for (i__ = ks; i__ <= i__3; ++i__) { if ((d__1 = wr[i__], abs(d__1)) + (d__2 = wi[ i__], abs(d__2)) < (d__3 = wr[i__ + 1] , abs(d__3)) + (d__4 = wi[i__ + 1], abs(d__4))) { sorted = FALSE_; swap = wr[i__]; wr[i__] = wr[i__ + 1]; wr[i__ + 1] = swap; swap = wi[i__]; wi[i__] = wi[i__ + 1]; wi[i__ + 1] = swap; } /* L40: */ } /* L50: */ } L60: ; } /* ==== Shuffle shifts into pairs of real shifts */ /* . and pairs of complex conjugate shifts */ /* . assuming complex conjugate shifts are */ /* . already adjacent to one another. (Yes, */ /* . they are.) ==== */ i__2 = ks + 2; for (i__ = kbot; i__ >= i__2; i__ += -2) { if (wi[i__] != -wi[i__ - 1]) { swap = wr[i__]; wr[i__] = wr[i__ - 1]; wr[i__ - 1] = wr[i__ - 2]; wr[i__ - 2] = swap; swap = wi[i__]; wi[i__] = wi[i__ - 1]; wi[i__ - 1] = wi[i__ - 2]; wi[i__ - 2] = swap; } /* L70: */ } } /* ==== If there are only two shifts and both are */ /* . real, then use only one. ==== */ if (kbot - ks + 1 == 2) { if (wi[kbot] == 0.) { if ((d__1 = wr[kbot] - h__[kbot + kbot * h_dim1], abs( d__1)) < (d__2 = wr[kbot - 1] - h__[kbot + kbot * h_dim1], abs(d__2))) { wr[kbot - 1] = wr[kbot]; } else { wr[kbot] = wr[kbot - 1]; } } } /* ==== Use up to NS of the the smallest magnatiude */ /* . shifts. If there aren't NS shifts available, */ /* . then use them all, possibly dropping one to */ /* . make the number of shifts even. ==== */ /* Computing MIN */ i__2 = ns, i__3 = kbot - ks + 1; ns = min(i__2,i__3); ns -= ns % 2; ks = kbot - ns + 1; /* ==== Small-bulge multi-shift QR sweep: */ /* . split workspace under the subdiagonal into */ /* . - a KDU-by-KDU work array U in the lower */ /* . left-hand-corner, */ /* . - a KDU-by-at-least-KDU-but-more-is-better */ /* . (KDU-by-NHo) horizontal work array WH along */ /* . the bottom edge, */ /* . - and an at-least-KDU-but-more-is-better-by-KDU */ /* . (NVE-by-KDU) vertical work WV arrow along */ /* . the left-hand-edge. ==== */ kdu = ns * 3 - 3; ku = *n - kdu + 1; kwh = kdu + 1; nho = *n - kdu - 3 - (kdu + 1) + 1; kwv = kdu + 4; nve = *n - kdu - kwv + 1; /* ==== Small-bulge multi-shift QR sweep ==== */ _starpu_dlaqr5_(wantt, wantz, &kacc22, n, &ktop, &kbot, &ns, &wr[ks], &wi[ks], &h__[h_offset], ldh, iloz, ihiz, &z__[ z_offset], ldz, &work[1], &c__3, &h__[ku + h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &nho, &h__[ku + kwh * h_dim1], ldh); } /* ==== Note progress (or the lack of it). ==== */ if (ld > 0) { ndfl = 1; } else { ++ndfl; } /* ==== End of main loop ==== */ /* L80: */ } /* ==== Iteration limit exceeded. Set INFO to show where */ /* . the problem occurred and exit. ==== */ *info = kbot; L90: ; } /* ==== Return the optimal value of LWORK. ==== */ work[1] = (doublereal) lwkopt; /* ==== End of DLAQR4 ==== */ return 0; } /* _starpu_dlaqr4_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqr5.c000066400000000000000000001031771413463044200205470ustar00rootroot00000000000000/* dlaqr5.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = 0.; static doublereal c_b8 = 1.; static integer c__3 = 3; static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dlaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, integer *kbot, integer *nshfts, doublereal *sr, doublereal *si, doublereal *h__, integer *ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, doublereal *v, integer * ldv, doublereal *u, integer *ldu, integer *nv, doublereal *wv, integer *ldwv, integer *nh, doublereal *wh, integer *ldwh) { /* System generated locals */ integer h_dim1, h_offset, u_dim1, u_offset, v_dim1, v_offset, wh_dim1, wh_offset, wv_dim1, wv_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; doublereal d__1, d__2, d__3, d__4, d__5; /* Local variables */ integer i__, j, k, m, i2, j2, i4, j4, k1; doublereal h11, h12, h21, h22; integer m22, ns, nu; doublereal vt[3], scl; integer kdu, kms; doublereal ulp; integer knz, kzs; doublereal tst1, tst2, beta; logical blk22, bmp22; integer mend, jcol, jlen, jbot, mbot; doublereal swap; integer jtop, jrow, mtop; doublereal alpha; logical accum; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ndcol, incol, krcol, nbmps; extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaqr1_( integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmax, refsum; integer mstart; doublereal smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* This auxiliary subroutine called by DLAQR0 performs a */ /* single small-bulge multi-shift QR sweep. */ /* WANTT (input) logical scalar */ /* WANTT = .true. if the quasi-triangular Schur factor */ /* is being computed. WANTT is set to .false. otherwise. */ /* WANTZ (input) logical scalar */ /* WANTZ = .true. if the orthogonal Schur factor is being */ /* computed. WANTZ is set to .false. otherwise. */ /* KACC22 (input) integer with value 0, 1, or 2. */ /* Specifies the computation mode of far-from-diagonal */ /* orthogonal updates. */ /* = 0: DLAQR5 does not accumulate reflections and does not */ /* use matrix-matrix multiply to update far-from-diagonal */ /* matrix entries. */ /* = 1: DLAQR5 accumulates reflections and uses matrix-matrix */ /* multiply to update the far-from-diagonal matrix entries. */ /* = 2: DLAQR5 accumulates reflections, uses matrix-matrix */ /* multiply to update the far-from-diagonal matrix entries, */ /* and takes advantage of 2-by-2 block structure during */ /* matrix multiplies. */ /* N (input) integer scalar */ /* N is the order of the Hessenberg matrix H upon which this */ /* subroutine operates. */ /* KTOP (input) integer scalar */ /* KBOT (input) integer scalar */ /* These are the first and last rows and columns of an */ /* isolated diagonal block upon which the QR sweep is to be */ /* applied. It is assumed without a check that */ /* either KTOP = 1 or H(KTOP,KTOP-1) = 0 */ /* and */ /* either KBOT = N or H(KBOT+1,KBOT) = 0. */ /* NSHFTS (input) integer scalar */ /* NSHFTS gives the number of simultaneous shifts. NSHFTS */ /* must be positive and even. */ /* SR (input/output) DOUBLE PRECISION array of size (NSHFTS) */ /* SI (input/output) DOUBLE PRECISION array of size (NSHFTS) */ /* SR contains the real parts and SI contains the imaginary */ /* parts of the NSHFTS shifts of origin that define the */ /* multi-shift QR sweep. On output SR and SI may be */ /* reordered. */ /* H (input/output) DOUBLE PRECISION array of size (LDH,N) */ /* On input H contains a Hessenberg matrix. On output a */ /* multi-shift QR sweep with shifts SR(J)+i*SI(J) is applied */ /* to the isolated diagonal block in rows and columns KTOP */ /* through KBOT. */ /* LDH (input) integer scalar */ /* LDH is the leading dimension of H just as declared in the */ /* calling procedure. LDH.GE.MAX(1,N). */ /* ILOZ (input) INTEGER */ /* IHIZ (input) INTEGER */ /* Specify the rows of Z to which transformations must be */ /* applied if WANTZ is .TRUE.. 1 .LE. ILOZ .LE. IHIZ .LE. N */ /* Z (input/output) DOUBLE PRECISION array of size (LDZ,IHI) */ /* If WANTZ = .TRUE., then the QR Sweep orthogonal */ /* similarity transformation is accumulated into */ /* Z(ILOZ:IHIZ,ILO:IHI) from the right. */ /* If WANTZ = .FALSE., then Z is unreferenced. */ /* LDZ (input) integer scalar */ /* LDA is the leading dimension of Z just as declared in */ /* the calling procedure. LDZ.GE.N. */ /* V (workspace) DOUBLE PRECISION array of size (LDV,NSHFTS/2) */ /* LDV (input) integer scalar */ /* LDV is the leading dimension of V as declared in the */ /* calling procedure. LDV.GE.3. */ /* U (workspace) DOUBLE PRECISION array of size */ /* (LDU,3*NSHFTS-3) */ /* LDU (input) integer scalar */ /* LDU is the leading dimension of U just as declared in the */ /* in the calling subroutine. LDU.GE.3*NSHFTS-3. */ /* NH (input) integer scalar */ /* NH is the number of columns in array WH available for */ /* workspace. NH.GE.1. */ /* WH (workspace) DOUBLE PRECISION array of size (LDWH,NH) */ /* LDWH (input) integer scalar */ /* Leading dimension of WH just as declared in the */ /* calling procedure. LDWH.GE.3*NSHFTS-3. */ /* NV (input) integer scalar */ /* NV is the number of rows in WV agailable for workspace. */ /* NV.GE.1. */ /* WV (workspace) DOUBLE PRECISION array of size */ /* (LDWV,3*NSHFTS-3) */ /* LDWV (input) integer scalar */ /* LDWV is the leading dimension of WV as declared in the */ /* in the calling subroutine. LDWV.GE.NV. */ /* ================================================================ */ /* Based on contributions by */ /* Karen Braman and Ralph Byers, Department of Mathematics, */ /* University of Kansas, USA */ /* ================================================================ */ /* Reference: */ /* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR */ /* Algorithm Part I: Maintaining Well Focused Shifts, and */ /* Level 3 Performance, SIAM Journal of Matrix Analysis, */ /* volume 23, pages 929--947, 2002. */ /* ================================================================ */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* ==== If there are no shifts, then there is nothing to do. ==== */ /* Parameter adjustments */ --sr; --si; h_dim1 = *ldh; h_offset = 1 + h_dim1; h__ -= h_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; wv_dim1 = *ldwv; wv_offset = 1 + wv_dim1; wv -= wv_offset; wh_dim1 = *ldwh; wh_offset = 1 + wh_dim1; wh -= wh_offset; /* Function Body */ if (*nshfts < 2) { return 0; } /* ==== If the active block is empty or 1-by-1, then there */ /* . is nothing to do. ==== */ if (*ktop >= *kbot) { return 0; } /* ==== Shuffle shifts into pairs of real shifts and pairs */ /* . of complex conjugate shifts assuming complex */ /* . conjugate shifts are already adjacent to one */ /* . another. ==== */ i__1 = *nshfts - 2; for (i__ = 1; i__ <= i__1; i__ += 2) { if (si[i__] != -si[i__ + 1]) { swap = sr[i__]; sr[i__] = sr[i__ + 1]; sr[i__ + 1] = sr[i__ + 2]; sr[i__ + 2] = swap; swap = si[i__]; si[i__] = si[i__ + 1]; si[i__ + 1] = si[i__ + 2]; si[i__ + 2] = swap; } /* L10: */ } /* ==== NSHFTS is supposed to be even, but if it is odd, */ /* . then simply reduce it by one. The shuffle above */ /* . ensures that the dropped shift is real and that */ /* . the remaining shifts are paired. ==== */ ns = *nshfts - *nshfts % 2; /* ==== Machine constants for deflation ==== */ safmin = _starpu_dlamch_("SAFE MINIMUM"); safmax = 1. / safmin; _starpu_dlabad_(&safmin, &safmax); ulp = _starpu_dlamch_("PRECISION"); smlnum = safmin * ((doublereal) (*n) / ulp); /* ==== Use accumulated reflections to update far-from-diagonal */ /* . entries ? ==== */ accum = *kacc22 == 1 || *kacc22 == 2; /* ==== If so, exploit the 2-by-2 block structure? ==== */ blk22 = ns > 2 && *kacc22 == 2; /* ==== clear trash ==== */ if (*ktop + 2 <= *kbot) { h__[*ktop + 2 + *ktop * h_dim1] = 0.; } /* ==== NBMPS = number of 2-shift bulges in the chain ==== */ nbmps = ns / 2; /* ==== KDU = width of slab ==== */ kdu = nbmps * 6 - 3; /* ==== Create and chase chains of NBMPS bulges ==== */ i__1 = *kbot - 2; i__2 = nbmps * 3 - 2; for (incol = (1 - nbmps) * 3 + *ktop - 1; i__2 < 0 ? incol >= i__1 : incol <= i__1; incol += i__2) { ndcol = incol + kdu; if (accum) { _starpu_dlaset_("ALL", &kdu, &kdu, &c_b7, &c_b8, &u[u_offset], ldu); } /* ==== Near-the-diagonal bulge chase. The following loop */ /* . performs the near-the-diagonal part of a small bulge */ /* . multi-shift QR sweep. Each 6*NBMPS-2 column diagonal */ /* . chunk extends from column INCOL to column NDCOL */ /* . (including both column INCOL and column NDCOL). The */ /* . following loop chases a 3*NBMPS column long chain of */ /* . NBMPS bulges 3*NBMPS-2 columns to the right. (INCOL */ /* . may be less than KTOP and and NDCOL may be greater than */ /* . KBOT indicating phantom columns from which to chase */ /* . bulges before they are actually introduced or to which */ /* . to chase bulges beyond column KBOT.) ==== */ /* Computing MIN */ i__4 = incol + nbmps * 3 - 3, i__5 = *kbot - 2; i__3 = min(i__4,i__5); for (krcol = incol; krcol <= i__3; ++krcol) { /* ==== Bulges number MTOP to MBOT are active double implicit */ /* . shift bulges. There may or may not also be small */ /* . 2-by-2 bulge, if there is room. The inactive bulges */ /* . (if any) must wait until the active bulges have moved */ /* . down the diagonal to make room. The phantom matrix */ /* . paradigm described above helps keep track. ==== */ /* Computing MAX */ i__4 = 1, i__5 = (*ktop - 1 - krcol + 2) / 3 + 1; mtop = max(i__4,i__5); /* Computing MIN */ i__4 = nbmps, i__5 = (*kbot - krcol) / 3; mbot = min(i__4,i__5); m22 = mbot + 1; bmp22 = mbot < nbmps && krcol + (m22 - 1) * 3 == *kbot - 2; /* ==== Generate reflections to chase the chain right */ /* . one column. (The minimum value of K is KTOP-1.) ==== */ i__4 = mbot; for (m = mtop; m <= i__4; ++m) { k = krcol + (m - 1) * 3; if (k == *ktop - 1) { _starpu_dlaqr1_(&c__3, &h__[*ktop + *ktop * h_dim1], ldh, &sr[(m << 1) - 1], &si[(m << 1) - 1], &sr[m * 2], &si[m * 2], &v[m * v_dim1 + 1]); alpha = v[m * v_dim1 + 1]; _starpu_dlarfg_(&c__3, &alpha, &v[m * v_dim1 + 2], &c__1, &v[m * v_dim1 + 1]); } else { beta = h__[k + 1 + k * h_dim1]; v[m * v_dim1 + 2] = h__[k + 2 + k * h_dim1]; v[m * v_dim1 + 3] = h__[k + 3 + k * h_dim1]; _starpu_dlarfg_(&c__3, &beta, &v[m * v_dim1 + 2], &c__1, &v[m * v_dim1 + 1]); /* ==== A Bulge may collapse because of vigilant */ /* . deflation or destructive underflow. In the */ /* . underflow case, try the two-small-subdiagonals */ /* . trick to try to reinflate the bulge. ==== */ if (h__[k + 3 + k * h_dim1] != 0. || h__[k + 3 + (k + 1) * h_dim1] != 0. || h__[k + 3 + (k + 2) * h_dim1] == 0.) { /* ==== Typical case: not collapsed (yet). ==== */ h__[k + 1 + k * h_dim1] = beta; h__[k + 2 + k * h_dim1] = 0.; h__[k + 3 + k * h_dim1] = 0.; } else { /* ==== Atypical case: collapsed. Attempt to */ /* . reintroduce ignoring H(K+1,K) and H(K+2,K). */ /* . If the fill resulting from the new */ /* . reflector is too large, then abandon it. */ /* . Otherwise, use the new one. ==== */ _starpu_dlaqr1_(&c__3, &h__[k + 1 + (k + 1) * h_dim1], ldh, & sr[(m << 1) - 1], &si[(m << 1) - 1], &sr[m * 2], &si[m * 2], vt); alpha = vt[0]; _starpu_dlarfg_(&c__3, &alpha, &vt[1], &c__1, vt); refsum = vt[0] * (h__[k + 1 + k * h_dim1] + vt[1] * h__[k + 2 + k * h_dim1]); if ((d__1 = h__[k + 2 + k * h_dim1] - refsum * vt[1], abs(d__1)) + (d__2 = refsum * vt[2], abs(d__2) ) > ulp * ((d__3 = h__[k + k * h_dim1], abs( d__3)) + (d__4 = h__[k + 1 + (k + 1) * h_dim1] , abs(d__4)) + (d__5 = h__[k + 2 + (k + 2) * h_dim1], abs(d__5)))) { /* ==== Starting a new bulge here would */ /* . create non-negligible fill. Use */ /* . the old one with trepidation. ==== */ h__[k + 1 + k * h_dim1] = beta; h__[k + 2 + k * h_dim1] = 0.; h__[k + 3 + k * h_dim1] = 0.; } else { /* ==== Stating a new bulge here would */ /* . create only negligible fill. */ /* . Replace the old reflector with */ /* . the new one. ==== */ h__[k + 1 + k * h_dim1] -= refsum; h__[k + 2 + k * h_dim1] = 0.; h__[k + 3 + k * h_dim1] = 0.; v[m * v_dim1 + 1] = vt[0]; v[m * v_dim1 + 2] = vt[1]; v[m * v_dim1 + 3] = vt[2]; } } } /* L20: */ } /* ==== Generate a 2-by-2 reflection, if needed. ==== */ k = krcol + (m22 - 1) * 3; if (bmp22) { if (k == *ktop - 1) { _starpu_dlaqr1_(&c__2, &h__[k + 1 + (k + 1) * h_dim1], ldh, &sr[( m22 << 1) - 1], &si[(m22 << 1) - 1], &sr[m22 * 2], &si[m22 * 2], &v[m22 * v_dim1 + 1]); beta = v[m22 * v_dim1 + 1]; _starpu_dlarfg_(&c__2, &beta, &v[m22 * v_dim1 + 2], &c__1, &v[m22 * v_dim1 + 1]); } else { beta = h__[k + 1 + k * h_dim1]; v[m22 * v_dim1 + 2] = h__[k + 2 + k * h_dim1]; _starpu_dlarfg_(&c__2, &beta, &v[m22 * v_dim1 + 2], &c__1, &v[m22 * v_dim1 + 1]); h__[k + 1 + k * h_dim1] = beta; h__[k + 2 + k * h_dim1] = 0.; } } /* ==== Multiply H by reflections from the left ==== */ if (accum) { jbot = min(ndcol,*kbot); } else if (*wantt) { jbot = *n; } else { jbot = *kbot; } i__4 = jbot; for (j = max(*ktop,krcol); j <= i__4; ++j) { /* Computing MIN */ i__5 = mbot, i__6 = (j - krcol + 2) / 3; mend = min(i__5,i__6); i__5 = mend; for (m = mtop; m <= i__5; ++m) { k = krcol + (m - 1) * 3; refsum = v[m * v_dim1 + 1] * (h__[k + 1 + j * h_dim1] + v[ m * v_dim1 + 2] * h__[k + 2 + j * h_dim1] + v[m * v_dim1 + 3] * h__[k + 3 + j * h_dim1]); h__[k + 1 + j * h_dim1] -= refsum; h__[k + 2 + j * h_dim1] -= refsum * v[m * v_dim1 + 2]; h__[k + 3 + j * h_dim1] -= refsum * v[m * v_dim1 + 3]; /* L30: */ } /* L40: */ } if (bmp22) { k = krcol + (m22 - 1) * 3; /* Computing MAX */ i__4 = k + 1; i__5 = jbot; for (j = max(i__4,*ktop); j <= i__5; ++j) { refsum = v[m22 * v_dim1 + 1] * (h__[k + 1 + j * h_dim1] + v[m22 * v_dim1 + 2] * h__[k + 2 + j * h_dim1]); h__[k + 1 + j * h_dim1] -= refsum; h__[k + 2 + j * h_dim1] -= refsum * v[m22 * v_dim1 + 2]; /* L50: */ } } /* ==== Multiply H by reflections from the right. */ /* . Delay filling in the last row until the */ /* . vigilant deflation check is complete. ==== */ if (accum) { jtop = max(*ktop,incol); } else if (*wantt) { jtop = 1; } else { jtop = *ktop; } i__5 = mbot; for (m = mtop; m <= i__5; ++m) { if (v[m * v_dim1 + 1] != 0.) { k = krcol + (m - 1) * 3; /* Computing MIN */ i__6 = *kbot, i__7 = k + 3; i__4 = min(i__6,i__7); for (j = jtop; j <= i__4; ++j) { refsum = v[m * v_dim1 + 1] * (h__[j + (k + 1) * h_dim1] + v[m * v_dim1 + 2] * h__[j + (k + 2) * h_dim1] + v[m * v_dim1 + 3] * h__[j + (k + 3) * h_dim1]); h__[j + (k + 1) * h_dim1] -= refsum; h__[j + (k + 2) * h_dim1] -= refsum * v[m * v_dim1 + 2]; h__[j + (k + 3) * h_dim1] -= refsum * v[m * v_dim1 + 3]; /* L60: */ } if (accum) { /* ==== Accumulate U. (If necessary, update Z later */ /* . with with an efficient matrix-matrix */ /* . multiply.) ==== */ kms = k - incol; /* Computing MAX */ i__4 = 1, i__6 = *ktop - incol; i__7 = kdu; for (j = max(i__4,i__6); j <= i__7; ++j) { refsum = v[m * v_dim1 + 1] * (u[j + (kms + 1) * u_dim1] + v[m * v_dim1 + 2] * u[j + (kms + 2) * u_dim1] + v[m * v_dim1 + 3] * u[j + (kms + 3) * u_dim1]); u[j + (kms + 1) * u_dim1] -= refsum; u[j + (kms + 2) * u_dim1] -= refsum * v[m * v_dim1 + 2]; u[j + (kms + 3) * u_dim1] -= refsum * v[m * v_dim1 + 3]; /* L70: */ } } else if (*wantz) { /* ==== U is not accumulated, so update Z */ /* . now by multiplying by reflections */ /* . from the right. ==== */ i__7 = *ihiz; for (j = *iloz; j <= i__7; ++j) { refsum = v[m * v_dim1 + 1] * (z__[j + (k + 1) * z_dim1] + v[m * v_dim1 + 2] * z__[j + (k + 2) * z_dim1] + v[m * v_dim1 + 3] * z__[ j + (k + 3) * z_dim1]); z__[j + (k + 1) * z_dim1] -= refsum; z__[j + (k + 2) * z_dim1] -= refsum * v[m * v_dim1 + 2]; z__[j + (k + 3) * z_dim1] -= refsum * v[m * v_dim1 + 3]; /* L80: */ } } } /* L90: */ } /* ==== Special case: 2-by-2 reflection (if needed) ==== */ k = krcol + (m22 - 1) * 3; if (bmp22 && v[m22 * v_dim1 + 1] != 0.) { /* Computing MIN */ i__7 = *kbot, i__4 = k + 3; i__5 = min(i__7,i__4); for (j = jtop; j <= i__5; ++j) { refsum = v[m22 * v_dim1 + 1] * (h__[j + (k + 1) * h_dim1] + v[m22 * v_dim1 + 2] * h__[j + (k + 2) * h_dim1]) ; h__[j + (k + 1) * h_dim1] -= refsum; h__[j + (k + 2) * h_dim1] -= refsum * v[m22 * v_dim1 + 2]; /* L100: */ } if (accum) { kms = k - incol; /* Computing MAX */ i__5 = 1, i__7 = *ktop - incol; i__4 = kdu; for (j = max(i__5,i__7); j <= i__4; ++j) { refsum = v[m22 * v_dim1 + 1] * (u[j + (kms + 1) * u_dim1] + v[m22 * v_dim1 + 2] * u[j + (kms + 2) * u_dim1]); u[j + (kms + 1) * u_dim1] -= refsum; u[j + (kms + 2) * u_dim1] -= refsum * v[m22 * v_dim1 + 2]; /* L110: */ } } else if (*wantz) { i__4 = *ihiz; for (j = *iloz; j <= i__4; ++j) { refsum = v[m22 * v_dim1 + 1] * (z__[j + (k + 1) * z_dim1] + v[m22 * v_dim1 + 2] * z__[j + (k + 2) * z_dim1]); z__[j + (k + 1) * z_dim1] -= refsum; z__[j + (k + 2) * z_dim1] -= refsum * v[m22 * v_dim1 + 2]; /* L120: */ } } } /* ==== Vigilant deflation check ==== */ mstart = mtop; if (krcol + (mstart - 1) * 3 < *ktop) { ++mstart; } mend = mbot; if (bmp22) { ++mend; } if (krcol == *kbot - 2) { ++mend; } i__4 = mend; for (m = mstart; m <= i__4; ++m) { /* Computing MIN */ i__5 = *kbot - 1, i__7 = krcol + (m - 1) * 3; k = min(i__5,i__7); /* ==== The following convergence test requires that */ /* . the tradition small-compared-to-nearby-diagonals */ /* . criterion and the Ahues & Tisseur (LAWN 122, 1997) */ /* . criteria both be satisfied. The latter improves */ /* . accuracy in some examples. Falling back on an */ /* . alternate convergence criterion when TST1 or TST2 */ /* . is zero (as done here) is traditional but probably */ /* . unnecessary. ==== */ if (h__[k + 1 + k * h_dim1] != 0.) { tst1 = (d__1 = h__[k + k * h_dim1], abs(d__1)) + (d__2 = h__[k + 1 + (k + 1) * h_dim1], abs(d__2)); if (tst1 == 0.) { if (k >= *ktop + 1) { tst1 += (d__1 = h__[k + (k - 1) * h_dim1], abs( d__1)); } if (k >= *ktop + 2) { tst1 += (d__1 = h__[k + (k - 2) * h_dim1], abs( d__1)); } if (k >= *ktop + 3) { tst1 += (d__1 = h__[k + (k - 3) * h_dim1], abs( d__1)); } if (k <= *kbot - 2) { tst1 += (d__1 = h__[k + 2 + (k + 1) * h_dim1], abs(d__1)); } if (k <= *kbot - 3) { tst1 += (d__1 = h__[k + 3 + (k + 1) * h_dim1], abs(d__1)); } if (k <= *kbot - 4) { tst1 += (d__1 = h__[k + 4 + (k + 1) * h_dim1], abs(d__1)); } } /* Computing MAX */ d__2 = smlnum, d__3 = ulp * tst1; if ((d__1 = h__[k + 1 + k * h_dim1], abs(d__1)) <= max( d__2,d__3)) { /* Computing MAX */ d__3 = (d__1 = h__[k + 1 + k * h_dim1], abs(d__1)), d__4 = (d__2 = h__[k + (k + 1) * h_dim1], abs( d__2)); h12 = max(d__3,d__4); /* Computing MIN */ d__3 = (d__1 = h__[k + 1 + k * h_dim1], abs(d__1)), d__4 = (d__2 = h__[k + (k + 1) * h_dim1], abs( d__2)); h21 = min(d__3,d__4); /* Computing MAX */ d__3 = (d__1 = h__[k + 1 + (k + 1) * h_dim1], abs( d__1)), d__4 = (d__2 = h__[k + k * h_dim1] - h__[k + 1 + (k + 1) * h_dim1], abs(d__2)); h11 = max(d__3,d__4); /* Computing MIN */ d__3 = (d__1 = h__[k + 1 + (k + 1) * h_dim1], abs( d__1)), d__4 = (d__2 = h__[k + k * h_dim1] - h__[k + 1 + (k + 1) * h_dim1], abs(d__2)); h22 = min(d__3,d__4); scl = h11 + h12; tst2 = h22 * (h11 / scl); /* Computing MAX */ d__1 = smlnum, d__2 = ulp * tst2; if (tst2 == 0. || h21 * (h12 / scl) <= max(d__1,d__2)) { h__[k + 1 + k * h_dim1] = 0.; } } } /* L130: */ } /* ==== Fill in the last row of each bulge. ==== */ /* Computing MIN */ i__4 = nbmps, i__5 = (*kbot - krcol - 1) / 3; mend = min(i__4,i__5); i__4 = mend; for (m = mtop; m <= i__4; ++m) { k = krcol + (m - 1) * 3; refsum = v[m * v_dim1 + 1] * v[m * v_dim1 + 3] * h__[k + 4 + ( k + 3) * h_dim1]; h__[k + 4 + (k + 1) * h_dim1] = -refsum; h__[k + 4 + (k + 2) * h_dim1] = -refsum * v[m * v_dim1 + 2]; h__[k + 4 + (k + 3) * h_dim1] -= refsum * v[m * v_dim1 + 3]; /* L140: */ } /* ==== End of near-the-diagonal bulge chase. ==== */ /* L150: */ } /* ==== Use U (if accumulated) to update far-from-diagonal */ /* . entries in H. If required, use U to update Z as */ /* . well. ==== */ if (accum) { if (*wantt) { jtop = 1; jbot = *n; } else { jtop = *ktop; jbot = *kbot; } if (! blk22 || incol < *ktop || ndcol > *kbot || ns <= 2) { /* ==== Updates not exploiting the 2-by-2 block */ /* . structure of U. K1 and NU keep track of */ /* . the location and size of U in the special */ /* . cases of introducing bulges and chasing */ /* . bulges off the bottom. In these special */ /* . cases and in case the number of shifts */ /* . is NS = 2, there is no 2-by-2 block */ /* . structure to exploit. ==== */ /* Computing MAX */ i__3 = 1, i__4 = *ktop - incol; k1 = max(i__3,i__4); /* Computing MAX */ i__3 = 0, i__4 = ndcol - *kbot; nu = kdu - max(i__3,i__4) - k1 + 1; /* ==== Horizontal Multiply ==== */ i__3 = jbot; i__4 = *nh; for (jcol = min(ndcol,*kbot) + 1; i__4 < 0 ? jcol >= i__3 : jcol <= i__3; jcol += i__4) { /* Computing MIN */ i__5 = *nh, i__7 = jbot - jcol + 1; jlen = min(i__5,i__7); _starpu_dgemm_("C", "N", &nu, &jlen, &nu, &c_b8, &u[k1 + k1 * u_dim1], ldu, &h__[incol + k1 + jcol * h_dim1], ldh, &c_b7, &wh[wh_offset], ldwh); _starpu_dlacpy_("ALL", &nu, &jlen, &wh[wh_offset], ldwh, &h__[ incol + k1 + jcol * h_dim1], ldh); /* L160: */ } /* ==== Vertical multiply ==== */ i__4 = max(*ktop,incol) - 1; i__3 = *nv; for (jrow = jtop; i__3 < 0 ? jrow >= i__4 : jrow <= i__4; jrow += i__3) { /* Computing MIN */ i__5 = *nv, i__7 = max(*ktop,incol) - jrow; jlen = min(i__5,i__7); _starpu_dgemm_("N", "N", &jlen, &nu, &nu, &c_b8, &h__[jrow + ( incol + k1) * h_dim1], ldh, &u[k1 + k1 * u_dim1], ldu, &c_b7, &wv[wv_offset], ldwv); _starpu_dlacpy_("ALL", &jlen, &nu, &wv[wv_offset], ldwv, &h__[ jrow + (incol + k1) * h_dim1], ldh); /* L170: */ } /* ==== Z multiply (also vertical) ==== */ if (*wantz) { i__3 = *ihiz; i__4 = *nv; for (jrow = *iloz; i__4 < 0 ? jrow >= i__3 : jrow <= i__3; jrow += i__4) { /* Computing MIN */ i__5 = *nv, i__7 = *ihiz - jrow + 1; jlen = min(i__5,i__7); _starpu_dgemm_("N", "N", &jlen, &nu, &nu, &c_b8, &z__[jrow + ( incol + k1) * z_dim1], ldz, &u[k1 + k1 * u_dim1], ldu, &c_b7, &wv[wv_offset], ldwv); _starpu_dlacpy_("ALL", &jlen, &nu, &wv[wv_offset], ldwv, &z__[ jrow + (incol + k1) * z_dim1], ldz) ; /* L180: */ } } } else { /* ==== Updates exploiting U's 2-by-2 block structure. */ /* . (I2, I4, J2, J4 are the last rows and columns */ /* . of the blocks.) ==== */ i2 = (kdu + 1) / 2; i4 = kdu; j2 = i4 - i2; j4 = kdu; /* ==== KZS and KNZ deal with the band of zeros */ /* . along the diagonal of one of the triangular */ /* . blocks. ==== */ kzs = j4 - j2 - (ns + 1); knz = ns + 1; /* ==== Horizontal multiply ==== */ i__4 = jbot; i__3 = *nh; for (jcol = min(ndcol,*kbot) + 1; i__3 < 0 ? jcol >= i__4 : jcol <= i__4; jcol += i__3) { /* Computing MIN */ i__5 = *nh, i__7 = jbot - jcol + 1; jlen = min(i__5,i__7); /* ==== Copy bottom of H to top+KZS of scratch ==== */ /* (The first KZS rows get multiplied by zero.) ==== */ _starpu_dlacpy_("ALL", &knz, &jlen, &h__[incol + 1 + j2 + jcol * h_dim1], ldh, &wh[kzs + 1 + wh_dim1], ldwh); /* ==== Multiply by U21' ==== */ _starpu_dlaset_("ALL", &kzs, &jlen, &c_b7, &c_b7, &wh[wh_offset], ldwh); _starpu_dtrmm_("L", "U", "C", "N", &knz, &jlen, &c_b8, &u[j2 + 1 + (kzs + 1) * u_dim1], ldu, &wh[kzs + 1 + wh_dim1] , ldwh); /* ==== Multiply top of H by U11' ==== */ _starpu_dgemm_("C", "N", &i2, &jlen, &j2, &c_b8, &u[u_offset], ldu, &h__[incol + 1 + jcol * h_dim1], ldh, &c_b8, &wh[wh_offset], ldwh); /* ==== Copy top of H to bottom of WH ==== */ _starpu_dlacpy_("ALL", &j2, &jlen, &h__[incol + 1 + jcol * h_dim1] , ldh, &wh[i2 + 1 + wh_dim1], ldwh); /* ==== Multiply by U21' ==== */ _starpu_dtrmm_("L", "L", "C", "N", &j2, &jlen, &c_b8, &u[(i2 + 1) * u_dim1 + 1], ldu, &wh[i2 + 1 + wh_dim1], ldwh); /* ==== Multiply by U22 ==== */ i__5 = i4 - i2; i__7 = j4 - j2; _starpu_dgemm_("C", "N", &i__5, &jlen, &i__7, &c_b8, &u[j2 + 1 + ( i2 + 1) * u_dim1], ldu, &h__[incol + 1 + j2 + jcol * h_dim1], ldh, &c_b8, &wh[i2 + 1 + wh_dim1], ldwh); /* ==== Copy it back ==== */ _starpu_dlacpy_("ALL", &kdu, &jlen, &wh[wh_offset], ldwh, &h__[ incol + 1 + jcol * h_dim1], ldh); /* L190: */ } /* ==== Vertical multiply ==== */ i__3 = max(incol,*ktop) - 1; i__4 = *nv; for (jrow = jtop; i__4 < 0 ? jrow >= i__3 : jrow <= i__3; jrow += i__4) { /* Computing MIN */ i__5 = *nv, i__7 = max(incol,*ktop) - jrow; jlen = min(i__5,i__7); /* ==== Copy right of H to scratch (the first KZS */ /* . columns get multiplied by zero) ==== */ _starpu_dlacpy_("ALL", &jlen, &knz, &h__[jrow + (incol + 1 + j2) * h_dim1], ldh, &wv[(kzs + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U21 ==== */ _starpu_dlaset_("ALL", &jlen, &kzs, &c_b7, &c_b7, &wv[wv_offset], ldwv); _starpu_dtrmm_("R", "U", "N", "N", &jlen, &knz, &c_b8, &u[j2 + 1 + (kzs + 1) * u_dim1], ldu, &wv[(kzs + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U11 ==== */ _starpu_dgemm_("N", "N", &jlen, &i2, &j2, &c_b8, &h__[jrow + ( incol + 1) * h_dim1], ldh, &u[u_offset], ldu, & c_b8, &wv[wv_offset], ldwv); /* ==== Copy left of H to right of scratch ==== */ _starpu_dlacpy_("ALL", &jlen, &j2, &h__[jrow + (incol + 1) * h_dim1], ldh, &wv[(i2 + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U21 ==== */ i__5 = i4 - i2; _starpu_dtrmm_("R", "L", "N", "N", &jlen, &i__5, &c_b8, &u[(i2 + 1) * u_dim1 + 1], ldu, &wv[(i2 + 1) * wv_dim1 + 1] , ldwv); /* ==== Multiply by U22 ==== */ i__5 = i4 - i2; i__7 = j4 - j2; _starpu_dgemm_("N", "N", &jlen, &i__5, &i__7, &c_b8, &h__[jrow + ( incol + 1 + j2) * h_dim1], ldh, &u[j2 + 1 + (i2 + 1) * u_dim1], ldu, &c_b8, &wv[(i2 + 1) * wv_dim1 + 1], ldwv); /* ==== Copy it back ==== */ _starpu_dlacpy_("ALL", &jlen, &kdu, &wv[wv_offset], ldwv, &h__[ jrow + (incol + 1) * h_dim1], ldh); /* L200: */ } /* ==== Multiply Z (also vertical) ==== */ if (*wantz) { i__4 = *ihiz; i__3 = *nv; for (jrow = *iloz; i__3 < 0 ? jrow >= i__4 : jrow <= i__4; jrow += i__3) { /* Computing MIN */ i__5 = *nv, i__7 = *ihiz - jrow + 1; jlen = min(i__5,i__7); /* ==== Copy right of Z to left of scratch (first */ /* . KZS columns get multiplied by zero) ==== */ _starpu_dlacpy_("ALL", &jlen, &knz, &z__[jrow + (incol + 1 + j2) * z_dim1], ldz, &wv[(kzs + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U12 ==== */ _starpu_dlaset_("ALL", &jlen, &kzs, &c_b7, &c_b7, &wv[ wv_offset], ldwv); _starpu_dtrmm_("R", "U", "N", "N", &jlen, &knz, &c_b8, &u[j2 + 1 + (kzs + 1) * u_dim1], ldu, &wv[(kzs + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U11 ==== */ _starpu_dgemm_("N", "N", &jlen, &i2, &j2, &c_b8, &z__[jrow + ( incol + 1) * z_dim1], ldz, &u[u_offset], ldu, &c_b8, &wv[wv_offset], ldwv); /* ==== Copy left of Z to right of scratch ==== */ _starpu_dlacpy_("ALL", &jlen, &j2, &z__[jrow + (incol + 1) * z_dim1], ldz, &wv[(i2 + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U21 ==== */ i__5 = i4 - i2; _starpu_dtrmm_("R", "L", "N", "N", &jlen, &i__5, &c_b8, &u[( i2 + 1) * u_dim1 + 1], ldu, &wv[(i2 + 1) * wv_dim1 + 1], ldwv); /* ==== Multiply by U22 ==== */ i__5 = i4 - i2; i__7 = j4 - j2; _starpu_dgemm_("N", "N", &jlen, &i__5, &i__7, &c_b8, &z__[ jrow + (incol + 1 + j2) * z_dim1], ldz, &u[j2 + 1 + (i2 + 1) * u_dim1], ldu, &c_b8, &wv[(i2 + 1) * wv_dim1 + 1], ldwv); /* ==== Copy the result back to Z ==== */ _starpu_dlacpy_("ALL", &jlen, &kdu, &wv[wv_offset], ldwv, & z__[jrow + (incol + 1) * z_dim1], ldz); /* L210: */ } } } } /* L220: */ } /* ==== End of DLAQR5 ==== */ return 0; } /* _starpu_dlaqr5_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqsb.c000066400000000000000000000124331413463044200206170ustar00rootroot00000000000000/* dlaqsb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaqsb_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, char *equed) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j; doublereal cj, large; extern logical _starpu_lsame_(char *, char *); doublereal small; extern doublereal _starpu_dlamch_(char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQSB equilibrates a symmetric band matrix A using the scaling */ /* factors in the vector S. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of super-diagonals of the matrix A if UPLO = 'U', */ /* or the number of sub-diagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, if INFO = 0, the triangular factor U or L from the */ /* Cholesky factorization A = U'*U or A = L*L' of the band */ /* matrix A, in the same storage format as A. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* S (input) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A. */ /* SCOND (input) DOUBLE PRECISION */ /* Ratio of the smallest S(i) to the largest S(i). */ /* AMAX (input) DOUBLE PRECISION */ /* Absolute value of largest matrix entry. */ /* EQUED (output) CHARACTER*1 */ /* Specifies whether or not equilibration was done. */ /* = 'N': No equilibration. */ /* = 'Y': Equilibration was done, i.e., A has been replaced by */ /* diag(S) * A * diag(S). */ /* Internal Parameters */ /* =================== */ /* THRESH is a threshold value used to decide if scaling should be done */ /* based on the ratio of the scaling factors. If SCOND < THRESH, */ /* scaling is done. */ /* LARGE and SMALL are threshold values used to decide if scaling should */ /* be done based on the absolute size of the largest matrix element. */ /* If AMAX > LARGE or AMAX < SMALL, scaling is done. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --s; /* Function Body */ if (*n <= 0) { *(unsigned char *)equed = 'N'; return 0; } /* Initialize LARGE and SMALL. */ small = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); large = 1. / small; if (*scond >= .1 && *amax >= small && *amax <= large) { /* No equilibration */ *(unsigned char *)equed = 'N'; } else { /* Replace A by diag(S) * A * diag(S). */ if (_starpu_lsame_(uplo, "U")) { /* Upper triangle of A is stored in band format. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = s[j]; /* Computing MAX */ i__2 = 1, i__3 = j - *kd; i__4 = j; for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) { ab[*kd + 1 + i__ - j + j * ab_dim1] = cj * s[i__] * ab[* kd + 1 + i__ - j + j * ab_dim1]; /* L10: */ } /* L20: */ } } else { /* Lower triangle of A is stored. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = s[j]; /* Computing MIN */ i__2 = *n, i__3 = j + *kd; i__4 = min(i__2,i__3); for (i__ = j; i__ <= i__4; ++i__) { ab[i__ + 1 - j + j * ab_dim1] = cj * s[i__] * ab[i__ + 1 - j + j * ab_dim1]; /* L30: */ } /* L40: */ } } *(unsigned char *)equed = 'Y'; } return 0; /* End of DLAQSB */ } /* _starpu_dlaqsb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqsp.c000066400000000000000000000110621413463044200206320ustar00rootroot00000000000000/* dlaqsp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaqsp_(char *uplo, integer *n, doublereal *ap, doublereal *s, doublereal *scond, doublereal *amax, char *equed) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j, jc; doublereal cj, large; extern logical _starpu_lsame_(char *, char *); doublereal small; extern doublereal _starpu_dlamch_(char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQSP equilibrates a symmetric matrix A using the scaling factors */ /* in the vector S. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, the equilibrated matrix: diag(S) * A * diag(S), in */ /* the same storage format as A. */ /* S (input) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A. */ /* SCOND (input) DOUBLE PRECISION */ /* Ratio of the smallest S(i) to the largest S(i). */ /* AMAX (input) DOUBLE PRECISION */ /* Absolute value of largest matrix entry. */ /* EQUED (output) CHARACTER*1 */ /* Specifies whether or not equilibration was done. */ /* = 'N': No equilibration. */ /* = 'Y': Equilibration was done, i.e., A has been replaced by */ /* diag(S) * A * diag(S). */ /* Internal Parameters */ /* =================== */ /* THRESH is a threshold value used to decide if scaling should be done */ /* based on the ratio of the scaling factors. If SCOND < THRESH, */ /* scaling is done. */ /* LARGE and SMALL are threshold values used to decide if scaling should */ /* be done based on the absolute size of the largest matrix element. */ /* If AMAX > LARGE or AMAX < SMALL, scaling is done. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --s; --ap; /* Function Body */ if (*n <= 0) { *(unsigned char *)equed = 'N'; return 0; } /* Initialize LARGE and SMALL. */ small = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); large = 1. / small; if (*scond >= .1 && *amax >= small && *amax <= large) { /* No equilibration */ *(unsigned char *)equed = 'N'; } else { /* Replace A by diag(S) * A * diag(S). */ if (_starpu_lsame_(uplo, "U")) { /* Upper triangle of A is stored. */ jc = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = s[j]; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ap[jc + i__ - 1] = cj * s[i__] * ap[jc + i__ - 1]; /* L10: */ } jc += j; /* L20: */ } } else { /* Lower triangle of A is stored. */ jc = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = s[j]; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { ap[jc + i__ - j] = cj * s[i__] * ap[jc + i__ - j]; /* L30: */ } jc = jc + *n - j + 1; /* L40: */ } } *(unsigned char *)equed = 'Y'; } return 0; /* End of DLAQSP */ } /* _starpu_dlaqsp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqsy.c000066400000000000000000000114611413463044200206460ustar00rootroot00000000000000/* dlaqsy.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaqsy_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j; doublereal cj, large; extern logical _starpu_lsame_(char *, char *); doublereal small; extern doublereal _starpu_dlamch_(char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQSY equilibrates a symmetric matrix A using the scaling factors */ /* in the vector S. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n by n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n by n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if EQUED = 'Y', the equilibrated matrix: */ /* diag(S) * A * diag(S). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(N,1). */ /* S (input) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A. */ /* SCOND (input) DOUBLE PRECISION */ /* Ratio of the smallest S(i) to the largest S(i). */ /* AMAX (input) DOUBLE PRECISION */ /* Absolute value of largest matrix entry. */ /* EQUED (output) CHARACTER*1 */ /* Specifies whether or not equilibration was done. */ /* = 'N': No equilibration. */ /* = 'Y': Equilibration was done, i.e., A has been replaced by */ /* diag(S) * A * diag(S). */ /* Internal Parameters */ /* =================== */ /* THRESH is a threshold value used to decide if scaling should be done */ /* based on the ratio of the scaling factors. If SCOND < THRESH, */ /* scaling is done. */ /* LARGE and SMALL are threshold values used to decide if scaling should */ /* be done based on the absolute size of the largest matrix element. */ /* If AMAX > LARGE or AMAX < SMALL, scaling is done. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s; /* Function Body */ if (*n <= 0) { *(unsigned char *)equed = 'N'; return 0; } /* Initialize LARGE and SMALL. */ small = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); large = 1. / small; if (*scond >= .1 && *amax >= small && *amax <= large) { /* No equilibration */ *(unsigned char *)equed = 'N'; } else { /* Replace A by diag(S) * A * diag(S). */ if (_starpu_lsame_(uplo, "U")) { /* Upper triangle of A is stored. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = s[j]; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = cj * s[i__] * a[i__ + j * a_dim1]; /* L10: */ } /* L20: */ } } else { /* Lower triangle of A is stored. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { cj = s[j]; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = cj * s[i__] * a[i__ + j * a_dim1]; /* L30: */ } /* L40: */ } } *(unsigned char *)equed = 'Y'; } return 0; /* End of DLAQSY */ } /* _starpu_dlaqsy_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaqtr.c000066400000000000000000000517511413463044200206460ustar00rootroot00000000000000/* dlaqtr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static logical c_false = FALSE_; static integer c__2 = 2; static doublereal c_b21 = 1.; static doublereal c_b25 = 0.; static logical c_true = TRUE_; /* Subroutine */ int _starpu_dlaqtr_(logical *ltran, logical *lreal, integer *n, doublereal *t, integer *ldt, doublereal *b, doublereal *w, doublereal *scale, doublereal *x, doublereal *work, integer *info) { /* System generated locals */ integer t_dim1, t_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ doublereal d__[4] /* was [2][2] */; integer i__, j, k; doublereal v[4] /* was [2][2] */, z__; integer j1, j2, n1, n2; doublereal si, xj, sr, rec, eps, tjj, tmp; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer ierr; doublereal smin, xmax; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer jnext; doublereal sminw, xnorm; extern /* Subroutine */ int _starpu_dlaln2_(logical *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal * , doublereal *, integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal scaloc; extern /* Subroutine */ int _starpu_dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal bignum; logical notran; doublereal smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAQTR solves the real quasi-triangular system */ /* op(T)*p = scale*c, if LREAL = .TRUE. */ /* or the complex quasi-triangular systems */ /* op(T + iB)*(p+iq) = scale*(c+id), if LREAL = .FALSE. */ /* in real arithmetic, where T is upper quasi-triangular. */ /* If LREAL = .FALSE., then the first diagonal block of T must be */ /* 1 by 1, B is the specially structured matrix */ /* B = [ b(1) b(2) ... b(n) ] */ /* [ w ] */ /* [ w ] */ /* [ . ] */ /* [ w ] */ /* op(A) = A or A', A' denotes the conjugate transpose of */ /* matrix A. */ /* On input, X = [ c ]. On output, X = [ p ]. */ /* [ d ] [ q ] */ /* This subroutine is designed for the condition number estimation */ /* in routine DTRSNA. */ /* Arguments */ /* ========= */ /* LTRAN (input) LOGICAL */ /* On entry, LTRAN specifies the option of conjugate transpose: */ /* = .FALSE., op(T+i*B) = T+i*B, */ /* = .TRUE., op(T+i*B) = (T+i*B)'. */ /* LREAL (input) LOGICAL */ /* On entry, LREAL specifies the input matrix structure: */ /* = .FALSE., the input is complex */ /* = .TRUE., the input is real */ /* N (input) INTEGER */ /* On entry, N specifies the order of T+i*B. N >= 0. */ /* T (input) DOUBLE PRECISION array, dimension (LDT,N) */ /* On entry, T contains a matrix in Schur canonical form. */ /* If LREAL = .FALSE., then the first diagonal block of T mu */ /* be 1 by 1. */ /* LDT (input) INTEGER */ /* The leading dimension of the matrix T. LDT >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (N) */ /* On entry, B contains the elements to form the matrix */ /* B as described above. */ /* If LREAL = .TRUE., B is not referenced. */ /* W (input) DOUBLE PRECISION */ /* On entry, W is the diagonal element of the matrix B. */ /* If LREAL = .TRUE., W is not referenced. */ /* SCALE (output) DOUBLE PRECISION */ /* On exit, SCALE is the scale factor. */ /* X (input/output) DOUBLE PRECISION array, dimension (2*N) */ /* On entry, X contains the right hand side of the system. */ /* On exit, X is overwritten by the solution. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* On exit, INFO is set to */ /* 0: successful exit. */ /* 1: the some diagonal 1 by 1 block has been perturbed by */ /* a small number SMIN to keep nonsingularity. */ /* 2: the some diagonal 2 by 2 block has been perturbed by */ /* a small number in DLALN2 to keep nonsingularity. */ /* NOTE: In the interests of speed, this routine does not */ /* check the inputs for errors. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Do not test the input parameters for errors */ /* Parameter adjustments */ t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; --b; --x; --work; /* Function Body */ notran = ! (*ltran); *info = 0; /* Quick return if possible */ if (*n == 0) { return 0; } /* Set constants to control overflow */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; bignum = 1. / smlnum; xnorm = _starpu_dlange_("M", n, n, &t[t_offset], ldt, d__); if (! (*lreal)) { /* Computing MAX */ d__1 = xnorm, d__2 = abs(*w), d__1 = max(d__1,d__2), d__2 = _starpu_dlange_( "M", n, &c__1, &b[1], n, d__); xnorm = max(d__1,d__2); } /* Computing MAX */ d__1 = smlnum, d__2 = eps * xnorm; smin = max(d__1,d__2); /* Compute 1-norm of each column of strictly upper triangular */ /* part of T to control overflow in triangular solver. */ work[1] = 0.; i__1 = *n; for (j = 2; j <= i__1; ++j) { i__2 = j - 1; work[j] = _starpu_dasum_(&i__2, &t[j * t_dim1 + 1], &c__1); /* L10: */ } if (! (*lreal)) { i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { work[i__] += (d__1 = b[i__], abs(d__1)); /* L20: */ } } n2 = *n << 1; n1 = *n; if (! (*lreal)) { n1 = n2; } k = _starpu_idamax_(&n1, &x[1], &c__1); xmax = (d__1 = x[k], abs(d__1)); *scale = 1.; if (xmax > bignum) { *scale = bignum / xmax; _starpu_dscal_(&n1, scale, &x[1], &c__1); xmax = bignum; } if (*lreal) { if (notran) { /* Solve T*p = scale*c */ jnext = *n; for (j = *n; j >= 1; --j) { if (j > jnext) { goto L30; } j1 = j; j2 = j; jnext = j - 1; if (j > 1) { if (t[j + (j - 1) * t_dim1] != 0.) { j1 = j - 1; jnext = j - 2; } } if (j1 == j2) { /* Meet 1 by 1 diagonal block */ /* Scale to avoid overflow when computing */ /* x(j) = b(j)/T(j,j) */ xj = (d__1 = x[j1], abs(d__1)); tjj = (d__1 = t[j1 + j1 * t_dim1], abs(d__1)); tmp = t[j1 + j1 * t_dim1]; if (tjj < smin) { tmp = smin; tjj = smin; *info = 1; } if (xj == 0.) { goto L30; } if (tjj < 1.) { if (xj > bignum * tjj) { rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j1] /= tmp; xj = (d__1 = x[j1], abs(d__1)); /* Scale x if necessary to avoid overflow when adding a */ /* multiple of column j1 of T. */ if (xj > 1.) { rec = 1. / xj; if (work[j1] > (bignum - xmax) * rec) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; } } if (j1 > 1) { i__1 = j1 - 1; d__1 = -x[j1]; _starpu_daxpy_(&i__1, &d__1, &t[j1 * t_dim1 + 1], &c__1, &x[1] , &c__1); i__1 = j1 - 1; k = _starpu_idamax_(&i__1, &x[1], &c__1); xmax = (d__1 = x[k], abs(d__1)); } } else { /* Meet 2 by 2 diagonal block */ /* Call 2 by 2 linear system solve, to take */ /* care of possible overflow by scaling factor. */ d__[0] = x[j1]; d__[1] = x[j2]; _starpu_dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b21, &t[j1 + j1 * t_dim1], ldt, &c_b21, &c_b21, d__, &c__2, & c_b25, &c_b25, v, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 2; } if (scaloc != 1.) { _starpu_dscal_(n, &scaloc, &x[1], &c__1); *scale *= scaloc; } x[j1] = v[0]; x[j2] = v[1]; /* Scale V(1,1) (= X(J1)) and/or V(2,1) (=X(J2)) */ /* to avoid overflow in updating right-hand side. */ /* Computing MAX */ d__1 = abs(v[0]), d__2 = abs(v[1]); xj = max(d__1,d__2); if (xj > 1.) { rec = 1. / xj; /* Computing MAX */ d__1 = work[j1], d__2 = work[j2]; if (max(d__1,d__2) > (bignum - xmax) * rec) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; } } /* Update right-hand side */ if (j1 > 1) { i__1 = j1 - 1; d__1 = -x[j1]; _starpu_daxpy_(&i__1, &d__1, &t[j1 * t_dim1 + 1], &c__1, &x[1] , &c__1); i__1 = j1 - 1; d__1 = -x[j2]; _starpu_daxpy_(&i__1, &d__1, &t[j2 * t_dim1 + 1], &c__1, &x[1] , &c__1); i__1 = j1 - 1; k = _starpu_idamax_(&i__1, &x[1], &c__1); xmax = (d__1 = x[k], abs(d__1)); } } L30: ; } } else { /* Solve T'*p = scale*c */ jnext = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (j < jnext) { goto L40; } j1 = j; j2 = j; jnext = j + 1; if (j < *n) { if (t[j + 1 + j * t_dim1] != 0.) { j2 = j + 1; jnext = j + 2; } } if (j1 == j2) { /* 1 by 1 diagonal block */ /* Scale if necessary to avoid overflow in forming the */ /* right-hand side element by inner product. */ xj = (d__1 = x[j1], abs(d__1)); if (xmax > 1.) { rec = 1. / xmax; if (work[j1] > (bignum - xj) * rec) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } i__2 = j1 - 1; x[j1] -= _starpu_ddot_(&i__2, &t[j1 * t_dim1 + 1], &c__1, &x[1], & c__1); xj = (d__1 = x[j1], abs(d__1)); tjj = (d__1 = t[j1 + j1 * t_dim1], abs(d__1)); tmp = t[j1 + j1 * t_dim1]; if (tjj < smin) { tmp = smin; tjj = smin; *info = 1; } if (tjj < 1.) { if (xj > bignum * tjj) { rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j1] /= tmp; /* Computing MAX */ d__2 = xmax, d__3 = (d__1 = x[j1], abs(d__1)); xmax = max(d__2,d__3); } else { /* 2 by 2 diagonal block */ /* Scale if necessary to avoid overflow in forming the */ /* right-hand side elements by inner product. */ /* Computing MAX */ d__3 = (d__1 = x[j1], abs(d__1)), d__4 = (d__2 = x[j2], abs(d__2)); xj = max(d__3,d__4); if (xmax > 1.) { rec = 1. / xmax; /* Computing MAX */ d__1 = work[j2], d__2 = work[j1]; if (max(d__1,d__2) > (bignum - xj) * rec) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } i__2 = j1 - 1; d__[0] = x[j1] - _starpu_ddot_(&i__2, &t[j1 * t_dim1 + 1], &c__1, &x[1], &c__1); i__2 = j1 - 1; d__[1] = x[j2] - _starpu_ddot_(&i__2, &t[j2 * t_dim1 + 1], &c__1, &x[1], &c__1); _starpu_dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b21, &t[j1 + j1 * t_dim1], ldt, &c_b21, &c_b21, d__, &c__2, &c_b25, &c_b25, v, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 2; } if (scaloc != 1.) { _starpu_dscal_(n, &scaloc, &x[1], &c__1); *scale *= scaloc; } x[j1] = v[0]; x[j2] = v[1]; /* Computing MAX */ d__3 = (d__1 = x[j1], abs(d__1)), d__4 = (d__2 = x[j2], abs(d__2)), d__3 = max(d__3,d__4); xmax = max(d__3,xmax); } L40: ; } } } else { /* Computing MAX */ d__1 = eps * abs(*w); sminw = max(d__1,smin); if (notran) { /* Solve (T + iB)*(p+iq) = c+id */ jnext = *n; for (j = *n; j >= 1; --j) { if (j > jnext) { goto L70; } j1 = j; j2 = j; jnext = j - 1; if (j > 1) { if (t[j + (j - 1) * t_dim1] != 0.) { j1 = j - 1; jnext = j - 2; } } if (j1 == j2) { /* 1 by 1 diagonal block */ /* Scale if necessary to avoid overflow in division */ z__ = *w; if (j1 == 1) { z__ = b[1]; } xj = (d__1 = x[j1], abs(d__1)) + (d__2 = x[*n + j1], abs( d__2)); tjj = (d__1 = t[j1 + j1 * t_dim1], abs(d__1)) + abs(z__); tmp = t[j1 + j1 * t_dim1]; if (tjj < sminw) { tmp = sminw; tjj = sminw; *info = 1; } if (xj == 0.) { goto L70; } if (tjj < 1.) { if (xj > bignum * tjj) { rec = 1. / xj; _starpu_dscal_(&n2, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } _starpu_dladiv_(&x[j1], &x[*n + j1], &tmp, &z__, &sr, &si); x[j1] = sr; x[*n + j1] = si; xj = (d__1 = x[j1], abs(d__1)) + (d__2 = x[*n + j1], abs( d__2)); /* Scale x if necessary to avoid overflow when adding a */ /* multiple of column j1 of T. */ if (xj > 1.) { rec = 1. / xj; if (work[j1] > (bignum - xmax) * rec) { _starpu_dscal_(&n2, &rec, &x[1], &c__1); *scale *= rec; } } if (j1 > 1) { i__1 = j1 - 1; d__1 = -x[j1]; _starpu_daxpy_(&i__1, &d__1, &t[j1 * t_dim1 + 1], &c__1, &x[1] , &c__1); i__1 = j1 - 1; d__1 = -x[*n + j1]; _starpu_daxpy_(&i__1, &d__1, &t[j1 * t_dim1 + 1], &c__1, &x[* n + 1], &c__1); x[1] += b[j1] * x[*n + j1]; x[*n + 1] -= b[j1] * x[j1]; xmax = 0.; i__1 = j1 - 1; for (k = 1; k <= i__1; ++k) { /* Computing MAX */ d__3 = xmax, d__4 = (d__1 = x[k], abs(d__1)) + ( d__2 = x[k + *n], abs(d__2)); xmax = max(d__3,d__4); /* L50: */ } } } else { /* Meet 2 by 2 diagonal block */ d__[0] = x[j1]; d__[1] = x[j2]; d__[2] = x[*n + j1]; d__[3] = x[*n + j2]; d__1 = -(*w); _starpu_dlaln2_(&c_false, &c__2, &c__2, &sminw, &c_b21, &t[j1 + j1 * t_dim1], ldt, &c_b21, &c_b21, d__, &c__2, & c_b25, &d__1, v, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 2; } if (scaloc != 1.) { i__1 = *n << 1; _starpu_dscal_(&i__1, &scaloc, &x[1], &c__1); *scale = scaloc * *scale; } x[j1] = v[0]; x[j2] = v[1]; x[*n + j1] = v[2]; x[*n + j2] = v[3]; /* Scale X(J1), .... to avoid overflow in */ /* updating right hand side. */ /* Computing MAX */ d__1 = abs(v[0]) + abs(v[2]), d__2 = abs(v[1]) + abs(v[3]) ; xj = max(d__1,d__2); if (xj > 1.) { rec = 1. / xj; /* Computing MAX */ d__1 = work[j1], d__2 = work[j2]; if (max(d__1,d__2) > (bignum - xmax) * rec) { _starpu_dscal_(&n2, &rec, &x[1], &c__1); *scale *= rec; } } /* Update the right-hand side. */ if (j1 > 1) { i__1 = j1 - 1; d__1 = -x[j1]; _starpu_daxpy_(&i__1, &d__1, &t[j1 * t_dim1 + 1], &c__1, &x[1] , &c__1); i__1 = j1 - 1; d__1 = -x[j2]; _starpu_daxpy_(&i__1, &d__1, &t[j2 * t_dim1 + 1], &c__1, &x[1] , &c__1); i__1 = j1 - 1; d__1 = -x[*n + j1]; _starpu_daxpy_(&i__1, &d__1, &t[j1 * t_dim1 + 1], &c__1, &x[* n + 1], &c__1); i__1 = j1 - 1; d__1 = -x[*n + j2]; _starpu_daxpy_(&i__1, &d__1, &t[j2 * t_dim1 + 1], &c__1, &x[* n + 1], &c__1); x[1] = x[1] + b[j1] * x[*n + j1] + b[j2] * x[*n + j2]; x[*n + 1] = x[*n + 1] - b[j1] * x[j1] - b[j2] * x[j2]; xmax = 0.; i__1 = j1 - 1; for (k = 1; k <= i__1; ++k) { /* Computing MAX */ d__3 = (d__1 = x[k], abs(d__1)) + (d__2 = x[k + * n], abs(d__2)); xmax = max(d__3,xmax); /* L60: */ } } } L70: ; } } else { /* Solve (T + iB)'*(p+iq) = c+id */ jnext = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (j < jnext) { goto L80; } j1 = j; j2 = j; jnext = j + 1; if (j < *n) { if (t[j + 1 + j * t_dim1] != 0.) { j2 = j + 1; jnext = j + 2; } } if (j1 == j2) { /* 1 by 1 diagonal block */ /* Scale if necessary to avoid overflow in forming the */ /* right-hand side element by inner product. */ xj = (d__1 = x[j1], abs(d__1)) + (d__2 = x[j1 + *n], abs( d__2)); if (xmax > 1.) { rec = 1. / xmax; if (work[j1] > (bignum - xj) * rec) { _starpu_dscal_(&n2, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } i__2 = j1 - 1; x[j1] -= _starpu_ddot_(&i__2, &t[j1 * t_dim1 + 1], &c__1, &x[1], & c__1); i__2 = j1 - 1; x[*n + j1] -= _starpu_ddot_(&i__2, &t[j1 * t_dim1 + 1], &c__1, &x[ *n + 1], &c__1); if (j1 > 1) { x[j1] -= b[j1] * x[*n + 1]; x[*n + j1] += b[j1] * x[1]; } xj = (d__1 = x[j1], abs(d__1)) + (d__2 = x[j1 + *n], abs( d__2)); z__ = *w; if (j1 == 1) { z__ = b[1]; } /* Scale if necessary to avoid overflow in */ /* complex division */ tjj = (d__1 = t[j1 + j1 * t_dim1], abs(d__1)) + abs(z__); tmp = t[j1 + j1 * t_dim1]; if (tjj < sminw) { tmp = sminw; tjj = sminw; *info = 1; } if (tjj < 1.) { if (xj > bignum * tjj) { rec = 1. / xj; _starpu_dscal_(&n2, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } d__1 = -z__; _starpu_dladiv_(&x[j1], &x[*n + j1], &tmp, &d__1, &sr, &si); x[j1] = sr; x[j1 + *n] = si; /* Computing MAX */ d__3 = (d__1 = x[j1], abs(d__1)) + (d__2 = x[j1 + *n], abs(d__2)); xmax = max(d__3,xmax); } else { /* 2 by 2 diagonal block */ /* Scale if necessary to avoid overflow in forming the */ /* right-hand side element by inner product. */ /* Computing MAX */ d__5 = (d__1 = x[j1], abs(d__1)) + (d__2 = x[*n + j1], abs(d__2)), d__6 = (d__3 = x[j2], abs(d__3)) + ( d__4 = x[*n + j2], abs(d__4)); xj = max(d__5,d__6); if (xmax > 1.) { rec = 1. / xmax; /* Computing MAX */ d__1 = work[j1], d__2 = work[j2]; if (max(d__1,d__2) > (bignum - xj) / xmax) { _starpu_dscal_(&n2, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } i__2 = j1 - 1; d__[0] = x[j1] - _starpu_ddot_(&i__2, &t[j1 * t_dim1 + 1], &c__1, &x[1], &c__1); i__2 = j1 - 1; d__[1] = x[j2] - _starpu_ddot_(&i__2, &t[j2 * t_dim1 + 1], &c__1, &x[1], &c__1); i__2 = j1 - 1; d__[2] = x[*n + j1] - _starpu_ddot_(&i__2, &t[j1 * t_dim1 + 1], & c__1, &x[*n + 1], &c__1); i__2 = j1 - 1; d__[3] = x[*n + j2] - _starpu_ddot_(&i__2, &t[j2 * t_dim1 + 1], & c__1, &x[*n + 1], &c__1); d__[0] -= b[j1] * x[*n + 1]; d__[1] -= b[j2] * x[*n + 1]; d__[2] += b[j1] * x[1]; d__[3] += b[j2] * x[1]; _starpu_dlaln2_(&c_true, &c__2, &c__2, &sminw, &c_b21, &t[j1 + j1 * t_dim1], ldt, &c_b21, &c_b21, d__, &c__2, & c_b25, w, v, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 2; } if (scaloc != 1.) { _starpu_dscal_(&n2, &scaloc, &x[1], &c__1); *scale = scaloc * *scale; } x[j1] = v[0]; x[j2] = v[1]; x[*n + j1] = v[2]; x[*n + j2] = v[3]; /* Computing MAX */ d__5 = (d__1 = x[j1], abs(d__1)) + (d__2 = x[*n + j1], abs(d__2)), d__6 = (d__3 = x[j2], abs(d__3)) + ( d__4 = x[*n + j2], abs(d__4)), d__5 = max(d__5, d__6); xmax = max(d__5,xmax); } L80: ; } } } return 0; /* End of DLAQTR */ } /* _starpu_dlaqtr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlar1v.c000066400000000000000000000311261413463044200205420ustar00rootroot00000000000000/* dlar1v.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlar1v_(integer *n, integer *b1, integer *bn, doublereal *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * lld, doublereal *pivmin, doublereal *gaptol, doublereal *z__, logical *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, doublereal *rqcorr, doublereal *work) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal s; integer r1, r2; doublereal eps, tmp; integer neg1, neg2, indp, inds; doublereal dplus; extern doublereal _starpu_dlamch_(char *); extern logical _starpu_disnan_(doublereal *); integer indlpl, indumn; doublereal dminus; logical sawnan1, sawnan2; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAR1V computes the (scaled) r-th column of the inverse of */ /* the sumbmatrix in rows B1 through BN of the tridiagonal matrix */ /* L D L^T - sigma I. When sigma is close to an eigenvalue, the */ /* computed vector is an accurate eigenvector. Usually, r corresponds */ /* to the index where the eigenvector is largest in magnitude. */ /* The following steps accomplish this computation : */ /* (a) Stationary qd transform, L D L^T - sigma I = L(+) D(+) L(+)^T, */ /* (b) Progressive qd transform, L D L^T - sigma I = U(-) D(-) U(-)^T, */ /* (c) Computation of the diagonal elements of the inverse of */ /* L D L^T - sigma I by combining the above transforms, and choosing */ /* r as the index where the diagonal of the inverse is (one of the) */ /* largest in magnitude. */ /* (d) Computation of the (scaled) r-th column of the inverse using the */ /* twisted factorization obtained by combining the top part of the */ /* the stationary and the bottom part of the progressive transform. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix L D L^T. */ /* B1 (input) INTEGER */ /* First index of the submatrix of L D L^T. */ /* BN (input) INTEGER */ /* Last index of the submatrix of L D L^T. */ /* LAMBDA (input) DOUBLE PRECISION */ /* The shift. In order to compute an accurate eigenvector, */ /* LAMBDA should be a good approximation to an eigenvalue */ /* of L D L^T. */ /* L (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the unit bidiagonal matrix */ /* L, in elements 1 to N-1. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the diagonal matrix D. */ /* LD (input) DOUBLE PRECISION array, dimension (N-1) */ /* The n-1 elements L(i)*D(i). */ /* LLD (input) DOUBLE PRECISION array, dimension (N-1) */ /* The n-1 elements L(i)*L(i)*D(i). */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot in the Sturm sequence. */ /* GAPTOL (input) DOUBLE PRECISION */ /* Tolerance that indicates when eigenvector entries are negligible */ /* w.r.t. their contribution to the residual. */ /* Z (input/output) DOUBLE PRECISION array, dimension (N) */ /* On input, all entries of Z must be set to 0. */ /* On output, Z contains the (scaled) r-th column of the */ /* inverse. The scaling is such that Z(R) equals 1. */ /* WANTNC (input) LOGICAL */ /* Specifies whether NEGCNT has to be computed. */ /* NEGCNT (output) INTEGER */ /* If WANTNC is .TRUE. then NEGCNT = the number of pivots < pivmin */ /* in the matrix factorization L D L^T, and NEGCNT = -1 otherwise. */ /* ZTZ (output) DOUBLE PRECISION */ /* The square of the 2-norm of Z. */ /* MINGMA (output) DOUBLE PRECISION */ /* The reciprocal of the largest (in magnitude) diagonal */ /* element of the inverse of L D L^T - sigma I. */ /* R (input/output) INTEGER */ /* The twist index for the twisted factorization used to */ /* compute Z. */ /* On input, 0 <= R <= N. If R is input as 0, R is set to */ /* the index where (L D L^T - sigma I)^{-1} is largest */ /* in magnitude. If 1 <= R <= N, R is unchanged. */ /* On output, R contains the twist index used to compute Z. */ /* Ideally, R designates the position of the maximum entry in the */ /* eigenvector. */ /* ISUPPZ (output) INTEGER array, dimension (2) */ /* The support of the vector in Z, i.e., the vector Z is */ /* nonzero only in elements ISUPPZ(1) through ISUPPZ( 2 ). */ /* NRMINV (output) DOUBLE PRECISION */ /* NRMINV = 1/SQRT( ZTZ ) */ /* RESID (output) DOUBLE PRECISION */ /* The residual of the FP vector. */ /* RESID = ABS( MINGMA )/SQRT( ZTZ ) */ /* RQCORR (output) DOUBLE PRECISION */ /* The Rayleigh Quotient correction to LAMBDA. */ /* RQCORR = MINGMA*TMP */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --work; --isuppz; --z__; --lld; --ld; --l; --d__; /* Function Body */ eps = _starpu_dlamch_("Precision"); if (*r__ == 0) { r1 = *b1; r2 = *bn; } else { r1 = *r__; r2 = *r__; } /* Storage for LPLUS */ indlpl = 0; /* Storage for UMINUS */ indumn = *n; inds = (*n << 1) + 1; indp = *n * 3 + 1; if (*b1 == 1) { work[inds] = 0.; } else { work[inds + *b1 - 1] = lld[*b1 - 1]; } /* Compute the stationary transform (using the differential form) */ /* until the index R2. */ sawnan1 = FALSE_; neg1 = 0; s = work[inds + *b1 - 1] - *lambda; i__1 = r1 - 1; for (i__ = *b1; i__ <= i__1; ++i__) { dplus = d__[i__] + s; work[indlpl + i__] = ld[i__] / dplus; if (dplus < 0.) { ++neg1; } work[inds + i__] = s * work[indlpl + i__] * l[i__]; s = work[inds + i__] - *lambda; /* L50: */ } sawnan1 = _starpu_disnan_(&s); if (sawnan1) { goto L60; } i__1 = r2 - 1; for (i__ = r1; i__ <= i__1; ++i__) { dplus = d__[i__] + s; work[indlpl + i__] = ld[i__] / dplus; work[inds + i__] = s * work[indlpl + i__] * l[i__]; s = work[inds + i__] - *lambda; /* L51: */ } sawnan1 = _starpu_disnan_(&s); L60: if (sawnan1) { /* Runs a slower version of the above loop if a NaN is detected */ neg1 = 0; s = work[inds + *b1 - 1] - *lambda; i__1 = r1 - 1; for (i__ = *b1; i__ <= i__1; ++i__) { dplus = d__[i__] + s; if (abs(dplus) < *pivmin) { dplus = -(*pivmin); } work[indlpl + i__] = ld[i__] / dplus; if (dplus < 0.) { ++neg1; } work[inds + i__] = s * work[indlpl + i__] * l[i__]; if (work[indlpl + i__] == 0.) { work[inds + i__] = lld[i__]; } s = work[inds + i__] - *lambda; /* L70: */ } i__1 = r2 - 1; for (i__ = r1; i__ <= i__1; ++i__) { dplus = d__[i__] + s; if (abs(dplus) < *pivmin) { dplus = -(*pivmin); } work[indlpl + i__] = ld[i__] / dplus; work[inds + i__] = s * work[indlpl + i__] * l[i__]; if (work[indlpl + i__] == 0.) { work[inds + i__] = lld[i__]; } s = work[inds + i__] - *lambda; /* L71: */ } } /* Compute the progressive transform (using the differential form) */ /* until the index R1 */ sawnan2 = FALSE_; neg2 = 0; work[indp + *bn - 1] = d__[*bn] - *lambda; i__1 = r1; for (i__ = *bn - 1; i__ >= i__1; --i__) { dminus = lld[i__] + work[indp + i__]; tmp = d__[i__] / dminus; if (dminus < 0.) { ++neg2; } work[indumn + i__] = l[i__] * tmp; work[indp + i__ - 1] = work[indp + i__] * tmp - *lambda; /* L80: */ } tmp = work[indp + r1 - 1]; sawnan2 = _starpu_disnan_(&tmp); if (sawnan2) { /* Runs a slower version of the above loop if a NaN is detected */ neg2 = 0; i__1 = r1; for (i__ = *bn - 1; i__ >= i__1; --i__) { dminus = lld[i__] + work[indp + i__]; if (abs(dminus) < *pivmin) { dminus = -(*pivmin); } tmp = d__[i__] / dminus; if (dminus < 0.) { ++neg2; } work[indumn + i__] = l[i__] * tmp; work[indp + i__ - 1] = work[indp + i__] * tmp - *lambda; if (tmp == 0.) { work[indp + i__ - 1] = d__[i__] - *lambda; } /* L100: */ } } /* Find the index (from R1 to R2) of the largest (in magnitude) */ /* diagonal element of the inverse */ *mingma = work[inds + r1 - 1] + work[indp + r1 - 1]; if (*mingma < 0.) { ++neg1; } if (*wantnc) { *negcnt = neg1 + neg2; } else { *negcnt = -1; } if (abs(*mingma) == 0.) { *mingma = eps * work[inds + r1 - 1]; } *r__ = r1; i__1 = r2 - 1; for (i__ = r1; i__ <= i__1; ++i__) { tmp = work[inds + i__] + work[indp + i__]; if (tmp == 0.) { tmp = eps * work[inds + i__]; } if (abs(tmp) <= abs(*mingma)) { *mingma = tmp; *r__ = i__ + 1; } /* L110: */ } /* Compute the FP vector: solve N^T v = e_r */ isuppz[1] = *b1; isuppz[2] = *bn; z__[*r__] = 1.; *ztz = 1.; /* Compute the FP vector upwards from R */ if (! sawnan1 && ! sawnan2) { i__1 = *b1; for (i__ = *r__ - 1; i__ >= i__1; --i__) { z__[i__] = -(work[indlpl + i__] * z__[i__ + 1]); if (((d__1 = z__[i__], abs(d__1)) + (d__2 = z__[i__ + 1], abs( d__2))) * (d__3 = ld[i__], abs(d__3)) < *gaptol) { z__[i__] = 0.; isuppz[1] = i__ + 1; goto L220; } *ztz += z__[i__] * z__[i__]; /* L210: */ } L220: ; } else { /* Run slower loop if NaN occurred. */ i__1 = *b1; for (i__ = *r__ - 1; i__ >= i__1; --i__) { if (z__[i__ + 1] == 0.) { z__[i__] = -(ld[i__ + 1] / ld[i__]) * z__[i__ + 2]; } else { z__[i__] = -(work[indlpl + i__] * z__[i__ + 1]); } if (((d__1 = z__[i__], abs(d__1)) + (d__2 = z__[i__ + 1], abs( d__2))) * (d__3 = ld[i__], abs(d__3)) < *gaptol) { z__[i__] = 0.; isuppz[1] = i__ + 1; goto L240; } *ztz += z__[i__] * z__[i__]; /* L230: */ } L240: ; } /* Compute the FP vector downwards from R in blocks of size BLKSIZ */ if (! sawnan1 && ! sawnan2) { i__1 = *bn - 1; for (i__ = *r__; i__ <= i__1; ++i__) { z__[i__ + 1] = -(work[indumn + i__] * z__[i__]); if (((d__1 = z__[i__], abs(d__1)) + (d__2 = z__[i__ + 1], abs( d__2))) * (d__3 = ld[i__], abs(d__3)) < *gaptol) { z__[i__ + 1] = 0.; isuppz[2] = i__; goto L260; } *ztz += z__[i__ + 1] * z__[i__ + 1]; /* L250: */ } L260: ; } else { /* Run slower loop if NaN occurred. */ i__1 = *bn - 1; for (i__ = *r__; i__ <= i__1; ++i__) { if (z__[i__] == 0.) { z__[i__ + 1] = -(ld[i__ - 1] / ld[i__]) * z__[i__ - 1]; } else { z__[i__ + 1] = -(work[indumn + i__] * z__[i__]); } if (((d__1 = z__[i__], abs(d__1)) + (d__2 = z__[i__ + 1], abs( d__2))) * (d__3 = ld[i__], abs(d__3)) < *gaptol) { z__[i__ + 1] = 0.; isuppz[2] = i__; goto L280; } *ztz += z__[i__ + 1] * z__[i__ + 1]; /* L270: */ } L280: ; } /* Compute quantities for convergence test */ tmp = 1. / *ztz; *nrminv = sqrt(tmp); *resid = abs(*mingma) * *nrminv; *rqcorr = *mingma * tmp; return 0; /* End of DLAR1V */ } /* _starpu_dlar1v_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlar2v.c000066400000000000000000000062301413463044200205410ustar00rootroot00000000000000/* dlar2v.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlar2v_(integer *n, doublereal *x, doublereal *y, doublereal *z__, integer *incx, doublereal *c__, doublereal *s, integer *incc) { /* System generated locals */ integer i__1; /* Local variables */ integer i__; doublereal t1, t2, t3, t4, t5, t6; integer ic; doublereal ci, si; integer ix; doublereal xi, yi, zi; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAR2V applies a vector of real plane rotations from both sides to */ /* a sequence of 2-by-2 real symmetric matrices, defined by the elements */ /* of the vectors x, y and z. For i = 1,2,...,n */ /* ( x(i) z(i) ) := ( c(i) s(i) ) ( x(i) z(i) ) ( c(i) -s(i) ) */ /* ( z(i) y(i) ) ( -s(i) c(i) ) ( z(i) y(i) ) ( s(i) c(i) ) */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of plane rotations to be applied. */ /* X (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCX) */ /* The vector x. */ /* Y (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCX) */ /* The vector y. */ /* Z (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCX) */ /* The vector z. */ /* INCX (input) INTEGER */ /* The increment between elements of X, Y and Z. INCX > 0. */ /* C (input) DOUBLE PRECISION array, dimension (1+(N-1)*INCC) */ /* The cosines of the plane rotations. */ /* S (input) DOUBLE PRECISION array, dimension (1+(N-1)*INCC) */ /* The sines of the plane rotations. */ /* INCC (input) INTEGER */ /* The increment between elements of C and S. INCC > 0. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --s; --c__; --z__; --y; --x; /* Function Body */ ix = 1; ic = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xi = x[ix]; yi = y[ix]; zi = z__[ix]; ci = c__[ic]; si = s[ic]; t1 = si * zi; t2 = ci * zi; t3 = t2 - si * xi; t4 = t2 + si * yi; t5 = ci * xi + t1; t6 = ci * yi - t1; x[ix] = ci * t5 + si * t4; y[ix] = ci * t6 - si * t3; z__[ix] = ci * t4 - si * t5; ix += *incx; ic += *incc; /* L10: */ } /* End of DLAR2V */ return 0; } /* _starpu_dlar2v_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarf.c000066400000000000000000000130411413463044200204350ustar00rootroot00000000000000/* dlarf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b4 = 1.; static doublereal c_b5 = 0.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlarf_(char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work) { /* System generated locals */ integer c_dim1, c_offset; doublereal d__1; /* Local variables */ integer i__; logical applyleft; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer lastc, lastv; extern integer _starpu_iladlc_(integer *, integer *, doublereal *, integer *), _starpu_iladlr_(integer *, integer *, doublereal *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARF applies a real elementary reflector H to a real m by n matrix */ /* C, from either the left or the right. H is represented in the form */ /* H = I - tau * v * v' */ /* where tau is a real scalar and v is a real vector. */ /* If tau = 0, then H is taken to be the unit matrix. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': form H * C */ /* = 'R': form C * H */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* V (input) DOUBLE PRECISION array, dimension */ /* (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ /* or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ /* The vector v in the representation of H. V is not used if */ /* TAU = 0. */ /* INCV (input) INTEGER */ /* The increment between elements of v. INCV <> 0. */ /* TAU (input) DOUBLE PRECISION */ /* The value tau in the representation of H. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ /* or C * H if SIDE = 'R'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L' */ /* or (M) if SIDE = 'R' */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --v; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ applyleft = _starpu_lsame_(side, "L"); lastv = 0; lastc = 0; if (*tau != 0.) { /* Set up variables for scanning V. LASTV begins pointing to the end */ /* of V. */ if (applyleft) { lastv = *m; } else { lastv = *n; } if (*incv > 0) { i__ = (lastv - 1) * *incv + 1; } else { i__ = 1; } /* Look for the last non-zero row in V. */ while(lastv > 0 && v[i__] == 0.) { --lastv; i__ -= *incv; } if (applyleft) { /* Scan for the last non-zero column in C(1:lastv,:). */ lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); } else { /* Scan for the last non-zero row in C(:,1:lastv). */ lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); } } /* Note that lastc.eq.0 renders the BLAS operations null; no special */ /* case is needed at this level. */ if (applyleft) { /* Form H * C */ if (lastv > 0) { /* w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */ _starpu_dgemv_("Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, & v[1], incv, &c_b5, &work[1], &c__1); /* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */ d__1 = -(*tau); _starpu_dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[ c_offset], ldc); } } else { /* Form C * H */ if (lastv > 0) { /* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ _starpu_dgemv_("No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */ d__1 = -(*tau); _starpu_dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[ c_offset], ldc); } } return 0; /* End of DLARF */ } /* _starpu_dlarf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarfb.c000066400000000000000000000522171413463044200206070ustar00rootroot00000000000000/* dlarfb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b14 = 1.; static doublereal c_b25 = -1.; /* Subroutine */ int _starpu_dlarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, doublereal *v, integer * ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, doublereal *work, integer *ldwork) { /* System generated locals */ integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2; /* Local variables */ integer i__, j; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer lastc; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer lastv; extern integer _starpu_iladlc_(integer *, integer *, doublereal *, integer *), _starpu_iladlr_(integer *, integer *, doublereal *, integer *); char transt[1]; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFB applies a real block reflector H or its transpose H' to a */ /* real m by n matrix C, from either the left or the right. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply H or H' from the Left */ /* = 'R': apply H or H' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply H (No transpose) */ /* = 'T': apply H' (Transpose) */ /* DIRECT (input) CHARACTER*1 */ /* Indicates how H is formed from a product of elementary */ /* reflectors */ /* = 'F': H = H(1) H(2) . . . H(k) (Forward) */ /* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ /* STOREV (input) CHARACTER*1 */ /* Indicates how the vectors which define the elementary */ /* reflectors are stored: */ /* = 'C': Columnwise */ /* = 'R': Rowwise */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* K (input) INTEGER */ /* The order of the matrix T (= the number of elementary */ /* reflectors whose product defines the block reflector). */ /* V (input) DOUBLE PRECISION array, dimension */ /* (LDV,K) if STOREV = 'C' */ /* (LDV,M) if STOREV = 'R' and SIDE = 'L' */ /* (LDV,N) if STOREV = 'R' and SIDE = 'R' */ /* The matrix V. See further details. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. */ /* If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ /* if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ /* if STOREV = 'R', LDV >= K. */ /* T (input) DOUBLE PRECISION array, dimension (LDT,K) */ /* The triangular k by k matrix T in the representation of the */ /* block reflector. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= K. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDA >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) */ /* LDWORK (input) INTEGER */ /* The leading dimension of the array WORK. */ /* If SIDE = 'L', LDWORK >= max(1,N); */ /* if SIDE = 'R', LDWORK >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; work_dim1 = *ldwork; work_offset = 1 + work_dim1; work -= work_offset; /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } if (_starpu_lsame_(trans, "N")) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (_starpu_lsame_(storev, "C")) { if (_starpu_lsame_(direct, "F")) { /* Let V = ( V1 ) (first K rows) */ /* ( V2 ) */ /* where V1 is unit lower triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(m, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) */ /* W := C1' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); /* L10: */ } /* W := W * V1 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2'*V2 */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V * W' */ if (lastv > *k) { /* C2 := C2 - V2 * W' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &i__1, &lastc, k, & c_b25, &v[*k + 1 + v_dim1], ldv, &work[ work_offset], ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc); } /* W := W * V1' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L20: */ } /* L30: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(n, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ /* W := C1 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); /* L40: */ } /* W := W * V1 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2 * V2 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V' */ if (lastv > *k) { /* C2 := C2 - W * V2' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[*k + 1 + v_dim1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc); } /* W := W * V1' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L50: */ } /* L60: */ } } } else { /* Let V = ( V1 ) */ /* ( V2 ) (last K rows) */ /* where V2 is unit upper triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(m, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) */ /* W := C2' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[ j * work_dim1 + 1], &c__1); /* L70: */ } /* W := W * V2 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1'*V1 */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V * W' */ if (lastv > *k) { /* C1 := C1 - V1 * W' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &i__1, &lastc, k, & c_b25, &v[v_offset], ldv, &work[work_offset], ldwork, &c_b14, &c__[c_offset], ldc); } /* W := W * V2' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); /* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L80: */ } /* L90: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlr_(n, k, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ /* W := C2 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, & work[j * work_dim1 + 1], &c__1); /* L100: */ } /* W := W * V2 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1 * V1 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V' */ if (lastv > *k) { /* C1 := C1 - W * V1' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc); } /* W := W * V2' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[ work_offset], ldwork); /* C2 := C2 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1]; /* L110: */ } /* L120: */ } } } } else if (_starpu_lsame_(storev, "R")) { if (_starpu_lsame_(direct, "F")) { /* Let V = ( V1 V2 ) (V1: first K columns) */ /* where V1 is unit upper triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, m, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) */ /* W := C1' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); /* L130: */ } /* W := W * V1' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2'*V2' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V' * W' */ if (lastv > *k) { /* C2 := C2 - V2' * W' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[(*k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc); } /* W := W * V1 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L140: */ } /* L150: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, n, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V' = (C1*V1' + C2*V2') (stored in WORK) */ /* W := C1 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); /* L160: */ } /* W := W * V1' */ _starpu_dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); if (lastv > *k) { /* W := W + C2 * V2' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, k, &i__1, & c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V */ if (lastv > *k) { /* C2 := C2 - W * V2 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc); } /* W := W * V1 */ _starpu_dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, & c_b14, &v[v_offset], ldv, &work[work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L170: */ } /* L180: */ } } } else { /* Let V = ( V1 V2 ) (V2: last K columns) */ /* where V2 is unit lower triangular. */ if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C where C = ( C1 ) */ /* ( C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, m, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlc_(&lastv, n, &c__[c_offset], ldc); /* W := C' * V' = (C1'*V1' + C2'*V2') (stored in WORK) */ /* W := C2' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[ j * work_dim1 + 1], &c__1); /* L190: */ } /* W := W * V2' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1'*V1' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & work[work_offset], ldwork); } /* W := W * T' or W * T */ _starpu_dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, & c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - V' * W' */ if (lastv > *k) { /* C1 := C1 - V1' * W' */ i__1 = lastv - *k; _starpu_dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[v_offset], ldv, &work[work_offset], ldwork, & c_b14, &c__[c_offset], ldc); } /* W := W * V2 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); /* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L200: */ } /* L210: */ } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' where C = ( C1 C2 ) */ /* Computing MAX */ i__1 = *k, i__2 = _starpu_iladlc_(k, n, &v[v_offset], ldv); lastv = max(i__1,i__2); lastc = _starpu_iladlr_(m, &lastv, &c__[c_offset], ldc); /* W := C * V' = (C1*V1' + C2*V2') (stored in WORK) */ /* W := C2 */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); /* L220: */ } /* W := W * V2' */ _starpu_dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); if (lastv > *k) { /* W := W + C1 * V1' */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "Transpose", &lastc, k, &i__1, & c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & c_b14, &work[work_offset], ldwork); } /* W := W * T or W * T' */ _starpu_dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork); /* C := C - W * V */ if (lastv > *k) { /* C1 := C1 - W * V1 */ i__1 = lastv - *k; _starpu_dgemm_("No transpose", "No transpose", &lastc, &i__1, k, & c_b25, &work[work_offset], ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc); } /* W := W * V2 */ _starpu_dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, & c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[ work_offset], ldwork); /* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = lastc; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1]; /* L230: */ } /* L240: */ } } } } return 0; /* End of DLARFB */ } /* _starpu_dlarfb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarfg.c000066400000000000000000000103401413463044200206030ustar00rootroot00000000000000/* dlarfg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ integer j, knt; doublereal beta; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal xnorm; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); doublereal safmin, rsafmn; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFG generates a real elementary reflector H of order n, such */ /* that */ /* H * ( alpha ) = ( beta ), H' * H = I. */ /* ( x ) ( 0 ) */ /* where alpha and beta are scalars, and x is an (n-1)-element real */ /* vector. H is represented in the form */ /* H = I - tau * ( 1 ) * ( 1 v' ) , */ /* ( v ) */ /* where tau is a real scalar and v is a real (n-1)-element */ /* vector. */ /* If the elements of x are all zero, then tau = 0 and H is taken to be */ /* the unit matrix. */ /* Otherwise 1 <= tau <= 2. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the elementary reflector. */ /* ALPHA (input/output) DOUBLE PRECISION */ /* On entry, the value alpha. */ /* On exit, it is overwritten with the value beta. */ /* X (input/output) DOUBLE PRECISION array, dimension */ /* (1+(N-2)*abs(INCX)) */ /* On entry, the vector x. */ /* On exit, it is overwritten with the vector v. */ /* INCX (input) INTEGER */ /* The increment between elements of X. INCX > 0. */ /* TAU (output) DOUBLE PRECISION */ /* The value tau. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n <= 1) { *tau = 0.; return 0; } i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); if (xnorm == 0.) { /* H = I */ *tau = 0.; } else { /* general case */ d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = -d_sign(&d__1, alpha); safmin = _starpu_dlamch_("S") / _starpu_dlamch_("E"); knt = 0; if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ rsafmn = 1. / safmin; L10: ++knt; i__1 = *n - 1; _starpu_dscal_(&i__1, &rsafmn, &x[1], incx); beta *= rsafmn; *alpha *= rsafmn; if (abs(beta) < safmin) { goto L10; } /* New BETA is at most 1, at least SAFMIN */ i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = -d_sign(&d__1, alpha); } *tau = (beta - *alpha) / beta; i__1 = *n - 1; d__1 = 1. / (*alpha - beta); _starpu_dscal_(&i__1, &d__1, &x[1], incx); /* If ALPHA is subnormal, it may lose relative accuracy */ i__1 = knt; for (j = 1; j <= i__1; ++j) { beta *= safmin; /* L20: */ } *alpha = beta; } return 0; /* End of DLARFG */ } /* _starpu_dlarfg_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarfp.c000066400000000000000000000116101413463044200206150ustar00rootroot00000000000000/* dlarfp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarfp_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ integer j, knt; doublereal beta; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal xnorm; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); doublereal safmin, rsafmn; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFP generates a real elementary reflector H of order n, such */ /* that */ /* H * ( alpha ) = ( beta ), H' * H = I. */ /* ( x ) ( 0 ) */ /* where alpha and beta are scalars, beta is non-negative, and x is */ /* an (n-1)-element real vector. H is represented in the form */ /* H = I - tau * ( 1 ) * ( 1 v' ) , */ /* ( v ) */ /* where tau is a real scalar and v is a real (n-1)-element */ /* vector. */ /* If the elements of x are all zero, then tau = 0 and H is taken to be */ /* the unit matrix. */ /* Otherwise 1 <= tau <= 2. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the elementary reflector. */ /* ALPHA (input/output) DOUBLE PRECISION */ /* On entry, the value alpha. */ /* On exit, it is overwritten with the value beta. */ /* X (input/output) DOUBLE PRECISION array, dimension */ /* (1+(N-2)*abs(INCX)) */ /* On entry, the vector x. */ /* On exit, it is overwritten with the vector v. */ /* INCX (input) INTEGER */ /* The increment between elements of X. INCX > 0. */ /* TAU (output) DOUBLE PRECISION */ /* The value tau. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n <= 0) { *tau = 0.; return 0; } i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); if (xnorm == 0.) { /* H = [+/-1, 0; I], sign chosen so ALPHA >= 0 */ if (*alpha >= 0.) { /* When TAU.eq.ZERO, the vector is special-cased to be */ /* all zeros in the application routines. We do not need */ /* to clear it. */ *tau = 0.; } else { /* However, the application routines rely on explicit */ /* zero checks when TAU.ne.ZERO, and we must clear X. */ *tau = 2.; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { x[(j - 1) * *incx + 1] = 0.; } *alpha = -(*alpha); } } else { /* general case */ d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = d_sign(&d__1, alpha); safmin = _starpu_dlamch_("S") / _starpu_dlamch_("E"); knt = 0; if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ rsafmn = 1. / safmin; L10: ++knt; i__1 = *n - 1; _starpu_dscal_(&i__1, &rsafmn, &x[1], incx); beta *= rsafmn; *alpha *= rsafmn; if (abs(beta) < safmin) { goto L10; } /* New BETA is at most 1, at least SAFMIN */ i__1 = *n - 1; xnorm = _starpu_dnrm2_(&i__1, &x[1], incx); d__1 = _starpu_dlapy2_(alpha, &xnorm); beta = d_sign(&d__1, alpha); } *alpha += beta; if (beta < 0.) { beta = -beta; *tau = -(*alpha) / beta; } else { *alpha = xnorm * (xnorm / *alpha); *tau = *alpha / beta; *alpha = -(*alpha); } i__1 = *n - 1; d__1 = 1. / *alpha; _starpu_dscal_(&i__1, &d__1, &x[1], incx); /* If BETA is subnormal, it may lose relative accuracy */ i__1 = knt; for (j = 1; j <= i__1; ++j) { beta *= safmin; /* L20: */ } *alpha = beta; } return 0; /* End of DLARFP */ } /* _starpu_dlarfp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarft.c000066400000000000000000000231411413463044200206230ustar00rootroot00000000000000/* dlarft.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = 0.; /* Subroutine */ int _starpu_dlarft_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt) { /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, prevlastv; doublereal vii; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer lastv; extern /* Subroutine */ int _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFT forms the triangular factor T of a real block reflector H */ /* of order n, which is defined as a product of k elementary reflectors. */ /* If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ /* If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ /* If STOREV = 'C', the vector which defines the elementary reflector */ /* H(i) is stored in the i-th column of the array V, and */ /* H = I - V * T * V' */ /* If STOREV = 'R', the vector which defines the elementary reflector */ /* H(i) is stored in the i-th row of the array V, and */ /* H = I - V' * T * V */ /* Arguments */ /* ========= */ /* DIRECT (input) CHARACTER*1 */ /* Specifies the order in which the elementary reflectors are */ /* multiplied to form the block reflector: */ /* = 'F': H = H(1) H(2) . . . H(k) (Forward) */ /* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ /* STOREV (input) CHARACTER*1 */ /* Specifies how the vectors which define the elementary */ /* reflectors are stored (see also Further Details): */ /* = 'C': columnwise */ /* = 'R': rowwise */ /* N (input) INTEGER */ /* The order of the block reflector H. N >= 0. */ /* K (input) INTEGER */ /* The order of the triangular factor T (= the number of */ /* elementary reflectors). K >= 1. */ /* V (input/output) DOUBLE PRECISION array, dimension */ /* (LDV,K) if STOREV = 'C' */ /* (LDV,N) if STOREV = 'R' */ /* The matrix V. See further details. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. */ /* If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i). */ /* T (output) DOUBLE PRECISION array, dimension (LDT,K) */ /* The k by k triangular factor T of the block reflector. */ /* If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ /* lower triangular. The rest of the array is not used. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= K. */ /* Further Details */ /* =============== */ /* The shape of the matrix V and the storage of the vectors which define */ /* the H(i) is best illustrated by the following example with n = 5 and */ /* k = 3. The elements equal to 1 are not stored; the corresponding */ /* array elements are modified but restored on exit. The rest of the */ /* array is not used. */ /* DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ /* V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ /* ( v1 1 ) ( 1 v2 v2 v2 ) */ /* ( v1 v2 1 ) ( 1 v3 v3 ) */ /* ( v1 v2 v3 ) */ /* ( v1 v2 v3 ) */ /* DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ /* V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ /* ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ /* ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ /* ( 1 v3 ) */ /* ( 1 ) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --tau; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; /* Function Body */ if (*n == 0) { return 0; } if (_starpu_lsame_(direct, "F")) { prevlastv = *n; i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { prevlastv = max(i__,prevlastv); if (tau[i__] == 0.) { /* H(i) = I */ i__2 = i__; for (j = 1; j <= i__2; ++j) { t[j + i__ * t_dim1] = 0.; /* L10: */ } } else { /* general case */ vii = v[i__ + i__ * v_dim1]; v[i__ + i__ * v_dim1] = 1.; if (_starpu_lsame_(storev, "C")) { /* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { if (v[lastv + i__ * v_dim1] != 0.) { break; } } j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */ i__2 = j - i__ + 1; i__3 = i__ - 1; d__1 = -tau[i__]; _starpu_dgemv_("Transpose", &i__2, &i__3, &d__1, &v[i__ + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1, &c_b8, &t[ i__ * t_dim1 + 1], &c__1); } else { /* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { if (v[i__ + lastv * v_dim1] != 0.) { break; } } j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */ i__2 = i__ - 1; i__3 = j - i__ + 1; d__1 = -tau[i__]; _starpu_dgemv_("No transpose", &i__2, &i__3, &d__1, &v[i__ * v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, & c_b8, &t[i__ * t_dim1 + 1], &c__1); } v[i__ + i__ * v_dim1] = vii; /* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ i__2 = i__ - 1; _starpu_dtrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[ t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1); t[i__ + i__ * t_dim1] = tau[i__]; if (i__ > 1) { prevlastv = max(prevlastv,lastv); } else { prevlastv = lastv; } } /* L20: */ } } else { prevlastv = 1; for (i__ = *k; i__ >= 1; --i__) { if (tau[i__] == 0.) { /* H(i) = I */ i__1 = *k; for (j = i__; j <= i__1; ++j) { t[j + i__ * t_dim1] = 0.; /* L30: */ } } else { /* general case */ if (i__ < *k) { if (_starpu_lsame_(storev, "C")) { vii = v[*n - *k + i__ + i__ * v_dim1]; v[*n - *k + i__ + i__ * v_dim1] = 1.; /* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { if (v[lastv + i__ * v_dim1] != 0.) { break; } } j = max(lastv,prevlastv); /* T(i+1:k,i) := */ /* - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */ i__1 = *n - *k + i__ - j + 1; i__2 = *k - i__; d__1 = -tau[i__]; _starpu_dgemv_("Transpose", &i__1, &i__2, &d__1, &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], & c__1, &c_b8, &t[i__ + 1 + i__ * t_dim1], & c__1); v[*n - *k + i__ + i__ * v_dim1] = vii; } else { vii = v[i__ + (*n - *k + i__) * v_dim1]; v[i__ + (*n - *k + i__) * v_dim1] = 1.; /* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { if (v[i__ + lastv * v_dim1] != 0.) { break; } } j = max(lastv,prevlastv); /* T(i+1:k,i) := */ /* - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */ i__1 = *k - i__; i__2 = *n - *k + i__ - j + 1; d__1 = -tau[i__]; _starpu_dgemv_("No transpose", &i__1, &i__2, &d__1, &v[i__ + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], ldv, &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1); v[i__ + (*n - *k + i__) * v_dim1] = vii; } /* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ i__1 = *k - i__; _starpu_dtrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * t_dim1], &c__1) ; if (i__ > 1) { prevlastv = min(prevlastv,lastv); } else { prevlastv = lastv; } } t[i__ + i__ * t_dim1] = tau[i__]; } /* L40: */ } } return 0; /* End of DLARFT */ } /* _starpu_dlarft_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarfx.c000066400000000000000000000425701413463044200206360ustar00rootroot00000000000000/* dlarfx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlarfx_(char *side, integer *m, integer *n, doublereal * v, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work) { /* System generated locals */ integer c_dim1, c_offset, i__1; /* Local variables */ integer j; doublereal t1, t2, t3, t4, t5, t6, t7, t8, t9, v1, v2, v3, v4, v5, v6, v7, v8, v9, t10, v10, sum; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARFX applies a real elementary reflector H to a real m by n */ /* matrix C, from either the left or the right. H is represented in the */ /* form */ /* H = I - tau * v * v' */ /* where tau is a real scalar and v is a real vector. */ /* If tau = 0, then H is taken to be the unit matrix */ /* This version uses inline code if H has order < 11. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': form H * C */ /* = 'R': form C * H */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* V (input) DOUBLE PRECISION array, dimension (M) if SIDE = 'L' */ /* or (N) if SIDE = 'R' */ /* The vector v in the representation of H. */ /* TAU (input) DOUBLE PRECISION */ /* The value tau in the representation of H. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ /* or C * H if SIDE = 'R'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDA >= (1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L' */ /* or (M) if SIDE = 'R' */ /* WORK is not referenced if H has order < 11. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --v; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ if (*tau == 0.) { return 0; } if (_starpu_lsame_(side, "L")) { /* Form H * C, where H has order m. */ switch (*m) { case 1: goto L10; case 2: goto L30; case 3: goto L50; case 4: goto L70; case 5: goto L90; case 6: goto L110; case 7: goto L130; case 8: goto L150; case 9: goto L170; case 10: goto L190; } /* Code for general M */ _starpu_dlarf_(side, m, n, &v[1], &c__1, tau, &c__[c_offset], ldc, &work[1]); goto L410; L10: /* Special code for 1 x 1 Householder */ t1 = 1. - *tau * v[1] * v[1]; i__1 = *n; for (j = 1; j <= i__1; ++j) { c__[j * c_dim1 + 1] = t1 * c__[j * c_dim1 + 1]; /* L20: */ } goto L410; L30: /* Special code for 2 x 2 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; /* L40: */ } goto L410; L50: /* Special code for 3 x 3 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; /* L60: */ } goto L410; L70: /* Special code for 4 x 4 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; /* L80: */ } goto L410; L90: /* Special code for 5 x 5 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4] + v5 * c__[ j * c_dim1 + 5]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; c__[j * c_dim1 + 5] -= sum * t5; /* L100: */ } goto L410; L110: /* Special code for 6 x 6 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4] + v5 * c__[ j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; c__[j * c_dim1 + 5] -= sum * t5; c__[j * c_dim1 + 6] -= sum * t6; /* L120: */ } goto L410; L130: /* Special code for 7 x 7 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4] + v5 * c__[ j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + v7 * c__[j * c_dim1 + 7]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; c__[j * c_dim1 + 5] -= sum * t5; c__[j * c_dim1 + 6] -= sum * t6; c__[j * c_dim1 + 7] -= sum * t7; /* L140: */ } goto L410; L150: /* Special code for 8 x 8 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; v8 = v[8]; t8 = *tau * v8; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4] + v5 * c__[ j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + v7 * c__[j * c_dim1 + 7] + v8 * c__[j * c_dim1 + 8]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; c__[j * c_dim1 + 5] -= sum * t5; c__[j * c_dim1 + 6] -= sum * t6; c__[j * c_dim1 + 7] -= sum * t7; c__[j * c_dim1 + 8] -= sum * t8; /* L160: */ } goto L410; L170: /* Special code for 9 x 9 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; v8 = v[8]; t8 = *tau * v8; v9 = v[9]; t9 = *tau * v9; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4] + v5 * c__[ j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + v7 * c__[j * c_dim1 + 7] + v8 * c__[j * c_dim1 + 8] + v9 * c__[j * c_dim1 + 9]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; c__[j * c_dim1 + 5] -= sum * t5; c__[j * c_dim1 + 6] -= sum * t6; c__[j * c_dim1 + 7] -= sum * t7; c__[j * c_dim1 + 8] -= sum * t8; c__[j * c_dim1 + 9] -= sum * t9; /* L180: */ } goto L410; L190: /* Special code for 10 x 10 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; v8 = v[8]; t8 = *tau * v8; v9 = v[9]; t9 = *tau * v9; v10 = v[10]; t10 = *tau * v10; i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + v4 * c__[j * c_dim1 + 4] + v5 * c__[ j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + v7 * c__[j * c_dim1 + 7] + v8 * c__[j * c_dim1 + 8] + v9 * c__[j * c_dim1 + 9] + v10 * c__[j * c_dim1 + 10]; c__[j * c_dim1 + 1] -= sum * t1; c__[j * c_dim1 + 2] -= sum * t2; c__[j * c_dim1 + 3] -= sum * t3; c__[j * c_dim1 + 4] -= sum * t4; c__[j * c_dim1 + 5] -= sum * t5; c__[j * c_dim1 + 6] -= sum * t6; c__[j * c_dim1 + 7] -= sum * t7; c__[j * c_dim1 + 8] -= sum * t8; c__[j * c_dim1 + 9] -= sum * t9; c__[j * c_dim1 + 10] -= sum * t10; /* L200: */ } goto L410; } else { /* Form C * H, where H has order n. */ switch (*n) { case 1: goto L210; case 2: goto L230; case 3: goto L250; case 4: goto L270; case 5: goto L290; case 6: goto L310; case 7: goto L330; case 8: goto L350; case 9: goto L370; case 10: goto L390; } /* Code for general N */ _starpu_dlarf_(side, m, n, &v[1], &c__1, tau, &c__[c_offset], ldc, &work[1]); goto L410; L210: /* Special code for 1 x 1 Householder */ t1 = 1. - *tau * v[1] * v[1]; i__1 = *m; for (j = 1; j <= i__1; ++j) { c__[j + c_dim1] = t1 * c__[j + c_dim1]; /* L220: */ } goto L410; L230: /* Special code for 2 x 2 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; /* L240: */ } goto L410; L250: /* Special code for 3 x 3 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; /* L260: */ } goto L410; L270: /* Special code for 4 x 4 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; /* L280: */ } goto L410; L290: /* Special code for 5 x 5 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; c__[j + c_dim1 * 5] -= sum * t5; /* L300: */ } goto L410; L310: /* Special code for 6 x 6 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + v6 * c__[j + c_dim1 * 6]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; c__[j + c_dim1 * 5] -= sum * t5; c__[j + c_dim1 * 6] -= sum * t6; /* L320: */ } goto L410; L330: /* Special code for 7 x 7 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + v6 * c__[j + c_dim1 * 6] + v7 * c__[ j + c_dim1 * 7]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; c__[j + c_dim1 * 5] -= sum * t5; c__[j + c_dim1 * 6] -= sum * t6; c__[j + c_dim1 * 7] -= sum * t7; /* L340: */ } goto L410; L350: /* Special code for 8 x 8 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; v8 = v[8]; t8 = *tau * v8; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + v6 * c__[j + c_dim1 * 6] + v7 * c__[ j + c_dim1 * 7] + v8 * c__[j + (c_dim1 << 3)]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; c__[j + c_dim1 * 5] -= sum * t5; c__[j + c_dim1 * 6] -= sum * t6; c__[j + c_dim1 * 7] -= sum * t7; c__[j + (c_dim1 << 3)] -= sum * t8; /* L360: */ } goto L410; L370: /* Special code for 9 x 9 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; v8 = v[8]; t8 = *tau * v8; v9 = v[9]; t9 = *tau * v9; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + v6 * c__[j + c_dim1 * 6] + v7 * c__[ j + c_dim1 * 7] + v8 * c__[j + (c_dim1 << 3)] + v9 * c__[ j + c_dim1 * 9]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; c__[j + c_dim1 * 5] -= sum * t5; c__[j + c_dim1 * 6] -= sum * t6; c__[j + c_dim1 * 7] -= sum * t7; c__[j + (c_dim1 << 3)] -= sum * t8; c__[j + c_dim1 * 9] -= sum * t9; /* L380: */ } goto L410; L390: /* Special code for 10 x 10 Householder */ v1 = v[1]; t1 = *tau * v1; v2 = v[2]; t2 = *tau * v2; v3 = v[3]; t3 = *tau * v3; v4 = v[4]; t4 = *tau * v4; v5 = v[5]; t5 = *tau * v5; v6 = v[6]; t6 = *tau * v6; v7 = v[7]; t7 = *tau * v7; v8 = v[8]; t8 = *tau * v8; v9 = v[9]; t9 = *tau * v9; v10 = v[10]; t10 = *tau * v10; i__1 = *m; for (j = 1; j <= i__1; ++j) { sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + v6 * c__[j + c_dim1 * 6] + v7 * c__[ j + c_dim1 * 7] + v8 * c__[j + (c_dim1 << 3)] + v9 * c__[ j + c_dim1 * 9] + v10 * c__[j + c_dim1 * 10]; c__[j + c_dim1] -= sum * t1; c__[j + (c_dim1 << 1)] -= sum * t2; c__[j + c_dim1 * 3] -= sum * t3; c__[j + (c_dim1 << 2)] -= sum * t4; c__[j + c_dim1 * 5] -= sum * t5; c__[j + c_dim1 * 6] -= sum * t6; c__[j + c_dim1 * 7] -= sum * t7; c__[j + (c_dim1 << 3)] -= sum * t8; c__[j + c_dim1 * 9] -= sum * t9; c__[j + c_dim1 * 10] -= sum * t10; /* L400: */ } goto L410; } L410: return 0; /* End of DLARFX */ } /* _starpu_dlarfx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlargv.c000066400000000000000000000063511413463044200206320ustar00rootroot00000000000000/* dlargv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlargv_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *c__, integer *incc) { /* System generated locals */ integer i__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal f, g; integer i__; doublereal t; integer ic, ix, iy; doublereal tt; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARGV generates a vector of real plane rotations, determined by */ /* elements of the real vectors x and y. For i = 1,2,...,n */ /* ( c(i) s(i) ) ( x(i) ) = ( a(i) ) */ /* ( -s(i) c(i) ) ( y(i) ) = ( 0 ) */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of plane rotations to be generated. */ /* X (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCX) */ /* On entry, the vector x. */ /* On exit, x(i) is overwritten by a(i), for i = 1,...,n. */ /* INCX (input) INTEGER */ /* The increment between elements of X. INCX > 0. */ /* Y (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCY) */ /* On entry, the vector y. */ /* On exit, the sines of the plane rotations. */ /* INCY (input) INTEGER */ /* The increment between elements of Y. INCY > 0. */ /* C (output) DOUBLE PRECISION array, dimension (1+(N-1)*INCC) */ /* The cosines of the plane rotations. */ /* INCC (input) INTEGER */ /* The increment between elements of C. INCC > 0. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --c__; --y; --x; /* Function Body */ ix = 1; iy = 1; ic = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { f = x[ix]; g = y[iy]; if (g == 0.) { c__[ic] = 1.; } else if (f == 0.) { c__[ic] = 0.; y[iy] = 1.; x[ix] = g; } else if (abs(f) > abs(g)) { t = g / f; tt = sqrt(t * t + 1.); c__[ic] = 1. / tt; y[iy] = t * c__[ic]; x[ix] = f * tt; } else { t = f / g; tt = sqrt(t * t + 1.); y[iy] = 1. / tt; c__[ic] = t * y[iy]; x[ix] = g * tt; } ic += *incc; iy += *incy; ix += *incx; /* L10: */ } return 0; /* End of DLARGV */ } /* _starpu_dlargv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarnv.c000066400000000000000000000074611413463044200206440ustar00rootroot00000000000000/* dlarnv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarnv_(integer *idist, integer *iseed, integer *n, doublereal *x) { /* System generated locals */ integer i__1, i__2, i__3; /* Builtin functions */ double log(doublereal), sqrt(doublereal), cos(doublereal); /* Local variables */ integer i__; doublereal u[128]; integer il, iv, il2; extern /* Subroutine */ int _starpu_dlaruv_(integer *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARNV returns a vector of n random real numbers from a uniform or */ /* normal distribution. */ /* Arguments */ /* ========= */ /* IDIST (input) INTEGER */ /* Specifies the distribution of the random numbers: */ /* = 1: uniform (0,1) */ /* = 2: uniform (-1,1) */ /* = 3: normal (0,1) */ /* ISEED (input/output) INTEGER array, dimension (4) */ /* On entry, the seed of the random number generator; the array */ /* elements must be between 0 and 4095, and ISEED(4) must be */ /* odd. */ /* On exit, the seed is updated. */ /* N (input) INTEGER */ /* The number of random numbers to be generated. */ /* X (output) DOUBLE PRECISION array, dimension (N) */ /* The generated random numbers. */ /* Further Details */ /* =============== */ /* This routine calls the auxiliary routine DLARUV to generate random */ /* real numbers from a uniform (0,1) distribution, in batches of up to */ /* 128 using vectorisable code. The Box-Muller method is used to */ /* transform numbers from a uniform to a normal distribution. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; --iseed; /* Function Body */ i__1 = *n; for (iv = 1; iv <= i__1; iv += 64) { /* Computing MIN */ i__2 = 64, i__3 = *n - iv + 1; il = min(i__2,i__3); if (*idist == 3) { il2 = il << 1; } else { il2 = il; } /* Call DLARUV to generate IL2 numbers from a uniform (0,1) */ /* distribution (IL2 <= LV) */ _starpu_dlaruv_(&iseed[1], &il2, u); if (*idist == 1) { /* Copy generated numbers */ i__2 = il; for (i__ = 1; i__ <= i__2; ++i__) { x[iv + i__ - 1] = u[i__ - 1]; /* L10: */ } } else if (*idist == 2) { /* Convert generated numbers to uniform (-1,1) distribution */ i__2 = il; for (i__ = 1; i__ <= i__2; ++i__) { x[iv + i__ - 1] = u[i__ - 1] * 2. - 1.; /* L20: */ } } else if (*idist == 3) { /* Convert generated numbers to normal (0,1) distribution */ i__2 = il; for (i__ = 1; i__ <= i__2; ++i__) { x[iv + i__ - 1] = sqrt(log(u[(i__ << 1) - 2]) * -2.) * cos(u[( i__ << 1) - 1] * 6.2831853071795864769252867663); /* L30: */ } } /* L40: */ } return 0; /* End of DLARNV */ } /* _starpu_dlarnv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarra.c000066400000000000000000000112351413463044200206150ustar00rootroot00000000000000/* dlarra.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarra_(integer *n, doublereal *d__, doublereal *e, doublereal *e2, doublereal *spltol, doublereal *tnrm, integer *nsplit, integer *isplit, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal tmp1, eabs; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Compute the splitting points with threshold SPLTOL. */ /* DLARRA sets any "small" off-diagonal elements to zero. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N > 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* On entry, the N diagonal elements of the tridiagonal */ /* matrix T. */ /* E (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the first (N-1) entries contain the subdiagonal */ /* elements of the tridiagonal matrix T; E(N) need not be set. */ /* On exit, the entries E( ISPLIT( I ) ), 1 <= I <= NSPLIT, */ /* are set to zero, the other entries of E are untouched. */ /* E2 (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the first (N-1) entries contain the SQUARES of the */ /* subdiagonal elements of the tridiagonal matrix T; */ /* E2(N) need not be set. */ /* On exit, the entries E2( ISPLIT( I ) ), */ /* 1 <= I <= NSPLIT, have been set to zero */ /* SPLTOL (input) DOUBLE PRECISION */ /* The threshold for splitting. Two criteria can be used: */ /* SPLTOL<0 : criterion based on absolute off-diagonal value */ /* SPLTOL>0 : criterion that preserves relative accuracy */ /* TNRM (input) DOUBLE PRECISION */ /* The norm of the matrix. */ /* NSPLIT (output) INTEGER */ /* The number of blocks T splits into. 1 <= NSPLIT <= N. */ /* ISPLIT (output) INTEGER array, dimension (N) */ /* The splitting points, at which T breaks up into blocks. */ /* The first block consists of rows/columns 1 to ISPLIT(1), */ /* the second of rows/columns ISPLIT(1)+1 through ISPLIT(2), */ /* etc., and the NSPLIT-th consists of rows/columns */ /* ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --isplit; --e2; --e; --d__; /* Function Body */ *info = 0; /* Compute splitting points */ *nsplit = 1; if (*spltol < 0.) { /* Criterion based on absolute off-diagonal value */ tmp1 = abs(*spltol) * *tnrm; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { eabs = (d__1 = e[i__], abs(d__1)); if (eabs <= tmp1) { e[i__] = 0.; e2[i__] = 0.; isplit[*nsplit] = i__; ++(*nsplit); } /* L9: */ } } else { /* Criterion that guarantees relative accuracy */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { eabs = (d__1 = e[i__], abs(d__1)); if (eabs <= *spltol * sqrt((d__1 = d__[i__], abs(d__1))) * sqrt(( d__2 = d__[i__ + 1], abs(d__2)))) { e[i__] = 0.; e2[i__] = 0.; isplit[*nsplit] = i__; ++(*nsplit); } /* L10: */ } } isplit[*nsplit] = *n; return 0; /* End of DLARRA */ } /* _starpu_dlarra_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrb.c000066400000000000000000000250221413463044200206150ustar00rootroot00000000000000/* dlarrb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarrb_(integer *n, doublereal *d__, doublereal *lld, integer *ifirst, integer *ilast, doublereal *rtol1, doublereal *rtol2, integer *offset, doublereal *w, doublereal *wgap, doublereal *werr, doublereal *work, integer *iwork, doublereal *pivmin, doublereal * spdiam, integer *twist, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal); /* Local variables */ integer i__, k, r__, i1, ii, ip; doublereal gap, mid, tmp, back, lgap, rgap, left; integer iter, nint, prev, next; doublereal cvrgd, right, width; extern integer _starpu_dlaneg_(integer *, doublereal *, doublereal *, doublereal * , doublereal *, integer *); integer negcnt; doublereal mnwdth; integer olnint, maxitr; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Given the relatively robust representation(RRR) L D L^T, DLARRB */ /* does "limited" bisection to refine the eigenvalues of L D L^T, */ /* W( IFIRST-OFFSET ) through W( ILAST-OFFSET ), to more accuracy. Initial */ /* guesses for these eigenvalues are input in W, the corresponding estimate */ /* of the error in these guesses and their gaps are input in WERR */ /* and WGAP, respectively. During bisection, intervals */ /* [left, right] are maintained by storing their mid-points and */ /* semi-widths in the arrays W and WERR respectively. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The N diagonal elements of the diagonal matrix D. */ /* LLD (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (N-1) elements L(i)*L(i)*D(i). */ /* IFIRST (input) INTEGER */ /* The index of the first eigenvalue to be computed. */ /* ILAST (input) INTEGER */ /* The index of the last eigenvalue to be computed. */ /* RTOL1 (input) DOUBLE PRECISION */ /* RTOL2 (input) DOUBLE PRECISION */ /* Tolerance for the convergence of the bisection intervals. */ /* An interval [LEFT,RIGHT] has converged if */ /* RIGHT-LEFT.LT.MAX( RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) ) */ /* where GAP is the (estimated) distance to the nearest */ /* eigenvalue. */ /* OFFSET (input) INTEGER */ /* Offset for the arrays W, WGAP and WERR, i.e., the IFIRST-OFFSET */ /* through ILAST-OFFSET elements of these arrays are to be used. */ /* W (input/output) DOUBLE PRECISION array, dimension (N) */ /* On input, W( IFIRST-OFFSET ) through W( ILAST-OFFSET ) are */ /* estimates of the eigenvalues of L D L^T indexed IFIRST throug */ /* ILAST. */ /* On output, these estimates are refined. */ /* WGAP (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On input, the (estimated) gaps between consecutive */ /* eigenvalues of L D L^T, i.e., WGAP(I-OFFSET) is the gap between */ /* eigenvalues I and I+1. Note that if IFIRST.EQ.ILAST */ /* then WGAP(IFIRST-OFFSET) must be set to ZERO. */ /* On output, these gaps are refined. */ /* WERR (input/output) DOUBLE PRECISION array, dimension (N) */ /* On input, WERR( IFIRST-OFFSET ) through WERR( ILAST-OFFSET ) are */ /* the errors in the estimates of the corresponding elements in W. */ /* On output, these errors are refined. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* Workspace. */ /* IWORK (workspace) INTEGER array, dimension (2*N) */ /* Workspace. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot in the Sturm sequence. */ /* SPDIAM (input) DOUBLE PRECISION */ /* The spectral diameter of the matrix. */ /* TWIST (input) INTEGER */ /* The twist index for the twisted factorization that is used */ /* for the negcount. */ /* TWIST = N: Compute negcount from L D L^T - LAMBDA I = L+ D+ L+^T */ /* TWIST = 1: Compute negcount from L D L^T - LAMBDA I = U- D- U-^T */ /* TWIST = R: Compute negcount from L D L^T - LAMBDA I = N(r) D(r) N(r) */ /* INFO (output) INTEGER */ /* Error flag. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --iwork; --work; --werr; --wgap; --w; --lld; --d__; /* Function Body */ *info = 0; maxitr = (integer) ((log(*spdiam + *pivmin) - log(*pivmin)) / log(2.)) + 2; mnwdth = *pivmin * 2.; r__ = *twist; if (r__ < 1 || r__ > *n) { r__ = *n; } /* Initialize unconverged intervals in [ WORK(2*I-1), WORK(2*I) ]. */ /* The Sturm Count, Count( WORK(2*I-1) ) is arranged to be I-1, while */ /* Count( WORK(2*I) ) is stored in IWORK( 2*I ). The integer IWORK( 2*I-1 ) */ /* for an unconverged interval is set to the index of the next unconverged */ /* interval, and is -1 or 0 for a converged interval. Thus a linked */ /* list of unconverged intervals is set up. */ i1 = *ifirst; /* The number of unconverged intervals */ nint = 0; /* The last unconverged interval found */ prev = 0; rgap = wgap[i1 - *offset]; i__1 = *ilast; for (i__ = i1; i__ <= i__1; ++i__) { k = i__ << 1; ii = i__ - *offset; left = w[ii] - werr[ii]; right = w[ii] + werr[ii]; lgap = rgap; rgap = wgap[ii]; gap = min(lgap,rgap); /* Make sure that [LEFT,RIGHT] contains the desired eigenvalue */ /* Compute negcount from dstqds facto L+D+L+^T = L D L^T - LEFT */ /* Do while( NEGCNT(LEFT).GT.I-1 ) */ back = werr[ii]; L20: negcnt = _starpu_dlaneg_(n, &d__[1], &lld[1], &left, pivmin, &r__); if (negcnt > i__ - 1) { left -= back; back *= 2.; goto L20; } /* Do while( NEGCNT(RIGHT).LT.I ) */ /* Compute negcount from dstqds facto L+D+L+^T = L D L^T - RIGHT */ back = werr[ii]; L50: negcnt = _starpu_dlaneg_(n, &d__[1], &lld[1], &right, pivmin, &r__); if (negcnt < i__) { right += back; back *= 2.; goto L50; } width = (d__1 = left - right, abs(d__1)) * .5; /* Computing MAX */ d__1 = abs(left), d__2 = abs(right); tmp = max(d__1,d__2); /* Computing MAX */ d__1 = *rtol1 * gap, d__2 = *rtol2 * tmp; cvrgd = max(d__1,d__2); if (width <= cvrgd || width <= mnwdth) { /* This interval has already converged and does not need refinement. */ /* (Note that the gaps might change through refining the */ /* eigenvalues, however, they can only get bigger.) */ /* Remove it from the list. */ iwork[k - 1] = -1; /* Make sure that I1 always points to the first unconverged interval */ if (i__ == i1 && i__ < *ilast) { i1 = i__ + 1; } if (prev >= i1 && i__ <= *ilast) { iwork[(prev << 1) - 1] = i__ + 1; } } else { /* unconverged interval found */ prev = i__; ++nint; iwork[k - 1] = i__ + 1; iwork[k] = negcnt; } work[k - 1] = left; work[k] = right; /* L75: */ } /* Do while( NINT.GT.0 ), i.e. there are still unconverged intervals */ /* and while (ITER.LT.MAXITR) */ iter = 0; L80: prev = i1 - 1; i__ = i1; olnint = nint; i__1 = olnint; for (ip = 1; ip <= i__1; ++ip) { k = i__ << 1; ii = i__ - *offset; rgap = wgap[ii]; lgap = rgap; if (ii > 1) { lgap = wgap[ii - 1]; } gap = min(lgap,rgap); next = iwork[k - 1]; left = work[k - 1]; right = work[k]; mid = (left + right) * .5; /* semiwidth of interval */ width = right - mid; /* Computing MAX */ d__1 = abs(left), d__2 = abs(right); tmp = max(d__1,d__2); /* Computing MAX */ d__1 = *rtol1 * gap, d__2 = *rtol2 * tmp; cvrgd = max(d__1,d__2); if (width <= cvrgd || width <= mnwdth || iter == maxitr) { /* reduce number of unconverged intervals */ --nint; /* Mark interval as converged. */ iwork[k - 1] = 0; if (i1 == i__) { i1 = next; } else { /* Prev holds the last unconverged interval previously examined */ if (prev >= i1) { iwork[(prev << 1) - 1] = next; } } i__ = next; goto L100; } prev = i__; /* Perform one bisection step */ negcnt = _starpu_dlaneg_(n, &d__[1], &lld[1], &mid, pivmin, &r__); if (negcnt <= i__ - 1) { work[k - 1] = mid; } else { work[k] = mid; } i__ = next; L100: ; } ++iter; /* do another loop if there are still unconverged intervals */ /* However, in the last iteration, all intervals are accepted */ /* since this is the best we can do. */ if (nint > 0 && iter <= maxitr) { goto L80; } /* At this point, all the intervals have converged */ i__1 = *ilast; for (i__ = *ifirst; i__ <= i__1; ++i__) { k = i__ << 1; ii = i__ - *offset; /* All intervals marked by '0' have been refined. */ if (iwork[k - 1] == 0) { w[ii] = (work[k - 1] + work[k]) * .5; werr[ii] = work[k] - w[ii]; } /* L110: */ } i__1 = *ilast; for (i__ = *ifirst + 1; i__ <= i__1; ++i__) { k = i__ << 1; ii = i__ - *offset; /* Computing MAX */ d__1 = 0., d__2 = w[ii] - werr[ii] - w[ii - 1] - werr[ii - 1]; wgap[ii - 1] = max(d__1,d__2); /* L111: */ } return 0; /* End of DLARRB */ } /* _starpu_dlarrb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrc.c000066400000000000000000000112541413463044200206200ustar00rootroot00000000000000/* dlarrc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarrc_(char *jobt, integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *e, doublereal *pivmin, integer *eigcnt, integer *lcnt, integer *rcnt, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ integer i__; doublereal sl, su, tmp, tmp2; logical matt; extern logical _starpu_lsame_(char *, char *); doublereal lpivot, rpivot; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Find the number of eigenvalues of the symmetric tridiagonal matrix T */ /* that are in the interval (VL,VU] if JOBT = 'T', and of L D L^T */ /* if JOBT = 'L'. */ /* Arguments */ /* ========= */ /* JOBT (input) CHARACTER*1 */ /* = 'T': Compute Sturm count for matrix T. */ /* = 'L': Compute Sturm count for matrix L D L^T. */ /* N (input) INTEGER */ /* The order of the matrix. N > 0. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* The lower and upper bounds for the eigenvalues. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* JOBT = 'T': The N diagonal elements of the tridiagonal matrix T. */ /* JOBT = 'L': The N diagonal elements of the diagonal matrix D. */ /* E (input) DOUBLE PRECISION array, dimension (N) */ /* JOBT = 'T': The N-1 offdiagonal elements of the matrix T. */ /* JOBT = 'L': The N-1 offdiagonal elements of the matrix L. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot in the Sturm sequence for T. */ /* EIGCNT (output) INTEGER */ /* The number of eigenvalues of the symmetric tridiagonal matrix T */ /* that are in the interval (VL,VU] */ /* LCNT (output) INTEGER */ /* RCNT (output) INTEGER */ /* The left and right negcounts of the interval. */ /* INFO (output) INTEGER */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --e; --d__; /* Function Body */ *info = 0; *lcnt = 0; *rcnt = 0; *eigcnt = 0; matt = _starpu_lsame_(jobt, "T"); if (matt) { /* Sturm sequence count on T */ lpivot = d__[1] - *vl; rpivot = d__[1] - *vu; if (lpivot <= 0.) { ++(*lcnt); } if (rpivot <= 0.) { ++(*rcnt); } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = e[i__]; tmp = d__1 * d__1; lpivot = d__[i__ + 1] - *vl - tmp / lpivot; rpivot = d__[i__ + 1] - *vu - tmp / rpivot; if (lpivot <= 0.) { ++(*lcnt); } if (rpivot <= 0.) { ++(*rcnt); } /* L10: */ } } else { /* Sturm sequence count on L D L^T */ sl = -(*vl); su = -(*vu); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { lpivot = d__[i__] + sl; rpivot = d__[i__] + su; if (lpivot <= 0.) { ++(*lcnt); } if (rpivot <= 0.) { ++(*rcnt); } tmp = e[i__] * d__[i__] * e[i__]; tmp2 = tmp / lpivot; if (tmp2 == 0.) { sl = tmp - *vl; } else { sl = sl * tmp2 - *vl; } tmp2 = tmp / rpivot; if (tmp2 == 0.) { su = tmp - *vu; } else { su = su * tmp2 - *vu; } /* L20: */ } lpivot = d__[*n] + sl; rpivot = d__[*n] + su; if (lpivot <= 0.) { ++(*lcnt); } if (rpivot <= 0.) { ++(*rcnt); } } *eigcnt = *rcnt - *lcnt; return 0; /* end of DLARRC */ } /* _starpu_dlarrc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrd.c000066400000000000000000000635231413463044200206270ustar00rootroot00000000000000/* dlarrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static integer c__0 = 0; /* Subroutine */ int _starpu_dlarrd_(char *range, char *order, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *gers, doublereal *reltol, doublereal *d__, doublereal *e, doublereal *e2, doublereal *pivmin, integer *nsplit, integer *isplit, integer *m, doublereal *w, doublereal *werr, doublereal *wl, doublereal *wu, integer *iblock, integer *indexw, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal); /* Local variables */ integer i__, j, ib, ie, je, nb; doublereal gl; integer im, in; doublereal gu; integer iw, jee; doublereal eps; integer nwl; doublereal wlu, wul; integer nwu; doublereal tmp1, tmp2; integer iend, jblk, ioff, iout, itmp1, itmp2, jdisc; extern logical _starpu_lsame_(char *, char *); integer iinfo; doublereal atoli; integer iwoff, itmax; doublereal wkill, rtoli, uflow, tnorm; extern doublereal _starpu_dlamch_(char *); integer ibegin; extern /* Subroutine */ int _starpu_dlaebz_(integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer irange, idiscl, idumma[1]; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer idiscu; logical ncnvrg, toofew; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* -- April 2009 -- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARRD computes the eigenvalues of a symmetric tridiagonal */ /* matrix T to suitable accuracy. This is an auxiliary code to be */ /* called from DSTEMR. */ /* The user may ask for all eigenvalues, all eigenvalues */ /* in the half-open interval (VL, VU], or the IL-th through IU-th */ /* eigenvalues. */ /* To avoid overflow, the matrix must be scaled so that its */ /* largest element is no greater than overflow**(1/2) * */ /* underflow**(1/4) in absolute value, and for greatest */ /* accuracy, it should not be much smaller than that. */ /* See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal */ /* Matrix", Report CS41, Computer Science Dept., Stanford */ /* University, July 21, 1966. */ /* Arguments */ /* ========= */ /* RANGE (input) CHARACTER */ /* = 'A': ("All") all eigenvalues will be found. */ /* = 'V': ("Value") all eigenvalues in the half-open interval */ /* (VL, VU] will be found. */ /* = 'I': ("Index") the IL-th through IU-th eigenvalues (of the */ /* entire matrix) will be found. */ /* ORDER (input) CHARACTER */ /* = 'B': ("By Block") the eigenvalues will be grouped by */ /* split-off block (see IBLOCK, ISPLIT) and */ /* ordered from smallest to largest within */ /* the block. */ /* = 'E': ("Entire matrix") */ /* the eigenvalues for the entire matrix */ /* will be ordered from smallest to */ /* largest. */ /* N (input) INTEGER */ /* The order of the tridiagonal matrix T. N >= 0. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. Eigenvalues less than or equal */ /* to VL, or greater than VU, will not be returned. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* GERS (input) DOUBLE PRECISION array, dimension (2*N) */ /* The N Gerschgorin intervals (the i-th Gerschgorin interval */ /* is (GERS(2*i-1), GERS(2*i)). */ /* RELTOL (input) DOUBLE PRECISION */ /* The minimum relative width of an interval. When an interval */ /* is narrower than RELTOL times the larger (in */ /* magnitude) endpoint, then it is considered to be */ /* sufficiently small, i.e., converged. Note: this should */ /* always be at least radix*machine epsilon. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the tridiagonal matrix T. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) off-diagonal elements of the tridiagonal matrix T. */ /* E2 (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) squared off-diagonal elements of the tridiagonal matrix T. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot allowed in the Sturm sequence for T. */ /* NSPLIT (input) INTEGER */ /* The number of diagonal blocks in the matrix T. */ /* 1 <= NSPLIT <= N. */ /* ISPLIT (input) INTEGER array, dimension (N) */ /* The splitting points, at which T breaks up into submatrices. */ /* The first submatrix consists of rows/columns 1 to ISPLIT(1), */ /* the second of rows/columns ISPLIT(1)+1 through ISPLIT(2), */ /* etc., and the NSPLIT-th consists of rows/columns */ /* ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N. */ /* (Only the first NSPLIT elements will actually be used, but */ /* since the user cannot know a priori what value NSPLIT will */ /* have, N words must be reserved for ISPLIT.) */ /* M (output) INTEGER */ /* The actual number of eigenvalues found. 0 <= M <= N. */ /* (See also the description of INFO=2,3.) */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, the first M elements of W will contain the */ /* eigenvalue approximations. DLARRD computes an interval */ /* I_j = (a_j, b_j] that includes eigenvalue j. The eigenvalue */ /* approximation is given as the interval midpoint */ /* W(j)= ( a_j + b_j)/2. The corresponding error is bounded by */ /* WERR(j) = abs( a_j - b_j)/2 */ /* WERR (output) DOUBLE PRECISION array, dimension (N) */ /* The error bound on the corresponding eigenvalue approximation */ /* in W. */ /* WL (output) DOUBLE PRECISION */ /* WU (output) DOUBLE PRECISION */ /* The interval (WL, WU] contains all the wanted eigenvalues. */ /* If RANGE='V', then WL=VL and WU=VU. */ /* If RANGE='A', then WL and WU are the global Gerschgorin bounds */ /* on the spectrum. */ /* If RANGE='I', then WL and WU are computed by DLAEBZ from the */ /* index range specified. */ /* IBLOCK (output) INTEGER array, dimension (N) */ /* At each row/column j where E(j) is zero or small, the */ /* matrix T is considered to split into a block diagonal */ /* matrix. On exit, if INFO = 0, IBLOCK(i) specifies to which */ /* block (from 1 to the number of blocks) the eigenvalue W(i) */ /* belongs. (DLARRD may use the remaining N-M elements as */ /* workspace.) */ /* INDEXW (output) INTEGER array, dimension (N) */ /* The indices of the eigenvalues within each block (submatrix); */ /* for example, INDEXW(i)= j and IBLOCK(i)=k imply that the */ /* i-th eigenvalue W(i) is the j-th eigenvalue in block k. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: some or all of the eigenvalues failed to converge or */ /* were not computed: */ /* =1 or 3: Bisection failed to converge for some */ /* eigenvalues; these eigenvalues are flagged by a */ /* negative block number. The effect is that the */ /* eigenvalues may not be as accurate as the */ /* absolute and relative tolerances. This is */ /* generally caused by unexpectedly inaccurate */ /* arithmetic. */ /* =2 or 3: RANGE='I' only: Not all of the eigenvalues */ /* IL:IU were found. */ /* Effect: M < IU+1-IL */ /* Cause: non-monotonic arithmetic, causing the */ /* Sturm sequence to be non-monotonic. */ /* Cure: recalculate, using RANGE='A', and pick */ /* out eigenvalues IL:IU. In some cases, */ /* increasing the PARAMETER "FUDGE" may */ /* make things work. */ /* = 4: RANGE='I', and the Gershgorin interval */ /* initially used was too small. No eigenvalues */ /* were computed. */ /* Probable cause: your machine has sloppy */ /* floating-point arithmetic. */ /* Cure: Increase the PARAMETER "FUDGE", */ /* recompile, and try again. */ /* Internal Parameters */ /* =================== */ /* FUDGE DOUBLE PRECISION, default = 2 */ /* A "fudge factor" to widen the Gershgorin intervals. Ideally, */ /* a value of 1 should work, but on machines with sloppy */ /* arithmetic, this needs to be larger. The default for */ /* publicly released versions should be large enough to handle */ /* the worst machine around. Note that this has no effect */ /* on accuracy of the solution. */ /* Based on contributions by */ /* W. Kahan, University of California, Berkeley, USA */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --iwork; --work; --indexw; --iblock; --werr; --w; --isplit; --e2; --e; --d__; --gers; /* Function Body */ *info = 0; /* Decode RANGE */ if (_starpu_lsame_(range, "A")) { irange = 1; } else if (_starpu_lsame_(range, "V")) { irange = 2; } else if (_starpu_lsame_(range, "I")) { irange = 3; } else { irange = 0; } /* Check for Errors */ if (irange <= 0) { *info = -1; } else if (! (_starpu_lsame_(order, "B") || _starpu_lsame_(order, "E"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (irange == 2) { if (*vl >= *vu) { *info = -5; } } else if (irange == 3 && (*il < 1 || *il > max(1,*n))) { *info = -6; } else if (irange == 3 && (*iu < min(*n,*il) || *iu > *n)) { *info = -7; } if (*info != 0) { return 0; } /* Initialize error flags */ *info = 0; ncnvrg = FALSE_; toofew = FALSE_; /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } /* Simplification: */ if (irange == 3 && *il == 1 && *iu == *n) { irange = 1; } /* Get machine constants */ eps = _starpu_dlamch_("P"); uflow = _starpu_dlamch_("U"); /* Special Case when N=1 */ /* Treat case of 1x1 matrix for quick return */ if (*n == 1) { if (irange == 1 || irange == 2 && d__[1] > *vl && d__[1] <= *vu || irange == 3 && *il == 1 && *iu == 1) { *m = 1; w[1] = d__[1]; /* The computation error of the eigenvalue is zero */ werr[1] = 0.; iblock[1] = 1; indexw[1] = 1; } return 0; } /* NB is the minimum vector length for vector bisection, or 0 */ /* if only scalar is to be done. */ nb = _starpu_ilaenv_(&c__1, "DSTEBZ", " ", n, &c_n1, &c_n1, &c_n1); if (nb <= 1) { nb = 0; } /* Find global spectral radius */ gl = d__[1]; gu = d__[1]; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MIN */ d__1 = gl, d__2 = gers[(i__ << 1) - 1]; gl = min(d__1,d__2); /* Computing MAX */ d__1 = gu, d__2 = gers[i__ * 2]; gu = max(d__1,d__2); /* L5: */ } /* Compute global Gerschgorin bounds and spectral diameter */ /* Computing MAX */ d__1 = abs(gl), d__2 = abs(gu); tnorm = max(d__1,d__2); gl = gl - tnorm * 2. * eps * *n - *pivmin * 4.; gu = gu + tnorm * 2. * eps * *n + *pivmin * 4.; /* [JAN/28/2009] remove the line below since SPDIAM variable not use */ /* SPDIAM = GU - GL */ /* Input arguments for DLAEBZ: */ /* The relative tolerance. An interval (a,b] lies within */ /* "relative tolerance" if b-a < RELTOL*max(|a|,|b|), */ rtoli = *reltol; /* Set the absolute tolerance for interval convergence to zero to force */ /* interval convergence based on relative size of the interval. */ /* This is dangerous because intervals might not converge when RELTOL is */ /* small. But at least a very small number should be selected so that for */ /* strongly graded matrices, the code can get relatively accurate */ /* eigenvalues. */ atoli = uflow * 4. + *pivmin * 4.; if (irange == 3) { /* RANGE='I': Compute an interval containing eigenvalues */ /* IL through IU. The initial interval [GL,GU] from the global */ /* Gerschgorin bounds GL and GU is refined by DLAEBZ. */ itmax = (integer) ((log(tnorm + *pivmin) - log(*pivmin)) / log(2.)) + 2; work[*n + 1] = gl; work[*n + 2] = gl; work[*n + 3] = gu; work[*n + 4] = gu; work[*n + 5] = gl; work[*n + 6] = gu; iwork[1] = -1; iwork[2] = -1; iwork[3] = *n + 1; iwork[4] = *n + 1; iwork[5] = *il - 1; iwork[6] = *iu; _starpu_dlaebz_(&c__3, &itmax, n, &c__2, &c__2, &nb, &atoli, &rtoli, pivmin, & d__[1], &e[1], &e2[1], &iwork[5], &work[*n + 1], &work[*n + 5] , &iout, &iwork[1], &w[1], &iblock[1], &iinfo); if (iinfo != 0) { *info = iinfo; return 0; } /* On exit, output intervals may not be ordered by ascending negcount */ if (iwork[6] == *iu) { *wl = work[*n + 1]; wlu = work[*n + 3]; nwl = iwork[1]; *wu = work[*n + 4]; wul = work[*n + 2]; nwu = iwork[4]; } else { *wl = work[*n + 2]; wlu = work[*n + 4]; nwl = iwork[2]; *wu = work[*n + 3]; wul = work[*n + 1]; nwu = iwork[3]; } /* On exit, the interval [WL, WLU] contains a value with negcount NWL, */ /* and [WUL, WU] contains a value with negcount NWU. */ if (nwl < 0 || nwl >= *n || nwu < 1 || nwu > *n) { *info = 4; return 0; } } else if (irange == 2) { *wl = *vl; *wu = *vu; } else if (irange == 1) { *wl = gl; *wu = gu; } /* Find Eigenvalues -- Loop Over blocks and recompute NWL and NWU. */ /* NWL accumulates the number of eigenvalues .le. WL, */ /* NWU accumulates the number of eigenvalues .le. WU */ *m = 0; iend = 0; *info = 0; nwl = 0; nwu = 0; i__1 = *nsplit; for (jblk = 1; jblk <= i__1; ++jblk) { ioff = iend; ibegin = ioff + 1; iend = isplit[jblk]; in = iend - ioff; if (in == 1) { /* 1x1 block */ if (*wl >= d__[ibegin] - *pivmin) { ++nwl; } if (*wu >= d__[ibegin] - *pivmin) { ++nwu; } if (irange == 1 || *wl < d__[ibegin] - *pivmin && *wu >= d__[ ibegin] - *pivmin) { ++(*m); w[*m] = d__[ibegin]; werr[*m] = 0.; /* The gap for a single block doesn't matter for the later */ /* algorithm and is assigned an arbitrary large value */ iblock[*m] = jblk; indexw[*m] = 1; } /* Disabled 2x2 case because of a failure on the following matrix */ /* RANGE = 'I', IL = IU = 4 */ /* Original Tridiagonal, d = [ */ /* -0.150102010615740E+00 */ /* -0.849897989384260E+00 */ /* -0.128208148052635E-15 */ /* 0.128257718286320E-15 */ /* ]; */ /* e = [ */ /* -0.357171383266986E+00 */ /* -0.180411241501588E-15 */ /* -0.175152352710251E-15 */ /* ]; */ /* ELSE IF( IN.EQ.2 ) THEN */ /* * 2x2 block */ /* DISC = SQRT( (HALF*(D(IBEGIN)-D(IEND)))**2 + E(IBEGIN)**2 ) */ /* TMP1 = HALF*(D(IBEGIN)+D(IEND)) */ /* L1 = TMP1 - DISC */ /* IF( WL.GE. L1-PIVMIN ) */ /* $ NWL = NWL + 1 */ /* IF( WU.GE. L1-PIVMIN ) */ /* $ NWU = NWU + 1 */ /* IF( IRANGE.EQ.ALLRNG .OR. ( WL.LT.L1-PIVMIN .AND. WU.GE. */ /* $ L1-PIVMIN ) ) THEN */ /* M = M + 1 */ /* W( M ) = L1 */ /* * The uncertainty of eigenvalues of a 2x2 matrix is very small */ /* WERR( M ) = EPS * ABS( W( M ) ) * TWO */ /* IBLOCK( M ) = JBLK */ /* INDEXW( M ) = 1 */ /* ENDIF */ /* L2 = TMP1 + DISC */ /* IF( WL.GE. L2-PIVMIN ) */ /* $ NWL = NWL + 1 */ /* IF( WU.GE. L2-PIVMIN ) */ /* $ NWU = NWU + 1 */ /* IF( IRANGE.EQ.ALLRNG .OR. ( WL.LT.L2-PIVMIN .AND. WU.GE. */ /* $ L2-PIVMIN ) ) THEN */ /* M = M + 1 */ /* W( M ) = L2 */ /* * The uncertainty of eigenvalues of a 2x2 matrix is very small */ /* WERR( M ) = EPS * ABS( W( M ) ) * TWO */ /* IBLOCK( M ) = JBLK */ /* INDEXW( M ) = 2 */ /* ENDIF */ } else { /* General Case - block of size IN >= 2 */ /* Compute local Gerschgorin interval and use it as the initial */ /* interval for DLAEBZ */ gu = d__[ibegin]; gl = d__[ibegin]; tmp1 = 0.; i__2 = iend; for (j = ibegin; j <= i__2; ++j) { /* Computing MIN */ d__1 = gl, d__2 = gers[(j << 1) - 1]; gl = min(d__1,d__2); /* Computing MAX */ d__1 = gu, d__2 = gers[j * 2]; gu = max(d__1,d__2); /* L40: */ } /* [JAN/28/2009] */ /* change SPDIAM by TNORM in lines 2 and 3 thereafter */ /* line 1: remove computation of SPDIAM (not useful anymore) */ /* SPDIAM = GU - GL */ /* GL = GL - FUDGE*SPDIAM*EPS*IN - FUDGE*PIVMIN */ /* GU = GU + FUDGE*SPDIAM*EPS*IN + FUDGE*PIVMIN */ gl = gl - tnorm * 2. * eps * in - *pivmin * 2.; gu = gu + tnorm * 2. * eps * in + *pivmin * 2.; if (irange > 1) { if (gu < *wl) { /* the local block contains none of the wanted eigenvalues */ nwl += in; nwu += in; goto L70; } /* refine search interval if possible, only range (WL,WU] matters */ gl = max(gl,*wl); gu = min(gu,*wu); if (gl >= gu) { goto L70; } } /* Find negcount of initial interval boundaries GL and GU */ work[*n + 1] = gl; work[*n + in + 1] = gu; _starpu_dlaebz_(&c__1, &c__0, &in, &in, &c__1, &nb, &atoli, &rtoli, pivmin, &d__[ibegin], &e[ibegin], &e2[ibegin], idumma, & work[*n + 1], &work[*n + (in << 1) + 1], &im, &iwork[1], & w[*m + 1], &iblock[*m + 1], &iinfo); if (iinfo != 0) { *info = iinfo; return 0; } nwl += iwork[1]; nwu += iwork[in + 1]; iwoff = *m - iwork[1]; /* Compute Eigenvalues */ itmax = (integer) ((log(gu - gl + *pivmin) - log(*pivmin)) / log( 2.)) + 2; _starpu_dlaebz_(&c__2, &itmax, &in, &in, &c__1, &nb, &atoli, &rtoli, pivmin, &d__[ibegin], &e[ibegin], &e2[ibegin], idumma, & work[*n + 1], &work[*n + (in << 1) + 1], &iout, &iwork[1], &w[*m + 1], &iblock[*m + 1], &iinfo); if (iinfo != 0) { *info = iinfo; return 0; } /* Copy eigenvalues into W and IBLOCK */ /* Use -JBLK for block number for unconverged eigenvalues. */ /* Loop over the number of output intervals from DLAEBZ */ i__2 = iout; for (j = 1; j <= i__2; ++j) { /* eigenvalue approximation is middle point of interval */ tmp1 = (work[j + *n] + work[j + in + *n]) * .5; /* semi length of error interval */ tmp2 = (d__1 = work[j + *n] - work[j + in + *n], abs(d__1)) * .5; if (j > iout - iinfo) { /* Flag non-convergence. */ ncnvrg = TRUE_; ib = -jblk; } else { ib = jblk; } i__3 = iwork[j + in] + iwoff; for (je = iwork[j] + 1 + iwoff; je <= i__3; ++je) { w[je] = tmp1; werr[je] = tmp2; indexw[je] = je - iwoff; iblock[je] = ib; /* L50: */ } /* L60: */ } *m += im; } L70: ; } /* If RANGE='I', then (WL,WU) contains eigenvalues NWL+1,...,NWU */ /* If NWL+1 < IL or NWU > IU, discard extra eigenvalues. */ if (irange == 3) { idiscl = *il - 1 - nwl; idiscu = nwu - *iu; if (idiscl > 0) { im = 0; i__1 = *m; for (je = 1; je <= i__1; ++je) { /* Remove some of the smallest eigenvalues from the left so that */ /* at the end IDISCL =0. Move all eigenvalues up to the left. */ if (w[je] <= wlu && idiscl > 0) { --idiscl; } else { ++im; w[im] = w[je]; werr[im] = werr[je]; indexw[im] = indexw[je]; iblock[im] = iblock[je]; } /* L80: */ } *m = im; } if (idiscu > 0) { /* Remove some of the largest eigenvalues from the right so that */ /* at the end IDISCU =0. Move all eigenvalues up to the left. */ im = *m + 1; for (je = *m; je >= 1; --je) { if (w[je] >= wul && idiscu > 0) { --idiscu; } else { --im; w[im] = w[je]; werr[im] = werr[je]; indexw[im] = indexw[je]; iblock[im] = iblock[je]; } /* L81: */ } jee = 0; i__1 = *m; for (je = im; je <= i__1; ++je) { ++jee; w[jee] = w[je]; werr[jee] = werr[je]; indexw[jee] = indexw[je]; iblock[jee] = iblock[je]; /* L82: */ } *m = *m - im + 1; } if (idiscl > 0 || idiscu > 0) { /* Code to deal with effects of bad arithmetic. (If N(w) is */ /* monotone non-decreasing, this should never happen.) */ /* Some low eigenvalues to be discarded are not in (WL,WLU], */ /* or high eigenvalues to be discarded are not in (WUL,WU] */ /* so just kill off the smallest IDISCL/largest IDISCU */ /* eigenvalues, by marking the corresponding IBLOCK = 0 */ if (idiscl > 0) { wkill = *wu; i__1 = idiscl; for (jdisc = 1; jdisc <= i__1; ++jdisc) { iw = 0; i__2 = *m; for (je = 1; je <= i__2; ++je) { if (iblock[je] != 0 && (w[je] < wkill || iw == 0)) { iw = je; wkill = w[je]; } /* L90: */ } iblock[iw] = 0; /* L100: */ } } if (idiscu > 0) { wkill = *wl; i__1 = idiscu; for (jdisc = 1; jdisc <= i__1; ++jdisc) { iw = 0; i__2 = *m; for (je = 1; je <= i__2; ++je) { if (iblock[je] != 0 && (w[je] >= wkill || iw == 0)) { iw = je; wkill = w[je]; } /* L110: */ } iblock[iw] = 0; /* L120: */ } } /* Now erase all eigenvalues with IBLOCK set to zero */ im = 0; i__1 = *m; for (je = 1; je <= i__1; ++je) { if (iblock[je] != 0) { ++im; w[im] = w[je]; werr[im] = werr[je]; indexw[im] = indexw[je]; iblock[im] = iblock[je]; } /* L130: */ } *m = im; } if (idiscl < 0 || idiscu < 0) { toofew = TRUE_; } } if (irange == 1 && *m != *n || irange == 3 && *m != *iu - *il + 1) { toofew = TRUE_; } /* If ORDER='B', do nothing the eigenvalues are already sorted by */ /* block. */ /* If ORDER='E', sort the eigenvalues from smallest to largest */ if (_starpu_lsame_(order, "E") && *nsplit > 1) { i__1 = *m - 1; for (je = 1; je <= i__1; ++je) { ie = 0; tmp1 = w[je]; i__2 = *m; for (j = je + 1; j <= i__2; ++j) { if (w[j] < tmp1) { ie = j; tmp1 = w[j]; } /* L140: */ } if (ie != 0) { tmp2 = werr[ie]; itmp1 = iblock[ie]; itmp2 = indexw[ie]; w[ie] = w[je]; werr[ie] = werr[je]; iblock[ie] = iblock[je]; indexw[ie] = indexw[je]; w[je] = tmp1; werr[je] = tmp2; iblock[je] = itmp1; indexw[je] = itmp2; } /* L150: */ } } *info = 0; if (ncnvrg) { ++(*info); } if (toofew) { *info += 2; } return 0; /* End of DLARRD */ } /* _starpu_dlarrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarre.c000066400000000000000000000722231413463044200206250ustar00rootroot00000000000000/* dlarre.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dlarre_(char *range, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *d__, doublereal *e, doublereal *e2, doublereal *rtol1, doublereal *rtol2, doublereal * spltol, integer *nsplit, integer *isplit, integer *m, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublereal *pivmin, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer i__1, i__2; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal), log(doublereal); /* Local variables */ integer i__, j; doublereal s1, s2; integer mb; doublereal gl; integer in, mm; doublereal gu; integer cnt; doublereal eps, tau, tmp, rtl; integer cnt1, cnt2; doublereal tmp1, eabs; integer iend, jblk; doublereal eold; integer indl; doublereal dmax__, emax; integer wend, idum, indu; doublereal rtol; integer iseed[4]; doublereal avgap, sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical norep; extern /* Subroutine */ int _starpu_dlasq2_(integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); integer ibegin; logical forceb; integer irange; doublereal sgndef; extern /* Subroutine */ int _starpu_dlarra_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *), _starpu_dlarrb_(integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dlarrc_(char * , integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *); integer wbegin; extern /* Subroutine */ int _starpu_dlarrd_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer * , integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal safmin, spdiam; extern /* Subroutine */ int _starpu_dlarrk_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); logical usedqd; doublereal clwdth, isleft; extern /* Subroutine */ int _starpu_dlarnv_(integer *, integer *, integer *, doublereal *); doublereal isrght, bsrtol, dpivot; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* To find the desired eigenvalues of a given real symmetric */ /* tridiagonal matrix T, DLARRE sets any "small" off-diagonal */ /* elements to zero, and for each unreduced block T_i, it finds */ /* (a) a suitable shift at one end of the block's spectrum, */ /* (b) the base representation, T_i - sigma_i I = L_i D_i L_i^T, and */ /* (c) eigenvalues of each L_i D_i L_i^T. */ /* The representations and eigenvalues found are then used by */ /* DSTEMR to compute the eigenvectors of T. */ /* The accuracy varies depending on whether bisection is used to */ /* find a few eigenvalues or the dqds algorithm (subroutine DLASQ2) to */ /* conpute all and then discard any unwanted one. */ /* As an added benefit, DLARRE also outputs the n */ /* Gerschgorin intervals for the matrices L_i D_i L_i^T. */ /* Arguments */ /* ========= */ /* RANGE (input) CHARACTER */ /* = 'A': ("All") all eigenvalues will be found. */ /* = 'V': ("Value") all eigenvalues in the half-open interval */ /* (VL, VU] will be found. */ /* = 'I': ("Index") the IL-th through IU-th eigenvalues (of the */ /* entire matrix) will be found. */ /* N (input) INTEGER */ /* The order of the matrix. N > 0. */ /* VL (input/output) DOUBLE PRECISION */ /* VU (input/output) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds for the eigenvalues. */ /* Eigenvalues less than or equal to VL, or greater than VU, */ /* will not be returned. VL < VU. */ /* If RANGE='I' or ='A', DLARRE computes bounds on the desired */ /* part of the spectrum. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the N diagonal elements of the tridiagonal */ /* matrix T. */ /* On exit, the N diagonal elements of the diagonal */ /* matrices D_i. */ /* E (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the first (N-1) entries contain the subdiagonal */ /* elements of the tridiagonal matrix T; E(N) need not be set. */ /* On exit, E contains the subdiagonal elements of the unit */ /* bidiagonal matrices L_i. The entries E( ISPLIT( I ) ), */ /* 1 <= I <= NSPLIT, contain the base points sigma_i on output. */ /* E2 (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the first (N-1) entries contain the SQUARES of the */ /* subdiagonal elements of the tridiagonal matrix T; */ /* E2(N) need not be set. */ /* On exit, the entries E2( ISPLIT( I ) ), */ /* 1 <= I <= NSPLIT, have been set to zero */ /* RTOL1 (input) DOUBLE PRECISION */ /* RTOL2 (input) DOUBLE PRECISION */ /* Parameters for bisection. */ /* An interval [LEFT,RIGHT] has converged if */ /* RIGHT-LEFT.LT.MAX( RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) ) */ /* SPLTOL (input) DOUBLE PRECISION */ /* The threshold for splitting. */ /* NSPLIT (output) INTEGER */ /* The number of blocks T splits into. 1 <= NSPLIT <= N. */ /* ISPLIT (output) INTEGER array, dimension (N) */ /* The splitting points, at which T breaks up into blocks. */ /* The first block consists of rows/columns 1 to ISPLIT(1), */ /* the second of rows/columns ISPLIT(1)+1 through ISPLIT(2), */ /* etc., and the NSPLIT-th consists of rows/columns */ /* ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N. */ /* M (output) INTEGER */ /* The total number of eigenvalues (of all L_i D_i L_i^T) */ /* found. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the eigenvalues. The */ /* eigenvalues of each of the blocks, L_i D_i L_i^T, are */ /* sorted in ascending order ( DLARRE may use the */ /* remaining N-M elements as workspace). */ /* WERR (output) DOUBLE PRECISION array, dimension (N) */ /* The error bound on the corresponding eigenvalue in W. */ /* WGAP (output) DOUBLE PRECISION array, dimension (N) */ /* The separation from the right neighbor eigenvalue in W. */ /* The gap is only with respect to the eigenvalues of the same block */ /* as each block has its own representation tree. */ /* Exception: at the right end of a block we store the left gap */ /* IBLOCK (output) INTEGER array, dimension (N) */ /* The indices of the blocks (submatrices) associated with the */ /* corresponding eigenvalues in W; IBLOCK(i)=1 if eigenvalue */ /* W(i) belongs to the first block from the top, =2 if W(i) */ /* belongs to the second block, etc. */ /* INDEXW (output) INTEGER array, dimension (N) */ /* The indices of the eigenvalues within each block (submatrix); */ /* for example, INDEXW(i)= 10 and IBLOCK(i)=2 imply that the */ /* i-th eigenvalue W(i) is the 10-th eigenvalue in block 2 */ /* GERS (output) DOUBLE PRECISION array, dimension (2*N) */ /* The N Gerschgorin intervals (the i-th Gerschgorin interval */ /* is (GERS(2*i-1), GERS(2*i)). */ /* PIVMIN (output) DOUBLE PRECISION */ /* The minimum pivot in the Sturm sequence for T. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (6*N) */ /* Workspace. */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* Workspace. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: A problem occured in DLARRE. */ /* < 0: One of the called subroutines signaled an internal problem. */ /* Needs inspection of the corresponding parameter IINFO */ /* for further information. */ /* =-1: Problem in DLARRD. */ /* = 2: No base representation could be found in MAXTRY iterations. */ /* Increasing MAXTRY and recompilation might be a remedy. */ /* =-3: Problem in DLARRB when computing the refined root */ /* representation for DLASQ2. */ /* =-4: Problem in DLARRB when preforming bisection on the */ /* desired part of the spectrum. */ /* =-5: Problem in DLASQ2. */ /* =-6: Problem in DLASQ2. */ /* Further Details */ /* The base representations are required to suffer very little */ /* element growth and consequently define all their eigenvalues to */ /* high relative accuracy. */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --iwork; --work; --gers; --indexw; --iblock; --wgap; --werr; --w; --isplit; --e2; --e; --d__; /* Function Body */ *info = 0; /* Decode RANGE */ if (_starpu_lsame_(range, "A")) { irange = 1; } else if (_starpu_lsame_(range, "V")) { irange = 3; } else if (_starpu_lsame_(range, "I")) { irange = 2; } *m = 0; /* Get machine constants */ safmin = _starpu_dlamch_("S"); eps = _starpu_dlamch_("P"); /* Set parameters */ rtl = sqrt(eps); bsrtol = sqrt(eps); /* Treat case of 1x1 matrix for quick return */ if (*n == 1) { if (irange == 1 || irange == 3 && d__[1] > *vl && d__[1] <= *vu || irange == 2 && *il == 1 && *iu == 1) { *m = 1; w[1] = d__[1]; /* The computation error of the eigenvalue is zero */ werr[1] = 0.; wgap[1] = 0.; iblock[1] = 1; indexw[1] = 1; gers[1] = d__[1]; gers[2] = d__[1]; } /* store the shift for the initial RRR, which is zero in this case */ e[1] = 0.; return 0; } /* General case: tridiagonal matrix of order > 1 */ /* Init WERR, WGAP. Compute Gerschgorin intervals and spectral diameter. */ /* Compute maximum off-diagonal entry and pivmin. */ gl = d__[1]; gu = d__[1]; eold = 0.; emax = 0.; e[*n] = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { werr[i__] = 0.; wgap[i__] = 0.; eabs = (d__1 = e[i__], abs(d__1)); if (eabs >= emax) { emax = eabs; } tmp1 = eabs + eold; gers[(i__ << 1) - 1] = d__[i__] - tmp1; /* Computing MIN */ d__1 = gl, d__2 = gers[(i__ << 1) - 1]; gl = min(d__1,d__2); gers[i__ * 2] = d__[i__] + tmp1; /* Computing MAX */ d__1 = gu, d__2 = gers[i__ * 2]; gu = max(d__1,d__2); eold = eabs; /* L5: */ } /* The minimum pivot allowed in the Sturm sequence for T */ /* Computing MAX */ /* Computing 2nd power */ d__3 = emax; d__1 = 1., d__2 = d__3 * d__3; *pivmin = safmin * max(d__1,d__2); /* Compute spectral diameter. The Gerschgorin bounds give an */ /* estimate that is wrong by at most a factor of SQRT(2) */ spdiam = gu - gl; /* Compute splitting points */ _starpu_dlarra_(n, &d__[1], &e[1], &e2[1], spltol, &spdiam, nsplit, &isplit[1], & iinfo); /* Can force use of bisection instead of faster DQDS. */ /* Option left in the code for future multisection work. */ forceb = FALSE_; /* Initialize USEDQD, DQDS should be used for ALLRNG unless someone */ /* explicitly wants bisection. */ usedqd = irange == 1 && ! forceb; if (irange == 1 && ! forceb) { /* Set interval [VL,VU] that contains all eigenvalues */ *vl = gl; *vu = gu; } else { /* We call DLARRD to find crude approximations to the eigenvalues */ /* in the desired range. In case IRANGE = INDRNG, we also obtain the */ /* interval (VL,VU] that contains all the wanted eigenvalues. */ /* An interval [LEFT,RIGHT] has converged if */ /* RIGHT-LEFT.LT.RTOL*MAX(ABS(LEFT),ABS(RIGHT)) */ /* DLARRD needs a WORK of size 4*N, IWORK of size 3*N */ _starpu_dlarrd_(range, "B", n, vl, vu, il, iu, &gers[1], &bsrtol, &d__[1], &e[ 1], &e2[1], pivmin, nsplit, &isplit[1], &mm, &w[1], &werr[1], vl, vu, &iblock[1], &indexw[1], &work[1], &iwork[1], &iinfo); if (iinfo != 0) { *info = -1; return 0; } /* Make sure that the entries M+1 to N in W, WERR, IBLOCK, INDEXW are 0 */ i__1 = *n; for (i__ = mm + 1; i__ <= i__1; ++i__) { w[i__] = 0.; werr[i__] = 0.; iblock[i__] = 0; indexw[i__] = 0; /* L14: */ } } /* ** */ /* Loop over unreduced blocks */ ibegin = 1; wbegin = 1; i__1 = *nsplit; for (jblk = 1; jblk <= i__1; ++jblk) { iend = isplit[jblk]; in = iend - ibegin + 1; /* 1 X 1 block */ if (in == 1) { if (irange == 1 || irange == 3 && d__[ibegin] > *vl && d__[ibegin] <= *vu || irange == 2 && iblock[wbegin] == jblk) { ++(*m); w[*m] = d__[ibegin]; werr[*m] = 0.; /* The gap for a single block doesn't matter for the later */ /* algorithm and is assigned an arbitrary large value */ wgap[*m] = 0.; iblock[*m] = jblk; indexw[*m] = 1; ++wbegin; } /* E( IEND ) holds the shift for the initial RRR */ e[iend] = 0.; ibegin = iend + 1; goto L170; } /* Blocks of size larger than 1x1 */ /* E( IEND ) will hold the shift for the initial RRR, for now set it =0 */ e[iend] = 0.; /* Find local outer bounds GL,GU for the block */ gl = d__[ibegin]; gu = d__[ibegin]; i__2 = iend; for (i__ = ibegin; i__ <= i__2; ++i__) { /* Computing MIN */ d__1 = gers[(i__ << 1) - 1]; gl = min(d__1,gl); /* Computing MAX */ d__1 = gers[i__ * 2]; gu = max(d__1,gu); /* L15: */ } spdiam = gu - gl; if (! (irange == 1 && ! forceb)) { /* Count the number of eigenvalues in the current block. */ mb = 0; i__2 = mm; for (i__ = wbegin; i__ <= i__2; ++i__) { if (iblock[i__] == jblk) { ++mb; } else { goto L21; } /* L20: */ } L21: if (mb == 0) { /* No eigenvalue in the current block lies in the desired range */ /* E( IEND ) holds the shift for the initial RRR */ e[iend] = 0.; ibegin = iend + 1; goto L170; } else { /* Decide whether dqds or bisection is more efficient */ usedqd = (doublereal) mb > in * .5 && ! forceb; wend = wbegin + mb - 1; /* Calculate gaps for the current block */ /* In later stages, when representations for individual */ /* eigenvalues are different, we use SIGMA = E( IEND ). */ sigma = 0.; i__2 = wend - 1; for (i__ = wbegin; i__ <= i__2; ++i__) { /* Computing MAX */ d__1 = 0., d__2 = w[i__ + 1] - werr[i__ + 1] - (w[i__] + werr[i__]); wgap[i__] = max(d__1,d__2); /* L30: */ } /* Computing MAX */ d__1 = 0., d__2 = *vu - sigma - (w[wend] + werr[wend]); wgap[wend] = max(d__1,d__2); /* Find local index of the first and last desired evalue. */ indl = indexw[wbegin]; indu = indexw[wend]; } } if (irange == 1 && ! forceb || usedqd) { /* Case of DQDS */ /* Find approximations to the extremal eigenvalues of the block */ _starpu_dlarrk_(&in, &c__1, &gl, &gu, &d__[ibegin], &e2[ibegin], pivmin, & rtl, &tmp, &tmp1, &iinfo); if (iinfo != 0) { *info = -1; return 0; } /* Computing MAX */ d__2 = gl, d__3 = tmp - tmp1 - eps * 100. * (d__1 = tmp - tmp1, abs(d__1)); isleft = max(d__2,d__3); _starpu_dlarrk_(&in, &in, &gl, &gu, &d__[ibegin], &e2[ibegin], pivmin, & rtl, &tmp, &tmp1, &iinfo); if (iinfo != 0) { *info = -1; return 0; } /* Computing MIN */ d__2 = gu, d__3 = tmp + tmp1 + eps * 100. * (d__1 = tmp + tmp1, abs(d__1)); isrght = min(d__2,d__3); /* Improve the estimate of the spectral diameter */ spdiam = isrght - isleft; } else { /* Case of bisection */ /* Find approximations to the wanted extremal eigenvalues */ /* Computing MAX */ d__2 = gl, d__3 = w[wbegin] - werr[wbegin] - eps * 100. * (d__1 = w[wbegin] - werr[wbegin], abs(d__1)); isleft = max(d__2,d__3); /* Computing MIN */ d__2 = gu, d__3 = w[wend] + werr[wend] + eps * 100. * (d__1 = w[ wend] + werr[wend], abs(d__1)); isrght = min(d__2,d__3); } /* Decide whether the base representation for the current block */ /* L_JBLK D_JBLK L_JBLK^T = T_JBLK - sigma_JBLK I */ /* should be on the left or the right end of the current block. */ /* The strategy is to shift to the end which is "more populated" */ /* Furthermore, decide whether to use DQDS for the computation of */ /* the eigenvalue approximations at the end of DLARRE or bisection. */ /* dqds is chosen if all eigenvalues are desired or the number of */ /* eigenvalues to be computed is large compared to the blocksize. */ if (irange == 1 && ! forceb) { /* If all the eigenvalues have to be computed, we use dqd */ usedqd = TRUE_; /* INDL is the local index of the first eigenvalue to compute */ indl = 1; indu = in; /* MB = number of eigenvalues to compute */ mb = in; wend = wbegin + mb - 1; /* Define 1/4 and 3/4 points of the spectrum */ s1 = isleft + spdiam * .25; s2 = isrght - spdiam * .25; } else { /* DLARRD has computed IBLOCK and INDEXW for each eigenvalue */ /* approximation. */ /* choose sigma */ if (usedqd) { s1 = isleft + spdiam * .25; s2 = isrght - spdiam * .25; } else { tmp = min(isrght,*vu) - max(isleft,*vl); s1 = max(isleft,*vl) + tmp * .25; s2 = min(isrght,*vu) - tmp * .25; } } /* Compute the negcount at the 1/4 and 3/4 points */ if (mb > 1) { _starpu_dlarrc_("T", &in, &s1, &s2, &d__[ibegin], &e[ibegin], pivmin, & cnt, &cnt1, &cnt2, &iinfo); } if (mb == 1) { sigma = gl; sgndef = 1.; } else if (cnt1 - indl >= indu - cnt2) { if (irange == 1 && ! forceb) { sigma = max(isleft,gl); } else if (usedqd) { /* use Gerschgorin bound as shift to get pos def matrix */ /* for dqds */ sigma = isleft; } else { /* use approximation of the first desired eigenvalue of the */ /* block as shift */ sigma = max(isleft,*vl); } sgndef = 1.; } else { if (irange == 1 && ! forceb) { sigma = min(isrght,gu); } else if (usedqd) { /* use Gerschgorin bound as shift to get neg def matrix */ /* for dqds */ sigma = isrght; } else { /* use approximation of the first desired eigenvalue of the */ /* block as shift */ sigma = min(isrght,*vu); } sgndef = -1.; } /* An initial SIGMA has been chosen that will be used for computing */ /* T - SIGMA I = L D L^T */ /* Define the increment TAU of the shift in case the initial shift */ /* needs to be refined to obtain a factorization with not too much */ /* element growth. */ if (usedqd) { /* The initial SIGMA was to the outer end of the spectrum */ /* the matrix is definite and we need not retreat. */ tau = spdiam * eps * *n + *pivmin * 2.; } else { if (mb > 1) { clwdth = w[wend] + werr[wend] - w[wbegin] - werr[wbegin]; avgap = (d__1 = clwdth / (doublereal) (wend - wbegin), abs( d__1)); if (sgndef == 1.) { /* Computing MAX */ d__1 = wgap[wbegin]; tau = max(d__1,avgap) * .5; /* Computing MAX */ d__1 = tau, d__2 = werr[wbegin]; tau = max(d__1,d__2); } else { /* Computing MAX */ d__1 = wgap[wend - 1]; tau = max(d__1,avgap) * .5; /* Computing MAX */ d__1 = tau, d__2 = werr[wend]; tau = max(d__1,d__2); } } else { tau = werr[wbegin]; } } for (idum = 1; idum <= 6; ++idum) { /* Compute L D L^T factorization of tridiagonal matrix T - sigma I. */ /* Store D in WORK(1:IN), L in WORK(IN+1:2*IN), and reciprocals of */ /* pivots in WORK(2*IN+1:3*IN) */ dpivot = d__[ibegin] - sigma; work[1] = dpivot; dmax__ = abs(work[1]); j = ibegin; i__2 = in - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[(in << 1) + i__] = 1. / work[i__]; tmp = e[j] * work[(in << 1) + i__]; work[in + i__] = tmp; dpivot = d__[j + 1] - sigma - tmp * e[j]; work[i__ + 1] = dpivot; /* Computing MAX */ d__1 = dmax__, d__2 = abs(dpivot); dmax__ = max(d__1,d__2); ++j; /* L70: */ } /* check for element growth */ if (dmax__ > spdiam * 64.) { norep = TRUE_; } else { norep = FALSE_; } if (usedqd && ! norep) { /* Ensure the definiteness of the representation */ /* All entries of D (of L D L^T) must have the same sign */ i__2 = in; for (i__ = 1; i__ <= i__2; ++i__) { tmp = sgndef * work[i__]; if (tmp < 0.) { norep = TRUE_; } /* L71: */ } } if (norep) { /* Note that in the case of IRANGE=ALLRNG, we use the Gerschgorin */ /* shift which makes the matrix definite. So we should end up */ /* here really only in the case of IRANGE = VALRNG or INDRNG. */ if (idum == 5) { if (sgndef == 1.) { /* The fudged Gerschgorin shift should succeed */ sigma = gl - spdiam * 2. * eps * *n - *pivmin * 4.; } else { sigma = gu + spdiam * 2. * eps * *n + *pivmin * 4.; } } else { sigma -= sgndef * tau; tau *= 2.; } } else { /* an initial RRR is found */ goto L83; } /* L80: */ } /* if the program reaches this point, no base representation could be */ /* found in MAXTRY iterations. */ *info = 2; return 0; L83: /* At this point, we have found an initial base representation */ /* T - SIGMA I = L D L^T with not too much element growth. */ /* Store the shift. */ e[iend] = sigma; /* Store D and L. */ _starpu_dcopy_(&in, &work[1], &c__1, &d__[ibegin], &c__1); i__2 = in - 1; _starpu_dcopy_(&i__2, &work[in + 1], &c__1, &e[ibegin], &c__1); if (mb > 1) { /* Perturb each entry of the base representation by a small */ /* (but random) relative amount to overcome difficulties with */ /* glued matrices. */ for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = 1; /* L122: */ } i__2 = (in << 1) - 1; _starpu_dlarnv_(&c__2, iseed, &i__2, &work[1]); i__2 = in - 1; for (i__ = 1; i__ <= i__2; ++i__) { d__[ibegin + i__ - 1] *= eps * 8. * work[i__] + 1.; e[ibegin + i__ - 1] *= eps * 8. * work[in + i__] + 1.; /* L125: */ } d__[iend] *= eps * 4. * work[in] + 1.; } /* Don't update the Gerschgorin intervals because keeping track */ /* of the updates would be too much work in DLARRV. */ /* We update W instead and use it to locate the proper Gerschgorin */ /* intervals. */ /* Compute the required eigenvalues of L D L' by bisection or dqds */ if (! usedqd) { /* If DLARRD has been used, shift the eigenvalue approximations */ /* according to their representation. This is necessary for */ /* a uniform DLARRV since dqds computes eigenvalues of the */ /* shifted representation. In DLARRV, W will always hold the */ /* UNshifted eigenvalue approximation. */ i__2 = wend; for (j = wbegin; j <= i__2; ++j) { w[j] -= sigma; werr[j] += (d__1 = w[j], abs(d__1)) * eps; /* L134: */ } /* call DLARRB to reduce eigenvalue error of the approximations */ /* from DLARRD */ i__2 = iend - 1; for (i__ = ibegin; i__ <= i__2; ++i__) { /* Computing 2nd power */ d__1 = e[i__]; work[i__] = d__[i__] * (d__1 * d__1); /* L135: */ } /* use bisection to find EV from INDL to INDU */ i__2 = indl - 1; _starpu_dlarrb_(&in, &d__[ibegin], &work[ibegin], &indl, &indu, rtol1, rtol2, &i__2, &w[wbegin], &wgap[wbegin], &werr[wbegin], & work[(*n << 1) + 1], &iwork[1], pivmin, &spdiam, &in, & iinfo); if (iinfo != 0) { *info = -4; return 0; } /* DLARRB computes all gaps correctly except for the last one */ /* Record distance to VU/GU */ /* Computing MAX */ d__1 = 0., d__2 = *vu - sigma - (w[wend] + werr[wend]); wgap[wend] = max(d__1,d__2); i__2 = indu; for (i__ = indl; i__ <= i__2; ++i__) { ++(*m); iblock[*m] = jblk; indexw[*m] = i__; /* L138: */ } } else { /* Call dqds to get all eigs (and then possibly delete unwanted */ /* eigenvalues). */ /* Note that dqds finds the eigenvalues of the L D L^T representation */ /* of T to high relative accuracy. High relative accuracy */ /* might be lost when the shift of the RRR is subtracted to obtain */ /* the eigenvalues of T. However, T is not guaranteed to define its */ /* eigenvalues to high relative accuracy anyway. */ /* Set RTOL to the order of the tolerance used in DLASQ2 */ /* This is an ESTIMATED error, the worst case bound is 4*N*EPS */ /* which is usually too large and requires unnecessary work to be */ /* done by bisection when computing the eigenvectors */ rtol = log((doublereal) in) * 4. * eps; j = ibegin; i__2 = in - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[(i__ << 1) - 1] = (d__1 = d__[j], abs(d__1)); work[i__ * 2] = e[j] * e[j] * work[(i__ << 1) - 1]; ++j; /* L140: */ } work[(in << 1) - 1] = (d__1 = d__[iend], abs(d__1)); work[in * 2] = 0.; _starpu_dlasq2_(&in, &work[1], &iinfo); if (iinfo != 0) { /* If IINFO = -5 then an index is part of a tight cluster */ /* and should be changed. The index is in IWORK(1) and the */ /* gap is in WORK(N+1) */ *info = -5; return 0; } else { /* Test that all eigenvalues are positive as expected */ i__2 = in; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] < 0.) { *info = -6; return 0; } /* L149: */ } } if (sgndef > 0.) { i__2 = indu; for (i__ = indl; i__ <= i__2; ++i__) { ++(*m); w[*m] = work[in - i__ + 1]; iblock[*m] = jblk; indexw[*m] = i__; /* L150: */ } } else { i__2 = indu; for (i__ = indl; i__ <= i__2; ++i__) { ++(*m); w[*m] = -work[i__]; iblock[*m] = jblk; indexw[*m] = i__; /* L160: */ } } i__2 = *m; for (i__ = *m - mb + 1; i__ <= i__2; ++i__) { /* the value of RTOL below should be the tolerance in DLASQ2 */ werr[i__] = rtol * (d__1 = w[i__], abs(d__1)); /* L165: */ } i__2 = *m - 1; for (i__ = *m - mb + 1; i__ <= i__2; ++i__) { /* compute the right gap between the intervals */ /* Computing MAX */ d__1 = 0., d__2 = w[i__ + 1] - werr[i__ + 1] - (w[i__] + werr[ i__]); wgap[i__] = max(d__1,d__2); /* L166: */ } /* Computing MAX */ d__1 = 0., d__2 = *vu - sigma - (w[*m] + werr[*m]); wgap[*m] = max(d__1,d__2); } /* proceed with next block */ ibegin = iend + 1; wbegin = wend + 1; L170: ; } return 0; /* end of DLARRE */ } /* _starpu_dlarre_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrf.c000066400000000000000000000321431413463044200206230ustar00rootroot00000000000000/* dlarrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlarrf_(integer *n, doublereal *d__, doublereal *l, doublereal *ld, integer *clstrt, integer *clend, doublereal *w, doublereal *wgap, doublereal *werr, doublereal *spdiam, doublereal * clgapl, doublereal *clgapr, doublereal *pivmin, doublereal *sigma, doublereal *dplus, doublereal *lplus, doublereal *work, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal s, bestshift, smlgrowth, eps, tmp, max1, max2, rrr1, rrr2, znm2, growthbound, fail, fact, oldp; integer indx; doublereal prod; integer ktry; doublereal fail2, avgap, ldmax, rdmax; integer shift; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical dorrr1; extern doublereal _starpu_dlamch_(char *); doublereal ldelta; logical nofail; doublereal mingap, lsigma, rdelta; extern logical _starpu_disnan_(doublereal *); logical forcer; doublereal rsigma, clwdth; logical sawnan1, sawnan2, tryrrr1; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* * */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Given the initial representation L D L^T and its cluster of close */ /* eigenvalues (in a relative measure), W( CLSTRT ), W( CLSTRT+1 ), ... */ /* W( CLEND ), DLARRF finds a new relatively robust representation */ /* L D L^T - SIGMA I = L(+) D(+) L(+)^T such that at least one of the */ /* eigenvalues of L(+) D(+) L(+)^T is relatively isolated. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix (subblock, if the matrix splitted). */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The N diagonal elements of the diagonal matrix D. */ /* L (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (N-1) subdiagonal elements of the unit bidiagonal */ /* matrix L. */ /* LD (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (N-1) elements L(i)*D(i). */ /* CLSTRT (input) INTEGER */ /* The index of the first eigenvalue in the cluster. */ /* CLEND (input) INTEGER */ /* The index of the last eigenvalue in the cluster. */ /* W (input) DOUBLE PRECISION array, dimension >= (CLEND-CLSTRT+1) */ /* The eigenvalue APPROXIMATIONS of L D L^T in ascending order. */ /* W( CLSTRT ) through W( CLEND ) form the cluster of relatively */ /* close eigenalues. */ /* WGAP (input/output) DOUBLE PRECISION array, dimension >= (CLEND-CLSTRT+1) */ /* The separation from the right neighbor eigenvalue in W. */ /* WERR (input) DOUBLE PRECISION array, dimension >= (CLEND-CLSTRT+1) */ /* WERR contain the semiwidth of the uncertainty */ /* interval of the corresponding eigenvalue APPROXIMATION in W */ /* SPDIAM (input) estimate of the spectral diameter obtained from the */ /* Gerschgorin intervals */ /* CLGAPL, CLGAPR (input) absolute gap on each end of the cluster. */ /* Set by the calling routine to protect against shifts too close */ /* to eigenvalues outside the cluster. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot allowed in the Sturm sequence. */ /* SIGMA (output) DOUBLE PRECISION */ /* The shift used to form L(+) D(+) L(+)^T. */ /* DPLUS (output) DOUBLE PRECISION array, dimension (N) */ /* The N diagonal elements of the diagonal matrix D(+). */ /* LPLUS (output) DOUBLE PRECISION array, dimension (N-1) */ /* The first (N-1) elements of LPLUS contain the subdiagonal */ /* elements of the unit bidiagonal matrix L(+). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* Workspace. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --work; --lplus; --dplus; --werr; --wgap; --w; --ld; --l; --d__; /* Function Body */ *info = 0; fact = 2.; eps = _starpu_dlamch_("Precision"); shift = 0; forcer = FALSE_; /* Note that we cannot guarantee that for any of the shifts tried, */ /* the factorization has a small or even moderate element growth. */ /* There could be Ritz values at both ends of the cluster and despite */ /* backing off, there are examples where all factorizations tried */ /* (in IEEE mode, allowing zero pivots & infinities) have INFINITE */ /* element growth. */ /* For this reason, we should use PIVMIN in this subroutine so that at */ /* least the L D L^T factorization exists. It can be checked afterwards */ /* whether the element growth caused bad residuals/orthogonality. */ /* Decide whether the code should accept the best among all */ /* representations despite large element growth or signal INFO=1 */ nofail = TRUE_; /* Compute the average gap length of the cluster */ clwdth = (d__1 = w[*clend] - w[*clstrt], abs(d__1)) + werr[*clend] + werr[ *clstrt]; avgap = clwdth / (doublereal) (*clend - *clstrt); mingap = min(*clgapl,*clgapr); /* Initial values for shifts to both ends of cluster */ /* Computing MIN */ d__1 = w[*clstrt], d__2 = w[*clend]; lsigma = min(d__1,d__2) - werr[*clstrt]; /* Computing MAX */ d__1 = w[*clstrt], d__2 = w[*clend]; rsigma = max(d__1,d__2) + werr[*clend]; /* Use a small fudge to make sure that we really shift to the outside */ lsigma -= abs(lsigma) * 4. * eps; rsigma += abs(rsigma) * 4. * eps; /* Compute upper bounds for how much to back off the initial shifts */ ldmax = mingap * .25 + *pivmin * 2.; rdmax = mingap * .25 + *pivmin * 2.; /* Computing MAX */ d__1 = avgap, d__2 = wgap[*clstrt]; ldelta = max(d__1,d__2) / fact; /* Computing MAX */ d__1 = avgap, d__2 = wgap[*clend - 1]; rdelta = max(d__1,d__2) / fact; /* Initialize the record of the best representation found */ s = _starpu_dlamch_("S"); smlgrowth = 1. / s; fail = (doublereal) (*n - 1) * mingap / (*spdiam * eps); fail2 = (doublereal) (*n - 1) * mingap / (*spdiam * sqrt(eps)); bestshift = lsigma; /* while (KTRY <= KTRYMAX) */ ktry = 0; growthbound = *spdiam * 8.; L5: sawnan1 = FALSE_; sawnan2 = FALSE_; /* Ensure that we do not back off too much of the initial shifts */ ldelta = min(ldmax,ldelta); rdelta = min(rdmax,rdelta); /* Compute the element growth when shifting to both ends of the cluster */ /* accept the shift if there is no element growth at one of the two ends */ /* Left end */ s = -lsigma; dplus[1] = d__[1] + s; if (abs(dplus[1]) < *pivmin) { dplus[1] = -(*pivmin); /* Need to set SAWNAN1 because refined RRR test should not be used */ /* in this case */ sawnan1 = TRUE_; } max1 = abs(dplus[1]); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { lplus[i__] = ld[i__] / dplus[i__]; s = s * lplus[i__] * l[i__] - lsigma; dplus[i__ + 1] = d__[i__ + 1] + s; if ((d__1 = dplus[i__ + 1], abs(d__1)) < *pivmin) { dplus[i__ + 1] = -(*pivmin); /* Need to set SAWNAN1 because refined RRR test should not be used */ /* in this case */ sawnan1 = TRUE_; } /* Computing MAX */ d__2 = max1, d__3 = (d__1 = dplus[i__ + 1], abs(d__1)); max1 = max(d__2,d__3); /* L6: */ } sawnan1 = sawnan1 || _starpu_disnan_(&max1); if (forcer || max1 <= growthbound && ! sawnan1) { *sigma = lsigma; shift = 1; goto L100; } /* Right end */ s = -rsigma; work[1] = d__[1] + s; if (abs(work[1]) < *pivmin) { work[1] = -(*pivmin); /* Need to set SAWNAN2 because refined RRR test should not be used */ /* in this case */ sawnan2 = TRUE_; } max2 = abs(work[1]); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { work[*n + i__] = ld[i__] / work[i__]; s = s * work[*n + i__] * l[i__] - rsigma; work[i__ + 1] = d__[i__ + 1] + s; if ((d__1 = work[i__ + 1], abs(d__1)) < *pivmin) { work[i__ + 1] = -(*pivmin); /* Need to set SAWNAN2 because refined RRR test should not be used */ /* in this case */ sawnan2 = TRUE_; } /* Computing MAX */ d__2 = max2, d__3 = (d__1 = work[i__ + 1], abs(d__1)); max2 = max(d__2,d__3); /* L7: */ } sawnan2 = sawnan2 || _starpu_disnan_(&max2); if (forcer || max2 <= growthbound && ! sawnan2) { *sigma = rsigma; shift = 2; goto L100; } /* If we are at this point, both shifts led to too much element growth */ /* Record the better of the two shifts (provided it didn't lead to NaN) */ if (sawnan1 && sawnan2) { /* both MAX1 and MAX2 are NaN */ goto L50; } else { if (! sawnan1) { indx = 1; if (max1 <= smlgrowth) { smlgrowth = max1; bestshift = lsigma; } } if (! sawnan2) { if (sawnan1 || max2 <= max1) { indx = 2; } if (max2 <= smlgrowth) { smlgrowth = max2; bestshift = rsigma; } } } /* If we are here, both the left and the right shift led to */ /* element growth. If the element growth is moderate, then */ /* we may still accept the representation, if it passes a */ /* refined test for RRR. This test supposes that no NaN occurred. */ /* Moreover, we use the refined RRR test only for isolated clusters. */ if (clwdth < mingap / 128. && min(max1,max2) < fail2 && ! sawnan1 && ! sawnan2) { dorrr1 = TRUE_; } else { dorrr1 = FALSE_; } tryrrr1 = TRUE_; if (tryrrr1 && dorrr1) { if (indx == 1) { tmp = (d__1 = dplus[*n], abs(d__1)); znm2 = 1.; prod = 1.; oldp = 1.; for (i__ = *n - 1; i__ >= 1; --i__) { if (prod <= eps) { prod = dplus[i__ + 1] * work[*n + i__ + 1] / (dplus[i__] * work[*n + i__]) * oldp; } else { prod *= (d__1 = work[*n + i__], abs(d__1)); } oldp = prod; /* Computing 2nd power */ d__1 = prod; znm2 += d__1 * d__1; /* Computing MAX */ d__2 = tmp, d__3 = (d__1 = dplus[i__] * prod, abs(d__1)); tmp = max(d__2,d__3); /* L15: */ } rrr1 = tmp / (*spdiam * sqrt(znm2)); if (rrr1 <= 8.) { *sigma = lsigma; shift = 1; goto L100; } } else if (indx == 2) { tmp = (d__1 = work[*n], abs(d__1)); znm2 = 1.; prod = 1.; oldp = 1.; for (i__ = *n - 1; i__ >= 1; --i__) { if (prod <= eps) { prod = work[i__ + 1] * lplus[i__ + 1] / (work[i__] * lplus[i__]) * oldp; } else { prod *= (d__1 = lplus[i__], abs(d__1)); } oldp = prod; /* Computing 2nd power */ d__1 = prod; znm2 += d__1 * d__1; /* Computing MAX */ d__2 = tmp, d__3 = (d__1 = work[i__] * prod, abs(d__1)); tmp = max(d__2,d__3); /* L16: */ } rrr2 = tmp / (*spdiam * sqrt(znm2)); if (rrr2 <= 8.) { *sigma = rsigma; shift = 2; goto L100; } } } L50: if (ktry < 1) { /* If we are here, both shifts failed also the RRR test. */ /* Back off to the outside */ /* Computing MAX */ d__1 = lsigma - ldelta, d__2 = lsigma - ldmax; lsigma = max(d__1,d__2); /* Computing MIN */ d__1 = rsigma + rdelta, d__2 = rsigma + rdmax; rsigma = min(d__1,d__2); ldelta *= 2.; rdelta *= 2.; ++ktry; goto L5; } else { /* None of the representations investigated satisfied our */ /* criteria. Take the best one we found. */ if (smlgrowth < fail || nofail) { lsigma = bestshift; rsigma = bestshift; forcer = TRUE_; goto L5; } else { *info = 1; return 0; } } L100: if (shift == 1) { } else if (shift == 2) { /* store new L and D back into DPLUS, LPLUS */ _starpu_dcopy_(n, &work[1], &c__1, &dplus[1], &c__1); i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[*n + 1], &c__1, &lplus[1], &c__1); } return 0; /* End of DLARRF */ } /* _starpu_dlarrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrj.c000066400000000000000000000220171413463044200206260ustar00rootroot00000000000000/* dlarrj.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarrj_(integer *n, doublereal *d__, doublereal *e2, integer *ifirst, integer *ilast, doublereal *rtol, integer *offset, doublereal *w, doublereal *werr, doublereal *work, integer *iwork, doublereal *pivmin, doublereal *spdiam, integer *info) { /* System generated locals */ integer i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal); /* Local variables */ integer i__, j, k, p; doublereal s; integer i1, i2, ii; doublereal fac, mid; integer cnt; doublereal tmp, left; integer iter, nint, prev, next, savi1; doublereal right, width, dplus; integer olnint, maxitr; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Given the initial eigenvalue approximations of T, DLARRJ */ /* does bisection to refine the eigenvalues of T, */ /* W( IFIRST-OFFSET ) through W( ILAST-OFFSET ), to more accuracy. Initial */ /* guesses for these eigenvalues are input in W, the corresponding estimate */ /* of the error in these guesses in WERR. During bisection, intervals */ /* [left, right] are maintained by storing their mid-points and */ /* semi-widths in the arrays W and WERR respectively. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The N diagonal elements of T. */ /* E2 (input) DOUBLE PRECISION array, dimension (N-1) */ /* The Squares of the (N-1) subdiagonal elements of T. */ /* IFIRST (input) INTEGER */ /* The index of the first eigenvalue to be computed. */ /* ILAST (input) INTEGER */ /* The index of the last eigenvalue to be computed. */ /* RTOL (input) DOUBLE PRECISION */ /* Tolerance for the convergence of the bisection intervals. */ /* An interval [LEFT,RIGHT] has converged if */ /* RIGHT-LEFT.LT.RTOL*MAX(|LEFT|,|RIGHT|). */ /* OFFSET (input) INTEGER */ /* Offset for the arrays W and WERR, i.e., the IFIRST-OFFSET */ /* through ILAST-OFFSET elements of these arrays are to be used. */ /* W (input/output) DOUBLE PRECISION array, dimension (N) */ /* On input, W( IFIRST-OFFSET ) through W( ILAST-OFFSET ) are */ /* estimates of the eigenvalues of L D L^T indexed IFIRST through */ /* ILAST. */ /* On output, these estimates are refined. */ /* WERR (input/output) DOUBLE PRECISION array, dimension (N) */ /* On input, WERR( IFIRST-OFFSET ) through WERR( ILAST-OFFSET ) are */ /* the errors in the estimates of the corresponding elements in W. */ /* On output, these errors are refined. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* Workspace. */ /* IWORK (workspace) INTEGER array, dimension (2*N) */ /* Workspace. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot in the Sturm sequence for T. */ /* SPDIAM (input) DOUBLE PRECISION */ /* The spectral diameter of T. */ /* INFO (output) INTEGER */ /* Error flag. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --iwork; --work; --werr; --w; --e2; --d__; /* Function Body */ *info = 0; maxitr = (integer) ((log(*spdiam + *pivmin) - log(*pivmin)) / log(2.)) + 2; /* Initialize unconverged intervals in [ WORK(2*I-1), WORK(2*I) ]. */ /* The Sturm Count, Count( WORK(2*I-1) ) is arranged to be I-1, while */ /* Count( WORK(2*I) ) is stored in IWORK( 2*I ). The integer IWORK( 2*I-1 ) */ /* for an unconverged interval is set to the index of the next unconverged */ /* interval, and is -1 or 0 for a converged interval. Thus a linked */ /* list of unconverged intervals is set up. */ i1 = *ifirst; i2 = *ilast; /* The number of unconverged intervals */ nint = 0; /* The last unconverged interval found */ prev = 0; i__1 = i2; for (i__ = i1; i__ <= i__1; ++i__) { k = i__ << 1; ii = i__ - *offset; left = w[ii] - werr[ii]; mid = w[ii]; right = w[ii] + werr[ii]; width = right - mid; /* Computing MAX */ d__1 = abs(left), d__2 = abs(right); tmp = max(d__1,d__2); /* The following test prevents the test of converged intervals */ if (width < *rtol * tmp) { /* This interval has already converged and does not need refinement. */ /* (Note that the gaps might change through refining the */ /* eigenvalues, however, they can only get bigger.) */ /* Remove it from the list. */ iwork[k - 1] = -1; /* Make sure that I1 always points to the first unconverged interval */ if (i__ == i1 && i__ < i2) { i1 = i__ + 1; } if (prev >= i1 && i__ <= i2) { iwork[(prev << 1) - 1] = i__ + 1; } } else { /* unconverged interval found */ prev = i__; /* Make sure that [LEFT,RIGHT] contains the desired eigenvalue */ /* Do while( CNT(LEFT).GT.I-1 ) */ fac = 1.; L20: cnt = 0; s = left; dplus = d__[1] - s; if (dplus < 0.) { ++cnt; } i__2 = *n; for (j = 2; j <= i__2; ++j) { dplus = d__[j] - s - e2[j - 1] / dplus; if (dplus < 0.) { ++cnt; } /* L30: */ } if (cnt > i__ - 1) { left -= werr[ii] * fac; fac *= 2.; goto L20; } /* Do while( CNT(RIGHT).LT.I ) */ fac = 1.; L50: cnt = 0; s = right; dplus = d__[1] - s; if (dplus < 0.) { ++cnt; } i__2 = *n; for (j = 2; j <= i__2; ++j) { dplus = d__[j] - s - e2[j - 1] / dplus; if (dplus < 0.) { ++cnt; } /* L60: */ } if (cnt < i__) { right += werr[ii] * fac; fac *= 2.; goto L50; } ++nint; iwork[k - 1] = i__ + 1; iwork[k] = cnt; } work[k - 1] = left; work[k] = right; /* L75: */ } savi1 = i1; /* Do while( NINT.GT.0 ), i.e. there are still unconverged intervals */ /* and while (ITER.LT.MAXITR) */ iter = 0; L80: prev = i1 - 1; i__ = i1; olnint = nint; i__1 = olnint; for (p = 1; p <= i__1; ++p) { k = i__ << 1; ii = i__ - *offset; next = iwork[k - 1]; left = work[k - 1]; right = work[k]; mid = (left + right) * .5; /* semiwidth of interval */ width = right - mid; /* Computing MAX */ d__1 = abs(left), d__2 = abs(right); tmp = max(d__1,d__2); if (width < *rtol * tmp || iter == maxitr) { /* reduce number of unconverged intervals */ --nint; /* Mark interval as converged. */ iwork[k - 1] = 0; if (i1 == i__) { i1 = next; } else { /* Prev holds the last unconverged interval previously examined */ if (prev >= i1) { iwork[(prev << 1) - 1] = next; } } i__ = next; goto L100; } prev = i__; /* Perform one bisection step */ cnt = 0; s = mid; dplus = d__[1] - s; if (dplus < 0.) { ++cnt; } i__2 = *n; for (j = 2; j <= i__2; ++j) { dplus = d__[j] - s - e2[j - 1] / dplus; if (dplus < 0.) { ++cnt; } /* L90: */ } if (cnt <= i__ - 1) { work[k - 1] = mid; } else { work[k] = mid; } i__ = next; L100: ; } ++iter; /* do another loop if there are still unconverged intervals */ /* However, in the last iteration, all intervals are accepted */ /* since this is the best we can do. */ if (nint > 0 && iter <= maxitr) { goto L80; } /* At this point, all the intervals have converged */ i__1 = *ilast; for (i__ = savi1; i__ <= i__1; ++i__) { k = i__ << 1; ii = i__ - *offset; /* All intervals marked by '0' have been refined. */ if (iwork[k - 1] == 0) { w[ii] = (work[k - 1] + work[k]) * .5; werr[ii] = work[k] - w[ii]; } /* L110: */ } return 0; /* End of DLARRJ */ } /* _starpu_dlarrj_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrk.c000066400000000000000000000125171413463044200206330ustar00rootroot00000000000000/* dlarrk.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarrk_(integer *n, integer *iw, doublereal *gl, doublereal *gu, doublereal *d__, doublereal *e2, doublereal *pivmin, doublereal *reltol, doublereal *w, doublereal *werr, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal); /* Local variables */ integer i__, it; doublereal mid, eps, tmp1, tmp2, left, atoli, right; integer itmax; doublereal rtoli, tnorm; extern doublereal _starpu_dlamch_(char *); integer negcnt; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARRK computes one eigenvalue of a symmetric tridiagonal */ /* matrix T to suitable accuracy. This is an auxiliary code to be */ /* called from DSTEMR. */ /* To avoid overflow, the matrix must be scaled so that its */ /* largest element is no greater than overflow**(1/2) * */ /* underflow**(1/4) in absolute value, and for greatest */ /* accuracy, it should not be much smaller than that. */ /* See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal */ /* Matrix", Report CS41, Computer Science Dept., Stanford */ /* University, July 21, 1966. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the tridiagonal matrix T. N >= 0. */ /* IW (input) INTEGER */ /* The index of the eigenvalues to be returned. */ /* GL (input) DOUBLE PRECISION */ /* GU (input) DOUBLE PRECISION */ /* An upper and a lower bound on the eigenvalue. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the tridiagonal matrix T. */ /* E2 (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) squared off-diagonal elements of the tridiagonal matrix T. */ /* PIVMIN (input) DOUBLE PRECISION */ /* The minimum pivot allowed in the Sturm sequence for T. */ /* RELTOL (input) DOUBLE PRECISION */ /* The minimum relative width of an interval. When an interval */ /* is narrower than RELTOL times the larger (in */ /* magnitude) endpoint, then it is considered to be */ /* sufficiently small, i.e., converged. Note: this should */ /* always be at least radix*machine epsilon. */ /* W (output) DOUBLE PRECISION */ /* WERR (output) DOUBLE PRECISION */ /* The error bound on the corresponding eigenvalue approximation */ /* in W. */ /* INFO (output) INTEGER */ /* = 0: Eigenvalue converged */ /* = -1: Eigenvalue did NOT converge */ /* Internal Parameters */ /* =================== */ /* FUDGE DOUBLE PRECISION, default = 2 */ /* A "fudge factor" to widen the Gershgorin intervals. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Get machine constants */ /* Parameter adjustments */ --e2; --d__; /* Function Body */ eps = _starpu_dlamch_("P"); /* Computing MAX */ d__1 = abs(*gl), d__2 = abs(*gu); tnorm = max(d__1,d__2); rtoli = *reltol; atoli = *pivmin * 4.; itmax = (integer) ((log(tnorm + *pivmin) - log(*pivmin)) / log(2.)) + 2; *info = -1; left = *gl - tnorm * 2. * eps * *n - *pivmin * 4.; right = *gu + tnorm * 2. * eps * *n + *pivmin * 4.; it = 0; L10: /* Check if interval converged or maximum number of iterations reached */ tmp1 = (d__1 = right - left, abs(d__1)); /* Computing MAX */ d__1 = abs(right), d__2 = abs(left); tmp2 = max(d__1,d__2); /* Computing MAX */ d__1 = max(atoli,*pivmin), d__2 = rtoli * tmp2; if (tmp1 < max(d__1,d__2)) { *info = 0; goto L30; } if (it > itmax) { goto L30; } /* Count number of negative pivots for mid-point */ ++it; mid = (left + right) * .5; negcnt = 0; tmp1 = d__[1] - mid; if (abs(tmp1) < *pivmin) { tmp1 = -(*pivmin); } if (tmp1 <= 0.) { ++negcnt; } i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { tmp1 = d__[i__] - e2[i__ - 1] / tmp1 - mid; if (abs(tmp1) < *pivmin) { tmp1 = -(*pivmin); } if (tmp1 <= 0.) { ++negcnt; } /* L20: */ } if (negcnt >= *iw) { right = mid; } else { left = mid; } goto L10; L30: /* Converged or maximum number of iterations reached */ *w = (left + right) * .5; *werr = (d__1 = right - left, abs(d__1)) * .5; return 0; /* End of DLARRK */ } /* _starpu_dlarrk_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrr.c000066400000000000000000000121341413463044200206350ustar00rootroot00000000000000/* dlarrr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarrr_(integer *n, doublereal *d__, doublereal *e, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal eps, tmp, tmp2, rmin; extern doublereal _starpu_dlamch_(char *); doublereal offdig, safmin; logical yesrel; doublereal smlnum, offdig2; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Perform tests to decide whether the symmetric tridiagonal matrix T */ /* warrants expensive computations which guarantee high relative accuracy */ /* in the eigenvalues. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N > 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The N diagonal elements of the tridiagonal matrix T. */ /* E (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the first (N-1) entries contain the subdiagonal */ /* elements of the tridiagonal matrix T; E(N) is set to ZERO. */ /* INFO (output) INTEGER */ /* INFO = 0(default) : the matrix warrants computations preserving */ /* relative accuracy. */ /* INFO = 1 : the matrix warrants computations guaranteeing */ /* only absolute accuracy. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* As a default, do NOT go for relative-accuracy preserving computations. */ /* Parameter adjustments */ --e; --d__; /* Function Body */ *info = 1; safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; rmin = sqrt(smlnum); /* Tests for relative accuracy */ /* Test for scaled diagonal dominance */ /* Scale the diagonal entries to one and check whether the sum of the */ /* off-diagonals is less than one */ /* The sdd relative error bounds have a 1/(1- 2*x) factor in them, */ /* x = max(OFFDIG + OFFDIG2), so when x is close to 1/2, no relative */ /* accuracy is promised. In the notation of the code fragment below, */ /* 1/(1 - (OFFDIG + OFFDIG2)) is the condition number. */ /* We don't think it is worth going into "sdd mode" unless the relative */ /* condition number is reasonable, not 1/macheps. */ /* The threshold should be compatible with other thresholds used in the */ /* code. We set OFFDIG + OFFDIG2 <= .999 =: RELCOND, it corresponds */ /* to losing at most 3 decimal digits: 1 / (1 - (OFFDIG + OFFDIG2)) <= 1000 */ /* instead of the current OFFDIG + OFFDIG2 < 1 */ yesrel = TRUE_; offdig = 0.; tmp = sqrt((abs(d__[1]))); if (tmp < rmin) { yesrel = FALSE_; } if (! yesrel) { goto L11; } i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { tmp2 = sqrt((d__1 = d__[i__], abs(d__1))); if (tmp2 < rmin) { yesrel = FALSE_; } if (! yesrel) { goto L11; } offdig2 = (d__1 = e[i__ - 1], abs(d__1)) / (tmp * tmp2); if (offdig + offdig2 >= .999) { yesrel = FALSE_; } if (! yesrel) { goto L11; } tmp = tmp2; offdig = offdig2; /* L10: */ } L11: if (yesrel) { *info = 0; return 0; } else { } /* *** MORE TO BE IMPLEMENTED *** */ /* Test if the lower bidiagonal matrix L from T = L D L^T */ /* (zero shift facto) is well conditioned */ /* Test if the upper bidiagonal matrix U from T = U D U^T */ /* (zero shift facto) is well conditioned. */ /* In this case, the matrix needs to be flipped and, at the end */ /* of the eigenvector computation, the flip needs to be applied */ /* to the computed eigenvectors (and the support) */ return 0; /* END OF DLARRR */ } /* _starpu_dlarrr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarrv.c000066400000000000000000001114401413463044200206410ustar00rootroot00000000000000/* dlarrv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b5 = 0.; static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dlarrv_(integer *n, doublereal *vl, doublereal *vu, doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, integer *m, integer *dol, integer *dou, doublereal *minrgp, doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2; logical L__1; /* Builtin functions */ double log(doublereal); /* Local variables */ integer minwsize, i__, j, k, p, q, miniwsize, ii; doublereal gl; integer im, in; doublereal gu, gap, eps, tau, tol, tmp; integer zto; doublereal ztz; integer iend, jblk; doublereal lgap; integer done; doublereal rgap, left; integer wend, iter; doublereal bstw; integer itmp1; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); integer indld; doublereal fudge; integer idone; doublereal sigma; integer iinfo, iindr; doublereal resid; logical eskip; doublereal right; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer nclus, zfrom; doublereal rqtol; integer iindc1, iindc2; extern /* Subroutine */ int _starpu_dlar1v_(integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, logical *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *); logical stp2ii; doublereal lambda; extern doublereal _starpu_dlamch_(char *); integer ibegin, indeig; logical needbs; integer indlld; doublereal sgndef, mingma; extern /* Subroutine */ int _starpu_dlarrb_(integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer oldien, oldncl, wbegin; doublereal spdiam; integer negcnt; extern /* Subroutine */ int _starpu_dlarrf_(integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); integer oldcls; doublereal savgap; integer ndepth; doublereal ssigma; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical usedbs; integer iindwk, offset; doublereal gaptol; integer newcls, oldfst, indwrk, windex, oldlst; logical usedrq; integer newfst, newftt, parity, windmn, windpl, isupmn, newlst, zusedl; doublereal bstres; integer newsiz, zusedu, zusedw; doublereal nrminv, rqcorr; logical tryrqc; integer isupmx; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARRV computes the eigenvectors of the tridiagonal matrix */ /* T = L D L^T given L, D and APPROXIMATIONS to the eigenvalues of L D L^T. */ /* The input eigenvalues should have been computed by DLARRE. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* Lower and upper bounds of the interval that contains the desired */ /* eigenvalues. VL < VU. Needed to compute gaps on the left or right */ /* end of the extremal eigenvalues in the desired RANGE. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the N diagonal elements of the diagonal matrix D. */ /* On exit, D may be overwritten. */ /* L (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the (N-1) subdiagonal elements of the unit */ /* bidiagonal matrix L are in elements 1 to N-1 of L */ /* (if the matrix is not splitted.) At the end of each block */ /* is stored the corresponding shift as given by DLARRE. */ /* On exit, L is overwritten. */ /* PIVMIN (in) DOUBLE PRECISION */ /* The minimum pivot allowed in the Sturm sequence. */ /* ISPLIT (input) INTEGER array, dimension (N) */ /* The splitting points, at which T breaks up into blocks. */ /* The first block consists of rows/columns 1 to */ /* ISPLIT( 1 ), the second of rows/columns ISPLIT( 1 )+1 */ /* through ISPLIT( 2 ), etc. */ /* M (input) INTEGER */ /* The total number of input eigenvalues. 0 <= M <= N. */ /* DOL (input) INTEGER */ /* DOU (input) INTEGER */ /* If the user wants to compute only selected eigenvectors from all */ /* the eigenvalues supplied, he can specify an index range DOL:DOU. */ /* Or else the setting DOL=1, DOU=M should be applied. */ /* Note that DOL and DOU refer to the order in which the eigenvalues */ /* are stored in W. */ /* If the user wants to compute only selected eigenpairs, then */ /* the columns DOL-1 to DOU+1 of the eigenvector space Z contain the */ /* computed eigenvectors. All other columns of Z are set to zero. */ /* MINRGP (input) DOUBLE PRECISION */ /* RTOL1 (input) DOUBLE PRECISION */ /* RTOL2 (input) DOUBLE PRECISION */ /* Parameters for bisection. */ /* An interval [LEFT,RIGHT] has converged if */ /* RIGHT-LEFT.LT.MAX( RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) ) */ /* W (input/output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements of W contain the APPROXIMATE eigenvalues for */ /* which eigenvectors are to be computed. The eigenvalues */ /* should be grouped by split-off block and ordered from */ /* smallest to largest within the block ( The output array */ /* W from DLARRE is expected here ). Furthermore, they are with */ /* respect to the shift of the corresponding root representation */ /* for their block. On exit, W holds the eigenvalues of the */ /* UNshifted matrix. */ /* WERR (input/output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the semiwidth of the uncertainty */ /* interval of the corresponding eigenvalue in W */ /* WGAP (input/output) DOUBLE PRECISION array, dimension (N) */ /* The separation from the right neighbor eigenvalue in W. */ /* IBLOCK (input) INTEGER array, dimension (N) */ /* The indices of the blocks (submatrices) associated with the */ /* corresponding eigenvalues in W; IBLOCK(i)=1 if eigenvalue */ /* W(i) belongs to the first block from the top, =2 if W(i) */ /* belongs to the second block, etc. */ /* INDEXW (input) INTEGER array, dimension (N) */ /* The indices of the eigenvalues within each block (submatrix); */ /* for example, INDEXW(i)= 10 and IBLOCK(i)=2 imply that the */ /* i-th eigenvalue W(i) is the 10-th eigenvalue in the second block. */ /* GERS (input) DOUBLE PRECISION array, dimension (2*N) */ /* The N Gerschgorin intervals (the i-th Gerschgorin interval */ /* is (GERS(2*i-1), GERS(2*i)). The Gerschgorin intervals should */ /* be computed from the original UNshifted matrix. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M) ) */ /* If INFO = 0, the first M columns of Z contain the */ /* orthonormal eigenvectors of the matrix T */ /* corresponding to the input eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* ISUPPZ (output) INTEGER array, dimension ( 2*max(1,M) ) */ /* The support of the eigenvectors in Z, i.e., the indices */ /* indicating the nonzero elements in Z. The I-th eigenvector */ /* is nonzero only in elements ISUPPZ( 2*I-1 ) through */ /* ISUPPZ( 2*I ). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (12*N) */ /* IWORK (workspace) INTEGER array, dimension (7*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: A problem occured in DLARRV. */ /* < 0: One of the called subroutines signaled an internal problem. */ /* Needs inspection of the corresponding parameter IINFO */ /* for further information. */ /* =-1: Problem in DLARRB when refining a child's eigenvalues. */ /* =-2: Problem in DLARRF when computing the RRR of a child. */ /* When a child is inside a tight cluster, it can be difficult */ /* to find an RRR. A partial remedy from the user's point of */ /* view is to make the parameter MINRGP smaller and recompile. */ /* However, as the orthogonality of the computed vectors is */ /* proportional to 1/MINRGP, the user should be aware that */ /* he might be trading in precision when he decreases MINRGP. */ /* =-3: Problem in DLARRB when refining a single eigenvalue */ /* after the Rayleigh correction was rejected. */ /* = 5: The Rayleigh Quotient Iteration failed to converge to */ /* full accuracy in MAXITR steps. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* .. */ /* The first N entries of WORK are reserved for the eigenvalues */ /* Parameter adjustments */ --d__; --l; --isplit; --w; --werr; --wgap; --iblock; --indexw; --gers; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --isuppz; --work; --iwork; /* Function Body */ indld = *n + 1; indlld = (*n << 1) + 1; indwrk = *n * 3 + 1; minwsize = *n * 12; i__1 = minwsize; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L5: */ } /* IWORK(IINDR+1:IINDR+N) hold the twist indices R for the */ /* factorization used to compute the FP vector */ iindr = 0; /* IWORK(IINDC1+1:IINC2+N) are used to store the clusters of the current */ /* layer and the one above. */ iindc1 = *n; iindc2 = *n << 1; iindwk = *n * 3 + 1; miniwsize = *n * 7; i__1 = miniwsize; for (i__ = 1; i__ <= i__1; ++i__) { iwork[i__] = 0; /* L10: */ } zusedl = 1; if (*dol > 1) { /* Set lower bound for use of Z */ zusedl = *dol - 1; } zusedu = *m; if (*dou < *m) { /* Set lower bound for use of Z */ zusedu = *dou + 1; } /* The width of the part of Z that is used */ zusedw = zusedu - zusedl + 1; _starpu_dlaset_("Full", n, &zusedw, &c_b5, &c_b5, &z__[zusedl * z_dim1 + 1], ldz); eps = _starpu_dlamch_("Precision"); rqtol = eps * 2.; /* Set expert flags for standard code. */ tryrqc = TRUE_; if (*dol == 1 && *dou == *m) { } else { /* Only selected eigenpairs are computed. Since the other evalues */ /* are not refined by RQ iteration, bisection has to compute to full */ /* accuracy. */ *rtol1 = eps * 4.; *rtol2 = eps * 4.; } /* The entries WBEGIN:WEND in W, WERR, WGAP correspond to the */ /* desired eigenvalues. The support of the nonzero eigenvector */ /* entries is contained in the interval IBEGIN:IEND. */ /* Remark that if k eigenpairs are desired, then the eigenvectors */ /* are stored in k contiguous columns of Z. */ /* DONE is the number of eigenvectors already computed */ done = 0; ibegin = 1; wbegin = 1; i__1 = iblock[*m]; for (jblk = 1; jblk <= i__1; ++jblk) { iend = isplit[jblk]; sigma = l[iend]; /* Find the eigenvectors of the submatrix indexed IBEGIN */ /* through IEND. */ wend = wbegin - 1; L15: if (wend < *m) { if (iblock[wend + 1] == jblk) { ++wend; goto L15; } } if (wend < wbegin) { ibegin = iend + 1; goto L170; } else if (wend < *dol || wbegin > *dou) { ibegin = iend + 1; wbegin = wend + 1; goto L170; } /* Find local spectral diameter of the block */ gl = gers[(ibegin << 1) - 1]; gu = gers[ibegin * 2]; i__2 = iend; for (i__ = ibegin + 1; i__ <= i__2; ++i__) { /* Computing MIN */ d__1 = gers[(i__ << 1) - 1]; gl = min(d__1,gl); /* Computing MAX */ d__1 = gers[i__ * 2]; gu = max(d__1,gu); /* L20: */ } spdiam = gu - gl; /* OLDIEN is the last index of the previous block */ oldien = ibegin - 1; /* Calculate the size of the current block */ in = iend - ibegin + 1; /* The number of eigenvalues in the current block */ im = wend - wbegin + 1; /* This is for a 1x1 block */ if (ibegin == iend) { ++done; z__[ibegin + wbegin * z_dim1] = 1.; isuppz[(wbegin << 1) - 1] = ibegin; isuppz[wbegin * 2] = ibegin; w[wbegin] += sigma; work[wbegin] = w[wbegin]; ibegin = iend + 1; ++wbegin; goto L170; } /* The desired (shifted) eigenvalues are stored in W(WBEGIN:WEND) */ /* Note that these can be approximations, in this case, the corresp. */ /* entries of WERR give the size of the uncertainty interval. */ /* The eigenvalue approximations will be refined when necessary as */ /* high relative accuracy is required for the computation of the */ /* corresponding eigenvectors. */ _starpu_dcopy_(&im, &w[wbegin], &c__1, &work[wbegin], &c__1); /* We store in W the eigenvalue approximations w.r.t. the original */ /* matrix T. */ i__2 = im; for (i__ = 1; i__ <= i__2; ++i__) { w[wbegin + i__ - 1] += sigma; /* L30: */ } /* NDEPTH is the current depth of the representation tree */ ndepth = 0; /* PARITY is either 1 or 0 */ parity = 1; /* NCLUS is the number of clusters for the next level of the */ /* representation tree, we start with NCLUS = 1 for the root */ nclus = 1; iwork[iindc1 + 1] = 1; iwork[iindc1 + 2] = im; /* IDONE is the number of eigenvectors already computed in the current */ /* block */ idone = 0; /* loop while( IDONE.LT.IM ) */ /* generate the representation tree for the current block and */ /* compute the eigenvectors */ L40: if (idone < im) { /* This is a crude protection against infinitely deep trees */ if (ndepth > *m) { *info = -2; return 0; } /* breadth first processing of the current level of the representation */ /* tree: OLDNCL = number of clusters on current level */ oldncl = nclus; /* reset NCLUS to count the number of child clusters */ nclus = 0; parity = 1 - parity; if (parity == 0) { oldcls = iindc1; newcls = iindc2; } else { oldcls = iindc2; newcls = iindc1; } /* Process the clusters on the current level */ i__2 = oldncl; for (i__ = 1; i__ <= i__2; ++i__) { j = oldcls + (i__ << 1); /* OLDFST, OLDLST = first, last index of current cluster. */ /* cluster indices start with 1 and are relative */ /* to WBEGIN when accessing W, WGAP, WERR, Z */ oldfst = iwork[j - 1]; oldlst = iwork[j]; if (ndepth > 0) { /* Retrieve relatively robust representation (RRR) of cluster */ /* that has been computed at the previous level */ /* The RRR is stored in Z and overwritten once the eigenvectors */ /* have been computed or when the cluster is refined */ if (*dol == 1 && *dou == *m) { /* Get representation from location of the leftmost evalue */ /* of the cluster */ j = wbegin + oldfst - 1; } else { if (wbegin + oldfst - 1 < *dol) { /* Get representation from the left end of Z array */ j = *dol - 1; } else if (wbegin + oldfst - 1 > *dou) { /* Get representation from the right end of Z array */ j = *dou; } else { j = wbegin + oldfst - 1; } } _starpu_dcopy_(&in, &z__[ibegin + j * z_dim1], &c__1, &d__[ibegin] , &c__1); i__3 = in - 1; _starpu_dcopy_(&i__3, &z__[ibegin + (j + 1) * z_dim1], &c__1, &l[ ibegin], &c__1); sigma = z__[iend + (j + 1) * z_dim1]; /* Set the corresponding entries in Z to zero */ _starpu_dlaset_("Full", &in, &c__2, &c_b5, &c_b5, &z__[ibegin + j * z_dim1], ldz); } /* Compute DL and DLL of current RRR */ i__3 = iend - 1; for (j = ibegin; j <= i__3; ++j) { tmp = d__[j] * l[j]; work[indld - 1 + j] = tmp; work[indlld - 1 + j] = tmp * l[j]; /* L50: */ } if (ndepth > 0) { /* P and Q are index of the first and last eigenvalue to compute */ /* within the current block */ p = indexw[wbegin - 1 + oldfst]; q = indexw[wbegin - 1 + oldlst]; /* Offset for the arrays WORK, WGAP and WERR, i.e., th P-OFFSET */ /* thru' Q-OFFSET elements of these arrays are to be used. */ /* OFFSET = P-OLDFST */ offset = indexw[wbegin] - 1; /* perform limited bisection (if necessary) to get approximate */ /* eigenvalues to the precision needed. */ _starpu_dlarrb_(&in, &d__[ibegin], &work[indlld + ibegin - 1], &p, &q, rtol1, rtol2, &offset, &work[wbegin], &wgap[ wbegin], &werr[wbegin], &work[indwrk], &iwork[ iindwk], pivmin, &spdiam, &in, &iinfo); if (iinfo != 0) { *info = -1; return 0; } /* We also recompute the extremal gaps. W holds all eigenvalues */ /* of the unshifted matrix and must be used for computation */ /* of WGAP, the entries of WORK might stem from RRRs with */ /* different shifts. The gaps from WBEGIN-1+OLDFST to */ /* WBEGIN-1+OLDLST are correctly computed in DLARRB. */ /* However, we only allow the gaps to become greater since */ /* this is what should happen when we decrease WERR */ if (oldfst > 1) { /* Computing MAX */ d__1 = wgap[wbegin + oldfst - 2], d__2 = w[wbegin + oldfst - 1] - werr[wbegin + oldfst - 1] - w[ wbegin + oldfst - 2] - werr[wbegin + oldfst - 2]; wgap[wbegin + oldfst - 2] = max(d__1,d__2); } if (wbegin + oldlst - 1 < wend) { /* Computing MAX */ d__1 = wgap[wbegin + oldlst - 1], d__2 = w[wbegin + oldlst] - werr[wbegin + oldlst] - w[wbegin + oldlst - 1] - werr[wbegin + oldlst - 1]; wgap[wbegin + oldlst - 1] = max(d__1,d__2); } /* Each time the eigenvalues in WORK get refined, we store */ /* the newly found approximation with all shifts applied in W */ i__3 = oldlst; for (j = oldfst; j <= i__3; ++j) { w[wbegin + j - 1] = work[wbegin + j - 1] + sigma; /* L53: */ } } /* Process the current node. */ newfst = oldfst; i__3 = oldlst; for (j = oldfst; j <= i__3; ++j) { if (j == oldlst) { /* we are at the right end of the cluster, this is also the */ /* boundary of the child cluster */ newlst = j; } else if (wgap[wbegin + j - 1] >= *minrgp * (d__1 = work[ wbegin + j - 1], abs(d__1))) { /* the right relative gap is big enough, the child cluster */ /* (NEWFST,..,NEWLST) is well separated from the following */ newlst = j; } else { /* inside a child cluster, the relative gap is not */ /* big enough. */ goto L140; } /* Compute size of child cluster found */ newsiz = newlst - newfst + 1; /* NEWFTT is the place in Z where the new RRR or the computed */ /* eigenvector is to be stored */ if (*dol == 1 && *dou == *m) { /* Store representation at location of the leftmost evalue */ /* of the cluster */ newftt = wbegin + newfst - 1; } else { if (wbegin + newfst - 1 < *dol) { /* Store representation at the left end of Z array */ newftt = *dol - 1; } else if (wbegin + newfst - 1 > *dou) { /* Store representation at the right end of Z array */ newftt = *dou; } else { newftt = wbegin + newfst - 1; } } if (newsiz > 1) { /* Current child is not a singleton but a cluster. */ /* Compute and store new representation of child. */ /* Compute left and right cluster gap. */ /* LGAP and RGAP are not computed from WORK because */ /* the eigenvalue approximations may stem from RRRs */ /* different shifts. However, W hold all eigenvalues */ /* of the unshifted matrix. Still, the entries in WGAP */ /* have to be computed from WORK since the entries */ /* in W might be of the same order so that gaps are not */ /* exhibited correctly for very close eigenvalues. */ if (newfst == 1) { /* Computing MAX */ d__1 = 0., d__2 = w[wbegin] - werr[wbegin] - *vl; lgap = max(d__1,d__2); } else { lgap = wgap[wbegin + newfst - 2]; } rgap = wgap[wbegin + newlst - 1]; /* Compute left- and rightmost eigenvalue of child */ /* to high precision in order to shift as close */ /* as possible and obtain as large relative gaps */ /* as possible */ for (k = 1; k <= 2; ++k) { if (k == 1) { p = indexw[wbegin - 1 + newfst]; } else { p = indexw[wbegin - 1 + newlst]; } offset = indexw[wbegin] - 1; _starpu_dlarrb_(&in, &d__[ibegin], &work[indlld + ibegin - 1], &p, &p, &rqtol, &rqtol, &offset, & work[wbegin], &wgap[wbegin], &werr[wbegin] , &work[indwrk], &iwork[iindwk], pivmin, & spdiam, &in, &iinfo); /* L55: */ } if (wbegin + newlst - 1 < *dol || wbegin + newfst - 1 > *dou) { /* if the cluster contains no desired eigenvalues */ /* skip the computation of that branch of the rep. tree */ /* We could skip before the refinement of the extremal */ /* eigenvalues of the child, but then the representation */ /* tree could be different from the one when nothing is */ /* skipped. For this reason we skip at this place. */ idone = idone + newlst - newfst + 1; goto L139; } /* Compute RRR of child cluster. */ /* Note that the new RRR is stored in Z */ /* DLARRF needs LWORK = 2*N */ _starpu_dlarrf_(&in, &d__[ibegin], &l[ibegin], &work[indld + ibegin - 1], &newfst, &newlst, &work[wbegin], &wgap[wbegin], &werr[wbegin], &spdiam, &lgap, &rgap, pivmin, &tau, &z__[ibegin + newftt * z_dim1], &z__[ibegin + (newftt + 1) * z_dim1], &work[indwrk], &iinfo); if (iinfo == 0) { /* a new RRR for the cluster was found by DLARRF */ /* update shift and store it */ ssigma = sigma + tau; z__[iend + (newftt + 1) * z_dim1] = ssigma; /* WORK() are the midpoints and WERR() the semi-width */ /* Note that the entries in W are unchanged. */ i__4 = newlst; for (k = newfst; k <= i__4; ++k) { fudge = eps * 3. * (d__1 = work[wbegin + k - 1], abs(d__1)); work[wbegin + k - 1] -= tau; fudge += eps * 4. * (d__1 = work[wbegin + k - 1], abs(d__1)); /* Fudge errors */ werr[wbegin + k - 1] += fudge; /* Gaps are not fudged. Provided that WERR is small */ /* when eigenvalues are close, a zero gap indicates */ /* that a new representation is needed for resolving */ /* the cluster. A fudge could lead to a wrong decision */ /* of judging eigenvalues 'separated' which in */ /* reality are not. This could have a negative impact */ /* on the orthogonality of the computed eigenvectors. */ /* L116: */ } ++nclus; k = newcls + (nclus << 1); iwork[k - 1] = newfst; iwork[k] = newlst; } else { *info = -2; return 0; } } else { /* Compute eigenvector of singleton */ iter = 0; tol = log((doublereal) in) * 4. * eps; k = newfst; windex = wbegin + k - 1; /* Computing MAX */ i__4 = windex - 1; windmn = max(i__4,1); /* Computing MIN */ i__4 = windex + 1; windpl = min(i__4,*m); lambda = work[windex]; ++done; /* Check if eigenvector computation is to be skipped */ if (windex < *dol || windex > *dou) { eskip = TRUE_; goto L125; } else { eskip = FALSE_; } left = work[windex] - werr[windex]; right = work[windex] + werr[windex]; indeig = indexw[windex]; /* Note that since we compute the eigenpairs for a child, */ /* all eigenvalue approximations are w.r.t the same shift. */ /* In this case, the entries in WORK should be used for */ /* computing the gaps since they exhibit even very small */ /* differences in the eigenvalues, as opposed to the */ /* entries in W which might "look" the same. */ if (k == 1) { /* In the case RANGE='I' and with not much initial */ /* accuracy in LAMBDA and VL, the formula */ /* LGAP = MAX( ZERO, (SIGMA - VL) + LAMBDA ) */ /* can lead to an overestimation of the left gap and */ /* thus to inadequately early RQI 'convergence'. */ /* Prevent this by forcing a small left gap. */ /* Computing MAX */ d__1 = abs(left), d__2 = abs(right); lgap = eps * max(d__1,d__2); } else { lgap = wgap[windmn]; } if (k == im) { /* In the case RANGE='I' and with not much initial */ /* accuracy in LAMBDA and VU, the formula */ /* can lead to an overestimation of the right gap and */ /* thus to inadequately early RQI 'convergence'. */ /* Prevent this by forcing a small right gap. */ /* Computing MAX */ d__1 = abs(left), d__2 = abs(right); rgap = eps * max(d__1,d__2); } else { rgap = wgap[windex]; } gap = min(lgap,rgap); if (k == 1 || k == im) { /* The eigenvector support can become wrong */ /* because significant entries could be cut off due to a */ /* large GAPTOL parameter in LAR1V. Prevent this. */ gaptol = 0.; } else { gaptol = gap * eps; } isupmn = in; isupmx = 1; /* Update WGAP so that it holds the minimum gap */ /* to the left or the right. This is crucial in the */ /* case where bisection is used to ensure that the */ /* eigenvalue is refined up to the required precision. */ /* The correct value is restored afterwards. */ savgap = wgap[windex]; wgap[windex] = gap; /* We want to use the Rayleigh Quotient Correction */ /* as often as possible since it converges quadratically */ /* when we are close enough to the desired eigenvalue. */ /* However, the Rayleigh Quotient can have the wrong sign */ /* and lead us away from the desired eigenvalue. In this */ /* case, the best we can do is to use bisection. */ usedbs = FALSE_; usedrq = FALSE_; /* Bisection is initially turned off unless it is forced */ needbs = ! tryrqc; L120: /* Check if bisection should be used to refine eigenvalue */ if (needbs) { /* Take the bisection as new iterate */ usedbs = TRUE_; itmp1 = iwork[iindr + windex]; offset = indexw[wbegin] - 1; d__1 = eps * 2.; _starpu_dlarrb_(&in, &d__[ibegin], &work[indlld + ibegin - 1], &indeig, &indeig, &c_b5, &d__1, & offset, &work[wbegin], &wgap[wbegin], & werr[wbegin], &work[indwrk], &iwork[ iindwk], pivmin, &spdiam, &itmp1, &iinfo); if (iinfo != 0) { *info = -3; return 0; } lambda = work[windex]; /* Reset twist index from inaccurate LAMBDA to */ /* force computation of true MINGMA */ iwork[iindr + windex] = 0; } /* Given LAMBDA, compute the eigenvector. */ L__1 = ! usedbs; _starpu_dlar1v_(&in, &c__1, &in, &lambda, &d__[ibegin], &l[ ibegin], &work[indld + ibegin - 1], &work[ indlld + ibegin - 1], pivmin, &gaptol, &z__[ ibegin + windex * z_dim1], &L__1, &negcnt, & ztz, &mingma, &iwork[iindr + windex], &isuppz[ (windex << 1) - 1], &nrminv, &resid, &rqcorr, &work[indwrk]); if (iter == 0) { bstres = resid; bstw = lambda; } else if (resid < bstres) { bstres = resid; bstw = lambda; } /* Computing MIN */ i__4 = isupmn, i__5 = isuppz[(windex << 1) - 1]; isupmn = min(i__4,i__5); /* Computing MAX */ i__4 = isupmx, i__5 = isuppz[windex * 2]; isupmx = max(i__4,i__5); ++iter; /* sin alpha <= |resid|/gap */ /* Note that both the residual and the gap are */ /* proportional to the matrix, so ||T|| doesn't play */ /* a role in the quotient */ /* Convergence test for Rayleigh-Quotient iteration */ /* (omitted when Bisection has been used) */ if (resid > tol * gap && abs(rqcorr) > rqtol * abs( lambda) && ! usedbs) { /* We need to check that the RQCORR update doesn't */ /* move the eigenvalue away from the desired one and */ /* towards a neighbor. -> protection with bisection */ if (indeig <= negcnt) { /* The wanted eigenvalue lies to the left */ sgndef = -1.; } else { /* The wanted eigenvalue lies to the right */ sgndef = 1.; } /* We only use the RQCORR if it improves the */ /* the iterate reasonably. */ if (rqcorr * sgndef >= 0. && lambda + rqcorr <= right && lambda + rqcorr >= left) { usedrq = TRUE_; /* Store new midpoint of bisection interval in WORK */ if (sgndef == 1.) { /* The current LAMBDA is on the left of the true */ /* eigenvalue */ left = lambda; /* We prefer to assume that the error estimate */ /* is correct. We could make the interval not */ /* as a bracket but to be modified if the RQCORR */ /* chooses to. In this case, the RIGHT side should */ /* be modified as follows: */ /* RIGHT = MAX(RIGHT, LAMBDA + RQCORR) */ } else { /* The current LAMBDA is on the right of the true */ /* eigenvalue */ right = lambda; /* See comment about assuming the error estimate is */ /* correct above. */ /* LEFT = MIN(LEFT, LAMBDA + RQCORR) */ } work[windex] = (right + left) * .5; /* Take RQCORR since it has the correct sign and */ /* improves the iterate reasonably */ lambda += rqcorr; /* Update width of error interval */ werr[windex] = (right - left) * .5; } else { needbs = TRUE_; } if (right - left < rqtol * abs(lambda)) { /* The eigenvalue is computed to bisection accuracy */ /* compute eigenvector and stop */ usedbs = TRUE_; goto L120; } else if (iter < 10) { goto L120; } else if (iter == 10) { needbs = TRUE_; goto L120; } else { *info = 5; return 0; } } else { stp2ii = FALSE_; if (usedrq && usedbs && bstres <= resid) { lambda = bstw; stp2ii = TRUE_; } if (stp2ii) { /* improve error angle by second step */ L__1 = ! usedbs; _starpu_dlar1v_(&in, &c__1, &in, &lambda, &d__[ibegin] , &l[ibegin], &work[indld + ibegin - 1], &work[indlld + ibegin - 1], pivmin, &gaptol, &z__[ibegin + windex * z_dim1], &L__1, &negcnt, &ztz, & mingma, &iwork[iindr + windex], & isuppz[(windex << 1) - 1], &nrminv, & resid, &rqcorr, &work[indwrk]); } work[windex] = lambda; } /* Compute FP-vector support w.r.t. whole matrix */ isuppz[(windex << 1) - 1] += oldien; isuppz[windex * 2] += oldien; zfrom = isuppz[(windex << 1) - 1]; zto = isuppz[windex * 2]; isupmn += oldien; isupmx += oldien; /* Ensure vector is ok if support in the RQI has changed */ if (isupmn < zfrom) { i__4 = zfrom - 1; for (ii = isupmn; ii <= i__4; ++ii) { z__[ii + windex * z_dim1] = 0.; /* L122: */ } } if (isupmx > zto) { i__4 = isupmx; for (ii = zto + 1; ii <= i__4; ++ii) { z__[ii + windex * z_dim1] = 0.; /* L123: */ } } i__4 = zto - zfrom + 1; _starpu_dscal_(&i__4, &nrminv, &z__[zfrom + windex * z_dim1], &c__1); L125: /* Update W */ w[windex] = lambda + sigma; /* Recompute the gaps on the left and right */ /* But only allow them to become larger and not */ /* smaller (which can only happen through "bad" */ /* cancellation and doesn't reflect the theory */ /* where the initial gaps are underestimated due */ /* to WERR being too crude.) */ if (! eskip) { if (k > 1) { /* Computing MAX */ d__1 = wgap[windmn], d__2 = w[windex] - werr[ windex] - w[windmn] - werr[windmn]; wgap[windmn] = max(d__1,d__2); } if (windex < wend) { /* Computing MAX */ d__1 = savgap, d__2 = w[windpl] - werr[windpl] - w[windex] - werr[windex]; wgap[windex] = max(d__1,d__2); } } ++idone; } /* here ends the code for the current child */ L139: /* Proceed to any remaining child nodes */ newfst = j + 1; L140: ; } /* L150: */ } ++ndepth; goto L40; } ibegin = iend + 1; wbegin = wend + 1; L170: ; } return 0; /* End of DLARRV */ } /* _starpu_dlarrv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarscl2.c000066400000000000000000000051341413463044200210570ustar00rootroot00000000000000/* dlarscl2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlarscl2_(integer *m, integer *n, doublereal *d__, doublereal *x, integer *ldx) { /* System generated locals */ integer x_dim1, x_offset, i__1, i__2; /* Local variables */ integer i__, j; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARSCL2 performs a reciprocal diagonal scaling on an vector: */ /* x <-- inv(D) * x */ /* where the diagonal matrix D is stored as a vector. */ /* Eventually to be replaced by BLAS_dge_diag_scale in the new BLAS */ /* standard. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of D and X. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of D and X. N >= 0. */ /* D (input) DOUBLE PRECISION array, length M */ /* Diagonal matrix D, stored as a vector of length M. */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,N) */ /* On entry, the vector X to be scaled by D. */ /* On exit, the scaled vector. */ /* LDX (input) INTEGER */ /* The leading dimension of the vector X. LDX >= 0. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --d__; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; /* Function Body */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] /= d__[i__]; } } return 0; } /* _starpu_dlarscl2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlartg.c000066400000000000000000000114711413463044200206270ustar00rootroot00000000000000/* dlartg.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlartg_(doublereal *f, doublereal *g, doublereal *cs, doublereal *sn, doublereal *r__) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal), pow_di(doublereal *, integer *), sqrt(doublereal); /* Local variables */ integer i__; doublereal f1, g1, eps, scale; integer count; doublereal safmn2, safmx2; extern doublereal _starpu_dlamch_(char *); doublereal safmin; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARTG generate a plane rotation so that */ /* [ CS SN ] . [ F ] = [ R ] where CS**2 + SN**2 = 1. */ /* [ -SN CS ] [ G ] [ 0 ] */ /* This is a slower, more accurate version of the BLAS1 routine DROTG, */ /* with the following other differences: */ /* F and G are unchanged on return. */ /* If G=0, then CS=1 and SN=0. */ /* If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any */ /* floating point operations (saves work in DBDSQR when */ /* there are zeros on the diagonal). */ /* If F exceeds G in magnitude, CS will be positive. */ /* Arguments */ /* ========= */ /* F (input) DOUBLE PRECISION */ /* The first component of vector to be rotated. */ /* G (input) DOUBLE PRECISION */ /* The second component of vector to be rotated. */ /* CS (output) DOUBLE PRECISION */ /* The cosine of the rotation. */ /* SN (output) DOUBLE PRECISION */ /* The sine of the rotation. */ /* R (output) DOUBLE PRECISION */ /* The nonzero component of the rotated vector. */ /* This version has a few statements commented out for thread safety */ /* (machine parameters are computed on each entry). 10 feb 03, SJH. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* LOGICAL FIRST */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Save statement .. */ /* SAVE FIRST, SAFMX2, SAFMIN, SAFMN2 */ /* .. */ /* .. Data statements .. */ /* DATA FIRST / .TRUE. / */ /* .. */ /* .. Executable Statements .. */ /* IF( FIRST ) THEN */ safmin = _starpu_dlamch_("S"); eps = _starpu_dlamch_("E"); d__1 = _starpu_dlamch_("B"); i__1 = (integer) (log(safmin / eps) / log(_starpu_dlamch_("B")) / 2.); safmn2 = pow_di(&d__1, &i__1); safmx2 = 1. / safmn2; /* FIRST = .FALSE. */ /* END IF */ if (*g == 0.) { *cs = 1.; *sn = 0.; *r__ = *f; } else if (*f == 0.) { *cs = 0.; *sn = 1.; *r__ = *g; } else { f1 = *f; g1 = *g; /* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); scale = max(d__1,d__2); if (scale >= safmx2) { count = 0; L10: ++count; f1 *= safmn2; g1 *= safmn2; /* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); scale = max(d__1,d__2); if (scale >= safmx2) { goto L10; } /* Computing 2nd power */ d__1 = f1; /* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; *sn = g1 / *r__; i__1 = count; for (i__ = 1; i__ <= i__1; ++i__) { *r__ *= safmx2; /* L20: */ } } else if (scale <= safmn2) { count = 0; L30: ++count; f1 *= safmx2; g1 *= safmx2; /* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); scale = max(d__1,d__2); if (scale <= safmn2) { goto L30; } /* Computing 2nd power */ d__1 = f1; /* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; *sn = g1 / *r__; i__1 = count; for (i__ = 1; i__ <= i__1; ++i__) { *r__ *= safmn2; /* L40: */ } } else { /* Computing 2nd power */ d__1 = f1; /* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; *sn = g1 / *r__; } if (abs(*f) > abs(*g) && *cs < 0.) { *cs = -(*cs); *sn = -(*sn); *r__ = -(*r__); } } return 0; /* End of DLARTG */ } /* _starpu_dlartg_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlartv.c000066400000000000000000000053521413463044200206470ustar00rootroot00000000000000/* dlartv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlartv_(integer *n, doublereal *x, integer *incx, doublereal *y, integer *incy, doublereal *c__, doublereal *s, integer *incc) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, ic, ix, iy; doublereal xi, yi; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARTV applies a vector of real plane rotations to elements of the */ /* real vectors x and y. For i = 1,2,...,n */ /* ( x(i) ) := ( c(i) s(i) ) ( x(i) ) */ /* ( y(i) ) ( -s(i) c(i) ) ( y(i) ) */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of plane rotations to be applied. */ /* X (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCX) */ /* The vector x. */ /* INCX (input) INTEGER */ /* The increment between elements of X. INCX > 0. */ /* Y (input/output) DOUBLE PRECISION array, */ /* dimension (1+(N-1)*INCY) */ /* The vector y. */ /* INCY (input) INTEGER */ /* The increment between elements of Y. INCY > 0. */ /* C (input) DOUBLE PRECISION array, dimension (1+(N-1)*INCC) */ /* The cosines of the plane rotations. */ /* S (input) DOUBLE PRECISION array, dimension (1+(N-1)*INCC) */ /* The sines of the plane rotations. */ /* INCC (input) INTEGER */ /* The increment between elements of C and S. INCC > 0. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --s; --c__; --y; --x; /* Function Body */ ix = 1; iy = 1; ic = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xi = x[ix]; yi = y[iy]; x[ix] = c__[ic] * xi + s[ic] * yi; y[iy] = c__[ic] * yi - s[ic] * xi; ix += *incx; iy += *incy; ic += *incc; /* L10: */ } return 0; /* End of DLARTV */ } /* _starpu_dlartv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaruv.c000066400000000000000000000156331413463044200206530ustar00rootroot00000000000000/* dlaruv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaruv_(integer *iseed, integer *n, doublereal *x) { /* Initialized data */ static integer mm[512] /* was [128][4] */ = { 494,2637,255,2008,1253, 3344,4084,1739,3143,3468,688,1657,1238,3166,1292,3422,1270,2016, 154,2862,697,1706,491,931,1444,444,3577,3944,2184,1661,3482,657, 3023,3618,1267,1828,164,3798,3087,2400,2870,3876,1905,1593,1797, 1234,3460,328,2861,1950,617,2070,3331,769,1558,2412,2800,189,287, 2045,1227,2838,209,2770,3654,3993,192,2253,3491,2889,2857,2094, 1818,688,1407,634,3231,815,3524,1914,516,164,303,2144,3480,119, 3357,837,2826,2332,2089,3780,1700,3712,150,2000,3375,1621,3090, 3765,1149,3146,33,3082,2741,359,3316,1749,185,2784,2202,2199,1364, 1244,2020,3160,2785,2772,1217,1822,1245,2252,3904,2774,997,2573, 1148,545,322,789,1440,752,2859,123,1848,643,2405,2638,2344,46, 3814,913,3649,339,3808,822,2832,3078,3633,2970,637,2249,2081,4019, 1478,242,481,2075,4058,622,3376,812,234,641,4005,1122,3135,2640, 2302,40,1832,2247,2034,2637,1287,1691,496,1597,2394,2584,1843,336, 1472,2407,433,2096,1761,2810,566,442,41,1238,1086,603,840,3168, 1499,1084,3438,2408,1589,2391,288,26,512,1456,171,1677,2657,2270, 2587,2961,1970,1817,676,1410,3723,2803,3185,184,663,499,3784,1631, 1925,3912,1398,1349,1441,2224,2411,1907,3192,2786,382,37,759,2948, 1862,3802,2423,2051,2295,1332,1832,2405,3638,3661,327,3660,716, 1842,3987,1368,1848,2366,2508,3754,1766,3572,2893,307,1297,3966, 758,2598,3406,2922,1038,2934,2091,2451,1580,1958,2055,1507,1078, 3273,17,854,2916,3971,2889,3831,2621,1541,893,736,3992,787,2125, 2364,2460,257,1574,3912,1216,3248,3401,2124,2762,149,2245,166,466, 4018,1399,190,2879,153,2320,18,712,2159,2318,2091,3443,1510,449, 1956,2201,3137,3399,1321,2271,3667,2703,629,2365,2431,1113,3922, 2554,184,2099,3228,4012,1921,3452,3901,572,3309,3171,817,3039, 1696,1256,3715,2077,3019,1497,1101,717,51,981,1978,1813,3881,76, 3846,3694,1682,124,1660,3997,479,1141,886,3514,1301,3604,1888, 1836,1990,2058,692,1194,20,3285,2046,2107,3508,3525,3801,2549, 1145,2253,305,3301,1065,3133,2913,3285,1241,1197,3729,2501,1673, 541,2753,949,2361,1165,4081,2725,3305,3069,3617,3733,409,2157, 1361,3973,1865,2525,1409,3445,3577,77,3761,2149,1449,3005,225,85, 3673,3117,3089,1349,2057,413,65,1845,697,3085,3441,1573,3689,2941, 929,533,2841,4077,721,2821,2249,2397,2817,245,1913,1997,3121,997, 1833,2877,1633,981,2009,941,2449,197,2441,285,1473,2741,3129,909, 2801,421,4073,2813,2337,1429,1177,1901,81,1669,2633,2269,129,1141, 249,3917,2481,3941,2217,2749,3041,1877,345,2861,1809,3141,2825, 157,2881,3637,1465,2829,2161,3365,361,2685,3745,2325,3609,3821, 3537,517,3017,2141,1537 }; /* System generated locals */ integer i__1; /* Local variables */ integer i__, i1, i2, i3, i4, it1, it2, it3, it4; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARUV returns a vector of n random real numbers from a uniform (0,1) */ /* distribution (n <= 128). */ /* This is an auxiliary routine called by DLARNV and ZLARNV. */ /* Arguments */ /* ========= */ /* ISEED (input/output) INTEGER array, dimension (4) */ /* On entry, the seed of the random number generator; the array */ /* elements must be between 0 and 4095, and ISEED(4) must be */ /* odd. */ /* On exit, the seed is updated. */ /* N (input) INTEGER */ /* The number of random numbers to be generated. N <= 128. */ /* X (output) DOUBLE PRECISION array, dimension (N) */ /* The generated random numbers. */ /* Further Details */ /* =============== */ /* This routine uses a multiplicative congruential method with modulus */ /* 2**48 and multiplier 33952834046453 (see G.S.Fishman, */ /* 'Multiplicative congruential random number generators with modulus */ /* 2**b: an exhaustive analysis for b = 32 and a partial analysis for */ /* b = 48', Math. Comp. 189, pp 331-344, 1990). */ /* 48-bit integers are stored in 4 integer array elements with 12 bits */ /* per element. Hence the routine is portable across machines with */ /* integers of 32 bits or more. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --iseed; --x; /* Function Body */ /* .. */ /* .. Executable Statements .. */ i1 = iseed[1]; i2 = iseed[2]; i3 = iseed[3]; i4 = iseed[4]; i__1 = min(*n,128); for (i__ = 1; i__ <= i__1; ++i__) { L20: /* Multiply the seed by i-th power of the multiplier modulo 2**48 */ it4 = i4 * mm[i__ + 383]; it3 = it4 / 4096; it4 -= it3 << 12; it3 = it3 + i3 * mm[i__ + 383] + i4 * mm[i__ + 255]; it2 = it3 / 4096; it3 -= it2 << 12; it2 = it2 + i2 * mm[i__ + 383] + i3 * mm[i__ + 255] + i4 * mm[i__ + 127]; it1 = it2 / 4096; it2 -= it1 << 12; it1 = it1 + i1 * mm[i__ + 383] + i2 * mm[i__ + 255] + i3 * mm[i__ + 127] + i4 * mm[i__ - 1]; it1 %= 4096; /* Convert 48-bit integer to a real number in the interval (0,1) */ x[i__] = ((doublereal) it1 + ((doublereal) it2 + ((doublereal) it3 + ( doublereal) it4 * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4; if (x[i__] == 1.) { /* If a real number has n bits of precision, and the first */ /* n bits of the 48-bit integer above happen to be all 1 (which */ /* will occur about once every 2**n calls), then X( I ) will */ /* be rounded to exactly 1.0. */ /* Since X( I ) is not supposed to return exactly 0.0 or 1.0, */ /* the statistically correct thing to do in this situation is */ /* simply to iterate again. */ /* N.B. the case X( I ) = 0.0 should not be possible. */ i1 += 2; i2 += 2; i3 += 2; i4 += 2; goto L20; } /* L10: */ } /* Return final value of seed */ iseed[1] = it1; iseed[2] = it2; iseed[3] = it3; iseed[4] = it4; return 0; /* End of DLARUV */ } /* _starpu_dlaruv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarz.c000066400000000000000000000131701413463044200204640ustar00rootroot00000000000000/* dlarz.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b5 = 1.; /* Subroutine */ int _starpu_dlarz_(char *side, integer *m, integer *n, integer *l, doublereal *v, integer *incv, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work) { /* System generated locals */ integer c_dim1, c_offset; doublereal d__1; /* Local variables */ extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *) ; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARZ applies a real elementary reflector H to a real M-by-N */ /* matrix C, from either the left or the right. H is represented in the */ /* form */ /* H = I - tau * v * v' */ /* where tau is a real scalar and v is a real vector. */ /* If tau = 0, then H is taken to be the unit matrix. */ /* H is a product of k elementary reflectors as returned by DTZRZF. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': form H * C */ /* = 'R': form C * H */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* L (input) INTEGER */ /* The number of entries of the vector V containing */ /* the meaningful part of the Householder vectors. */ /* If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. */ /* V (input) DOUBLE PRECISION array, dimension (1+(L-1)*abs(INCV)) */ /* The vector v in the representation of H as returned by */ /* DTZRZF. V is not used if TAU = 0. */ /* INCV (input) INTEGER */ /* The increment between elements of v. INCV <> 0. */ /* TAU (input) DOUBLE PRECISION */ /* The value tau in the representation of H. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ /* or C * H if SIDE = 'R'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L' */ /* or (M) if SIDE = 'R' */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --v; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ if (_starpu_lsame_(side, "L")) { /* Form H * C */ if (*tau != 0.) { /* w( 1:n ) = C( 1, 1:n ) */ _starpu_dcopy_(n, &c__[c_offset], ldc, &work[1], &c__1); /* w( 1:n ) = w( 1:n ) + C( m-l+1:m, 1:n )' * v( 1:l ) */ _starpu_dgemv_("Transpose", l, n, &c_b5, &c__[*m - *l + 1 + c_dim1], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n ) */ d__1 = -(*tau); _starpu_daxpy_(n, &d__1, &work[1], &c__1, &c__[c_offset], ldc); /* C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ... */ /* tau * v( 1:l ) * w( 1:n )' */ d__1 = -(*tau); _starpu_dger_(l, n, &d__1, &v[1], incv, &work[1], &c__1, &c__[*m - *l + 1 + c_dim1], ldc); } } else { /* Form C * H */ if (*tau != 0.) { /* w( 1:m ) = C( 1:m, 1 ) */ _starpu_dcopy_(m, &c__[c_offset], &c__1, &work[1], &c__1); /* w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l ) */ _starpu_dgemv_("No transpose", m, l, &c_b5, &c__[(*n - *l + 1) * c_dim1 + 1], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m ) */ d__1 = -(*tau); _starpu_daxpy_(m, &d__1, &work[1], &c__1, &c__[c_offset], &c__1); /* C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ... */ /* tau * w( 1:m ) * v( 1:l )' */ d__1 = -(*tau); _starpu_dger_(m, l, &d__1, &work[1], &c__1, &v[1], incv, &c__[(*n - *l + 1) * c_dim1 + 1], ldc); } } return 0; /* End of DLARZ */ } /* _starpu_dlarz_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarzb.c000066400000000000000000000206631413463044200206330ustar00rootroot00000000000000/* dlarzb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b13 = 1.; static doublereal c_b23 = -1.; /* Subroutine */ int _starpu_dlarzb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, integer *l, doublereal *v, integer *ldv, doublereal *t, integer *ldt, doublereal *c__, integer * ldc, doublereal *work, integer *ldwork) { /* System generated locals */ integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2; /* Local variables */ integer i__, j, info; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_( char *, integer *); char transt[1]; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARZB applies a real block reflector H or its transpose H**T to */ /* a real distributed M-by-N C from the left or the right. */ /* Currently, only STOREV = 'R' and DIRECT = 'B' are supported. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply H or H' from the Left */ /* = 'R': apply H or H' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply H (No transpose) */ /* = 'C': apply H' (Transpose) */ /* DIRECT (input) CHARACTER*1 */ /* Indicates how H is formed from a product of elementary */ /* reflectors */ /* = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet) */ /* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ /* STOREV (input) CHARACTER*1 */ /* Indicates how the vectors which define the elementary */ /* reflectors are stored: */ /* = 'C': Columnwise (not supported yet) */ /* = 'R': Rowwise */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* K (input) INTEGER */ /* The order of the matrix T (= the number of elementary */ /* reflectors whose product defines the block reflector). */ /* L (input) INTEGER */ /* The number of columns of the matrix V containing the */ /* meaningful part of the Householder reflectors. */ /* If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. */ /* V (input) DOUBLE PRECISION array, dimension (LDV,NV). */ /* If STOREV = 'C', NV = K; if STOREV = 'R', NV = L. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. */ /* If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K. */ /* T (input) DOUBLE PRECISION array, dimension (LDT,K) */ /* The triangular K-by-K matrix T in the representation of the */ /* block reflector. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= K. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) */ /* LDWORK (input) INTEGER */ /* The leading dimension of the array WORK. */ /* If SIDE = 'L', LDWORK >= max(1,N); */ /* if SIDE = 'R', LDWORK >= max(1,M). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; work_dim1 = *ldwork; work_offset = 1 + work_dim1; work -= work_offset; /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } /* Check for currently supported options */ info = 0; if (! _starpu_lsame_(direct, "B")) { info = -3; } else if (! _starpu_lsame_(storev, "R")) { info = -4; } if (info != 0) { i__1 = -info; _starpu_xerbla_("DLARZB", &i__1); return 0; } if (_starpu_lsame_(trans, "N")) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (_starpu_lsame_(side, "L")) { /* Form H * C or H' * C */ /* W( 1:n, 1:k ) = C( 1:k, 1:n )' */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); /* L10: */ } /* W( 1:n, 1:k ) = W( 1:n, 1:k ) + ... */ /* C( m-l+1:m, 1:n )' * V( 1:k, 1:l )' */ if (*l > 0) { _starpu_dgemm_("Transpose", "Transpose", n, k, l, &c_b13, &c__[*m - *l + 1 + c_dim1], ldc, &v[v_offset], ldv, &c_b13, &work[ work_offset], ldwork); } /* W( 1:n, 1:k ) = W( 1:n, 1:k ) * T' or W( 1:m, 1:k ) * T */ _starpu_dtrmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b13, &t[ t_offset], ldt, &work[work_offset], ldwork); /* C( 1:k, 1:n ) = C( 1:k, 1:n ) - W( 1:n, 1:k )' */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[j + i__ * work_dim1]; /* L20: */ } /* L30: */ } /* C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ... */ /* V( 1:k, 1:l )' * W( 1:n, 1:k )' */ if (*l > 0) { _starpu_dgemm_("Transpose", "Transpose", l, n, k, &c_b23, &v[v_offset], ldv, &work[work_offset], ldwork, &c_b13, &c__[*m - *l + 1 + c_dim1], ldc); } } else if (_starpu_lsame_(side, "R")) { /* Form C * H or C * H' */ /* W( 1:m, 1:k ) = C( 1:m, 1:k ) */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], & c__1); /* L40: */ } /* W( 1:m, 1:k ) = W( 1:m, 1:k ) + ... */ /* C( 1:m, n-l+1:n ) * V( 1:k, 1:l )' */ if (*l > 0) { _starpu_dgemm_("No transpose", "Transpose", m, k, l, &c_b13, &c__[(*n - * l + 1) * c_dim1 + 1], ldc, &v[v_offset], ldv, &c_b13, & work[work_offset], ldwork); } /* W( 1:m, 1:k ) = W( 1:m, 1:k ) * T or W( 1:m, 1:k ) * T' */ _starpu_dtrmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b13, &t[t_offset] , ldt, &work[work_offset], ldwork); /* C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k ) */ i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L50: */ } /* L60: */ } /* C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ... */ /* W( 1:m, 1:k ) * V( 1:k, 1:l ) */ if (*l > 0) { _starpu_dgemm_("No transpose", "No transpose", m, l, k, &c_b23, &work[ work_offset], ldwork, &v[v_offset], ldv, &c_b13, &c__[(*n - *l + 1) * c_dim1 + 1], ldc); } } return 0; /* End of DLARZB */ } /* _starpu_dlarzb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlarzt.c000066400000000000000000000163531413463044200206560ustar00rootroot00000000000000/* dlarzt.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b8 = 0.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlarzt_(char *direct, char *storev, integer *n, integer * k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, integer *ldt) { /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1; doublereal d__1; /* Local variables */ integer i__, j, info; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLARZT forms the triangular factor T of a real block reflector */ /* H of order > n, which is defined as a product of k elementary */ /* reflectors. */ /* If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ /* If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ /* If STOREV = 'C', the vector which defines the elementary reflector */ /* H(i) is stored in the i-th column of the array V, and */ /* H = I - V * T * V' */ /* If STOREV = 'R', the vector which defines the elementary reflector */ /* H(i) is stored in the i-th row of the array V, and */ /* H = I - V' * T * V */ /* Currently, only STOREV = 'R' and DIRECT = 'B' are supported. */ /* Arguments */ /* ========= */ /* DIRECT (input) CHARACTER*1 */ /* Specifies the order in which the elementary reflectors are */ /* multiplied to form the block reflector: */ /* = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet) */ /* = 'B': H = H(k) . . . H(2) H(1) (Backward) */ /* STOREV (input) CHARACTER*1 */ /* Specifies how the vectors which define the elementary */ /* reflectors are stored (see also Further Details): */ /* = 'C': columnwise (not supported yet) */ /* = 'R': rowwise */ /* N (input) INTEGER */ /* The order of the block reflector H. N >= 0. */ /* K (input) INTEGER */ /* The order of the triangular factor T (= the number of */ /* elementary reflectors). K >= 1. */ /* V (input/output) DOUBLE PRECISION array, dimension */ /* (LDV,K) if STOREV = 'C' */ /* (LDV,N) if STOREV = 'R' */ /* The matrix V. See further details. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. */ /* If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i). */ /* T (output) DOUBLE PRECISION array, dimension (LDT,K) */ /* The k by k triangular factor T of the block reflector. */ /* If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ /* lower triangular. The rest of the array is not used. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= K. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* The shape of the matrix V and the storage of the vectors which define */ /* the H(i) is best illustrated by the following example with n = 5 and */ /* k = 3. The elements equal to 1 are not stored; the corresponding */ /* array elements are modified but restored on exit. The rest of the */ /* array is not used. */ /* DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ /* ______V_____ */ /* ( v1 v2 v3 ) / \ */ /* ( v1 v2 v3 ) ( v1 v1 v1 v1 v1 . . . . 1 ) */ /* V = ( v1 v2 v3 ) ( v2 v2 v2 v2 v2 . . . 1 ) */ /* ( v1 v2 v3 ) ( v3 v3 v3 v3 v3 . . 1 ) */ /* ( v1 v2 v3 ) */ /* . . . */ /* . . . */ /* 1 . . */ /* 1 . */ /* 1 */ /* DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ /* ______V_____ */ /* 1 / \ */ /* . 1 ( 1 . . . . v1 v1 v1 v1 v1 ) */ /* . . 1 ( . 1 . . . v2 v2 v2 v2 v2 ) */ /* . . . ( . . 1 . . v3 v3 v3 v3 v3 ) */ /* . . . */ /* ( v1 v2 v3 ) */ /* ( v1 v2 v3 ) */ /* V = ( v1 v2 v3 ) */ /* ( v1 v2 v3 ) */ /* ( v1 v2 v3 ) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Check for currently supported options */ /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; --tau; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; /* Function Body */ info = 0; if (! _starpu_lsame_(direct, "B")) { info = -1; } else if (! _starpu_lsame_(storev, "R")) { info = -2; } if (info != 0) { i__1 = -info; _starpu_xerbla_("DLARZT", &i__1); return 0; } for (i__ = *k; i__ >= 1; --i__) { if (tau[i__] == 0.) { /* H(i) = I */ i__1 = *k; for (j = i__; j <= i__1; ++j) { t[j + i__ * t_dim1] = 0.; /* L10: */ } } else { /* general case */ if (i__ < *k) { /* T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)' */ i__1 = *k - i__; d__1 = -tau[i__]; _starpu_dgemv_("No transpose", &i__1, n, &d__1, &v[i__ + 1 + v_dim1], ldv, &v[i__ + v_dim1], ldv, &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1); /* T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i) */ i__1 = *k - i__; _starpu_dtrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * t_dim1] , &c__1); } t[i__ + i__ * t_dim1] = tau[i__]; } /* L20: */ } return 0; /* End of DLARZT */ } /* _starpu_dlarzt_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlas2.c000066400000000000000000000076741413463044200203710ustar00rootroot00000000000000/* dlas2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlas2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax) { /* System generated locals */ doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal c__, fa, ga, ha, as, at, au, fhmn, fhmx; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAS2 computes the singular values of the 2-by-2 matrix */ /* [ F G ] */ /* [ 0 H ]. */ /* On return, SSMIN is the smaller singular value and SSMAX is the */ /* larger singular value. */ /* Arguments */ /* ========= */ /* F (input) DOUBLE PRECISION */ /* The (1,1) element of the 2-by-2 matrix. */ /* G (input) DOUBLE PRECISION */ /* The (1,2) element of the 2-by-2 matrix. */ /* H (input) DOUBLE PRECISION */ /* The (2,2) element of the 2-by-2 matrix. */ /* SSMIN (output) DOUBLE PRECISION */ /* The smaller singular value. */ /* SSMAX (output) DOUBLE PRECISION */ /* The larger singular value. */ /* Further Details */ /* =============== */ /* Barring over/underflow, all output quantities are correct to within */ /* a few units in the last place (ulps), even in the absence of a guard */ /* digit in addition/subtraction. */ /* In IEEE arithmetic, the code works correctly if one matrix element is */ /* infinite. */ /* Overflow will not occur unless the largest singular value itself */ /* overflows, or is within a few ulps of overflow. (On machines with */ /* partial overflow, like the Cray, overflow may occur if the largest */ /* singular value is within a factor of 2 of overflow.) */ /* Underflow is harmless if underflow is gradual. Otherwise, results */ /* may correspond to a matrix modified by perturbations of size near */ /* the underflow threshold. */ /* ==================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ fa = abs(*f); ga = abs(*g); ha = abs(*h__); fhmn = min(fa,ha); fhmx = max(fa,ha); if (fhmn == 0.) { *ssmin = 0.; if (fhmx == 0.) { *ssmax = ga; } else { /* Computing 2nd power */ d__1 = min(fhmx,ga) / max(fhmx,ga); *ssmax = max(fhmx,ga) * sqrt(d__1 * d__1 + 1.); } } else { if (ga < fhmx) { as = fhmn / fhmx + 1.; at = (fhmx - fhmn) / fhmx; /* Computing 2nd power */ d__1 = ga / fhmx; au = d__1 * d__1; c__ = 2. / (sqrt(as * as + au) + sqrt(at * at + au)); *ssmin = fhmn * c__; *ssmax = fhmx / c__; } else { au = fhmx / ga; if (au == 0.) { /* Avoid possible harmful underflow if exponent range */ /* asymmetric (true SSMIN may not underflow even if */ /* AU underflows) */ *ssmin = fhmn * fhmx / ga; *ssmax = ga; } else { as = fhmn / fhmx + 1.; at = (fhmx - fhmn) / fhmx; /* Computing 2nd power */ d__1 = as * au; /* Computing 2nd power */ d__2 = at * au; c__ = 1. / (sqrt(d__1 * d__1 + 1.) + sqrt(d__2 * d__2 + 1.)); *ssmin = fhmn * c__ * au; *ssmin += *ssmin; *ssmax = ga / (c__ + c__); } } } return 0; /* End of DLAS2 */ } /* _starpu_dlas2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlascl.c000066400000000000000000000212241413463044200206110ustar00rootroot00000000000000/* dlascl.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, integer *n, doublereal *a, integer *lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, k1, k2, k3, k4; doublereal mul, cto1; logical done; doublereal ctoc; extern logical _starpu_lsame_(char *, char *); integer itype; doublereal cfrom1; extern doublereal _starpu_dlamch_(char *); doublereal cfromc; extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASCL multiplies the M by N real matrix A by the real scalar */ /* CTO/CFROM. This is done without over/underflow as long as the final */ /* result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ /* A may be full, upper triangular, lower triangular, upper Hessenberg, */ /* or banded. */ /* Arguments */ /* ========= */ /* TYPE (input) CHARACTER*1 */ /* TYPE indices the storage type of the input matrix. */ /* = 'G': A is a full matrix. */ /* = 'L': A is a lower triangular matrix. */ /* = 'U': A is an upper triangular matrix. */ /* = 'H': A is an upper Hessenberg matrix. */ /* = 'B': A is a symmetric band matrix with lower bandwidth KL */ /* and upper bandwidth KU and with the only the lower */ /* half stored. */ /* = 'Q': A is a symmetric band matrix with lower bandwidth KL */ /* and upper bandwidth KU and with the only the upper */ /* half stored. */ /* = 'Z': A is a band matrix with lower bandwidth KL and upper */ /* bandwidth KU. */ /* KL (input) INTEGER */ /* The lower bandwidth of A. Referenced only if TYPE = 'B', */ /* 'Q' or 'Z'. */ /* KU (input) INTEGER */ /* The upper bandwidth of A. Referenced only if TYPE = 'B', */ /* 'Q' or 'Z'. */ /* CFROM (input) DOUBLE PRECISION */ /* CTO (input) DOUBLE PRECISION */ /* The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ /* without over/underflow if the final result CTO*A(I,J)/CFROM */ /* can be represented without over/underflow. CFROM must be */ /* nonzero. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* The matrix to be multiplied by CTO/CFROM. See TYPE for the */ /* storage type. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* INFO (output) INTEGER */ /* 0 - successful exit */ /* <0 - if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; if (_starpu_lsame_(type__, "G")) { itype = 0; } else if (_starpu_lsame_(type__, "L")) { itype = 1; } else if (_starpu_lsame_(type__, "U")) { itype = 2; } else if (_starpu_lsame_(type__, "H")) { itype = 3; } else if (_starpu_lsame_(type__, "B")) { itype = 4; } else if (_starpu_lsame_(type__, "Q")) { itype = 5; } else if (_starpu_lsame_(type__, "Z")) { itype = 6; } else { itype = -1; } if (itype == -1) { *info = -1; } else if (*cfrom == 0. || _starpu_disnan_(cfrom)) { *info = -4; } else if (_starpu_disnan_(cto)) { *info = -5; } else if (*m < 0) { *info = -6; } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { *info = -7; } else if (itype <= 3 && *lda < max(1,*m)) { *info = -9; } else if (itype >= 4) { /* Computing MAX */ i__1 = *m - 1; if (*kl < 0 || *kl > max(i__1,0)) { *info = -2; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = *n - 1; if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && *kl != *ku) { *info = -3; } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { *info = -9; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASCL", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *m == 0) { return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; cfromc = *cfrom; ctoc = *cto; L10: cfrom1 = cfromc * smlnum; if (cfrom1 == cfromc) { /* CFROMC is an inf. Multiply by a correctly signed zero for */ /* finite CTOC, or a NaN if CTOC is infinite. */ mul = ctoc / cfromc; done = TRUE_; cto1 = ctoc; } else { cto1 = ctoc / bignum; if (cto1 == ctoc) { /* CTOC is either 0 or an inf. In both cases, CTOC itself */ /* serves as the correct multiplication factor. */ mul = ctoc; done = TRUE_; cfromc = 1.; } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { mul = smlnum; done = FALSE_; cfromc = cfrom1; } else if (abs(cto1) > abs(cfromc)) { mul = bignum; done = FALSE_; ctoc = cto1; } else { mul = ctoc / cfromc; done = TRUE_; } } if (itype == 0) { /* Full matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L20: */ } /* L30: */ } } else if (itype == 1) { /* Lower triangular matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L40: */ } /* L50: */ } } else if (itype == 2) { /* Upper triangular matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = min(j,*m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L60: */ } /* L70: */ } } else if (itype == 3) { /* Upper Hessenberg matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = j + 1; i__2 = min(i__3,*m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L80: */ } /* L90: */ } } else if (itype == 4) { /* Lower half of a symmetric band matrix */ k3 = *kl + 1; k4 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__3 = k3, i__4 = k4 - j; i__2 = min(i__3,i__4); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L100: */ } /* L110: */ } } else if (itype == 5) { /* Upper half of a symmetric band matrix */ k1 = *ku + 2; k3 = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = k1 - j; i__3 = k3; for (i__ = max(i__2,1); i__ <= i__3; ++i__) { a[i__ + j * a_dim1] *= mul; /* L120: */ } /* L130: */ } } else if (itype == 6) { /* Band matrix */ k1 = *kl + *ku + 2; k2 = *kl + 1; k3 = (*kl << 1) + *ku + 1; k4 = *kl + *ku + 1 + *m; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__3 = k1 - j; /* Computing MIN */ i__4 = k3, i__5 = k4 - j; i__2 = min(i__4,i__5); for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; /* L140: */ } /* L150: */ } } if (! done) { goto L10; } return 0; /* End of DLASCL */ } /* _starpu_dlascl_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlascl2.c000066400000000000000000000051071413463044200206750ustar00rootroot00000000000000/* dlascl2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlascl2_(integer *m, integer *n, doublereal *d__, doublereal *x, integer *ldx) { /* System generated locals */ integer x_dim1, x_offset, i__1, i__2; /* Local variables */ integer i__, j; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASCL2 performs a diagonal scaling on a vector: */ /* x <-- D * x */ /* where the diagonal matrix D is stored as a vector. */ /* Eventually to be replaced by BLAS_dge_diag_scale in the new BLAS */ /* standard. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of D and X. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of D and X. N >= 0. */ /* D (input) DOUBLE PRECISION array, length M */ /* Diagonal matrix D, stored as a vector of length M. */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,N) */ /* On entry, the vector X to be scaled by D. */ /* On exit, the scaled vector. */ /* LDX (input) INTEGER */ /* The leading dimension of the vector X. LDX >= 0. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --d__; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; /* Function Body */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] *= d__[i__]; } } return 0; } /* _starpu_dlascl2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd0.c000066400000000000000000000202301413463044200205120ustar00rootroot00000000000000/* dlasd0.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__0 = 0; static integer c__2 = 2; /* Subroutine */ int _starpu_dlasd0_(integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer * ldvt, integer *smlsiz, integer *iwork, doublereal *work, integer * info) { /* System generated locals */ integer u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; /* Builtin functions */ integer pow_ii(integer *, integer *); /* Local variables */ integer i__, j, m, i1, ic, lf, nd, ll, nl, nr, im1, ncc, nlf, nrf, iwk, lvl, ndb1, nlp1, nrp1; doublereal beta; integer idxq, nlvl; doublereal alpha; integer inode, ndiml, idxqc, ndimr, itemp, sqrei; extern /* Subroutine */ int _starpu_dlasd1_(integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), _starpu_dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlasdt_(integer *, integer *, integer *, integer *, integer *, integer *, integer *), _starpu_xerbla_( char *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Using a divide and conquer approach, DLASD0 computes the singular */ /* value decomposition (SVD) of a real upper bidiagonal N-by-M */ /* matrix B with diagonal D and offdiagonal E, where M = N + SQRE. */ /* The algorithm computes orthogonal matrices U and VT such that */ /* B = U * S * VT. The singular values S are overwritten on D. */ /* A related subroutine, DLASDA, computes only the singular values, */ /* and optionally, the singular vectors in compact form. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* On entry, the row dimension of the upper bidiagonal matrix. */ /* This is also the dimension of the main diagonal array D. */ /* SQRE (input) INTEGER */ /* Specifies the column dimension of the bidiagonal matrix. */ /* = 0: The bidiagonal matrix has column dimension M = N; */ /* = 1: The bidiagonal matrix has column dimension M = N+1; */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry D contains the main diagonal of the bidiagonal */ /* matrix. */ /* On exit D, if INFO = 0, contains its singular values. */ /* E (input) DOUBLE PRECISION array, dimension (M-1) */ /* Contains the subdiagonal entries of the bidiagonal matrix. */ /* On exit, E has been destroyed. */ /* U (output) DOUBLE PRECISION array, dimension at least (LDQ, N) */ /* On exit, U contains the left singular vectors. */ /* LDU (input) INTEGER */ /* On entry, leading dimension of U. */ /* VT (output) DOUBLE PRECISION array, dimension at least (LDVT, M) */ /* On exit, VT' contains the right singular vectors. */ /* LDVT (input) INTEGER */ /* On entry, leading dimension of VT. */ /* SMLSIZ (input) INTEGER */ /* On entry, maximum size of the subproblems at the */ /* bottom of the computation tree. */ /* IWORK (workspace) INTEGER work array. */ /* Dimension must be at least (8 * N) */ /* WORK (workspace) DOUBLE PRECISION work array. */ /* Dimension must be at least (3 * M**2 + 2 * M) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an singular value did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; --iwork; --work; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*sqre < 0 || *sqre > 1) { *info = -2; } m = *n + *sqre; if (*ldu < *n) { *info = -6; } else if (*ldvt < m) { *info = -8; } else if (*smlsiz < 3) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD0", &i__1); return 0; } /* If the input matrix is too small, call DLASDQ to find the SVD. */ if (*n <= *smlsiz) { _starpu_dlasdq_("U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[u_offset], ldu, &u[u_offset], ldu, &work[1], info); return 0; } /* Set up the computation tree. */ inode = 1; ndiml = inode + *n; ndimr = ndiml + *n; idxq = ndimr + *n; iwk = idxq + *n; _starpu_dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], smlsiz); /* For the nodes on bottom level of the tree, solve */ /* their subproblems by DLASDQ. */ ndb1 = (nd + 1) / 2; ncc = 0; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { /* IC : center row of each node */ /* NL : number of rows of left subproblem */ /* NR : number of rows of right subproblem */ /* NLF: starting row of the left subproblem */ /* NRF: starting row of the right subproblem */ i1 = i__ - 1; ic = iwork[inode + i1]; nl = iwork[ndiml + i1]; nlp1 = nl + 1; nr = iwork[ndimr + i1]; nrp1 = nr + 1; nlf = ic - nl; nrf = ic + 1; sqrei = 1; _starpu_dlasdq_("U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], &vt[ nlf + nlf * vt_dim1], ldvt, &u[nlf + nlf * u_dim1], ldu, &u[ nlf + nlf * u_dim1], ldu, &work[1], info); if (*info != 0) { return 0; } itemp = idxq + nlf - 2; i__2 = nl; for (j = 1; j <= i__2; ++j) { iwork[itemp + j] = j; /* L10: */ } if (i__ == nd) { sqrei = *sqre; } else { sqrei = 1; } nrp1 = nr + sqrei; _starpu_dlasdq_("U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], &vt[ nrf + nrf * vt_dim1], ldvt, &u[nrf + nrf * u_dim1], ldu, &u[ nrf + nrf * u_dim1], ldu, &work[1], info); if (*info != 0) { return 0; } itemp = idxq + ic; i__2 = nr; for (j = 1; j <= i__2; ++j) { iwork[itemp + j - 1] = j; /* L20: */ } /* L30: */ } /* Now conquer each subproblem bottom-up. */ for (lvl = nlvl; lvl >= 1; --lvl) { /* Find the first node LF and last node LL on the */ /* current level LVL. */ if (lvl == 1) { lf = 1; ll = 1; } else { i__1 = lvl - 1; lf = pow_ii(&c__2, &i__1); ll = (lf << 1) - 1; } i__1 = ll; for (i__ = lf; i__ <= i__1; ++i__) { im1 = i__ - 1; ic = iwork[inode + im1]; nl = iwork[ndiml + im1]; nr = iwork[ndimr + im1]; nlf = ic - nl; if (*sqre == 0 && i__ == ll) { sqrei = *sqre; } else { sqrei = 1; } idxqc = idxq + nlf - 1; alpha = d__[ic]; beta = e[ic]; _starpu_dlasd1_(&nl, &nr, &sqrei, &d__[nlf], &alpha, &beta, &u[nlf + nlf * u_dim1], ldu, &vt[nlf + nlf * vt_dim1], ldvt, &iwork[ idxqc], &iwork[iwk], &work[1], info); if (*info != 0) { return 0; } /* L40: */ } /* L50: */ } return 0; /* End of DLASD0 */ } /* _starpu_dlasd0_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd1.c000066400000000000000000000232251413463044200205220ustar00rootroot00000000000000/* dlasd1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__0 = 0; static doublereal c_b7 = 1.; static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dlasd1_(integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, integer *idxq, integer * iwork, doublereal *work, integer *info) { /* System generated locals */ integer u_dim1, u_offset, vt_dim1, vt_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer i__, k, m, n, n1, n2, iq, iz, iu2, ldq, idx, ldu2, ivt2, idxc, idxp, ldvt2; extern /* Subroutine */ int _starpu_dlasd2_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *, integer *, integer *, integer *), _starpu_dlasd3_( integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *); integer isigma; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal orgnrm; integer coltyp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASD1 computes the SVD of an upper bidiagonal N-by-M matrix B, */ /* where N = NL + NR + 1 and M = N + SQRE. DLASD1 is called from DLASD0. */ /* A related subroutine DLASD7 handles the case in which the singular */ /* values (and the singular vectors in factored form) are desired. */ /* DLASD1 computes the SVD as follows: */ /* ( D1(in) 0 0 0 ) */ /* B = U(in) * ( Z1' a Z2' b ) * VT(in) */ /* ( 0 0 D2(in) 0 ) */ /* = U(out) * ( D(out) 0) * VT(out) */ /* where Z' = (Z1' a Z2' b) = u' VT', and u is a vector of dimension M */ /* with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros */ /* elsewhere; and the entry b is empty if SQRE = 0. */ /* The left singular vectors of the original matrix are stored in U, and */ /* the transpose of the right singular vectors are stored in VT, and the */ /* singular values are in D. The algorithm consists of three stages: */ /* The first stage consists of deflating the size of the problem */ /* when there are multiple singular values or when there are zeros in */ /* the Z vector. For each such occurence the dimension of the */ /* secular equation problem is reduced by one. This stage is */ /* performed by the routine DLASD2. */ /* The second stage consists of calculating the updated */ /* singular values. This is done by finding the square roots of the */ /* roots of the secular equation via the routine DLASD4 (as called */ /* by DLASD3). This routine also calculates the singular vectors of */ /* the current problem. */ /* The final stage consists of computing the updated singular vectors */ /* directly using the updated singular values. The singular vectors */ /* for the current problem are multiplied with the singular vectors */ /* from the overall problem. */ /* Arguments */ /* ========= */ /* NL (input) INTEGER */ /* The row dimension of the upper block. NL >= 1. */ /* NR (input) INTEGER */ /* The row dimension of the lower block. NR >= 1. */ /* SQRE (input) INTEGER */ /* = 0: the lower block is an NR-by-NR square matrix. */ /* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ /* The bidiagonal matrix has row dimension N = NL + NR + 1, */ /* and column dimension M = N + SQRE. */ /* D (input/output) DOUBLE PRECISION array, */ /* dimension (N = NL+NR+1). */ /* On entry D(1:NL,1:NL) contains the singular values of the */ /* upper block; and D(NL+2:N) contains the singular values of */ /* the lower block. On exit D(1:N) contains the singular values */ /* of the modified matrix. */ /* ALPHA (input/output) DOUBLE PRECISION */ /* Contains the diagonal element associated with the added row. */ /* BETA (input/output) DOUBLE PRECISION */ /* Contains the off-diagonal element associated with the added */ /* row. */ /* U (input/output) DOUBLE PRECISION array, dimension(LDU,N) */ /* On entry U(1:NL, 1:NL) contains the left singular vectors of */ /* the upper block; U(NL+2:N, NL+2:N) contains the left singular */ /* vectors of the lower block. On exit U contains the left */ /* singular vectors of the bidiagonal matrix. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= max( 1, N ). */ /* VT (input/output) DOUBLE PRECISION array, dimension(LDVT,M) */ /* where M = N + SQRE. */ /* On entry VT(1:NL+1, 1:NL+1)' contains the right singular */ /* vectors of the upper block; VT(NL+2:M, NL+2:M)' contains */ /* the right singular vectors of the lower block. On exit */ /* VT' contains the right singular vectors of the */ /* bidiagonal matrix. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. LDVT >= max( 1, M ). */ /* IDXQ (output) INTEGER array, dimension(N) */ /* This contains the permutation which will reintegrate the */ /* subproblem just solved back into sorted order, i.e. */ /* D( IDXQ( I = 1, N ) ) will be in ascending order. */ /* IWORK (workspace) INTEGER array, dimension( 4 * N ) */ /* WORK (workspace) DOUBLE PRECISION array, dimension( 3*M**2 + 2*M ) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an singular value did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; --idxq; --iwork; --work; /* Function Body */ *info = 0; if (*nl < 1) { *info = -1; } else if (*nr < 1) { *info = -2; } else if (*sqre < 0 || *sqre > 1) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD1", &i__1); return 0; } n = *nl + *nr + 1; m = n + *sqre; /* The following values are for bookkeeping purposes only. They are */ /* integer pointers which indicate the portion of the workspace */ /* used by a particular array in DLASD2 and DLASD3. */ ldu2 = n; ldvt2 = m; iz = 1; isigma = iz + m; iu2 = isigma + n; ivt2 = iu2 + ldu2 * n; iq = ivt2 + ldvt2 * m; idx = 1; idxc = idx + n; coltyp = idxc + n; idxp = coltyp + n; /* Scale. */ /* Computing MAX */ d__1 = abs(*alpha), d__2 = abs(*beta); orgnrm = max(d__1,d__2); d__[*nl + 1] = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { orgnrm = (d__1 = d__[i__], abs(d__1)); } /* L10: */ } _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info); *alpha /= orgnrm; *beta /= orgnrm; /* Deflate singular values. */ _starpu_dlasd2_(nl, nr, sqre, &k, &d__[1], &work[iz], alpha, beta, &u[u_offset], ldu, &vt[vt_offset], ldvt, &work[isigma], &work[iu2], &ldu2, & work[ivt2], &ldvt2, &iwork[idxp], &iwork[idx], &iwork[idxc], & idxq[1], &iwork[coltyp], info); /* Solve Secular Equation and update singular vectors. */ ldq = k; _starpu_dlasd3_(nl, nr, sqre, &k, &d__[1], &work[iq], &ldq, &work[isigma], &u[ u_offset], ldu, &work[iu2], &ldu2, &vt[vt_offset], ldvt, &work[ ivt2], &ldvt2, &iwork[idxc], &iwork[coltyp], &work[iz], info); if (*info != 0) { return 0; } /* Unscale. */ _starpu_dlascl_("G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info); /* Prepare the IDXQ sorting permutation. */ n1 = k; n2 = n - k; _starpu_dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &idxq[1]); return 0; /* End of DLASD1 */ } /* _starpu_dlasd1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd2.c000066400000000000000000000445341413463044200205310ustar00rootroot00000000000000/* dlasd2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b30 = 0.; /* Subroutine */ int _starpu_dlasd2_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, doublereal *alpha, doublereal * beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *dsigma, doublereal *u2, integer *ldu2, doublereal *vt2, integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer * idxq, integer *coltyp, integer *info) { /* System generated locals */ integer u_dim1, u_offset, u2_dim1, u2_offset, vt_dim1, vt_offset, vt2_dim1, vt2_offset, i__1; doublereal d__1, d__2; /* Local variables */ doublereal c__; integer i__, j, m, n; doublereal s; integer k2; doublereal z1; integer ct, jp; doublereal eps, tau, tol; integer psm[4], nlp1, nlp2, idxi, idxj; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer ctot[4], idxjp; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer jprev; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal hlftol; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASD2 merges the two sets of singular values together into a single */ /* sorted set. Then it tries to deflate the size of the problem. */ /* There are two ways in which deflation can occur: when two or more */ /* singular values are close together or if there is a tiny entry in the */ /* Z vector. For each such occurrence the order of the related secular */ /* equation problem is reduced by one. */ /* DLASD2 is called from DLASD1. */ /* Arguments */ /* ========= */ /* NL (input) INTEGER */ /* The row dimension of the upper block. NL >= 1. */ /* NR (input) INTEGER */ /* The row dimension of the lower block. NR >= 1. */ /* SQRE (input) INTEGER */ /* = 0: the lower block is an NR-by-NR square matrix. */ /* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ /* The bidiagonal matrix has N = NL + NR + 1 rows and */ /* M = N + SQRE >= N columns. */ /* K (output) INTEGER */ /* Contains the dimension of the non-deflated matrix, */ /* This is the order of the related secular equation. 1 <= K <=N. */ /* D (input/output) DOUBLE PRECISION array, dimension(N) */ /* On entry D contains the singular values of the two submatrices */ /* to be combined. On exit D contains the trailing (N-K) updated */ /* singular values (those which were deflated) sorted into */ /* increasing order. */ /* Z (output) DOUBLE PRECISION array, dimension(N) */ /* On exit Z contains the updating row vector in the secular */ /* equation. */ /* ALPHA (input) DOUBLE PRECISION */ /* Contains the diagonal element associated with the added row. */ /* BETA (input) DOUBLE PRECISION */ /* Contains the off-diagonal element associated with the added */ /* row. */ /* U (input/output) DOUBLE PRECISION array, dimension(LDU,N) */ /* On entry U contains the left singular vectors of two */ /* submatrices in the two square blocks with corners at (1,1), */ /* (NL, NL), and (NL+2, NL+2), (N,N). */ /* On exit U contains the trailing (N-K) updated left singular */ /* vectors (those which were deflated) in its last N-K columns. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= N. */ /* VT (input/output) DOUBLE PRECISION array, dimension(LDVT,M) */ /* On entry VT' contains the right singular vectors of two */ /* submatrices in the two square blocks with corners at (1,1), */ /* (NL+1, NL+1), and (NL+2, NL+2), (M,M). */ /* On exit VT' contains the trailing (N-K) updated right singular */ /* vectors (those which were deflated) in its last N-K columns. */ /* In case SQRE =1, the last row of VT spans the right null */ /* space. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. LDVT >= M. */ /* DSIGMA (output) DOUBLE PRECISION array, dimension (N) */ /* Contains a copy of the diagonal elements (K-1 singular values */ /* and one zero) in the secular equation. */ /* U2 (output) DOUBLE PRECISION array, dimension(LDU2,N) */ /* Contains a copy of the first K-1 left singular vectors which */ /* will be used by DLASD3 in a matrix multiply (DGEMM) to solve */ /* for the new left singular vectors. U2 is arranged into four */ /* blocks. The first block contains a column with 1 at NL+1 and */ /* zero everywhere else; the second block contains non-zero */ /* entries only at and above NL; the third contains non-zero */ /* entries only below NL+1; and the fourth is dense. */ /* LDU2 (input) INTEGER */ /* The leading dimension of the array U2. LDU2 >= N. */ /* VT2 (output) DOUBLE PRECISION array, dimension(LDVT2,N) */ /* VT2' contains a copy of the first K right singular vectors */ /* which will be used by DLASD3 in a matrix multiply (DGEMM) to */ /* solve for the new right singular vectors. VT2 is arranged into */ /* three blocks. The first block contains a row that corresponds */ /* to the special 0 diagonal element in SIGMA; the second block */ /* contains non-zeros only at and before NL +1; the third block */ /* contains non-zeros only at and after NL +2. */ /* LDVT2 (input) INTEGER */ /* The leading dimension of the array VT2. LDVT2 >= M. */ /* IDXP (workspace) INTEGER array dimension(N) */ /* This will contain the permutation used to place deflated */ /* values of D at the end of the array. On output IDXP(2:K) */ /* points to the nondeflated D-values and IDXP(K+1:N) */ /* points to the deflated singular values. */ /* IDX (workspace) INTEGER array dimension(N) */ /* This will contain the permutation used to sort the contents of */ /* D into ascending order. */ /* IDXC (output) INTEGER array dimension(N) */ /* This will contain the permutation used to arrange the columns */ /* of the deflated U matrix into three groups: the first group */ /* contains non-zero entries only at and above NL, the second */ /* contains non-zero entries only below NL+2, and the third is */ /* dense. */ /* IDXQ (input/output) INTEGER array dimension(N) */ /* This contains the permutation which separately sorts the two */ /* sub-problems in D into ascending order. Note that entries in */ /* the first hlaf of this permutation must first be moved one */ /* position backward; and entries in the second half */ /* must first have NL+1 added to their values. */ /* COLTYP (workspace/output) INTEGER array dimension(N) */ /* As workspace, this will contain a label which will indicate */ /* which of the following types a column in the U2 matrix or a */ /* row in the VT2 matrix is: */ /* 1 : non-zero in the upper half only */ /* 2 : non-zero in the lower half only */ /* 3 : dense */ /* 4 : deflated */ /* On exit, it is an array of dimension 4, with COLTYP(I) being */ /* the dimension of the I-th type columns. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --z__; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; --dsigma; u2_dim1 = *ldu2; u2_offset = 1 + u2_dim1; u2 -= u2_offset; vt2_dim1 = *ldvt2; vt2_offset = 1 + vt2_dim1; vt2 -= vt2_offset; --idxp; --idx; --idxc; --idxq; --coltyp; /* Function Body */ *info = 0; if (*nl < 1) { *info = -1; } else if (*nr < 1) { *info = -2; } else if (*sqre != 1 && *sqre != 0) { *info = -3; } n = *nl + *nr + 1; m = n + *sqre; if (*ldu < n) { *info = -10; } else if (*ldvt < m) { *info = -12; } else if (*ldu2 < n) { *info = -15; } else if (*ldvt2 < m) { *info = -17; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD2", &i__1); return 0; } nlp1 = *nl + 1; nlp2 = *nl + 2; /* Generate the first part of the vector Z; and move the singular */ /* values in the first part of D one position backward. */ z1 = *alpha * vt[nlp1 + nlp1 * vt_dim1]; z__[1] = z1; for (i__ = *nl; i__ >= 1; --i__) { z__[i__ + 1] = *alpha * vt[i__ + nlp1 * vt_dim1]; d__[i__ + 1] = d__[i__]; idxq[i__ + 1] = idxq[i__] + 1; /* L10: */ } /* Generate the second part of the vector Z. */ i__1 = m; for (i__ = nlp2; i__ <= i__1; ++i__) { z__[i__] = *beta * vt[i__ + nlp2 * vt_dim1]; /* L20: */ } /* Initialize some reference arrays. */ i__1 = nlp1; for (i__ = 2; i__ <= i__1; ++i__) { coltyp[i__] = 1; /* L30: */ } i__1 = n; for (i__ = nlp2; i__ <= i__1; ++i__) { coltyp[i__] = 2; /* L40: */ } /* Sort the singular values into increasing order */ i__1 = n; for (i__ = nlp2; i__ <= i__1; ++i__) { idxq[i__] += nlp1; /* L50: */ } /* DSIGMA, IDXC, IDXC, and the first column of U2 */ /* are used as storage space. */ i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { dsigma[i__] = d__[idxq[i__]]; u2[i__ + u2_dim1] = z__[idxq[i__]]; idxc[i__] = coltyp[idxq[i__]]; /* L60: */ } _starpu_dlamrg_(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]); i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { idxi = idx[i__] + 1; d__[i__] = dsigma[idxi]; z__[i__] = u2[idxi + u2_dim1]; coltyp[i__] = idxc[idxi]; /* L70: */ } /* Calculate the allowable deflation tolerance */ eps = _starpu_dlamch_("Epsilon"); /* Computing MAX */ d__1 = abs(*alpha), d__2 = abs(*beta); tol = max(d__1,d__2); /* Computing MAX */ d__2 = (d__1 = d__[n], abs(d__1)); tol = eps * 8. * max(d__2,tol); /* There are 2 kinds of deflation -- first a value in the z-vector */ /* is small, second two (or more) singular values are very close */ /* together (their difference is small). */ /* If the value in the z-vector is small, we simply permute the */ /* array so that the corresponding singular value is moved to the */ /* end. */ /* If two values in the D-vector are close, we perform a two-sided */ /* rotation designed to make one of the corresponding z-vector */ /* entries zero, and then permute the array so that the deflated */ /* singular value is moved to the end. */ /* If there are multiple singular values then the problem deflates. */ /* Here the number of equal singular values are found. As each equal */ /* singular value is found, an elementary reflector is computed to */ /* rotate the corresponding singular subspace so that the */ /* corresponding components of Z are zero in this new basis. */ *k = 1; k2 = n + 1; i__1 = n; for (j = 2; j <= i__1; ++j) { if ((d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; idxp[k2] = j; coltyp[j] = 4; if (j == n) { goto L120; } } else { jprev = j; goto L90; } /* L80: */ } L90: j = jprev; L100: ++j; if (j > n) { goto L110; } if ((d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; idxp[k2] = j; coltyp[j] = 4; } else { /* Check if singular values are close enough to allow deflation. */ if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { /* Deflation is possible. */ s = z__[jprev]; c__ = z__[j]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ tau = _starpu_dlapy2_(&c__, &s); c__ /= tau; s = -s / tau; z__[j] = tau; z__[jprev] = 0.; /* Apply back the Givens rotation to the left and right */ /* singular vector matrices. */ idxjp = idxq[idx[jprev] + 1]; idxj = idxq[idx[j] + 1]; if (idxjp <= nlp1) { --idxjp; } if (idxj <= nlp1) { --idxj; } _starpu_drot_(&n, &u[idxjp * u_dim1 + 1], &c__1, &u[idxj * u_dim1 + 1], & c__1, &c__, &s); _starpu_drot_(&m, &vt[idxjp + vt_dim1], ldvt, &vt[idxj + vt_dim1], ldvt, & c__, &s); if (coltyp[j] != coltyp[jprev]) { coltyp[j] = 3; } coltyp[jprev] = 4; --k2; idxp[k2] = jprev; jprev = j; } else { ++(*k); u2[*k + u2_dim1] = z__[jprev]; dsigma[*k] = d__[jprev]; idxp[*k] = jprev; jprev = j; } } goto L100; L110: /* Record the last singular value. */ ++(*k); u2[*k + u2_dim1] = z__[jprev]; dsigma[*k] = d__[jprev]; idxp[*k] = jprev; L120: /* Count up the total number of the various types of columns, then */ /* form a permutation which positions the four column types into */ /* four groups of uniform structure (although one or more of these */ /* groups may be empty). */ for (j = 1; j <= 4; ++j) { ctot[j - 1] = 0; /* L130: */ } i__1 = n; for (j = 2; j <= i__1; ++j) { ct = coltyp[j]; ++ctot[ct - 1]; /* L140: */ } /* PSM(*) = Position in SubMatrix (of types 1 through 4) */ psm[0] = 2; psm[1] = ctot[0] + 2; psm[2] = psm[1] + ctot[1]; psm[3] = psm[2] + ctot[2]; /* Fill out the IDXC array so that the permutation which it induces */ /* will place all type-1 columns first, all type-2 columns next, */ /* then all type-3's, and finally all type-4's, starting from the */ /* second column. This applies similarly to the rows of VT. */ i__1 = n; for (j = 2; j <= i__1; ++j) { jp = idxp[j]; ct = coltyp[jp]; idxc[psm[ct - 1]] = j; ++psm[ct - 1]; /* L150: */ } /* Sort the singular values and corresponding singular vectors into */ /* DSIGMA, U2, and VT2 respectively. The singular values/vectors */ /* which were not deflated go into the first K slots of DSIGMA, U2, */ /* and VT2 respectively, while those which were deflated go into the */ /* last N - K slots, except that the first column/row will be treated */ /* separately. */ i__1 = n; for (j = 2; j <= i__1; ++j) { jp = idxp[j]; dsigma[j] = d__[jp]; idxj = idxq[idx[idxp[idxc[j]]] + 1]; if (idxj <= nlp1) { --idxj; } _starpu_dcopy_(&n, &u[idxj * u_dim1 + 1], &c__1, &u2[j * u2_dim1 + 1], &c__1); _starpu_dcopy_(&m, &vt[idxj + vt_dim1], ldvt, &vt2[j + vt2_dim1], ldvt2); /* L160: */ } /* Determine DSIGMA(1), DSIGMA(2) and Z(1) */ dsigma[1] = 0.; hlftol = tol / 2.; if (abs(dsigma[2]) <= hlftol) { dsigma[2] = hlftol; } if (m > n) { z__[1] = _starpu_dlapy2_(&z1, &z__[m]); if (z__[1] <= tol) { c__ = 1.; s = 0.; z__[1] = tol; } else { c__ = z1 / z__[1]; s = z__[m] / z__[1]; } } else { if (abs(z1) <= tol) { z__[1] = tol; } else { z__[1] = z1; } } /* Move the rest of the updating row to Z. */ i__1 = *k - 1; _starpu_dcopy_(&i__1, &u2[u2_dim1 + 2], &c__1, &z__[2], &c__1); /* Determine the first column of U2, the first row of VT2 and the */ /* last row of VT. */ _starpu_dlaset_("A", &n, &c__1, &c_b30, &c_b30, &u2[u2_offset], ldu2); u2[nlp1 + u2_dim1] = 1.; if (m > n) { i__1 = nlp1; for (i__ = 1; i__ <= i__1; ++i__) { vt[m + i__ * vt_dim1] = -s * vt[nlp1 + i__ * vt_dim1]; vt2[i__ * vt2_dim1 + 1] = c__ * vt[nlp1 + i__ * vt_dim1]; /* L170: */ } i__1 = m; for (i__ = nlp2; i__ <= i__1; ++i__) { vt2[i__ * vt2_dim1 + 1] = s * vt[m + i__ * vt_dim1]; vt[m + i__ * vt_dim1] = c__ * vt[m + i__ * vt_dim1]; /* L180: */ } } else { _starpu_dcopy_(&m, &vt[nlp1 + vt_dim1], ldvt, &vt2[vt2_dim1 + 1], ldvt2); } if (m > n) { _starpu_dcopy_(&m, &vt[m + vt_dim1], ldvt, &vt2[m + vt2_dim1], ldvt2); } /* The deflated singular values and their corresponding vectors go */ /* into the back of D, U, and V respectively. */ if (n > *k) { i__1 = n - *k; _starpu_dcopy_(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1); i__1 = n - *k; _starpu_dlacpy_("A", &n, &i__1, &u2[(*k + 1) * u2_dim1 + 1], ldu2, &u[(*k + 1) * u_dim1 + 1], ldu); i__1 = n - *k; _starpu_dlacpy_("A", &i__1, &m, &vt2[*k + 1 + vt2_dim1], ldvt2, &vt[*k + 1 + vt_dim1], ldvt); } /* Copy CTOT into COLTYP for referencing in DLASD3. */ for (j = 1; j <= 4; ++j) { coltyp[j] = ctot[j - 1]; /* L190: */ } return 0; /* End of DLASD2 */ } /* _starpu_dlasd2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd3.c000066400000000000000000000350621413463044200205260ustar00rootroot00000000000000/* dlasd3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b13 = 1.; static doublereal c_b26 = 0.; /* Subroutine */ int _starpu_dlasd3_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *q, integer *ldq, doublereal *dsigma, doublereal *u, integer *ldu, doublereal *u2, integer *ldu2, doublereal *vt, integer *ldvt, doublereal *vt2, integer *ldvt2, integer *idxc, integer *ctot, doublereal *z__, integer *info) { /* System generated locals */ integer q_dim1, q_offset, u_dim1, u_offset, u2_dim1, u2_offset, vt_dim1, vt_offset, vt2_dim1, vt2_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j, m, n, jc; doublereal rho; integer nlp1, nlp2, nrp1; doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer ctemp; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer ktemp; extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlasd4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASD3 finds all the square roots of the roots of the secular */ /* equation, as defined by the values in D and Z. It makes the */ /* appropriate calls to DLASD4 and then updates the singular */ /* vectors by matrix multiplication. */ /* This code makes very mild assumptions about floating point */ /* arithmetic. It will work on machines with a guard digit in */ /* add/subtract, or on those binary machines without guard digits */ /* which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2. */ /* It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* DLASD3 is called from DLASD1. */ /* Arguments */ /* ========= */ /* NL (input) INTEGER */ /* The row dimension of the upper block. NL >= 1. */ /* NR (input) INTEGER */ /* The row dimension of the lower block. NR >= 1. */ /* SQRE (input) INTEGER */ /* = 0: the lower block is an NR-by-NR square matrix. */ /* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ /* The bidiagonal matrix has N = NL + NR + 1 rows and */ /* M = N + SQRE >= N columns. */ /* K (input) INTEGER */ /* The size of the secular equation, 1 =< K = < N. */ /* D (output) DOUBLE PRECISION array, dimension(K) */ /* On exit the square roots of the roots of the secular equation, */ /* in ascending order. */ /* Q (workspace) DOUBLE PRECISION array, */ /* dimension at least (LDQ,K). */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= K. */ /* DSIGMA (input) DOUBLE PRECISION array, dimension(K) */ /* The first K elements of this array contain the old roots */ /* of the deflated updating problem. These are the poles */ /* of the secular equation. */ /* U (output) DOUBLE PRECISION array, dimension (LDU, N) */ /* The last N - K columns of this matrix contain the deflated */ /* left singular vectors. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= N. */ /* U2 (input/output) DOUBLE PRECISION array, dimension (LDU2, N) */ /* The first K columns of this matrix contain the non-deflated */ /* left singular vectors for the split problem. */ /* LDU2 (input) INTEGER */ /* The leading dimension of the array U2. LDU2 >= N. */ /* VT (output) DOUBLE PRECISION array, dimension (LDVT, M) */ /* The last M - K columns of VT' contain the deflated */ /* right singular vectors. */ /* LDVT (input) INTEGER */ /* The leading dimension of the array VT. LDVT >= N. */ /* VT2 (input/output) DOUBLE PRECISION array, dimension (LDVT2, N) */ /* The first K columns of VT2' contain the non-deflated */ /* right singular vectors for the split problem. */ /* LDVT2 (input) INTEGER */ /* The leading dimension of the array VT2. LDVT2 >= N. */ /* IDXC (input) INTEGER array, dimension ( N ) */ /* The permutation used to arrange the columns of U (and rows of */ /* VT) into three groups: the first group contains non-zero */ /* entries only at and above (or before) NL +1; the second */ /* contains non-zero entries only at and below (or after) NL+2; */ /* and the third is dense. The first column of U and the row of */ /* VT are treated separately, however. */ /* The rows of the singular vectors found by DLASD4 */ /* must be likewise permuted before the matrix multiplies can */ /* take place. */ /* CTOT (input) INTEGER array, dimension ( 4 ) */ /* A count of the total number of the various types of columns */ /* in U (or rows in VT), as described in IDXC. The fourth column */ /* type is any column which has been deflated. */ /* Z (input) DOUBLE PRECISION array, dimension (K) */ /* The first K elements of this array contain the components */ /* of the deflation-adjusted updating row vector. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an singular value did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --dsigma; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; u2_dim1 = *ldu2; u2_offset = 1 + u2_dim1; u2 -= u2_offset; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; vt2_dim1 = *ldvt2; vt2_offset = 1 + vt2_dim1; vt2 -= vt2_offset; --idxc; --ctot; --z__; /* Function Body */ *info = 0; if (*nl < 1) { *info = -1; } else if (*nr < 1) { *info = -2; } else if (*sqre != 1 && *sqre != 0) { *info = -3; } n = *nl + *nr + 1; m = n + *sqre; nlp1 = *nl + 1; nlp2 = *nl + 2; if (*k < 1 || *k > n) { *info = -4; } else if (*ldq < *k) { *info = -7; } else if (*ldu < n) { *info = -10; } else if (*ldu2 < n) { *info = -12; } else if (*ldvt < m) { *info = -14; } else if (*ldvt2 < m) { *info = -16; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD3", &i__1); return 0; } /* Quick return if possible */ if (*k == 1) { d__[1] = abs(z__[1]); _starpu_dcopy_(&m, &vt2[vt2_dim1 + 1], ldvt2, &vt[vt_dim1 + 1], ldvt); if (z__[1] > 0.) { _starpu_dcopy_(&n, &u2[u2_dim1 + 1], &c__1, &u[u_dim1 + 1], &c__1); } else { i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { u[i__ + u_dim1] = -u2[i__ + u2_dim1]; /* L10: */ } } return 0; } /* Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can */ /* be computed with high relative accuracy (barring over/underflow). */ /* This is a problem on machines without a guard digit in */ /* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ /* The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I), */ /* which on any of these machines zeros out the bottommost */ /* bit of DSIGMA(I) if it is 1; this makes the subsequent */ /* subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation */ /* occurs. On binary machines with a guard digit (almost all */ /* machines) it does not change DSIGMA(I) at all. On hexadecimal */ /* and decimal machines with a guard digit, it slightly */ /* changes the bottommost bits of DSIGMA(I). It does not account */ /* for hexadecimal or decimal machines without guard digits */ /* (we know of none). We use a subroutine call to compute */ /* 2*DSIGMA(I) to prevent optimizing compilers from eliminating */ /* this code. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { dsigma[i__] = _starpu_dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; /* L20: */ } /* Keep a copy of Z. */ _starpu_dcopy_(k, &z__[1], &c__1, &q[q_offset], &c__1); /* Normalize Z. */ rho = _starpu_dnrm2_(k, &z__[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &rho, &c_b13, k, &c__1, &z__[1], k, info); rho *= rho; /* Find the new singular values. */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dlasd4_(k, &j, &dsigma[1], &z__[1], &u[j * u_dim1 + 1], &rho, &d__[j], &vt[j * vt_dim1 + 1], info); /* If the zero finder fails, the computation is terminated. */ if (*info != 0) { return 0; } /* L30: */ } /* Compute updated Z. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { z__[i__] = u[i__ + *k * u_dim1] * vt[i__ + *k * vt_dim1]; i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { z__[i__] *= u[i__ + j * u_dim1] * vt[i__ + j * vt_dim1] / (dsigma[ i__] - dsigma[j]) / (dsigma[i__] + dsigma[j]); /* L40: */ } i__2 = *k - 1; for (j = i__; j <= i__2; ++j) { z__[i__] *= u[i__ + j * u_dim1] * vt[i__ + j * vt_dim1] / (dsigma[ i__] - dsigma[j + 1]) / (dsigma[i__] + dsigma[j + 1]); /* L50: */ } d__2 = sqrt((d__1 = z__[i__], abs(d__1))); z__[i__] = d_sign(&d__2, &q[i__ + q_dim1]); /* L60: */ } /* Compute left singular vectors of the modified diagonal matrix, */ /* and store related information for the right singular vectors. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { vt[i__ * vt_dim1 + 1] = z__[1] / u[i__ * u_dim1 + 1] / vt[i__ * vt_dim1 + 1]; u[i__ * u_dim1 + 1] = -1.; i__2 = *k; for (j = 2; j <= i__2; ++j) { vt[j + i__ * vt_dim1] = z__[j] / u[j + i__ * u_dim1] / vt[j + i__ * vt_dim1]; u[j + i__ * u_dim1] = dsigma[j] * vt[j + i__ * vt_dim1]; /* L70: */ } temp = _starpu_dnrm2_(k, &u[i__ * u_dim1 + 1], &c__1); q[i__ * q_dim1 + 1] = u[i__ * u_dim1 + 1] / temp; i__2 = *k; for (j = 2; j <= i__2; ++j) { jc = idxc[j]; q[j + i__ * q_dim1] = u[jc + i__ * u_dim1] / temp; /* L80: */ } /* L90: */ } /* Update the left singular vector matrix. */ if (*k == 2) { _starpu_dgemm_("N", "N", &n, k, k, &c_b13, &u2[u2_offset], ldu2, &q[q_offset], ldq, &c_b26, &u[u_offset], ldu); goto L100; } if (ctot[1] > 0) { _starpu_dgemm_("N", "N", nl, k, &ctot[1], &c_b13, &u2[(u2_dim1 << 1) + 1], ldu2, &q[q_dim1 + 2], ldq, &c_b26, &u[u_dim1 + 1], ldu); if (ctot[3] > 0) { ktemp = ctot[1] + 2 + ctot[2]; _starpu_dgemm_("N", "N", nl, k, &ctot[3], &c_b13, &u2[ktemp * u2_dim1 + 1] , ldu2, &q[ktemp + q_dim1], ldq, &c_b13, &u[u_dim1 + 1], ldu); } } else if (ctot[3] > 0) { ktemp = ctot[1] + 2 + ctot[2]; _starpu_dgemm_("N", "N", nl, k, &ctot[3], &c_b13, &u2[ktemp * u2_dim1 + 1], ldu2, &q[ktemp + q_dim1], ldq, &c_b26, &u[u_dim1 + 1], ldu); } else { _starpu_dlacpy_("F", nl, k, &u2[u2_offset], ldu2, &u[u_offset], ldu); } _starpu_dcopy_(k, &q[q_dim1 + 1], ldq, &u[nlp1 + u_dim1], ldu); ktemp = ctot[1] + 2; ctemp = ctot[2] + ctot[3]; _starpu_dgemm_("N", "N", nr, k, &ctemp, &c_b13, &u2[nlp2 + ktemp * u2_dim1], ldu2, &q[ktemp + q_dim1], ldq, &c_b26, &u[nlp2 + u_dim1], ldu); /* Generate the right singular vectors. */ L100: i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { temp = _starpu_dnrm2_(k, &vt[i__ * vt_dim1 + 1], &c__1); q[i__ + q_dim1] = vt[i__ * vt_dim1 + 1] / temp; i__2 = *k; for (j = 2; j <= i__2; ++j) { jc = idxc[j]; q[i__ + j * q_dim1] = vt[jc + i__ * vt_dim1] / temp; /* L110: */ } /* L120: */ } /* Update the right singular vector matrix. */ if (*k == 2) { _starpu_dgemm_("N", "N", k, &m, k, &c_b13, &q[q_offset], ldq, &vt2[vt2_offset] , ldvt2, &c_b26, &vt[vt_offset], ldvt); return 0; } ktemp = ctot[1] + 1; _starpu_dgemm_("N", "N", k, &nlp1, &ktemp, &c_b13, &q[q_dim1 + 1], ldq, &vt2[ vt2_dim1 + 1], ldvt2, &c_b26, &vt[vt_dim1 + 1], ldvt); ktemp = ctot[1] + 2 + ctot[2]; if (ktemp <= *ldvt2) { _starpu_dgemm_("N", "N", k, &nlp1, &ctot[3], &c_b13, &q[ktemp * q_dim1 + 1], ldq, &vt2[ktemp + vt2_dim1], ldvt2, &c_b13, &vt[vt_dim1 + 1], ldvt); } ktemp = ctot[1] + 1; nrp1 = *nr + *sqre; if (ktemp > 1) { i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { q[i__ + ktemp * q_dim1] = q[i__ + q_dim1]; /* L130: */ } i__1 = m; for (i__ = nlp2; i__ <= i__1; ++i__) { vt2[ktemp + i__ * vt2_dim1] = vt2[i__ * vt2_dim1 + 1]; /* L140: */ } } ctemp = ctot[2] + 1 + ctot[3]; _starpu_dgemm_("N", "N", k, &nrp1, &ctemp, &c_b13, &q[ktemp * q_dim1 + 1], ldq, & vt2[ktemp + nlp2 * vt2_dim1], ldvt2, &c_b26, &vt[nlp2 * vt_dim1 + 1], ldvt); return 0; /* End of DLASD3 */ } /* _starpu_dlasd3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd4.c000066400000000000000000000603711413463044200205300ustar00rootroot00000000000000/* dlasd4.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasd4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal * sigma, doublereal *work, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal a, b, c__; integer j; doublereal w, dd[3]; integer ii; doublereal dw, zz[3]; integer ip1; doublereal eta, phi, eps, tau, psi; integer iim1, iip1; doublereal dphi, dpsi; integer iter; doublereal temp, prew, sg2lb, sg2ub, temp1, temp2, dtiim, delsq, dtiip; integer niter; doublereal dtisq; logical swtch; doublereal dtnsq; extern /* Subroutine */ int _starpu_dlaed6_(integer *, logical *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *) , _starpu_dlasd5_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal delsq2, dtnsq1; logical swtch3; extern doublereal _starpu_dlamch_(char *); logical orgati; doublereal erretm, dtipsq, rhoinv; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine computes the square root of the I-th updated */ /* eigenvalue of a positive symmetric rank-one modification to */ /* a positive diagonal matrix whose entries are given as the squares */ /* of the corresponding entries in the array d, and that */ /* 0 <= D(i) < D(j) for i < j */ /* and that RHO > 0. This is arranged by the calling routine, and is */ /* no loss in generality. The rank-one modified system is thus */ /* diag( D ) * diag( D ) + RHO * Z * Z_transpose. */ /* where we assume the Euclidean norm of Z is 1. */ /* The method consists of approximating the rational functions in the */ /* secular equation by simpler interpolating rational functions. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The length of all arrays. */ /* I (input) INTEGER */ /* The index of the eigenvalue to be computed. 1 <= I <= N. */ /* D (input) DOUBLE PRECISION array, dimension ( N ) */ /* The original eigenvalues. It is assumed that they are in */ /* order, 0 <= D(I) < D(J) for I < J. */ /* Z (input) DOUBLE PRECISION array, dimension ( N ) */ /* The components of the updating vector. */ /* DELTA (output) DOUBLE PRECISION array, dimension ( N ) */ /* If N .ne. 1, DELTA contains (D(j) - sigma_I) in its j-th */ /* component. If N = 1, then DELTA(1) = 1. The vector DELTA */ /* contains the information necessary to construct the */ /* (singular) eigenvectors. */ /* RHO (input) DOUBLE PRECISION */ /* The scalar in the symmetric updating formula. */ /* SIGMA (output) DOUBLE PRECISION */ /* The computed sigma_I, the I-th updated eigenvalue. */ /* WORK (workspace) DOUBLE PRECISION array, dimension ( N ) */ /* If N .ne. 1, WORK contains (D(j) + sigma_I) in its j-th */ /* component. If N = 1, then WORK( 1 ) = 1. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: if INFO = 1, the updating process failed. */ /* Internal Parameters */ /* =================== */ /* Logical variable ORGATI (origin-at-i?) is used for distinguishing */ /* whether D(i) or D(i+1) is treated as the origin. */ /* ORGATI = .true. origin at i */ /* ORGATI = .false. origin at i+1 */ /* Logical variable SWTCH3 (switch-for-3-poles?) is for noting */ /* if we are working with THREE poles! */ /* MAXIT is the maximum number of iterations allowed for each */ /* eigenvalue. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ren-Cang Li, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Since this routine is called in an inner loop, we do no argument */ /* checking. */ /* Quick return for N=1 and 2. */ /* Parameter adjustments */ --work; --delta; --z__; --d__; /* Function Body */ *info = 0; if (*n == 1) { /* Presumably, I=1 upon entry */ *sigma = sqrt(d__[1] * d__[1] + *rho * z__[1] * z__[1]); delta[1] = 1.; work[1] = 1.; return 0; } if (*n == 2) { _starpu_dlasd5_(i__, &d__[1], &z__[1], &delta[1], rho, sigma, &work[1]); return 0; } /* Compute machine epsilon */ eps = _starpu_dlamch_("Epsilon"); rhoinv = 1. / *rho; /* The case I = N */ if (*i__ == *n) { /* Initialize some basic variables */ ii = *n - 1; niter = 1; /* Calculate initial guess */ temp = *rho / 2.; /* If ||Z||_2 is not one, then TEMP should be set to */ /* RHO * ||Z||_2^2 / TWO */ temp1 = temp / (d__[*n] + sqrt(d__[*n] * d__[*n] + temp)); i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[*n] + temp1; delta[j] = d__[j] - d__[*n] - temp1; /* L10: */ } psi = 0.; i__1 = *n - 2; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / (delta[j] * work[j]); /* L20: */ } c__ = rhoinv + psi; w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + z__[*n] * z__[* n] / (delta[*n] * work[*n]); if (w <= 0.) { temp1 = sqrt(d__[*n] * d__[*n] + *rho); temp = z__[*n - 1] * z__[*n - 1] / ((d__[*n - 1] + temp1) * (d__[* n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + z__[*n] * z__[*n] / *rho; /* The following TAU is to approximate */ /* SIGMA_n^2 - D( N )*D( N ) */ if (c__ <= temp) { tau = *rho; } else { delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[* n]; b = z__[*n] * z__[*n] * delsq; if (a < 0.) { tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); } else { tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } } /* It can be proved that */ /* D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU <= D(N)^2+RHO */ } else { delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; b = z__[*n] * z__[*n] * delsq; /* The following TAU is to approximate */ /* SIGMA_n^2 - D( N )*D( N ) */ if (a < 0.) { tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); } else { tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } /* It can be proved that */ /* D(N)^2 < D(N)^2+TAU < SIGMA(N)^2 < D(N)^2+RHO/2 */ } /* The following ETA is to approximate SIGMA_n - D( N ) */ eta = tau / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau)); *sigma = d__[*n] + eta; i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - eta; work[j] = d__[j] + d__[*i__] + eta; /* L30: */ } /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = ii; for (j = 1; j <= i__1; ++j) { temp = z__[j] / (delta[j] * work[j]); psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L40: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ temp = z__[*n] / (delta[*n] * work[*n]); phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; /* Test for convergence */ if (abs(w) <= eps * erretm) { goto L240; } /* Calculate the new step */ ++niter; dtnsq1 = work[*n - 1] * delta[*n - 1]; dtnsq = work[*n] * delta[*n]; c__ = w - dtnsq1 * dpsi - dtnsq * dphi; a = (dtnsq + dtnsq1) * w - dtnsq * dtnsq1 * (dpsi + dphi); b = dtnsq * dtnsq1 * w; if (c__ < 0.) { c__ = abs(c__); } if (c__ == 0.) { eta = *rho - *sigma * *sigma; } else if (a >= 0.) { eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) ); } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta > 0.) { eta = -w / (dpsi + dphi); } temp = eta - dtnsq; if (temp > *rho) { eta = *rho + dtnsq; } tau += eta; eta /= *sigma + sqrt(eta + *sigma * *sigma); i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; work[j] += eta; /* L50: */ } *sigma += eta; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = ii; for (j = 1; j <= i__1; ++j) { temp = z__[j] / (work[j] * delta[j]); psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L60: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ temp = z__[*n] / (work[*n] * delta[*n]); phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; /* Main loop to update the values of the array DELTA */ iter = niter + 1; for (niter = iter; niter <= 20; ++niter) { /* Test for convergence */ if (abs(w) <= eps * erretm) { goto L240; } /* Calculate the new step */ dtnsq1 = work[*n - 1] * delta[*n - 1]; dtnsq = work[*n] * delta[*n]; c__ = w - dtnsq1 * dpsi - dtnsq * dphi; a = (dtnsq + dtnsq1) * w - dtnsq1 * dtnsq * (dpsi + dphi); b = dtnsq1 * dtnsq * w; if (a >= 0.) { eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } else { eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( d__1)))); } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta > 0.) { eta = -w / (dpsi + dphi); } temp = eta - dtnsq; if (temp <= 0.) { eta /= 2.; } tau += eta; eta /= *sigma + sqrt(eta + *sigma * *sigma); i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; work[j] += eta; /* L70: */ } *sigma += eta; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = ii; for (j = 1; j <= i__1; ++j) { temp = z__[j] / (work[j] * delta[j]); psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L80: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ temp = z__[*n] / (work[*n] * delta[*n]); phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * ( dpsi + dphi); w = rhoinv + phi + psi; /* L90: */ } /* Return with INFO = 1, NITER = MAXIT and not converged */ *info = 1; goto L240; /* End for the case I = N */ } else { /* The case for I < N */ niter = 1; ip1 = *i__ + 1; /* Calculate initial guess */ delsq = (d__[ip1] - d__[*i__]) * (d__[ip1] + d__[*i__]); delsq2 = delsq / 2.; temp = delsq2 / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + delsq2)); i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[*i__] + temp; delta[j] = d__[j] - d__[*i__] - temp; /* L100: */ } psi = 0.; i__1 = *i__ - 1; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / (work[j] * delta[j]); /* L110: */ } phi = 0.; i__1 = *i__ + 2; for (j = *n; j >= i__1; --j) { phi += z__[j] * z__[j] / (work[j] * delta[j]); /* L120: */ } c__ = rhoinv + psi + phi; w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + z__[ ip1] * z__[ip1] / (work[ip1] * delta[ip1]); if (w > 0.) { /* d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 */ /* We choose d(i) as origin. */ orgati = TRUE_; sg2lb = 0.; sg2ub = delsq2; a = c__ * delsq + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; b = z__[*i__] * z__[*i__] * delsq; if (a > 0.) { tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( d__1)))); } else { tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } /* TAU now is an estimation of SIGMA^2 - D( I )^2. The */ /* following, however, is the corresponding estimation of */ /* SIGMA - D( I ). */ eta = tau / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + tau)); } else { /* (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 */ /* We choose d(i+1) as origin. */ orgati = FALSE_; sg2lb = -delsq2; sg2ub = 0.; a = c__ * delsq - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; b = z__[ip1] * z__[ip1] * delsq; if (a < 0.) { tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( d__1)))); } else { tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / (c__ * 2.); } /* TAU now is an estimation of SIGMA^2 - D( IP1 )^2. The */ /* following, however, is the corresponding estimation of */ /* SIGMA - D( IP1 ). */ eta = tau / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau, abs(d__1)))); } if (orgati) { ii = *i__; *sigma = d__[*i__] + eta; i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[*i__] + eta; delta[j] = d__[j] - d__[*i__] - eta; /* L130: */ } } else { ii = *i__ + 1; *sigma = d__[ip1] + eta; i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[ip1] + eta; delta[j] = d__[j] - d__[ip1] - eta; /* L140: */ } } iim1 = ii - 1; iip1 = ii + 1; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = iim1; for (j = 1; j <= i__1; ++j) { temp = z__[j] / (work[j] * delta[j]); psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L150: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ dphi = 0.; phi = 0.; i__1 = iip1; for (j = *n; j >= i__1; --j) { temp = z__[j] / (work[j] * delta[j]); phi += z__[j] * temp; dphi += temp * temp; erretm += phi; /* L160: */ } w = rhoinv + phi + psi; /* W is the value of the secular function with */ /* its ii-th element removed. */ swtch3 = FALSE_; if (orgati) { if (w < 0.) { swtch3 = TRUE_; } } else { if (w > 0.) { swtch3 = TRUE_; } } if (ii == 1 || ii == *n) { swtch3 = FALSE_; } temp = z__[ii] / (work[ii] * delta[ii]); dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w += temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; /* Test for convergence */ if (abs(w) <= eps * erretm) { goto L240; } if (w <= 0.) { sg2lb = max(sg2lb,tau); } else { sg2ub = min(sg2ub,tau); } /* Calculate the new step */ ++niter; if (! swtch3) { dtipsq = work[ip1] * delta[ip1]; dtisq = work[*i__] * delta[*i__]; if (orgati) { /* Computing 2nd power */ d__1 = z__[*i__] / dtisq; c__ = w - dtipsq * dw + delsq * (d__1 * d__1); } else { /* Computing 2nd power */ d__1 = z__[ip1] / dtipsq; c__ = w - dtisq * dw - delsq * (d__1 * d__1); } a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; b = dtipsq * dtisq * w; if (c__ == 0.) { if (a == 0.) { if (orgati) { a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + dphi); } else { a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + dphi); } } eta = b / a; } else if (a <= 0.) { eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( c__ * 2.); } else { eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( d__1)))); } } else { /* Interpolation using THREE most relevant poles */ dtiim = work[iim1] * delta[iim1]; dtiip = work[iip1] * delta[iip1]; temp = rhoinv + psi + phi; if (orgati) { temp1 = z__[iim1] / dtiim; temp1 *= temp1; c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[iip1]) * temp1; zz[0] = z__[iim1] * z__[iim1]; if (dpsi < temp1) { zz[2] = dtiip * dtiip * dphi; } else { zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); } } else { temp1 = z__[iip1] / dtiip; temp1 *= temp1; c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[iip1]) * temp1; if (dphi < temp1) { zz[0] = dtiim * dtiim * dpsi; } else { zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); } zz[2] = z__[iip1] * z__[iip1]; } zz[1] = z__[ii] * z__[ii]; dd[0] = dtiim; dd[1] = delta[ii] * work[ii]; dd[2] = dtiip; _starpu_dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); if (*info != 0) { goto L240; } } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta >= 0.) { eta = -w / dw; } if (orgati) { temp1 = work[*i__] * delta[*i__]; temp = eta - temp1; } else { temp1 = work[ip1] * delta[ip1]; temp = eta - temp1; } if (temp > sg2ub || temp < sg2lb) { if (w < 0.) { eta = (sg2ub - tau) / 2.; } else { eta = (sg2lb - tau) / 2.; } } tau += eta; eta /= *sigma + sqrt(*sigma * *sigma + eta); prew = w; *sigma += eta; i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] += eta; delta[j] -= eta; /* L170: */ } /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = iim1; for (j = 1; j <= i__1; ++j) { temp = z__[j] / (work[j] * delta[j]); psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L180: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ dphi = 0.; phi = 0.; i__1 = iip1; for (j = *n; j >= i__1; --j) { temp = z__[j] / (work[j] * delta[j]); phi += z__[j] * temp; dphi += temp * temp; erretm += phi; /* L190: */ } temp = z__[ii] / (work[ii] * delta[ii]); dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; if (w <= 0.) { sg2lb = max(sg2lb,tau); } else { sg2ub = min(sg2ub,tau); } swtch = FALSE_; if (orgati) { if (-w > abs(prew) / 10.) { swtch = TRUE_; } } else { if (w > abs(prew) / 10.) { swtch = TRUE_; } } /* Main loop to update the values of the array DELTA and WORK */ iter = niter + 1; for (niter = iter; niter <= 20; ++niter) { /* Test for convergence */ if (abs(w) <= eps * erretm) { goto L240; } /* Calculate the new step */ if (! swtch3) { dtipsq = work[ip1] * delta[ip1]; dtisq = work[*i__] * delta[*i__]; if (! swtch) { if (orgati) { /* Computing 2nd power */ d__1 = z__[*i__] / dtisq; c__ = w - dtipsq * dw + delsq * (d__1 * d__1); } else { /* Computing 2nd power */ d__1 = z__[ip1] / dtipsq; c__ = w - dtisq * dw - delsq * (d__1 * d__1); } } else { temp = z__[ii] / (work[ii] * delta[ii]); if (orgati) { dpsi += temp * temp; } else { dphi += temp * temp; } c__ = w - dtisq * dpsi - dtipsq * dphi; } a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; b = dtipsq * dtisq * w; if (c__ == 0.) { if (a == 0.) { if (! swtch) { if (orgati) { a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + dphi); } else { a = z__[ip1] * z__[ip1] + dtisq * dtisq * ( dpsi + dphi); } } else { a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi; } } eta = b / a; } else if (a <= 0.) { eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } else { /* Interpolation using THREE most relevant poles */ dtiim = work[iim1] * delta[iim1]; dtiip = work[iip1] * delta[iip1]; temp = rhoinv + psi + phi; if (swtch) { c__ = temp - dtiim * dpsi - dtiip * dphi; zz[0] = dtiim * dtiim * dpsi; zz[2] = dtiip * dtiip * dphi; } else { if (orgati) { temp1 = z__[iim1] / dtiim; temp1 *= temp1; temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[ iip1]) * temp1; c__ = temp - dtiip * (dpsi + dphi) - temp2; zz[0] = z__[iim1] * z__[iim1]; if (dpsi < temp1) { zz[2] = dtiip * dtiip * dphi; } else { zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); } } else { temp1 = z__[iip1] / dtiip; temp1 *= temp1; temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[ iip1]) * temp1; c__ = temp - dtiim * (dpsi + dphi) - temp2; if (dphi < temp1) { zz[0] = dtiim * dtiim * dpsi; } else { zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); } zz[2] = z__[iip1] * z__[iip1]; } } dd[0] = dtiim; dd[1] = delta[ii] * work[ii]; dd[2] = dtiip; _starpu_dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); if (*info != 0) { goto L240; } } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ /* if for some reason caused by roundoff, eta*w > 0, */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ if (w * eta >= 0.) { eta = -w / dw; } if (orgati) { temp1 = work[*i__] * delta[*i__]; temp = eta - temp1; } else { temp1 = work[ip1] * delta[ip1]; temp = eta - temp1; } if (temp > sg2ub || temp < sg2lb) { if (w < 0.) { eta = (sg2ub - tau) / 2.; } else { eta = (sg2lb - tau) / 2.; } } tau += eta; eta /= *sigma + sqrt(*sigma * *sigma + eta); *sigma += eta; i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] += eta; delta[j] -= eta; /* L200: */ } prew = w; /* Evaluate PSI and the derivative DPSI */ dpsi = 0.; psi = 0.; erretm = 0.; i__1 = iim1; for (j = 1; j <= i__1; ++j) { temp = z__[j] / (work[j] * delta[j]); psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; /* L210: */ } erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ dphi = 0.; phi = 0.; i__1 = iip1; for (j = *n; j >= i__1; --j) { temp = z__[j] / (work[j] * delta[j]); phi += z__[j] * temp; dphi += temp * temp; erretm += phi; /* L220: */ } temp = z__[ii] / (work[ii] * delta[ii]); dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; if (w * prew > 0. && abs(w) > abs(prew) / 10.) { swtch = ! swtch; } if (w <= 0.) { sg2lb = max(sg2lb,tau); } else { sg2ub = min(sg2ub,tau); } /* L230: */ } /* Return with INFO = 1, NITER = MAXIT and not converged */ *info = 1; } L240: return 0; /* End of DLASD4 */ } /* _starpu_dlasd4_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd5.c000066400000000000000000000130251413463044200205230ustar00rootroot00000000000000/* dlasd5.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasd5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * work) { /* System generated locals */ doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal b, c__, w, del, tau, delsq; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine computes the square root of the I-th eigenvalue */ /* of a positive symmetric rank-one modification of a 2-by-2 diagonal */ /* matrix */ /* diag( D ) * diag( D ) + RHO * Z * transpose(Z) . */ /* The diagonal entries in the array D are assumed to satisfy */ /* 0 <= D(i) < D(j) for i < j . */ /* We also assume RHO > 0 and that the Euclidean norm of the vector */ /* Z is one. */ /* Arguments */ /* ========= */ /* I (input) INTEGER */ /* The index of the eigenvalue to be computed. I = 1 or I = 2. */ /* D (input) DOUBLE PRECISION array, dimension ( 2 ) */ /* The original eigenvalues. We assume 0 <= D(1) < D(2). */ /* Z (input) DOUBLE PRECISION array, dimension ( 2 ) */ /* The components of the updating vector. */ /* DELTA (output) DOUBLE PRECISION array, dimension ( 2 ) */ /* Contains (D(j) - sigma_I) in its j-th component. */ /* The vector DELTA contains the information necessary */ /* to construct the eigenvectors. */ /* RHO (input) DOUBLE PRECISION */ /* The scalar in the symmetric updating formula. */ /* DSIGMA (output) DOUBLE PRECISION */ /* The computed sigma_I, the I-th updated eigenvalue. */ /* WORK (workspace) DOUBLE PRECISION array, dimension ( 2 ) */ /* WORK contains (D(j) + sigma_I) in its j-th component. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ren-Cang Li, Computer Science Division, University of California */ /* at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --work; --delta; --z__; --d__; /* Function Body */ del = d__[2] - d__[1]; delsq = del * (d__[2] + d__[1]); if (*i__ == 1) { w = *rho * 4. * (z__[2] * z__[2] / (d__[1] + d__[2] * 3.) - z__[1] * z__[1] / (d__[1] * 3. + d__[2])) / del + 1.; if (w > 0.) { b = delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[1] * z__[1] * delsq; /* B > ZERO, always */ /* The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 ) */ tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); /* The following TAU is DSIGMA - D( 1 ) */ tau /= d__[1] + sqrt(d__[1] * d__[1] + tau); *dsigma = d__[1] + tau; delta[1] = -tau; delta[2] = del - tau; work[1] = d__[1] * 2. + tau; work[2] = d__[1] + tau + d__[2]; /* DELTA( 1 ) = -Z( 1 ) / TAU */ /* DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) */ } else { b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * delsq; /* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ if (b > 0.) { tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); } else { tau = (b - sqrt(b * b + c__ * 4.)) / 2.; } /* The following TAU is DSIGMA - D( 2 ) */ tau /= d__[2] + sqrt((d__1 = d__[2] * d__[2] + tau, abs(d__1))); *dsigma = d__[2] + tau; delta[1] = -(del + tau); delta[2] = -tau; work[1] = d__[1] + tau + d__[2]; work[2] = d__[2] * 2. + tau; /* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ /* DELTA( 2 ) = -Z( 2 ) / TAU */ } /* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ /* DELTA( 1 ) = DELTA( 1 ) / TEMP */ /* DELTA( 2 ) = DELTA( 2 ) / TEMP */ } else { /* Now I=2 */ b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * delsq; /* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ if (b > 0.) { tau = (b + sqrt(b * b + c__ * 4.)) / 2.; } else { tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); } /* The following TAU is DSIGMA - D( 2 ) */ tau /= d__[2] + sqrt(d__[2] * d__[2] + tau); *dsigma = d__[2] + tau; delta[1] = -(del + tau); delta[2] = -tau; work[1] = d__[1] + tau + d__[2]; work[2] = d__[2] * 2. + tau; /* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ /* DELTA( 2 ) = -Z( 2 ) / TAU */ /* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ /* DELTA( 1 ) = DELTA( 1 ) / TEMP */ /* DELTA( 2 ) = DELTA( 2 ) / TEMP */ } return 0; /* End of DLASD5 */ } /* _starpu_dlasd5_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd6.c000066400000000000000000000327051413463044200205320ustar00rootroot00000000000000/* dlasd6.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__0 = 0; static doublereal c_b7 = 1.; static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dlasd6_(integer *icompq, integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer i__, m, n, n1, n2, iw, idx, idxc, idxp, ivfw, ivlw; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlasd7_(integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlasd8_( integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *); integer isigma; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal orgnrm; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASD6 computes the SVD of an updated upper bidiagonal matrix B */ /* obtained by merging two smaller ones by appending a row. This */ /* routine is used only for the problem which requires all singular */ /* values and optionally singular vector matrices in factored form. */ /* B is an N-by-M matrix with N = NL + NR + 1 and M = N + SQRE. */ /* A related subroutine, DLASD1, handles the case in which all singular */ /* values and singular vectors of the bidiagonal matrix are desired. */ /* DLASD6 computes the SVD as follows: */ /* ( D1(in) 0 0 0 ) */ /* B = U(in) * ( Z1' a Z2' b ) * VT(in) */ /* ( 0 0 D2(in) 0 ) */ /* = U(out) * ( D(out) 0) * VT(out) */ /* where Z' = (Z1' a Z2' b) = u' VT', and u is a vector of dimension M */ /* with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros */ /* elsewhere; and the entry b is empty if SQRE = 0. */ /* The singular values of B can be computed using D1, D2, the first */ /* components of all the right singular vectors of the lower block, and */ /* the last components of all the right singular vectors of the upper */ /* block. These components are stored and updated in VF and VL, */ /* respectively, in DLASD6. Hence U and VT are not explicitly */ /* referenced. */ /* The singular values are stored in D. The algorithm consists of two */ /* stages: */ /* The first stage consists of deflating the size of the problem */ /* when there are multiple singular values or if there is a zero */ /* in the Z vector. For each such occurence the dimension of the */ /* secular equation problem is reduced by one. This stage is */ /* performed by the routine DLASD7. */ /* The second stage consists of calculating the updated */ /* singular values. This is done by finding the roots of the */ /* secular equation via the routine DLASD4 (as called by DLASD8). */ /* This routine also updates VF and VL and computes the distances */ /* between the updated singular values and the old singular */ /* values. */ /* DLASD6 is called from DLASDA. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* Specifies whether singular vectors are to be computed in */ /* factored form: */ /* = 0: Compute singular values only. */ /* = 1: Compute singular vectors in factored form as well. */ /* NL (input) INTEGER */ /* The row dimension of the upper block. NL >= 1. */ /* NR (input) INTEGER */ /* The row dimension of the lower block. NR >= 1. */ /* SQRE (input) INTEGER */ /* = 0: the lower block is an NR-by-NR square matrix. */ /* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ /* The bidiagonal matrix has row dimension N = NL + NR + 1, */ /* and column dimension M = N + SQRE. */ /* D (input/output) DOUBLE PRECISION array, dimension ( NL+NR+1 ). */ /* On entry D(1:NL,1:NL) contains the singular values of the */ /* upper block, and D(NL+2:N) contains the singular values */ /* of the lower block. On exit D(1:N) contains the singular */ /* values of the modified matrix. */ /* VF (input/output) DOUBLE PRECISION array, dimension ( M ) */ /* On entry, VF(1:NL+1) contains the first components of all */ /* right singular vectors of the upper block; and VF(NL+2:M) */ /* contains the first components of all right singular vectors */ /* of the lower block. On exit, VF contains the first components */ /* of all right singular vectors of the bidiagonal matrix. */ /* VL (input/output) DOUBLE PRECISION array, dimension ( M ) */ /* On entry, VL(1:NL+1) contains the last components of all */ /* right singular vectors of the upper block; and VL(NL+2:M) */ /* contains the last components of all right singular vectors of */ /* the lower block. On exit, VL contains the last components of */ /* all right singular vectors of the bidiagonal matrix. */ /* ALPHA (input/output) DOUBLE PRECISION */ /* Contains the diagonal element associated with the added row. */ /* BETA (input/output) DOUBLE PRECISION */ /* Contains the off-diagonal element associated with the added */ /* row. */ /* IDXQ (output) INTEGER array, dimension ( N ) */ /* This contains the permutation which will reintegrate the */ /* subproblem just solved back into sorted order, i.e. */ /* D( IDXQ( I = 1, N ) ) will be in ascending order. */ /* PERM (output) INTEGER array, dimension ( N ) */ /* The permutations (from deflation and sorting) to be applied */ /* to each block. Not referenced if ICOMPQ = 0. */ /* GIVPTR (output) INTEGER */ /* The number of Givens rotations which took place in this */ /* subproblem. Not referenced if ICOMPQ = 0. */ /* GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 ) */ /* Each pair of numbers indicates a pair of columns to take place */ /* in a Givens rotation. Not referenced if ICOMPQ = 0. */ /* LDGCOL (input) INTEGER */ /* leading dimension of GIVCOL, must be at least N. */ /* GIVNUM (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ /* Each number indicates the C or S value to be used in the */ /* corresponding Givens rotation. Not referenced if ICOMPQ = 0. */ /* LDGNUM (input) INTEGER */ /* The leading dimension of GIVNUM and POLES, must be at least N. */ /* POLES (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ /* On exit, POLES(1,*) is an array containing the new singular */ /* values obtained from solving the secular equation, and */ /* POLES(2,*) is an array containing the poles in the secular */ /* equation. Not referenced if ICOMPQ = 0. */ /* DIFL (output) DOUBLE PRECISION array, dimension ( N ) */ /* On exit, DIFL(I) is the distance between I-th updated */ /* (undeflated) singular value and the I-th (undeflated) old */ /* singular value. */ /* DIFR (output) DOUBLE PRECISION array, */ /* dimension ( LDGNUM, 2 ) if ICOMPQ = 1 and */ /* dimension ( N ) if ICOMPQ = 0. */ /* On exit, DIFR(I, 1) is the distance between I-th updated */ /* (undeflated) singular value and the I+1-th (undeflated) old */ /* singular value. */ /* If ICOMPQ = 1, DIFR(1:K,2) is an array containing the */ /* normalizing factors for the right singular vector matrix. */ /* See DLASD8 for details on DIFL and DIFR. */ /* Z (output) DOUBLE PRECISION array, dimension ( M ) */ /* The first elements of this array contain the components */ /* of the deflation-adjusted updating row vector. */ /* K (output) INTEGER */ /* Contains the dimension of the non-deflated matrix, */ /* This is the order of the related secular equation. 1 <= K <=N. */ /* C (output) DOUBLE PRECISION */ /* C contains garbage if SQRE =0 and the C-value of a Givens */ /* rotation related to the right null space if SQRE = 1. */ /* S (output) DOUBLE PRECISION */ /* S contains garbage if SQRE =0 and the S-value of a Givens */ /* rotation related to the right null space if SQRE = 1. */ /* WORK (workspace) DOUBLE PRECISION array, dimension ( 4 * M ) */ /* IWORK (workspace) INTEGER array, dimension ( 3 * N ) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an singular value did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --vf; --vl; --idxq; --perm; givcol_dim1 = *ldgcol; givcol_offset = 1 + givcol_dim1; givcol -= givcol_offset; poles_dim1 = *ldgnum; poles_offset = 1 + poles_dim1; poles -= poles_offset; givnum_dim1 = *ldgnum; givnum_offset = 1 + givnum_dim1; givnum -= givnum_offset; --difl; --difr; --z__; --work; --iwork; /* Function Body */ *info = 0; n = *nl + *nr + 1; m = n + *sqre; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*nl < 1) { *info = -2; } else if (*nr < 1) { *info = -3; } else if (*sqre < 0 || *sqre > 1) { *info = -4; } else if (*ldgcol < n) { *info = -14; } else if (*ldgnum < n) { *info = -16; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD6", &i__1); return 0; } /* The following values are for bookkeeping purposes only. They are */ /* integer pointers which indicate the portion of the workspace */ /* used by a particular array in DLASD7 and DLASD8. */ isigma = 1; iw = isigma + n; ivfw = iw + m; ivlw = ivfw + m; idx = 1; idxc = idx + n; idxp = idxc + n; /* Scale. */ /* Computing MAX */ d__1 = abs(*alpha), d__2 = abs(*beta); orgnrm = max(d__1,d__2); d__[*nl + 1] = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { orgnrm = (d__1 = d__[i__], abs(d__1)); } /* L10: */ } _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info); *alpha /= orgnrm; *beta /= orgnrm; /* Sort and Deflate singular values. */ _starpu_dlasd7_(icompq, nl, nr, sqre, k, &d__[1], &z__[1], &work[iw], &vf[1], & work[ivfw], &vl[1], &work[ivlw], alpha, beta, &work[isigma], & iwork[idx], &iwork[idxp], &idxq[1], &perm[1], givptr, &givcol[ givcol_offset], ldgcol, &givnum[givnum_offset], ldgnum, c__, s, info); /* Solve Secular Equation, compute DIFL, DIFR, and update VF, VL. */ _starpu_dlasd8_(icompq, k, &d__[1], &z__[1], &vf[1], &vl[1], &difl[1], &difr[1], ldgnum, &work[isigma], &work[iw], info); /* Save the poles if ICOMPQ = 1. */ if (*icompq == 1) { _starpu_dcopy_(k, &d__[1], &c__1, &poles[poles_dim1 + 1], &c__1); _starpu_dcopy_(k, &work[isigma], &c__1, &poles[(poles_dim1 << 1) + 1], &c__1); } /* Unscale. */ _starpu_dlascl_("G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info); /* Prepare the IDXQ sorting permutation. */ n1 = *k; n2 = n - *k; _starpu_dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &idxq[1]); return 0; /* End of DLASD6 */ } /* _starpu_dlasd6_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd7.c000066400000000000000000000362241413463044200205330ustar00rootroot00000000000000/* dlasd7.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlasd7_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *c__, doublereal *s, integer *info) { /* System generated locals */ integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer i__, j, m, n, k2; doublereal z1; integer jp; doublereal eps, tau, tol; integer nlp1, nlp2, idxi, idxj; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer idxjp; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer jprev; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); doublereal hlftol; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASD7 merges the two sets of singular values together into a single */ /* sorted set. Then it tries to deflate the size of the problem. There */ /* are two ways in which deflation can occur: when two or more singular */ /* values are close together or if there is a tiny entry in the Z */ /* vector. For each such occurrence the order of the related */ /* secular equation problem is reduced by one. */ /* DLASD7 is called from DLASD6. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* Specifies whether singular vectors are to be computed */ /* in compact form, as follows: */ /* = 0: Compute singular values only. */ /* = 1: Compute singular vectors of upper */ /* bidiagonal matrix in compact form. */ /* NL (input) INTEGER */ /* The row dimension of the upper block. NL >= 1. */ /* NR (input) INTEGER */ /* The row dimension of the lower block. NR >= 1. */ /* SQRE (input) INTEGER */ /* = 0: the lower block is an NR-by-NR square matrix. */ /* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ /* The bidiagonal matrix has */ /* N = NL + NR + 1 rows and */ /* M = N + SQRE >= N columns. */ /* K (output) INTEGER */ /* Contains the dimension of the non-deflated matrix, this is */ /* the order of the related secular equation. 1 <= K <=N. */ /* D (input/output) DOUBLE PRECISION array, dimension ( N ) */ /* On entry D contains the singular values of the two submatrices */ /* to be combined. On exit D contains the trailing (N-K) updated */ /* singular values (those which were deflated) sorted into */ /* increasing order. */ /* Z (output) DOUBLE PRECISION array, dimension ( M ) */ /* On exit Z contains the updating row vector in the secular */ /* equation. */ /* ZW (workspace) DOUBLE PRECISION array, dimension ( M ) */ /* Workspace for Z. */ /* VF (input/output) DOUBLE PRECISION array, dimension ( M ) */ /* On entry, VF(1:NL+1) contains the first components of all */ /* right singular vectors of the upper block; and VF(NL+2:M) */ /* contains the first components of all right singular vectors */ /* of the lower block. On exit, VF contains the first components */ /* of all right singular vectors of the bidiagonal matrix. */ /* VFW (workspace) DOUBLE PRECISION array, dimension ( M ) */ /* Workspace for VF. */ /* VL (input/output) DOUBLE PRECISION array, dimension ( M ) */ /* On entry, VL(1:NL+1) contains the last components of all */ /* right singular vectors of the upper block; and VL(NL+2:M) */ /* contains the last components of all right singular vectors */ /* of the lower block. On exit, VL contains the last components */ /* of all right singular vectors of the bidiagonal matrix. */ /* VLW (workspace) DOUBLE PRECISION array, dimension ( M ) */ /* Workspace for VL. */ /* ALPHA (input) DOUBLE PRECISION */ /* Contains the diagonal element associated with the added row. */ /* BETA (input) DOUBLE PRECISION */ /* Contains the off-diagonal element associated with the added */ /* row. */ /* DSIGMA (output) DOUBLE PRECISION array, dimension ( N ) */ /* Contains a copy of the diagonal elements (K-1 singular values */ /* and one zero) in the secular equation. */ /* IDX (workspace) INTEGER array, dimension ( N ) */ /* This will contain the permutation used to sort the contents of */ /* D into ascending order. */ /* IDXP (workspace) INTEGER array, dimension ( N ) */ /* This will contain the permutation used to place deflated */ /* values of D at the end of the array. On output IDXP(2:K) */ /* points to the nondeflated D-values and IDXP(K+1:N) */ /* points to the deflated singular values. */ /* IDXQ (input) INTEGER array, dimension ( N ) */ /* This contains the permutation which separately sorts the two */ /* sub-problems in D into ascending order. Note that entries in */ /* the first half of this permutation must first be moved one */ /* position backward; and entries in the second half */ /* must first have NL+1 added to their values. */ /* PERM (output) INTEGER array, dimension ( N ) */ /* The permutations (from deflation and sorting) to be applied */ /* to each singular block. Not referenced if ICOMPQ = 0. */ /* GIVPTR (output) INTEGER */ /* The number of Givens rotations which took place in this */ /* subproblem. Not referenced if ICOMPQ = 0. */ /* GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 ) */ /* Each pair of numbers indicates a pair of columns to take place */ /* in a Givens rotation. Not referenced if ICOMPQ = 0. */ /* LDGCOL (input) INTEGER */ /* The leading dimension of GIVCOL, must be at least N. */ /* GIVNUM (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ /* Each number indicates the C or S value to be used in the */ /* corresponding Givens rotation. Not referenced if ICOMPQ = 0. */ /* LDGNUM (input) INTEGER */ /* The leading dimension of GIVNUM, must be at least N. */ /* C (output) DOUBLE PRECISION */ /* C contains garbage if SQRE =0 and the C-value of a Givens */ /* rotation related to the right null space if SQRE = 1. */ /* S (output) DOUBLE PRECISION */ /* S contains garbage if SQRE =0 and the S-value of a Givens */ /* rotation related to the right null space if SQRE = 1. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --z__; --zw; --vf; --vfw; --vl; --vlw; --dsigma; --idx; --idxp; --idxq; --perm; givcol_dim1 = *ldgcol; givcol_offset = 1 + givcol_dim1; givcol -= givcol_offset; givnum_dim1 = *ldgnum; givnum_offset = 1 + givnum_dim1; givnum -= givnum_offset; /* Function Body */ *info = 0; n = *nl + *nr + 1; m = n + *sqre; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*nl < 1) { *info = -2; } else if (*nr < 1) { *info = -3; } else if (*sqre < 0 || *sqre > 1) { *info = -4; } else if (*ldgcol < n) { *info = -22; } else if (*ldgnum < n) { *info = -24; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD7", &i__1); return 0; } nlp1 = *nl + 1; nlp2 = *nl + 2; if (*icompq == 1) { *givptr = 0; } /* Generate the first part of the vector Z and move the singular */ /* values in the first part of D one position backward. */ z1 = *alpha * vl[nlp1]; vl[nlp1] = 0.; tau = vf[nlp1]; for (i__ = *nl; i__ >= 1; --i__) { z__[i__ + 1] = *alpha * vl[i__]; vl[i__] = 0.; vf[i__ + 1] = vf[i__]; d__[i__ + 1] = d__[i__]; idxq[i__ + 1] = idxq[i__] + 1; /* L10: */ } vf[1] = tau; /* Generate the second part of the vector Z. */ i__1 = m; for (i__ = nlp2; i__ <= i__1; ++i__) { z__[i__] = *beta * vf[i__]; vf[i__] = 0.; /* L20: */ } /* Sort the singular values into increasing order */ i__1 = n; for (i__ = nlp2; i__ <= i__1; ++i__) { idxq[i__] += nlp1; /* L30: */ } /* DSIGMA, IDXC, IDXC, and ZW are used as storage space. */ i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { dsigma[i__] = d__[idxq[i__]]; zw[i__] = z__[idxq[i__]]; vfw[i__] = vf[idxq[i__]]; vlw[i__] = vl[idxq[i__]]; /* L40: */ } _starpu_dlamrg_(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]); i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { idxi = idx[i__] + 1; d__[i__] = dsigma[idxi]; z__[i__] = zw[idxi]; vf[i__] = vfw[idxi]; vl[i__] = vlw[idxi]; /* L50: */ } /* Calculate the allowable deflation tolerence */ eps = _starpu_dlamch_("Epsilon"); /* Computing MAX */ d__1 = abs(*alpha), d__2 = abs(*beta); tol = max(d__1,d__2); /* Computing MAX */ d__2 = (d__1 = d__[n], abs(d__1)); tol = eps * 64. * max(d__2,tol); /* There are 2 kinds of deflation -- first a value in the z-vector */ /* is small, second two (or more) singular values are very close */ /* together (their difference is small). */ /* If the value in the z-vector is small, we simply permute the */ /* array so that the corresponding singular value is moved to the */ /* end. */ /* If two values in the D-vector are close, we perform a two-sided */ /* rotation designed to make one of the corresponding z-vector */ /* entries zero, and then permute the array so that the deflated */ /* singular value is moved to the end. */ /* If there are multiple singular values then the problem deflates. */ /* Here the number of equal singular values are found. As each equal */ /* singular value is found, an elementary reflector is computed to */ /* rotate the corresponding singular subspace so that the */ /* corresponding components of Z are zero in this new basis. */ *k = 1; k2 = n + 1; i__1 = n; for (j = 2; j <= i__1; ++j) { if ((d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; idxp[k2] = j; if (j == n) { goto L100; } } else { jprev = j; goto L70; } /* L60: */ } L70: j = jprev; L80: ++j; if (j > n) { goto L90; } if ((d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ --k2; idxp[k2] = j; } else { /* Check if singular values are close enough to allow deflation. */ if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { /* Deflation is possible. */ *s = z__[jprev]; *c__ = z__[j]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ tau = _starpu_dlapy2_(c__, s); z__[j] = tau; z__[jprev] = 0.; *c__ /= tau; *s = -(*s) / tau; /* Record the appropriate Givens rotation */ if (*icompq == 1) { ++(*givptr); idxjp = idxq[idx[jprev] + 1]; idxj = idxq[idx[j] + 1]; if (idxjp <= nlp1) { --idxjp; } if (idxj <= nlp1) { --idxj; } givcol[*givptr + (givcol_dim1 << 1)] = idxjp; givcol[*givptr + givcol_dim1] = idxj; givnum[*givptr + (givnum_dim1 << 1)] = *c__; givnum[*givptr + givnum_dim1] = *s; } _starpu_drot_(&c__1, &vf[jprev], &c__1, &vf[j], &c__1, c__, s); _starpu_drot_(&c__1, &vl[jprev], &c__1, &vl[j], &c__1, c__, s); --k2; idxp[k2] = jprev; jprev = j; } else { ++(*k); zw[*k] = z__[jprev]; dsigma[*k] = d__[jprev]; idxp[*k] = jprev; jprev = j; } } goto L80; L90: /* Record the last singular value. */ ++(*k); zw[*k] = z__[jprev]; dsigma[*k] = d__[jprev]; idxp[*k] = jprev; L100: /* Sort the singular values into DSIGMA. The singular values which */ /* were not deflated go into the first K slots of DSIGMA, except */ /* that DSIGMA(1) is treated separately. */ i__1 = n; for (j = 2; j <= i__1; ++j) { jp = idxp[j]; dsigma[j] = d__[jp]; vfw[j] = vf[jp]; vlw[j] = vl[jp]; /* L110: */ } if (*icompq == 1) { i__1 = n; for (j = 2; j <= i__1; ++j) { jp = idxp[j]; perm[j] = idxq[idx[jp] + 1]; if (perm[j] <= nlp1) { --perm[j]; } /* L120: */ } } /* The deflated singular values go back into the last N - K slots of */ /* D. */ i__1 = n - *k; _starpu_dcopy_(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1); /* Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and */ /* VL(M). */ dsigma[1] = 0.; hlftol = tol / 2.; if (abs(dsigma[2]) <= hlftol) { dsigma[2] = hlftol; } if (m > n) { z__[1] = _starpu_dlapy2_(&z1, &z__[m]); if (z__[1] <= tol) { *c__ = 1.; *s = 0.; z__[1] = tol; } else { *c__ = z1 / z__[1]; *s = -z__[m] / z__[1]; } _starpu_drot_(&c__1, &vf[m], &c__1, &vf[1], &c__1, c__, s); _starpu_drot_(&c__1, &vl[m], &c__1, &vl[1], &c__1, c__, s); } else { if (abs(z1) <= tol) { z__[1] = tol; } else { z__[1] = z1; } } /* Restore Z, VF, and VL. */ i__1 = *k - 1; _starpu_dcopy_(&i__1, &zw[2], &c__1, &z__[2], &c__1); i__1 = n - 1; _starpu_dcopy_(&i__1, &vfw[2], &c__1, &vf[2], &c__1); i__1 = n - 1; _starpu_dcopy_(&i__1, &vlw[2], &c__1, &vl[2], &c__1); return 0; /* End of DLASD7 */ } /* _starpu_dlasd7_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasd8.c000066400000000000000000000246161413463044200205360ustar00rootroot00000000000000/* dlasd8.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b8 = 1.; /* Subroutine */ int _starpu_dlasd8_(integer *icompq, integer *k, doublereal *d__, doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * work, integer *info) { /* System generated locals */ integer difr_dim1, difr_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j; doublereal dj, rho; integer iwk1, iwk2, iwk3; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal temp; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); integer iwk2i, iwk3i; doublereal diflj, difrj, dsigj; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamc3_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlasd4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal dsigjp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* October 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASD8 finds the square roots of the roots of the secular equation, */ /* as defined by the values in DSIGMA and Z. It makes the appropriate */ /* calls to DLASD4, and stores, for each element in D, the distance */ /* to its two nearest poles (elements in DSIGMA). It also updates */ /* the arrays VF and VL, the first and last components of all the */ /* right singular vectors of the original bidiagonal matrix. */ /* DLASD8 is called from DLASD6. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* Specifies whether singular vectors are to be computed in */ /* factored form in the calling routine: */ /* = 0: Compute singular values only. */ /* = 1: Compute singular vectors in factored form as well. */ /* K (input) INTEGER */ /* The number of terms in the rational function to be solved */ /* by DLASD4. K >= 1. */ /* D (output) DOUBLE PRECISION array, dimension ( K ) */ /* On output, D contains the updated singular values. */ /* Z (input/output) DOUBLE PRECISION array, dimension ( K ) */ /* On entry, the first K elements of this array contain the */ /* components of the deflation-adjusted updating row vector. */ /* On exit, Z is updated. */ /* VF (input/output) DOUBLE PRECISION array, dimension ( K ) */ /* On entry, VF contains information passed through DBEDE8. */ /* On exit, VF contains the first K components of the first */ /* components of all right singular vectors of the bidiagonal */ /* matrix. */ /* VL (input/output) DOUBLE PRECISION array, dimension ( K ) */ /* On entry, VL contains information passed through DBEDE8. */ /* On exit, VL contains the first K components of the last */ /* components of all right singular vectors of the bidiagonal */ /* matrix. */ /* DIFL (output) DOUBLE PRECISION array, dimension ( K ) */ /* On exit, DIFL(I) = D(I) - DSIGMA(I). */ /* DIFR (output) DOUBLE PRECISION array, */ /* dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and */ /* dimension ( K ) if ICOMPQ = 0. */ /* On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not */ /* defined and will not be referenced. */ /* If ICOMPQ = 1, DIFR(1:K,2) is an array containing the */ /* normalizing factors for the right singular vector matrix. */ /* LDDIFR (input) INTEGER */ /* The leading dimension of DIFR, must be at least K. */ /* DSIGMA (input/output) DOUBLE PRECISION array, dimension ( K ) */ /* On entry, the first K elements of this array contain the old */ /* roots of the deflated updating problem. These are the poles */ /* of the secular equation. */ /* On exit, the elements of DSIGMA may be very slightly altered */ /* in value. */ /* WORK (workspace) DOUBLE PRECISION array, dimension at least 3 * K */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an singular value did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --z__; --vf; --vl; --difl; difr_dim1 = *lddifr; difr_offset = 1 + difr_dim1; difr -= difr_offset; --dsigma; --work; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*k < 1) { *info = -2; } else if (*lddifr < *k) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASD8", &i__1); return 0; } /* Quick return if possible */ if (*k == 1) { d__[1] = abs(z__[1]); difl[1] = d__[1]; if (*icompq == 1) { difl[2] = 1.; difr[(difr_dim1 << 1) + 1] = 1.; } return 0; } /* Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can */ /* be computed with high relative accuracy (barring over/underflow). */ /* This is a problem on machines without a guard digit in */ /* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ /* The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I), */ /* which on any of these machines zeros out the bottommost */ /* bit of DSIGMA(I) if it is 1; this makes the subsequent */ /* subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation */ /* occurs. On binary machines with a guard digit (almost all */ /* machines) it does not change DSIGMA(I) at all. On hexadecimal */ /* and decimal machines with a guard digit, it slightly */ /* changes the bottommost bits of DSIGMA(I). It does not account */ /* for hexadecimal or decimal machines without guard digits */ /* (we know of none). We use a subroutine call to compute */ /* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ /* this code. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { dsigma[i__] = _starpu_dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; /* L10: */ } /* Book keeping. */ iwk1 = 1; iwk2 = iwk1 + *k; iwk3 = iwk2 + *k; iwk2i = iwk2 - 1; iwk3i = iwk3 - 1; /* Normalize Z. */ rho = _starpu_dnrm2_(k, &z__[1], &c__1); _starpu_dlascl_("G", &c__0, &c__0, &rho, &c_b8, k, &c__1, &z__[1], k, info); rho *= rho; /* Initialize WORK(IWK3). */ _starpu_dlaset_("A", k, &c__1, &c_b8, &c_b8, &work[iwk3], k); /* Compute the updated singular values, the arrays DIFL, DIFR, */ /* and the updated Z. */ i__1 = *k; for (j = 1; j <= i__1; ++j) { _starpu_dlasd4_(k, &j, &dsigma[1], &z__[1], &work[iwk1], &rho, &d__[j], &work[ iwk2], info); /* If the root finder fails, the computation is terminated. */ if (*info != 0) { return 0; } work[iwk3i + j] = work[iwk3i + j] * work[j] * work[iwk2i + j]; difl[j] = -work[j]; difr[j + difr_dim1] = -work[j + 1]; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ j]); /* L20: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ j]); /* L30: */ } /* L40: */ } /* Compute updated Z. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__2 = sqrt((d__1 = work[iwk3i + i__], abs(d__1))); z__[i__] = d_sign(&d__2, &z__[i__]); /* L50: */ } /* Update VF and VL. */ i__1 = *k; for (j = 1; j <= i__1; ++j) { diflj = difl[j]; dj = d__[j]; dsigj = -dsigma[j]; if (j < *k) { difrj = -difr[j + difr_dim1]; dsigjp = -dsigma[j + 1]; } work[j] = -z__[j] / diflj / (dsigma[j] + dj); i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = z__[i__] / (_starpu_dlamc3_(&dsigma[i__], &dsigj) - diflj) / ( dsigma[i__] + dj); /* L60: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { work[i__] = z__[i__] / (_starpu_dlamc3_(&dsigma[i__], &dsigjp) + difrj) / (dsigma[i__] + dj); /* L70: */ } temp = _starpu_dnrm2_(k, &work[1], &c__1); work[iwk2i + j] = _starpu_ddot_(k, &work[1], &c__1, &vf[1], &c__1) / temp; work[iwk3i + j] = _starpu_ddot_(k, &work[1], &c__1, &vl[1], &c__1) / temp; if (*icompq == 1) { difr[j + (difr_dim1 << 1)] = temp; } /* L80: */ } _starpu_dcopy_(k, &work[iwk2], &c__1, &vf[1], &c__1); _starpu_dcopy_(k, &work[iwk3], &c__1, &vl[1], &c__1); return 0; /* End of DLASD8 */ } /* _starpu_dlasd8_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasda.c000066400000000000000000000412351413463044200206030ustar00rootroot00000000000000/* dlasda.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__0 = 0; static doublereal c_b11 = 0.; static doublereal c_b12 = 1.; static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dlasda_(integer *icompq, integer *smlsiz, integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, difl_dim1, difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, i__2; /* Builtin functions */ integer pow_ii(integer *, integer *); /* Local variables */ integer i__, j, m, i1, ic, lf, nd, ll, nl, vf, nr, vl, im1, ncc, nlf, nrf, vfi, iwk, vli, lvl, nru, ndb1, nlp1, lvl2, nrp1; doublereal beta; integer idxq, nlvl; doublereal alpha; integer inode, ndiml, ndimr, idxqi, itemp; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer sqrei; extern /* Subroutine */ int _starpu_dlasd6_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer nwork1, nwork2; extern /* Subroutine */ int _starpu_dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlasdt_(integer *, integer *, integer *, integer *, integer *, integer *, integer *), _starpu_dlaset_( char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); integer smlszp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Using a divide and conquer approach, DLASDA computes the singular */ /* value decomposition (SVD) of a real upper bidiagonal N-by-M matrix */ /* B with diagonal D and offdiagonal E, where M = N + SQRE. The */ /* algorithm computes the singular values in the SVD B = U * S * VT. */ /* The orthogonal matrices U and VT are optionally computed in */ /* compact form. */ /* A related subroutine, DLASD0, computes the singular values and */ /* the singular vectors in explicit form. */ /* Arguments */ /* ========= */ /* ICOMPQ (input) INTEGER */ /* Specifies whether singular vectors are to be computed */ /* in compact form, as follows */ /* = 0: Compute singular values only. */ /* = 1: Compute singular vectors of upper bidiagonal */ /* matrix in compact form. */ /* SMLSIZ (input) INTEGER */ /* The maximum size of the subproblems at the bottom of the */ /* computation tree. */ /* N (input) INTEGER */ /* The row dimension of the upper bidiagonal matrix. This is */ /* also the dimension of the main diagonal array D. */ /* SQRE (input) INTEGER */ /* Specifies the column dimension of the bidiagonal matrix. */ /* = 0: The bidiagonal matrix has column dimension M = N; */ /* = 1: The bidiagonal matrix has column dimension M = N + 1. */ /* D (input/output) DOUBLE PRECISION array, dimension ( N ) */ /* On entry D contains the main diagonal of the bidiagonal */ /* matrix. On exit D, if INFO = 0, contains its singular values. */ /* E (input) DOUBLE PRECISION array, dimension ( M-1 ) */ /* Contains the subdiagonal entries of the bidiagonal matrix. */ /* On exit, E has been destroyed. */ /* U (output) DOUBLE PRECISION array, */ /* dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced */ /* if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left */ /* singular vector matrices of all subproblems at the bottom */ /* level. */ /* LDU (input) INTEGER, LDU = > N. */ /* The leading dimension of arrays U, VT, DIFL, DIFR, POLES, */ /* GIVNUM, and Z. */ /* VT (output) DOUBLE PRECISION array, */ /* dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced */ /* if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT' contains the right */ /* singular vector matrices of all subproblems at the bottom */ /* level. */ /* K (output) INTEGER array, */ /* dimension ( N ) if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0. */ /* If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th */ /* secular equation on the computation tree. */ /* DIFL (output) DOUBLE PRECISION array, dimension ( LDU, NLVL ), */ /* where NLVL = floor(log_2 (N/SMLSIZ))). */ /* DIFR (output) DOUBLE PRECISION array, */ /* dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and */ /* dimension ( N ) if ICOMPQ = 0. */ /* If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1) */ /* record distances between singular values on the I-th */ /* level and singular values on the (I -1)-th level, and */ /* DIFR(1:N, 2 * I ) contains the normalizing factors for */ /* the right singular vector matrix. See DLASD8 for details. */ /* Z (output) DOUBLE PRECISION array, */ /* dimension ( LDU, NLVL ) if ICOMPQ = 1 and */ /* dimension ( N ) if ICOMPQ = 0. */ /* The first K elements of Z(1, I) contain the components of */ /* the deflation-adjusted updating row vector for subproblems */ /* on the I-th level. */ /* POLES (output) DOUBLE PRECISION array, */ /* dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced */ /* if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and */ /* POLES(1, 2*I) contain the new and old singular values */ /* involved in the secular equations on the I-th level. */ /* GIVPTR (output) INTEGER array, */ /* dimension ( N ) if ICOMPQ = 1, and not referenced if */ /* ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records */ /* the number of Givens rotations performed on the I-th */ /* problem on the computation tree. */ /* GIVCOL (output) INTEGER array, */ /* dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not */ /* referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, */ /* GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations */ /* of Givens rotations performed on the I-th level on the */ /* computation tree. */ /* LDGCOL (input) INTEGER, LDGCOL = > N. */ /* The leading dimension of arrays GIVCOL and PERM. */ /* PERM (output) INTEGER array, */ /* dimension ( LDGCOL, NLVL ) if ICOMPQ = 1, and not referenced */ /* if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records */ /* permutations done on the I-th level of the computation tree. */ /* GIVNUM (output) DOUBLE PRECISION array, */ /* dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not */ /* referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, */ /* GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S- */ /* values of Givens rotations performed on the I-th level on */ /* the computation tree. */ /* C (output) DOUBLE PRECISION array, */ /* dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. */ /* If ICOMPQ = 1 and the I-th subproblem is not square, on exit, */ /* C( I ) contains the C-value of a Givens rotation related to */ /* the right null space of the I-th subproblem. */ /* S (output) DOUBLE PRECISION array, dimension ( N ) if */ /* ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1 */ /* and the I-th subproblem is not square, on exit, S( I ) */ /* contains the S-value of a Givens rotation related to */ /* the right null space of the I-th subproblem. */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)). */ /* IWORK (workspace) INTEGER array. */ /* Dimension must be at least (7 * N). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = 1, an singular value did not converge */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; givnum_dim1 = *ldu; givnum_offset = 1 + givnum_dim1; givnum -= givnum_offset; poles_dim1 = *ldu; poles_offset = 1 + poles_dim1; poles -= poles_offset; z_dim1 = *ldu; z_offset = 1 + z_dim1; z__ -= z_offset; difr_dim1 = *ldu; difr_offset = 1 + difr_dim1; difr -= difr_offset; difl_dim1 = *ldu; difl_offset = 1 + difl_dim1; difl -= difl_offset; vt_dim1 = *ldu; vt_offset = 1 + vt_dim1; vt -= vt_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; --k; --givptr; perm_dim1 = *ldgcol; perm_offset = 1 + perm_dim1; perm -= perm_offset; givcol_dim1 = *ldgcol; givcol_offset = 1 + givcol_dim1; givcol -= givcol_offset; --c__; --s; --work; --iwork; /* Function Body */ *info = 0; if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*smlsiz < 3) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*sqre < 0 || *sqre > 1) { *info = -4; } else if (*ldu < *n + *sqre) { *info = -8; } else if (*ldgcol < *n) { *info = -17; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASDA", &i__1); return 0; } m = *n + *sqre; /* If the input matrix is too small, call DLASDQ to find the SVD. */ if (*n <= *smlsiz) { if (*icompq == 0) { _starpu_dlasdq_("U", sqre, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[ vt_offset], ldu, &u[u_offset], ldu, &u[u_offset], ldu, & work[1], info); } else { _starpu_dlasdq_("U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset] , ldu, &u[u_offset], ldu, &u[u_offset], ldu, &work[1], info); } return 0; } /* Book-keeping and set up the computation tree. */ inode = 1; ndiml = inode + *n; ndimr = ndiml + *n; idxq = ndimr + *n; iwk = idxq + *n; ncc = 0; nru = 0; smlszp = *smlsiz + 1; vf = 1; vl = vf + m; nwork1 = vl + m; nwork2 = nwork1 + smlszp * smlszp; _starpu_dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], smlsiz); /* for the nodes on bottom level of the tree, solve */ /* their subproblems by DLASDQ. */ ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { /* IC : center row of each node */ /* NL : number of rows of left subproblem */ /* NR : number of rows of right subproblem */ /* NLF: starting row of the left subproblem */ /* NRF: starting row of the right subproblem */ i1 = i__ - 1; ic = iwork[inode + i1]; nl = iwork[ndiml + i1]; nlp1 = nl + 1; nr = iwork[ndimr + i1]; nlf = ic - nl; nrf = ic + 1; idxqi = idxq + nlf - 2; vfi = vf + nlf - 1; vli = vl + nlf - 1; sqrei = 1; if (*icompq == 0) { _starpu_dlaset_("A", &nlp1, &nlp1, &c_b11, &c_b12, &work[nwork1], &smlszp); _starpu_dlasdq_("U", &sqrei, &nl, &nlp1, &nru, &ncc, &d__[nlf], &e[nlf], & work[nwork1], &smlszp, &work[nwork2], &nl, &work[nwork2], &nl, &work[nwork2], info); itemp = nwork1 + nl * smlszp; _starpu_dcopy_(&nlp1, &work[nwork1], &c__1, &work[vfi], &c__1); _starpu_dcopy_(&nlp1, &work[itemp], &c__1, &work[vli], &c__1); } else { _starpu_dlaset_("A", &nl, &nl, &c_b11, &c_b12, &u[nlf + u_dim1], ldu); _starpu_dlaset_("A", &nlp1, &nlp1, &c_b11, &c_b12, &vt[nlf + vt_dim1], ldu); _starpu_dlasdq_("U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], & vt[nlf + vt_dim1], ldu, &u[nlf + u_dim1], ldu, &u[nlf + u_dim1], ldu, &work[nwork1], info); _starpu_dcopy_(&nlp1, &vt[nlf + vt_dim1], &c__1, &work[vfi], &c__1); _starpu_dcopy_(&nlp1, &vt[nlf + nlp1 * vt_dim1], &c__1, &work[vli], &c__1) ; } if (*info != 0) { return 0; } i__2 = nl; for (j = 1; j <= i__2; ++j) { iwork[idxqi + j] = j; /* L10: */ } if (i__ == nd && *sqre == 0) { sqrei = 0; } else { sqrei = 1; } idxqi += nlp1; vfi += nlp1; vli += nlp1; nrp1 = nr + sqrei; if (*icompq == 0) { _starpu_dlaset_("A", &nrp1, &nrp1, &c_b11, &c_b12, &work[nwork1], &smlszp); _starpu_dlasdq_("U", &sqrei, &nr, &nrp1, &nru, &ncc, &d__[nrf], &e[nrf], & work[nwork1], &smlszp, &work[nwork2], &nr, &work[nwork2], &nr, &work[nwork2], info); itemp = nwork1 + (nrp1 - 1) * smlszp; _starpu_dcopy_(&nrp1, &work[nwork1], &c__1, &work[vfi], &c__1); _starpu_dcopy_(&nrp1, &work[itemp], &c__1, &work[vli], &c__1); } else { _starpu_dlaset_("A", &nr, &nr, &c_b11, &c_b12, &u[nrf + u_dim1], ldu); _starpu_dlaset_("A", &nrp1, &nrp1, &c_b11, &c_b12, &vt[nrf + vt_dim1], ldu); _starpu_dlasdq_("U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], & vt[nrf + vt_dim1], ldu, &u[nrf + u_dim1], ldu, &u[nrf + u_dim1], ldu, &work[nwork1], info); _starpu_dcopy_(&nrp1, &vt[nrf + vt_dim1], &c__1, &work[vfi], &c__1); _starpu_dcopy_(&nrp1, &vt[nrf + nrp1 * vt_dim1], &c__1, &work[vli], &c__1) ; } if (*info != 0) { return 0; } i__2 = nr; for (j = 1; j <= i__2; ++j) { iwork[idxqi + j] = j; /* L20: */ } /* L30: */ } /* Now conquer each subproblem bottom-up. */ j = pow_ii(&c__2, &nlvl); for (lvl = nlvl; lvl >= 1; --lvl) { lvl2 = (lvl << 1) - 1; /* Find the first node LF and last node LL on */ /* the current level LVL. */ if (lvl == 1) { lf = 1; ll = 1; } else { i__1 = lvl - 1; lf = pow_ii(&c__2, &i__1); ll = (lf << 1) - 1; } i__1 = ll; for (i__ = lf; i__ <= i__1; ++i__) { im1 = i__ - 1; ic = iwork[inode + im1]; nl = iwork[ndiml + im1]; nr = iwork[ndimr + im1]; nlf = ic - nl; nrf = ic + 1; if (i__ == ll) { sqrei = *sqre; } else { sqrei = 1; } vfi = vf + nlf - 1; vli = vl + nlf - 1; idxqi = idxq + nlf - 1; alpha = d__[ic]; beta = e[ic]; if (*icompq == 0) { _starpu_dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & work[vli], &alpha, &beta, &iwork[idxqi], &perm[ perm_offset], &givptr[1], &givcol[givcol_offset], ldgcol, &givnum[givnum_offset], ldu, &poles[ poles_offset], &difl[difl_offset], &difr[difr_offset], &z__[z_offset], &k[1], &c__[1], &s[1], &work[nwork1], &iwork[iwk], info); } else { --j; _starpu_dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & work[vli], &alpha, &beta, &iwork[idxqi], &perm[nlf + lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, &givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], & difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[j], &s[j], &work[nwork1], &iwork[iwk], info); } if (*info != 0) { return 0; } /* L40: */ } /* L50: */ } return 0; /* End of DLASDA */ } /* _starpu_dlasda_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasdq.c000066400000000000000000000271421413463044200206240ustar00rootroot00000000000000/* dlasdq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dlasdq_(char *uplo, integer *sqre, integer *n, integer * ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; /* Local variables */ integer i__, j; doublereal r__, cs, sn; integer np1, isub; doublereal smin; integer sqre1; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer * , doublereal *, integer *); integer iuplo; extern /* Subroutine */ int _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *), _starpu_dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); logical rotate; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASDQ computes the singular value decomposition (SVD) of a real */ /* (upper or lower) bidiagonal matrix with diagonal D and offdiagonal */ /* E, accumulating the transformations if desired. Letting B denote */ /* the input bidiagonal matrix, the algorithm computes orthogonal */ /* matrices Q and P such that B = Q * S * P' (P' denotes the transpose */ /* of P). The singular values S are overwritten on D. */ /* The input matrix U is changed to U * Q if desired. */ /* The input matrix VT is changed to P' * VT if desired. */ /* The input matrix C is changed to Q' * C if desired. */ /* See "Computing Small Singular Values of Bidiagonal Matrices With */ /* Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, */ /* LAPACK Working Note #3, for a detailed description of the algorithm. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* On entry, UPLO specifies whether the input bidiagonal matrix */ /* is upper or lower bidiagonal, and wether it is square are */ /* not. */ /* UPLO = 'U' or 'u' B is upper bidiagonal. */ /* UPLO = 'L' or 'l' B is lower bidiagonal. */ /* SQRE (input) INTEGER */ /* = 0: then the input matrix is N-by-N. */ /* = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and */ /* (N+1)-by-N if UPLU = 'L'. */ /* The bidiagonal matrix has */ /* N = NL + NR + 1 rows and */ /* M = N + SQRE >= N columns. */ /* N (input) INTEGER */ /* On entry, N specifies the number of rows and columns */ /* in the matrix. N must be at least 0. */ /* NCVT (input) INTEGER */ /* On entry, NCVT specifies the number of columns of */ /* the matrix VT. NCVT must be at least 0. */ /* NRU (input) INTEGER */ /* On entry, NRU specifies the number of rows of */ /* the matrix U. NRU must be at least 0. */ /* NCC (input) INTEGER */ /* On entry, NCC specifies the number of columns of */ /* the matrix C. NCC must be at least 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, D contains the diagonal entries of the */ /* bidiagonal matrix whose SVD is desired. On normal exit, */ /* D contains the singular values in ascending order. */ /* E (input/output) DOUBLE PRECISION array. */ /* dimension is (N-1) if SQRE = 0 and N if SQRE = 1. */ /* On entry, the entries of E contain the offdiagonal entries */ /* of the bidiagonal matrix whose SVD is desired. On normal */ /* exit, E will contain 0. If the algorithm does not converge, */ /* D and E will contain the diagonal and superdiagonal entries */ /* of a bidiagonal matrix orthogonally equivalent to the one */ /* given as input. */ /* VT (input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT) */ /* On entry, contains a matrix which on exit has been */ /* premultiplied by P', dimension N-by-NCVT if SQRE = 0 */ /* and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0). */ /* LDVT (input) INTEGER */ /* On entry, LDVT specifies the leading dimension of VT as */ /* declared in the calling (sub) program. LDVT must be at */ /* least 1. If NCVT is nonzero LDVT must also be at least N. */ /* U (input/output) DOUBLE PRECISION array, dimension (LDU, N) */ /* On entry, contains a matrix which on exit has been */ /* postmultiplied by Q, dimension NRU-by-N if SQRE = 0 */ /* and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0). */ /* LDU (input) INTEGER */ /* On entry, LDU specifies the leading dimension of U as */ /* declared in the calling (sub) program. LDU must be at */ /* least max( 1, NRU ) . */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC, NCC) */ /* On entry, contains an N-by-NCC matrix which on exit */ /* has been premultiplied by Q' dimension N-by-NCC if SQRE = 0 */ /* and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0). */ /* LDC (input) INTEGER */ /* On entry, LDC specifies the leading dimension of C as */ /* declared in the calling (sub) program. LDC must be at */ /* least 1. If NCC is nonzero, LDC must also be at least N. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* Workspace. Only referenced if one of NCVT, NRU, or NCC is */ /* nonzero, and if N is at least 2. */ /* INFO (output) INTEGER */ /* On exit, a value of 0 indicates a successful exit. */ /* If INFO < 0, argument number -INFO is illegal. */ /* If INFO > 0, the algorithm did not converge, and INFO */ /* specifies how many superdiagonals did not converge. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; vt_dim1 = *ldvt; vt_offset = 1 + vt_dim1; vt -= vt_offset; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; iuplo = 0; if (_starpu_lsame_(uplo, "U")) { iuplo = 1; } if (_starpu_lsame_(uplo, "L")) { iuplo = 2; } if (iuplo == 0) { *info = -1; } else if (*sqre < 0 || *sqre > 1) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ncvt < 0) { *info = -4; } else if (*nru < 0) { *info = -5; } else if (*ncc < 0) { *info = -6; } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { *info = -10; } else if (*ldu < max(1,*nru)) { *info = -12; } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { *info = -14; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASDQ", &i__1); return 0; } if (*n == 0) { return 0; } /* ROTATE is true if any singular vectors desired, false otherwise */ rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; np1 = *n + 1; sqre1 = *sqre; /* If matrix non-square upper bidiagonal, rotate to be lower */ /* bidiagonal. The rotations are on the right. */ if (iuplo == 1 && sqre1 == 1) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); d__[i__] = r__; e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; if (rotate) { work[i__] = cs; work[*n + i__] = sn; } /* L10: */ } _starpu_dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); d__[*n] = r__; e[*n] = 0.; if (rotate) { work[*n] = cs; work[*n + *n] = sn; } iuplo = 2; sqre1 = 0; /* Update singular vectors if desired. */ if (*ncvt > 0) { _starpu_dlasr_("L", "V", "F", &np1, ncvt, &work[1], &work[np1], &vt[ vt_offset], ldvt); } } /* If matrix lower bidiagonal, rotate to be upper bidiagonal */ /* by applying Givens rotations on the left. */ if (iuplo == 2) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); d__[i__] = r__; e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; if (rotate) { work[i__] = cs; work[*n + i__] = sn; } /* L20: */ } /* If matrix (N+1)-by-N lower bidiagonal, one additional */ /* rotation is needed. */ if (sqre1 == 1) { _starpu_dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); d__[*n] = r__; if (rotate) { work[*n] = cs; work[*n + *n] = sn; } } /* Update singular vectors if desired. */ if (*nru > 0) { if (sqre1 == 0) { _starpu_dlasr_("R", "V", "F", nru, n, &work[1], &work[np1], &u[ u_offset], ldu); } else { _starpu_dlasr_("R", "V", "F", nru, &np1, &work[1], &work[np1], &u[ u_offset], ldu); } } if (*ncc > 0) { if (sqre1 == 0) { _starpu_dlasr_("L", "V", "F", n, ncc, &work[1], &work[np1], &c__[ c_offset], ldc); } else { _starpu_dlasr_("L", "V", "F", &np1, ncc, &work[1], &work[np1], &c__[ c_offset], ldc); } } } /* Call DBDSQR to compute the SVD of the reduced real */ /* N-by-N upper bidiagonal matrix. */ _starpu_dbdsqr_("U", n, ncvt, nru, ncc, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[ u_offset], ldu, &c__[c_offset], ldc, &work[1], info); /* Sort the singular values into ascending order (insertion sort on */ /* singular values, but only one transposition per singular vector) */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Scan for smallest D(I). */ isub = i__; smin = d__[i__]; i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { if (d__[j] < smin) { isub = j; smin = d__[j]; } /* L30: */ } if (isub != i__) { /* Swap singular values and vectors. */ d__[isub] = d__[i__]; d__[i__] = smin; if (*ncvt > 0) { _starpu_dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[i__ + vt_dim1], ldvt); } if (*nru > 0) { _starpu_dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[i__ * u_dim1 + 1] , &c__1); } if (*ncc > 0) { _starpu_dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[i__ + c_dim1], ldc) ; } } /* L40: */ } return 0; /* End of DLASDQ */ } /* _starpu_dlasdq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasdt.c000066400000000000000000000070311413463044200206220ustar00rootroot00000000000000/* dlasdt.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasdt_(integer *n, integer *lvl, integer *nd, integer * inode, integer *ndiml, integer *ndimr, integer *msub) { /* System generated locals */ integer i__1, i__2; /* Builtin functions */ double log(doublereal); /* Local variables */ integer i__, il, ir, maxn; doublereal temp; integer nlvl, llst, ncrnt; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASDT creates a tree of subproblems for bidiagonal divide and */ /* conquer. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* On entry, the number of diagonal elements of the */ /* bidiagonal matrix. */ /* LVL (output) INTEGER */ /* On exit, the number of levels on the computation tree. */ /* ND (output) INTEGER */ /* On exit, the number of nodes on the tree. */ /* INODE (output) INTEGER array, dimension ( N ) */ /* On exit, centers of subproblems. */ /* NDIML (output) INTEGER array, dimension ( N ) */ /* On exit, row dimensions of left children. */ /* NDIMR (output) INTEGER array, dimension ( N ) */ /* On exit, row dimensions of right children. */ /* MSUB (input) INTEGER. */ /* On entry, the maximum row dimension each subproblem at the */ /* bottom of the tree can be of. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Ming Gu and Huan Ren, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Find the number of levels on the tree. */ /* Parameter adjustments */ --ndimr; --ndiml; --inode; /* Function Body */ maxn = max(1,*n); temp = log((doublereal) maxn / (doublereal) (*msub + 1)) / log(2.); *lvl = (integer) temp + 1; i__ = *n / 2; inode[1] = i__ + 1; ndiml[1] = i__; ndimr[1] = *n - i__ - 1; il = 0; ir = 1; llst = 1; i__1 = *lvl - 1; for (nlvl = 1; nlvl <= i__1; ++nlvl) { /* Constructing the tree at (NLVL+1)-st level. The number of */ /* nodes created on this level is LLST * 2. */ i__2 = llst - 1; for (i__ = 0; i__ <= i__2; ++i__) { il += 2; ir += 2; ncrnt = llst + i__; ndiml[il] = ndiml[ncrnt] / 2; ndimr[il] = ndiml[ncrnt] - ndiml[il] - 1; inode[il] = inode[ncrnt] - ndimr[il] - 1; ndiml[ir] = ndimr[ncrnt] / 2; ndimr[ir] = ndimr[ncrnt] - ndiml[ir] - 1; inode[ir] = inode[ncrnt] + ndiml[ir] + 1; /* L10: */ } llst <<= 1; /* L20: */ } *nd = (llst << 1) - 1; return 0; /* End of DLASDT */ } /* _starpu_dlasdt_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaset.c000066400000000000000000000101001413463044200206120ustar00rootroot00000000000000/* dlaset.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaset_(char *uplo, integer *m, integer *n, doublereal * alpha, doublereal *beta, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j; extern logical _starpu_lsame_(char *, char *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASET initializes an m-by-n matrix A to BETA on the diagonal and */ /* ALPHA on the offdiagonals. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies the part of the matrix A to be set. */ /* = 'U': Upper triangular part is set; the strictly lower */ /* triangular part of A is not changed. */ /* = 'L': Lower triangular part is set; the strictly upper */ /* triangular part of A is not changed. */ /* Otherwise: All of the matrix A is set. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* ALPHA (input) DOUBLE PRECISION */ /* The constant to which the offdiagonal elements are to be set. */ /* BETA (input) DOUBLE PRECISION */ /* The constant to which the diagonal elements are to be set. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On exit, the leading m-by-n submatrix of A is set as follows: */ /* if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n, */ /* if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n, */ /* otherwise, A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j, */ /* and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (_starpu_lsame_(uplo, "U")) { /* Set the strictly upper triangular or trapezoidal part of the */ /* array to ALPHA. */ i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing MIN */ i__3 = j - 1; i__2 = min(i__3,*m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; /* L10: */ } /* L20: */ } } else if (_starpu_lsame_(uplo, "L")) { /* Set the strictly lower triangular or trapezoidal part of the */ /* array to ALPHA. */ i__1 = min(*m,*n); for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; /* L30: */ } /* L40: */ } } else { /* Set the leading m-by-n submatrix to ALPHA. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; /* L50: */ } /* L60: */ } } /* Set the first min(M,N) diagonal elements to BETA. */ i__1 = min(*m,*n); for (i__ = 1; i__ <= i__1; ++i__) { a[i__ + i__ * a_dim1] = *beta; /* L70: */ } return 0; /* End of DLASET */ } /* _starpu_dlaset_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasq1.c000066400000000000000000000150701413463044200205360ustar00rootroot00000000000000/* dlasq1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; static integer c__0 = 0; /* Subroutine */ int _starpu_dlasq1_(integer *n, doublereal *d__, doublereal *e, doublereal *work, integer *info) { /* System generated locals */ integer i__1, i__2; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal eps; extern /* Subroutine */ int _starpu_dlas2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal scale; integer iinfo; doublereal sigmn; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal sigmx; extern /* Subroutine */ int _starpu_dlasq2_(integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dlasrt_( char *, integer *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Osni Marques of the Lawrence Berkeley National -- */ /* -- Laboratory and Beresford Parlett of the Univ. of California at -- */ /* -- Berkeley -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASQ1 computes the singular values of a real N-by-N bidiagonal */ /* matrix with diagonal D and off-diagonal E. The singular values */ /* are computed to high relative accuracy, in the absence of */ /* denormalization, underflow and overflow. The algorithm was first */ /* presented in */ /* "Accurate singular values and differential qd algorithms" by K. V. */ /* Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230, */ /* 1994, */ /* and the present implementation is described in "An implementation of */ /* the dqds Algorithm (Positive Case)", LAPACK Working Note. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of rows and columns in the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, D contains the diagonal elements of the */ /* bidiagonal matrix whose SVD is desired. On normal exit, */ /* D contains the singular values in decreasing order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, elements E(1:N-1) contain the off-diagonal elements */ /* of the bidiagonal matrix whose SVD is desired. */ /* On exit, E is overwritten. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: the algorithm failed */ /* = 1, a split was marked by a positive value in E */ /* = 2, current block of Z not diagonalized after 30*N */ /* iterations (in inner while loop) */ /* = 3, termination criterion of outer while loop not met */ /* (program created more than N unreduced blocks) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --work; --e; --d__; /* Function Body */ *info = 0; if (*n < 0) { *info = -2; i__1 = -(*info); _starpu_xerbla_("DLASQ1", &i__1); return 0; } else if (*n == 0) { return 0; } else if (*n == 1) { d__[1] = abs(d__[1]); return 0; } else if (*n == 2) { _starpu_dlas2_(&d__[1], &e[1], &d__[2], &sigmn, &sigmx); d__[1] = sigmx; d__[2] = sigmn; return 0; } /* Estimate the largest singular value. */ sigmx = 0.; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = (d__1 = d__[i__], abs(d__1)); /* Computing MAX */ d__2 = sigmx, d__3 = (d__1 = e[i__], abs(d__1)); sigmx = max(d__2,d__3); /* L10: */ } d__[*n] = (d__1 = d__[*n], abs(d__1)); /* Early return if SIGMX is zero (matrix is already diagonal). */ if (sigmx == 0.) { _starpu_dlasrt_("D", n, &d__[1], &iinfo); return 0; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ d__1 = sigmx, d__2 = d__[i__]; sigmx = max(d__1,d__2); /* L20: */ } /* Copy D and E into WORK (in the Z format) and scale (squaring the */ /* input data makes scaling by a power of the radix pointless). */ eps = _starpu_dlamch_("Precision"); safmin = _starpu_dlamch_("Safe minimum"); scale = sqrt(eps / safmin); _starpu_dcopy_(n, &d__[1], &c__1, &work[1], &c__2); i__1 = *n - 1; _starpu_dcopy_(&i__1, &e[1], &c__1, &work[2], &c__2); i__1 = (*n << 1) - 1; i__2 = (*n << 1) - 1; _starpu_dlascl_("G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, &iinfo); /* Compute the q's and e's. */ i__1 = (*n << 1) - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = work[i__]; work[i__] = d__1 * d__1; /* L30: */ } work[*n * 2] = 0.; _starpu_dlasq2_(n, &work[1], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = sqrt(work[i__]); /* L40: */ } _starpu_dlascl_("G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & iinfo); } return 0; /* End of DLASQ1 */ } /* _starpu_dlasq1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasq2.c000066400000000000000000000366231413463044200205460ustar00rootroot00000000000000/* dlasq2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; static integer c__10 = 10; static integer c__3 = 3; static integer c__4 = 4; static integer c__11 = 11; /* Subroutine */ int _starpu_dlasq2_(integer *n, doublereal *z__, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal d__, e, g; integer k; doublereal s, t; integer i0, i4, n0; doublereal dn; integer pp; doublereal dn1, dn2, dee, eps, tau, tol; integer ipn4; doublereal tol2; logical ieee; integer nbig; doublereal dmin__, emin, emax; integer kmin, ndiv, iter; doublereal qmin, temp, qmax, zmax; integer splt; doublereal dmin1, dmin2; integer nfail; doublereal desig, trace, sigma; integer iinfo, ttype; extern /* Subroutine */ int _starpu_dlasq3_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, logical *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); doublereal deemin; integer iwhila, iwhilb; doublereal oldemn, safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlasrt_(char *, integer *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Osni Marques of the Lawrence Berkeley National -- */ /* -- Laboratory and Beresford Parlett of the Univ. of California at -- */ /* -- Berkeley -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASQ2 computes all the eigenvalues of the symmetric positive */ /* definite tridiagonal matrix associated with the qd array Z to high */ /* relative accuracy are computed to high relative accuracy, in the */ /* absence of denormalization, underflow and overflow. */ /* To see the relation of Z to the tridiagonal matrix, let L be a */ /* unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and */ /* let U be an upper bidiagonal matrix with 1's above and diagonal */ /* Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the */ /* symmetric tridiagonal to which it is similar. */ /* Note : DLASQ2 defines a logical variable, IEEE, which is true */ /* on machines which follow ieee-754 floating-point standard in their */ /* handling of infinities and NaNs, and false otherwise. This variable */ /* is passed to DLASQ3. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of rows and columns in the matrix. N >= 0. */ /* Z (input/output) DOUBLE PRECISION array, dimension ( 4*N ) */ /* On entry Z holds the qd array. On exit, entries 1 to N hold */ /* the eigenvalues in decreasing order, Z( 2*N+1 ) holds the */ /* trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If */ /* N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 ) */ /* holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of */ /* shifts that failed. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if the i-th argument is a scalar and had an illegal */ /* value, then INFO = -i, if the i-th argument is an */ /* array and the j-entry had an illegal value, then */ /* INFO = -(i*100+j) */ /* > 0: the algorithm failed */ /* = 1, a split was marked by a positive value in E */ /* = 2, current block of Z not diagonalized after 30*N */ /* iterations (in inner while loop) */ /* = 3, termination criterion of outer while loop not met */ /* (program created more than N unreduced blocks) */ /* Further Details */ /* =============== */ /* Local Variables: I0:N0 defines a current unreduced segment of Z. */ /* The shifts are accumulated in SIGMA. Iteration count is in ITER. */ /* Ping-pong is controlled by PP (alternates between 0 and 1). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* (in case DLASQ2 is not called by DLASQ1) */ /* Parameter adjustments */ --z__; /* Function Body */ *info = 0; eps = _starpu_dlamch_("Precision"); safmin = _starpu_dlamch_("Safe minimum"); tol = eps * 100.; /* Computing 2nd power */ d__1 = tol; tol2 = d__1 * d__1; if (*n < 0) { *info = -1; _starpu_xerbla_("DLASQ2", &c__1); return 0; } else if (*n == 0) { return 0; } else if (*n == 1) { /* 1-by-1 case. */ if (z__[1] < 0.) { *info = -201; _starpu_xerbla_("DLASQ2", &c__2); } return 0; } else if (*n == 2) { /* 2-by-2 case. */ if (z__[2] < 0. || z__[3] < 0.) { *info = -2; _starpu_xerbla_("DLASQ2", &c__2); return 0; } else if (z__[3] > z__[1]) { d__ = z__[3]; z__[3] = z__[1]; z__[1] = d__; } z__[5] = z__[1] + z__[2] + z__[3]; if (z__[2] > z__[3] * tol2) { t = (z__[1] - z__[3] + z__[2]) * .5; s = z__[3] * (z__[2] / t); if (s <= t) { s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.) + 1.))); } else { s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s))); } t = z__[1] + (s + z__[2]); z__[3] *= z__[1] / t; z__[1] = t; } z__[2] = z__[3]; z__[6] = z__[2] + z__[1]; return 0; } /* Check for negative data and compute sums of q's and e's. */ z__[*n * 2] = 0.; emin = z__[2]; qmax = 0.; zmax = 0.; d__ = 0.; e = 0.; i__1 = *n - 1 << 1; for (k = 1; k <= i__1; k += 2) { if (z__[k] < 0.) { *info = -(k + 200); _starpu_xerbla_("DLASQ2", &c__2); return 0; } else if (z__[k + 1] < 0.) { *info = -(k + 201); _starpu_xerbla_("DLASQ2", &c__2); return 0; } d__ += z__[k]; e += z__[k + 1]; /* Computing MAX */ d__1 = qmax, d__2 = z__[k]; qmax = max(d__1,d__2); /* Computing MIN */ d__1 = emin, d__2 = z__[k + 1]; emin = min(d__1,d__2); /* Computing MAX */ d__1 = max(qmax,zmax), d__2 = z__[k + 1]; zmax = max(d__1,d__2); /* L10: */ } if (z__[(*n << 1) - 1] < 0.) { *info = -((*n << 1) + 199); _starpu_xerbla_("DLASQ2", &c__2); return 0; } d__ += z__[(*n << 1) - 1]; /* Computing MAX */ d__1 = qmax, d__2 = z__[(*n << 1) - 1]; qmax = max(d__1,d__2); zmax = max(qmax,zmax); /* Check for diagonality. */ if (e == 0.) { i__1 = *n; for (k = 2; k <= i__1; ++k) { z__[k] = z__[(k << 1) - 1]; /* L20: */ } _starpu_dlasrt_("D", n, &z__[1], &iinfo); z__[(*n << 1) - 1] = d__; return 0; } trace = d__ + e; /* Check for zero data. */ if (trace == 0.) { z__[(*n << 1) - 1] = 0.; return 0; } /* Check whether the machine is IEEE conformable. */ ieee = _starpu_ilaenv_(&c__10, "DLASQ2", "N", &c__1, &c__2, &c__3, &c__4) == 1 && _starpu_ilaenv_(&c__11, "DLASQ2", "N", &c__1, &c__2, &c__3, &c__4) == 1; /* Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). */ for (k = *n << 1; k >= 2; k += -2) { z__[k * 2] = 0.; z__[(k << 1) - 1] = z__[k]; z__[(k << 1) - 2] = 0.; z__[(k << 1) - 3] = z__[k - 1]; /* L30: */ } i0 = 1; n0 = *n; /* Reverse the qd-array, if warranted. */ if (z__[(i0 << 2) - 3] * 1.5 < z__[(n0 << 2) - 3]) { ipn4 = i0 + n0 << 2; i__1 = i0 + n0 - 1 << 1; for (i4 = i0 << 2; i4 <= i__1; i4 += 4) { temp = z__[i4 - 3]; z__[i4 - 3] = z__[ipn4 - i4 - 3]; z__[ipn4 - i4 - 3] = temp; temp = z__[i4 - 1]; z__[i4 - 1] = z__[ipn4 - i4 - 5]; z__[ipn4 - i4 - 5] = temp; /* L40: */ } } /* Initial split checking via dqd and Li's test. */ pp = 0; for (k = 1; k <= 2; ++k) { d__ = z__[(n0 << 2) + pp - 3]; i__1 = (i0 << 2) + pp; for (i4 = (n0 - 1 << 2) + pp; i4 >= i__1; i4 += -4) { if (z__[i4 - 1] <= tol2 * d__) { z__[i4 - 1] = -0.; d__ = z__[i4 - 3]; } else { d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1])); } /* L50: */ } /* dqd maps Z to ZZ plus Li's test. */ emin = z__[(i0 << 2) + pp + 1]; d__ = z__[(i0 << 2) + pp - 3]; i__1 = (n0 - 1 << 2) + pp; for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) { z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1]; if (z__[i4 - 1] <= tol2 * d__) { z__[i4 - 1] = -0.; z__[i4 - (pp << 1) - 2] = d__; z__[i4 - (pp << 1)] = 0.; d__ = z__[i4 + 1]; } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2]; z__[i4 - (pp << 1)] = z__[i4 - 1] * temp; d__ *= temp; } else { z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - ( pp << 1) - 2]); d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]); } /* Computing MIN */ d__1 = emin, d__2 = z__[i4 - (pp << 1)]; emin = min(d__1,d__2); /* L60: */ } z__[(n0 << 2) - pp - 2] = d__; /* Now find qmax. */ qmax = z__[(i0 << 2) - pp - 2]; i__1 = (n0 << 2) - pp - 2; for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) { /* Computing MAX */ d__1 = qmax, d__2 = z__[i4]; qmax = max(d__1,d__2); /* L70: */ } /* Prepare for the next iteration on K. */ pp = 1 - pp; /* L80: */ } /* Initialise variables to pass to DLASQ3. */ ttype = 0; dmin1 = 0.; dmin2 = 0.; dn = 0.; dn1 = 0.; dn2 = 0.; g = 0.; tau = 0.; iter = 2; nfail = 0; ndiv = n0 - i0 << 1; i__1 = *n + 1; for (iwhila = 1; iwhila <= i__1; ++iwhila) { if (n0 < 1) { goto L170; } /* While array unfinished do */ /* E(N0) holds the value of SIGMA when submatrix in I0:N0 */ /* splits from the rest of the array, but is negated. */ desig = 0.; if (n0 == *n) { sigma = 0.; } else { sigma = -z__[(n0 << 2) - 1]; } if (sigma < 0.) { *info = 1; return 0; } /* Find last unreduced submatrix's top index I0, find QMAX and */ /* EMIN. Find Gershgorin-type bound if Q's much greater than E's. */ emax = 0.; if (n0 > i0) { emin = (d__1 = z__[(n0 << 2) - 5], abs(d__1)); } else { emin = 0.; } qmin = z__[(n0 << 2) - 3]; qmax = qmin; for (i4 = n0 << 2; i4 >= 8; i4 += -4) { if (z__[i4 - 5] <= 0.) { goto L100; } if (qmin >= emax * 4.) { /* Computing MIN */ d__1 = qmin, d__2 = z__[i4 - 3]; qmin = min(d__1,d__2); /* Computing MAX */ d__1 = emax, d__2 = z__[i4 - 5]; emax = max(d__1,d__2); } /* Computing MAX */ d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5]; qmax = max(d__1,d__2); /* Computing MIN */ d__1 = emin, d__2 = z__[i4 - 5]; emin = min(d__1,d__2); /* L90: */ } i4 = 4; L100: i0 = i4 / 4; pp = 0; if (n0 - i0 > 1) { dee = z__[(i0 << 2) - 3]; deemin = dee; kmin = i0; i__2 = (n0 << 2) - 3; for (i4 = (i0 << 2) + 1; i4 <= i__2; i4 += 4) { dee = z__[i4] * (dee / (dee + z__[i4 - 2])); if (dee <= deemin) { deemin = dee; kmin = (i4 + 3) / 4; } /* L110: */ } if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * .5) { ipn4 = i0 + n0 << 2; pp = 2; i__2 = i0 + n0 - 1 << 1; for (i4 = i0 << 2; i4 <= i__2; i4 += 4) { temp = z__[i4 - 3]; z__[i4 - 3] = z__[ipn4 - i4 - 3]; z__[ipn4 - i4 - 3] = temp; temp = z__[i4 - 2]; z__[i4 - 2] = z__[ipn4 - i4 - 2]; z__[ipn4 - i4 - 2] = temp; temp = z__[i4 - 1]; z__[i4 - 1] = z__[ipn4 - i4 - 5]; z__[ipn4 - i4 - 5] = temp; temp = z__[i4]; z__[i4] = z__[ipn4 - i4 - 4]; z__[ipn4 - i4 - 4] = temp; /* L120: */ } } } /* Put -(initial shift) into DMIN. */ /* Computing MAX */ d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax); dmin__ = -max(d__1,d__2); /* Now I0:N0 is unreduced. */ /* PP = 0 for ping, PP = 1 for pong. */ /* PP = 2 indicates that flipping was applied to the Z array and */ /* and that the tests for deflation upon entry in DLASQ3 */ /* should not be performed. */ nbig = (n0 - i0 + 1) * 30; i__2 = nbig; for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) { if (i0 > n0) { goto L150; } /* While submatrix unfinished take a good dqds step. */ _starpu_dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, & nfail, &iter, &ndiv, &ieee, &ttype, &dmin1, &dmin2, &dn, & dn1, &dn2, &g, &tau); pp = 1 - pp; /* When EMIN is very small check for splits. */ if (pp == 0 && n0 - i0 >= 3) { if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * sigma) { splt = i0 - 1; qmax = z__[(i0 << 2) - 3]; emin = z__[(i0 << 2) - 1]; oldemn = z__[i0 * 4]; i__3 = n0 - 3 << 2; for (i4 = i0 << 2; i4 <= i__3; i4 += 4) { if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= tol2 * sigma) { z__[i4 - 1] = -sigma; splt = i4 / 4; qmax = 0.; emin = z__[i4 + 3]; oldemn = z__[i4 + 4]; } else { /* Computing MAX */ d__1 = qmax, d__2 = z__[i4 + 1]; qmax = max(d__1,d__2); /* Computing MIN */ d__1 = emin, d__2 = z__[i4 - 1]; emin = min(d__1,d__2); /* Computing MIN */ d__1 = oldemn, d__2 = z__[i4]; oldemn = min(d__1,d__2); } /* L130: */ } z__[(n0 << 2) - 1] = emin; z__[n0 * 4] = oldemn; i0 = splt + 1; } } /* L140: */ } *info = 2; return 0; /* end IWHILB */ L150: /* L160: */ ; } *info = 3; return 0; /* end IWHILA */ L170: /* Move q's to the front. */ i__1 = *n; for (k = 2; k <= i__1; ++k) { z__[k] = z__[(k << 2) - 3]; /* L180: */ } /* Sort and compute sum of eigenvalues. */ _starpu_dlasrt_("D", n, &z__[1], &iinfo); e = 0.; for (k = *n; k >= 1; --k) { e += z__[k]; /* L190: */ } /* Store trace, sum(eigenvalues) and information on performance. */ z__[(*n << 1) + 1] = trace; z__[(*n << 1) + 2] = e; z__[(*n << 1) + 3] = (doublereal) iter; /* Computing 2nd power */ i__1 = *n; z__[(*n << 1) + 4] = (doublereal) ndiv / (doublereal) (i__1 * i__1); z__[(*n << 1) + 5] = nfail * 100. / (doublereal) iter; return 0; /* End of DLASQ2 */ } /* _starpu_dlasq2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasq3.c000066400000000000000000000217601413463044200205430ustar00rootroot00000000000000/* dlasq3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasq3_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, doublereal *tau) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal s, t; integer j4, nn; doublereal eps, tol; integer n0in, ipn4; doublereal tol2, temp; extern /* Subroutine */ int _starpu_dlasq4_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlasq5_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, logical *), _starpu_dlasq6_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern logical _starpu_disnan_(doublereal *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Osni Marques of the Lawrence Berkeley National -- */ /* -- Laboratory and Beresford Parlett of the Univ. of California at -- */ /* -- Berkeley -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASQ3 checks for deflation, computes a shift (TAU) and calls dqds. */ /* In case of failure it changes shifts, and tries again until output */ /* is positive. */ /* Arguments */ /* ========= */ /* I0 (input) INTEGER */ /* First index. */ /* N0 (input) INTEGER */ /* Last index. */ /* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) */ /* Z holds the qd array. */ /* PP (input/output) INTEGER */ /* PP=0 for ping, PP=1 for pong. */ /* PP=2 indicates that flipping was applied to the Z array */ /* and that the initial tests for deflation should not be */ /* performed. */ /* DMIN (output) DOUBLE PRECISION */ /* Minimum value of d. */ /* SIGMA (output) DOUBLE PRECISION */ /* Sum of shifts used in current segment. */ /* DESIG (input/output) DOUBLE PRECISION */ /* Lower order part of SIGMA */ /* QMAX (input) DOUBLE PRECISION */ /* Maximum value of q. */ /* NFAIL (output) INTEGER */ /* Number of times shift was too big. */ /* ITER (output) INTEGER */ /* Number of iterations. */ /* NDIV (output) INTEGER */ /* Number of divisions. */ /* IEEE (input) LOGICAL */ /* Flag for IEEE or non IEEE arithmetic (passed to DLASQ5). */ /* TTYPE (input/output) INTEGER */ /* Shift type. */ /* DMIN1, DMIN2, DN, DN1, DN2, G, TAU (input/output) DOUBLE PRECISION */ /* These are passed as arguments in order to save their values */ /* between calls to DLASQ3. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Function .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --z__; /* Function Body */ n0in = *n0; eps = _starpu_dlamch_("Precision"); tol = eps * 100.; /* Computing 2nd power */ d__1 = tol; tol2 = d__1 * d__1; /* Check for deflation. */ L10: if (*n0 < *i0) { return 0; } if (*n0 == *i0) { goto L20; } nn = (*n0 << 2) + *pp; if (*n0 == *i0 + 1) { goto L40; } /* Check whether E(N0-1) is negligible, 1 eigenvalue. */ if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && z__[nn - (*pp << 1) - 4] > tol2 * z__[nn - 7]) { goto L30; } L20: z__[(*n0 << 2) - 3] = z__[(*n0 << 2) + *pp - 3] + *sigma; --(*n0); goto L10; /* Check whether E(N0-2) is negligible, 2 eigenvalues. */ L30: if (z__[nn - 9] > tol2 * *sigma && z__[nn - (*pp << 1) - 8] > tol2 * z__[ nn - 11]) { goto L50; } L40: if (z__[nn - 3] > z__[nn - 7]) { s = z__[nn - 3]; z__[nn - 3] = z__[nn - 7]; z__[nn - 7] = s; } if (z__[nn - 5] > z__[nn - 3] * tol2) { t = (z__[nn - 7] - z__[nn - 3] + z__[nn - 5]) * .5; s = z__[nn - 3] * (z__[nn - 5] / t); if (s <= t) { s = z__[nn - 3] * (z__[nn - 5] / (t * (sqrt(s / t + 1.) + 1.))); } else { s = z__[nn - 3] * (z__[nn - 5] / (t + sqrt(t) * sqrt(t + s))); } t = z__[nn - 7] + (s + z__[nn - 5]); z__[nn - 3] *= z__[nn - 7] / t; z__[nn - 7] = t; } z__[(*n0 << 2) - 7] = z__[nn - 7] + *sigma; z__[(*n0 << 2) - 3] = z__[nn - 3] + *sigma; *n0 += -2; goto L10; L50: if (*pp == 2) { *pp = 0; } /* Reverse the qd-array, if warranted. */ if (*dmin__ <= 0. || *n0 < n0in) { if (z__[(*i0 << 2) + *pp - 3] * 1.5 < z__[(*n0 << 2) + *pp - 3]) { ipn4 = *i0 + *n0 << 2; i__1 = *i0 + *n0 - 1 << 1; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { temp = z__[j4 - 3]; z__[j4 - 3] = z__[ipn4 - j4 - 3]; z__[ipn4 - j4 - 3] = temp; temp = z__[j4 - 2]; z__[j4 - 2] = z__[ipn4 - j4 - 2]; z__[ipn4 - j4 - 2] = temp; temp = z__[j4 - 1]; z__[j4 - 1] = z__[ipn4 - j4 - 5]; z__[ipn4 - j4 - 5] = temp; temp = z__[j4]; z__[j4] = z__[ipn4 - j4 - 4]; z__[ipn4 - j4 - 4] = temp; /* L60: */ } if (*n0 - *i0 <= 4) { z__[(*n0 << 2) + *pp - 1] = z__[(*i0 << 2) + *pp - 1]; z__[(*n0 << 2) - *pp] = z__[(*i0 << 2) - *pp]; } /* Computing MIN */ d__1 = *dmin2, d__2 = z__[(*n0 << 2) + *pp - 1]; *dmin2 = min(d__1,d__2); /* Computing MIN */ d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1] , d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; z__[(*n0 << 2) + *pp - 1] = min(d__1,d__2); /* Computing MIN */ d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) - *pp + 4]; z__[(*n0 << 2) - *pp] = min(d__1,d__2); /* Computing MAX */ d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, d__2), d__2 = z__[(*i0 << 2) + *pp + 1]; *qmax = max(d__1,d__2); *dmin__ = -0.; } } /* Choose a shift. */ _starpu_dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, dmin1, dmin2, dn, dn1, dn2, tau, ttype, g); /* Call dqds until DMIN > 0. */ L70: _starpu_dlasq5_(i0, n0, &z__[1], pp, tau, dmin__, dmin1, dmin2, dn, dn1, dn2, ieee); *ndiv += *n0 - *i0 + 2; ++(*iter); /* Check status. */ if (*dmin__ >= 0. && *dmin1 > 0.) { /* Success. */ goto L90; } else if (*dmin__ < 0. && *dmin1 > 0. && z__[(*n0 - 1 << 2) - *pp] < tol * (*sigma + *dn1) && abs(*dn) < tol * *sigma) { /* Convergence hidden by negative DN. */ z__[(*n0 - 1 << 2) - *pp + 2] = 0.; *dmin__ = 0.; goto L90; } else if (*dmin__ < 0.) { /* TAU too big. Select new TAU and try again. */ ++(*nfail); if (*ttype < -22) { /* Failed twice. Play it safe. */ *tau = 0.; } else if (*dmin1 > 0.) { /* Late failure. Gives excellent shift. */ *tau = (*tau + *dmin__) * (1. - eps * 2.); *ttype += -11; } else { /* Early failure. Divide by 4. */ *tau *= .25; *ttype += -12; } goto L70; } else if (_starpu_disnan_(dmin__)) { /* NaN. */ if (*tau == 0.) { goto L80; } else { *tau = 0.; goto L70; } } else { /* Possible underflow. Play it safe. */ goto L80; } /* Risk of underflow. */ L80: _starpu_dlasq6_(i0, n0, &z__[1], pp, dmin__, dmin1, dmin2, dn, dn1, dn2); *ndiv += *n0 - *i0 + 2; ++(*iter); *tau = 0.; L90: if (*tau < *sigma) { *desig += *tau; t = *sigma + *desig; *desig -= t - *sigma; } else { t = *sigma + *tau; *desig = *sigma - (t - *tau) + *desig; } *sigma = t; return 0; /* End of DLASQ3 */ } /* _starpu_dlasq3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasq4.c000066400000000000000000000221161413463044200205400ustar00rootroot00000000000000/* dlasq4.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasq4_(integer *i0, integer *n0, doublereal *z__, integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *tau, integer *ttype, doublereal *g) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal s, a2, b1, b2; integer i4, nn, np; doublereal gam, gap1, gap2; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Osni Marques of the Lawrence Berkeley National -- */ /* -- Laboratory and Beresford Parlett of the Univ. of California at -- */ /* -- Berkeley -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASQ4 computes an approximation TAU to the smallest eigenvalue */ /* using values of d from the previous transform. */ /* I0 (input) INTEGER */ /* First index. */ /* N0 (input) INTEGER */ /* Last index. */ /* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) */ /* Z holds the qd array. */ /* PP (input) INTEGER */ /* PP=0 for ping, PP=1 for pong. */ /* NOIN (input) INTEGER */ /* The value of N0 at start of EIGTEST. */ /* DMIN (input) DOUBLE PRECISION */ /* Minimum value of d. */ /* DMIN1 (input) DOUBLE PRECISION */ /* Minimum value of d, excluding D( N0 ). */ /* DMIN2 (input) DOUBLE PRECISION */ /* Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ /* DN (input) DOUBLE PRECISION */ /* d(N) */ /* DN1 (input) DOUBLE PRECISION */ /* d(N-1) */ /* DN2 (input) DOUBLE PRECISION */ /* d(N-2) */ /* TAU (output) DOUBLE PRECISION */ /* This is the shift. */ /* TTYPE (output) INTEGER */ /* Shift type. */ /* G (input/output) REAL */ /* G is passed as an argument in order to save its value between */ /* calls to DLASQ4. */ /* Further Details */ /* =============== */ /* CNST1 = 9/16 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* A negative DMIN forces the shift to take that absolute value */ /* TTYPE records the type of shift. */ /* Parameter adjustments */ --z__; /* Function Body */ if (*dmin__ <= 0.) { *tau = -(*dmin__); *ttype = -1; return 0; } nn = (*n0 << 2) + *pp; if (*n0in == *n0) { /* No eigenvalues deflated. */ if (*dmin__ == *dn || *dmin__ == *dn1) { b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]); b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]); a2 = z__[nn - 7] + z__[nn - 5]; /* Cases 2 and 3. */ if (*dmin__ == *dn && *dmin1 == *dn1) { gap2 = *dmin2 - a2 - *dmin2 * .25; if (gap2 > 0. && gap2 > b2) { gap1 = a2 - *dn - b2 / gap2 * b2; } else { gap1 = a2 - *dn - (b1 + b2); } if (gap1 > 0. && gap1 > b1) { /* Computing MAX */ d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5; s = max(d__1,d__2); *ttype = -2; } else { s = 0.; if (*dn > b1) { s = *dn - b1; } if (a2 > b1 + b2) { /* Computing MIN */ d__1 = s, d__2 = a2 - (b1 + b2); s = min(d__1,d__2); } /* Computing MAX */ d__1 = s, d__2 = *dmin__ * .333; s = max(d__1,d__2); *ttype = -3; } } else { /* Case 4. */ *ttype = -4; s = *dmin__ * .25; if (*dmin__ == *dn) { gam = *dn; a2 = 0.; if (z__[nn - 5] > z__[nn - 7]) { return 0; } b2 = z__[nn - 5] / z__[nn - 7]; np = nn - 9; } else { np = nn - (*pp << 1); b2 = z__[np - 2]; gam = *dn1; if (z__[np - 4] > z__[np - 2]) { return 0; } a2 = z__[np - 4] / z__[np - 2]; if (z__[nn - 9] > z__[nn - 11]) { return 0; } b2 = z__[nn - 9] / z__[nn - 11]; np = nn - 13; } /* Approximate contribution to norm squared from I < NN-1. */ a2 += b2; i__1 = (*i0 << 2) - 1 + *pp; for (i4 = np; i4 >= i__1; i4 += -4) { if (b2 == 0.) { goto L20; } b1 = b2; if (z__[i4] > z__[i4 - 2]) { return 0; } b2 *= z__[i4] / z__[i4 - 2]; a2 += b2; if (max(b2,b1) * 100. < a2 || .563 < a2) { goto L20; } /* L10: */ } L20: a2 *= 1.05; /* Rayleigh quotient residual bound. */ if (a2 < .563) { s = gam * (1. - sqrt(a2)) / (a2 + 1.); } } } else if (*dmin__ == *dn2) { /* Case 5. */ *ttype = -5; s = *dmin__ * .25; /* Compute contribution to norm squared from I > NN-2. */ np = nn - (*pp << 1); b1 = z__[np - 2]; b2 = z__[np - 6]; gam = *dn2; if (z__[np - 8] > b2 || z__[np - 4] > b1) { return 0; } a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.); /* Approximate contribution to norm squared from I < NN-2. */ if (*n0 - *i0 > 2) { b2 = z__[nn - 13] / z__[nn - 15]; a2 += b2; i__1 = (*i0 << 2) - 1 + *pp; for (i4 = nn - 17; i4 >= i__1; i4 += -4) { if (b2 == 0.) { goto L40; } b1 = b2; if (z__[i4] > z__[i4 - 2]) { return 0; } b2 *= z__[i4] / z__[i4 - 2]; a2 += b2; if (max(b2,b1) * 100. < a2 || .563 < a2) { goto L40; } /* L30: */ } L40: a2 *= 1.05; } if (a2 < .563) { s = gam * (1. - sqrt(a2)) / (a2 + 1.); } } else { /* Case 6, no information to guide us. */ if (*ttype == -6) { *g += (1. - *g) * .333; } else if (*ttype == -18) { *g = .083250000000000005; } else { *g = .25; } s = *g * *dmin__; *ttype = -6; } } else if (*n0in == *n0 + 1) { /* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. */ if (*dmin1 == *dn1 && *dmin2 == *dn2) { /* Cases 7 and 8. */ *ttype = -7; s = *dmin1 * .333; if (z__[nn - 5] > z__[nn - 7]) { return 0; } b1 = z__[nn - 5] / z__[nn - 7]; b2 = b1; if (b2 == 0.) { goto L60; } i__1 = (*i0 << 2) - 1 + *pp; for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { a2 = b1; if (z__[i4] > z__[i4 - 2]) { return 0; } b1 *= z__[i4] / z__[i4 - 2]; b2 += b1; if (max(b1,a2) * 100. < b2) { goto L60; } /* L50: */ } L60: b2 = sqrt(b2 * 1.05); /* Computing 2nd power */ d__1 = b2; a2 = *dmin1 / (d__1 * d__1 + 1.); gap2 = *dmin2 * .5 - a2; if (gap2 > 0. && gap2 > b2 * a2) { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); s = max(d__1,d__2); } else { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - b2 * 1.01); s = max(d__1,d__2); *ttype = -8; } } else { /* Case 9. */ s = *dmin1 * .25; if (*dmin1 == *dn1) { s = *dmin1 * .5; } *ttype = -9; } } else if (*n0in == *n0 + 2) { /* Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. */ /* Cases 10 and 11. */ if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) { *ttype = -10; s = *dmin2 * .333; if (z__[nn - 5] > z__[nn - 7]) { return 0; } b1 = z__[nn - 5] / z__[nn - 7]; b2 = b1; if (b2 == 0.) { goto L80; } i__1 = (*i0 << 2) - 1 + *pp; for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { if (z__[i4] > z__[i4 - 2]) { return 0; } b1 *= z__[i4] / z__[i4 - 2]; b2 += b1; if (b1 * 100. < b2) { goto L80; } /* L70: */ } L80: b2 = sqrt(b2 * 1.05); /* Computing 2nd power */ d__1 = b2; a2 = *dmin2 / (d__1 * d__1 + 1.); gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[ nn - 9]) - a2; if (gap2 > 0. && gap2 > b2 * a2) { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); s = max(d__1,d__2); } else { /* Computing MAX */ d__1 = s, d__2 = a2 * (1. - b2 * 1.01); s = max(d__1,d__2); } } else { s = *dmin2 * .25; *ttype = -11; } } else if (*n0in > *n0 + 2) { /* Case 12, more than two eigenvalues deflated. No information. */ s = 0.; *ttype = -12; } *tau = s; return 0; /* End of DLASQ4 */ } /* _starpu_dlasq4_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasq5.c000066400000000000000000000137521413463044200205470ustar00rootroot00000000000000/* dlasq5.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasq5_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *tau, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2, logical *ieee) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ doublereal d__; integer j4, j4p2; doublereal emin, temp; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Osni Marques of the Lawrence Berkeley National -- */ /* -- Laboratory and Beresford Parlett of the Univ. of California at -- */ /* -- Berkeley -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASQ5 computes one dqds transform in ping-pong form, one */ /* version for IEEE machines another for non IEEE machines. */ /* Arguments */ /* ========= */ /* I0 (input) INTEGER */ /* First index. */ /* N0 (input) INTEGER */ /* Last index. */ /* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) */ /* Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */ /* an extra argument. */ /* PP (input) INTEGER */ /* PP=0 for ping, PP=1 for pong. */ /* TAU (input) DOUBLE PRECISION */ /* This is the shift. */ /* DMIN (output) DOUBLE PRECISION */ /* Minimum value of d. */ /* DMIN1 (output) DOUBLE PRECISION */ /* Minimum value of d, excluding D( N0 ). */ /* DMIN2 (output) DOUBLE PRECISION */ /* Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ /* DN (output) DOUBLE PRECISION */ /* d(N0), the last value of d. */ /* DNM1 (output) DOUBLE PRECISION */ /* d(N0-1). */ /* DNM2 (output) DOUBLE PRECISION */ /* d(N0-2). */ /* IEEE (input) LOGICAL */ /* Flag for IEEE or non IEEE arithmetic. */ /* ===================================================================== */ /* .. Parameter .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --z__; /* Function Body */ if (*n0 - *i0 - 1 <= 0) { return 0; } j4 = (*i0 << 2) + *pp - 3; emin = z__[j4 + 4]; d__ = z__[j4] - *tau; *dmin__ = d__; *dmin1 = -z__[j4]; if (*ieee) { /* Code for IEEE arithmetic. */ if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; temp = z__[j4 + 1] / z__[j4 - 2]; d__ = d__ * temp - *tau; *dmin__ = min(*dmin__,d__); z__[j4] = z__[j4 - 1] * temp; /* Computing MIN */ d__1 = z__[j4]; emin = min(d__1,emin); /* L10: */ } } else { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 3] = d__ + z__[j4]; temp = z__[j4 + 2] / z__[j4 - 3]; d__ = d__ * temp - *tau; *dmin__ = min(*dmin__,d__); z__[j4 - 1] = z__[j4] * temp; /* Computing MIN */ d__1 = z__[j4 - 1]; emin = min(d__1,emin); /* L20: */ } } /* Unroll last two steps. */ *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; *dmin__ = min(*dmin__,*dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; *dmin__ = min(*dmin__,*dn); } else { /* Code for non IEEE arithmetic. */ if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; if (d__ < 0.) { return 0; } else { z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4]; emin = min(d__1,d__2); /* L30: */ } } else { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 3] = d__ + z__[j4]; if (d__ < 0.) { return 0; } else { z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4 - 1]; emin = min(d__1,d__2); /* L40: */ } } /* Unroll last two steps. */ *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; if (*dnm2 < 0.) { return 0; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; } *dmin__ = min(*dmin__,*dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; if (*dnm1 < 0.) { return 0; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; } *dmin__ = min(*dmin__,*dn); } z__[j4 + 2] = *dn; z__[(*n0 << 2) - *pp] = emin; return 0; /* End of DLASQ5 */ } /* _starpu_dlasq5_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasq6.c000066400000000000000000000132011413463044200205350ustar00rootroot00000000000000/* dlasq6.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasq6_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ doublereal d__; integer j4, j4p2; doublereal emin, temp; extern doublereal _starpu_dlamch_(char *); doublereal safmin; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Osni Marques of the Lawrence Berkeley National -- */ /* -- Laboratory and Beresford Parlett of the Univ. of California at -- */ /* -- Berkeley -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASQ6 computes one dqd (shift equal to zero) transform in */ /* ping-pong form, with protection against underflow and overflow. */ /* Arguments */ /* ========= */ /* I0 (input) INTEGER */ /* First index. */ /* N0 (input) INTEGER */ /* Last index. */ /* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) */ /* Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */ /* an extra argument. */ /* PP (input) INTEGER */ /* PP=0 for ping, PP=1 for pong. */ /* DMIN (output) DOUBLE PRECISION */ /* Minimum value of d. */ /* DMIN1 (output) DOUBLE PRECISION */ /* Minimum value of d, excluding D( N0 ). */ /* DMIN2 (output) DOUBLE PRECISION */ /* Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ /* DN (output) DOUBLE PRECISION */ /* d(N0), the last value of d. */ /* DNM1 (output) DOUBLE PRECISION */ /* d(N0-1). */ /* DNM2 (output) DOUBLE PRECISION */ /* d(N0-2). */ /* ===================================================================== */ /* .. Parameter .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Function .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --z__; /* Function Body */ if (*n0 - *i0 - 1 <= 0) { return 0; } safmin = _starpu_dlamch_("Safe minimum"); j4 = (*i0 << 2) + *pp - 3; emin = z__[j4 + 4]; d__ = z__[j4]; *dmin__ = d__; if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; if (z__[j4 - 2] == 0.) { z__[j4] = 0.; d__ = z__[j4 + 1]; *dmin__ = d__; emin = 0.; } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4 + 1]) { temp = z__[j4 + 1] / z__[j4 - 2]; z__[j4] = z__[j4 - 1] * temp; d__ *= temp; } else { z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]); } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4]; emin = min(d__1,d__2); /* L10: */ } } else { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 3] = d__ + z__[j4]; if (z__[j4 - 3] == 0.) { z__[j4 - 1] = 0.; d__ = z__[j4 + 2]; *dmin__ = d__; emin = 0.; } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 - 3] < z__[j4 + 2]) { temp = z__[j4 + 2] / z__[j4 - 3]; z__[j4 - 1] = z__[j4] * temp; d__ *= temp; } else { z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]); } *dmin__ = min(*dmin__,d__); /* Computing MIN */ d__1 = emin, d__2 = z__[j4 - 1]; emin = min(d__1,d__2); /* L20: */ } } /* Unroll last two steps. */ *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; if (z__[j4 - 2] == 0.) { z__[j4] = 0.; *dnm1 = z__[j4p2 + 2]; *dmin__ = *dnm1; emin = 0.; } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4p2 + 2]) { temp = z__[j4p2 + 2] / z__[j4 - 2]; z__[j4] = z__[j4p2] * temp; *dnm1 = *dnm2 * temp; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]); } *dmin__ = min(*dmin__,*dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; if (z__[j4 - 2] == 0.) { z__[j4] = 0.; *dn = z__[j4p2 + 2]; *dmin__ = *dn; emin = 0.; } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4p2 + 2]) { temp = z__[j4p2 + 2] / z__[j4 - 2]; z__[j4] = z__[j4p2] * temp; *dn = *dnm1 * temp; } else { z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]); } *dmin__ = min(*dmin__,*dn); z__[j4 + 2] = *dn; z__[(*n0 << 2) - *pp] = emin; return 0; /* End of DLASQ6 */ } /* _starpu_dlasq6_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasr.c000066400000000000000000000322431413463044200204570ustar00rootroot00000000000000/* dlasr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, info; doublereal temp; extern logical _starpu_lsame_(char *, char *); doublereal ctemp, stemp; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASR applies a sequence of plane rotations to a real matrix A, */ /* from either the left or the right. */ /* When SIDE = 'L', the transformation takes the form */ /* A := P*A */ /* and when SIDE = 'R', the transformation takes the form */ /* A := A*P**T */ /* where P is an orthogonal matrix consisting of a sequence of z plane */ /* rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', */ /* and P**T is the transpose of P. */ /* When DIRECT = 'F' (Forward sequence), then */ /* P = P(z-1) * ... * P(2) * P(1) */ /* and when DIRECT = 'B' (Backward sequence), then */ /* P = P(1) * P(2) * ... * P(z-1) */ /* where P(k) is a plane rotation matrix defined by the 2-by-2 rotation */ /* R(k) = ( c(k) s(k) ) */ /* = ( -s(k) c(k) ). */ /* When PIVOT = 'V' (Variable pivot), the rotation is performed */ /* for the plane (k,k+1), i.e., P(k) has the form */ /* P(k) = ( 1 ) */ /* ( ... ) */ /* ( 1 ) */ /* ( c(k) s(k) ) */ /* ( -s(k) c(k) ) */ /* ( 1 ) */ /* ( ... ) */ /* ( 1 ) */ /* where R(k) appears as a rank-2 modification to the identity matrix in */ /* rows and columns k and k+1. */ /* When PIVOT = 'T' (Top pivot), the rotation is performed for the */ /* plane (1,k+1), so P(k) has the form */ /* P(k) = ( c(k) s(k) ) */ /* ( 1 ) */ /* ( ... ) */ /* ( 1 ) */ /* ( -s(k) c(k) ) */ /* ( 1 ) */ /* ( ... ) */ /* ( 1 ) */ /* where R(k) appears in rows and columns 1 and k+1. */ /* Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is */ /* performed for the plane (k,z), giving P(k) the form */ /* P(k) = ( 1 ) */ /* ( ... ) */ /* ( 1 ) */ /* ( c(k) s(k) ) */ /* ( 1 ) */ /* ( ... ) */ /* ( 1 ) */ /* ( -s(k) c(k) ) */ /* where R(k) appears in rows and columns k and z. The rotations are */ /* performed without ever forming P(k) explicitly. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* Specifies whether the plane rotation matrix P is applied to */ /* A on the left or the right. */ /* = 'L': Left, compute A := P*A */ /* = 'R': Right, compute A:= A*P**T */ /* PIVOT (input) CHARACTER*1 */ /* Specifies the plane for which P(k) is a plane rotation */ /* matrix. */ /* = 'V': Variable pivot, the plane (k,k+1) */ /* = 'T': Top pivot, the plane (1,k+1) */ /* = 'B': Bottom pivot, the plane (k,z) */ /* DIRECT (input) CHARACTER*1 */ /* Specifies whether P is a forward or backward sequence of */ /* plane rotations. */ /* = 'F': Forward, P = P(z-1)*...*P(2)*P(1) */ /* = 'B': Backward, P = P(1)*P(2)*...*P(z-1) */ /* M (input) INTEGER */ /* The number of rows of the matrix A. If m <= 1, an immediate */ /* return is effected. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. If n <= 1, an */ /* immediate return is effected. */ /* C (input) DOUBLE PRECISION array, dimension */ /* (M-1) if SIDE = 'L' */ /* (N-1) if SIDE = 'R' */ /* The cosines c(k) of the plane rotations. */ /* S (input) DOUBLE PRECISION array, dimension */ /* (M-1) if SIDE = 'L' */ /* (N-1) if SIDE = 'R' */ /* The sines s(k) of the plane rotations. The 2-by-2 plane */ /* rotation part of the matrix P(k), R(k), has the form */ /* R(k) = ( c(k) s(k) ) */ /* ( -s(k) c(k) ). */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* The M-by-N matrix A. On exit, A is overwritten by P*A if */ /* SIDE = 'R' or by A*P**T if SIDE = 'L'. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ --c__; --s; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ info = 0; if (! (_starpu_lsame_(side, "L") || _starpu_lsame_(side, "R"))) { info = 1; } else if (! (_starpu_lsame_(pivot, "V") || _starpu_lsame_(pivot, "T") || _starpu_lsame_(pivot, "B"))) { info = 2; } else if (! (_starpu_lsame_(direct, "F") || _starpu_lsame_(direct, "B"))) { info = 3; } else if (*m < 0) { info = 4; } else if (*n < 0) { info = 5; } else if (*lda < max(1,*m)) { info = 9; } if (info != 0) { _starpu_xerbla_("DLASR ", &info); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } if (_starpu_lsame_(side, "L")) { /* Form P * A */ if (_starpu_lsame_(pivot, "V")) { if (_starpu_lsame_(direct, "F")) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[j + 1 + i__ * a_dim1]; a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * a[j + i__ * a_dim1]; a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + i__ * a_dim1]; /* L10: */ } } /* L20: */ } } else if (_starpu_lsame_(direct, "B")) { for (j = *m - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[j + 1 + i__ * a_dim1]; a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * a[j + i__ * a_dim1]; a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + i__ * a_dim1]; /* L30: */ } } /* L40: */ } } } else if (_starpu_lsame_(pivot, "T")) { if (_starpu_lsame_(direct, "F")) { i__1 = *m; for (j = 2; j <= i__1; ++j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[j + i__ * a_dim1]; a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ i__ * a_dim1 + 1]; a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ i__ * a_dim1 + 1]; /* L50: */ } } /* L60: */ } } else if (_starpu_lsame_(direct, "B")) { for (j = *m; j >= 2; --j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[j + i__ * a_dim1]; a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ i__ * a_dim1 + 1]; a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ i__ * a_dim1 + 1]; /* L70: */ } } /* L80: */ } } } else if (_starpu_lsame_(pivot, "B")) { if (_starpu_lsame_(direct, "F")) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[j + i__ * a_dim1]; a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + ctemp * temp; a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * a_dim1] - stemp * temp; /* L90: */ } } /* L100: */ } } else if (_starpu_lsame_(direct, "B")) { for (j = *m - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[j + i__ * a_dim1]; a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + ctemp * temp; a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * a_dim1] - stemp * temp; /* L110: */ } } /* L120: */ } } } } else if (_starpu_lsame_(side, "R")) { /* Form A * P' */ if (_starpu_lsame_(pivot, "V")) { if (_starpu_lsame_(direct, "F")) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + (j + 1) * a_dim1]; a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ i__ + j * a_dim1]; /* L130: */ } } /* L140: */ } } else if (_starpu_lsame_(direct, "B")) { for (j = *n - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[i__ + (j + 1) * a_dim1]; a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ i__ + j * a_dim1]; /* L150: */ } } /* L160: */ } } } else if (_starpu_lsame_(pivot, "T")) { if (_starpu_lsame_(direct, "F")) { i__1 = *n; for (j = 2; j <= i__1; ++j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ i__ + a_dim1]; a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + a_dim1]; /* L170: */ } } /* L180: */ } } else if (_starpu_lsame_(direct, "B")) { for (j = *n; j >= 2; --j) { ctemp = c__[j - 1]; stemp = s[j - 1]; if (ctemp != 1. || stemp != 0.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ i__ + a_dim1]; a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + a_dim1]; /* L190: */ } } /* L200: */ } } } else if (_starpu_lsame_(pivot, "B")) { if (_starpu_lsame_(direct, "F")) { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + ctemp * temp; a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * a_dim1] - stemp * temp; /* L210: */ } } /* L220: */ } } else if (_starpu_lsame_(direct, "B")) { for (j = *n - 1; j >= 1; --j) { ctemp = c__[j]; stemp = s[j]; if (ctemp != 1. || stemp != 0.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + ctemp * temp; a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * a_dim1] - stemp * temp; /* L230: */ } } /* L240: */ } } } } return 0; /* End of DLASR */ } /* _starpu_dlasr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasrt.c000066400000000000000000000135471413463044200206510ustar00rootroot00000000000000/* dlasrt.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlasrt_(char *id, integer *n, doublereal *d__, integer * info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, j; doublereal d1, d2, d3; integer dir; doublereal tmp; integer endd; extern logical _starpu_lsame_(char *, char *); integer stack[64] /* was [2][32] */; doublereal dmnmx; integer start; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer stkpnt; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Sort the numbers in D in increasing order (if ID = 'I') or */ /* in decreasing order (if ID = 'D' ). */ /* Use Quick Sort, reverting to Insertion sort on arrays of */ /* size <= 20. Dimension of STACK limits N to about 2**32. */ /* Arguments */ /* ========= */ /* ID (input) CHARACTER*1 */ /* = 'I': sort D in increasing order; */ /* = 'D': sort D in decreasing order. */ /* N (input) INTEGER */ /* The length of the array D. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the array to be sorted. */ /* On exit, D has been sorted into increasing order */ /* (D(1) <= ... <= D(N) ) or into decreasing order */ /* (D(1) >= ... >= D(N) ), depending on ID. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input paramters. */ /* Parameter adjustments */ --d__; /* Function Body */ *info = 0; dir = -1; if (_starpu_lsame_(id, "D")) { dir = 0; } else if (_starpu_lsame_(id, "I")) { dir = 1; } if (dir == -1) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLASRT", &i__1); return 0; } /* Quick return if possible */ if (*n <= 1) { return 0; } stkpnt = 1; stack[0] = 1; stack[1] = *n; L10: start = stack[(stkpnt << 1) - 2]; endd = stack[(stkpnt << 1) - 1]; --stkpnt; if (endd - start <= 20 && endd - start > 0) { /* Do Insertion sort on D( START:ENDD ) */ if (dir == 0) { /* Sort into decreasing order */ i__1 = endd; for (i__ = start + 1; i__ <= i__1; ++i__) { i__2 = start + 1; for (j = i__; j >= i__2; --j) { if (d__[j] > d__[j - 1]) { dmnmx = d__[j]; d__[j] = d__[j - 1]; d__[j - 1] = dmnmx; } else { goto L30; } /* L20: */ } L30: ; } } else { /* Sort into increasing order */ i__1 = endd; for (i__ = start + 1; i__ <= i__1; ++i__) { i__2 = start + 1; for (j = i__; j >= i__2; --j) { if (d__[j] < d__[j - 1]) { dmnmx = d__[j]; d__[j] = d__[j - 1]; d__[j - 1] = dmnmx; } else { goto L50; } /* L40: */ } L50: ; } } } else if (endd - start > 20) { /* Partition D( START:ENDD ) and stack parts, largest one first */ /* Choose partition entry as median of 3 */ d1 = d__[start]; d2 = d__[endd]; i__ = (start + endd) / 2; d3 = d__[i__]; if (d1 < d2) { if (d3 < d1) { dmnmx = d1; } else if (d3 < d2) { dmnmx = d3; } else { dmnmx = d2; } } else { if (d3 < d2) { dmnmx = d2; } else if (d3 < d1) { dmnmx = d3; } else { dmnmx = d1; } } if (dir == 0) { /* Sort into decreasing order */ i__ = start - 1; j = endd + 1; L60: L70: --j; if (d__[j] < dmnmx) { goto L70; } L80: ++i__; if (d__[i__] > dmnmx) { goto L80; } if (i__ < j) { tmp = d__[i__]; d__[i__] = d__[j]; d__[j] = tmp; goto L60; } if (j - start > endd - j - 1) { ++stkpnt; stack[(stkpnt << 1) - 2] = start; stack[(stkpnt << 1) - 1] = j; ++stkpnt; stack[(stkpnt << 1) - 2] = j + 1; stack[(stkpnt << 1) - 1] = endd; } else { ++stkpnt; stack[(stkpnt << 1) - 2] = j + 1; stack[(stkpnt << 1) - 1] = endd; ++stkpnt; stack[(stkpnt << 1) - 2] = start; stack[(stkpnt << 1) - 1] = j; } } else { /* Sort into increasing order */ i__ = start - 1; j = endd + 1; L90: L100: --j; if (d__[j] > dmnmx) { goto L100; } L110: ++i__; if (d__[i__] < dmnmx) { goto L110; } if (i__ < j) { tmp = d__[i__]; d__[i__] = d__[j]; d__[j] = tmp; goto L90; } if (j - start > endd - j - 1) { ++stkpnt; stack[(stkpnt << 1) - 2] = start; stack[(stkpnt << 1) - 1] = j; ++stkpnt; stack[(stkpnt << 1) - 2] = j + 1; stack[(stkpnt << 1) - 1] = endd; } else { ++stkpnt; stack[(stkpnt << 1) - 2] = j + 1; stack[(stkpnt << 1) - 1] = endd; ++stkpnt; stack[(stkpnt << 1) - 2] = start; stack[(stkpnt << 1) - 1] = j; } } } if (stkpnt > 0) { goto L10; } return 0; /* End of DLASRT */ } /* _starpu_dlasrt_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlassq.c000066400000000000000000000064141413463044200206420ustar00rootroot00000000000000/* dlassq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlassq_(integer *n, doublereal *x, integer *incx, doublereal *scale, doublereal *sumsq) { /* System generated locals */ integer i__1, i__2; doublereal d__1; /* Local variables */ integer ix; doublereal absxi; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASSQ returns the values scl and smsq such that */ /* ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ /* where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is */ /* assumed to be non-negative and scl returns the value */ /* scl = max( scale, abs( x( i ) ) ). */ /* scale and sumsq must be supplied in SCALE and SUMSQ and */ /* scl and smsq are overwritten on SCALE and SUMSQ respectively. */ /* The routine makes only one pass through the vector x. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of elements to be used from the vector X. */ /* X (input) DOUBLE PRECISION array, dimension (N) */ /* The vector for which a scaled sum of squares is computed. */ /* x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ /* INCX (input) INTEGER */ /* The increment between successive values of the vector X. */ /* INCX > 0. */ /* SCALE (input/output) DOUBLE PRECISION */ /* On entry, the value scale in the equation above. */ /* On exit, SCALE is overwritten with scl , the scaling factor */ /* for the sum of squares. */ /* SUMSQ (input/output) DOUBLE PRECISION */ /* On entry, the value sumsq in the equation above. */ /* On exit, SUMSQ is overwritten with smsq , the basic sum of */ /* squares from which scl has been factored out. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --x; /* Function Body */ if (*n > 0) { i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { if (x[ix] != 0.) { absxi = (d__1 = x[ix], abs(d__1)); if (*scale < absxi) { /* Computing 2nd power */ d__1 = *scale / absxi; *sumsq = *sumsq * (d__1 * d__1) + 1; *scale = absxi; } else { /* Computing 2nd power */ d__1 = absxi / *scale; *sumsq += d__1 * d__1; } } /* L10: */ } } return 0; /* End of DLASSQ */ } /* _starpu_dlassq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasv2.c000066400000000000000000000151231413463044200205430ustar00rootroot00000000000000/* dlasv2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b3 = 2.; static doublereal c_b4 = 1.; /* Subroutine */ int _starpu_dlasv2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * csr, doublereal *snl, doublereal *csl) { /* System generated locals */ doublereal d__1; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, crt, slt, srt; integer pmax; doublereal temp; logical swap; doublereal tsign; extern doublereal _starpu_dlamch_(char *); logical gasmal; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASV2 computes the singular value decomposition of a 2-by-2 */ /* triangular matrix */ /* [ F G ] */ /* [ 0 H ]. */ /* On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the */ /* smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and */ /* right singular vectors for abs(SSMAX), giving the decomposition */ /* [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ] */ /* [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ]. */ /* Arguments */ /* ========= */ /* F (input) DOUBLE PRECISION */ /* The (1,1) element of the 2-by-2 matrix. */ /* G (input) DOUBLE PRECISION */ /* The (1,2) element of the 2-by-2 matrix. */ /* H (input) DOUBLE PRECISION */ /* The (2,2) element of the 2-by-2 matrix. */ /* SSMIN (output) DOUBLE PRECISION */ /* abs(SSMIN) is the smaller singular value. */ /* SSMAX (output) DOUBLE PRECISION */ /* abs(SSMAX) is the larger singular value. */ /* SNL (output) DOUBLE PRECISION */ /* CSL (output) DOUBLE PRECISION */ /* The vector (CSL, SNL) is a unit left singular vector for the */ /* singular value abs(SSMAX). */ /* SNR (output) DOUBLE PRECISION */ /* CSR (output) DOUBLE PRECISION */ /* The vector (CSR, SNR) is a unit right singular vector for the */ /* singular value abs(SSMAX). */ /* Further Details */ /* =============== */ /* Any input parameter may be aliased with any output parameter. */ /* Barring over/underflow and assuming a guard digit in subtraction, all */ /* output quantities are correct to within a few units in the last */ /* place (ulps). */ /* In IEEE arithmetic, the code works correctly if one matrix element is */ /* infinite. */ /* Overflow will not occur unless the largest singular value itself */ /* overflows or is within a few ulps of overflow. (On machines with */ /* partial overflow, like the Cray, overflow may occur if the largest */ /* singular value is within a factor of 2 of overflow.) */ /* Underflow is harmless if underflow is gradual. Otherwise, results */ /* may correspond to a matrix modified by perturbations of size near */ /* the underflow threshold. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ ft = *f; fa = abs(ft); ht = *h__; ha = abs(*h__); /* PMAX points to the maximum absolute element of matrix */ /* PMAX = 1 if F largest in absolute values */ /* PMAX = 2 if G largest in absolute values */ /* PMAX = 3 if H largest in absolute values */ pmax = 1; swap = ha > fa; if (swap) { pmax = 3; temp = ft; ft = ht; ht = temp; temp = fa; fa = ha; ha = temp; /* Now FA .ge. HA */ } gt = *g; ga = abs(gt); if (ga == 0.) { /* Diagonal matrix */ *ssmin = ha; *ssmax = fa; clt = 1.; crt = 1.; slt = 0.; srt = 0.; } else { gasmal = TRUE_; if (ga > fa) { pmax = 2; if (fa / ga < _starpu_dlamch_("EPS")) { /* Case of very large GA */ gasmal = FALSE_; *ssmax = ga; if (ha > 1.) { *ssmin = fa / (ga / ha); } else { *ssmin = fa / ga * ha; } clt = 1.; slt = ht / gt; srt = 1.; crt = ft / gt; } } if (gasmal) { /* Normal case */ d__ = fa - ha; if (d__ == fa) { /* Copes with infinite F or H */ l = 1.; } else { l = d__ / fa; } /* Note that 0 .le. L .le. 1 */ m = gt / ft; /* Note that abs(M) .le. 1/macheps */ t = 2. - l; /* Note that T .ge. 1 */ mm = m * m; tt = t * t; s = sqrt(tt + mm); /* Note that 1 .le. S .le. 1 + 1/macheps */ if (l == 0.) { r__ = abs(m); } else { r__ = sqrt(l * l + mm); } /* Note that 0 .le. R .le. 1 + 1/macheps */ a = (s + r__) * .5; /* Note that 1 .le. A .le. 1 + abs(M) */ *ssmin = ha / a; *ssmax = fa * a; if (mm == 0.) { /* Note that M is very tiny */ if (l == 0.) { t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >); } else { t = gt / d_sign(&d__, &ft) + m / t; } } else { t = (m / (s + t) + m / (r__ + l)) * (a + 1.); } l = sqrt(t * t + 4.); crt = 2. / l; srt = t / l; clt = (crt + srt * m) / a; slt = ht / ft * srt / a; } } if (swap) { *csl = srt; *snl = crt; *csr = slt; *snr = clt; } else { *csl = clt; *snl = slt; *csr = crt; *snr = srt; } /* Correct signs of SSMAX and SSMIN */ if (pmax == 1) { tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f); } if (pmax == 2) { tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g); } if (pmax == 3) { tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__); } *ssmax = d_sign(ssmax, &tsign); d__1 = tsign * d_sign(&c_b4, f) * d_sign(&c_b4, h__); *ssmin = d_sign(ssmin, &d__1); return 0; /* End of DLASV2 */ } /* _starpu_dlasv2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlaswp.c000066400000000000000000000077251413463044200206530ustar00rootroot00000000000000/* dlaswp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlaswp_(integer *n, doublereal *a, integer *lda, integer *k1, integer *k2, integer *ipiv, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, k, i1, i2, n32, ip, ix, ix0, inc; doublereal temp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASWP performs a series of row interchanges on the matrix A. */ /* One row interchange is initiated for each of rows K1 through K2 of A. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the matrix of column dimension N to which the row */ /* interchanges will be applied. */ /* On exit, the permuted matrix. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* K1 (input) INTEGER */ /* The first element of IPIV for which a row interchange will */ /* be done. */ /* K2 (input) INTEGER */ /* The last element of IPIV for which a row interchange will */ /* be done. */ /* IPIV (input) INTEGER array, dimension (K2*abs(INCX)) */ /* The vector of pivot indices. Only the elements in positions */ /* K1 through K2 of IPIV are accessed. */ /* IPIV(K) = L implies rows K and L are to be interchanged. */ /* INCX (input) INTEGER */ /* The increment between successive values of IPIV. If IPIV */ /* is negative, the pivots are applied in reverse order. */ /* Further Details */ /* =============== */ /* Modified by */ /* R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Interchange row I with row IPIV(I) for each of rows K1 through K2. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ if (*incx > 0) { ix0 = *k1; i1 = *k1; i2 = *k2; inc = 1; } else if (*incx < 0) { ix0 = (1 - *k2) * *incx + 1; i1 = *k2; i2 = *k1; inc = -1; } else { return 0; } n32 = *n / 32 << 5; if (n32 != 0) { i__1 = n32; for (j = 1; j <= i__1; j += 32) { ix = ix0; i__2 = i2; i__3 = inc; for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { ip = ipiv[ix]; if (ip != i__) { i__4 = j + 31; for (k = j; k <= i__4; ++k) { temp = a[i__ + k * a_dim1]; a[i__ + k * a_dim1] = a[ip + k * a_dim1]; a[ip + k * a_dim1] = temp; /* L10: */ } } ix += *incx; /* L20: */ } /* L30: */ } } if (n32 != *n) { ++n32; ix = ix0; i__1 = i2; i__3 = inc; for (i__ = i1; i__3 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__3) { ip = ipiv[ix]; if (ip != i__) { i__2 = *n; for (k = n32; k <= i__2; ++k) { temp = a[i__ + k * a_dim1]; a[i__ + k * a_dim1] = a[ip + k * a_dim1]; a[ip + k * a_dim1] = temp; /* L40: */ } } ix += *incx; /* L50: */ } } return 0; /* End of DLASWP */ } /* _starpu_dlaswp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasy2.c000066400000000000000000000342021413463044200205450ustar00rootroot00000000000000/* dlasy2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__4 = 4; static integer c__1 = 1; static integer c__16 = 16; static integer c__0 = 0; /* Subroutine */ int _starpu_dlasy2_(logical *ltranl, logical *ltranr, integer *isgn, integer *n1, integer *n2, doublereal *tl, integer *ldtl, doublereal * tr, integer *ldtr, doublereal *b, integer *ldb, doublereal *scale, doublereal *x, integer *ldx, doublereal *xnorm, integer *info) { /* Initialized data */ static integer locu12[4] = { 3,4,1,2 }; static integer locl21[4] = { 2,1,4,3 }; static integer locu22[4] = { 4,3,2,1 }; static logical xswpiv[4] = { FALSE_,FALSE_,TRUE_,TRUE_ }; static logical bswpiv[4] = { FALSE_,TRUE_,FALSE_,TRUE_ }; /* System generated locals */ integer b_dim1, b_offset, tl_dim1, tl_offset, tr_dim1, tr_offset, x_dim1, x_offset; doublereal d__1, d__2, d__3, d__4, d__5, d__6, d__7, d__8; /* Local variables */ integer i__, j, k; doublereal x2[2], l21, u11, u12; integer ip, jp; doublereal u22, t16[16] /* was [4][4] */, gam, bet, eps, sgn, tmp[4], tau1, btmp[4], smin; integer ipiv; doublereal temp; integer jpiv[4]; doublereal xmax; integer ipsv, jpsv; logical bswap; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical xswap; extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASY2 solves for the N1 by N2 matrix X, 1 <= N1,N2 <= 2, in */ /* op(TL)*X + ISGN*X*op(TR) = SCALE*B, */ /* where TL is N1 by N1, TR is N2 by N2, B is N1 by N2, and ISGN = 1 or */ /* -1. op(T) = T or T', where T' denotes the transpose of T. */ /* Arguments */ /* ========= */ /* LTRANL (input) LOGICAL */ /* On entry, LTRANL specifies the op(TL): */ /* = .FALSE., op(TL) = TL, */ /* = .TRUE., op(TL) = TL'. */ /* LTRANR (input) LOGICAL */ /* On entry, LTRANR specifies the op(TR): */ /* = .FALSE., op(TR) = TR, */ /* = .TRUE., op(TR) = TR'. */ /* ISGN (input) INTEGER */ /* On entry, ISGN specifies the sign of the equation */ /* as described before. ISGN may only be 1 or -1. */ /* N1 (input) INTEGER */ /* On entry, N1 specifies the order of matrix TL. */ /* N1 may only be 0, 1 or 2. */ /* N2 (input) INTEGER */ /* On entry, N2 specifies the order of matrix TR. */ /* N2 may only be 0, 1 or 2. */ /* TL (input) DOUBLE PRECISION array, dimension (LDTL,2) */ /* On entry, TL contains an N1 by N1 matrix. */ /* LDTL (input) INTEGER */ /* The leading dimension of the matrix TL. LDTL >= max(1,N1). */ /* TR (input) DOUBLE PRECISION array, dimension (LDTR,2) */ /* On entry, TR contains an N2 by N2 matrix. */ /* LDTR (input) INTEGER */ /* The leading dimension of the matrix TR. LDTR >= max(1,N2). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,2) */ /* On entry, the N1 by N2 matrix B contains the right-hand */ /* side of the equation. */ /* LDB (input) INTEGER */ /* The leading dimension of the matrix B. LDB >= max(1,N1). */ /* SCALE (output) DOUBLE PRECISION */ /* On exit, SCALE contains the scale factor. SCALE is chosen */ /* less than or equal to 1 to prevent the solution overflowing. */ /* X (output) DOUBLE PRECISION array, dimension (LDX,2) */ /* On exit, X contains the N1 by N2 solution. */ /* LDX (input) INTEGER */ /* The leading dimension of the matrix X. LDX >= max(1,N1). */ /* XNORM (output) DOUBLE PRECISION */ /* On exit, XNORM is the infinity-norm of the solution. */ /* INFO (output) INTEGER */ /* On exit, INFO is set to */ /* 0: successful exit. */ /* 1: TL and TR have too close eigenvalues, so TL or */ /* TR is perturbed to get a nonsingular equation. */ /* NOTE: In the interests of speed, this routine does not */ /* check the inputs for errors. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ tl_dim1 = *ldtl; tl_offset = 1 + tl_dim1; tl -= tl_offset; tr_dim1 = *ldtr; tr_offset = 1 + tr_dim1; tr -= tr_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; /* Function Body */ /* .. */ /* .. Executable Statements .. */ /* Do not check the input parameters for errors */ *info = 0; /* Quick return if possible */ if (*n1 == 0 || *n2 == 0) { return 0; } /* Set constants to control overflow */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; sgn = (doublereal) (*isgn); k = *n1 + *n1 + *n2 - 2; switch (k) { case 1: goto L10; case 2: goto L20; case 3: goto L30; case 4: goto L50; } /* 1 by 1: TL11*X + SGN*X*TR11 = B11 */ L10: tau1 = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; bet = abs(tau1); if (bet <= smlnum) { tau1 = smlnum; bet = smlnum; *info = 1; } *scale = 1.; gam = (d__1 = b[b_dim1 + 1], abs(d__1)); if (smlnum * gam > bet) { *scale = 1. / gam; } x[x_dim1 + 1] = b[b_dim1 + 1] * *scale / tau1; *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)); return 0; /* 1 by 2: */ /* TL11*[X11 X12] + ISGN*[X11 X12]*op[TR11 TR12] = [B11 B12] */ /* [TR21 TR22] */ L20: /* Computing MAX */ /* Computing MAX */ d__7 = (d__1 = tl[tl_dim1 + 1], abs(d__1)), d__8 = (d__2 = tr[tr_dim1 + 1] , abs(d__2)), d__7 = max(d__7,d__8), d__8 = (d__3 = tr[(tr_dim1 << 1) + 1], abs(d__3)), d__7 = max(d__7,d__8), d__8 = (d__4 = tr[ tr_dim1 + 2], abs(d__4)), d__7 = max(d__7,d__8), d__8 = (d__5 = tr[(tr_dim1 << 1) + 2], abs(d__5)); d__6 = eps * max(d__7,d__8); smin = max(d__6,smlnum); tmp[0] = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; tmp[3] = tl[tl_dim1 + 1] + sgn * tr[(tr_dim1 << 1) + 2]; if (*ltranr) { tmp[1] = sgn * tr[tr_dim1 + 2]; tmp[2] = sgn * tr[(tr_dim1 << 1) + 1]; } else { tmp[1] = sgn * tr[(tr_dim1 << 1) + 1]; tmp[2] = sgn * tr[tr_dim1 + 2]; } btmp[0] = b[b_dim1 + 1]; btmp[1] = b[(b_dim1 << 1) + 1]; goto L40; /* 2 by 1: */ /* op[TL11 TL12]*[X11] + ISGN* [X11]*TR11 = [B11] */ /* [TL21 TL22] [X21] [X21] [B21] */ L30: /* Computing MAX */ /* Computing MAX */ d__7 = (d__1 = tr[tr_dim1 + 1], abs(d__1)), d__8 = (d__2 = tl[tl_dim1 + 1] , abs(d__2)), d__7 = max(d__7,d__8), d__8 = (d__3 = tl[(tl_dim1 << 1) + 1], abs(d__3)), d__7 = max(d__7,d__8), d__8 = (d__4 = tl[ tl_dim1 + 2], abs(d__4)), d__7 = max(d__7,d__8), d__8 = (d__5 = tl[(tl_dim1 << 1) + 2], abs(d__5)); d__6 = eps * max(d__7,d__8); smin = max(d__6,smlnum); tmp[0] = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; tmp[3] = tl[(tl_dim1 << 1) + 2] + sgn * tr[tr_dim1 + 1]; if (*ltranl) { tmp[1] = tl[(tl_dim1 << 1) + 1]; tmp[2] = tl[tl_dim1 + 2]; } else { tmp[1] = tl[tl_dim1 + 2]; tmp[2] = tl[(tl_dim1 << 1) + 1]; } btmp[0] = b[b_dim1 + 1]; btmp[1] = b[b_dim1 + 2]; L40: /* Solve 2 by 2 system using complete pivoting. */ /* Set pivots less than SMIN to SMIN. */ ipiv = _starpu_idamax_(&c__4, tmp, &c__1); u11 = tmp[ipiv - 1]; if (abs(u11) <= smin) { *info = 1; u11 = smin; } u12 = tmp[locu12[ipiv - 1] - 1]; l21 = tmp[locl21[ipiv - 1] - 1] / u11; u22 = tmp[locu22[ipiv - 1] - 1] - u12 * l21; xswap = xswpiv[ipiv - 1]; bswap = bswpiv[ipiv - 1]; if (abs(u22) <= smin) { *info = 1; u22 = smin; } if (bswap) { temp = btmp[1]; btmp[1] = btmp[0] - l21 * temp; btmp[0] = temp; } else { btmp[1] -= l21 * btmp[0]; } *scale = 1.; if (smlnum * 2. * abs(btmp[1]) > abs(u22) || smlnum * 2. * abs(btmp[0]) > abs(u11)) { /* Computing MAX */ d__1 = abs(btmp[0]), d__2 = abs(btmp[1]); *scale = .5 / max(d__1,d__2); btmp[0] *= *scale; btmp[1] *= *scale; } x2[1] = btmp[1] / u22; x2[0] = btmp[0] / u11 - u12 / u11 * x2[1]; if (xswap) { temp = x2[1]; x2[1] = x2[0]; x2[0] = temp; } x[x_dim1 + 1] = x2[0]; if (*n1 == 1) { x[(x_dim1 << 1) + 1] = x2[1]; *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)) + (d__2 = x[(x_dim1 << 1) + 1], abs(d__2)); } else { x[x_dim1 + 2] = x2[1]; /* Computing MAX */ d__3 = (d__1 = x[x_dim1 + 1], abs(d__1)), d__4 = (d__2 = x[x_dim1 + 2] , abs(d__2)); *xnorm = max(d__3,d__4); } return 0; /* 2 by 2: */ /* op[TL11 TL12]*[X11 X12] +ISGN* [X11 X12]*op[TR11 TR12] = [B11 B12] */ /* [TL21 TL22] [X21 X22] [X21 X22] [TR21 TR22] [B21 B22] */ /* Solve equivalent 4 by 4 system using complete pivoting. */ /* Set pivots less than SMIN to SMIN. */ L50: /* Computing MAX */ d__5 = (d__1 = tr[tr_dim1 + 1], abs(d__1)), d__6 = (d__2 = tr[(tr_dim1 << 1) + 1], abs(d__2)), d__5 = max(d__5,d__6), d__6 = (d__3 = tr[ tr_dim1 + 2], abs(d__3)), d__5 = max(d__5,d__6), d__6 = (d__4 = tr[(tr_dim1 << 1) + 2], abs(d__4)); smin = max(d__5,d__6); /* Computing MAX */ d__5 = smin, d__6 = (d__1 = tl[tl_dim1 + 1], abs(d__1)), d__5 = max(d__5, d__6), d__6 = (d__2 = tl[(tl_dim1 << 1) + 1], abs(d__2)), d__5 = max(d__5,d__6), d__6 = (d__3 = tl[tl_dim1 + 2], abs(d__3)), d__5 = max(d__5,d__6), d__6 = (d__4 = tl[(tl_dim1 << 1) + 2], abs(d__4)) ; smin = max(d__5,d__6); /* Computing MAX */ d__1 = eps * smin; smin = max(d__1,smlnum); btmp[0] = 0.; _starpu_dcopy_(&c__16, btmp, &c__0, t16, &c__1); t16[0] = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; t16[5] = tl[(tl_dim1 << 1) + 2] + sgn * tr[tr_dim1 + 1]; t16[10] = tl[tl_dim1 + 1] + sgn * tr[(tr_dim1 << 1) + 2]; t16[15] = tl[(tl_dim1 << 1) + 2] + sgn * tr[(tr_dim1 << 1) + 2]; if (*ltranl) { t16[4] = tl[tl_dim1 + 2]; t16[1] = tl[(tl_dim1 << 1) + 1]; t16[14] = tl[tl_dim1 + 2]; t16[11] = tl[(tl_dim1 << 1) + 1]; } else { t16[4] = tl[(tl_dim1 << 1) + 1]; t16[1] = tl[tl_dim1 + 2]; t16[14] = tl[(tl_dim1 << 1) + 1]; t16[11] = tl[tl_dim1 + 2]; } if (*ltranr) { t16[8] = sgn * tr[(tr_dim1 << 1) + 1]; t16[13] = sgn * tr[(tr_dim1 << 1) + 1]; t16[2] = sgn * tr[tr_dim1 + 2]; t16[7] = sgn * tr[tr_dim1 + 2]; } else { t16[8] = sgn * tr[tr_dim1 + 2]; t16[13] = sgn * tr[tr_dim1 + 2]; t16[2] = sgn * tr[(tr_dim1 << 1) + 1]; t16[7] = sgn * tr[(tr_dim1 << 1) + 1]; } btmp[0] = b[b_dim1 + 1]; btmp[1] = b[b_dim1 + 2]; btmp[2] = b[(b_dim1 << 1) + 1]; btmp[3] = b[(b_dim1 << 1) + 2]; /* Perform elimination */ for (i__ = 1; i__ <= 3; ++i__) { xmax = 0.; for (ip = i__; ip <= 4; ++ip) { for (jp = i__; jp <= 4; ++jp) { if ((d__1 = t16[ip + (jp << 2) - 5], abs(d__1)) >= xmax) { xmax = (d__1 = t16[ip + (jp << 2) - 5], abs(d__1)); ipsv = ip; jpsv = jp; } /* L60: */ } /* L70: */ } if (ipsv != i__) { _starpu_dswap_(&c__4, &t16[ipsv - 1], &c__4, &t16[i__ - 1], &c__4); temp = btmp[i__ - 1]; btmp[i__ - 1] = btmp[ipsv - 1]; btmp[ipsv - 1] = temp; } if (jpsv != i__) { _starpu_dswap_(&c__4, &t16[(jpsv << 2) - 4], &c__1, &t16[(i__ << 2) - 4], &c__1); } jpiv[i__ - 1] = jpsv; if ((d__1 = t16[i__ + (i__ << 2) - 5], abs(d__1)) < smin) { *info = 1; t16[i__ + (i__ << 2) - 5] = smin; } for (j = i__ + 1; j <= 4; ++j) { t16[j + (i__ << 2) - 5] /= t16[i__ + (i__ << 2) - 5]; btmp[j - 1] -= t16[j + (i__ << 2) - 5] * btmp[i__ - 1]; for (k = i__ + 1; k <= 4; ++k) { t16[j + (k << 2) - 5] -= t16[j + (i__ << 2) - 5] * t16[i__ + ( k << 2) - 5]; /* L80: */ } /* L90: */ } /* L100: */ } if (abs(t16[15]) < smin) { t16[15] = smin; } *scale = 1.; if (smlnum * 8. * abs(btmp[0]) > abs(t16[0]) || smlnum * 8. * abs(btmp[1]) > abs(t16[5]) || smlnum * 8. * abs(btmp[2]) > abs(t16[10]) || smlnum * 8. * abs(btmp[3]) > abs(t16[15])) { /* Computing MAX */ d__1 = abs(btmp[0]), d__2 = abs(btmp[1]), d__1 = max(d__1,d__2), d__2 = abs(btmp[2]), d__1 = max(d__1,d__2), d__2 = abs(btmp[3]); *scale = .125 / max(d__1,d__2); btmp[0] *= *scale; btmp[1] *= *scale; btmp[2] *= *scale; btmp[3] *= *scale; } for (i__ = 1; i__ <= 4; ++i__) { k = 5 - i__; temp = 1. / t16[k + (k << 2) - 5]; tmp[k - 1] = btmp[k - 1] * temp; for (j = k + 1; j <= 4; ++j) { tmp[k - 1] -= temp * t16[k + (j << 2) - 5] * tmp[j - 1]; /* L110: */ } /* L120: */ } for (i__ = 1; i__ <= 3; ++i__) { if (jpiv[4 - i__ - 1] != 4 - i__) { temp = tmp[4 - i__ - 1]; tmp[4 - i__ - 1] = tmp[jpiv[4 - i__ - 1] - 1]; tmp[jpiv[4 - i__ - 1] - 1] = temp; } /* L130: */ } x[x_dim1 + 1] = tmp[0]; x[x_dim1 + 2] = tmp[1]; x[(x_dim1 << 1) + 1] = tmp[2]; x[(x_dim1 << 1) + 2] = tmp[3]; /* Computing MAX */ d__1 = abs(tmp[0]) + abs(tmp[2]), d__2 = abs(tmp[1]) + abs(tmp[3]); *xnorm = max(d__1,d__2); return 0; /* End of DLASY2 */ } /* _starpu_dlasy2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlasyf.c000066400000000000000000000502531413463044200206350ustar00rootroot00000000000000/* dlasyf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = -1.; static doublereal c_b9 = 1.; /* Subroutine */ int _starpu_dlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublereal *a, integer *lda, integer *ipiv, doublereal *w, integer * ldw, integer *info) { /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer j, k; doublereal t, r1, d11, d21, d22; integer jb, jj, kk, jp, kp, kw, kkw, imax, jmax; doublereal alpha; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer kstep; doublereal absakk; extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal colmax, rowmax; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLASYF computes a partial factorization of a real symmetric matrix A */ /* using the Bunch-Kaufman diagonal pivoting method. The partial */ /* factorization has the form: */ /* A = ( I U12 ) ( A11 0 ) ( I 0 ) if UPLO = 'U', or: */ /* ( 0 U22 ) ( 0 D ) ( U12' U22' ) */ /* A = ( L11 0 ) ( D 0 ) ( L11' L21' ) if UPLO = 'L' */ /* ( L21 I ) ( 0 A22 ) ( 0 I ) */ /* where the order of D is at most NB. The actual order is returned in */ /* the argument KB, and is either NB or NB-1, or N if N <= NB. */ /* DLASYF is an auxiliary routine called by DSYTRF. It uses blocked code */ /* (calling Level 3 BLAS) to update the submatrix A11 (if UPLO = 'U') or */ /* A22 (if UPLO = 'L'). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NB (input) INTEGER */ /* The maximum number of columns of the matrix A that should be */ /* factored. NB should be at least 2 to allow for 2-by-2 pivot */ /* blocks. */ /* KB (output) INTEGER */ /* The number of columns of A that were actually factored. */ /* KB is either NB-1 or NB, or N if N <= NB. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n-by-n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n-by-n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, A contains details of the partial factorization. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D. */ /* If UPLO = 'U', only the last KB elements of IPIV are set; */ /* if UPLO = 'L', only the first KB elements are set. */ /* If IPIV(k) > 0, then rows and columns k and IPIV(k) were */ /* interchanged and D(k,k) is a 1-by-1 diagonal block. */ /* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and */ /* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) */ /* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = */ /* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were */ /* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* W (workspace) DOUBLE PRECISION array, dimension (LDW,NB) */ /* LDW (input) INTEGER */ /* The leading dimension of the array W. LDW >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* > 0: if INFO = k, D(k,k) is exactly zero. The factorization */ /* has been completed, but the block diagonal matrix D is */ /* exactly singular. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; w_dim1 = *ldw; w_offset = 1 + w_dim1; w -= w_offset; /* Function Body */ *info = 0; /* Initialize ALPHA for use in choosing pivot block size. */ alpha = (sqrt(17.) + 1.) / 8.; if (_starpu_lsame_(uplo, "U")) { /* Factorize the trailing columns of A using the upper triangle */ /* of A and working backwards, and compute the matrix W = U12*D */ /* for use in updating A11 */ /* K is the main loop index, decreasing from N in steps of 1 or 2 */ /* KW is the column of W which corresponds to column K of A */ k = *n; L10: kw = *nb + k - *n; /* Exit from loop */ if (k <= *n - *nb + 1 && *nb < *n || k < 1) { goto L30; } /* Copy column K of A to column KW of W and update it */ _starpu_dcopy_(&k, &a[k * a_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); if (k < *n) { i__1 = *n - k; _starpu_dgemv_("No transpose", &k, &i__1, &c_b8, &a[(k + 1) * a_dim1 + 1], lda, &w[k + (kw + 1) * w_dim1], ldw, &c_b9, &w[kw * w_dim1 + 1], &c__1); } kstep = 1; /* Determine rows and columns to be interchanged and whether */ /* a 1-by-1 or 2-by-2 pivot block will be used */ absakk = (d__1 = w[k + kw * w_dim1], abs(d__1)); /* IMAX is the row-index of the largest off-diagonal element in */ /* column K, and COLMAX is its absolute value */ if (k > 1) { i__1 = k - 1; imax = _starpu_idamax_(&i__1, &w[kw * w_dim1 + 1], &c__1); colmax = (d__1 = w[imax + kw * w_dim1], abs(d__1)); } else { colmax = 0.; } if (max(absakk,colmax) == 0.) { /* Column K is zero: set INFO and continue */ if (*info == 0) { *info = k; } kp = k; } else { if (absakk >= alpha * colmax) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else { /* Copy column IMAX to column KW-1 of W and update it */ _starpu_dcopy_(&imax, &a[imax * a_dim1 + 1], &c__1, &w[(kw - 1) * w_dim1 + 1], &c__1); i__1 = k - imax; _starpu_dcopy_(&i__1, &a[imax + (imax + 1) * a_dim1], lda, &w[imax + 1 + (kw - 1) * w_dim1], &c__1); if (k < *n) { i__1 = *n - k; _starpu_dgemv_("No transpose", &k, &i__1, &c_b8, &a[(k + 1) * a_dim1 + 1], lda, &w[imax + (kw + 1) * w_dim1], ldw, &c_b9, &w[(kw - 1) * w_dim1 + 1], &c__1); } /* JMAX is the column-index of the largest off-diagonal */ /* element in row IMAX, and ROWMAX is its absolute value */ i__1 = k - imax; jmax = imax + _starpu_idamax_(&i__1, &w[imax + 1 + (kw - 1) * w_dim1], &c__1); rowmax = (d__1 = w[jmax + (kw - 1) * w_dim1], abs(d__1)); if (imax > 1) { i__1 = imax - 1; jmax = _starpu_idamax_(&i__1, &w[(kw - 1) * w_dim1 + 1], &c__1); /* Computing MAX */ d__2 = rowmax, d__3 = (d__1 = w[jmax + (kw - 1) * w_dim1], abs(d__1)); rowmax = max(d__2,d__3); } if (absakk >= alpha * colmax * (colmax / rowmax)) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else if ((d__1 = w[imax + (kw - 1) * w_dim1], abs(d__1)) >= alpha * rowmax) { /* interchange rows and columns K and IMAX, use 1-by-1 */ /* pivot block */ kp = imax; /* copy column KW-1 of W to column KW */ _starpu_dcopy_(&k, &w[(kw - 1) * w_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); } else { /* interchange rows and columns K-1 and IMAX, use 2-by-2 */ /* pivot block */ kp = imax; kstep = 2; } } kk = k - kstep + 1; kkw = *nb + kk - *n; /* Updated column KP is already stored in column KKW of W */ if (kp != kk) { /* Copy non-updated column KK to column KP */ a[kp + k * a_dim1] = a[kk + k * a_dim1]; i__1 = k - 1 - kp; _starpu_dcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); _starpu_dcopy_(&kp, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], & c__1); /* Interchange rows KK and KP in last KK columns of A and W */ i__1 = *n - kk + 1; _starpu_dswap_(&i__1, &a[kk + kk * a_dim1], lda, &a[kp + kk * a_dim1], lda); i__1 = *n - kk + 1; _starpu_dswap_(&i__1, &w[kk + kkw * w_dim1], ldw, &w[kp + kkw * w_dim1], ldw); } if (kstep == 1) { /* 1-by-1 pivot block D(k): column KW of W now holds */ /* W(k) = U(k)*D(k) */ /* where U(k) is the k-th column of U */ /* Store U(k) in column k of A */ _starpu_dcopy_(&k, &w[kw * w_dim1 + 1], &c__1, &a[k * a_dim1 + 1], & c__1); r1 = 1. / a[k + k * a_dim1]; i__1 = k - 1; _starpu_dscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); } else { /* 2-by-2 pivot block D(k): columns KW and KW-1 of W now */ /* hold */ /* ( W(k-1) W(k) ) = ( U(k-1) U(k) )*D(k) */ /* where U(k) and U(k-1) are the k-th and (k-1)-th columns */ /* of U */ if (k > 2) { /* Store U(k) and U(k-1) in columns k and k-1 of A */ d21 = w[k - 1 + kw * w_dim1]; d11 = w[k + kw * w_dim1] / d21; d22 = w[k - 1 + (kw - 1) * w_dim1] / d21; t = 1. / (d11 * d22 - 1.); d21 = t / d21; i__1 = k - 2; for (j = 1; j <= i__1; ++j) { a[j + (k - 1) * a_dim1] = d21 * (d11 * w[j + (kw - 1) * w_dim1] - w[j + kw * w_dim1]); a[j + k * a_dim1] = d21 * (d22 * w[j + kw * w_dim1] - w[j + (kw - 1) * w_dim1]); /* L20: */ } } /* Copy D(k) to A */ a[k - 1 + (k - 1) * a_dim1] = w[k - 1 + (kw - 1) * w_dim1]; a[k - 1 + k * a_dim1] = w[k - 1 + kw * w_dim1]; a[k + k * a_dim1] = w[k + kw * w_dim1]; } } /* Store details of the interchanges in IPIV */ if (kstep == 1) { ipiv[k] = kp; } else { ipiv[k] = -kp; ipiv[k - 1] = -kp; } /* Decrease K and return to the start of the main loop */ k -= kstep; goto L10; L30: /* Update the upper triangle of A11 (= A(1:k,1:k)) as */ /* A11 := A11 - U12*D*U12' = A11 - U12*W' */ /* computing blocks of NB columns at a time */ i__1 = -(*nb); for (j = (k - 1) / *nb * *nb + 1; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { /* Computing MIN */ i__2 = *nb, i__3 = k - j + 1; jb = min(i__2,i__3); /* Update the upper triangle of the diagonal block */ i__2 = j + jb - 1; for (jj = j; jj <= i__2; ++jj) { i__3 = jj - j + 1; i__4 = *n - k; _starpu_dgemv_("No transpose", &i__3, &i__4, &c_b8, &a[j + (k + 1) * a_dim1], lda, &w[jj + (kw + 1) * w_dim1], ldw, &c_b9, &a[j + jj * a_dim1], &c__1); /* L40: */ } /* Update the rectangular superdiagonal block */ i__2 = j - 1; i__3 = *n - k; _starpu_dgemm_("No transpose", "Transpose", &i__2, &jb, &i__3, &c_b8, &a[( k + 1) * a_dim1 + 1], lda, &w[j + (kw + 1) * w_dim1], ldw, &c_b9, &a[j * a_dim1 + 1], lda); /* L50: */ } /* Put U12 in standard form by partially undoing the interchanges */ /* in columns k+1:n */ j = k + 1; L60: jj = j; jp = ipiv[j]; if (jp < 0) { jp = -jp; ++j; } ++j; if (jp != jj && j <= *n) { i__1 = *n - j + 1; _starpu_dswap_(&i__1, &a[jp + j * a_dim1], lda, &a[jj + j * a_dim1], lda); } if (j <= *n) { goto L60; } /* Set KB to the number of columns factorized */ *kb = *n - k; } else { /* Factorize the leading columns of A using the lower triangle */ /* of A and working forwards, and compute the matrix W = L21*D */ /* for use in updating A22 */ /* K is the main loop index, increasing from 1 in steps of 1 or 2 */ k = 1; L70: /* Exit from loop */ if (k >= *nb && *nb < *n || k > *n) { goto L90; } /* Copy column K of A to column K of W and update it */ i__1 = *n - k + 1; _starpu_dcopy_(&i__1, &a[k + k * a_dim1], &c__1, &w[k + k * w_dim1], &c__1); i__1 = *n - k + 1; i__2 = k - 1; _starpu_dgemv_("No transpose", &i__1, &i__2, &c_b8, &a[k + a_dim1], lda, &w[k + w_dim1], ldw, &c_b9, &w[k + k * w_dim1], &c__1); kstep = 1; /* Determine rows and columns to be interchanged and whether */ /* a 1-by-1 or 2-by-2 pivot block will be used */ absakk = (d__1 = w[k + k * w_dim1], abs(d__1)); /* IMAX is the row-index of the largest off-diagonal element in */ /* column K, and COLMAX is its absolute value */ if (k < *n) { i__1 = *n - k; imax = k + _starpu_idamax_(&i__1, &w[k + 1 + k * w_dim1], &c__1); colmax = (d__1 = w[imax + k * w_dim1], abs(d__1)); } else { colmax = 0.; } if (max(absakk,colmax) == 0.) { /* Column K is zero: set INFO and continue */ if (*info == 0) { *info = k; } kp = k; } else { if (absakk >= alpha * colmax) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else { /* Copy column IMAX to column K+1 of W and update it */ i__1 = imax - k; _starpu_dcopy_(&i__1, &a[imax + k * a_dim1], lda, &w[k + (k + 1) * w_dim1], &c__1); i__1 = *n - imax + 1; _starpu_dcopy_(&i__1, &a[imax + imax * a_dim1], &c__1, &w[imax + (k + 1) * w_dim1], &c__1); i__1 = *n - k + 1; i__2 = k - 1; _starpu_dgemv_("No transpose", &i__1, &i__2, &c_b8, &a[k + a_dim1], lda, &w[imax + w_dim1], ldw, &c_b9, &w[k + (k + 1) * w_dim1], &c__1); /* JMAX is the column-index of the largest off-diagonal */ /* element in row IMAX, and ROWMAX is its absolute value */ i__1 = imax - k; jmax = k - 1 + _starpu_idamax_(&i__1, &w[k + (k + 1) * w_dim1], &c__1) ; rowmax = (d__1 = w[jmax + (k + 1) * w_dim1], abs(d__1)); if (imax < *n) { i__1 = *n - imax; jmax = imax + _starpu_idamax_(&i__1, &w[imax + 1 + (k + 1) * w_dim1], &c__1); /* Computing MAX */ d__2 = rowmax, d__3 = (d__1 = w[jmax + (k + 1) * w_dim1], abs(d__1)); rowmax = max(d__2,d__3); } if (absakk >= alpha * colmax * (colmax / rowmax)) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else if ((d__1 = w[imax + (k + 1) * w_dim1], abs(d__1)) >= alpha * rowmax) { /* interchange rows and columns K and IMAX, use 1-by-1 */ /* pivot block */ kp = imax; /* copy column K+1 of W to column K */ i__1 = *n - k + 1; _starpu_dcopy_(&i__1, &w[k + (k + 1) * w_dim1], &c__1, &w[k + k * w_dim1], &c__1); } else { /* interchange rows and columns K+1 and IMAX, use 2-by-2 */ /* pivot block */ kp = imax; kstep = 2; } } kk = k + kstep - 1; /* Updated column KP is already stored in column KK of W */ if (kp != kk) { /* Copy non-updated column KK to column KP */ a[kp + k * a_dim1] = a[kk + k * a_dim1]; i__1 = kp - k - 1; _starpu_dcopy_(&i__1, &a[k + 1 + kk * a_dim1], &c__1, &a[kp + (k + 1) * a_dim1], lda); i__1 = *n - kp + 1; _starpu_dcopy_(&i__1, &a[kp + kk * a_dim1], &c__1, &a[kp + kp * a_dim1], &c__1); /* Interchange rows KK and KP in first KK columns of A and W */ _starpu_dswap_(&kk, &a[kk + a_dim1], lda, &a[kp + a_dim1], lda); _starpu_dswap_(&kk, &w[kk + w_dim1], ldw, &w[kp + w_dim1], ldw); } if (kstep == 1) { /* 1-by-1 pivot block D(k): column k of W now holds */ /* W(k) = L(k)*D(k) */ /* where L(k) is the k-th column of L */ /* Store L(k) in column k of A */ i__1 = *n - k + 1; _starpu_dcopy_(&i__1, &w[k + k * w_dim1], &c__1, &a[k + k * a_dim1], & c__1); if (k < *n) { r1 = 1. / a[k + k * a_dim1]; i__1 = *n - k; _starpu_dscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1); } } else { /* 2-by-2 pivot block D(k): columns k and k+1 of W now hold */ /* ( W(k) W(k+1) ) = ( L(k) L(k+1) )*D(k) */ /* where L(k) and L(k+1) are the k-th and (k+1)-th columns */ /* of L */ if (k < *n - 1) { /* Store L(k) and L(k+1) in columns k and k+1 of A */ d21 = w[k + 1 + k * w_dim1]; d11 = w[k + 1 + (k + 1) * w_dim1] / d21; d22 = w[k + k * w_dim1] / d21; t = 1. / (d11 * d22 - 1.); d21 = t / d21; i__1 = *n; for (j = k + 2; j <= i__1; ++j) { a[j + k * a_dim1] = d21 * (d11 * w[j + k * w_dim1] - w[j + (k + 1) * w_dim1]); a[j + (k + 1) * a_dim1] = d21 * (d22 * w[j + (k + 1) * w_dim1] - w[j + k * w_dim1]); /* L80: */ } } /* Copy D(k) to A */ a[k + k * a_dim1] = w[k + k * w_dim1]; a[k + 1 + k * a_dim1] = w[k + 1 + k * w_dim1]; a[k + 1 + (k + 1) * a_dim1] = w[k + 1 + (k + 1) * w_dim1]; } } /* Store details of the interchanges in IPIV */ if (kstep == 1) { ipiv[k] = kp; } else { ipiv[k] = -kp; ipiv[k + 1] = -kp; } /* Increase K and return to the start of the main loop */ k += kstep; goto L70; L90: /* Update the lower triangle of A22 (= A(k:n,k:n)) as */ /* A22 := A22 - L21*D*L21' = A22 - L21*W' */ /* computing blocks of NB columns at a time */ i__1 = *n; i__2 = *nb; for (j = k; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = *nb, i__4 = *n - j + 1; jb = min(i__3,i__4); /* Update the lower triangle of the diagonal block */ i__3 = j + jb - 1; for (jj = j; jj <= i__3; ++jj) { i__4 = j + jb - jj; i__5 = k - 1; _starpu_dgemv_("No transpose", &i__4, &i__5, &c_b8, &a[jj + a_dim1], lda, &w[jj + w_dim1], ldw, &c_b9, &a[jj + jj * a_dim1] , &c__1); /* L100: */ } /* Update the rectangular subdiagonal block */ if (j + jb <= *n) { i__3 = *n - j - jb + 1; i__4 = k - 1; _starpu_dgemm_("No transpose", "Transpose", &i__3, &jb, &i__4, &c_b8, &a[j + jb + a_dim1], lda, &w[j + w_dim1], ldw, &c_b9, &a[j + jb + j * a_dim1], lda); } /* L110: */ } /* Put L21 in standard form by partially undoing the interchanges */ /* in columns 1:k-1 */ j = k - 1; L120: jj = j; jp = ipiv[j]; if (jp < 0) { jp = -jp; --j; } --j; if (jp != jj && j >= 1) { _starpu_dswap_(&j, &a[jp + a_dim1], lda, &a[jj + a_dim1], lda); } if (j >= 1) { goto L120; } /* Set KB to the number of columns factorized */ *kb = k - 1; } return 0; /* End of DLASYF */ } /* _starpu_dlasyf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlat2s.c000066400000000000000000000073771413463044200205550ustar00rootroot00000000000000/* dlat2s.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlat2s_(char *uplo, integer *n, doublereal *a, integer * lda, real *sa, integer *ldsa, integer *info) { /* System generated locals */ integer sa_dim1, sa_offset, a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j; doublereal rmax; extern logical _starpu_lsame_(char *, char *); logical upper; extern doublereal _starpu_slamch_(char *); /* -- LAPACK PROTOTYPE auxiliary routine (version 3.1.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* May 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAT2S converts a DOUBLE PRECISION triangular matrix, SA, to a SINGLE */ /* PRECISION triangular matrix, A. */ /* RMAX is the overflow for the SINGLE PRECISION arithmetic */ /* DLAS2S checks that all the entries of A are between -RMAX and */ /* RMAX. If not the convertion is aborted and a flag is raised. */ /* This is an auxiliary routine so there is no argument checking. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* N (input) INTEGER */ /* The number of rows and columns of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the N-by-N triangular coefficient matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* SA (output) REAL array, dimension (LDSA,N) */ /* Only the UPLO part of SA is referenced. On exit, if INFO=0, */ /* the N-by-N coefficient matrix SA; if INFO>0, the content of */ /* the UPLO part of SA is unspecified. */ /* LDSA (input) INTEGER */ /* The leading dimension of the array SA. LDSA >= max(1,M). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* = 1: an entry of the matrix A is greater than the SINGLE */ /* PRECISION overflow threshold, in this case, the content */ /* of the UPLO part of SA in exit is unspecified. */ /* ========= */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; sa_dim1 = *ldsa; sa_offset = 1 + sa_dim1; sa -= sa_offset; /* Function Body */ rmax = _starpu_slamch_("O"); upper = _starpu_lsame_(uplo, "U"); if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { if (a[i__ + j * a_dim1] < -rmax || a[i__ + j * a_dim1] > rmax) { *info = 1; goto L50; } sa[i__ + j * sa_dim1] = a[i__ + j * a_dim1]; /* L10: */ } /* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { if (a[i__ + j * a_dim1] < -rmax || a[i__ + j * a_dim1] > rmax) { *info = 1; goto L50; } sa[i__ + j * sa_dim1] = a[i__ + j * a_dim1]; /* L30: */ } /* L40: */ } } L50: return 0; /* End of DLAT2S */ } /* _starpu_dlat2s_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatbs.c000066400000000000000000000544501413463044200206270ustar00rootroot00000000000000/* dlatbs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b36 = .5; /* Subroutine */ int _starpu_dlatbs_(char *uplo, char *trans, char *diag, char * normin, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j; doublereal xj, rec, tjj; integer jinc, jlen; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal xbnd; integer imax; doublereal tmax, tjjs, xmax, grow, sumj; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); integer maind; extern logical _starpu_lsame_(char *, char *); doublereal tscal, uscal; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); integer jlast; extern /* Subroutine */ int _starpu_dtbsv_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; logical notran; integer jfirst; doublereal smlnum; logical nounit; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLATBS solves one of the triangular systems */ /* A *x = s*b or A'*x = s*b */ /* with scaling to prevent overflow, where A is an upper or lower */ /* triangular band matrix. Here A' denotes the transpose of A, x and b */ /* are n-element vectors, and s is a scaling factor, usually less than */ /* or equal to 1, chosen so that the components of x will be less than */ /* the overflow threshold. If the unscaled problem will not cause */ /* overflow, the Level 2 BLAS routine DTBSV is called. If the matrix A */ /* is singular (A(j,j) = 0 for some j), then s is set to 0 and a */ /* non-trivial solution to A*x = 0 is returned. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* TRANS (input) CHARACTER*1 */ /* Specifies the operation applied to A. */ /* = 'N': Solve A * x = s*b (No transpose) */ /* = 'T': Solve A'* x = s*b (Transpose) */ /* = 'C': Solve A'* x = s*b (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A is unit triangular. */ /* = 'N': Non-unit triangular */ /* = 'U': Unit triangular */ /* NORMIN (input) CHARACTER*1 */ /* Specifies whether CNORM has been set or not. */ /* = 'Y': CNORM contains the column norms on entry */ /* = 'N': CNORM is not set on entry. On exit, the norms will */ /* be computed and stored in CNORM. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of subdiagonals or superdiagonals in the */ /* triangular matrix A. KD >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangular band matrix A, stored in the */ /* first KD+1 rows of the array. The j-th column of A is stored */ /* in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* X (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the right hand side b of the triangular system. */ /* On exit, X is overwritten by the solution vector x. */ /* SCALE (output) DOUBLE PRECISION */ /* The scaling factor s for the triangular system */ /* A * x = s*b or A'* x = s*b. */ /* If SCALE = 0, the matrix A is singular or badly scaled, and */ /* the vector x is an exact or approximate solution to A*x = 0. */ /* CNORM (input or output) DOUBLE PRECISION array, dimension (N) */ /* If NORMIN = 'Y', CNORM is an input argument and CNORM(j) */ /* contains the norm of the off-diagonal part of the j-th column */ /* of A. If TRANS = 'N', CNORM(j) must be greater than or equal */ /* to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) */ /* must be greater than or equal to the 1-norm. */ /* If NORMIN = 'N', CNORM is an output argument and CNORM(j) */ /* returns the 1-norm of the offdiagonal part of the j-th column */ /* of A. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* Further Details */ /* ======= ======= */ /* A rough bound on x is computed; if that is less than overflow, DTBSV */ /* is called, otherwise, specific code is used which checks for possible */ /* overflow or divide-by-zero at every operation. */ /* A columnwise scheme is used for solving A*x = b. The basic algorithm */ /* if A is lower triangular is */ /* x[1:n] := b[1:n] */ /* for j = 1, ..., n */ /* x(j) := x(j) / A(j,j) */ /* x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] */ /* end */ /* Define bounds on the components of x after j iterations of the loop: */ /* M(j) = bound on x[1:j] */ /* G(j) = bound on x[j+1:n] */ /* Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. */ /* Then for iteration j+1 we have */ /* M(j+1) <= G(j) / | A(j+1,j+1) | */ /* G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | */ /* <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) */ /* where CNORM(j+1) is greater than or equal to the infinity-norm of */ /* column j+1 of A, not counting the diagonal. Hence */ /* G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) */ /* 1<=i<=j */ /* and */ /* |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) */ /* 1<=i< j */ /* Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTBSV if the */ /* reciprocal of the largest M(j), j=1,..,n, is larger than */ /* max(underflow, 1/overflow). */ /* The bound on x(j) is also used to determine when a step in the */ /* columnwise method can be performed without fear of overflow. If */ /* the computed bound is greater than a large constant, x is scaled to */ /* prevent overflow, but if the bound overflows, x is set to 0, x(j) to */ /* 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. */ /* Similarly, a row-wise scheme is used to solve A'*x = b. The basic */ /* algorithm for A upper triangular is */ /* for j = 1, ..., n */ /* x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j) */ /* end */ /* We simultaneously compute two bounds */ /* G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j */ /* M(j) = bound on x(i), 1<=i<=j */ /* The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we */ /* add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. */ /* Then the bound on x(j) is */ /* M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | */ /* <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) */ /* 1<=i<=j */ /* and we can safely call DTBSV if 1/M(n) and 1/G(n) are both greater */ /* than max(underflow, 1/overflow). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --x; --cnorm; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); notran = _starpu_lsame_(trans, "N"); nounit = _starpu_lsame_(diag, "N"); /* Test the input parameters. */ if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (! _starpu_lsame_(normin, "Y") && ! _starpu_lsame_(normin, "N")) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*kd < 0) { *info = -6; } else if (*ldab < *kd + 1) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLATBS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine machine dependent parameters to control overflow. */ smlnum = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); bignum = 1. / smlnum; *scale = 1.; if (_starpu_lsame_(normin, "N")) { /* Compute the 1-norm of each column, not including the diagonal. */ if (upper) { /* A is upper triangular. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = *kd, i__3 = j - 1; jlen = min(i__2,i__3); cnorm[j] = _starpu_dasum_(&jlen, &ab[*kd + 1 - jlen + j * ab_dim1], & c__1); /* L10: */ } } else { /* A is lower triangular. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = *kd, i__3 = *n - j; jlen = min(i__2,i__3); if (jlen > 0) { cnorm[j] = _starpu_dasum_(&jlen, &ab[j * ab_dim1 + 2], &c__1); } else { cnorm[j] = 0.; } /* L20: */ } } } /* Scale the column norms by TSCAL if the maximum element in CNORM is */ /* greater than BIGNUM. */ imax = _starpu_idamax_(n, &cnorm[1], &c__1); tmax = cnorm[imax]; if (tmax <= bignum) { tscal = 1.; } else { tscal = 1. / (smlnum * tmax); _starpu_dscal_(n, &tscal, &cnorm[1], &c__1); } /* Compute a bound on the computed solution vector to see if the */ /* Level 2 BLAS routine DTBSV can be used. */ j = _starpu_idamax_(n, &x[1], &c__1); xmax = (d__1 = x[j], abs(d__1)); xbnd = xmax; if (notran) { /* Compute the growth in A * x = b. */ if (upper) { jfirst = *n; jlast = 1; jinc = -1; maind = *kd + 1; } else { jfirst = 1; jlast = *n; jinc = 1; maind = 1; } if (tscal != 1.) { grow = 0.; goto L50; } if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, G(0) = max{x(i), i=1,...,n}. */ grow = 1. / max(xbnd,smlnum); xbnd = grow; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L50; } /* M(j) = G(j-1) / abs(A(j,j)) */ tjj = (d__1 = ab[maind + j * ab_dim1], abs(d__1)); /* Computing MIN */ d__1 = xbnd, d__2 = min(1.,tjj) * grow; xbnd = min(d__1,d__2); if (tjj + cnorm[j] >= smlnum) { /* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) */ grow *= tjj / (tjj + cnorm[j]); } else { /* G(j) could overflow, set GROW to 0. */ grow = 0.; } /* L30: */ } grow = xbnd; } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ d__1 = 1., d__2 = 1. / max(xbnd,smlnum); grow = min(d__1,d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L50; } /* G(j) = G(j-1)*( 1 + CNORM(j) ) */ grow *= 1. / (cnorm[j] + 1.); /* L40: */ } } L50: ; } else { /* Compute the growth in A' * x = b. */ if (upper) { jfirst = 1; jlast = *n; jinc = 1; maind = *kd + 1; } else { jfirst = *n; jlast = 1; jinc = -1; maind = 1; } if (tscal != 1.) { grow = 0.; goto L80; } if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, M(0) = max{x(i), i=1,...,n}. */ grow = 1. / max(xbnd,smlnum); xbnd = grow; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L80; } /* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) */ xj = cnorm[j] + 1.; /* Computing MIN */ d__1 = grow, d__2 = xbnd / xj; grow = min(d__1,d__2); /* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) */ tjj = (d__1 = ab[maind + j * ab_dim1], abs(d__1)); if (xj > tjj) { xbnd *= tjj / xj; } /* L60: */ } grow = min(grow,xbnd); } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ d__1 = 1., d__2 = 1. / max(xbnd,smlnum); grow = min(d__1,d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L80; } /* G(j) = ( 1 + CNORM(j) )*G(j-1) */ xj = cnorm[j] + 1.; grow /= xj; /* L70: */ } } L80: ; } if (grow * tscal > smlnum) { /* Use the Level 2 BLAS solve if the reciprocal of the bound on */ /* elements of X is not too small. */ _starpu_dtbsv_(uplo, trans, diag, n, kd, &ab[ab_offset], ldab, &x[1], &c__1); } else { /* Use a Level 1 BLAS solve, scaling intermediate results. */ if (xmax > bignum) { /* Scale X so that its components are less than or equal to */ /* BIGNUM in absolute value. */ *scale = bignum / xmax; _starpu_dscal_(n, scale, &x[1], &c__1); xmax = bignum; } if (notran) { /* Solve A * x = b */ i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Compute x(j) = b(j) / A(j,j), scaling x if necessary. */ xj = (d__1 = x[j], abs(d__1)); if (nounit) { tjjs = ab[maind + j * ab_dim1] * tscal; } else { tjjs = tscal; if (tscal == 1.) { goto L100; } } tjj = abs(tjjs); if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ if (tjj < 1.) { if (xj > tjj * bignum) { /* Scale x by 1/b(j). */ rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM */ /* to avoid overflow when dividing by A(j,j). */ rec = tjj * bignum / xj; if (cnorm[j] > 1.) { /* Scale by 1/CNORM(j) to avoid overflow when */ /* multiplying x(j) times column j. */ rec /= cnorm[j]; } _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A*x = 0. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; /* L90: */ } x[j] = 1.; xj = 1.; *scale = 0.; xmax = 0.; } L100: /* Scale x if necessary to avoid overflow when adding a */ /* multiple of column j of A. */ if (xj > 1.) { rec = 1. / xj; if (cnorm[j] > (bignum - xmax) * rec) { /* Scale x by 1/(2*abs(x(j))). */ rec *= .5; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; } } else if (xj * cnorm[j] > bignum - xmax) { /* Scale x by 1/2. */ _starpu_dscal_(n, &c_b36, &x[1], &c__1); *scale *= .5; } if (upper) { if (j > 1) { /* Compute the update */ /* x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) - */ /* x(j)* A(max(1,j-kd):j-1,j) */ /* Computing MIN */ i__3 = *kd, i__4 = j - 1; jlen = min(i__3,i__4); d__1 = -x[j] * tscal; _starpu_daxpy_(&jlen, &d__1, &ab[*kd + 1 - jlen + j * ab_dim1] , &c__1, &x[j - jlen], &c__1); i__3 = j - 1; i__ = _starpu_idamax_(&i__3, &x[1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } } else if (j < *n) { /* Compute the update */ /* x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) - */ /* x(j) * A(j+1:min(j+kd,n),j) */ /* Computing MIN */ i__3 = *kd, i__4 = *n - j; jlen = min(i__3,i__4); if (jlen > 0) { d__1 = -x[j] * tscal; _starpu_daxpy_(&jlen, &d__1, &ab[j * ab_dim1 + 2], &c__1, &x[ j + 1], &c__1); } i__3 = *n - j; i__ = j + _starpu_idamax_(&i__3, &x[j + 1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } /* L110: */ } } else { /* Solve A' * x = b */ i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Compute x(j) = b(j) - sum A(k,j)*x(k). */ /* k<>j */ xj = (d__1 = x[j], abs(d__1)); uscal = tscal; rec = 1. / max(xmax,1.); if (cnorm[j] > (bignum - xj) * rec) { /* If x(j) could overflow, scale x by 1/(2*XMAX). */ rec *= .5; if (nounit) { tjjs = ab[maind + j * ab_dim1] * tscal; } else { tjjs = tscal; } tjj = abs(tjjs); if (tjj > 1.) { /* Divide by A(j,j) when scaling x if A(j,j) > 1. */ /* Computing MIN */ d__1 = 1., d__2 = rec * tjj; rec = min(d__1,d__2); uscal /= tjjs; } if (rec < 1.) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } sumj = 0.; if (uscal == 1.) { /* If the scaling needed for A in the dot product is 1, */ /* call DDOT to perform the dot product. */ if (upper) { /* Computing MIN */ i__3 = *kd, i__4 = j - 1; jlen = min(i__3,i__4); sumj = _starpu_ddot_(&jlen, &ab[*kd + 1 - jlen + j * ab_dim1], &c__1, &x[j - jlen], &c__1); } else { /* Computing MIN */ i__3 = *kd, i__4 = *n - j; jlen = min(i__3,i__4); if (jlen > 0) { sumj = _starpu_ddot_(&jlen, &ab[j * ab_dim1 + 2], &c__1, & x[j + 1], &c__1); } } } else { /* Otherwise, use in-line code for the dot product. */ if (upper) { /* Computing MIN */ i__3 = *kd, i__4 = j - 1; jlen = min(i__3,i__4); i__3 = jlen; for (i__ = 1; i__ <= i__3; ++i__) { sumj += ab[*kd + i__ - jlen + j * ab_dim1] * uscal * x[j - jlen - 1 + i__]; /* L120: */ } } else { /* Computing MIN */ i__3 = *kd, i__4 = *n - j; jlen = min(i__3,i__4); i__3 = jlen; for (i__ = 1; i__ <= i__3; ++i__) { sumj += ab[i__ + 1 + j * ab_dim1] * uscal * x[j + i__]; /* L130: */ } } } if (uscal == tscal) { /* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) */ /* was not used to scale the dotproduct. */ x[j] -= sumj; xj = (d__1 = x[j], abs(d__1)); if (nounit) { /* Compute x(j) = x(j) / A(j,j), scaling if necessary. */ tjjs = ab[maind + j * ab_dim1] * tscal; } else { tjjs = tscal; if (tscal == 1.) { goto L150; } } tjj = abs(tjjs); if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ if (tjj < 1.) { if (xj > tjj * bignum) { /* Scale X by 1/abs(x(j)). */ rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j] /= tjjs; } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. */ rec = tjj * bignum / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } x[j] /= tjjs; } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A'*x = 0. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; /* L140: */ } x[j] = 1.; *scale = 0.; xmax = 0.; } L150: ; } else { /* Compute x(j) := x(j) / A(j,j) - sumj if the dot */ /* product has already been divided by 1/A(j,j). */ x[j] = x[j] / tjjs - sumj; } /* Computing MAX */ d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); xmax = max(d__2,d__3); /* L160: */ } } *scale /= tscal; } /* Scale the column norms by 1/TSCAL for return. */ if (tscal != 1.) { d__1 = 1. / tscal; _starpu_dscal_(n, &d__1, &cnorm[1], &c__1); } return 0; /* End of DLATBS */ } /* _starpu_dlatbs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatdf.c000066400000000000000000000245071413463044200206140ustar00rootroot00000000000000/* dlatdf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b23 = 1.; static doublereal c_b37 = -1.; /* Subroutine */ int _starpu_dlatdf_(integer *ijob, integer *n, doublereal *z__, integer *ldz, doublereal *rhs, doublereal *rdsum, doublereal *rdscal, integer *ipiv, integer *jpiv) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal bm, bp, xm[8], xp[8]; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer info; doublereal temp, work[32]; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); doublereal pmone; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal sminu; integer iwork[8]; doublereal splus; extern /* Subroutine */ int _starpu_dgesc2_(integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *), _starpu_dgecon_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *), _starpu_dlaswp_( integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLATDF uses the LU factorization of the n-by-n matrix Z computed by */ /* DGETC2 and computes a contribution to the reciprocal Dif-estimate */ /* by solving Z * x = b for x, and choosing the r.h.s. b such that */ /* the norm of x is as large as possible. On entry RHS = b holds the */ /* contribution from earlier solved sub-systems, and on return RHS = x. */ /* The factorization of Z returned by DGETC2 has the form Z = P*L*U*Q, */ /* where P and Q are permutation matrices. L is lower triangular with */ /* unit diagonal elements and U is upper triangular. */ /* Arguments */ /* ========= */ /* IJOB (input) INTEGER */ /* IJOB = 2: First compute an approximative null-vector e */ /* of Z using DGECON, e is normalized and solve for */ /* Zx = +-e - f with the sign giving the greater value */ /* of 2-norm(x). About 5 times as expensive as Default. */ /* IJOB .ne. 2: Local look ahead strategy where all entries of */ /* the r.h.s. b is choosen as either +1 or -1 (Default). */ /* N (input) INTEGER */ /* The number of columns of the matrix Z. */ /* Z (input) DOUBLE PRECISION array, dimension (LDZ, N) */ /* On entry, the LU part of the factorization of the n-by-n */ /* matrix Z computed by DGETC2: Z = P * L * U * Q */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDA >= max(1, N). */ /* RHS (input/output) DOUBLE PRECISION array, dimension N. */ /* On entry, RHS contains contributions from other subsystems. */ /* On exit, RHS contains the solution of the subsystem with */ /* entries acoording to the value of IJOB (see above). */ /* RDSUM (input/output) DOUBLE PRECISION */ /* On entry, the sum of squares of computed contributions to */ /* the Dif-estimate under computation by DTGSYL, where the */ /* scaling factor RDSCAL (see below) has been factored out. */ /* On exit, the corresponding sum of squares updated with the */ /* contributions from the current sub-system. */ /* If TRANS = 'T' RDSUM is not touched. */ /* NOTE: RDSUM only makes sense when DTGSY2 is called by STGSYL. */ /* RDSCAL (input/output) DOUBLE PRECISION */ /* On entry, scaling factor used to prevent overflow in RDSUM. */ /* On exit, RDSCAL is updated w.r.t. the current contributions */ /* in RDSUM. */ /* If TRANS = 'T', RDSCAL is not touched. */ /* NOTE: RDSCAL only makes sense when DTGSY2 is called by */ /* DTGSYL. */ /* IPIV (input) INTEGER array, dimension (N). */ /* The pivot indices; for 1 <= i <= N, row i of the */ /* matrix has been interchanged with row IPIV(i). */ /* JPIV (input) INTEGER array, dimension (N). */ /* The pivot indices; for 1 <= j <= N, column j of the */ /* matrix has been interchanged with column JPIV(j). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* This routine is a further developed implementation of algorithm */ /* BSOLVE in [1] using complete pivoting in the LU factorization. */ /* [1] Bo Kagstrom and Lars Westin, */ /* Generalized Schur Methods with Condition Estimators for */ /* Solving the Generalized Sylvester Equation, IEEE Transactions */ /* on Automatic Control, Vol. 34, No. 7, July 1989, pp 745-751. */ /* [2] Peter Poromaa, */ /* On Efficient and Robust Estimators for the Separation */ /* between two Regular Matrix Pairs with Applications in */ /* Condition Estimation. Report IMINF-95.05, Departement of */ /* Computing Science, Umea University, S-901 87 Umea, Sweden, 1995. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --rhs; --ipiv; --jpiv; /* Function Body */ if (*ijob != 2) { /* Apply permutations IPIV to RHS */ i__1 = *n - 1; _starpu_dlaswp_(&c__1, &rhs[1], ldz, &c__1, &i__1, &ipiv[1], &c__1); /* Solve for L-part choosing RHS either to +1 or -1. */ pmone = -1.; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { bp = rhs[j] + 1.; bm = rhs[j] - 1.; splus = 1.; /* Look-ahead for L-part RHS(1:N-1) = + or -1, SPLUS and */ /* SMIN computed more efficiently than in BSOLVE [1]. */ i__2 = *n - j; splus += _starpu_ddot_(&i__2, &z__[j + 1 + j * z_dim1], &c__1, &z__[j + 1 + j * z_dim1], &c__1); i__2 = *n - j; sminu = _starpu_ddot_(&i__2, &z__[j + 1 + j * z_dim1], &c__1, &rhs[j + 1], &c__1); splus *= rhs[j]; if (splus > sminu) { rhs[j] = bp; } else if (sminu > splus) { rhs[j] = bm; } else { /* In this case the updating sums are equal and we can */ /* choose RHS(J) +1 or -1. The first time this happens */ /* we choose -1, thereafter +1. This is a simple way to */ /* get good estimates of matrices like Byers well-known */ /* example (see [1]). (Not done in BSOLVE.) */ rhs[j] += pmone; pmone = 1.; } /* Compute the remaining r.h.s. */ temp = -rhs[j]; i__2 = *n - j; _starpu_daxpy_(&i__2, &temp, &z__[j + 1 + j * z_dim1], &c__1, &rhs[j + 1], &c__1); /* L10: */ } /* Solve for U-part, look-ahead for RHS(N) = +-1. This is not done */ /* in BSOLVE and will hopefully give us a better estimate because */ /* any ill-conditioning of the original matrix is transfered to U */ /* and not to L. U(N, N) is an approximation to sigma_min(LU). */ i__1 = *n - 1; _starpu_dcopy_(&i__1, &rhs[1], &c__1, xp, &c__1); xp[*n - 1] = rhs[*n] + 1.; rhs[*n] += -1.; splus = 0.; sminu = 0.; for (i__ = *n; i__ >= 1; --i__) { temp = 1. / z__[i__ + i__ * z_dim1]; xp[i__ - 1] *= temp; rhs[i__] *= temp; i__1 = *n; for (k = i__ + 1; k <= i__1; ++k) { xp[i__ - 1] -= xp[k - 1] * (z__[i__ + k * z_dim1] * temp); rhs[i__] -= rhs[k] * (z__[i__ + k * z_dim1] * temp); /* L20: */ } splus += (d__1 = xp[i__ - 1], abs(d__1)); sminu += (d__1 = rhs[i__], abs(d__1)); /* L30: */ } if (splus > sminu) { _starpu_dcopy_(n, xp, &c__1, &rhs[1], &c__1); } /* Apply the permutations JPIV to the computed solution (RHS) */ i__1 = *n - 1; _starpu_dlaswp_(&c__1, &rhs[1], ldz, &c__1, &i__1, &jpiv[1], &c_n1); /* Compute the sum of squares */ _starpu_dlassq_(n, &rhs[1], &c__1, rdscal, rdsum); } else { /* IJOB = 2, Compute approximate nullvector XM of Z */ _starpu_dgecon_("I", n, &z__[z_offset], ldz, &c_b23, &temp, work, iwork, & info); _starpu_dcopy_(n, &work[*n], &c__1, xm, &c__1); /* Compute RHS */ i__1 = *n - 1; _starpu_dlaswp_(&c__1, xm, ldz, &c__1, &i__1, &ipiv[1], &c_n1); temp = 1. / sqrt(_starpu_ddot_(n, xm, &c__1, xm, &c__1)); _starpu_dscal_(n, &temp, xm, &c__1); _starpu_dcopy_(n, xm, &c__1, xp, &c__1); _starpu_daxpy_(n, &c_b23, &rhs[1], &c__1, xp, &c__1); _starpu_daxpy_(n, &c_b37, xm, &c__1, &rhs[1], &c__1); _starpu_dgesc2_(n, &z__[z_offset], ldz, &rhs[1], &ipiv[1], &jpiv[1], &temp); _starpu_dgesc2_(n, &z__[z_offset], ldz, xp, &ipiv[1], &jpiv[1], &temp); if (_starpu_dasum_(n, xp, &c__1) > _starpu_dasum_(n, &rhs[1], &c__1)) { _starpu_dcopy_(n, xp, &c__1, &rhs[1], &c__1); } /* Compute the sum of squares */ _starpu_dlassq_(n, &rhs[1], &c__1, rdscal, rdsum); } return 0; /* End of DLATDF */ } /* _starpu_dlatdf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatps.c000066400000000000000000000522631413463044200206450ustar00rootroot00000000000000/* dlatps.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b36 = .5; /* Subroutine */ int _starpu_dlatps_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublereal *ap, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, ip; doublereal xj, rec, tjj; integer jinc, jlen; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal xbnd; integer imax; doublereal tmax, tjjs, xmax, grow, sumj; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal tscal, uscal; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); integer jlast; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; logical notran; integer jfirst; doublereal smlnum; logical nounit; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLATPS solves one of the triangular systems */ /* A *x = s*b or A'*x = s*b */ /* with scaling to prevent overflow, where A is an upper or lower */ /* triangular matrix stored in packed form. Here A' denotes the */ /* transpose of A, x and b are n-element vectors, and s is a scaling */ /* factor, usually less than or equal to 1, chosen so that the */ /* components of x will be less than the overflow threshold. If the */ /* unscaled problem will not cause overflow, the Level 2 BLAS routine */ /* DTPSV is called. If the matrix A is singular (A(j,j) = 0 for some j), */ /* then s is set to 0 and a non-trivial solution to A*x = 0 is returned. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* TRANS (input) CHARACTER*1 */ /* Specifies the operation applied to A. */ /* = 'N': Solve A * x = s*b (No transpose) */ /* = 'T': Solve A'* x = s*b (Transpose) */ /* = 'C': Solve A'* x = s*b (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A is unit triangular. */ /* = 'N': Non-unit triangular */ /* = 'U': Unit triangular */ /* NORMIN (input) CHARACTER*1 */ /* Specifies whether CNORM has been set or not. */ /* = 'Y': CNORM contains the column norms on entry */ /* = 'N': CNORM is not set on entry. On exit, the norms will */ /* be computed and stored in CNORM. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangular matrix A, packed columnwise in */ /* a linear array. The j-th column of A is stored in the array */ /* AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* X (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the right hand side b of the triangular system. */ /* On exit, X is overwritten by the solution vector x. */ /* SCALE (output) DOUBLE PRECISION */ /* The scaling factor s for the triangular system */ /* A * x = s*b or A'* x = s*b. */ /* If SCALE = 0, the matrix A is singular or badly scaled, and */ /* the vector x is an exact or approximate solution to A*x = 0. */ /* CNORM (input or output) DOUBLE PRECISION array, dimension (N) */ /* If NORMIN = 'Y', CNORM is an input argument and CNORM(j) */ /* contains the norm of the off-diagonal part of the j-th column */ /* of A. If TRANS = 'N', CNORM(j) must be greater than or equal */ /* to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) */ /* must be greater than or equal to the 1-norm. */ /* If NORMIN = 'N', CNORM is an output argument and CNORM(j) */ /* returns the 1-norm of the offdiagonal part of the j-th column */ /* of A. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* Further Details */ /* ======= ======= */ /* A rough bound on x is computed; if that is less than overflow, DTPSV */ /* is called, otherwise, specific code is used which checks for possible */ /* overflow or divide-by-zero at every operation. */ /* A columnwise scheme is used for solving A*x = b. The basic algorithm */ /* if A is lower triangular is */ /* x[1:n] := b[1:n] */ /* for j = 1, ..., n */ /* x(j) := x(j) / A(j,j) */ /* x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] */ /* end */ /* Define bounds on the components of x after j iterations of the loop: */ /* M(j) = bound on x[1:j] */ /* G(j) = bound on x[j+1:n] */ /* Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. */ /* Then for iteration j+1 we have */ /* M(j+1) <= G(j) / | A(j+1,j+1) | */ /* G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | */ /* <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) */ /* where CNORM(j+1) is greater than or equal to the infinity-norm of */ /* column j+1 of A, not counting the diagonal. Hence */ /* G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) */ /* 1<=i<=j */ /* and */ /* |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) */ /* 1<=i< j */ /* Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTPSV if the */ /* reciprocal of the largest M(j), j=1,..,n, is larger than */ /* max(underflow, 1/overflow). */ /* The bound on x(j) is also used to determine when a step in the */ /* columnwise method can be performed without fear of overflow. If */ /* the computed bound is greater than a large constant, x is scaled to */ /* prevent overflow, but if the bound overflows, x is set to 0, x(j) to */ /* 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. */ /* Similarly, a row-wise scheme is used to solve A'*x = b. The basic */ /* algorithm for A upper triangular is */ /* for j = 1, ..., n */ /* x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j) */ /* end */ /* We simultaneously compute two bounds */ /* G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j */ /* M(j) = bound on x(i), 1<=i<=j */ /* The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we */ /* add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. */ /* Then the bound on x(j) is */ /* M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | */ /* <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) */ /* 1<=i<=j */ /* and we can safely call DTPSV if 1/M(n) and 1/G(n) are both greater */ /* than max(underflow, 1/overflow). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --cnorm; --x; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); notran = _starpu_lsame_(trans, "N"); nounit = _starpu_lsame_(diag, "N"); /* Test the input parameters. */ if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (! _starpu_lsame_(normin, "Y") && ! _starpu_lsame_(normin, "N")) { *info = -4; } else if (*n < 0) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLATPS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine machine dependent parameters to control overflow. */ smlnum = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); bignum = 1. / smlnum; *scale = 1.; if (_starpu_lsame_(normin, "N")) { /* Compute the 1-norm of each column, not including the diagonal. */ if (upper) { /* A is upper triangular. */ ip = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; cnorm[j] = _starpu_dasum_(&i__2, &ap[ip], &c__1); ip += j; /* L10: */ } } else { /* A is lower triangular. */ ip = 1; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; cnorm[j] = _starpu_dasum_(&i__2, &ap[ip + 1], &c__1); ip = ip + *n - j + 1; /* L20: */ } cnorm[*n] = 0.; } } /* Scale the column norms by TSCAL if the maximum element in CNORM is */ /* greater than BIGNUM. */ imax = _starpu_idamax_(n, &cnorm[1], &c__1); tmax = cnorm[imax]; if (tmax <= bignum) { tscal = 1.; } else { tscal = 1. / (smlnum * tmax); _starpu_dscal_(n, &tscal, &cnorm[1], &c__1); } /* Compute a bound on the computed solution vector to see if the */ /* Level 2 BLAS routine DTPSV can be used. */ j = _starpu_idamax_(n, &x[1], &c__1); xmax = (d__1 = x[j], abs(d__1)); xbnd = xmax; if (notran) { /* Compute the growth in A * x = b. */ if (upper) { jfirst = *n; jlast = 1; jinc = -1; } else { jfirst = 1; jlast = *n; jinc = 1; } if (tscal != 1.) { grow = 0.; goto L50; } if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, G(0) = max{x(i), i=1,...,n}. */ grow = 1. / max(xbnd,smlnum); xbnd = grow; ip = jfirst * (jfirst + 1) / 2; jlen = *n; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L50; } /* M(j) = G(j-1) / abs(A(j,j)) */ tjj = (d__1 = ap[ip], abs(d__1)); /* Computing MIN */ d__1 = xbnd, d__2 = min(1.,tjj) * grow; xbnd = min(d__1,d__2); if (tjj + cnorm[j] >= smlnum) { /* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) */ grow *= tjj / (tjj + cnorm[j]); } else { /* G(j) could overflow, set GROW to 0. */ grow = 0.; } ip += jinc * jlen; --jlen; /* L30: */ } grow = xbnd; } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ d__1 = 1., d__2 = 1. / max(xbnd,smlnum); grow = min(d__1,d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L50; } /* G(j) = G(j-1)*( 1 + CNORM(j) ) */ grow *= 1. / (cnorm[j] + 1.); /* L40: */ } } L50: ; } else { /* Compute the growth in A' * x = b. */ if (upper) { jfirst = 1; jlast = *n; jinc = 1; } else { jfirst = *n; jlast = 1; jinc = -1; } if (tscal != 1.) { grow = 0.; goto L80; } if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, M(0) = max{x(i), i=1,...,n}. */ grow = 1. / max(xbnd,smlnum); xbnd = grow; ip = jfirst * (jfirst + 1) / 2; jlen = 1; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L80; } /* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) */ xj = cnorm[j] + 1.; /* Computing MIN */ d__1 = grow, d__2 = xbnd / xj; grow = min(d__1,d__2); /* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) */ tjj = (d__1 = ap[ip], abs(d__1)); if (xj > tjj) { xbnd *= tjj / xj; } ++jlen; ip += jinc * jlen; /* L60: */ } grow = min(grow,xbnd); } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ d__1 = 1., d__2 = 1. / max(xbnd,smlnum); grow = min(d__1,d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L80; } /* G(j) = ( 1 + CNORM(j) )*G(j-1) */ xj = cnorm[j] + 1.; grow /= xj; /* L70: */ } } L80: ; } if (grow * tscal > smlnum) { /* Use the Level 2 BLAS solve if the reciprocal of the bound on */ /* elements of X is not too small. */ _starpu_dtpsv_(uplo, trans, diag, n, &ap[1], &x[1], &c__1); } else { /* Use a Level 1 BLAS solve, scaling intermediate results. */ if (xmax > bignum) { /* Scale X so that its components are less than or equal to */ /* BIGNUM in absolute value. */ *scale = bignum / xmax; _starpu_dscal_(n, scale, &x[1], &c__1); xmax = bignum; } if (notran) { /* Solve A * x = b */ ip = jfirst * (jfirst + 1) / 2; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Compute x(j) = b(j) / A(j,j), scaling x if necessary. */ xj = (d__1 = x[j], abs(d__1)); if (nounit) { tjjs = ap[ip] * tscal; } else { tjjs = tscal; if (tscal == 1.) { goto L100; } } tjj = abs(tjjs); if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ if (tjj < 1.) { if (xj > tjj * bignum) { /* Scale x by 1/b(j). */ rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM */ /* to avoid overflow when dividing by A(j,j). */ rec = tjj * bignum / xj; if (cnorm[j] > 1.) { /* Scale by 1/CNORM(j) to avoid overflow when */ /* multiplying x(j) times column j. */ rec /= cnorm[j]; } _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A*x = 0. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; /* L90: */ } x[j] = 1.; xj = 1.; *scale = 0.; xmax = 0.; } L100: /* Scale x if necessary to avoid overflow when adding a */ /* multiple of column j of A. */ if (xj > 1.) { rec = 1. / xj; if (cnorm[j] > (bignum - xmax) * rec) { /* Scale x by 1/(2*abs(x(j))). */ rec *= .5; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; } } else if (xj * cnorm[j] > bignum - xmax) { /* Scale x by 1/2. */ _starpu_dscal_(n, &c_b36, &x[1], &c__1); *scale *= .5; } if (upper) { if (j > 1) { /* Compute the update */ /* x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j) */ i__3 = j - 1; d__1 = -x[j] * tscal; _starpu_daxpy_(&i__3, &d__1, &ap[ip - j + 1], &c__1, &x[1], & c__1); i__3 = j - 1; i__ = _starpu_idamax_(&i__3, &x[1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } ip -= j; } else { if (j < *n) { /* Compute the update */ /* x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j) */ i__3 = *n - j; d__1 = -x[j] * tscal; _starpu_daxpy_(&i__3, &d__1, &ap[ip + 1], &c__1, &x[j + 1], & c__1); i__3 = *n - j; i__ = j + _starpu_idamax_(&i__3, &x[j + 1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } ip = ip + *n - j + 1; } /* L110: */ } } else { /* Solve A' * x = b */ ip = jfirst * (jfirst + 1) / 2; jlen = 1; i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Compute x(j) = b(j) - sum A(k,j)*x(k). */ /* k<>j */ xj = (d__1 = x[j], abs(d__1)); uscal = tscal; rec = 1. / max(xmax,1.); if (cnorm[j] > (bignum - xj) * rec) { /* If x(j) could overflow, scale x by 1/(2*XMAX). */ rec *= .5; if (nounit) { tjjs = ap[ip] * tscal; } else { tjjs = tscal; } tjj = abs(tjjs); if (tjj > 1.) { /* Divide by A(j,j) when scaling x if A(j,j) > 1. */ /* Computing MIN */ d__1 = 1., d__2 = rec * tjj; rec = min(d__1,d__2); uscal /= tjjs; } if (rec < 1.) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } sumj = 0.; if (uscal == 1.) { /* If the scaling needed for A in the dot product is 1, */ /* call DDOT to perform the dot product. */ if (upper) { i__3 = j - 1; sumj = _starpu_ddot_(&i__3, &ap[ip - j + 1], &c__1, &x[1], & c__1); } else if (j < *n) { i__3 = *n - j; sumj = _starpu_ddot_(&i__3, &ap[ip + 1], &c__1, &x[j + 1], & c__1); } } else { /* Otherwise, use in-line code for the dot product. */ if (upper) { i__3 = j - 1; for (i__ = 1; i__ <= i__3; ++i__) { sumj += ap[ip - j + i__] * uscal * x[i__]; /* L120: */ } } else if (j < *n) { i__3 = *n - j; for (i__ = 1; i__ <= i__3; ++i__) { sumj += ap[ip + i__] * uscal * x[j + i__]; /* L130: */ } } } if (uscal == tscal) { /* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) */ /* was not used to scale the dotproduct. */ x[j] -= sumj; xj = (d__1 = x[j], abs(d__1)); if (nounit) { /* Compute x(j) = x(j) / A(j,j), scaling if necessary. */ tjjs = ap[ip] * tscal; } else { tjjs = tscal; if (tscal == 1.) { goto L150; } } tjj = abs(tjjs); if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ if (tjj < 1.) { if (xj > tjj * bignum) { /* Scale X by 1/abs(x(j)). */ rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j] /= tjjs; } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. */ rec = tjj * bignum / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } x[j] /= tjjs; } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A'*x = 0. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; /* L140: */ } x[j] = 1.; *scale = 0.; xmax = 0.; } L150: ; } else { /* Compute x(j) := x(j) / A(j,j) - sumj if the dot */ /* product has already been divided by 1/A(j,j). */ x[j] = x[j] / tjjs - sumj; } /* Computing MAX */ d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); xmax = max(d__2,d__3); ++jlen; ip += jinc * jlen; /* L160: */ } } *scale /= tscal; } /* Scale the column norms by 1/TSCAL for return. */ if (tscal != 1.) { d__1 = 1. / tscal; _starpu_dscal_(n, &d__1, &cnorm[1], &c__1); } return 0; /* End of DLATPS */ } /* _starpu_dlatps_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatrd.c000066400000000000000000000303321413463044200206210ustar00rootroot00000000000000/* dlatrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b5 = -1.; static doublereal c_b6 = 1.; static integer c__1 = 1; static doublereal c_b16 = 0.; /* Subroutine */ int _starpu_dlatrd_(char *uplo, integer *n, integer *nb, doublereal * a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, integer *ldw) { /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; /* Local variables */ integer i__, iw; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal alpha; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLATRD reduces NB rows and columns of a real symmetric matrix A to */ /* symmetric tridiagonal form by an orthogonal similarity */ /* transformation Q' * A * Q, and returns the matrices V and W which are */ /* needed to apply the transformation to the unreduced part of A. */ /* If UPLO = 'U', DLATRD reduces the last NB rows and columns of a */ /* matrix, of which the upper triangle is supplied; */ /* if UPLO = 'L', DLATRD reduces the first NB rows and columns of a */ /* matrix, of which the lower triangle is supplied. */ /* This is an auxiliary routine called by DSYTRD. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. */ /* NB (input) INTEGER */ /* The number of rows and columns to be reduced. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n-by-n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n-by-n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit: */ /* if UPLO = 'U', the last NB columns have been reduced to */ /* tridiagonal form, with the diagonal elements overwriting */ /* the diagonal elements of A; the elements above the diagonal */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors; */ /* if UPLO = 'L', the first NB columns have been reduced to */ /* tridiagonal form, with the diagonal elements overwriting */ /* the diagonal elements of A; the elements below the diagonal */ /* with the array TAU, represent the orthogonal matrix Q as a */ /* product of elementary reflectors. */ /* See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= (1,N). */ /* E (output) DOUBLE PRECISION array, dimension (N-1) */ /* If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal */ /* elements of the last NB columns of the reduced matrix; */ /* if UPLO = 'L', E(1:nb) contains the subdiagonal elements of */ /* the first NB columns of the reduced matrix. */ /* TAU (output) DOUBLE PRECISION array, dimension (N-1) */ /* The scalar factors of the elementary reflectors, stored in */ /* TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. */ /* See Further Details. */ /* W (output) DOUBLE PRECISION array, dimension (LDW,NB) */ /* The n-by-nb matrix W required to update the unreduced part */ /* of A. */ /* LDW (input) INTEGER */ /* The leading dimension of the array W. LDW >= max(1,N). */ /* Further Details */ /* =============== */ /* If UPLO = 'U', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(n) H(n-1) . . . H(n-nb+1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), */ /* and tau in TAU(i-1). */ /* If UPLO = 'L', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(1) H(2) . . . H(nb). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), */ /* and tau in TAU(i). */ /* The elements of the vectors v together form the n-by-nb matrix V */ /* which is needed, with W, to apply the transformation to the unreduced */ /* part of the matrix, using a symmetric rank-2k update of the form: */ /* A := A - V*W' - W*V'. */ /* The contents of A on exit are illustrated by the following examples */ /* with n = 5 and nb = 2: */ /* if UPLO = 'U': if UPLO = 'L': */ /* ( a a a v4 v5 ) ( d ) */ /* ( a a v4 v5 ) ( 1 d ) */ /* ( a 1 v5 ) ( v1 1 a ) */ /* ( d 1 ) ( v1 v2 a a ) */ /* ( d ) ( v1 v2 a a a ) */ /* where d denotes a diagonal element of the reduced matrix, a denotes */ /* an element of the original matrix that is unchanged, and vi denotes */ /* an element of the vector defining H(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --e; --tau; w_dim1 = *ldw; w_offset = 1 + w_dim1; w -= w_offset; /* Function Body */ if (*n <= 0) { return 0; } if (_starpu_lsame_(uplo, "U")) { /* Reduce last NB columns of upper triangle */ i__1 = *n - *nb + 1; for (i__ = *n; i__ >= i__1; --i__) { iw = i__ - *n + *nb; if (i__ < *n) { /* Update A(1:i,i) */ i__2 = *n - i__; _starpu_dgemv_("No transpose", &i__, &i__2, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & c_b6, &a[i__ * a_dim1 + 1], &c__1); i__2 = *n - i__; _starpu_dgemv_("No transpose", &i__, &i__2, &c_b5, &w[(iw + 1) * w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & c_b6, &a[i__ * a_dim1 + 1], &c__1); } if (i__ > 1) { /* Generate elementary reflector H(i) to annihilate */ /* A(1:i-2,i) */ i__2 = i__ - 1; _starpu_dlarfg_(&i__2, &a[i__ - 1 + i__ * a_dim1], &a[i__ * a_dim1 + 1], &c__1, &tau[i__ - 1]); e[i__ - 1] = a[i__ - 1 + i__ * a_dim1]; a[i__ - 1 + i__ * a_dim1] = 1.; /* Compute W(1:i-1,i) */ i__2 = i__ - 1; _starpu_dsymv_("Upper", &i__2, &c_b6, &a[a_offset], lda, &a[i__ * a_dim1 + 1], &c__1, &c_b16, &w[iw * w_dim1 + 1], & c__1); if (i__ < *n) { i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b6, &w[(iw + 1) * w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], &c__1, & c_b16, &w[i__ + 1 + iw * w_dim1], &c__1); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b6, &a[(i__ + 1) * a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], &c__1, & c_b16, &w[i__ + 1 + iw * w_dim1], &c__1); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &w[(iw + 1) * w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1); } i__2 = i__ - 1; _starpu_dscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); i__2 = i__ - 1; alpha = tau[i__ - 1] * -.5 * _starpu_ddot_(&i__2, &w[iw * w_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], &c__1); i__2 = i__ - 1; _starpu_daxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * w_dim1 + 1], &c__1); } /* L10: */ } } else { /* Reduce first NB columns of lower triangle */ i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:n,i) */ i__2 = *n - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, &w[i__ + w_dim1], ldw, &c_b6, &a[i__ + i__ * a_dim1], & c__1); i__2 = *n - i__ + 1; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &w[i__ + w_dim1], ldw, &a[i__ + a_dim1], lda, &c_b6, &a[i__ + i__ * a_dim1], & c__1); if (i__ < *n) { /* Generate elementary reflector H(i) to annihilate */ /* A(i+2:n,i) */ i__2 = *n - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *n)+ i__ * a_dim1], &c__1, &tau[i__]); e[i__] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; /* Compute W(i+1:n,i) */ i__2 = *n - i__; _starpu_dsymv_("Lower", &i__2, &c_b6, &a[i__ + 1 + (i__ + 1) * a_dim1] , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ i__ + 1 + i__ * w_dim1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b6, &w[i__ + 1 + w_dim1], ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ i__ * w_dim1 + 1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ i__ + 1 + i__ * w_dim1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b6, &a[i__ + 1 + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ i__ * w_dim1 + 1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b5, &w[i__ + 1 + w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ i__ + 1 + i__ * w_dim1], &c__1); i__2 = *n - i__; _starpu_dscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); i__2 = *n - i__; alpha = tau[i__] * -.5 * _starpu_ddot_(&i__2, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); i__2 = *n - i__; _starpu_daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ i__ + 1 + i__ * w_dim1], &c__1); } /* L20: */ } } return 0; /* End of DLATRD */ } /* _starpu_dlatrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatrs.c000066400000000000000000000525671413463044200206560ustar00rootroot00000000000000/* dlatrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b36 = .5; /* Subroutine */ int _starpu_dlatrs_(char *uplo, char *trans, char *diag, char * normin, integer *n, doublereal *a, integer *lda, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j; doublereal xj, rec, tjj; integer jinc; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal xbnd; integer imax; doublereal tmax, tjjs, xmax, grow, sumj; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal tscal, uscal; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); integer jlast; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtrsv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; logical notran; integer jfirst; doublereal smlnum; logical nounit; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLATRS solves one of the triangular systems */ /* A *x = s*b or A'*x = s*b */ /* with scaling to prevent overflow. Here A is an upper or lower */ /* triangular matrix, A' denotes the transpose of A, x and b are */ /* n-element vectors, and s is a scaling factor, usually less than */ /* or equal to 1, chosen so that the components of x will be less than */ /* the overflow threshold. If the unscaled problem will not cause */ /* overflow, the Level 2 BLAS routine DTRSV is called. If the matrix A */ /* is singular (A(j,j) = 0 for some j), then s is set to 0 and a */ /* non-trivial solution to A*x = 0 is returned. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* TRANS (input) CHARACTER*1 */ /* Specifies the operation applied to A. */ /* = 'N': Solve A * x = s*b (No transpose) */ /* = 'T': Solve A'* x = s*b (Transpose) */ /* = 'C': Solve A'* x = s*b (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A is unit triangular. */ /* = 'N': Non-unit triangular */ /* = 'U': Unit triangular */ /* NORMIN (input) CHARACTER*1 */ /* Specifies whether CNORM has been set or not. */ /* = 'Y': CNORM contains the column norms on entry */ /* = 'N': CNORM is not set on entry. On exit, the norms will */ /* be computed and stored in CNORM. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular matrix A. If UPLO = 'U', the leading n by n */ /* upper triangular part of the array A contains the upper */ /* triangular matrix, and the strictly lower triangular part of */ /* A is not referenced. If UPLO = 'L', the leading n by n lower */ /* triangular part of the array A contains the lower triangular */ /* matrix, and the strictly upper triangular part of A is not */ /* referenced. If DIAG = 'U', the diagonal elements of A are */ /* also not referenced and are assumed to be 1. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max (1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the right hand side b of the triangular system. */ /* On exit, X is overwritten by the solution vector x. */ /* SCALE (output) DOUBLE PRECISION */ /* The scaling factor s for the triangular system */ /* A * x = s*b or A'* x = s*b. */ /* If SCALE = 0, the matrix A is singular or badly scaled, and */ /* the vector x is an exact or approximate solution to A*x = 0. */ /* CNORM (input or output) DOUBLE PRECISION array, dimension (N) */ /* If NORMIN = 'Y', CNORM is an input argument and CNORM(j) */ /* contains the norm of the off-diagonal part of the j-th column */ /* of A. If TRANS = 'N', CNORM(j) must be greater than or equal */ /* to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) */ /* must be greater than or equal to the 1-norm. */ /* If NORMIN = 'N', CNORM is an output argument and CNORM(j) */ /* returns the 1-norm of the offdiagonal part of the j-th column */ /* of A. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* Further Details */ /* ======= ======= */ /* A rough bound on x is computed; if that is less than overflow, DTRSV */ /* is called, otherwise, specific code is used which checks for possible */ /* overflow or divide-by-zero at every operation. */ /* A columnwise scheme is used for solving A*x = b. The basic algorithm */ /* if A is lower triangular is */ /* x[1:n] := b[1:n] */ /* for j = 1, ..., n */ /* x(j) := x(j) / A(j,j) */ /* x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] */ /* end */ /* Define bounds on the components of x after j iterations of the loop: */ /* M(j) = bound on x[1:j] */ /* G(j) = bound on x[j+1:n] */ /* Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. */ /* Then for iteration j+1 we have */ /* M(j+1) <= G(j) / | A(j+1,j+1) | */ /* G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | */ /* <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) */ /* where CNORM(j+1) is greater than or equal to the infinity-norm of */ /* column j+1 of A, not counting the diagonal. Hence */ /* G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) */ /* 1<=i<=j */ /* and */ /* |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) */ /* 1<=i< j */ /* Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the */ /* reciprocal of the largest M(j), j=1,..,n, is larger than */ /* max(underflow, 1/overflow). */ /* The bound on x(j) is also used to determine when a step in the */ /* columnwise method can be performed without fear of overflow. If */ /* the computed bound is greater than a large constant, x is scaled to */ /* prevent overflow, but if the bound overflows, x is set to 0, x(j) to */ /* 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. */ /* Similarly, a row-wise scheme is used to solve A'*x = b. The basic */ /* algorithm for A upper triangular is */ /* for j = 1, ..., n */ /* x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j) */ /* end */ /* We simultaneously compute two bounds */ /* G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j */ /* M(j) = bound on x(i), 1<=i<=j */ /* The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we */ /* add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. */ /* Then the bound on x(j) is */ /* M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | */ /* <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) */ /* 1<=i<=j */ /* and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater */ /* than max(underflow, 1/overflow). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --cnorm; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); notran = _starpu_lsame_(trans, "N"); nounit = _starpu_lsame_(diag, "N"); /* Test the input parameters. */ if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (! _starpu_lsame_(normin, "Y") && ! _starpu_lsame_(normin, "N")) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLATRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine machine dependent parameters to control overflow. */ smlnum = _starpu_dlamch_("Safe minimum") / _starpu_dlamch_("Precision"); bignum = 1. / smlnum; *scale = 1.; if (_starpu_lsame_(normin, "N")) { /* Compute the 1-norm of each column, not including the diagonal. */ if (upper) { /* A is upper triangular. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; cnorm[j] = _starpu_dasum_(&i__2, &a[j * a_dim1 + 1], &c__1); /* L10: */ } } else { /* A is lower triangular. */ i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; cnorm[j] = _starpu_dasum_(&i__2, &a[j + 1 + j * a_dim1], &c__1); /* L20: */ } cnorm[*n] = 0.; } } /* Scale the column norms by TSCAL if the maximum element in CNORM is */ /* greater than BIGNUM. */ imax = _starpu_idamax_(n, &cnorm[1], &c__1); tmax = cnorm[imax]; if (tmax <= bignum) { tscal = 1.; } else { tscal = 1. / (smlnum * tmax); _starpu_dscal_(n, &tscal, &cnorm[1], &c__1); } /* Compute a bound on the computed solution vector to see if the */ /* Level 2 BLAS routine DTRSV can be used. */ j = _starpu_idamax_(n, &x[1], &c__1); xmax = (d__1 = x[j], abs(d__1)); xbnd = xmax; if (notran) { /* Compute the growth in A * x = b. */ if (upper) { jfirst = *n; jlast = 1; jinc = -1; } else { jfirst = 1; jlast = *n; jinc = 1; } if (tscal != 1.) { grow = 0.; goto L50; } if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, G(0) = max{x(i), i=1,...,n}. */ grow = 1. / max(xbnd,smlnum); xbnd = grow; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L50; } /* M(j) = G(j-1) / abs(A(j,j)) */ tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); /* Computing MIN */ d__1 = xbnd, d__2 = min(1.,tjj) * grow; xbnd = min(d__1,d__2); if (tjj + cnorm[j] >= smlnum) { /* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) */ grow *= tjj / (tjj + cnorm[j]); } else { /* G(j) could overflow, set GROW to 0. */ grow = 0.; } /* L30: */ } grow = xbnd; } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ d__1 = 1., d__2 = 1. / max(xbnd,smlnum); grow = min(d__1,d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L50; } /* G(j) = G(j-1)*( 1 + CNORM(j) ) */ grow *= 1. / (cnorm[j] + 1.); /* L40: */ } } L50: ; } else { /* Compute the growth in A' * x = b. */ if (upper) { jfirst = 1; jlast = *n; jinc = 1; } else { jfirst = *n; jlast = 1; jinc = -1; } if (tscal != 1.) { grow = 0.; goto L80; } if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, M(0) = max{x(i), i=1,...,n}. */ grow = 1. / max(xbnd,smlnum); xbnd = grow; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L80; } /* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) */ xj = cnorm[j] + 1.; /* Computing MIN */ d__1 = grow, d__2 = xbnd / xj; grow = min(d__1,d__2); /* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) */ tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); if (xj > tjj) { xbnd *= tjj / xj; } /* L60: */ } grow = min(grow,xbnd); } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ d__1 = 1., d__2 = 1. / max(xbnd,smlnum); grow = min(d__1,d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ if (grow <= smlnum) { goto L80; } /* G(j) = ( 1 + CNORM(j) )*G(j-1) */ xj = cnorm[j] + 1.; grow /= xj; /* L70: */ } } L80: ; } if (grow * tscal > smlnum) { /* Use the Level 2 BLAS solve if the reciprocal of the bound on */ /* elements of X is not too small. */ _starpu_dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1); } else { /* Use a Level 1 BLAS solve, scaling intermediate results. */ if (xmax > bignum) { /* Scale X so that its components are less than or equal to */ /* BIGNUM in absolute value. */ *scale = bignum / xmax; _starpu_dscal_(n, scale, &x[1], &c__1); xmax = bignum; } if (notran) { /* Solve A * x = b */ i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Compute x(j) = b(j) / A(j,j), scaling x if necessary. */ xj = (d__1 = x[j], abs(d__1)); if (nounit) { tjjs = a[j + j * a_dim1] * tscal; } else { tjjs = tscal; if (tscal == 1.) { goto L100; } } tjj = abs(tjjs); if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ if (tjj < 1.) { if (xj > tjj * bignum) { /* Scale x by 1/b(j). */ rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM */ /* to avoid overflow when dividing by A(j,j). */ rec = tjj * bignum / xj; if (cnorm[j] > 1.) { /* Scale by 1/CNORM(j) to avoid overflow when */ /* multiplying x(j) times column j. */ rec /= cnorm[j]; } _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A*x = 0. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; /* L90: */ } x[j] = 1.; xj = 1.; *scale = 0.; xmax = 0.; } L100: /* Scale x if necessary to avoid overflow when adding a */ /* multiple of column j of A. */ if (xj > 1.) { rec = 1. / xj; if (cnorm[j] > (bignum - xmax) * rec) { /* Scale x by 1/(2*abs(x(j))). */ rec *= .5; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; } } else if (xj * cnorm[j] > bignum - xmax) { /* Scale x by 1/2. */ _starpu_dscal_(n, &c_b36, &x[1], &c__1); *scale *= .5; } if (upper) { if (j > 1) { /* Compute the update */ /* x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j) */ i__3 = j - 1; d__1 = -x[j] * tscal; _starpu_daxpy_(&i__3, &d__1, &a[j * a_dim1 + 1], &c__1, &x[1], &c__1); i__3 = j - 1; i__ = _starpu_idamax_(&i__3, &x[1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } } else { if (j < *n) { /* Compute the update */ /* x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j) */ i__3 = *n - j; d__1 = -x[j] * tscal; _starpu_daxpy_(&i__3, &d__1, &a[j + 1 + j * a_dim1], &c__1, & x[j + 1], &c__1); i__3 = *n - j; i__ = j + _starpu_idamax_(&i__3, &x[j + 1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } } /* L110: */ } } else { /* Solve A' * x = b */ i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Compute x(j) = b(j) - sum A(k,j)*x(k). */ /* k<>j */ xj = (d__1 = x[j], abs(d__1)); uscal = tscal; rec = 1. / max(xmax,1.); if (cnorm[j] > (bignum - xj) * rec) { /* If x(j) could overflow, scale x by 1/(2*XMAX). */ rec *= .5; if (nounit) { tjjs = a[j + j * a_dim1] * tscal; } else { tjjs = tscal; } tjj = abs(tjjs); if (tjj > 1.) { /* Divide by A(j,j) when scaling x if A(j,j) > 1. */ /* Computing MIN */ d__1 = 1., d__2 = rec * tjj; rec = min(d__1,d__2); uscal /= tjjs; } if (rec < 1.) { _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } sumj = 0.; if (uscal == 1.) { /* If the scaling needed for A in the dot product is 1, */ /* call DDOT to perform the dot product. */ if (upper) { i__3 = j - 1; sumj = _starpu_ddot_(&i__3, &a[j * a_dim1 + 1], &c__1, &x[1], &c__1); } else if (j < *n) { i__3 = *n - j; sumj = _starpu_ddot_(&i__3, &a[j + 1 + j * a_dim1], &c__1, &x[ j + 1], &c__1); } } else { /* Otherwise, use in-line code for the dot product. */ if (upper) { i__3 = j - 1; for (i__ = 1; i__ <= i__3; ++i__) { sumj += a[i__ + j * a_dim1] * uscal * x[i__]; /* L120: */ } } else if (j < *n) { i__3 = *n; for (i__ = j + 1; i__ <= i__3; ++i__) { sumj += a[i__ + j * a_dim1] * uscal * x[i__]; /* L130: */ } } } if (uscal == tscal) { /* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) */ /* was not used to scale the dotproduct. */ x[j] -= sumj; xj = (d__1 = x[j], abs(d__1)); if (nounit) { tjjs = a[j + j * a_dim1] * tscal; } else { tjjs = tscal; if (tscal == 1.) { goto L150; } } /* Compute x(j) = x(j) / A(j,j), scaling if necessary. */ tjj = abs(tjjs); if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ if (tjj < 1.) { if (xj > tjj * bignum) { /* Scale X by 1/abs(x(j)). */ rec = 1. / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } } x[j] /= tjjs; } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. */ rec = tjj * bignum / xj; _starpu_dscal_(n, &rec, &x[1], &c__1); *scale *= rec; xmax *= rec; } x[j] /= tjjs; } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A'*x = 0. */ i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; /* L140: */ } x[j] = 1.; *scale = 0.; xmax = 0.; } L150: ; } else { /* Compute x(j) := x(j) / A(j,j) - sumj if the dot */ /* product has already been divided by 1/A(j,j). */ x[j] = x[j] / tjjs - sumj; } /* Computing MAX */ d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); xmax = max(d__2,d__3); /* L160: */ } } *scale /= tscal; } /* Scale the column norms by 1/TSCAL for return. */ if (tscal != 1.) { d__1 = 1. / tscal; _starpu_dscal_(n, &d__1, &cnorm[1], &c__1); } return 0; /* End of DLATRS */ } /* _starpu_dlatrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatrz.c000066400000000000000000000117401413463044200206510ustar00rootroot00000000000000/* dlatrz.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dlatrz_(integer *m, integer *n, integer *l, doublereal * a, integer *lda, doublereal *tau, doublereal *work) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__; extern /* Subroutine */ int _starpu_dlarz_(char *, integer *, integer *, integer * , doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dlarfp_(integer *, doublereal *, doublereal *, integer *, doublereal *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLATRZ factors the M-by-(M+L) real upper trapezoidal matrix */ /* [ A1 A2 ] = [ A(1:M,1:M) A(1:M,N-L+1:N) ] as ( R 0 ) * Z, by means */ /* of orthogonal transformations. Z is an (M+L)-by-(M+L) orthogonal */ /* matrix and, R and A1 are M-by-M upper triangular matrices. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* L (input) INTEGER */ /* The number of columns of the matrix A containing the */ /* meaningful part of the Householder vectors. N-M >= L >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the leading M-by-N upper trapezoidal part of the */ /* array A must contain the matrix to be factorized. */ /* On exit, the leading M-by-M upper triangular part of A */ /* contains the upper triangular matrix R, and elements N-L+1 to */ /* N of the first M rows of A, with the array TAU, represent the */ /* orthogonal matrix Z as a product of M elementary reflectors. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (M) */ /* The scalar factors of the elementary reflectors. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (M) */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* The factorization is obtained by Householder's method. The kth */ /* transformation matrix, Z( k ), which is used to introduce zeros into */ /* the ( m - k + 1 )th row of A, is given in the form */ /* Z( k ) = ( I 0 ), */ /* ( 0 T( k ) ) */ /* where */ /* T( k ) = I - tau*u( k )*u( k )', u( k ) = ( 1 ), */ /* ( 0 ) */ /* ( z( k ) ) */ /* tau is a scalar and z( k ) is an l element vector. tau and z( k ) */ /* are chosen to annihilate the elements of the kth row of A2. */ /* The scalar tau is returned in the kth element of TAU and the vector */ /* u( k ) in the kth row of A2, such that the elements of z( k ) are */ /* in a( k, l + 1 ), ..., a( k, n ). The elements of R are returned in */ /* the upper triangular part of A1. */ /* Z is given by */ /* Z = Z( 1 ) * Z( 2 ) * ... * Z( m ). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Quick return if possible */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ if (*m == 0) { return 0; } else if (*m == *n) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tau[i__] = 0.; /* L10: */ } return 0; } for (i__ = *m; i__ >= 1; --i__) { /* Generate elementary reflector H(i) to annihilate */ /* [ A(i,i) A(i,n-l+1:n) ] */ i__1 = *l + 1; _starpu_dlarfp_(&i__1, &a[i__ + i__ * a_dim1], &a[i__ + (*n - *l + 1) * a_dim1], lda, &tau[i__]); /* Apply H(i) to A(1:i-1,i:n) from the right */ i__1 = i__ - 1; i__2 = *n - i__ + 1; _starpu_dlarz_("Right", &i__1, &i__2, l, &a[i__ + (*n - *l + 1) * a_dim1], lda, &tau[i__], &a[i__ * a_dim1 + 1], lda, &work[1]); /* L20: */ } return 0; /* End of DLATRZ */ } /* _starpu_dlatrz_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlatzm.c000066400000000000000000000134721413463044200206500ustar00rootroot00000000000000/* dlatzm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b5 = 1.; /* Subroutine */ int _starpu_dlatzm_(char *side, integer *m, integer *n, doublereal * v, integer *incv, doublereal *tau, doublereal *c1, doublereal *c2, integer *ldc, doublereal *work) { /* System generated locals */ integer c1_dim1, c1_offset, c2_dim1, c2_offset, i__1; doublereal d__1; /* Local variables */ extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *) ; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is deprecated and has been replaced by routine DORMRZ. */ /* DLATZM applies a Householder matrix generated by DTZRQF to a matrix. */ /* Let P = I - tau*u*u', u = ( 1 ), */ /* ( v ) */ /* where v is an (m-1) vector if SIDE = 'L', or a (n-1) vector if */ /* SIDE = 'R'. */ /* If SIDE equals 'L', let */ /* C = [ C1 ] 1 */ /* [ C2 ] m-1 */ /* n */ /* Then C is overwritten by P*C. */ /* If SIDE equals 'R', let */ /* C = [ C1, C2 ] m */ /* 1 n-1 */ /* Then C is overwritten by C*P. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': form P * C */ /* = 'R': form C * P */ /* M (input) INTEGER */ /* The number of rows of the matrix C. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. */ /* V (input) DOUBLE PRECISION array, dimension */ /* (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ /* (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ /* The vector v in the representation of P. V is not used */ /* if TAU = 0. */ /* INCV (input) INTEGER */ /* The increment between elements of v. INCV <> 0 */ /* TAU (input) DOUBLE PRECISION */ /* The value tau in the representation of P. */ /* C1 (input/output) DOUBLE PRECISION array, dimension */ /* (LDC,N) if SIDE = 'L' */ /* (M,1) if SIDE = 'R' */ /* On entry, the n-vector C1 if SIDE = 'L', or the m-vector C1 */ /* if SIDE = 'R'. */ /* On exit, the first row of P*C if SIDE = 'L', or the first */ /* column of C*P if SIDE = 'R'. */ /* C2 (input/output) DOUBLE PRECISION array, dimension */ /* (LDC, N) if SIDE = 'L' */ /* (LDC, N-1) if SIDE = 'R' */ /* On entry, the (m - 1) x n matrix C2 if SIDE = 'L', or the */ /* m x (n - 1) matrix C2 if SIDE = 'R'. */ /* On exit, rows 2:m of P*C if SIDE = 'L', or columns 2:m of C*P */ /* if SIDE = 'R'. */ /* LDC (input) INTEGER */ /* The leading dimension of the arrays C1 and C2. LDC >= (1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L' */ /* (M) if SIDE = 'R' */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --v; c2_dim1 = *ldc; c2_offset = 1 + c2_dim1; c2 -= c2_offset; c1_dim1 = *ldc; c1_offset = 1 + c1_dim1; c1 -= c1_offset; --work; /* Function Body */ if (min(*m,*n) == 0 || *tau == 0.) { return 0; } if (_starpu_lsame_(side, "L")) { /* w := C1 + v' * C2 */ _starpu_dcopy_(n, &c1[c1_offset], ldc, &work[1], &c__1); i__1 = *m - 1; _starpu_dgemv_("Transpose", &i__1, n, &c_b5, &c2[c2_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* [ C1 ] := [ C1 ] - tau* [ 1 ] * w' */ /* [ C2 ] [ C2 ] [ v ] */ d__1 = -(*tau); _starpu_daxpy_(n, &d__1, &work[1], &c__1, &c1[c1_offset], ldc); i__1 = *m - 1; d__1 = -(*tau); _starpu_dger_(&i__1, n, &d__1, &v[1], incv, &work[1], &c__1, &c2[c2_offset], ldc); } else if (_starpu_lsame_(side, "R")) { /* w := C1 + C2 * v */ _starpu_dcopy_(m, &c1[c1_offset], &c__1, &work[1], &c__1); i__1 = *n - 1; _starpu_dgemv_("No transpose", m, &i__1, &c_b5, &c2[c2_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1); /* [ C1, C2 ] := [ C1, C2 ] - tau* w * [ 1 , v'] */ d__1 = -(*tau); _starpu_daxpy_(m, &d__1, &work[1], &c__1, &c1[c1_offset], &c__1); i__1 = *n - 1; d__1 = -(*tau); _starpu_dger_(m, &i__1, &d__1, &work[1], &c__1, &v[1], incv, &c2[c2_offset], ldc); } return 0; /* End of DLATZM */ } /* _starpu_dlatzm_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlauu2.c000066400000000000000000000122261413463044200205450ustar00rootroot00000000000000/* dlauu2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dlauu2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__; doublereal aii; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAUU2 computes the product U * U' or L' * L, where the triangular */ /* factor U or L is stored in the upper or lower triangular part of */ /* the array A. */ /* If UPLO = 'U' or 'u' then the upper triangle of the result is stored, */ /* overwriting the factor U in A. */ /* If UPLO = 'L' or 'l' then the lower triangle of the result is stored, */ /* overwriting the factor L in A. */ /* This is the unblocked form of the algorithm, calling Level 2 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the triangular factor stored in the array A */ /* is upper or lower triangular: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the triangular factor U or L. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the triangular factor U or L. */ /* On exit, if UPLO = 'U', the upper triangle of A is */ /* overwritten with the upper triangle of the product U * U'; */ /* if UPLO = 'L', the lower triangle of A is overwritten with */ /* the lower triangle of the product L' * L. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAUU2", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (upper) { /* Compute the product U * U'. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { aii = a[i__ + i__ * a_dim1]; if (i__ < *n) { i__2 = *n - i__ + 1; a[i__ + i__ * a_dim1] = _starpu_ddot_(&i__2, &a[i__ + i__ * a_dim1], lda, &a[i__ + i__ * a_dim1], lda); i__2 = i__ - 1; i__3 = *n - i__; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b7, &a[(i__ + 1) * a_dim1 + 1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, & aii, &a[i__ * a_dim1 + 1], &c__1); } else { _starpu_dscal_(&i__, &aii, &a[i__ * a_dim1 + 1], &c__1); } /* L10: */ } } else { /* Compute the product L' * L. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { aii = a[i__ + i__ * a_dim1]; if (i__ < *n) { i__2 = *n - i__ + 1; a[i__ + i__ * a_dim1] = _starpu_ddot_(&i__2, &a[i__ + i__ * a_dim1], & c__1, &a[i__ + i__ * a_dim1], &c__1); i__2 = *n - i__; i__3 = i__ - 1; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b7, &a[i__ + 1 + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &aii, &a[i__ + a_dim1], lda); } else { _starpu_dscal_(&i__, &aii, &a[i__ + a_dim1], lda); } /* L20: */ } } return 0; /* End of DLAUU2 */ } /* _starpu_dlauu2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dlauum.c000066400000000000000000000147741413463044200206520ustar00rootroot00000000000000/* dlauum.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b15 = 1.; /* Subroutine */ int _starpu_dlauum_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, ib, nb; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlauu2_(char *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DLAUUM computes the product U * U' or L' * L, where the triangular */ /* factor U or L is stored in the upper or lower triangular part of */ /* the array A. */ /* If UPLO = 'U' or 'u' then the upper triangle of the result is stored, */ /* overwriting the factor U in A. */ /* If UPLO = 'L' or 'l' then the lower triangle of the result is stored, */ /* overwriting the factor L in A. */ /* This is the blocked form of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the triangular factor stored in the array A */ /* is upper or lower triangular: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the triangular factor U or L. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the triangular factor U or L. */ /* On exit, if UPLO = 'U', the upper triangle of A is */ /* overwritten with the upper triangle of the product U * U'; */ /* if UPLO = 'L', the lower triangle of A is overwritten with */ /* the lower triangle of the product L' * L. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DLAUUM", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DLAUUM", uplo, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ _starpu_dlauu2_(uplo, n, &a[a_offset], lda, info); } else { /* Use blocked code */ if (upper) { /* Compute the product U * U'. */ i__1 = *n; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *n - i__ + 1; ib = min(i__3,i__4); i__3 = i__ - 1; _starpu_dtrmm_("Right", "Upper", "Transpose", "Non-unit", &i__3, &ib, &c_b15, &a[i__ + i__ * a_dim1], lda, &a[i__ * a_dim1 + 1], lda) ; _starpu_dlauu2_("Upper", &ib, &a[i__ + i__ * a_dim1], lda, info); if (i__ + ib <= *n) { i__3 = i__ - 1; i__4 = *n - i__ - ib + 1; _starpu_dgemm_("No transpose", "Transpose", &i__3, &ib, &i__4, & c_b15, &a[(i__ + ib) * a_dim1 + 1], lda, &a[i__ + (i__ + ib) * a_dim1], lda, &c_b15, &a[i__ * a_dim1 + 1], lda); i__3 = *n - i__ - ib + 1; _starpu_dsyrk_("Upper", "No transpose", &ib, &i__3, &c_b15, &a[ i__ + (i__ + ib) * a_dim1], lda, &c_b15, &a[i__ + i__ * a_dim1], lda); } /* L10: */ } } else { /* Compute the product L' * L. */ i__2 = *n; i__1 = nb; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Computing MIN */ i__3 = nb, i__4 = *n - i__ + 1; ib = min(i__3,i__4); i__3 = i__ - 1; _starpu_dtrmm_("Left", "Lower", "Transpose", "Non-unit", &ib, &i__3, & c_b15, &a[i__ + i__ * a_dim1], lda, &a[i__ + a_dim1], lda); _starpu_dlauu2_("Lower", &ib, &a[i__ + i__ * a_dim1], lda, info); if (i__ + ib <= *n) { i__3 = i__ - 1; i__4 = *n - i__ - ib + 1; _starpu_dgemm_("Transpose", "No transpose", &ib, &i__3, &i__4, & c_b15, &a[i__ + ib + i__ * a_dim1], lda, &a[i__ + ib + a_dim1], lda, &c_b15, &a[i__ + a_dim1], lda); i__3 = *n - i__ - ib + 1; _starpu_dsyrk_("Lower", "Transpose", &ib, &i__3, &c_b15, &a[i__ + ib + i__ * a_dim1], lda, &c_b15, &a[i__ + i__ * a_dim1], lda); } /* L20: */ } } } return 0; /* End of DLAUUM */ } /* _starpu_dlauum_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dopgtr.c000066400000000000000000000125761413463044200206600ustar00rootroot00000000000000/* dopgtr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dopgtr_(char *uplo, integer *n, doublereal *ap, doublereal *tau, doublereal *q, integer *ldq, doublereal *work, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, ij; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical upper; extern /* Subroutine */ int _starpu_dorg2l_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DOPGTR generates a real orthogonal matrix Q which is defined as the */ /* product of n-1 elementary reflectors H(i) of order n, as returned by */ /* DSPTRD using packed storage: */ /* if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), */ /* if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangular packed storage used in previous */ /* call to DSPTRD; */ /* = 'L': Lower triangular packed storage used in previous */ /* call to DSPTRD. */ /* N (input) INTEGER */ /* The order of the matrix Q. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The vectors which define the elementary reflectors, as */ /* returned by DSPTRD. */ /* TAU (input) DOUBLE PRECISION array, dimension (N-1) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DSPTRD. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* The N-by-N orthogonal matrix Q. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N-1) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ --ap; --tau; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --work; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldq < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DOPGTR", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (upper) { /* Q was determined by a call to DSPTRD with UPLO = 'U' */ /* Unpack the vectors which define the elementary reflectors and */ /* set the last row and column of Q equal to those of the unit */ /* matrix */ ij = 2; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { q[i__ + j * q_dim1] = ap[ij]; ++ij; /* L10: */ } ij += 2; q[*n + j * q_dim1] = 0.; /* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { q[i__ + *n * q_dim1] = 0.; /* L30: */ } q[*n + *n * q_dim1] = 1.; /* Generate Q(1:n-1,1:n-1) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; _starpu_dorg2l_(&i__1, &i__2, &i__3, &q[q_offset], ldq, &tau[1], &work[1], & iinfo); } else { /* Q was determined by a call to DSPTRD with UPLO = 'L'. */ /* Unpack the vectors which define the elementary reflectors and */ /* set the first row and column of Q equal to those of the unit */ /* matrix */ q[q_dim1 + 1] = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { q[i__ + q_dim1] = 0.; /* L40: */ } ij = 3; i__1 = *n; for (j = 2; j <= i__1; ++j) { q[j * q_dim1 + 1] = 0.; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { q[i__ + j * q_dim1] = ap[ij]; ++ij; /* L50: */ } ij += 2; /* L60: */ } if (*n > 1) { /* Generate Q(2:n,2:n) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; _starpu_dorg2r_(&i__1, &i__2, &i__3, &q[(q_dim1 << 1) + 2], ldq, &tau[1], &work[1], &iinfo); } } return 0; /* End of DOPGTR */ } /* _starpu_dopgtr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dopmtr.c000066400000000000000000000162231413463044200206570ustar00rootroot00000000000000/* dopmtr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dopmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *ap, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, ic, jc, ii, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran, forwrd; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DOPMTR overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix of order nq, with nq = m if */ /* SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ /* nq-1 elementary reflectors, as returned by DSPTRD using packed */ /* storage: */ /* if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); */ /* if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangular packed storage used in previous */ /* call to DSPTRD; */ /* = 'L': Lower triangular packed storage used in previous */ /* call to DSPTRD. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension */ /* (M*(M+1)/2) if SIDE = 'L' */ /* (N*(N+1)/2) if SIDE = 'R' */ /* The vectors which define the elementary reflectors, as */ /* returned by DSPTRD. AP is modified by the routine but */ /* restored on exit. */ /* TAU (input) DOUBLE PRECISION array, dimension (M-1) if SIDE = 'L' */ /* or (N-1) if SIDE = 'R' */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DSPTRD. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L' */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ --ap; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); upper = _starpu_lsame_(uplo, "U"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*ldc < max(1,*m)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DOPMTR", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } if (upper) { /* Q was determined by a call to DSPTRD with UPLO = 'U' */ forwrd = left && notran || ! left && ! notran; if (forwrd) { i1 = 1; i2 = nq - 1; i3 = 1; ii = 2; } else { i1 = nq - 1; i2 = 1; i3 = -1; ii = nq * (nq + 1) / 2 - 1; } if (left) { ni = *n; } else { mi = *m; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(1:i,1:n) */ mi = i__; } else { /* H(i) is applied to C(1:m,1:i) */ ni = i__; } /* Apply H(i) */ aii = ap[ii]; ap[ii] = 1.; _starpu_dlarf_(side, &mi, &ni, &ap[ii - i__ + 1], &c__1, &tau[i__], &c__[ c_offset], ldc, &work[1]); ap[ii] = aii; if (forwrd) { ii = ii + i__ + 2; } else { ii = ii - i__ - 1; } /* L10: */ } } else { /* Q was determined by a call to DSPTRD with UPLO = 'L'. */ forwrd = left && ! notran || ! left && notran; if (forwrd) { i1 = 1; i2 = nq - 1; i3 = 1; ii = 2; } else { i1 = nq - 1; i2 = 1; i3 = -1; ii = nq * (nq + 1) / 2 - 1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__2 = i2; i__1 = i3; for (i__ = i1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { aii = ap[ii]; ap[ii] = 1.; if (left) { /* H(i) is applied to C(i+1:m,1:n) */ mi = *m - i__; ic = i__ + 1; } else { /* H(i) is applied to C(1:m,i+1:n) */ ni = *n - i__; jc = i__ + 1; } /* Apply H(i) */ _starpu_dlarf_(side, &mi, &ni, &ap[ii], &c__1, &tau[i__], &c__[ic + jc * c_dim1], ldc, &work[1]); ap[ii] = aii; if (forwrd) { ii = ii + nq - i__ + 1; } else { ii = ii - nq + i__ - 2; } /* L20: */ } } return 0; /* End of DOPMTR */ } /* _starpu_dopmtr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorg2l.c000066400000000000000000000111351413463044200205400ustar00rootroot00000000000000/* dorg2l.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dorg2l_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, l, ii; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORG2L generates an m by n real matrix Q with orthonormal columns, */ /* which is defined as the last n columns of a product of k elementary */ /* reflectors of order m */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGEQLF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. M >= N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. N >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the (n-k+i)-th column must contain the vector which */ /* defines the elementary reflector H(i), for i = 1,2,...,k, as */ /* returned by DGEQLF in the last k columns of its array */ /* argument A. */ /* On exit, the m by n matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQLF. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORG2L", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } /* Initialise columns 1:n-k to columns of the unit matrix */ i__1 = *n - *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; /* L10: */ } a[*m - *n + j + j * a_dim1] = 1.; /* L20: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { ii = *n - *k + i__; /* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ a[*m - *n + ii + ii * a_dim1] = 1.; i__2 = *m - *n + ii; i__3 = ii - 1; _starpu_dlarf_("Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & a[a_offset], lda, &work[1]); i__2 = *m - *n + ii - 1; d__1 = -tau[i__]; _starpu_dscal_(&i__2, &d__1, &a[ii * a_dim1 + 1], &c__1); a[*m - *n + ii + ii * a_dim1] = 1. - tau[i__]; /* Set A(m-k+i+1:m,n-k+i) to zero */ i__2 = *m; for (l = *m - *n + ii + 1; l <= i__2; ++l) { a[l + ii * a_dim1] = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORG2L */ } /* _starpu_dorg2l_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorg2r.c000066400000000000000000000111221413463044200205420ustar00rootroot00000000000000/* dorg2r.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dorg2r_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, l; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORG2R generates an m by n real matrix Q with orthonormal columns, */ /* which is defined as the first n columns of a product of k elementary */ /* reflectors of order m */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGEQRF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. M >= N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. N >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the i-th column must contain the vector which */ /* defines the elementary reflector H(i), for i = 1,2,...,k, as */ /* returned by DGEQRF in the first k columns of its array */ /* argument A. */ /* On exit, the m-by-n matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQRF. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORG2R", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } /* Initialise columns k+1:n to columns of the unit matrix */ i__1 = *n; for (j = *k + 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; /* L10: */ } a[j + j * a_dim1] = 1.; /* L20: */ } for (i__ = *k; i__ >= 1; --i__) { /* Apply H(i) to A(i:m,i:n) from the left */ if (i__ < *n) { a[i__ + i__ * a_dim1] = 1.; i__1 = *m - i__ + 1; i__2 = *n - i__; _starpu_dlarf_("Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1]); } if (i__ < *m) { i__1 = *m - i__; d__1 = -tau[i__]; _starpu_dscal_(&i__1, &d__1, &a[i__ + 1 + i__ * a_dim1], &c__1); } a[i__ + i__ * a_dim1] = 1. - tau[i__]; /* Set A(1:i-1,i) to zero */ i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { a[l + i__ * a_dim1] = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORG2R */ } /* _starpu_dorg2r_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgbr.c000066400000000000000000000212331413463044200206260ustar00rootroot00000000000000/* dorgbr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dorgbr_(char *vect, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, nb, mn; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical wantq; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGBR generates one of the real orthogonal matrices Q or P**T */ /* determined by DGEBRD when reducing a real matrix A to bidiagonal */ /* form: A = Q * B * P**T. Q and P**T are defined as products of */ /* elementary reflectors H(i) or G(i) respectively. */ /* If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q */ /* is of order M: */ /* if m >= k, Q = H(1) H(2) . . . H(k) and DORGBR returns the first n */ /* columns of Q, where m >= n >= k; */ /* if m < k, Q = H(1) H(2) . . . H(m-1) and DORGBR returns Q as an */ /* M-by-M matrix. */ /* If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T */ /* is of order N: */ /* if k < n, P**T = G(k) . . . G(2) G(1) and DORGBR returns the first m */ /* rows of P**T, where n >= m >= k; */ /* if k >= n, P**T = G(n-1) . . . G(2) G(1) and DORGBR returns P**T as */ /* an N-by-N matrix. */ /* Arguments */ /* ========= */ /* VECT (input) CHARACTER*1 */ /* Specifies whether the matrix Q or the matrix P**T is */ /* required, as defined in the transformation applied by DGEBRD: */ /* = 'Q': generate Q; */ /* = 'P': generate P**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix Q or P**T to be returned. */ /* M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q or P**T to be returned. */ /* N >= 0. */ /* If VECT = 'Q', M >= N >= min(M,K); */ /* if VECT = 'P', N >= M >= min(N,K). */ /* K (input) INTEGER */ /* If VECT = 'Q', the number of columns in the original M-by-K */ /* matrix reduced by DGEBRD. */ /* If VECT = 'P', the number of rows in the original K-by-N */ /* matrix reduced by DGEBRD. */ /* K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the vectors which define the elementary reflectors, */ /* as returned by DGEBRD. */ /* On exit, the M-by-N matrix Q or P**T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension */ /* (min(M,K)) if VECT = 'Q' */ /* (min(N,K)) if VECT = 'P' */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i) or G(i), which determines Q or P**T, as */ /* returned by DGEBRD in its array argument TAUQ or TAUP. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,min(M,N)). */ /* For optimum performance LWORK >= min(M,N)*NB, where NB */ /* is the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; wantq = _starpu_lsame_(vect, "Q"); mn = min(*m,*n); lquery = *lwork == -1; if (! wantq && ! _starpu_lsame_(vect, "P")) { *info = -1; } else if (*m < 0) { *info = -2; } else if (*n < 0 || wantq && (*n > *m || *n < min(*m,*k)) || ! wantq && ( *m > *n || *m < min(*n,*k))) { *info = -3; } else if (*k < 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else if (*lwork < max(1,mn) && ! lquery) { *info = -9; } if (*info == 0) { if (wantq) { nb = _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, k, &c_n1); } else { nb = _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, k, &c_n1); } lwkopt = max(1,mn) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGBR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { work[1] = 1.; return 0; } if (wantq) { /* Form Q, determined by a call to DGEBRD to reduce an m-by-k */ /* matrix */ if (*m >= *k) { /* If m >= k, assume m >= n >= k */ _starpu_dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & iinfo); } else { /* If m < k, assume m = n */ /* Shift the vectors which define the elementary reflectors one */ /* column to the right, and set the first row and column of Q */ /* to those of the unit matrix */ for (j = *m; j >= 2; --j) { a[j * a_dim1 + 1] = 0.; i__1 = *m; for (i__ = j + 1; i__ <= i__1; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; /* L10: */ } /* L20: */ } a[a_dim1 + 1] = 1.; i__1 = *m; for (i__ = 2; i__ <= i__1; ++i__) { a[i__ + a_dim1] = 0.; /* L30: */ } if (*m > 1) { /* Form Q(2:m,2:m) */ i__1 = *m - 1; i__2 = *m - 1; i__3 = *m - 1; _starpu_dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ 1], &work[1], lwork, &iinfo); } } } else { /* Form P', determined by a call to DGEBRD to reduce a k-by-n */ /* matrix */ if (*k < *n) { /* If k < n, assume k <= m <= n */ _starpu_dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & iinfo); } else { /* If k >= n, assume m = n */ /* Shift the vectors which define the elementary reflectors one */ /* row downward, and set the first row and column of P' to */ /* those of the unit matrix */ a[a_dim1 + 1] = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { a[i__ + a_dim1] = 0.; /* L40: */ } i__1 = *n; for (j = 2; j <= i__1; ++j) { for (i__ = j - 1; i__ >= 2; --i__) { a[i__ + j * a_dim1] = a[i__ - 1 + j * a_dim1]; /* L50: */ } a[j * a_dim1 + 1] = 0.; /* L60: */ } if (*n > 1) { /* Form P'(2:n,2:n) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; _starpu_dorglq_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ 1], &work[1], lwork, &iinfo); } } } work[1] = (doublereal) lwkopt; return 0; /* End of DORGBR */ } /* _starpu_dorgbr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorghr.c000066400000000000000000000136361413463044200206440ustar00rootroot00000000000000/* dorghr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dorghr_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, nb, nh, iinfo; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGHR generates a real orthogonal matrix Q which is defined as the */ /* product of IHI-ILO elementary reflectors of order N, as returned by */ /* DGEHRD: */ /* Q = H(ilo) H(ilo+1) . . . H(ihi-1). */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix Q. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* ILO and IHI must have the same values as in the previous call */ /* of DGEHRD. Q is equal to the unit matrix except in the */ /* submatrix Q(ilo+1:ihi,ilo+1:ihi). */ /* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the vectors which define the elementary reflectors, */ /* as returned by DGEHRD. */ /* On exit, the N-by-N orthogonal matrix Q. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (N-1) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEHRD. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= IHI-ILO. */ /* For optimum performance LWORK >= (IHI-ILO)*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nh = *ihi - *ilo; lquery = *lwork == -1; if (*n < 0) { *info = -1; } else if (*ilo < 1 || *ilo > max(1,*n)) { *info = -2; } else if (*ihi < min(*ilo,*n) || *ihi > *n) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*lwork < max(1,nh) && ! lquery) { *info = -8; } if (*info == 0) { nb = _starpu_ilaenv_(&c__1, "DORGQR", " ", &nh, &nh, &nh, &c_n1); lwkopt = max(1,nh) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGHR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { work[1] = 1.; return 0; } /* Shift the vectors which define the elementary reflectors one */ /* column to the right, and set the first ilo and the last n-ihi */ /* rows and columns to those of the unit matrix */ i__1 = *ilo + 1; for (j = *ihi; j >= i__1; --j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L10: */ } i__2 = *ihi; for (i__ = j + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; /* L20: */ } i__2 = *n; for (i__ = *ihi + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L30: */ } /* L40: */ } i__1 = *ilo; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L50: */ } a[j + j * a_dim1] = 1.; /* L60: */ } i__1 = *n; for (j = *ihi + 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L70: */ } a[j + j * a_dim1] = 1.; /* L80: */ } if (nh > 0) { /* Generate Q(ilo+1:ihi,ilo+1:ihi) */ _starpu_dorgqr_(&nh, &nh, &nh, &a[*ilo + 1 + (*ilo + 1) * a_dim1], lda, &tau[* ilo], &work[1], lwork, &iinfo); } work[1] = (doublereal) lwkopt; return 0; /* End of DORGHR */ } /* _starpu_dorghr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgl2.c000066400000000000000000000110421413463044200205350ustar00rootroot00000000000000/* dorgl2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dorgl2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j, l; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGL2 generates an m by n real matrix Q with orthonormal rows, */ /* which is defined as the first m rows of a product of k elementary */ /* reflectors of order n */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGELQF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. N >= M. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. M >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the i-th row must contain the vector which defines */ /* the elementary reflector H(i), for i = 1,2,...,k, as returned */ /* by DGELQF in the first k rows of its array argument A. */ /* On exit, the m-by-n matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGELQF. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (M) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGL2", &i__1); return 0; } /* Quick return if possible */ if (*m <= 0) { return 0; } if (*k < *m) { /* Initialise rows k+1:m to rows of the unit matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = *k + 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; /* L10: */ } if (j > *k && j <= *m) { a[j + j * a_dim1] = 1.; } /* L20: */ } } for (i__ = *k; i__ >= 1; --i__) { /* Apply H(i) to A(i:m,i:n) from the right */ if (i__ < *n) { if (i__ < *m) { a[i__ + i__ * a_dim1] = 1.; i__1 = *m - i__; i__2 = *n - i__ + 1; _starpu_dlarf_("Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & tau[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1]); } i__1 = *n - i__; d__1 = -tau[i__]; _starpu_dscal_(&i__1, &d__1, &a[i__ + (i__ + 1) * a_dim1], lda); } a[i__ + i__ * a_dim1] = 1. - tau[i__]; /* Set A(i,1:i-1) to zero */ i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { a[i__ + l * a_dim1] = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORGL2 */ } /* _starpu_dorgl2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorglq.c000066400000000000000000000173671413463044200206540ustar00rootroot00000000000000/* dorglq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dorglq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dorgl2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGLQ generates an M-by-N real matrix Q with orthonormal rows, */ /* which is defined as the first M rows of a product of K elementary */ /* reflectors of order N */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGELQF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. N >= M. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. M >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the i-th row must contain the vector which defines */ /* the elementary reflector H(i), for i = 1,2,...,k, as returned */ /* by DGELQF in the first k rows of its array argument A. */ /* On exit, the M-by-N matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGELQF. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M). */ /* For optimum performance LWORK >= M*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DORGLQ", " ", m, n, k, &c_n1); lwkopt = max(1,*m) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*lwork < max(1,*m) && ! lquery) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGLQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m <= 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DORGLQ", " ", m, n, k, &c_n1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORGLQ", " ", m, n, k, &c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the last block. */ /* The first kk rows are handled by the block method. */ ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ i__1 = *k, i__2 = ki + nb; kk = min(i__1,i__2); /* Set A(kk+1:m,1:kk) to zero. */ i__1 = kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = kk + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *m) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; _starpu_dorgl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & tau[kk + 1], &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; ib = min(i__2,i__3); if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__2 = *n - i__ + 1; _starpu_dlarft_("Forward", "Rowwise", &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(i+ib:m,i:n) from the right */ i__2 = *m - i__ - ib + 1; i__3 = *n - i__ + 1; _starpu_dlarfb_("Right", "Transpose", "Forward", "Rowwise", &i__2, & i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + 1], &ldwork); } /* Apply H' to columns i:n of current block */ i__2 = *n - i__ + 1; _starpu_dorgl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & work[1], &iinfo); /* Set columns 1:i-1 of current block to zero */ i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { i__3 = i__ + ib - 1; for (l = i__; l <= i__3; ++l) { a[l + j * a_dim1] = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGLQ */ } /* _starpu_dorglq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgql.c000066400000000000000000000177051413463044200206500ustar00rootroot00000000000000/* dorgql.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dorgql_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dorg2l_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGQL generates an M-by-N real matrix Q with orthonormal columns, */ /* which is defined as the last N columns of a product of K elementary */ /* reflectors of order M */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGEQLF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. M >= N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. N >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the (n-k+i)-th column must contain the vector which */ /* defines the elementary reflector H(i), for i = 1,2,...,k, as */ /* returned by DGEQLF in the last k columns of its array */ /* argument A. */ /* On exit, the M-by-N matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQLF. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* For optimum performance LWORK >= N*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info == 0) { if (*n == 0) { lwkopt = 1; } else { nb = _starpu_ilaenv_(&c__1, "DORGQL", " ", m, n, k, &c_n1); lwkopt = *n * nb; } work[1] = (doublereal) lwkopt; if (*lwork < max(1,*n) && ! lquery) { *info = -8; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGQL", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DORGQL", " ", m, n, k, &c_n1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORGQL", " ", m, n, k, &c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the first block. */ /* The last kk columns are handled by the block method. */ /* Computing MIN */ i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; kk = min(i__1,i__2); /* Set A(m-kk+1:m,1:n-kk) to zero. */ i__1 = *n - kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the first or only block. */ i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; _starpu_dorg2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) ; if (kk > 0) { /* Use blocked code */ i__1 = *k; i__2 = nb; for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *k - i__ + 1; ib = min(i__3,i__4); if (*n - *k + i__ > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__3 = *m - *k + i__ + ib - 1; _starpu_dlarft_("Backward", "Columnwise", &i__3, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ i__3 = *m - *k + i__ + ib - 1; i__4 = *n - *k + i__ - 1; _starpu_dlarfb_("Left", "No transpose", "Backward", "Columnwise", & i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + 1], &ldwork); } /* Apply H to rows 1:m-k+i+ib-1 of current block */ i__3 = *m - *k + i__ + ib - 1; _starpu_dorg2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & tau[i__], &work[1], &iinfo); /* Set rows m-k+i+ib:m of current block to zero */ i__3 = *n - *k + i__ + ib - 1; for (j = *n - *k + i__; j <= i__3; ++j) { i__4 = *m; for (l = *m - *k + i__ + ib; l <= i__4; ++l) { a[l + j * a_dim1] = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGQL */ } /* _starpu_dorgql_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgqr.c000066400000000000000000000174451413463044200206570ustar00rootroot00000000000000/* dorgqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dorgqr_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGQR generates an M-by-N real matrix Q with orthonormal columns, */ /* which is defined as the first N columns of a product of K elementary */ /* reflectors of order M */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGEQRF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. M >= N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. N >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the i-th column must contain the vector which */ /* defines the elementary reflector H(i), for i = 1,2,...,k, as */ /* returned by DGEQRF in the first k columns of its array */ /* argument A. */ /* On exit, the M-by-N matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQRF. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* For optimum performance LWORK >= N*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; nb = _starpu_ilaenv_(&c__1, "DORGQR", " ", m, n, k, &c_n1); lwkopt = max(1,*n) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0 || *n > *m) { *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } else if (*lwork < max(1,*n) && ! lquery) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGQR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n <= 0) { work[1] = 1.; return 0; } nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DORGQR", " ", m, n, k, &c_n1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORGQR", " ", m, n, k, &c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the last block. */ /* The first kk columns are handled by the block method. */ ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ i__1 = *k, i__2 = ki + nb; kk = min(i__1,i__2); /* Set A(1:kk,kk+1:n) to zero. */ i__1 = *n; for (j = kk + 1; j <= i__1; ++j) { i__2 = kk; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *n) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; _starpu_dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & tau[kk + 1], &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; ib = min(i__2,i__3); if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__2 = *m - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(i:m,i+ib:n) from the left */ i__2 = *m - i__ + 1; i__3 = *n - i__ - ib + 1; _starpu_dlarfb_("Left", "No transpose", "Forward", "Columnwise", & i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & work[ib + 1], &ldwork); } /* Apply H to rows i:m of current block */ i__2 = *m - i__ + 1; _starpu_dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & work[1], &iinfo); /* Set rows 1:i-1 of current block to zero */ i__2 = i__ + ib - 1; for (j = i__; j <= i__2; ++j) { i__3 = i__ - 1; for (l = 1; l <= i__3; ++l) { a[l + j * a_dim1] = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGQR */ } /* _starpu_dorgqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgr2.c000066400000000000000000000111111413463044200205400ustar00rootroot00000000000000/* dorgr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dorgr2_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ integer i__, j, l, ii; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGR2 generates an m by n real matrix Q with orthonormal rows, */ /* which is defined as the last m rows of a product of k elementary */ /* reflectors of order n */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGERQF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. N >= M. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. M >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the (m-k+i)-th row must contain the vector which */ /* defines the elementary reflector H(i), for i = 1,2,...,k, as */ /* returned by DGERQF in the last k rows of its array argument */ /* A. */ /* On exit, the m by n matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGERQF. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (M) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGR2", &i__1); return 0; } /* Quick return if possible */ if (*m <= 0) { return 0; } if (*k < *m) { /* Initialise rows 1:m-k to rows of the unit matrix */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m - *k; for (l = 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; /* L10: */ } if (j > *n - *m && j <= *n - *k) { a[*m - *n + j + j * a_dim1] = 1.; } /* L20: */ } } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { ii = *m - *k + i__; /* Apply H(i) to A(1:m-k+i,1:n-k+i) from the right */ a[ii + (*n - *m + ii) * a_dim1] = 1.; i__2 = ii - 1; i__3 = *n - *m + ii; _starpu_dlarf_("Right", &i__2, &i__3, &a[ii + a_dim1], lda, &tau[i__], &a[ a_offset], lda, &work[1]); i__2 = *n - *m + ii - 1; d__1 = -tau[i__]; _starpu_dscal_(&i__2, &d__1, &a[ii + a_dim1], lda); a[ii + (*n - *m + ii) * a_dim1] = 1. - tau[i__]; /* Set A(m-k+i,n-k+i+1:n) to zero */ i__2 = *n; for (l = *n - *m + ii + 1; l <= i__2; ++l) { a[ii + l * a_dim1] = 0.; /* L30: */ } /* L40: */ } return 0; /* End of DORGR2 */ } /* _starpu_dorgr2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgrq.c000066400000000000000000000175341413463044200206560ustar00rootroot00000000000000/* dorgrq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dorgrq_(integer *m, integer *n, integer *k, doublereal * a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ib, nb, ii, kk, nx, iws, nbmin, iinfo; extern /* Subroutine */ int _starpu_dorgr2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGRQ generates an M-by-N real matrix Q with orthonormal rows, */ /* which is defined as the last M rows of a product of K elementary */ /* reflectors of order N */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGERQF. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix Q. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix Q. N >= M. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines the */ /* matrix Q. M >= K >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the (m-k+i)-th row must contain the vector which */ /* defines the elementary reflector H(i), for i = 1,2,...,k, as */ /* returned by DGERQF in the last k rows of its array argument */ /* A. */ /* On exit, the M-by-N matrix Q. */ /* LDA (input) INTEGER */ /* The first dimension of the array A. LDA >= max(1,M). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGERQF. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M). */ /* For optimum performance LWORK >= M*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument has an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; } else if (*lda < max(1,*m)) { *info = -5; } if (*info == 0) { if (*m <= 0) { lwkopt = 1; } else { nb = _starpu_ilaenv_(&c__1, "DORGRQ", " ", m, n, k, &c_n1); lwkopt = *m * nb; } work[1] = (doublereal) lwkopt; if (*lwork < max(1,*m) && ! lquery) { *info = -8; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGRQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m <= 0) { return 0; } nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < *k) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DORGRQ", " ", m, n, k, &c_n1); nx = max(i__1,i__2); if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORGRQ", " ", m, n, k, &c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *k && nx < *k) { /* Use blocked code after the first block. */ /* The last kk rows are handled by the block method. */ /* Computing MIN */ i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; kk = min(i__1,i__2); /* Set A(1:m-kk,n-kk+1:n) to zero. */ i__1 = *n; for (j = *n - kk + 1; j <= i__1; ++j) { i__2 = *m - kk; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; /* L10: */ } /* L20: */ } } else { kk = 0; } /* Use unblocked code for the first or only block. */ i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; _starpu_dorgr2_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) ; if (kk > 0) { /* Use blocked code */ i__1 = *k; i__2 = nb; for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *k - i__ + 1; ib = min(i__3,i__4); ii = *m - *k + i__; if (ii > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__3 = *n - *k + i__ + ib - 1; _starpu_dlarft_("Backward", "Rowwise", &i__3, &ib, &a[ii + a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H' to A(1:m-k+i-1,1:n-k+i+ib-1) from the right */ i__3 = ii - 1; i__4 = *n - *k + i__ + ib - 1; _starpu_dlarfb_("Right", "Transpose", "Backward", "Rowwise", &i__3, & i__4, &ib, &a[ii + a_dim1], lda, &work[1], &ldwork, & a[a_offset], lda, &work[ib + 1], &ldwork); } /* Apply H' to columns 1:n-k+i+ib-1 of current block */ i__3 = *n - *k + i__ + ib - 1; _starpu_dorgr2_(&ib, &i__3, &ib, &a[ii + a_dim1], lda, &tau[i__], &work[1] , &iinfo); /* Set columns n-k+i+ib:n of current block to zero */ i__3 = *n; for (l = *n - *k + i__ + ib; l <= i__3; ++l) { i__4 = ii + ib - 1; for (j = ii; j <= i__4; ++j) { a[j + l * a_dim1] = 0.; /* L30: */ } /* L40: */ } /* L50: */ } } work[1] = (doublereal) iws; return 0; /* End of DORGRQ */ } /* _starpu_dorgrq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorgtr.c000066400000000000000000000155501413463044200206550ustar00rootroot00000000000000/* dorgtr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dorgtr_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, nb; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dorgql_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORGTR generates a real orthogonal matrix Q which is defined as the */ /* product of n-1 elementary reflectors of order N, as returned by */ /* DSYTRD: */ /* if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), */ /* if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A contains elementary reflectors */ /* from DSYTRD; */ /* = 'L': Lower triangle of A contains elementary reflectors */ /* from DSYTRD. */ /* N (input) INTEGER */ /* The order of the matrix Q. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the vectors which define the elementary reflectors, */ /* as returned by DSYTRD. */ /* On exit, the N-by-N orthogonal matrix Q. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (N-1) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DSYTRD. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N-1). */ /* For optimum performance LWORK >= (N-1)*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = *n - 1; if (*lwork < max(i__1,i__2) && ! lquery) { *info = -7; } } if (*info == 0) { if (upper) { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; nb = _starpu_ilaenv_(&c__1, "DORGQL", " ", &i__1, &i__2, &i__3, &c_n1); } else { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; nb = _starpu_ilaenv_(&c__1, "DORGQR", " ", &i__1, &i__2, &i__3, &c_n1); } /* Computing MAX */ i__1 = 1, i__2 = *n - 1; lwkopt = max(i__1,i__2) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORGTR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { work[1] = 1.; return 0; } if (upper) { /* Q was determined by a call to DSYTRD with UPLO = 'U' */ /* Shift the vectors which define the elementary reflectors one */ /* column to the left, and set the last row and column of Q to */ /* those of the unit matrix */ i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j + 1) * a_dim1]; /* L10: */ } a[*n + j * a_dim1] = 0.; /* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { a[i__ + *n * a_dim1] = 0.; /* L30: */ } a[*n + *n * a_dim1] = 1.; /* Generate Q(1:n-1,1:n-1) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; _starpu_dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo); } else { /* Q was determined by a call to DSYTRD with UPLO = 'L'. */ /* Shift the vectors which define the elementary reflectors one */ /* column to the right, and set the first row and column of Q to */ /* those of the unit matrix */ for (j = *n; j >= 2; --j) { a[j * a_dim1 + 1] = 0.; i__1 = *n; for (i__ = j + 1; i__ <= i__1; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; /* L40: */ } /* L50: */ } a[a_dim1 + 1] = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { a[i__ + a_dim1] = 0.; /* L60: */ } if (*n > 1) { /* Generate Q(2:n,2:n) */ i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; _starpu_dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], &work[1], lwork, &iinfo); } } work[1] = (doublereal) lwkopt; return 0; /* End of DORGTR */ } /* _starpu_dorgtr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorm2l.c000066400000000000000000000141151413463044200205470ustar00rootroot00000000000000/* dorm2l.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dorm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORM2L overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGEQLF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,K) */ /* The i-th column must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGEQLF in the last k columns of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If SIDE = 'L', LDA >= max(1,M); */ /* if SIDE = 'R', LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQLF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORM2L", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && notran || ! left && ! notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; } else { mi = *m; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(1:m-k+i,1:n) */ mi = *m - *k + i__; } else { /* H(i) is applied to C(1:m,1:n-k+i) */ ni = *n - *k + i__; } /* Apply H(i) */ aii = a[nq - *k + i__ + i__ * a_dim1]; a[nq - *k + i__ + i__ * a_dim1] = 1.; _starpu_dlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[ c_offset], ldc, &work[1]); a[nq - *k + i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; /* End of DORM2L */ } /* _starpu_dorm2l_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorm2r.c000066400000000000000000000141501413463044200205540ustar00rootroot00000000000000/* dorm2r.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORM2R overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,K) */ /* The i-th column must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGEQRF in the first k columns of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If SIDE = 'L', LDA >= max(1,M); */ /* if SIDE = 'R', LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQRF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORM2R", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; _starpu_dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ ic + jc * c_dim1], ldc, &work[1]); a[i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; /* End of DORM2R */ } /* _starpu_dorm2r_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormbr.c000066400000000000000000000250541413463044200206410ustar00rootroot00000000000000/* dormbr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; /* Subroutine */ int _starpu_dormbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2]; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i1, i2, nb, mi, ni, nq, nw; logical left; extern logical _starpu_lsame_(char *, char *); integer iinfo; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical notran; extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical applyq; char transt[1]; integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* If VECT = 'Q', DORMBR overwrites the general real M-by-N matrix C */ /* with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C */ /* with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': P * C C * P */ /* TRANS = 'T': P**T * C C * P**T */ /* Here Q and P**T are the orthogonal matrices determined by DGEBRD when */ /* reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and */ /* P**T are defined as products of elementary reflectors H(i) and G(i) */ /* respectively. */ /* Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the */ /* order of the orthogonal matrix Q or P**T that is applied. */ /* If VECT = 'Q', A is assumed to have been an NQ-by-K matrix: */ /* if nq >= k, Q = H(1) H(2) . . . H(k); */ /* if nq < k, Q = H(1) H(2) . . . H(nq-1). */ /* If VECT = 'P', A is assumed to have been a K-by-NQ matrix: */ /* if k < nq, P = G(1) G(2) . . . G(k); */ /* if k >= nq, P = G(1) G(2) . . . G(nq-1). */ /* Arguments */ /* ========= */ /* VECT (input) CHARACTER*1 */ /* = 'Q': apply Q or Q**T; */ /* = 'P': apply P or P**T. */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q, Q**T, P or P**T from the Left; */ /* = 'R': apply Q, Q**T, P or P**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q or P; */ /* = 'T': Transpose, apply Q**T or P**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* If VECT = 'Q', the number of columns in the original */ /* matrix reduced by DGEBRD. */ /* If VECT = 'P', the number of rows in the original */ /* matrix reduced by DGEBRD. */ /* K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,min(nq,K)) if VECT = 'Q' */ /* (LDA,nq) if VECT = 'P' */ /* The vectors which define the elementary reflectors H(i) and */ /* G(i), whose products determine the matrices Q and P, as */ /* returned by DGEBRD. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If VECT = 'Q', LDA >= max(1,nq); */ /* if VECT = 'P', LDA >= max(1,min(nq,K)). */ /* TAU (input) DOUBLE PRECISION array, dimension (min(nq,K)) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i) or G(i) which determines Q or P, as returned */ /* by DGEBRD in the array argument TAUQ or TAUP. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q */ /* or P*C or P**T*C or C*P or C*P**T. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; applyq = _starpu_lsame_(vect, "Q"); left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q or P and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! applyq && ! _starpu_lsame_(vect, "P")) { *info = -1; } else if (! left && ! _starpu_lsame_(side, "R")) { *info = -2; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*k < 0) { *info = -6; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = min(nq,*k); if (applyq && *lda < max(1,nq) || ! applyq && *lda < max(i__1,i__2)) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -11; } else if (*lwork < max(1,nw) && ! lquery) { *info = -13; } } if (*info == 0) { if (applyq) { if (left) { /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; nb = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, &i__1, n, &i__2, &c_n1); } else { /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; nb = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, m, &i__1, &i__2, &c_n1); } } else { if (left) { /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; nb = _starpu_ilaenv_(&c__1, "DORMLQ", ch__1, &i__1, n, &i__2, &c_n1); } else { /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; nb = _starpu_ilaenv_(&c__1, "DORMLQ", ch__1, m, &i__1, &i__2, &c_n1); } } lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMBR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ work[1] = 1.; if (*m == 0 || *n == 0) { return 0; } if (applyq) { /* Apply Q */ if (nq >= *k) { /* Q was determined by a call to DGEBRD with nq >= k */ _starpu_dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], lwork, &iinfo); } else if (nq > 1) { /* Q was determined by a call to DGEBRD with nq < k */ if (left) { mi = *m - 1; ni = *n; i1 = 2; i2 = 1; } else { mi = *m; ni = *n - 1; i1 = 1; i2 = 2; } i__1 = nq - 1; _starpu_dormqr_(side, trans, &mi, &ni, &i__1, &a[a_dim1 + 2], lda, &tau[1] , &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo); } } else { /* Apply P */ if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (nq > *k) { /* P was determined by a call to DGEBRD with nq > k */ _starpu_dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], lwork, &iinfo); } else if (nq > 1) { /* P was determined by a call to DGEBRD with nq <= k */ if (left) { mi = *m - 1; ni = *n; i1 = 2; i2 = 1; } else { mi = *m; ni = *n - 1; i1 = 1; i2 = 2; } i__1 = nq - 1; _starpu_dormlq_(side, transt, &mi, &ni, &i__1, &a[(a_dim1 << 1) + 1], lda, &tau[1], &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, & iinfo); } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMBR */ } /* _starpu_dormbr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormhr.c000066400000000000000000000173011413463044200206430ustar00rootroot00000000000000/* dormhr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; /* Subroutine */ int _starpu_dormhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal * tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i1, i2, nb, mi, nh, ni, nq, nw; logical left; extern logical _starpu_lsame_(char *, char *); integer iinfo; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMHR overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix of order nq, with nq = m if */ /* SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ /* IHI-ILO elementary reflectors, as returned by DGEHRD: */ /* Q = H(ilo) H(ilo+1) . . . H(ihi-1). */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* ILO and IHI must have the same values as in the previous call */ /* of DGEHRD. Q is equal to the unit matrix except in the */ /* submatrix Q(ilo+1:ihi,ilo+1:ihi). */ /* If SIDE = 'L', then 1 <= ILO <= IHI <= M, if M > 0, and */ /* ILO = 1 and IHI = 0, if M = 0; */ /* if SIDE = 'R', then 1 <= ILO <= IHI <= N, if N > 0, and */ /* ILO = 1 and IHI = 0, if N = 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L' */ /* (LDA,N) if SIDE = 'R' */ /* The vectors which define the elementary reflectors, as */ /* returned by DGEHRD. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. */ /* TAU (input) DOUBLE PRECISION array, dimension */ /* (M-1) if SIDE = 'L' */ /* (N-1) if SIDE = 'R' */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEHRD. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; nh = *ihi - *ilo; left = _starpu_lsame_(side, "L"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*ilo < 1 || *ilo > max(1,nq)) { *info = -5; } else if (*ihi < min(*ilo,nq) || *ihi > nq) { *info = -6; } else if (*lda < max(1,nq)) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -11; } else if (*lwork < max(1,nw) && ! lquery) { *info = -13; } if (*info == 0) { if (left) { /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); nb = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, &nh, n, &nh, &c_n1); } else { /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); nb = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, m, &nh, &nh, &c_n1); } lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__2 = -(*info); _starpu_xerbla_("DORMHR", &i__2); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || nh == 0) { work[1] = 1.; return 0; } if (left) { mi = nh; ni = *n; i1 = *ilo + 1; i2 = 1; } else { mi = *m; ni = nh; i1 = 1; i2 = *ilo + 1; } _starpu_dormqr_(side, trans, &mi, &ni, &nh, &a[*ilo + 1 + *ilo * a_dim1], lda, & tau[*ilo], &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo); work[1] = (doublereal) lwkopt; return 0; /* End of DORMHR */ } /* _starpu_dormhr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dorml2.c000066400000000000000000000141061413463044200205470ustar00rootroot00000000000000/* dorml2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dorml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORML2 overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGELQF in the first k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGELQF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORML2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && notran || ! left && ! notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) */ aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; _starpu_dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ ic + jc * c_dim1], ldc, &work[1]); a[i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; /* End of DORML2 */ } /* _starpu_dorml2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormlq.c000066400000000000000000000225331413463044200206510ustar00rootroot00000000000000/* dormlq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dorml2_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical notran; integer ldwork; char transt[1]; integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMLQ overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGELQF in the first k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGELQF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { /* Determine the block size. NB may be at most NBMAX, where NBMAX */ /* is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMLQ", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMLQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMLQ", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && notran || ! left && ! notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = nq - i__ + 1; _starpu_dlarft_("Forward", "Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ _starpu_dlarfb_(side, transt, "Forward", "Rowwise", &mi, &ni, &ib, &a[i__ + i__ * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMLQ */ } /* _starpu_dormlq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormql.c000066400000000000000000000223371413463044200206530ustar00rootroot00000000000000/* dormql.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormql_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dorm2l_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical notran; integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMQL overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(k) . . . H(2) H(1) */ /* as returned by DGEQLF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,K) */ /* The i-th column must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGEQLF in the last k columns of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If SIDE = 'L', LDA >= max(1,M); */ /* if SIDE = 'R', LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQLF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = max(1,*n); } else { nq = *n; nw = max(1,*m); } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info == 0) { if (*m == 0 || *n == 0) { lwkopt = 1; } else { /* Determine the block size. NB may be at most NBMAX, where */ /* NBMAX is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMQL", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = nw * nb; } work[1] = (doublereal) lwkopt; if (*lwork < nw && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMQL", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMQL", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dorm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && notran || ! left && ! notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; } else { mi = *m; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__4 = nq - *k + i__ + ib - 1; _starpu_dlarft_("Backward", "Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] , lda, &tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(1:m-k+i+ib-1,1:n) */ mi = *m - *k + i__ + ib - 1; } else { /* H or H' is applied to C(1:m,1:n-k+i+ib-1) */ ni = *n - *k + i__ + ib - 1; } /* Apply H or H' */ _starpu_dlarfb_(side, trans, "Backward", "Columnwise", &mi, &ni, &ib, &a[ i__ * a_dim1 + 1], lda, t, &c__65, &c__[c_offset], ldc, & work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMQL */ } /* _starpu_dormql_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormqr.c000066400000000000000000000223061413463044200206550ustar00rootroot00000000000000/* dormqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dorm2r_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical notran; integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMQR overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,K) */ /* The i-th column must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGEQRF in the first k columns of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* If SIDE = 'L', LDA >= max(1,M); */ /* if SIDE = 'R', LDA >= max(1,N). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGEQRF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { /* Determine the block size. NB may be at most NBMAX, where NBMAX */ /* is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMQR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMQR", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; } else { mi = *m; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ i__4 = nq - i__ + 1; _starpu_dlarft_("Forward", "Columnwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], t, &c__65) ; if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ _starpu_dlarfb_(side, trans, "Forward", "Columnwise", &mi, &ni, &ib, &a[ i__ + i__ * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMQR */ } /* _starpu_dormqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormr2.c000066400000000000000000000140551413463044200205600ustar00rootroot00000000000000/* dormr2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dormr2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, mi, ni, nq; doublereal aii; logical left; extern /* Subroutine */ int _starpu_dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMR2 overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGERQF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGERQF in the last k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGERQF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m by n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMR2", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; } else { mi = *m; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) is applied to C(1:m-k+i,1:n) */ mi = *m - *k + i__; } else { /* H(i) is applied to C(1:m,1:n-k+i) */ ni = *n - *k + i__; } /* Apply H(i) */ aii = a[i__ + (nq - *k + i__) * a_dim1]; a[i__ + (nq - *k + i__) * a_dim1] = 1.; _starpu_dlarf_(side, &mi, &ni, &a[i__ + a_dim1], lda, &tau[i__], &c__[ c_offset], ldc, &work[1]); a[i__ + (nq - *k + i__) * a_dim1] = aii; /* L10: */ } return 0; /* End of DORMR2 */ } /* _starpu_dormr2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormr3.c000066400000000000000000000146771413463044200205730ustar00rootroot00000000000000/* dormr3.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dormr3_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ integer i__, i1, i2, i3, ja, ic, jc, mi, ni, nq; logical left; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dlarz_(char *, integer *, integer *, integer * , doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMR3 overwrites the general real m by n matrix C with */ /* Q * C if SIDE = 'L' and TRANS = 'N', or */ /* Q'* C if SIDE = 'L' and TRANS = 'T', or */ /* C * Q if SIDE = 'R' and TRANS = 'N', or */ /* C * Q' if SIDE = 'R' and TRANS = 'T', */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DTZRZF. Q is of order m if SIDE = 'L' and of order n */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q' from the Left */ /* = 'R': apply Q or Q' from the Right */ /* TRANS (input) CHARACTER*1 */ /* = 'N': apply Q (No transpose) */ /* = 'T': apply Q' (Transpose) */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* L (input) INTEGER */ /* The number of columns of the matrix A containing */ /* the meaningful part of the Householder reflectors. */ /* If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DTZRZF in the last k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DTZRZF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the m-by-n matrix C. */ /* On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (N) if SIDE = 'L', */ /* (M) if SIDE = 'R' */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); /* NQ is the order of Q */ if (left) { nq = *m; } else { nq = *n; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*l < 0 || left && *l > *m || ! left && *l > *n) { *info = -6; } else if (*lda < max(1,*k)) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMR3", &i__1); return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { return 0; } if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = 1; } else { i1 = *k; i2 = 1; i3 = -1; } if (left) { ni = *n; ja = *m - *l + 1; jc = 1; } else { mi = *m; ja = *n - *l + 1; ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { /* H(i) or H(i)' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H(i) or H(i)' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H(i) or H(i)' */ _starpu_dlarz_(side, &mi, &ni, l, &a[i__ + ja * a_dim1], lda, &tau[i__], &c__[ ic + jc * c_dim1], ldc, &work[1]); /* L10: */ } return 0; /* End of DORMR3 */ } /* _starpu_dormr3_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormrq.c000066400000000000000000000225711413463044200206610ustar00rootroot00000000000000/* dormrq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormrq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dormr2_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical notran; integer ldwork; char transt[1]; integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMRQ overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DGERQF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DGERQF in the last k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DGERQF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = max(1,*n); } else { nq = *n; nw = max(1,*m); } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*lda < max(1,*k)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } if (*info == 0) { if (*m == 0 || *n == 0) { lwkopt = 1; } else { /* Determine the block size. NB may be at most NBMAX, where */ /* NBMAX is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMRQ", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = nw * nb; } work[1] = (doublereal) lwkopt; if (*lwork < nw && ! lquery) { *info = -12; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMRQ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMRQ", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dormr2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; } else { mi = *m; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__4 = nq - *k + i__ + ib - 1; _starpu_dlarft_("Backward", "Rowwise", &i__4, &ib, &a[i__ + a_dim1], lda, &tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(1:m-k+i+ib-1,1:n) */ mi = *m - *k + i__ + ib - 1; } else { /* H or H' is applied to C(1:m,1:n-k+i+ib-1) */ ni = *n - *k + i__ + ib - 1; } /* Apply H or H' */ _starpu_dlarfb_(side, transt, "Backward", "Rowwise", &mi, &ni, &ib, &a[ i__ + a_dim1], lda, t, &c__65, &c__[c_offset], ldc, &work[ 1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMRQ */ } /* _starpu_dormrq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormrz.c000066400000000000000000000237501413463044200206720ustar00rootroot00000000000000/* dormrz.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; /* Subroutine */ int _starpu_dormrz_(char *side, char *trans, integer *m, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__; doublereal t[4160] /* was [65][64] */; integer i1, i2, i3, ib, ic, ja, jc, nb, mi, ni, nq, nw, iws; logical left; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; extern /* Subroutine */ int _starpu_dormr3_(char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlarzb_(char *, char *, char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarzt_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical notran; integer ldwork; char transt[1]; integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMRZ overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix defined as the product of k */ /* elementary reflectors */ /* Q = H(1) H(2) . . . H(k) */ /* as returned by DTZRZF. Q is of order M if SIDE = 'L' and of order N */ /* if SIDE = 'R'. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* K (input) INTEGER */ /* The number of elementary reflectors whose product defines */ /* the matrix Q. */ /* If SIDE = 'L', M >= K >= 0; */ /* if SIDE = 'R', N >= K >= 0. */ /* L (input) INTEGER */ /* The number of columns of the matrix A containing */ /* the meaningful part of the Householder reflectors. */ /* If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L', */ /* (LDA,N) if SIDE = 'R' */ /* The i-th row must contain the vector which defines the */ /* elementary reflector H(i), for i = 1,2,...,k, as returned by */ /* DTZRZF in the last k rows of its array argument A. */ /* A is modified by the routine but restored on exit. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,K). */ /* TAU (input) DOUBLE PRECISION array, dimension (K) */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DTZRZF. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = max(1,*n); } else { nq = *n; nw = max(1,*m); } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; } else if (*l < 0 || left && *l > *m || ! left && *l > *n) { *info = -6; } else if (*lda < max(1,*k)) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -11; } if (*info == 0) { if (*m == 0 || *n == 0) { lwkopt = 1; } else { /* Determine the block size. NB may be at most NBMAX, where */ /* NBMAX is used to define the local array T. */ /* Computing MIN */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = _starpu_ilaenv_(&c__1, "DORMRQ", ch__1, m, n, k, &c_n1); nb = min(i__1,i__2); lwkopt = nw * nb; } work[1] = (doublereal) lwkopt; if (*lwork < max(1,nw) && ! lquery) { *info = -13; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DORMRZ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { work[1] = 1.; return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { iws = nw * nb; if (*lwork < iws) { nb = *lwork / ldwork; /* Computing MAX */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DORMRQ", ch__1, m, n, k, &c_n1); nbmin = max(i__1,i__2); } } else { iws = nw; } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ _starpu_dormr3_(side, trans, m, n, k, l, &a[a_offset], lda, &tau[1], &c__[ c_offset], ldc, &work[1], &iinfo); } else { /* Use blocked code */ if (left && ! notran || ! left && notran) { i1 = 1; i2 = *k; i3 = nb; } else { i1 = (*k - 1) / nb * nb + 1; i2 = 1; i3 = -nb; } if (left) { ni = *n; jc = 1; ja = *m - *l + 1; } else { mi = *m; ic = 1; ja = *n - *l + 1; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ _starpu_dlarzt_("Backward", "Rowwise", l, &ib, &a[i__ + ja * a_dim1], lda, &tau[i__], t, &c__65); if (left) { /* H or H' is applied to C(i:m,1:n) */ mi = *m - i__ + 1; ic = i__; } else { /* H or H' is applied to C(1:m,i:n) */ ni = *n - i__ + 1; jc = i__; } /* Apply H or H' */ _starpu_dlarzb_(side, transt, "Backward", "Rowwise", &mi, &ni, &ib, l, &a[ i__ + ja * a_dim1], lda, t, &c__65, &c__[ic + jc * c_dim1] , ldc, &work[1], &ldwork); /* L10: */ } } work[1] = (doublereal) lwkopt; return 0; /* End of DORMRZ */ } /* _starpu_dormrz_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dormtr.c000066400000000000000000000211461413463044200206610ustar00rootroot00000000000000/* dormtr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; /* Subroutine */ int _starpu_dormtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * c__, integer *ldc, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2, i__3; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i1, i2, nb, mi, ni, nq, nw; logical left; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dormql_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DORMTR overwrites the general real M-by-N matrix C with */ /* SIDE = 'L' SIDE = 'R' */ /* TRANS = 'N': Q * C C * Q */ /* TRANS = 'T': Q**T * C C * Q**T */ /* where Q is a real orthogonal matrix of order nq, with nq = m if */ /* SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ /* nq-1 elementary reflectors, as returned by DSYTRD: */ /* if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); */ /* if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'L': apply Q or Q**T from the Left; */ /* = 'R': apply Q or Q**T from the Right. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A contains elementary reflectors */ /* from DSYTRD; */ /* = 'L': Lower triangle of A contains elementary reflectors */ /* from DSYTRD. */ /* TRANS (input) CHARACTER*1 */ /* = 'N': No transpose, apply Q; */ /* = 'T': Transpose, apply Q**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix C. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix C. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension */ /* (LDA,M) if SIDE = 'L' */ /* (LDA,N) if SIDE = 'R' */ /* The vectors which define the elementary reflectors, as */ /* returned by DSYTRD. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. */ /* LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. */ /* TAU (input) DOUBLE PRECISION array, dimension */ /* (M-1) if SIDE = 'L' */ /* (N-1) if SIDE = 'R' */ /* TAU(i) must contain the scalar factor of the elementary */ /* reflector H(i), as returned by DSYTRD. */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N matrix C. */ /* On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If SIDE = 'L', LWORK >= max(1,N); */ /* if SIDE = 'R', LWORK >= max(1,M). */ /* For optimum performance LWORK >= N*NB if SIDE = 'L', and */ /* LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ /* blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; /* Function Body */ *info = 0; left = _starpu_lsame_(side, "L"); upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1; /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { nq = *m; nw = *n; } else { nq = *n; nw = *m; } if (! left && ! _starpu_lsame_(side, "R")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T")) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,nq)) { *info = -7; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*lwork < max(1,nw) && ! lquery) { *info = -12; } if (*info == 0) { if (upper) { if (left) { /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; nb = _starpu_ilaenv_(&c__1, "DORMQL", ch__1, &i__2, n, &i__3, &c_n1); } else { /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; nb = _starpu_ilaenv_(&c__1, "DORMQL", ch__1, m, &i__2, &i__3, &c_n1); } } else { if (left) { /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; nb = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, &i__2, n, &i__3, &c_n1); } else { /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; nb = _starpu_ilaenv_(&c__1, "DORMQR", ch__1, m, &i__2, &i__3, &c_n1); } } lwkopt = max(1,nw) * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__2 = -(*info); _starpu_xerbla_("DORMTR", &i__2); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || nq == 1) { work[1] = 1.; return 0; } if (left) { mi = *m - 1; ni = *n; } else { mi = *m; ni = *n - 1; } if (upper) { /* Q was determined by a call to DSYTRD with UPLO = 'U' */ i__2 = nq - 1; _starpu_dormql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo); } else { /* Q was determined by a call to DSYTRD with UPLO = 'L' */ if (left) { i1 = 2; i2 = 1; } else { i1 = 1; i2 = 2; } i__2 = nq - 1; _starpu_dormqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo); } work[1] = (doublereal) lwkopt; return 0; /* End of DORMTR */ } /* _starpu_dormtr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbcon.c000066400000000000000000000154541413463044200206240ustar00rootroot00000000000000/* dpbcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dpbcon_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *anorm, doublereal *rcond, doublereal * work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1; doublereal d__1; /* Local variables */ integer ix, kase; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal scalel; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlatbs_(char *, char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal scaleu; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal ainvnm; char normin[1]; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBCON estimates the reciprocal of the condition number (in the */ /* 1-norm) of a real symmetric positive definite band matrix using the */ /* Cholesky factorization A = U**T*U or A = L*L**T computed by DPBTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangular factor stored in AB; */ /* = 'L': Lower triangular factor stored in AB. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T of the band matrix A, stored in the */ /* first KD+1 rows of the array. The j-th column of U or L is */ /* stored in the j-th column of the array AB as follows: */ /* if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO ='L', AB(1+i-j,j) = L(i,j) for j<=i<=min(n,j+kd). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* ANORM (input) DOUBLE PRECISION */ /* The 1-norm (or infinity-norm) of the symmetric band matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an */ /* estimate of the 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*ldab < *kd + 1) { *info = -5; } else if (*anorm < 0.) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } smlnum = _starpu_dlamch_("Safe minimum"); /* Estimate the 1-norm of the inverse. */ kase = 0; *(unsigned char *)normin = 'N'; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (upper) { /* Multiply by inv(U'). */ _starpu_dlatbs_("Upper", "Transpose", "Non-unit", normin, n, kd, &ab[ ab_offset], ldab, &work[1], &scalel, &work[(*n << 1) + 1], info); *(unsigned char *)normin = 'Y'; /* Multiply by inv(U). */ _starpu_dlatbs_("Upper", "No transpose", "Non-unit", normin, n, kd, &ab[ ab_offset], ldab, &work[1], &scaleu, &work[(*n << 1) + 1], info); } else { /* Multiply by inv(L). */ _starpu_dlatbs_("Lower", "No transpose", "Non-unit", normin, n, kd, &ab[ ab_offset], ldab, &work[1], &scalel, &work[(*n << 1) + 1], info); *(unsigned char *)normin = 'Y'; /* Multiply by inv(L'). */ _starpu_dlatbs_("Lower", "Transpose", "Non-unit", normin, n, kd, &ab[ ab_offset], ldab, &work[1], &scaleu, &work[(*n << 1) + 1], info); } /* Multiply by 1/SCALE if doing so will not cause overflow. */ scale = scalel * scaleu; if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } L20: return 0; /* End of DPBCON */ } /* _starpu_dpbcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbequ.c000066400000000000000000000130471413463044200206330ustar00rootroot00000000000000/* dpbequ.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dpbequ_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal smin; extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBEQU computes row and column scalings intended to equilibrate a */ /* symmetric positive definite band matrix A and reduce its condition */ /* number (with respect to the two-norm). S contains the scale factors, */ /* S(i) = 1/sqrt(A(i,i)), chosen so that the scaled matrix B with */ /* elements B(i,j) = S(i)*A(i,j)*S(j) has ones on the diagonal. This */ /* choice of S puts the condition number of B within a factor N of the */ /* smallest possible condition number over all possible diagonal */ /* scalings. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangular of A is stored; */ /* = 'L': Lower triangular of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangle of the symmetric band matrix A, */ /* stored in the first KD+1 rows of the array. The j-th column */ /* of A is stored in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array A. LDAB >= KD+1. */ /* S (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, S contains the scale factors for A. */ /* SCOND (output) DOUBLE PRECISION */ /* If INFO = 0, S contains the ratio of the smallest S(i) to */ /* the largest S(i). If SCOND >= 0.1 and AMAX is neither too */ /* large nor too small, it is not worth scaling by S. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, the i-th diagonal element is nonpositive. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --s; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*ldab < *kd + 1) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBEQU", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *scond = 1.; *amax = 0.; return 0; } if (upper) { j = *kd + 1; } else { j = 1; } /* Initialize SMIN and AMAX. */ s[1] = ab[j + ab_dim1]; smin = s[1]; *amax = s[1]; /* Find the minimum and maximum diagonal elements. */ i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { s[i__] = ab[j + i__ * ab_dim1]; /* Computing MIN */ d__1 = smin, d__2 = s[i__]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = *amax, d__2 = s[i__]; *amax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { /* Find the first non-positive diagonal element and return. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] <= 0.) { *info = i__; return 0; } /* L20: */ } } else { /* Set the scale factors to the reciprocals */ /* of the diagonal elements. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { s[i__] = 1. / sqrt(s[i__]); /* L30: */ } /* Compute SCOND = min(S(I)) / max(S(I)) */ *scond = sqrt(smin) / sqrt(*amax); } return 0; /* End of DPBEQU */ } /* _starpu_dpbequ_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbrfs.c000066400000000000000000000320171413463044200206310ustar00rootroot00000000000000/* dpbrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = -1.; static doublereal c_b14 = 1.; /* Subroutine */ int _starpu_dpbrfs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k, l; doublereal s, xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dsbmv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *) ; integer count; logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpbtrs_( char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric positive definite */ /* and banded, and provides error bounds and backward error estimates */ /* for the solution. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangle of the symmetric band matrix A, */ /* stored in the first KD+1 rows of the array. The j-th column */ /* of A is stored in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* AFB (input) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T of the band matrix A as computed by */ /* DPBTRF, in the same storage format as A (see AB). */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= KD+1. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DPBTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldab < *kd + 1) { *info = -6; } else if (*ldafb < *kd + 1) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -10; } else if (*ldx < max(1,*n)) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ /* Computing MIN */ i__1 = *n + 1, i__2 = (*kd << 1) + 2; nz = min(i__1,i__2); eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - A * X */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dsbmv_(uplo, n, kd, &c_b12, &ab[ab_offset], ldab, &x[j * x_dim1 + 1], &c__1, &c_b14, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(A)*abs(X) + abs(B). */ if (upper) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); l = *kd + 1 - k; /* Computing MAX */ i__3 = 1, i__4 = k - *kd; i__5 = k - 1; for (i__ = max(i__3,i__4); i__ <= i__5; ++i__) { work[i__] += (d__1 = ab[l + i__ + k * ab_dim1], abs(d__1)) * xk; s += (d__1 = ab[l + i__ + k * ab_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L40: */ } work[k] = work[k] + (d__1 = ab[*kd + 1 + k * ab_dim1], abs( d__1)) * xk + s; /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); work[k] += (d__1 = ab[k * ab_dim1 + 1], abs(d__1)) * xk; l = 1 - k; /* Computing MIN */ i__3 = *n, i__4 = k + *kd; i__5 = min(i__3,i__4); for (i__ = k + 1; i__ <= i__5; ++i__) { work[i__] += (d__1 = ab[l + i__ + k * ab_dim1], abs(d__1)) * xk; s += (d__1 = ab[l + i__ + k * ab_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L60: */ } work[k] += s; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dpbtrs_(uplo, n, kd, &c__1, &afb[afb_offset], ldafb, &work[*n + 1] , n, info); _starpu_daxpy_(n, &c_b14, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(A))* */ /* ( abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(A) is the inverse of A */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(A)*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(A)*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(A) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(A'). */ _starpu_dpbtrs_(uplo, n, kd, &c__1, &afb[afb_offset], ldafb, &work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] *= work[i__]; /* L110: */ } } else if (kase == 2) { /* Multiply by inv(A)*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] *= work[i__]; /* L120: */ } _starpu_dpbtrs_(uplo, n, kd, &c__1, &afb[afb_offset], ldafb, &work[*n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DPBRFS */ } /* _starpu_dpbrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbstf.c000066400000000000000000000214271413463044200206360ustar00rootroot00000000000000/* dpbstf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b9 = -1.; /* Subroutine */ int _starpu_dpbstf_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer j, m, km; doublereal ajj; integer kld; extern /* Subroutine */ int _starpu_dsyr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dscal_( integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBSTF computes a split Cholesky factorization of a real */ /* symmetric positive definite band matrix A. */ /* This routine is designed to be used in conjunction with DSBGST. */ /* The factorization has the form A = S**T*S where S is a band matrix */ /* of the same bandwidth as A and the following structure: */ /* S = ( U ) */ /* ( M L ) */ /* where U is upper triangular of order m = (n+kd)/2, and L is lower */ /* triangular of order n-m. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first kd+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, if INFO = 0, the factor S from the split Cholesky */ /* factorization A = S**T*S. See Further Details. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the factorization could not be completed, */ /* because the updated element a(i,i) was negative; the */ /* matrix A is not positive definite. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* N = 7, KD = 2: */ /* S = ( s11 s12 s13 ) */ /* ( s22 s23 s24 ) */ /* ( s33 s34 ) */ /* ( s44 ) */ /* ( s53 s54 s55 ) */ /* ( s64 s65 s66 ) */ /* ( s75 s76 s77 ) */ /* If UPLO = 'U', the array AB holds: */ /* on entry: on exit: */ /* * * a13 a24 a35 a46 a57 * * s13 s24 s53 s64 s75 */ /* * a12 a23 a34 a45 a56 a67 * s12 s23 s34 s54 s65 s76 */ /* a11 a22 a33 a44 a55 a66 a77 s11 s22 s33 s44 s55 s66 s77 */ /* If UPLO = 'L', the array AB holds: */ /* on entry: on exit: */ /* a11 a22 a33 a44 a55 a66 a77 s11 s22 s33 s44 s55 s66 s77 */ /* a21 a32 a43 a54 a65 a76 * s12 s23 s34 s54 s65 s76 * */ /* a31 a42 a53 a64 a64 * * s13 s24 s53 s64 s75 * * */ /* Array elements marked * are not used by the routine. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*ldab < *kd + 1) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBSTF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Computing MAX */ i__1 = 1, i__2 = *ldab - 1; kld = max(i__1,i__2); /* Set the splitting point m. */ m = (*n + *kd) / 2; if (upper) { /* Factorize A(m+1:n,m+1:n) as L**T*L, and update A(1:m,1:m). */ i__1 = m + 1; for (j = *n; j >= i__1; --j) { /* Compute s(j,j) and test for non-positive-definiteness. */ ajj = ab[*kd + 1 + j * ab_dim1]; if (ajj <= 0.) { goto L50; } ajj = sqrt(ajj); ab[*kd + 1 + j * ab_dim1] = ajj; /* Computing MIN */ i__2 = j - 1; km = min(i__2,*kd); /* Compute elements j-km:j-1 of the j-th column and update the */ /* the leading submatrix within the band. */ d__1 = 1. / ajj; _starpu_dscal_(&km, &d__1, &ab[*kd + 1 - km + j * ab_dim1], &c__1); _starpu_dsyr_("Upper", &km, &c_b9, &ab[*kd + 1 - km + j * ab_dim1], &c__1, &ab[*kd + 1 + (j - km) * ab_dim1], &kld); /* L10: */ } /* Factorize the updated submatrix A(1:m,1:m) as U**T*U. */ i__1 = m; for (j = 1; j <= i__1; ++j) { /* Compute s(j,j) and test for non-positive-definiteness. */ ajj = ab[*kd + 1 + j * ab_dim1]; if (ajj <= 0.) { goto L50; } ajj = sqrt(ajj); ab[*kd + 1 + j * ab_dim1] = ajj; /* Computing MIN */ i__2 = *kd, i__3 = m - j; km = min(i__2,i__3); /* Compute elements j+1:j+km of the j-th row and update the */ /* trailing submatrix within the band. */ if (km > 0) { d__1 = 1. / ajj; _starpu_dscal_(&km, &d__1, &ab[*kd + (j + 1) * ab_dim1], &kld); _starpu_dsyr_("Upper", &km, &c_b9, &ab[*kd + (j + 1) * ab_dim1], &kld, &ab[*kd + 1 + (j + 1) * ab_dim1], &kld); } /* L20: */ } } else { /* Factorize A(m+1:n,m+1:n) as L**T*L, and update A(1:m,1:m). */ i__1 = m + 1; for (j = *n; j >= i__1; --j) { /* Compute s(j,j) and test for non-positive-definiteness. */ ajj = ab[j * ab_dim1 + 1]; if (ajj <= 0.) { goto L50; } ajj = sqrt(ajj); ab[j * ab_dim1 + 1] = ajj; /* Computing MIN */ i__2 = j - 1; km = min(i__2,*kd); /* Compute elements j-km:j-1 of the j-th row and update the */ /* trailing submatrix within the band. */ d__1 = 1. / ajj; _starpu_dscal_(&km, &d__1, &ab[km + 1 + (j - km) * ab_dim1], &kld); _starpu_dsyr_("Lower", &km, &c_b9, &ab[km + 1 + (j - km) * ab_dim1], &kld, &ab[(j - km) * ab_dim1 + 1], &kld); /* L30: */ } /* Factorize the updated submatrix A(1:m,1:m) as U**T*U. */ i__1 = m; for (j = 1; j <= i__1; ++j) { /* Compute s(j,j) and test for non-positive-definiteness. */ ajj = ab[j * ab_dim1 + 1]; if (ajj <= 0.) { goto L50; } ajj = sqrt(ajj); ab[j * ab_dim1 + 1] = ajj; /* Computing MIN */ i__2 = *kd, i__3 = m - j; km = min(i__2,i__3); /* Compute elements j+1:j+km of the j-th column and update the */ /* trailing submatrix within the band. */ if (km > 0) { d__1 = 1. / ajj; _starpu_dscal_(&km, &d__1, &ab[j * ab_dim1 + 2], &c__1); _starpu_dsyr_("Lower", &km, &c_b9, &ab[j * ab_dim1 + 2], &c__1, &ab[( j + 1) * ab_dim1 + 1], &kld); } /* L40: */ } } return 0; L50: *info = j; return 0; /* End of DPBSTF */ } /* _starpu_dpbstf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbsv.c000066400000000000000000000141471413463044200204730ustar00rootroot00000000000000/* dpbsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dpbsv_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpbtrf_( char *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dpbtrs_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBSV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite band matrix and X */ /* and B are N-by-NRHS matrices. */ /* The Cholesky decomposition is used to factor A as */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular band matrix, and L is a lower */ /* triangular band matrix, with the same number of superdiagonals or */ /* subdiagonals as A. The factored form of A is then used to solve the */ /* system of equations A * X = B. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(KD+1+i-j,j) = A(i,j) for max(1,j-KD)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(N,j+KD). */ /* See below for further details. */ /* On exit, if INFO = 0, the triangular factor U or L from the */ /* Cholesky factorization A = U**T*U or A = L*L**T of the band */ /* matrix A, in the same storage format as A. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i of A is not */ /* positive definite, so the factorization could not be */ /* completed, and the solution has not been computed. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* N = 6, KD = 2, and UPLO = 'U': */ /* On entry: On exit: */ /* * * a13 a24 a35 a46 * * u13 u24 u35 u46 */ /* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 */ /* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 */ /* Similarly, if UPLO = 'L' the format of A is as follows: */ /* On entry: On exit: */ /* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 */ /* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * */ /* a31 a42 a53 a64 * * l31 l42 l53 l64 * * */ /* Array elements marked * are not used by the routine. */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldab < *kd + 1) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBSV ", &i__1); return 0; } /* Compute the Cholesky factorization A = U'*U or A = L*L'. */ _starpu_dpbtrf_(uplo, n, kd, &ab[ab_offset], ldab, info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dpbtrs_(uplo, n, kd, nrhs, &ab[ab_offset], ldab, &b[b_offset], ldb, info); } return 0; /* End of DPBSV */ } /* _starpu_dpbsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbsvx.c000066400000000000000000000434731413463044200206670ustar00rootroot00000000000000/* dpbsvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dpbsvx_(char *fact, char *uplo, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, char *equed, doublereal *s, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, afb_dim1, afb_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j, j1, j2; doublereal amax, smin, smax; extern logical _starpu_lsame_(char *, char *); doublereal scond, anorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical equil, rcequ, upper; extern doublereal _starpu_dlamch_(char *), _starpu_dlansb_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dpbcon_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlaqsb_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dpbequ_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dpbrfs_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dpbtrf_(char *, integer *, integer *, doublereal *, integer *, integer *); integer infequ; extern /* Subroutine */ int _starpu_dpbtrs_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBSVX uses the Cholesky factorization A = U**T*U or A = L*L**T to */ /* compute the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite band matrix and X */ /* and B are N-by-NRHS matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', real scaling factors are computed to equilibrate */ /* the system: */ /* diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(S)*A*diag(S) and B by diag(S)*B. */ /* 2. If FACT = 'N' or 'E', the Cholesky decomposition is used to */ /* factor the matrix A (after equilibration if FACT = 'E') as */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular band matrix, and L is a lower */ /* triangular band matrix. */ /* 3. If the leading i-by-i principal minor is not positive definite, */ /* then the routine returns with INFO = i. Otherwise, the factored */ /* form of A is used to estimate the condition number of the matrix */ /* A. If the reciprocal of the condition number is less than machine */ /* precision, INFO = N+1 is returned as a warning, but the routine */ /* still goes on to solve for X and compute error bounds as */ /* described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(S) so that it solves the original system before */ /* equilibration. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AFB contains the factored form of A. */ /* If EQUED = 'Y', the matrix A has been equilibrated */ /* with scaling factors given by S. AB and AFB will not */ /* be modified. */ /* = 'N': The matrix A will be copied to AFB and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AFB and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* NRHS (input) INTEGER */ /* The number of right-hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array, except */ /* if FACT = 'F' and EQUED = 'Y', then A must contain the */ /* equilibrated matrix diag(S)*A*diag(S). The j-th column of A */ /* is stored in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(KD+1+i-j,j) = A(i,j) for max(1,j-KD)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(N,j+KD). */ /* See below for further details. */ /* On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by */ /* diag(S)*A*diag(S). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array A. LDAB >= KD+1. */ /* AFB (input or output) DOUBLE PRECISION array, dimension (LDAFB,N) */ /* If FACT = 'F', then AFB is an input argument and on entry */ /* contains the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T of the band matrix */ /* A, in the same storage format as A (see AB). If EQUED = 'Y', */ /* then AFB is the factored form of the equilibrated matrix A. */ /* If FACT = 'N', then AFB is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T. */ /* If FACT = 'E', then AFB is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T of the equilibrated */ /* matrix A (see the description of A for the form of the */ /* equilibrated matrix). */ /* LDAFB (input) INTEGER */ /* The leading dimension of the array AFB. LDAFB >= KD+1. */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'Y': Equilibration was done, i.e., A has been replaced by */ /* diag(S) * A * diag(S). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A; not accessed if EQUED = 'N'. S is */ /* an input argument if FACT = 'F'; otherwise, S is an output */ /* argument. If FACT = 'F' and EQUED = 'Y', each element of S */ /* must be positive. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', */ /* B is overwritten by diag(S) * B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to */ /* the original system of equations. Note that if EQUED = 'Y', */ /* A and B are modified on exit, and the solution to the */ /* equilibrated system is inv(diag(S))*X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A after equilibration (if done). If RCOND is less than the */ /* machine precision (in particular, if RCOND = 0), the matrix */ /* is singular to working precision. This condition is */ /* indicated by a return code of INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: the leading minor of order i of A is */ /* not positive definite, so the factorization */ /* could not be completed, and the solution has not */ /* been computed. RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* N = 6, KD = 2, and UPLO = 'U': */ /* Two-dimensional storage of the symmetric matrix A: */ /* a11 a12 a13 */ /* a22 a23 a24 */ /* a33 a34 a35 */ /* a44 a45 a46 */ /* a55 a56 */ /* (aij=conjg(aji)) a66 */ /* Band storage of the upper triangle of A: */ /* * * a13 a24 a35 a46 */ /* * a12 a23 a34 a45 a56 */ /* a11 a22 a33 a44 a55 a66 */ /* Similarly, if UPLO = 'L' the format of A is as follows: */ /* a11 a22 a33 a44 a55 a66 */ /* a21 a32 a43 a54 a65 * */ /* a31 a42 a53 a64 * * */ /* Array elements marked * are not used by the routine. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; afb_dim1 = *ldafb; afb_offset = 1 + afb_dim1; afb -= afb_offset; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); upper = _starpu_lsame_(uplo, "U"); if (nofact || equil) { *(unsigned char *)equed = 'N'; rcequ = FALSE_; } else { rcequ = _starpu_lsame_(equed, "Y"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; } /* Test the input parameters. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kd < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*ldab < *kd + 1) { *info = -7; } else if (*ldafb < *kd + 1) { *info = -9; } else if (_starpu_lsame_(fact, "F") && ! (rcequ || _starpu_lsame_( equed, "N"))) { *info = -10; } else { if (rcequ) { smin = bignum; smax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = smin, d__2 = s[j]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = smax, d__2 = s[j]; smax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { *info = -11; } else if (*n > 0) { scond = max(smin,smlnum) / min(smax,bignum); } else { scond = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -13; } else if (*ldx < max(1,*n)) { *info = -15; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBSVX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dpbequ_(uplo, n, kd, &ab[ab_offset], ldab, &s[1], &scond, &amax, & infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqsb_(uplo, n, kd, &ab[ab_offset], ldab, &s[1], &scond, &amax, equed); rcequ = _starpu_lsame_(equed, "Y"); } } /* Scale the right-hand side. */ if (rcequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = s[i__] * b[i__ + j * b_dim1]; /* L20: */ } /* L30: */ } } if (nofact || equil) { /* Compute the Cholesky factorization A = U'*U or A = L*L'. */ if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = j - *kd; j1 = max(i__2,1); i__2 = j - j1 + 1; _starpu_dcopy_(&i__2, &ab[*kd + 1 - j + j1 + j * ab_dim1], &c__1, & afb[*kd + 1 - j + j1 + j * afb_dim1], &c__1); /* L40: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ i__2 = j + *kd; j2 = min(i__2,*n); i__2 = j2 - j + 1; _starpu_dcopy_(&i__2, &ab[j * ab_dim1 + 1], &c__1, &afb[j * afb_dim1 + 1], &c__1); /* L50: */ } } _starpu_dpbtrf_(uplo, n, kd, &afb[afb_offset], ldafb, info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ anorm = _starpu_dlansb_("1", uplo, n, kd, &ab[ab_offset], ldab, &work[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dpbcon_(uplo, n, kd, &afb[afb_offset], ldafb, &anorm, rcond, &work[1], & iwork[1], info); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dpbtrs_(uplo, n, kd, nrhs, &afb[afb_offset], ldafb, &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dpbrfs_(uplo, n, kd, nrhs, &ab[ab_offset], ldab, &afb[afb_offset], ldafb, &b[b_offset], ldb, &x[x_offset], ldx, &ferr[1], &berr[1], &work[1] , &iwork[1], info); /* Transform the solution matrix X to a solution of the original */ /* system. */ if (rcequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] = s[i__] * x[i__ + j * x_dim1]; /* L60: */ } /* L70: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= scond; /* L80: */ } } /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DPBSVX */ } /* _starpu_dpbsvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbtf2.c000066400000000000000000000156311413463044200205350ustar00rootroot00000000000000/* dpbtf2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b8 = -1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dpbtf2_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer j, kn; doublereal ajj; integer kld; extern /* Subroutine */ int _starpu_dsyr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dscal_( integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBTF2 computes the Cholesky factorization of a real symmetric */ /* positive definite band matrix A. */ /* The factorization has the form */ /* A = U' * U , if UPLO = 'U', or */ /* A = L * L', if UPLO = 'L', */ /* where U is an upper triangular matrix, U' is the transpose of U, and */ /* L is lower triangular. */ /* This is the unblocked version of the algorithm, calling Level 2 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of super-diagonals of the matrix A if UPLO = 'U', */ /* or the number of sub-diagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, if INFO = 0, the triangular factor U or L from the */ /* Cholesky factorization A = U'*U or A = L*L' of the band */ /* matrix A, in the same storage format as A. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* > 0: if INFO = k, the leading minor of order k is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* N = 6, KD = 2, and UPLO = 'U': */ /* On entry: On exit: */ /* * * a13 a24 a35 a46 * * u13 u24 u35 u46 */ /* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 */ /* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 */ /* Similarly, if UPLO = 'L' the format of A is as follows: */ /* On entry: On exit: */ /* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 */ /* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * */ /* a31 a42 a53 a64 * * l31 l42 l53 l64 * * */ /* Array elements marked * are not used by the routine. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*ldab < *kd + 1) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBTF2", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Computing MAX */ i__1 = 1, i__2 = *ldab - 1; kld = max(i__1,i__2); if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute U(J,J) and test for non-positive-definiteness. */ ajj = ab[*kd + 1 + j * ab_dim1]; if (ajj <= 0.) { goto L30; } ajj = sqrt(ajj); ab[*kd + 1 + j * ab_dim1] = ajj; /* Compute elements J+1:J+KN of row J and update the */ /* trailing submatrix within the band. */ /* Computing MIN */ i__2 = *kd, i__3 = *n - j; kn = min(i__2,i__3); if (kn > 0) { d__1 = 1. / ajj; _starpu_dscal_(&kn, &d__1, &ab[*kd + (j + 1) * ab_dim1], &kld); _starpu_dsyr_("Upper", &kn, &c_b8, &ab[*kd + (j + 1) * ab_dim1], &kld, &ab[*kd + 1 + (j + 1) * ab_dim1], &kld); } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute L(J,J) and test for non-positive-definiteness. */ ajj = ab[j * ab_dim1 + 1]; if (ajj <= 0.) { goto L30; } ajj = sqrt(ajj); ab[j * ab_dim1 + 1] = ajj; /* Compute elements J+1:J+KN of column J and update the */ /* trailing submatrix within the band. */ /* Computing MIN */ i__2 = *kd, i__3 = *n - j; kn = min(i__2,i__3); if (kn > 0) { d__1 = 1. / ajj; _starpu_dscal_(&kn, &d__1, &ab[j * ab_dim1 + 2], &c__1); _starpu_dsyr_("Lower", &kn, &c_b8, &ab[j * ab_dim1 + 2], &c__1, &ab[( j + 1) * ab_dim1 + 1], &kld); } /* L20: */ } } return 0; L30: *info = j; return 0; /* End of DPBTF2 */ } /* _starpu_dpbtf2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbtrf.c000066400000000000000000000327701413463044200206400ustar00rootroot00000000000000/* dpbtrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b18 = 1.; static doublereal c_b21 = -1.; static integer c__33 = 33; /* Subroutine */ int _starpu_dpbtrf_(char *uplo, integer *n, integer *kd, doublereal * ab, integer *ldab, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, i2, i3, ib, nb, ii, jj; doublereal work[1056] /* was [33][32] */; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsyrk_( char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dpbtf2_(char *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dpotf2_(char *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBTRF computes the Cholesky factorization of a real symmetric */ /* positive definite band matrix A. */ /* The factorization has the form */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, if INFO = 0, the triangular factor U or L from the */ /* Cholesky factorization A = U**T*U or A = L*L**T of the band */ /* matrix A, in the same storage format as A. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* Further Details */ /* =============== */ /* The band storage scheme is illustrated by the following example, when */ /* N = 6, KD = 2, and UPLO = 'U': */ /* On entry: On exit: */ /* * * a13 a24 a35 a46 * * u13 u24 u35 u46 */ /* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 */ /* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 */ /* Similarly, if UPLO = 'L' the format of A is as follows: */ /* On entry: On exit: */ /* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 */ /* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * */ /* a31 a42 a53 a64 * * l31 l42 l53 l64 * * */ /* Array elements marked * are not used by the routine. */ /* Contributed by */ /* Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; /* Function Body */ *info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*ldab < *kd + 1) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment */ nb = _starpu_ilaenv_(&c__1, "DPBTRF", uplo, n, kd, &c_n1, &c_n1); /* The block size must not exceed the semi-bandwidth KD, and must not */ /* exceed the limit set by the size of the local array WORK. */ nb = min(nb,32); if (nb <= 1 || nb > *kd) { /* Use unblocked code */ _starpu_dpbtf2_(uplo, n, kd, &ab[ab_offset], ldab, info); } else { /* Use blocked code */ if (_starpu_lsame_(uplo, "U")) { /* Compute the Cholesky factorization of a symmetric band */ /* matrix, given the upper triangle of the matrix in band */ /* storage. */ /* Zero the upper triangle of the work array. */ i__1 = nb; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[i__ + j * 33 - 34] = 0.; /* L10: */ } /* L20: */ } /* Process the band matrix one diagonal block at a time. */ i__1 = *n; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = nb, i__4 = *n - i__ + 1; ib = min(i__3,i__4); /* Factorize the diagonal block */ i__3 = *ldab - 1; _starpu_dpotf2_(uplo, &ib, &ab[*kd + 1 + i__ * ab_dim1], &i__3, &ii); if (ii != 0) { *info = i__ + ii - 1; goto L150; } if (i__ + ib <= *n) { /* Update the relevant part of the trailing submatrix. */ /* If A11 denotes the diagonal block which has just been */ /* factorized, then we need to update the remaining */ /* blocks in the diagram: */ /* A11 A12 A13 */ /* A22 A23 */ /* A33 */ /* The numbers of rows and columns in the partitioning */ /* are IB, I2, I3 respectively. The blocks A12, A22 and */ /* A23 are empty if IB = KD. The upper triangle of A13 */ /* lies outside the band. */ /* Computing MIN */ i__3 = *kd - ib, i__4 = *n - i__ - ib + 1; i2 = min(i__3,i__4); /* Computing MIN */ i__3 = ib, i__4 = *n - i__ - *kd + 1; i3 = min(i__3,i__4); if (i2 > 0) { /* Update A12 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", &ib, &i2, &c_b18, &ab[*kd + 1 + i__ * ab_dim1], & i__3, &ab[*kd + 1 - ib + (i__ + ib) * ab_dim1] , &i__4); /* Update A22 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dsyrk_("Upper", "Transpose", &i2, &ib, &c_b21, &ab[* kd + 1 - ib + (i__ + ib) * ab_dim1], &i__3, & c_b18, &ab[*kd + 1 + (i__ + ib) * ab_dim1], & i__4); } if (i3 > 0) { /* Copy the lower triangle of A13 into the work array. */ i__3 = i3; for (jj = 1; jj <= i__3; ++jj) { i__4 = ib; for (ii = jj; ii <= i__4; ++ii) { work[ii + jj * 33 - 34] = ab[ii - jj + 1 + ( jj + i__ + *kd - 1) * ab_dim1]; /* L30: */ } /* L40: */ } /* Update A13 (in the work array). */ i__3 = *ldab - 1; _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", &ib, &i3, &c_b18, &ab[*kd + 1 + i__ * ab_dim1], & i__3, work, &c__33); /* Update A23 */ if (i2 > 0) { i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dgemm_("Transpose", "No Transpose", &i2, &i3, &ib, &c_b21, &ab[*kd + 1 - ib + (i__ + ib) * ab_dim1], &i__3, work, &c__33, &c_b18, & ab[ib + 1 + (i__ + *kd) * ab_dim1], &i__4); } /* Update A33 */ i__3 = *ldab - 1; _starpu_dsyrk_("Upper", "Transpose", &i3, &ib, &c_b21, work, & c__33, &c_b18, &ab[*kd + 1 + (i__ + *kd) * ab_dim1], &i__3); /* Copy the lower triangle of A13 back into place. */ i__3 = i3; for (jj = 1; jj <= i__3; ++jj) { i__4 = ib; for (ii = jj; ii <= i__4; ++ii) { ab[ii - jj + 1 + (jj + i__ + *kd - 1) * ab_dim1] = work[ii + jj * 33 - 34]; /* L50: */ } /* L60: */ } } } /* L70: */ } } else { /* Compute the Cholesky factorization of a symmetric band */ /* matrix, given the lower triangle of the matrix in band */ /* storage. */ /* Zero the lower triangle of the work array. */ i__2 = nb; for (j = 1; j <= i__2; ++j) { i__1 = nb; for (i__ = j + 1; i__ <= i__1; ++i__) { work[i__ + j * 33 - 34] = 0.; /* L80: */ } /* L90: */ } /* Process the band matrix one diagonal block at a time. */ i__2 = *n; i__1 = nb; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Computing MIN */ i__3 = nb, i__4 = *n - i__ + 1; ib = min(i__3,i__4); /* Factorize the diagonal block */ i__3 = *ldab - 1; _starpu_dpotf2_(uplo, &ib, &ab[i__ * ab_dim1 + 1], &i__3, &ii); if (ii != 0) { *info = i__ + ii - 1; goto L150; } if (i__ + ib <= *n) { /* Update the relevant part of the trailing submatrix. */ /* If A11 denotes the diagonal block which has just been */ /* factorized, then we need to update the remaining */ /* blocks in the diagram: */ /* A11 */ /* A21 A22 */ /* A31 A32 A33 */ /* The numbers of rows and columns in the partitioning */ /* are IB, I2, I3 respectively. The blocks A21, A22 and */ /* A32 are empty if IB = KD. The lower triangle of A31 */ /* lies outside the band. */ /* Computing MIN */ i__3 = *kd - ib, i__4 = *n - i__ - ib + 1; i2 = min(i__3,i__4); /* Computing MIN */ i__3 = ib, i__4 = *n - i__ - *kd + 1; i3 = min(i__3,i__4); if (i2 > 0) { /* Update A21 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dtrsm_("Right", "Lower", "Transpose", "Non-unit", &i2, &ib, &c_b18, &ab[i__ * ab_dim1 + 1], &i__3, & ab[ib + 1 + i__ * ab_dim1], &i__4); /* Update A22 */ i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dsyrk_("Lower", "No Transpose", &i2, &ib, &c_b21, &ab[ ib + 1 + i__ * ab_dim1], &i__3, &c_b18, &ab[( i__ + ib) * ab_dim1 + 1], &i__4); } if (i3 > 0) { /* Copy the upper triangle of A31 into the work array. */ i__3 = ib; for (jj = 1; jj <= i__3; ++jj) { i__4 = min(jj,i3); for (ii = 1; ii <= i__4; ++ii) { work[ii + jj * 33 - 34] = ab[*kd + 1 - jj + ii + (jj + i__ - 1) * ab_dim1]; /* L100: */ } /* L110: */ } /* Update A31 (in the work array). */ i__3 = *ldab - 1; _starpu_dtrsm_("Right", "Lower", "Transpose", "Non-unit", &i3, &ib, &c_b18, &ab[i__ * ab_dim1 + 1], &i__3, work, &c__33); /* Update A32 */ if (i2 > 0) { i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_dgemm_("No transpose", "Transpose", &i3, &i2, &ib, &c_b21, work, &c__33, &ab[ib + 1 + i__ * ab_dim1], &i__3, &c_b18, &ab[*kd + 1 - ib + (i__ + ib) * ab_dim1], &i__4); } /* Update A33 */ i__3 = *ldab - 1; _starpu_dsyrk_("Lower", "No Transpose", &i3, &ib, &c_b21, work, &c__33, &c_b18, &ab[(i__ + *kd) * ab_dim1 + 1], &i__3); /* Copy the upper triangle of A31 back into place. */ i__3 = ib; for (jj = 1; jj <= i__3; ++jj) { i__4 = min(jj,i3); for (ii = 1; ii <= i__4; ++ii) { ab[*kd + 1 - jj + ii + (jj + i__ - 1) * ab_dim1] = work[ii + jj * 33 - 34]; /* L120: */ } /* L130: */ } } } /* L140: */ } } } return 0; L150: return 0; /* End of DPBTRF */ } /* _starpu_dpbtrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpbtrs.c000066400000000000000000000123201413463044200206420ustar00rootroot00000000000000/* dpbtrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dpbtrs_(char *uplo, integer *n, integer *kd, integer * nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, b_dim1, b_offset, i__1; /* Local variables */ integer j; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtbsv_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPBTRS solves a system of linear equations A*X = B with a symmetric */ /* positive definite band matrix A using the Cholesky factorization */ /* A = U**T*U or A = L*L**T computed by DPBTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangular factor stored in AB; */ /* = 'L': Lower triangular factor stored in AB. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T of the band matrix A, stored in the */ /* first KD+1 rows of the array. The j-th column of U or L is */ /* stored in the j-th column of the array AB as follows: */ /* if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO ='L', AB(1+i-j,j) = L(i,j) for j<=i<=min(n,j+kd). */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*kd < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldab < *kd + 1) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPBTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (upper) { /* Solve A*X = B where A = U'*U. */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Solve U'*X = B, overwriting B with X. */ _starpu_dtbsv_("Upper", "Transpose", "Non-unit", n, kd, &ab[ab_offset], ldab, &b[j * b_dim1 + 1], &c__1); /* Solve U*X = B, overwriting B with X. */ _starpu_dtbsv_("Upper", "No transpose", "Non-unit", n, kd, &ab[ab_offset], ldab, &b[j * b_dim1 + 1], &c__1); /* L10: */ } } else { /* Solve A*X = B where A = L*L'. */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Solve L*X = B, overwriting B with X. */ _starpu_dtbsv_("Lower", "No transpose", "Non-unit", n, kd, &ab[ab_offset], ldab, &b[j * b_dim1 + 1], &c__1); /* Solve L'*X = B, overwriting B with X. */ _starpu_dtbsv_("Lower", "Transpose", "Non-unit", n, kd, &ab[ab_offset], ldab, &b[j * b_dim1 + 1], &c__1); /* L20: */ } } return 0; /* End of DPBTRS */ } /* _starpu_dpbtrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpftrf.c000066400000000000000000000323501413463044200206360ustar00rootroot00000000000000/* dpftrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b12 = 1.; static doublereal c_b15 = -1.; /* Subroutine */ int _starpu_dpftrf_(char *transr, char *uplo, integer *n, doublereal *a, integer *info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer k, n1, n2; logical normaltransr; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsyrk_( char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical nisodd; extern /* Subroutine */ int _starpu_dpotrf_(char *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* Purpose */ /* ======= */ /* DPFTRF computes the Cholesky factorization of a real symmetric */ /* positive definite matrix A. */ /* The factorization has the form */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* This is the block version of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': The Normal TRANSR of RFP A is stored; */ /* = 'T': The Transpose TRANSR of RFP A is stored. */ /* UPLO (input) CHARACTER */ /* = 'U': Upper triangle of RFP A is stored; */ /* = 'L': Lower triangle of RFP A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ); */ /* On entry, the symmetric matrix A in RFP format. RFP format is */ /* described by TRANSR, UPLO, and N as follows: If TRANSR = 'N' */ /* then RFP A is (0:N,0:k-1) when N is even; k=N/2. RFP A is */ /* (0:N-1,0:k) when N is odd; k=N/2. IF TRANSR = 'T' then RFP is */ /* the transpose of RFP A as defined when */ /* TRANSR = 'N'. The contents of RFP A are defined by UPLO as */ /* follows: If UPLO = 'U' the RFP A contains the NT elements of */ /* upper packed A. If UPLO = 'L' the RFP A contains the elements */ /* of lower packed A. The LDA of RFP A is (N+1)/2 when TRANSR = */ /* 'T'. When TRANSR is 'N' the LDA is N+1 when N is even and N */ /* is odd. See the Note below for more details. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization RFP A = U**T*U or RFP A = L*L**T. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPFTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* If N is odd, set NISODD = .TRUE. */ /* If N is even, set K = N/2 and NISODD = .FALSE. */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; } else { nisodd = TRUE_; } /* Set N1 and N2 depending on LOWER */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* start execution: there are eight cases */ if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL and N is odd ( a(0:n-1,0:n1-1) ) */ /* T1 -> a(0,0), T2 -> a(0,1), S -> a(n1,0) */ /* T1 -> a(0), T2 -> a(n), S -> a(n1) */ _starpu_dpotrf_("L", &n1, a, n, info); if (*info > 0) { return 0; } _starpu_dtrsm_("R", "L", "T", "N", &n2, &n1, &c_b12, a, n, &a[n1], n); _starpu_dsyrk_("U", "N", &n2, &n1, &c_b15, &a[n1], n, &c_b12, &a[*n], n); _starpu_dpotrf_("U", &n2, &a[*n], n, info); if (*info > 0) { *info += n1; } } else { /* SRPA for UPPER, NORMAL and N is odd ( a(0:n-1,0:n2-1) */ /* T1 -> a(n1+1,0), T2 -> a(n1,0), S -> a(0,0) */ /* T1 -> a(n2), T2 -> a(n1), S -> a(0) */ _starpu_dpotrf_("L", &n1, &a[n2], n, info); if (*info > 0) { return 0; } _starpu_dtrsm_("L", "L", "N", "N", &n1, &n2, &c_b12, &a[n2], n, a, n); _starpu_dsyrk_("U", "T", &n2, &n1, &c_b15, a, n, &c_b12, &a[n1], n); _starpu_dpotrf_("U", &n2, &a[n1], n, info); if (*info > 0) { *info += n1; } } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE and N is odd */ /* T1 -> A(0,0) , T2 -> A(1,0) , S -> A(0,n1) */ /* T1 -> a(0+0) , T2 -> a(1+0) , S -> a(0+n1*n1); lda=n1 */ _starpu_dpotrf_("U", &n1, a, &n1, info); if (*info > 0) { return 0; } _starpu_dtrsm_("L", "U", "T", "N", &n1, &n2, &c_b12, a, &n1, &a[n1 * n1], &n1); _starpu_dsyrk_("L", "T", &n2, &n1, &c_b15, &a[n1 * n1], &n1, &c_b12, & a[1], &n1); _starpu_dpotrf_("L", &n2, &a[1], &n1, info); if (*info > 0) { *info += n1; } } else { /* SRPA for UPPER, TRANSPOSE and N is odd */ /* T1 -> A(0,n1+1), T2 -> A(0,n1), S -> A(0,0) */ /* T1 -> a(n2*n2), T2 -> a(n1*n2), S -> a(0); lda = n2 */ _starpu_dpotrf_("U", &n1, &a[n2 * n2], &n2, info); if (*info > 0) { return 0; } _starpu_dtrsm_("R", "U", "N", "N", &n2, &n1, &c_b12, &a[n2 * n2], &n2, a, &n2); _starpu_dsyrk_("L", "N", &n2, &n1, &c_b15, a, &n2, &c_b12, &a[n1 * n2] , &n2); _starpu_dpotrf_("L", &n2, &a[n1 * n2], &n2, info); if (*info > 0) { *info += n1; } } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(1,0), T2 -> a(0,0), S -> a(k+1,0) */ /* T1 -> a(1), T2 -> a(0), S -> a(k+1) */ i__1 = *n + 1; _starpu_dpotrf_("L", &k, &a[1], &i__1, info); if (*info > 0) { return 0; } i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrsm_("R", "L", "T", "N", &k, &k, &c_b12, &a[1], &i__1, &a[k + 1], &i__2); i__1 = *n + 1; i__2 = *n + 1; _starpu_dsyrk_("U", "N", &k, &k, &c_b15, &a[k + 1], &i__1, &c_b12, a, &i__2); i__1 = *n + 1; _starpu_dpotrf_("U", &k, a, &i__1, info); if (*info > 0) { *info += k; } } else { /* SRPA for UPPER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(k+1,0) , T2 -> a(k,0), S -> a(0,0) */ /* T1 -> a(k+1), T2 -> a(k), S -> a(0) */ i__1 = *n + 1; _starpu_dpotrf_("L", &k, &a[k + 1], &i__1, info); if (*info > 0) { return 0; } i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrsm_("L", "L", "N", "N", &k, &k, &c_b12, &a[k + 1], &i__1, a, &i__2); i__1 = *n + 1; i__2 = *n + 1; _starpu_dsyrk_("U", "T", &k, &k, &c_b15, a, &i__1, &c_b12, &a[k], & i__2); i__1 = *n + 1; _starpu_dpotrf_("U", &k, &a[k], &i__1, info); if (*info > 0) { *info += k; } } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE and N is even (see paper) */ /* T1 -> B(0,1), T2 -> B(0,0), S -> B(0,k+1) */ /* T1 -> a(0+k), T2 -> a(0+0), S -> a(0+k*(k+1)); lda=k */ _starpu_dpotrf_("U", &k, &a[k], &k, info); if (*info > 0) { return 0; } _starpu_dtrsm_("L", "U", "T", "N", &k, &k, &c_b12, &a[k], &n1, &a[k * (k + 1)], &k); _starpu_dsyrk_("L", "T", &k, &k, &c_b15, &a[k * (k + 1)], &k, &c_b12, a, &k); _starpu_dpotrf_("L", &k, a, &k, info); if (*info > 0) { *info += k; } } else { /* SRPA for UPPER, TRANSPOSE and N is even (see paper) */ /* T1 -> B(0,k+1), T2 -> B(0,k), S -> B(0,0) */ /* T1 -> a(0+k*(k+1)), T2 -> a(0+k*k), S -> a(0+0)); lda=k */ _starpu_dpotrf_("U", &k, &a[k * (k + 1)], &k, info); if (*info > 0) { return 0; } _starpu_dtrsm_("R", "U", "N", "N", &k, &k, &c_b12, &a[k * (k + 1)], & k, a, &k); _starpu_dsyrk_("L", "N", &k, &k, &c_b15, a, &k, &c_b12, &a[k * k], &k); _starpu_dpotrf_("L", &k, &a[k * k], &k, info); if (*info > 0) { *info += k; } } } } return 0; /* End of DPFTRF */ } /* _starpu_dpftrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpftri.c000066400000000000000000000307661413463044200206520ustar00rootroot00000000000000/* dpftri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dpftri_(char *transr, char *uplo, integer *n, doublereal *a, integer *info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer k, n1, n2; logical normaltransr; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical lower; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical nisodd; extern /* Subroutine */ int _starpu_dlauum_(char *, integer *, doublereal *, integer *, integer *), _starpu_dtftri_(char *, char *, char *, integer *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPFTRI computes the inverse of a (real) symmetric positive definite */ /* matrix A using the Cholesky factorization A = U**T*U or A = L*L**T */ /* computed by DPFTRF. */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': The Normal TRANSR of RFP A is stored; */ /* = 'T': The Transpose TRANSR of RFP A is stored. */ /* UPLO (input) CHARACTER */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ) */ /* On entry, the symmetric matrix A in RFP format. RFP format is */ /* described by TRANSR, UPLO, and N as follows: If TRANSR = 'N' */ /* then RFP A is (0:N,0:k-1) when N is even; k=N/2. RFP A is */ /* (0:N-1,0:k) when N is odd; k=N/2. IF TRANSR = 'T' then RFP is */ /* the transpose of RFP A as defined when */ /* TRANSR = 'N'. The contents of RFP A are defined by UPLO as */ /* follows: If UPLO = 'U' the RFP A contains the nt elements of */ /* upper packed A. If UPLO = 'L' the RFP A contains the elements */ /* of lower packed A. The LDA of RFP A is (N+1)/2 when TRANSR = */ /* 'T'. When TRANSR is 'N' the LDA is N+1 when N is even and N */ /* is odd. See the Note below for more details. */ /* On exit, the symmetric inverse of the original matrix, in the */ /* same storage format. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the (i,i) element of the factor U or L is */ /* zero, and the inverse could not be computed. */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPFTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Invert the triangular Cholesky factor U or L. */ _starpu_dtftri_(transr, uplo, "N", n, a, info); if (*info > 0) { return 0; } /* If N is odd, set NISODD = .TRUE. */ /* If N is even, set K = N/2 and NISODD = .FALSE. */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; } else { nisodd = TRUE_; } /* Set N1 and N2 depending on LOWER */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* Start execution of triangular matrix multiply: inv(U)*inv(U)^C or */ /* inv(L)^C*inv(L). There are eight cases. */ if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL and N is odd ( a(0:n-1,0:N1-1) ) */ /* T1 -> a(0,0), T2 -> a(0,1), S -> a(N1,0) */ /* T1 -> a(0), T2 -> a(n), S -> a(N1) */ _starpu_dlauum_("L", &n1, a, n, info); _starpu_dsyrk_("L", "T", &n1, &n2, &c_b11, &a[n1], n, &c_b11, a, n); _starpu_dtrmm_("L", "U", "N", "N", &n2, &n1, &c_b11, &a[*n], n, &a[n1] , n); _starpu_dlauum_("U", &n2, &a[*n], n, info); } else { /* SRPA for UPPER, NORMAL and N is odd ( a(0:n-1,0:N2-1) */ /* T1 -> a(N1+1,0), T2 -> a(N1,0), S -> a(0,0) */ /* T1 -> a(N2), T2 -> a(N1), S -> a(0) */ _starpu_dlauum_("L", &n1, &a[n2], n, info); _starpu_dsyrk_("L", "N", &n1, &n2, &c_b11, a, n, &c_b11, &a[n2], n); _starpu_dtrmm_("R", "U", "T", "N", &n1, &n2, &c_b11, &a[n1], n, a, n); _starpu_dlauum_("U", &n2, &a[n1], n, info); } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE, and N is odd */ /* T1 -> a(0), T2 -> a(1), S -> a(0+N1*N1) */ _starpu_dlauum_("U", &n1, a, &n1, info); _starpu_dsyrk_("U", "N", &n1, &n2, &c_b11, &a[n1 * n1], &n1, &c_b11, a, &n1); _starpu_dtrmm_("R", "L", "N", "N", &n1, &n2, &c_b11, &a[1], &n1, &a[ n1 * n1], &n1); _starpu_dlauum_("L", &n2, &a[1], &n1, info); } else { /* SRPA for UPPER, TRANSPOSE, and N is odd */ /* T1 -> a(0+N2*N2), T2 -> a(0+N1*N2), S -> a(0) */ _starpu_dlauum_("U", &n1, &a[n2 * n2], &n2, info); _starpu_dsyrk_("U", "T", &n1, &n2, &c_b11, a, &n2, &c_b11, &a[n2 * n2] , &n2); _starpu_dtrmm_("L", "L", "T", "N", &n2, &n1, &c_b11, &a[n1 * n2], &n2, a, &n2); _starpu_dlauum_("L", &n2, &a[n1 * n2], &n2, info); } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(1,0), T2 -> a(0,0), S -> a(k+1,0) */ /* T1 -> a(1), T2 -> a(0), S -> a(k+1) */ i__1 = *n + 1; _starpu_dlauum_("L", &k, &a[1], &i__1, info); i__1 = *n + 1; i__2 = *n + 1; _starpu_dsyrk_("L", "T", &k, &k, &c_b11, &a[k + 1], &i__1, &c_b11, &a[ 1], &i__2); i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrmm_("L", "U", "N", "N", &k, &k, &c_b11, a, &i__1, &a[k + 1] , &i__2); i__1 = *n + 1; _starpu_dlauum_("U", &k, a, &i__1, info); } else { /* SRPA for UPPER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(k+1,0) , T2 -> a(k,0), S -> a(0,0) */ /* T1 -> a(k+1), T2 -> a(k), S -> a(0) */ i__1 = *n + 1; _starpu_dlauum_("L", &k, &a[k + 1], &i__1, info); i__1 = *n + 1; i__2 = *n + 1; _starpu_dsyrk_("L", "N", &k, &k, &c_b11, a, &i__1, &c_b11, &a[k + 1], &i__2); i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrmm_("R", "U", "T", "N", &k, &k, &c_b11, &a[k], &i__1, a, & i__2); i__1 = *n + 1; _starpu_dlauum_("U", &k, &a[k], &i__1, info); } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE, and N is even (see paper) */ /* T1 -> B(0,1), T2 -> B(0,0), S -> B(0,k+1), */ /* T1 -> a(0+k), T2 -> a(0+0), S -> a(0+k*(k+1)); lda=k */ _starpu_dlauum_("U", &k, &a[k], &k, info); _starpu_dsyrk_("U", "N", &k, &k, &c_b11, &a[k * (k + 1)], &k, &c_b11, &a[k], &k); _starpu_dtrmm_("R", "L", "N", "N", &k, &k, &c_b11, a, &k, &a[k * (k + 1)], &k); _starpu_dlauum_("L", &k, a, &k, info); } else { /* SRPA for UPPER, TRANSPOSE, and N is even (see paper) */ /* T1 -> B(0,k+1), T2 -> B(0,k), S -> B(0,0), */ /* T1 -> a(0+k*(k+1)), T2 -> a(0+k*k), S -> a(0+0)); lda=k */ _starpu_dlauum_("U", &k, &a[k * (k + 1)], &k, info); _starpu_dsyrk_("U", "T", &k, &k, &c_b11, a, &k, &c_b11, &a[k * (k + 1) ], &k); _starpu_dtrmm_("L", "L", "T", "N", &k, &k, &c_b11, &a[k * k], &k, a, & k); _starpu_dlauum_("L", &k, &a[k * k], &k, info); } } } return 0; /* End of DPFTRI */ } /* _starpu_dpftri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpftrs.c000066400000000000000000000174021413463044200206540ustar00rootroot00000000000000/* dpftrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b10 = 1.; /* Subroutine */ int _starpu_dpftrs_(char *transr, char *uplo, integer *n, integer * nrhs, doublereal *a, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1; /* Local variables */ logical normaltransr; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtfsm_(char *, char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPFTRS solves a system of linear equations A*X = B with a symmetric */ /* positive definite matrix A using the Cholesky factorization */ /* A = U**T*U or A = L*L**T computed by DPFTRF. */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': The Normal TRANSR of RFP A is stored; */ /* = 'T': The Transpose TRANSR of RFP A is stored. */ /* UPLO (input) CHARACTER */ /* = 'U': Upper triangle of RFP A is stored; */ /* = 'L': Lower triangle of RFP A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ). */ /* The triangular factor U or L from the Cholesky factorization */ /* of RFP A = U**T*U or RFP A = L*L**T, as computed by DPFTRF. */ /* See note below for more details about RFP A. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPFTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } /* start execution: there are two triangular solves */ if (lower) { _starpu_dtfsm_(transr, "L", uplo, "N", "N", n, nrhs, &c_b10, a, &b[b_offset], ldb); _starpu_dtfsm_(transr, "L", uplo, "T", "N", n, nrhs, &c_b10, a, &b[b_offset], ldb); } else { _starpu_dtfsm_(transr, "L", uplo, "T", "N", n, nrhs, &c_b10, a, &b[b_offset], ldb); _starpu_dtfsm_(transr, "L", uplo, "N", "N", n, nrhs, &c_b10, a, &b[b_offset], ldb); } return 0; /* End of DPFTRS */ } /* _starpu_dpftrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpocon.c000066400000000000000000000142661413463044200206410ustar00rootroot00000000000000/* dpocon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dpocon_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; doublereal d__1; /* Local variables */ integer ix, kase; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal scalel; extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal scaleu; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dlatrs_(char *, char *, char *, char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *); char normin[1]; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOCON estimates the reciprocal of the condition number (in the */ /* 1-norm) of a real symmetric positive definite matrix using the */ /* Cholesky factorization A = U**T*U or A = L*L**T computed by DPOTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* ANORM (input) DOUBLE PRECISION */ /* The 1-norm (or infinity-norm) of the symmetric matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an */ /* estimate of the 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*anorm < 0.) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } smlnum = _starpu_dlamch_("Safe minimum"); /* Estimate the 1-norm of inv(A). */ kase = 0; *(unsigned char *)normin = 'N'; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (upper) { /* Multiply by inv(U'). */ _starpu_dlatrs_("Upper", "Transpose", "Non-unit", normin, n, &a[a_offset], lda, &work[1], &scalel, &work[(*n << 1) + 1], info); *(unsigned char *)normin = 'Y'; /* Multiply by inv(U). */ _starpu_dlatrs_("Upper", "No transpose", "Non-unit", normin, n, &a[ a_offset], lda, &work[1], &scaleu, &work[(*n << 1) + 1], info); } else { /* Multiply by inv(L). */ _starpu_dlatrs_("Lower", "No transpose", "Non-unit", normin, n, &a[ a_offset], lda, &work[1], &scalel, &work[(*n << 1) + 1], info); *(unsigned char *)normin = 'Y'; /* Multiply by inv(L'). */ _starpu_dlatrs_("Lower", "Transpose", "Non-unit", normin, n, &a[a_offset], lda, &work[1], &scaleu, &work[(*n << 1) + 1], info); } /* Multiply by 1/SCALE if doing so will not cause overflow. */ scale = scalel * scaleu; if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } L20: return 0; /* End of DPOCON */ } /* _starpu_dpocon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpoequ.c000066400000000000000000000112001413463044200206350ustar00rootroot00000000000000/* dpoequ.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dpoequ_(integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal smin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOEQU computes row and column scalings intended to equilibrate a */ /* symmetric positive definite matrix A and reduce its condition number */ /* (with respect to the two-norm). S contains the scale factors, */ /* S(i) = 1/sqrt(A(i,i)), chosen so that the scaled matrix B with */ /* elements B(i,j) = S(i)*A(i,j)*S(j) has ones on the diagonal. This */ /* choice of S puts the condition number of B within a factor N of the */ /* smallest possible condition number over all possible diagonal */ /* scalings. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The N-by-N symmetric positive definite matrix whose scaling */ /* factors are to be computed. Only the diagonal elements of A */ /* are referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* S (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, S contains the scale factors for A. */ /* SCOND (output) DOUBLE PRECISION */ /* If INFO = 0, S contains the ratio of the smallest S(i) to */ /* the largest S(i). If SCOND >= 0.1 and AMAX is neither too */ /* large nor too small, it is not worth scaling by S. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element is nonpositive. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*lda < max(1,*n)) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOEQU", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *scond = 1.; *amax = 0.; return 0; } /* Find the minimum and maximum diagonal elements. */ s[1] = a[a_dim1 + 1]; smin = s[1]; *amax = s[1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { s[i__] = a[i__ + i__ * a_dim1]; /* Computing MIN */ d__1 = smin, d__2 = s[i__]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = *amax, d__2 = s[i__]; *amax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { /* Find the first non-positive diagonal element and return. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] <= 0.) { *info = i__; return 0; } /* L20: */ } } else { /* Set the scale factors to the reciprocals */ /* of the diagonal elements. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { s[i__] = 1. / sqrt(s[i__]); /* L30: */ } /* Compute SCOND = min(S(I)) / max(S(I)) */ *scond = sqrt(smin) / sqrt(*amax); } return 0; /* End of DPOEQU */ } /* _starpu_dpoequ_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpoequb.c000066400000000000000000000124511413463044200210100ustar00rootroot00000000000000/* dpoequb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dpoequb_(integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *scond, doublereal *amax, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal), pow_di(doublereal *, integer *), sqrt(doublereal); /* Local variables */ integer i__; doublereal tmp, base, smin; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOEQU computes row and column scalings intended to equilibrate a */ /* symmetric positive definite matrix A and reduce its condition number */ /* (with respect to the two-norm). S contains the scale factors, */ /* S(i) = 1/sqrt(A(i,i)), chosen so that the scaled matrix B with */ /* elements B(i,j) = S(i)*A(i,j)*S(j) has ones on the diagonal. This */ /* choice of S puts the condition number of B within a factor N of the */ /* smallest possible condition number over all possible diagonal */ /* scalings. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The N-by-N symmetric positive definite matrix whose scaling */ /* factors are to be computed. Only the diagonal elements of A */ /* are referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* S (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, S contains the scale factors for A. */ /* SCOND (output) DOUBLE PRECISION */ /* If INFO = 0, S contains the ratio of the smallest S(i) to */ /* the largest S(i). If SCOND >= 0.1 and AMAX is neither too */ /* large nor too small, it is not worth scaling by S. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element is nonpositive. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Positive definite only performs 1 pass of equilibration. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*lda < max(1,*n)) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOEQUB", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0) { *scond = 1.; *amax = 0.; return 0; } base = _starpu_dlamch_("B"); tmp = -.5 / log(base); /* Find the minimum and maximum diagonal elements. */ s[1] = a[a_dim1 + 1]; smin = s[1]; *amax = s[1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { s[i__] = a[i__ + i__ * a_dim1]; /* Computing MIN */ d__1 = smin, d__2 = s[i__]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = *amax, d__2 = s[i__]; *amax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { /* Find the first non-positive diagonal element and return. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] <= 0.) { *info = i__; return 0; } /* L20: */ } } else { /* Set the scale factors to the reciprocals */ /* of the diagonal elements. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = (integer) (tmp * log(s[i__])); s[i__] = pow_di(&base, &i__2); /* L30: */ } /* Compute SCOND = min(S(I)) / max(S(I)). */ *scond = sqrt(smin) / sqrt(*amax); } return 0; /* End of DPOEQUB */ } /* _starpu_dpoequb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dporfs.c000066400000000000000000000307631413463044200206540ustar00rootroot00000000000000/* dporfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = -1.; static doublereal c_b14 = 1.; /* Subroutine */ int _starpu_dporfs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * ferr, doublereal *berr, doublereal *work, integer *iwork, integer * info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s, xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; logical upper; extern /* Subroutine */ int _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpotrs_( char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPORFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric positive definite, */ /* and provides error bounds and backward error estimates for the */ /* solution. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of A contains the upper triangular part */ /* of the matrix A, and the strictly lower triangular part of A */ /* is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of A contains the lower triangular part of */ /* the matrix A, and the strictly upper triangular part of A is */ /* not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DPOTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldaf < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldx < max(1,*n)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPORFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - A * X */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dsymv_(uplo, n, &c_b12, &a[a_offset], lda, &x[j * x_dim1 + 1], &c__1, &c_b14, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(A)*abs(X) + abs(B). */ if (upper) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * xk; s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * (d__2 = x[ i__ + j * x_dim1], abs(d__2)); /* L40: */ } work[k] = work[k] + (d__1 = a[k + k * a_dim1], abs(d__1)) * xk + s; /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); work[k] += (d__1 = a[k + k * a_dim1], abs(d__1)) * xk; i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * xk; s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * (d__2 = x[ i__ + j * x_dim1], abs(d__2)); /* L60: */ } work[k] += s; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dpotrs_(uplo, n, &c__1, &af[af_offset], ldaf, &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b14, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(A))* */ /* ( abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(A) is the inverse of A */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(A)*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(A)*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(A) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(A'). */ _starpu_dpotrs_(uplo, n, &c__1, &af[af_offset], ldaf, &work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L110: */ } } else if (kase == 2) { /* Multiply by inv(A)*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L120: */ } _starpu_dpotrs_(uplo, n, &c__1, &af[af_offset], ldaf, &work[*n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DPORFS */ } /* _starpu_dporfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dporfsx.c000066400000000000000000000600131413463044200210330ustar00rootroot00000000000000/* dporfsx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c_n1 = -1; static integer c__0 = 0; static integer c__1 = 1; /* Subroutine */ int _starpu_dporfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal *err_bnds_comp__, integer * nparams, doublereal *params, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal illrcond_thresh__, unstable_thresh__, err_lbnd__; integer ref_type__, j; doublereal rcond_tmp__; integer prec_type__; extern doublereal _starpu_dla_porcond__(char *, integer *, doublereal *, integer * , doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, ftnlen); doublereal cwise_wrong__; extern /* Subroutine */ int _starpu_dla_porfsx_extended__(integer *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, logical *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, logical *, integer *, ftnlen); char norm[1]; logical ignore_cwise__; extern logical _starpu_lsame_(char *, char *); doublereal anorm; logical rcequ; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpocon_( char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern integer _starpu_ilaprec_(char *); integer ithresh, n_norms__; doublereal rthresh; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPORFSX improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric positive */ /* definite, and provides error bounds and backward error estimates */ /* for the solution. In addition to normwise error bound, the code */ /* provides maximum componentwise error bound if possible. See */ /* comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the */ /* error bounds. */ /* The original system of linear equations may have been equilibrated */ /* before calling this routine, as described by arguments EQUED and S */ /* below. In this case, the solution and error bounds returned are */ /* for the original unequilibrated system. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* EQUED (input) CHARACTER*1 */ /* Specifies the form of equilibration that was done to A */ /* before calling this routine. This is needed to compute */ /* the solution and error bounds correctly. */ /* = 'N': No equilibration */ /* = 'Y': Both row and column equilibration, i.e., A has been */ /* replaced by diag(S) * A * diag(S). */ /* The right hand side B has been changed accordingly. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of A contains the upper triangular part */ /* of the matrix A, and the strictly lower triangular part of A */ /* is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of A contains the lower triangular part of */ /* the matrix A, and the strictly upper triangular part of A is */ /* not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'Y', A is multiplied on */ /* the left and right by diag(S). S is an input argument if FACT = */ /* 'F'; otherwise, S is an output argument. If FACT = 'F' and EQUED */ /* = 'Y', each element of S must be positive. If S is output, each */ /* element of S is a power of the radix. If S is input, each element */ /* of S should be a power of the radix to ensure a reliable solution */ /* and error estimates. Scaling by powers of the radix does not cause */ /* rounding errors unless the result underflows or overflows. */ /* Rounding errors during scaling lead to refining with a matrix that */ /* is not equivalent to the input matrix, producing error estimates */ /* that may not be reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGETRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* Componentwise relative backward error. This is the */ /* componentwise relative backward error of each solution vector X(j) */ /* (i.e., the smallest relative change in any element of A or B that */ /* makes X(j) an exact solution). */ /* N_ERR_BNDS (input) INTEGER */ /* Number of error bounds to return for each right hand side */ /* and each type (normwise or componentwise). See ERR_BNDS_NORM and */ /* ERR_BNDS_COMP below. */ /* ERR_BNDS_NORM (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* NPARAMS (input) INTEGER */ /* Specifies the number of parameters set in PARAMS. If .LE. 0, the */ /* PARAMS array is never referenced and default values are used. */ /* PARAMS (input / output) DOUBLE PRECISION array, dimension NPARAMS */ /* Specifies algorithm parameters. If an entry is .LT. 0.0, then */ /* that entry will be filled with default value used for that */ /* parameter. Only positions up to NPARAMS are accessed; defaults */ /* are used for higher-numbered parameters. */ /* PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative */ /* refinement or not. */ /* Default: 1.0D+0 */ /* = 0.0 : No refinement is performed, and no error bounds are */ /* computed. */ /* = 1.0 : Use the double-precision refinement algorithm, */ /* possibly with doubled-single computations if the */ /* compilation environment does not support DOUBLE */ /* PRECISION. */ /* (other values are reserved for future use) */ /* PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual */ /* computations allowed for refinement. */ /* Default: 10 */ /* Aggressive: Set to 100 to permit convergence using approximate */ /* factorizations or factorizations other than LU. If */ /* the factorization uses a technique other than */ /* Gaussian elimination, the guarantees in */ /* err_bnds_norm and err_bnds_comp may no longer be */ /* trustworthy. */ /* PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code */ /* will attempt to find a solution with small componentwise */ /* relative error in the double-precision algorithm. Positive */ /* is true, 0.0 is false. */ /* Default: 1.0 (attempt componentwise convergence) */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: Successful exit. The solution to every right-hand side is */ /* guaranteed. */ /* < 0: If INFO = -i, the i-th argument had an illegal value */ /* > 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Check the input parameters. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; ref_type__ = 1; if (*nparams >= 1) { if (params[1] < 0.) { params[1] = 1.; } else { ref_type__ = (integer) params[1]; } } /* Set default parameters. */ illrcond_thresh__ = (doublereal) (*n) * _starpu_dlamch_("Epsilon"); ithresh = 10; rthresh = .5; unstable_thresh__ = .25; ignore_cwise__ = FALSE_; if (*nparams >= 2) { if (params[2] < 0.) { params[2] = (doublereal) ithresh; } else { ithresh = (integer) params[2]; } } if (*nparams >= 3) { if (params[3] < 0.) { if (ignore_cwise__) { params[3] = 0.; } else { params[3] = 1.; } } else { ignore_cwise__ = params[3] == 0.; } } if (ref_type__ == 0 || *n_err_bnds__ == 0) { n_norms__ = 0; } else if (ignore_cwise__) { n_norms__ = 1; } else { n_norms__ = 2; } rcequ = _starpu_lsame_(equed, "Y"); /* Test input parameters. */ if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! rcequ && ! _starpu_lsame_(equed, "N")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -11; } else if (*ldx < max(1,*n)) { *info = -13; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPORFSX", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0 || *nrhs == 0) { *rcond = 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 0.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 0.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 0.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 1.; } } return 0; } /* Default to failure. */ *rcond = 0.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 1.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 0.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 0.; } } /* Compute the norm of A and the reciprocal of the condition */ /* number of A. */ *(unsigned char *)norm = 'I'; anorm = _starpu_dlansy_(norm, uplo, n, &a[a_offset], lda, &work[1]); _starpu_dpocon_(uplo, n, &af[af_offset], ldaf, &anorm, rcond, &work[1], &iwork[1], info); /* Perform refinement on each right-hand side */ if (ref_type__ != 0) { prec_type__ = _starpu_ilaprec_("E"); _starpu_dla_porfsx_extended__(&prec_type__, uplo, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, &rcequ, &s[1], &b[b_offset], ldb, &x[ x_offset], ldx, &berr[1], &n_norms__, &err_bnds_norm__[ err_bnds_norm_offset], &err_bnds_comp__[err_bnds_comp_offset], &work[*n + 1], &work[1], &work[(*n << 1) + 1], &work[1], rcond, &ithresh, &rthresh, &unstable_thresh__, & ignore_cwise__, info, (ftnlen)1); } /* Computing MAX */ d__1 = 10., d__2 = sqrt((doublereal) (*n)); err_lbnd__ = max(d__1,d__2) * _starpu_dlamch_("Epsilon"); if (*n_err_bnds__ >= 1 && n_norms__ >= 1) { /* Compute scaled normwise condition number cond(A*C). */ if (rcequ) { rcond_tmp__ = _starpu_dla_porcond__(uplo, n, &a[a_offset], lda, &af[ af_offset], ldaf, &c_n1, &s[1], info, &work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = _starpu_dla_porcond__(uplo, n, &a[a_offset], lda, &af[ af_offset], ldaf, &c__0, &s[1], info, &work[1], &iwork[1], (ftnlen)1); } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] > 1.) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_norm__[j + err_bnds_norm_dim1] = 0.; if (*info <= *n) { *info = *n + j; } } else if (err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] < err_lbnd__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = err_lbnd__; err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = rcond_tmp__; } } } if (*n_err_bnds__ >= 1 && n_norms__ >= 2) { /* Compute componentwise condition number cond(A*diag(Y(:,J))) for */ /* each right-hand side using the current solution as an estimate of */ /* the true solution. If the componentwise error estimate is too */ /* large, then the solution is a lousy estimate of truth and the */ /* estimated RCOND may be too optimistic. To avoid misleading users, */ /* the inverse condition number is set to 0.0 when the estimated */ /* cwise error is at least CWISE_WRONG. */ cwise_wrong__ = sqrt(_starpu_dlamch_("Epsilon")); i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < cwise_wrong__) { rcond_tmp__ = _starpu_dla_porcond__(uplo, n, &a[a_offset], lda, &af[ af_offset], ldaf, &c__1, &x[j * x_dim1 + 1], info, & work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = 0.; } /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] > 1.) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 0.; if (params[3] == 1. && *info < *n + j) { *info = *n + j; } } else if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < err_lbnd__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = err_lbnd__; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = rcond_tmp__; } } } return 0; /* End of DPORFSX */ } /* _starpu_dporfsx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dposv.c000066400000000000000000000116501413463044200205040ustar00rootroot00000000000000/* dposv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpotrf_( char *, integer *, doublereal *, integer *, integer *), _starpu_dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOSV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite matrix and X and B */ /* are N-by-NRHS matrices. */ /* The Cholesky decomposition is used to factor A as */ /* A = U**T* U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is a lower triangular */ /* matrix. The factored form of A is then used to solve the system of */ /* equations A * X = B. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i of A is not */ /* positive definite, so the factorization could not be */ /* completed, and the solution has not been computed. */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOSV ", &i__1); return 0; } /* Compute the Cholesky factorization A = U'*U or A = L*L'. */ _starpu_dpotrf_(uplo, n, &a[a_offset], lda, info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); } return 0; /* End of DPOSV */ } /* _starpu_dposv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dposvx.c000066400000000000000000000401631413463044200206750ustar00rootroot00000000000000/* dposvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dposvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal * berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j; doublereal amax, smin, smax; extern logical _starpu_lsame_(char *, char *); doublereal scond, anorm; logical equil, rcequ; extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dpocon_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer infequ; extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlaqsy_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, char *), _starpu_dpoequ_(integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dporfs_( char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dpotrf_(char *, integer *, doublereal *, integer *, integer *); doublereal smlnum; extern /* Subroutine */ int _starpu_dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOSVX uses the Cholesky factorization A = U**T*U or A = L*L**T to */ /* compute the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite matrix and X and B */ /* are N-by-NRHS matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', real scaling factors are computed to equilibrate */ /* the system: */ /* diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(S)*A*diag(S) and B by diag(S)*B. */ /* 2. If FACT = 'N' or 'E', the Cholesky decomposition is used to */ /* factor the matrix A (after equilibration if FACT = 'E') as */ /* A = U**T* U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is a lower triangular */ /* matrix. */ /* 3. If the leading i-by-i principal minor is not positive definite, */ /* then the routine returns with INFO = i. Otherwise, the factored */ /* form of A is used to estimate the condition number of the matrix */ /* A. If the reciprocal of the condition number is less than machine */ /* precision, INFO = N+1 is returned as a warning, but the routine */ /* still goes on to solve for X and compute error bounds as */ /* described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(S) so that it solves the original system before */ /* equilibration. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AF contains the factored form of A. */ /* If EQUED = 'Y', the matrix A has been equilibrated */ /* with scaling factors given by S. A and AF will not */ /* be modified. */ /* = 'N': The matrix A will be copied to AF and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AF and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A, except if FACT = 'F' and */ /* EQUED = 'Y', then A must contain the equilibrated matrix */ /* diag(S)*A*diag(S). If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. A is not modified if */ /* FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit. */ /* On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by */ /* diag(S)*A*diag(S). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input or output) DOUBLE PRECISION array, dimension (LDAF,N) */ /* If FACT = 'F', then AF is an input argument and on entry */ /* contains the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T, in the same storage */ /* format as A. If EQUED .ne. 'N', then AF is the factored form */ /* of the equilibrated matrix diag(S)*A*diag(S). */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T of the original */ /* matrix A. */ /* If FACT = 'E', then AF is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T of the equilibrated */ /* matrix A (see the description of A for the form of the */ /* equilibrated matrix). */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'Y': Equilibration was done, i.e., A has been replaced by */ /* diag(S) * A * diag(S). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A; not accessed if EQUED = 'N'. S is */ /* an input argument if FACT = 'F'; otherwise, S is an output */ /* argument. If FACT = 'F' and EQUED = 'Y', each element of S */ /* must be positive. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', */ /* B is overwritten by diag(S) * B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to */ /* the original system of equations. Note that if EQUED = 'Y', */ /* A and B are modified on exit, and the solution to the */ /* equilibrated system is inv(diag(S))*X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A after equilibration (if done). If RCOND is less than the */ /* machine precision (in particular, if RCOND = 0), the matrix */ /* is singular to working precision. This condition is */ /* indicated by a return code of INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: the leading minor of order i of A is */ /* not positive definite, so the factorization */ /* could not be completed, and the solution has not */ /* been computed. RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); if (nofact || equil) { *(unsigned char *)equed = 'N'; rcequ = FALSE_; } else { rcequ = _starpu_lsame_(equed, "Y"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; } /* Test the input parameters. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (_starpu_lsame_(fact, "F") && ! (rcequ || _starpu_lsame_( equed, "N"))) { *info = -9; } else { if (rcequ) { smin = bignum; smax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = smin, d__2 = s[j]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = smax, d__2 = s[j]; smax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { *info = -10; } else if (*n > 0) { scond = max(smin,smlnum) / min(smax,bignum); } else { scond = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -12; } else if (*ldx < max(1,*n)) { *info = -14; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOSVX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dpoequ_(n, &a[a_offset], lda, &s[1], &scond, &amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqsy_(uplo, n, &a[a_offset], lda, &s[1], &scond, &amax, equed); rcequ = _starpu_lsame_(equed, "Y"); } } /* Scale the right hand side. */ if (rcequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = s[i__] * b[i__ + j * b_dim1]; /* L20: */ } /* L30: */ } } if (nofact || equil) { /* Compute the Cholesky factorization A = U'*U or A = L*L'. */ _starpu_dlacpy_(uplo, n, n, &a[a_offset], lda, &af[af_offset], ldaf); _starpu_dpotrf_(uplo, n, &af[af_offset], ldaf, info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ anorm = _starpu_dlansy_("1", uplo, n, &a[a_offset], lda, &work[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dpocon_(uplo, n, &af[af_offset], ldaf, &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dpotrs_(uplo, n, nrhs, &af[af_offset], ldaf, &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dporfs_(uplo, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, &b[ b_offset], ldb, &x[x_offset], ldx, &ferr[1], &berr[1], &work[1], & iwork[1], info); /* Transform the solution matrix X to a solution of the original */ /* system. */ if (rcequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] = s[i__] * x[i__ + j * x_dim1]; /* L40: */ } /* L50: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= scond; /* L60: */ } } /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DPOSVX */ } /* _starpu_dposvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dposvxx.c000066400000000000000000000631461413463044200210730ustar00rootroot00000000000000/* dposvxx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dposvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *rcond, doublereal *rpvgrw, doublereal * berr, integer *n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublereal * work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer j; doublereal amax, smin, smax; extern doublereal _starpu_dla_porpvgrw__(char *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, ftnlen); extern logical _starpu_lsame_(char *, char *); doublereal scond; logical equil, rcequ; extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; integer infequ; extern /* Subroutine */ int _starpu_dlaqsy_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, char *), _starpu_dpotrf_(char *, integer *, doublereal *, integer *, integer *); doublereal smlnum; extern /* Subroutine */ int _starpu_dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl2_(integer *, integer *, doublereal *, doublereal * , integer *), _starpu_dpoequb_(integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dporfsx_( char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOSVXX uses the Cholesky factorization A = U**T*U or A = L*L**T */ /* to compute the solution to a double precision system of linear equations */ /* A * X = B, where A is an N-by-N symmetric positive definite matrix */ /* and X and B are N-by-NRHS matrices. */ /* If requested, both normwise and maximum componentwise error bounds */ /* are returned. DPOSVXX will return a solution with a tiny */ /* guaranteed error (O(eps) where eps is the working machine */ /* precision) unless the matrix is very ill-conditioned, in which */ /* case a warning is returned. Relevant condition numbers also are */ /* calculated and returned. */ /* DPOSVXX accepts user-provided factorizations and equilibration */ /* factors; see the definitions of the FACT and EQUED options. */ /* Solving with refinement and using a factorization from a previous */ /* DPOSVXX call will also produce a solution with either O(eps) */ /* errors or warnings, but we cannot make that claim for general */ /* user-provided factorizations and equilibration factors if they */ /* differ from what DPOSVXX would itself produce. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', double precision scaling factors are computed to equilibrate */ /* the system: */ /* diag(S)*A*diag(S) *inv(diag(S))*X = diag(S)*B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(S)*A*diag(S) and B by diag(S)*B. */ /* 2. If FACT = 'N' or 'E', the Cholesky decomposition is used to */ /* factor the matrix A (after equilibration if FACT = 'E') as */ /* A = U**T* U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is a lower triangular */ /* matrix. */ /* 3. If the leading i-by-i principal minor is not positive definite, */ /* then the routine returns with INFO = i. Otherwise, the factored */ /* form of A is used to estimate the condition number of the matrix */ /* A (see argument RCOND). If the reciprocal of the condition number */ /* is less than machine precision, the routine still goes on to solve */ /* for X and compute error bounds as described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. By default (unless PARAMS(LA_LINRX_ITREF_I) is set to zero), */ /* the routine will use iterative refinement to try to get a small */ /* error and error bounds. Refinement calculates the residual to at */ /* least twice the working precision. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(S) so that it solves the original system before */ /* equilibration. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AF contains the factored form of A. */ /* If EQUED is not 'N', the matrix A has been */ /* equilibrated with scaling factors given by S. */ /* A and AF are not modified. */ /* = 'N': The matrix A will be copied to AF and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AF and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A, except if FACT = 'F' and EQUED = */ /* 'Y', then A must contain the equilibrated matrix */ /* diag(S)*A*diag(S). If UPLO = 'U', the leading N-by-N upper */ /* triangular part of A contains the upper triangular part of the */ /* matrix A, and the strictly lower triangular part of A is not */ /* referenced. If UPLO = 'L', the leading N-by-N lower triangular */ /* part of A contains the lower triangular part of the matrix A, and */ /* the strictly upper triangular part of A is not referenced. A is */ /* not modified if FACT = 'F' or 'N', or if FACT = 'E' and EQUED = */ /* 'N' on exit. */ /* On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by */ /* diag(S)*A*diag(S). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input or output) DOUBLE PRECISION array, dimension (LDAF,N) */ /* If FACT = 'F', then AF is an input argument and on entry */ /* contains the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T, in the same storage */ /* format as A. If EQUED .ne. 'N', then AF is the factored */ /* form of the equilibrated matrix diag(S)*A*diag(S). */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T of the original */ /* matrix A. */ /* If FACT = 'E', then AF is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T of the equilibrated */ /* matrix A (see the description of A for the form of the */ /* equilibrated matrix). */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'Y': Both row and column equilibration, i.e., A has been */ /* replaced by diag(S) * A * diag(S). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The row scale factors for A. If EQUED = 'Y', A is multiplied on */ /* the left and right by diag(S). S is an input argument if FACT = */ /* 'F'; otherwise, S is an output argument. If FACT = 'F' and EQUED */ /* = 'Y', each element of S must be positive. If S is output, each */ /* element of S is a power of the radix. If S is input, each element */ /* of S should be a power of the radix to ensure a reliable solution */ /* and error estimates. Scaling by powers of the radix does not cause */ /* rounding errors unless the result underflows or overflows. */ /* Rounding errors during scaling lead to refining with a matrix that */ /* is not equivalent to the input matrix, producing error estimates */ /* that may not be reliable. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, */ /* if EQUED = 'N', B is not modified; */ /* if EQUED = 'Y', B is overwritten by diag(S)*B; */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0, the N-by-NRHS solution matrix X to the original */ /* system of equations. Note that A and B are modified on exit if */ /* EQUED .ne. 'N', and the solution to the equilibrated system is */ /* inv(diag(S))*X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* RPVGRW (output) DOUBLE PRECISION */ /* Reciprocal pivot growth. On exit, this contains the reciprocal */ /* pivot growth factor norm(A)/norm(U). The "max absolute element" */ /* norm is used. If this is much less than 1, then the stability of */ /* the LU factorization of the (equilibrated) matrix A could be poor. */ /* This also means that the solution X, estimated condition numbers, */ /* and error bounds could be unreliable. If factorization fails with */ /* 0 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; if (nofact || equil) { *(unsigned char *)equed = 'N'; rcequ = FALSE_; } else { rcequ = _starpu_lsame_(equed, "Y"); } /* Default is failure. If an input parameter is wrong or */ /* factorization fails, make everything look horrible. Only the */ /* pivot growth is set here, the rest is initialized in DPORFSX. */ *rpvgrw = 0.; /* Test the input parameters. PARAMS is not tested until DPORFSX. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (_starpu_lsame_(fact, "F") && ! (rcequ || _starpu_lsame_( equed, "N"))) { *info = -9; } else { if (rcequ) { smin = bignum; smax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = smin, d__2 = s[j]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = smax, d__2 = s[j]; smax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { *info = -10; } else if (*n > 0) { scond = max(smin,smlnum) / min(smax,bignum); } else { scond = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -12; } else if (*ldx < max(1,*n)) { *info = -14; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOSVXX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dpoequb_(n, &a[a_offset], lda, &s[1], &scond, &amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqsy_(uplo, n, &a[a_offset], lda, &s[1], &scond, &amax, equed); rcequ = _starpu_lsame_(equed, "Y"); } } /* Scale the right-hand side. */ if (rcequ) { _starpu_dlascl2_(n, nrhs, &s[1], &b[b_offset], ldb); } if (nofact || equil) { /* Compute the LU factorization of A. */ _starpu_dlacpy_(uplo, n, n, &a[a_offset], lda, &af[af_offset], ldaf); _starpu_dpotrf_(uplo, n, &af[af_offset], ldaf, info); /* Return if INFO is non-zero. */ if (*info != 0) { /* Pivot in column INFO is exactly 0 */ /* Compute the reciprocal pivot growth factor of the */ /* leading rank-deficient INFO columns of A. */ *rpvgrw = _starpu_dla_porpvgrw__(uplo, info, &a[a_offset], lda, &af[ af_offset], ldaf, &work[1], (ftnlen)1); return 0; } } /* Compute the reciprocal growth factor RPVGRW. */ *rpvgrw = _starpu_dla_porpvgrw__(uplo, n, &a[a_offset], lda, &af[af_offset], ldaf, &work[1], (ftnlen)1); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dpotrs_(uplo, n, nrhs, &af[af_offset], ldaf, &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dporfsx_(uplo, equed, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, & s[1], &b[b_offset], ldb, &x[x_offset], ldx, rcond, &berr[1], n_err_bnds__, &err_bnds_norm__[err_bnds_norm_offset], & err_bnds_comp__[err_bnds_comp_offset], nparams, ¶ms[1], &work[ 1], &iwork[1], info); /* Scale solutions. */ if (rcequ) { _starpu_dlascl2_(n, nrhs, &s[1], &x[x_offset], ldx); } return 0; /* End of DPOSVXX */ } /* _starpu_dposvxx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpotf2.c000066400000000000000000000142641413463044200205530ustar00rootroot00000000000000/* dpotf2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b10 = -1.; static doublereal c_b12 = 1.; /* Subroutine */ int _starpu_dpotf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer j; doublereal ajj; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOTF2 computes the Cholesky factorization of a real symmetric */ /* positive definite matrix A. */ /* The factorization has the form */ /* A = U' * U , if UPLO = 'U', or */ /* A = L * L', if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* This is the unblocked version of the algorithm, calling Level 2 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n by n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n by n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization A = U'*U or A = L*L'. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* > 0: if INFO = k, the leading minor of order k is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOTF2", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute U(J,J) and test for non-positive-definiteness. */ i__2 = j - 1; ajj = a[j + j * a_dim1] - _starpu_ddot_(&i__2, &a[j * a_dim1 + 1], &c__1, &a[j * a_dim1 + 1], &c__1); if (ajj <= 0. || _starpu_disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L30; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of row J. */ if (j < *n) { i__2 = j - 1; i__3 = *n - j; _starpu_dgemv_("Transpose", &i__2, &i__3, &c_b10, &a[(j + 1) * a_dim1 + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b12, &a[j + ( j + 1) * a_dim1], lda); i__2 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__2, &d__1, &a[j + (j + 1) * a_dim1], lda); } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute L(J,J) and test for non-positive-definiteness. */ i__2 = j - 1; ajj = a[j + j * a_dim1] - _starpu_ddot_(&i__2, &a[j + a_dim1], lda, &a[j + a_dim1], lda); if (ajj <= 0. || _starpu_disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L30; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of column J. */ if (j < *n) { i__2 = *n - j; i__3 = j - 1; _starpu_dgemv_("No transpose", &i__2, &i__3, &c_b10, &a[j + 1 + a_dim1], lda, &a[j + a_dim1], lda, &c_b12, &a[j + 1 + j * a_dim1], &c__1); i__2 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); } /* L20: */ } } goto L40; L30: *info = j; L40: return 0; /* End of DPOTF2 */ } /* _starpu_dpotf2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpotrf.c000066400000000000000000000163151413463044200206520ustar00rootroot00000000000000/* dpotrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b13 = -1.; static doublereal c_b14 = 1.; /* Subroutine */ int _starpu_dpotrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer j, jb, nb; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dpotf2_(char *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOTRF computes the Cholesky factorization of a real symmetric */ /* positive definite matrix A. */ /* The factorization has the form */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* This is the block version of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code. */ _starpu_dpotf2_(uplo, n, &a[a_offset], lda, info); } else { /* Use blocked code. */ if (upper) { /* Compute the Cholesky factorization A = U'*U. */ i__1 = *n; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ /* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); i__3 = j - 1; _starpu_dsyrk_("Upper", "Transpose", &jb, &i__3, &c_b13, &a[j * a_dim1 + 1], lda, &c_b14, &a[j + j * a_dim1], lda); _starpu_dpotf2_("Upper", &jb, &a[j + j * a_dim1], lda, info); if (*info != 0) { goto L30; } if (j + jb <= *n) { /* Compute the current block row. */ i__3 = *n - j - jb + 1; i__4 = j - 1; _starpu_dgemm_("Transpose", "No transpose", &jb, &i__3, &i__4, & c_b13, &a[j * a_dim1 + 1], lda, &a[(j + jb) * a_dim1 + 1], lda, &c_b14, &a[j + (j + jb) * a_dim1], lda); i__3 = *n - j - jb + 1; _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", &jb, & i__3, &c_b14, &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda); } /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ i__2 = *n; i__1 = nb; for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ /* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; jb = min(i__3,i__4); i__3 = j - 1; _starpu_dsyrk_("Lower", "No transpose", &jb, &i__3, &c_b13, &a[j + a_dim1], lda, &c_b14, &a[j + j * a_dim1], lda); _starpu_dpotf2_("Lower", &jb, &a[j + j * a_dim1], lda, info); if (*info != 0) { goto L30; } if (j + jb <= *n) { /* Compute the current block column. */ i__3 = *n - j - jb + 1; i__4 = j - 1; _starpu_dgemm_("No transpose", "Transpose", &i__3, &jb, &i__4, & c_b13, &a[j + jb + a_dim1], lda, &a[j + a_dim1], lda, &c_b14, &a[j + jb + j * a_dim1], lda); i__3 = *n - j - jb + 1; _starpu_dtrsm_("Right", "Lower", "Transpose", "Non-unit", &i__3, & jb, &c_b14, &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda); } /* L20: */ } } } goto L40; L30: *info = *info + j - 1; L40: return 0; /* End of DPOTRF */ } /* _starpu_dpotrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpotri.c000066400000000000000000000067711413463044200206620ustar00rootroot00000000000000/* dpotri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dpotri_(char *uplo, integer *n, doublereal *a, integer * lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dlauum_( char *, integer *, doublereal *, integer *, integer *), _starpu_dtrtri_(char *, char *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOTRI computes the inverse of a real symmetric positive definite */ /* matrix A using the Cholesky factorization A = U**T*U or A = L*L**T */ /* computed by DPOTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T, as computed by */ /* DPOTRF. */ /* On exit, the upper or lower triangle of the (symmetric) */ /* inverse of A, overwriting the input factor U or L. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the (i,i) element of the factor U or L is */ /* zero, and the inverse could not be computed. */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Invert the triangular Cholesky factor U or L. */ _starpu_dtrtri_(uplo, "Non-unit", n, &a[a_offset], lda, info); if (*info > 0) { return 0; } /* Form inv(U)*inv(U)' or inv(L)'*inv(L). */ _starpu_dlauum_(uplo, n, &a[a_offset], lda, info); return 0; /* End of DPOTRI */ } /* _starpu_dpotri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpotrs.c000066400000000000000000000111051413463044200206570ustar00rootroot00000000000000/* dpotrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b9 = 1.; /* Subroutine */ int _starpu_dpotrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPOTRS solves a system of linear equations A*X = B with a symmetric */ /* positive definite matrix A using the Cholesky factorization */ /* A = U**T*U or A = L*L**T computed by DPOTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPOTRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPOTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (upper) { /* Solve A*X = B where A = U'*U. */ /* Solve U'*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b9, &a[ a_offset], lda, &b[b_offset], ldb); /* Solve U*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b9, & a[a_offset], lda, &b[b_offset], ldb); } else { /* Solve A*X = B where A = L*L'. */ /* Solve L*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Lower", "No transpose", "Non-unit", n, nrhs, &c_b9, & a[a_offset], lda, &b[b_offset], ldb); /* Solve L'*X = B, overwriting B with X. */ _starpu_dtrsm_("Left", "Lower", "Transpose", "Non-unit", n, nrhs, &c_b9, &a[ a_offset], lda, &b[b_offset], ldb); } return 0; /* End of DPOTRS */ } /* _starpu_dpotrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dppcon.c000066400000000000000000000141671413463044200206420ustar00rootroot00000000000000/* dppcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dppcon_(char *uplo, integer *n, doublereal *ap, doublereal *anorm, doublereal *rcond, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ integer ix, kase; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal scalel; extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal scaleu; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dlatps_( char *, char *, char *, char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); doublereal ainvnm; char normin[1]; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPCON estimates the reciprocal of the condition number (in the */ /* 1-norm) of a real symmetric positive definite packed matrix using */ /* the Cholesky factorization A = U**T*U or A = L*L**T computed by */ /* DPPTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, packed columnwise in a linear */ /* array. The j-th column of U or L is stored in the array AP */ /* as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = U(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = L(i,j) for j<=i<=n. */ /* ANORM (input) DOUBLE PRECISION */ /* The 1-norm (or infinity-norm) of the symmetric matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an */ /* estimate of the 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --iwork; --work; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*anorm < 0.) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } smlnum = _starpu_dlamch_("Safe minimum"); /* Estimate the 1-norm of the inverse. */ kase = 0; *(unsigned char *)normin = 'N'; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (upper) { /* Multiply by inv(U'). */ _starpu_dlatps_("Upper", "Transpose", "Non-unit", normin, n, &ap[1], & work[1], &scalel, &work[(*n << 1) + 1], info); *(unsigned char *)normin = 'Y'; /* Multiply by inv(U). */ _starpu_dlatps_("Upper", "No transpose", "Non-unit", normin, n, &ap[1], & work[1], &scaleu, &work[(*n << 1) + 1], info); } else { /* Multiply by inv(L). */ _starpu_dlatps_("Lower", "No transpose", "Non-unit", normin, n, &ap[1], & work[1], &scalel, &work[(*n << 1) + 1], info); *(unsigned char *)normin = 'Y'; /* Multiply by inv(L'). */ _starpu_dlatps_("Lower", "Transpose", "Non-unit", normin, n, &ap[1], & work[1], &scaleu, &work[(*n << 1) + 1], info); } /* Multiply by 1/SCALE if doing so will not cause overflow. */ scale = scalel * scaleu; if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } L20: return 0; /* End of DPPCON */ } /* _starpu_dppcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dppequ.c000066400000000000000000000127631413463044200206550ustar00rootroot00000000000000/* dppequ.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dppequ_(char *uplo, integer *n, doublereal *ap, doublereal *s, doublereal *scond, doublereal *amax, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, jj; doublereal smin; extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPEQU computes row and column scalings intended to equilibrate a */ /* symmetric positive definite matrix A in packed storage and reduce */ /* its condition number (with respect to the two-norm). S contains the */ /* scale factors, S(i)=1/sqrt(A(i,i)), chosen so that the scaled matrix */ /* B with elements B(i,j)=S(i)*A(i,j)*S(j) has ones on the diagonal. */ /* This choice of S puts the condition number of B within a factor N of */ /* the smallest possible condition number over all possible diagonal */ /* scalings. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangle of the symmetric matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* S (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, S contains the scale factors for A. */ /* SCOND (output) DOUBLE PRECISION */ /* If INFO = 0, S contains the ratio of the smallest S(i) to */ /* the largest S(i). If SCOND >= 0.1 and AMAX is neither too */ /* large nor too small, it is not worth scaling by S. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element is nonpositive. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --s; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPEQU", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *scond = 1.; *amax = 0.; return 0; } /* Initialize SMIN and AMAX. */ s[1] = ap[1]; smin = s[1]; *amax = s[1]; if (upper) { /* UPLO = 'U': Upper triangle of A is stored. */ /* Find the minimum and maximum diagonal elements. */ jj = 1; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { jj += i__; s[i__] = ap[jj]; /* Computing MIN */ d__1 = smin, d__2 = s[i__]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = *amax, d__2 = s[i__]; *amax = max(d__1,d__2); /* L10: */ } } else { /* UPLO = 'L': Lower triangle of A is stored. */ /* Find the minimum and maximum diagonal elements. */ jj = 1; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { jj = jj + *n - i__ + 2; s[i__] = ap[jj]; /* Computing MIN */ d__1 = smin, d__2 = s[i__]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = *amax, d__2 = s[i__]; *amax = max(d__1,d__2); /* L20: */ } } if (smin <= 0.) { /* Find the first non-positive diagonal element and return. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (s[i__] <= 0.) { *info = i__; return 0; } /* L30: */ } } else { /* Set the scale factors to the reciprocals */ /* of the diagonal elements. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { s[i__] = 1. / sqrt(s[i__]); /* L40: */ } /* Compute SCOND = min(S(I)) / max(S(I)) */ *scond = sqrt(smin) / sqrt(*amax); } return 0; /* End of DPPEQU */ } /* _starpu_dppequ_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpprfs.c000066400000000000000000000300241413463044200206430ustar00rootroot00000000000000/* dpprfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = -1.; static doublereal c_b14 = 1.; /* Subroutine */ int _starpu_dpprfs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *afp, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s; integer ik, kk; doublereal xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; extern /* Subroutine */ int _starpu_dspmv_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal lstres; extern /* Subroutine */ int _starpu_dpptrs_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric positive definite */ /* and packed, and provides error bounds and backward error estimates */ /* for the solution. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangle of the symmetric matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* AFP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, as computed by DPPTRF/ZPPTRF, */ /* packed columnwise in a linear array in the same format as A */ /* (see AP). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DPPTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --afp; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldx < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - A * X */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dspmv_(uplo, n, &c_b12, &ap[1], &x[j * x_dim1 + 1], &c__1, &c_b14, & work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(A)*abs(X) + abs(B). */ kk = 1; if (upper) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); ik = kk; i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[ik], abs(d__1)) * xk; s += (d__1 = ap[ik], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); ++ik; /* L40: */ } work[k] = work[k] + (d__1 = ap[kk + k - 1], abs(d__1)) * xk + s; kk += k; /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); work[k] += (d__1 = ap[kk], abs(d__1)) * xk; ik = kk + 1; i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[ik], abs(d__1)) * xk; s += (d__1 = ap[ik], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); ++ik; /* L60: */ } work[k] += s; kk += *n - k + 1; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dpptrs_(uplo, n, &c__1, &afp[1], &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b14, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(A))* */ /* ( abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(A) is the inverse of A */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(A)*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(A)*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(A) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(A'). */ _starpu_dpptrs_(uplo, n, &c__1, &afp[1], &work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L110: */ } } else if (kase == 2) { /* Multiply by inv(A)*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L120: */ } _starpu_dpptrs_(uplo, n, &c__1, &afp[1], &work[*n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DPPRFS */ } /* _starpu_dpprfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dppsv.c000066400000000000000000000121041413463044200205000ustar00rootroot00000000000000/* dppsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dppsv_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpptrf_( char *, integer *, doublereal *, integer *), _starpu_dpptrs_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPSV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite matrix stored in */ /* packed format and X and B are N-by-NRHS matrices. */ /* The Cholesky decomposition is used to factor A as */ /* A = U**T* U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is a lower triangular */ /* matrix. The factored form of A is then used to solve the system of */ /* equations A * X = B. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* See below for further details. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T, in the same storage */ /* format as A. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i of A is not */ /* positive definite, so the factorization could not be */ /* completed, and the solution has not been computed. */ /* Further Details */ /* =============== */ /* The packed storage scheme is illustrated by the following example */ /* when N = 4, UPLO = 'U': */ /* Two-dimensional storage of the symmetric matrix A: */ /* a11 a12 a13 a14 */ /* a22 a23 a24 */ /* a33 a34 (aij = conjg(aji)) */ /* a44 */ /* Packed storage of the upper triangle of A: */ /* AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPSV ", &i__1); return 0; } /* Compute the Cholesky factorization A = U'*U or A = L*L'. */ _starpu_dpptrf_(uplo, n, &ap[1], info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dpptrs_(uplo, n, nrhs, &ap[1], &b[b_offset], ldb, info); } return 0; /* End of DPPSV */ } /* _starpu_dppsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dppsvx.c000066400000000000000000000400151413463044200206720ustar00rootroot00000000000000/* dppsvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dppsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *ap, doublereal *afp, char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ integer i__, j; doublereal amax, smin, smax; extern logical _starpu_lsame_(char *, char *); doublereal scond, anorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical equil, rcequ; extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlansp_(char *, char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dppcon_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dlaqsp_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, char *); integer infequ; extern /* Subroutine */ int _starpu_dppequ_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dpprfs_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dpptrf_(char *, integer *, doublereal *, integer *); doublereal smlnum; extern /* Subroutine */ int _starpu_dpptrs_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPSVX uses the Cholesky factorization A = U**T*U or A = L*L**T to */ /* compute the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite matrix stored in */ /* packed format and X and B are N-by-NRHS matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', real scaling factors are computed to equilibrate */ /* the system: */ /* diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(S)*A*diag(S) and B by diag(S)*B. */ /* 2. If FACT = 'N' or 'E', the Cholesky decomposition is used to */ /* factor the matrix A (after equilibration if FACT = 'E') as */ /* A = U**T* U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is a lower triangular */ /* matrix. */ /* 3. If the leading i-by-i principal minor is not positive definite, */ /* then the routine returns with INFO = i. Otherwise, the factored */ /* form of A is used to estimate the condition number of the matrix */ /* A. If the reciprocal of the condition number is less than machine */ /* precision, INFO = N+1 is returned as a warning, but the routine */ /* still goes on to solve for X and compute error bounds as */ /* described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(S) so that it solves the original system before */ /* equilibration. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AFP contains the factored form of A. */ /* If EQUED = 'Y', the matrix A has been equilibrated */ /* with scaling factors given by S. AP and AFP will not */ /* be modified. */ /* = 'N': The matrix A will be copied to AFP and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AFP and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array, except if FACT = 'F' */ /* and EQUED = 'Y', then A must contain the equilibrated matrix */ /* diag(S)*A*diag(S). The j-th column of A is stored in the */ /* array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* See below for further details. A is not modified if */ /* FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit. */ /* On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by */ /* diag(S)*A*diag(S). */ /* AFP (input or output) DOUBLE PRECISION array, dimension */ /* (N*(N+1)/2) */ /* If FACT = 'F', then AFP is an input argument and on entry */ /* contains the triangular factor U or L from the Cholesky */ /* factorization A = U'*U or A = L*L', in the same storage */ /* format as A. If EQUED .ne. 'N', then AFP is the factored */ /* form of the equilibrated matrix A. */ /* If FACT = 'N', then AFP is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U'*U or A = L*L' of the original matrix A. */ /* If FACT = 'E', then AFP is an output argument and on exit */ /* returns the triangular factor U or L from the Cholesky */ /* factorization A = U'*U or A = L*L' of the equilibrated */ /* matrix A (see the description of AP for the form of the */ /* equilibrated matrix). */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'Y': Equilibration was done, i.e., A has been replaced by */ /* diag(S) * A * diag(S). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A; not accessed if EQUED = 'N'. S is */ /* an input argument if FACT = 'F'; otherwise, S is an output */ /* argument. If FACT = 'F' and EQUED = 'Y', each element of S */ /* must be positive. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', */ /* B is overwritten by diag(S) * B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to */ /* the original system of equations. Note that if EQUED = 'Y', */ /* A and B are modified on exit, and the solution to the */ /* equilibrated system is inv(diag(S))*X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A after equilibration (if done). If RCOND is less than the */ /* machine precision (in particular, if RCOND = 0), the matrix */ /* is singular to working precision. This condition is */ /* indicated by a return code of INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: the leading minor of order i of A is */ /* not positive definite, so the factorization */ /* could not be completed, and the solution has not */ /* been computed. RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* Further Details */ /* =============== */ /* The packed storage scheme is illustrated by the following example */ /* when N = 4, UPLO = 'U': */ /* Two-dimensional storage of the symmetric matrix A: */ /* a11 a12 a13 a14 */ /* a22 a23 a24 */ /* a33 a34 (aij = conjg(aji)) */ /* a44 */ /* Packed storage of the upper triangle of A: */ /* AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --ap; --afp; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); if (nofact || equil) { *(unsigned char *)equed = 'N'; rcequ = FALSE_; } else { rcequ = _starpu_lsame_(equed, "Y"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; } /* Test the input parameters. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (_starpu_lsame_(fact, "F") && ! (rcequ || _starpu_lsame_( equed, "N"))) { *info = -7; } else { if (rcequ) { smin = bignum; smax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = smin, d__2 = s[j]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = smax, d__2 = s[j]; smax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { *info = -8; } else if (*n > 0) { scond = max(smin,smlnum) / min(smax,bignum); } else { scond = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -10; } else if (*ldx < max(1,*n)) { *info = -12; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPSVX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dppequ_(uplo, n, &ap[1], &s[1], &scond, &amax, &infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqsp_(uplo, n, &ap[1], &s[1], &scond, &amax, equed); rcequ = _starpu_lsame_(equed, "Y"); } } /* Scale the right-hand side. */ if (rcequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = s[i__] * b[i__ + j * b_dim1]; /* L20: */ } /* L30: */ } } if (nofact || equil) { /* Compute the Cholesky factorization A = U'*U or A = L*L'. */ i__1 = *n * (*n + 1) / 2; _starpu_dcopy_(&i__1, &ap[1], &c__1, &afp[1], &c__1); _starpu_dpptrf_(uplo, n, &afp[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ anorm = _starpu_dlansp_("I", uplo, n, &ap[1], &work[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dppcon_(uplo, n, &afp[1], &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dpptrs_(uplo, n, nrhs, &afp[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dpprfs_(uplo, n, nrhs, &ap[1], &afp[1], &b[b_offset], ldb, &x[x_offset], ldx, &ferr[1], &berr[1], &work[1], &iwork[1], info); /* Transform the solution matrix X to a solution of the original */ /* system. */ if (rcequ) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { x[i__ + j * x_dim1] = s[i__] * x[i__ + j * x_dim1]; /* L40: */ } /* L50: */ } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] /= scond; /* L60: */ } } /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DPPSVX */ } /* _starpu_dppsvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpptrf.c000066400000000000000000000134031413463044200206460ustar00rootroot00000000000000/* dpptrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b16 = -1.; /* Subroutine */ int _starpu_dpptrf_(char *uplo, integer *n, doublereal *ap, integer * info) { /* System generated locals */ integer i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer j, jc, jj; doublereal ajj; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dspr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPTRF computes the Cholesky factorization of a real symmetric */ /* positive definite matrix A stored in packed format. */ /* The factorization has the form */ /* A = U**T * U, if UPLO = 'U', or */ /* A = L * L**T, if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* See below for further details. */ /* On exit, if INFO = 0, the triangular factor U or L from the */ /* Cholesky factorization A = U**T*U or A = L*L**T, in the same */ /* storage format as A. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the factorization could not be */ /* completed. */ /* Further Details */ /* ======= ======= */ /* The packed storage scheme is illustrated by the following example */ /* when N = 4, UPLO = 'U': */ /* Two-dimensional storage of the symmetric matrix A: */ /* a11 a12 a13 a14 */ /* a22 a23 a24 */ /* a33 a34 (aij = aji) */ /* a44 */ /* Packed storage of the upper triangle of A: */ /* AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (upper) { /* Compute the Cholesky factorization A = U'*U. */ jj = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { jc = jj + 1; jj += j; /* Compute elements 1:J-1 of column J. */ if (j > 1) { i__2 = j - 1; _starpu_dtpsv_("Upper", "Transpose", "Non-unit", &i__2, &ap[1], &ap[ jc], &c__1); } /* Compute U(J,J) and test for non-positive-definiteness. */ i__2 = j - 1; ajj = ap[jj] - _starpu_ddot_(&i__2, &ap[jc], &c__1, &ap[jc], &c__1); if (ajj <= 0.) { ap[jj] = ajj; goto L30; } ap[jj] = sqrt(ajj); /* L10: */ } } else { /* Compute the Cholesky factorization A = L*L'. */ jj = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Compute L(J,J) and test for non-positive-definiteness. */ ajj = ap[jj]; if (ajj <= 0.) { ap[jj] = ajj; goto L30; } ajj = sqrt(ajj); ap[jj] = ajj; /* Compute elements J+1:N of column J and update the trailing */ /* submatrix. */ if (j < *n) { i__2 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__2, &d__1, &ap[jj + 1], &c__1); i__2 = *n - j; _starpu_dspr_("Lower", &i__2, &c_b16, &ap[jj + 1], &c__1, &ap[jj + *n - j + 1]); jj = jj + *n - j + 1; } /* L20: */ } } goto L40; L30: *info = j; L40: return 0; /* End of DPPTRF */ } /* _starpu_dpptrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpptri.c000066400000000000000000000112741413463044200206550ustar00rootroot00000000000000/* dpptri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b8 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dpptri_(char *uplo, integer *n, doublereal *ap, integer * info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer j, jc, jj; doublereal ajj; integer jjn; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dspr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dtptri_( char *, char *, integer *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPTRI computes the inverse of a real symmetric positive definite */ /* matrix A using the Cholesky factorization A = U**T*U or A = L*L**T */ /* computed by DPPTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangular factor is stored in AP; */ /* = 'L': Lower triangular factor is stored in AP. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the triangular factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T, packed columnwise as */ /* a linear array. The j-th column of U or L is stored in the */ /* array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = U(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = L(i,j) for j<=i<=n. */ /* On exit, the upper or lower triangle of the (symmetric) */ /* inverse of A, overwriting the input factor U or L. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the (i,i) element of the factor U or L is */ /* zero, and the inverse could not be computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Invert the triangular Cholesky factor U or L. */ _starpu_dtptri_(uplo, "Non-unit", n, &ap[1], info); if (*info > 0) { return 0; } if (upper) { /* Compute the product inv(U) * inv(U)'. */ jj = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { jc = jj + 1; jj += j; if (j > 1) { i__2 = j - 1; _starpu_dspr_("Upper", &i__2, &c_b8, &ap[jc], &c__1, &ap[1]); } ajj = ap[jj]; _starpu_dscal_(&j, &ajj, &ap[jc], &c__1); /* L10: */ } } else { /* Compute the product inv(L)' * inv(L). */ jj = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { jjn = jj + *n - j + 1; i__2 = *n - j + 1; ap[jj] = _starpu_ddot_(&i__2, &ap[jj], &c__1, &ap[jj], &c__1); if (j < *n) { i__2 = *n - j; _starpu_dtpmv_("Lower", "Transpose", "Non-unit", &i__2, &ap[jjn], &ap[ jj + 1], &c__1); } jj = jjn; /* L20: */ } } return 0; /* End of DPPTRI */ } /* _starpu_dpptri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpptrs.c000066400000000000000000000111351413463044200206630ustar00rootroot00000000000000/* dpptrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dpptrs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1; /* Local variables */ integer i__; extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPPTRS solves a system of linear equations A*X = B with a symmetric */ /* positive definite matrix A in packed storage using the Cholesky */ /* factorization A = U**T*U or A = L*L**T computed by DPPTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The triangular factor U or L from the Cholesky factorization */ /* A = U**T*U or A = L*L**T, packed columnwise in a linear */ /* array. The j-th column of U or L is stored in the array AP */ /* as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = U(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = L(i,j) for j<=i<=n. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPPTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (upper) { /* Solve A*X = B where A = U'*U. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { /* Solve U'*X = B, overwriting B with X. */ _starpu_dtpsv_("Upper", "Transpose", "Non-unit", n, &ap[1], &b[i__ * b_dim1 + 1], &c__1); /* Solve U*X = B, overwriting B with X. */ _starpu_dtpsv_("Upper", "No transpose", "Non-unit", n, &ap[1], &b[i__ * b_dim1 + 1], &c__1); /* L10: */ } } else { /* Solve A*X = B where A = L*L'. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { /* Solve L*Y = B, overwriting B with X. */ _starpu_dtpsv_("Lower", "No transpose", "Non-unit", n, &ap[1], &b[i__ * b_dim1 + 1], &c__1); /* Solve L'*X = Y, overwriting B with X. */ _starpu_dtpsv_("Lower", "Transpose", "Non-unit", n, &ap[1], &b[i__ * b_dim1 + 1], &c__1); /* L20: */ } } return 0; /* End of DPPTRS */ } /* _starpu_dpptrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpstf2.c000066400000000000000000000244441413463044200205600ustar00rootroot00000000000000/* dpstf2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b16 = -1.; static doublereal c_b18 = 1.; /* Subroutine */ int _starpu_dpstf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, maxlocval; doublereal ajj; integer pvt; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal dtemp; integer itemp; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal dstop; logical upper; extern doublereal _starpu_dlamch_(char *); extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_dmaxloc_(doublereal *, integer *); /* -- LAPACK PROTOTYPE routine (version 3.2) -- */ /* Craig Lucas, University of Manchester / NAG Ltd. */ /* October, 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPSTF2 computes the Cholesky factorization with complete */ /* pivoting of a real symmetric positive semidefinite matrix A. */ /* The factorization has the form */ /* P' * A * P = U' * U , if UPLO = 'U', */ /* P' * A * P = L * L', if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular, and */ /* P is stored as vector PIV. */ /* This algorithm does not attempt to check that A is positive */ /* semidefinite. This version of the algorithm calls level 2 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n by n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n by n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization as above. */ /* PIV (output) INTEGER array, dimension (N) */ /* PIV is such that the nonzero entries are P( PIV(K), K ) = 1. */ /* RANK (output) INTEGER */ /* The rank of A given by the number of steps the algorithm */ /* completed. */ /* TOL (input) DOUBLE PRECISION */ /* User defined tolerance. If TOL < 0, then N*U*MAX( A( K,K ) ) */ /* will be used. The algorithm terminates at the (K-1)st step */ /* if the pivot <= TOL. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* WORK DOUBLE PRECISION array, dimension (2*N) */ /* Work space. */ /* INFO (output) INTEGER */ /* < 0: If INFO = -K, the K-th argument had an illegal value, */ /* = 0: algorithm completed successfully, and */ /* > 0: the matrix A is either rank deficient with computed rank */ /* as returned in RANK, or is indefinite. See Section 7 of */ /* LAPACK Working Note #161 for further information. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ --work; --piv; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPSTF2", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Initialize PIV */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { piv[i__] = i__; /* L100: */ } /* Compute stopping value */ pvt = 1; ajj = a[pvt + pvt * a_dim1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (a[i__ + i__ * a_dim1] > ajj) { pvt = i__; ajj = a[pvt + pvt * a_dim1]; } } if (ajj == 0. || _starpu_disnan_(&ajj)) { *rank = 0; *info = 1; goto L170; } /* Compute stopping value if not supplied */ if (*tol < 0.) { dstop = *n * _starpu_dlamch_("Epsilon") * ajj; } else { dstop = *tol; } /* Set first half of WORK to zero, holds dot products */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L110: */ } if (upper) { /* Compute the Cholesky factorization P' * A * P = U' * U */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Find pivot, test for exit, else swap rows and columns */ /* Update dot products, compute possible pivots which are */ /* stored in the second half of WORK */ i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { if (j > 1) { /* Computing 2nd power */ d__1 = a[j - 1 + i__ * a_dim1]; work[i__] += d__1 * d__1; } work[*n + i__] = a[i__ + i__ * a_dim1] - work[i__]; /* L120: */ } if (j > 1) { maxlocval = (*n << 1) - (*n + j) + 1; itemp = _starpu_dmaxloc_(&work[*n + j], &maxlocval); pvt = itemp + j - 1; ajj = work[*n + pvt]; if (ajj <= dstop || _starpu_disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L160; } } if (j != pvt) { /* Pivot OK, so can now swap pivot rows and columns */ a[pvt + pvt * a_dim1] = a[j + j * a_dim1]; i__2 = j - 1; _starpu_dswap_(&i__2, &a[j * a_dim1 + 1], &c__1, &a[pvt * a_dim1 + 1], &c__1); if (pvt < *n) { i__2 = *n - pvt; _starpu_dswap_(&i__2, &a[j + (pvt + 1) * a_dim1], lda, &a[pvt + ( pvt + 1) * a_dim1], lda); } i__2 = pvt - j - 1; _starpu_dswap_(&i__2, &a[j + (j + 1) * a_dim1], lda, &a[j + 1 + pvt * a_dim1], &c__1); /* Swap dot products and PIV */ dtemp = work[j]; work[j] = work[pvt]; work[pvt] = dtemp; itemp = piv[pvt]; piv[pvt] = piv[j]; piv[j] = itemp; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of row J */ if (j < *n) { i__2 = j - 1; i__3 = *n - j; _starpu_dgemv_("Trans", &i__2, &i__3, &c_b16, &a[(j + 1) * a_dim1 + 1] , lda, &a[j * a_dim1 + 1], &c__1, &c_b18, &a[j + (j + 1) * a_dim1], lda); i__2 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__2, &d__1, &a[j + (j + 1) * a_dim1], lda); } /* L130: */ } } else { /* Compute the Cholesky factorization P' * A * P = L * L' */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Find pivot, test for exit, else swap rows and columns */ /* Update dot products, compute possible pivots which are */ /* stored in the second half of WORK */ i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { if (j > 1) { /* Computing 2nd power */ d__1 = a[i__ + (j - 1) * a_dim1]; work[i__] += d__1 * d__1; } work[*n + i__] = a[i__ + i__ * a_dim1] - work[i__]; /* L140: */ } if (j > 1) { maxlocval = (*n << 1) - (*n + j) + 1; itemp = _starpu_dmaxloc_(&work[*n + j], &maxlocval); pvt = itemp + j - 1; ajj = work[*n + pvt]; if (ajj <= dstop || _starpu_disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L160; } } if (j != pvt) { /* Pivot OK, so can now swap pivot rows and columns */ a[pvt + pvt * a_dim1] = a[j + j * a_dim1]; i__2 = j - 1; _starpu_dswap_(&i__2, &a[j + a_dim1], lda, &a[pvt + a_dim1], lda); if (pvt < *n) { i__2 = *n - pvt; _starpu_dswap_(&i__2, &a[pvt + 1 + j * a_dim1], &c__1, &a[pvt + 1 + pvt * a_dim1], &c__1); } i__2 = pvt - j - 1; _starpu_dswap_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &a[pvt + (j + 1) * a_dim1], lda); /* Swap dot products and PIV */ dtemp = work[j]; work[j] = work[pvt]; work[pvt] = dtemp; itemp = piv[pvt]; piv[pvt] = piv[j]; piv[j] = itemp; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of column J */ if (j < *n) { i__2 = *n - j; i__3 = j - 1; _starpu_dgemv_("No Trans", &i__2, &i__3, &c_b16, &a[j + 1 + a_dim1], lda, &a[j + a_dim1], lda, &c_b18, &a[j + 1 + j * a_dim1], &c__1); i__2 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); } /* L150: */ } } /* Ran to completion, A has full rank */ *rank = *n; goto L170; L160: /* Rank is number of steps completed. Set INFO = 1 to signal */ /* that the factorization cannot be used to solve a system. */ *rank = j - 1; *info = 1; L170: return 0; /* End of DPSTF2 */ } /* _starpu_dpstf2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpstrf.c000066400000000000000000000306521413463044200206560ustar00rootroot00000000000000/* dpstrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b22 = -1.; static doublereal c_b24 = 1.; /* Subroutine */ int _starpu_dpstrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *piv, integer *rank, doublereal *tol, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k, maxlocvar, jb, nb; doublereal ajj; integer pvt; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal dtemp; integer itemp; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal dstop; logical upper; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dpstf2_(char *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern integer _starpu_dmaxloc_(doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Craig Lucas, University of Manchester / NAG Ltd. */ /* October, 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPSTRF computes the Cholesky factorization with complete */ /* pivoting of a real symmetric positive semidefinite matrix A. */ /* The factorization has the form */ /* P' * A * P = U' * U , if UPLO = 'U', */ /* P' * A * P = L * L', if UPLO = 'L', */ /* where U is an upper triangular matrix and L is lower triangular, and */ /* P is stored as vector PIV. */ /* This algorithm does not attempt to check that A is positive */ /* semidefinite. This version of the algorithm calls level 3 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n by n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n by n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the factor U or L from the Cholesky */ /* factorization as above. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* PIV (output) INTEGER array, dimension (N) */ /* PIV is such that the nonzero entries are P( PIV(K), K ) = 1. */ /* RANK (output) INTEGER */ /* The rank of A given by the number of steps the algorithm */ /* completed. */ /* TOL (input) DOUBLE PRECISION */ /* User defined tolerance. If TOL < 0, then N*U*MAX( A(K,K) ) */ /* will be used. The algorithm terminates at the (K-1)st step */ /* if the pivot <= TOL. */ /* WORK DOUBLE PRECISION array, dimension (2*N) */ /* Work space. */ /* INFO (output) INTEGER */ /* < 0: If INFO = -K, the K-th argument had an illegal value, */ /* = 0: algorithm completed successfully, and */ /* > 0: the matrix A is either rank deficient with computed rank */ /* as returned in RANK, or is indefinite. See Section 7 of */ /* LAPACK Working Note #161 for further information. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --work; --piv; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPSTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get block size */ nb = _starpu_ilaenv_(&c__1, "DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ _starpu_dpstf2_(uplo, n, &a[a_dim1 + 1], lda, &piv[1], rank, tol, &work[1], info); goto L200; } else { /* Initialize PIV */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { piv[i__] = i__; /* L100: */ } /* Compute stopping value */ pvt = 1; ajj = a[pvt + pvt * a_dim1]; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (a[i__ + i__ * a_dim1] > ajj) { pvt = i__; ajj = a[pvt + pvt * a_dim1]; } } if (ajj == 0. || _starpu_disnan_(&ajj)) { *rank = 0; *info = 1; goto L200; } /* Compute stopping value if not supplied */ if (*tol < 0.) { dstop = *n * _starpu_dlamch_("Epsilon") * ajj; } else { dstop = *tol; } if (upper) { /* Compute the Cholesky factorization P' * A * P = U' * U */ i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Account for last block not being NB wide */ /* Computing MIN */ i__3 = nb, i__4 = *n - k + 1; jb = min(i__3,i__4); /* Set relevant part of first half of WORK to zero, */ /* holds dot products */ i__3 = *n; for (i__ = k; i__ <= i__3; ++i__) { work[i__] = 0.; /* L110: */ } i__3 = k + jb - 1; for (j = k; j <= i__3; ++j) { /* Find pivot, test for exit, else swap rows and columns */ /* Update dot products, compute possible pivots which are */ /* stored in the second half of WORK */ i__4 = *n; for (i__ = j; i__ <= i__4; ++i__) { if (j > k) { /* Computing 2nd power */ d__1 = a[j - 1 + i__ * a_dim1]; work[i__] += d__1 * d__1; } work[*n + i__] = a[i__ + i__ * a_dim1] - work[i__]; /* L120: */ } if (j > 1) { maxlocvar = (*n << 1) - (*n + j) + 1; itemp = _starpu_dmaxloc_(&work[*n + j], &maxlocvar); pvt = itemp + j - 1; ajj = work[*n + pvt]; if (ajj <= dstop || _starpu_disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L190; } } if (j != pvt) { /* Pivot OK, so can now swap pivot rows and columns */ a[pvt + pvt * a_dim1] = a[j + j * a_dim1]; i__4 = j - 1; _starpu_dswap_(&i__4, &a[j * a_dim1 + 1], &c__1, &a[pvt * a_dim1 + 1], &c__1); if (pvt < *n) { i__4 = *n - pvt; _starpu_dswap_(&i__4, &a[j + (pvt + 1) * a_dim1], lda, &a[ pvt + (pvt + 1) * a_dim1], lda); } i__4 = pvt - j - 1; _starpu_dswap_(&i__4, &a[j + (j + 1) * a_dim1], lda, &a[j + 1 + pvt * a_dim1], &c__1); /* Swap dot products and PIV */ dtemp = work[j]; work[j] = work[pvt]; work[pvt] = dtemp; itemp = piv[pvt]; piv[pvt] = piv[j]; piv[j] = itemp; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of row J. */ if (j < *n) { i__4 = j - k; i__5 = *n - j; _starpu_dgemv_("Trans", &i__4, &i__5, &c_b22, &a[k + (j + 1) * a_dim1], lda, &a[k + j * a_dim1], &c__1, & c_b24, &a[j + (j + 1) * a_dim1], lda); i__4 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__4, &d__1, &a[j + (j + 1) * a_dim1], lda); } /* L130: */ } /* Update trailing matrix, J already incremented */ if (k + jb <= *n) { i__3 = *n - j + 1; _starpu_dsyrk_("Upper", "Trans", &i__3, &jb, &c_b22, &a[k + j * a_dim1], lda, &c_b24, &a[j + j * a_dim1], lda); } /* L140: */ } } else { /* Compute the Cholesky factorization P' * A * P = L * L' */ i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Account for last block not being NB wide */ /* Computing MIN */ i__3 = nb, i__4 = *n - k + 1; jb = min(i__3,i__4); /* Set relevant part of first half of WORK to zero, */ /* holds dot products */ i__3 = *n; for (i__ = k; i__ <= i__3; ++i__) { work[i__] = 0.; /* L150: */ } i__3 = k + jb - 1; for (j = k; j <= i__3; ++j) { /* Find pivot, test for exit, else swap rows and columns */ /* Update dot products, compute possible pivots which are */ /* stored in the second half of WORK */ i__4 = *n; for (i__ = j; i__ <= i__4; ++i__) { if (j > k) { /* Computing 2nd power */ d__1 = a[i__ + (j - 1) * a_dim1]; work[i__] += d__1 * d__1; } work[*n + i__] = a[i__ + i__ * a_dim1] - work[i__]; /* L160: */ } if (j > 1) { maxlocvar = (*n << 1) - (*n + j) + 1; itemp = _starpu_dmaxloc_(&work[*n + j], &maxlocvar); pvt = itemp + j - 1; ajj = work[*n + pvt]; if (ajj <= dstop || _starpu_disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L190; } } if (j != pvt) { /* Pivot OK, so can now swap pivot rows and columns */ a[pvt + pvt * a_dim1] = a[j + j * a_dim1]; i__4 = j - 1; _starpu_dswap_(&i__4, &a[j + a_dim1], lda, &a[pvt + a_dim1], lda); if (pvt < *n) { i__4 = *n - pvt; _starpu_dswap_(&i__4, &a[pvt + 1 + j * a_dim1], &c__1, &a[ pvt + 1 + pvt * a_dim1], &c__1); } i__4 = pvt - j - 1; _starpu_dswap_(&i__4, &a[j + 1 + j * a_dim1], &c__1, &a[pvt + (j + 1) * a_dim1], lda); /* Swap dot products and PIV */ dtemp = work[j]; work[j] = work[pvt]; work[pvt] = dtemp; itemp = piv[pvt]; piv[pvt] = piv[j]; piv[j] = itemp; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of column J. */ if (j < *n) { i__4 = *n - j; i__5 = j - k; _starpu_dgemv_("No Trans", &i__4, &i__5, &c_b22, &a[j + 1 + k * a_dim1], lda, &a[j + k * a_dim1], lda, & c_b24, &a[j + 1 + j * a_dim1], &c__1); i__4 = *n - j; d__1 = 1. / ajj; _starpu_dscal_(&i__4, &d__1, &a[j + 1 + j * a_dim1], &c__1); } /* L170: */ } /* Update trailing matrix, J already incremented */ if (k + jb <= *n) { i__3 = *n - j + 1; _starpu_dsyrk_("Lower", "No Trans", &i__3, &jb, &c_b22, &a[j + k * a_dim1], lda, &c_b24, &a[j + j * a_dim1], lda); } /* L180: */ } } } /* Ran to completion, A has full rank */ *rank = *n; goto L200; L190: /* Rank is the number of steps completed. Set INFO = 1 to signal */ /* that the factorization cannot be used to solve a system. */ *rank = j - 1; *info = 1; L200: return 0; /* End of DPSTRF */ } /* _starpu_dpstrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dptcon.c000066400000000000000000000114431413463044200206400ustar00rootroot00000000000000/* dptcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dptcon_(integer *n, doublereal *d__, doublereal *e, doublereal *anorm, doublereal *rcond, doublereal *work, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ integer i__, ix; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal ainvnm; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTCON computes the reciprocal of the condition number (in the */ /* 1-norm) of a real symmetric positive definite tridiagonal matrix */ /* using the factorization A = L*D*L**T or A = U**T*D*U computed by */ /* DPTTRF. */ /* Norm(inv(A)) is computed by a direct method, and the reciprocal of */ /* the condition number is computed as */ /* RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the diagonal matrix D from the */ /* factorization of A, as computed by DPTTRF. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) off-diagonal elements of the unit bidiagonal factor */ /* U or L from the factorization of A, as computed by DPTTRF. */ /* ANORM (input) DOUBLE PRECISION */ /* The 1-norm of the original matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is the */ /* 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The method used is described in Nicholas J. Higham, "Efficient */ /* Algorithms for Computing the Condition Number of a Tridiagonal */ /* Matrix", SIAM J. Sci. Stat. Comput., Vol. 7, No. 1, January 1986. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* Parameter adjustments */ --work; --e; --d__; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*anorm < 0.) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPTCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm == 0.) { return 0; } /* Check that D(1:N) is positive. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] <= 0.) { return 0; } /* L10: */ } /* Solve M(A) * x = e, where M(A) = (m(i,j)) is given by */ /* m(i,j) = abs(A(i,j)), i = j, */ /* m(i,j) = -abs(A(i,j)), i .ne. j, */ /* and e = [ 1, 1, ..., 1 ]'. Note M(A) = M(L)*D*M(L)'. */ /* Solve M(L) * x = e. */ work[1] = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { work[i__] = work[i__ - 1] * (d__1 = e[i__ - 1], abs(d__1)) + 1.; /* L20: */ } /* Solve D * M(L)' * x = b. */ work[*n] /= d__[*n]; for (i__ = *n - 1; i__ >= 1; --i__) { work[i__] = work[i__] / d__[i__] + work[i__ + 1] * (d__1 = e[i__], abs(d__1)); /* L30: */ } /* Compute AINVNM = max(x(i)), 1<=i<=n. */ ix = _starpu_idamax_(n, &work[1], &c__1); ainvnm = (d__1 = work[ix], abs(d__1)); /* Compute the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } return 0; /* End of DPTCON */ } /* _starpu_dptcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpteqr.c000066400000000000000000000166241413463044200206560ustar00rootroot00000000000000/* dpteqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = 0.; static doublereal c_b8 = 1.; static integer c__0 = 0; static integer c__1 = 1; /* Subroutine */ int _starpu_dpteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal c__[1] /* was [1][1] */; integer i__; doublereal vt[1] /* was [1][1] */; integer nru; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer icompz; extern /* Subroutine */ int _starpu_dpttrf_(integer *, doublereal *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTEQR computes all eigenvalues and, optionally, eigenvectors of a */ /* symmetric positive definite tridiagonal matrix by first factoring the */ /* matrix using DPTTRF, and then calling DBDSQR to compute the singular */ /* values of the bidiagonal factor. */ /* This routine computes the eigenvalues of the positive definite */ /* tridiagonal matrix to high relative accuracy. This means that if the */ /* eigenvalues range over many orders of magnitude in size, then the */ /* small eigenvalues and corresponding eigenvectors will be computed */ /* more accurately than, for example, with the standard QR method. */ /* The eigenvectors of a full or band symmetric positive definite matrix */ /* can also be found if DSYTRD, DSPTRD, or DSBTRD has been used to */ /* reduce this matrix to tridiagonal form. (The reduction to tridiagonal */ /* form, however, may preclude the possibility of obtaining high */ /* relative accuracy in the small eigenvalues of the original matrix, if */ /* these eigenvalues range over many orders of magnitude.) */ /* Arguments */ /* ========= */ /* COMPZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only. */ /* = 'V': Compute eigenvectors of original symmetric */ /* matrix also. Array Z contains the orthogonal */ /* matrix used to reduce the original matrix to */ /* tridiagonal form. */ /* = 'I': Compute eigenvectors of tridiagonal matrix also. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal */ /* matrix. */ /* On normal exit, D contains the eigenvalues, in descending */ /* order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix. */ /* On exit, E has been destroyed. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* On entry, if COMPZ = 'V', the orthogonal matrix used in the */ /* reduction to tridiagonal form. */ /* On exit, if COMPZ = 'V', the orthonormal eigenvectors of the */ /* original symmetric matrix; */ /* if COMPZ = 'I', the orthonormal eigenvectors of the */ /* tridiagonal matrix. */ /* If INFO > 0 on exit, Z contains the eigenvectors associated */ /* with only the stored eigenvalues. */ /* If COMPZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* COMPZ = 'V' or 'I', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, and i is: */ /* <= N the Cholesky factorization of the matrix could */ /* not be performed because the i-th principal minor */ /* was not positive definite. */ /* > N the SVD algorithm failed to converge; */ /* if INFO = N+i, i off-diagonal elements of the */ /* bidiagonal factor did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ *info = 0; if (_starpu_lsame_(compz, "N")) { icompz = 0; } else if (_starpu_lsame_(compz, "V")) { icompz = 1; } else if (_starpu_lsame_(compz, "I")) { icompz = 2; } else { icompz = -1; } if (icompz < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPTEQR", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (icompz > 0) { z__[z_dim1 + 1] = 1.; } return 0; } if (icompz == 2) { _starpu_dlaset_("Full", n, n, &c_b7, &c_b8, &z__[z_offset], ldz); } /* Call DPTTRF to factor the matrix. */ _starpu_dpttrf_(n, &d__[1], &e[1], info); if (*info != 0) { return 0; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = sqrt(d__[i__]); /* L10: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] *= d__[i__]; /* L20: */ } /* Call DBDSQR to compute the singular values/vectors of the */ /* bidiagonal factor. */ if (icompz > 0) { nru = *n; } else { nru = 0; } _starpu_dbdsqr_("Lower", n, &c__0, &nru, &c__0, &d__[1], &e[1], vt, &c__1, &z__[ z_offset], ldz, c__, &c__1, &work[1], info); /* Square the singular values. */ if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] *= d__[i__]; /* L30: */ } } else { *info = *n + *info; } return 0; /* End of DPTEQR */ } /* _starpu_dpteqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dptrfs.c000066400000000000000000000251541413463044200206570ustar00rootroot00000000000000/* dptrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dptrfs_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j; doublereal s, bi, cx, dx, ex; integer ix, nz; doublereal eps, safe1, safe2; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal lstres; extern /* Subroutine */ int _starpu_dpttrs_(integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric positive definite */ /* and tridiagonal, and provides error bounds and backward error */ /* estimates for the solution. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the tridiagonal matrix A. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the tridiagonal matrix A. */ /* DF (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the diagonal matrix D from the */ /* factorization computed by DPTTRF. */ /* EF (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the unit bidiagonal factor */ /* L from the factorization computed by DPTTRF. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DPTTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; --df; --ef; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; } else if (*ldb < max(1,*n)) { *info = -8; } else if (*ldx < max(1,*n)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPTRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = 4; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - A * X. Also compute */ /* abs(A)*abs(x) + abs(b) for use in the backward error bound. */ if (*n == 1) { bi = b[j * b_dim1 + 1]; dx = d__[1] * x[j * x_dim1 + 1]; work[*n + 1] = bi - dx; work[1] = abs(bi) + abs(dx); } else { bi = b[j * b_dim1 + 1]; dx = d__[1] * x[j * x_dim1 + 1]; ex = e[1] * x[j * x_dim1 + 2]; work[*n + 1] = bi - dx - ex; work[1] = abs(bi) + abs(dx) + abs(ex); i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { bi = b[i__ + j * b_dim1]; cx = e[i__ - 1] * x[i__ - 1 + j * x_dim1]; dx = d__[i__] * x[i__ + j * x_dim1]; ex = e[i__] * x[i__ + 1 + j * x_dim1]; work[*n + i__] = bi - cx - dx - ex; work[i__] = abs(bi) + abs(cx) + abs(dx) + abs(ex); /* L30: */ } bi = b[*n + j * b_dim1]; cx = e[*n - 1] * x[*n - 1 + j * x_dim1]; dx = d__[*n] * x[*n + j * x_dim1]; work[*n + *n] = bi - cx - dx; work[*n] = abs(bi) + abs(cx) + abs(dx); } /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L40: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dpttrs_(n, &c__1, &df[1], &ef[1], &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b11, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(A))* */ /* ( abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(A) is the inverse of A */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(A)*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(A)*abs(X) + abs(B) is less than SAFE2. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L50: */ } ix = _starpu_idamax_(n, &work[1], &c__1); ferr[j] = work[ix]; /* Estimate the norm of inv(A). */ /* Solve M(A) * x = e, where M(A) = (m(i,j)) is given by */ /* m(i,j) = abs(A(i,j)), i = j, */ /* m(i,j) = -abs(A(i,j)), i .ne. j, */ /* and e = [ 1, 1, ..., 1 ]'. Note M(A) = M(L)*D*M(L)'. */ /* Solve M(L) * x = e. */ work[1] = 1.; i__2 = *n; for (i__ = 2; i__ <= i__2; ++i__) { work[i__] = work[i__ - 1] * (d__1 = ef[i__ - 1], abs(d__1)) + 1.; /* L60: */ } /* Solve D * M(L)' * x = b. */ work[*n] /= df[*n]; for (i__ = *n - 1; i__ >= 1; --i__) { work[i__] = work[i__] / df[i__] + work[i__ + 1] * (d__1 = ef[i__], abs(d__1)); /* L70: */ } /* Compute norm(inv(A)) = max(x(i)), 1<=i<=n. */ ix = _starpu_idamax_(n, &work[1], &c__1); ferr[j] *= (d__1 = work[ix], abs(d__1)); /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L80: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L90: */ } return 0; /* End of DPTRFS */ } /* _starpu_dptrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dptsv.c000066400000000000000000000102131413463044200205030ustar00rootroot00000000000000/* dptsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dptsv_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1; /* Local variables */ extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpttrf_( integer *, doublereal *, doublereal *, integer *), _starpu_dpttrs_( integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTSV computes the solution to a real system of linear equations */ /* A*X = B, where A is an N-by-N symmetric positive definite tridiagonal */ /* matrix, and X and B are N-by-NRHS matrices. */ /* A is factored as A = L*D*L**T, and the factored form of A is then */ /* used to solve the system of equations. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix */ /* A. On exit, the n diagonal elements of the diagonal matrix */ /* D from the factorization A = L*D*L**T. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix A. On exit, the (n-1) subdiagonal elements of the */ /* unit bidiagonal factor L from the L*D*L**T factorization of */ /* A. (E can also be regarded as the superdiagonal of the unit */ /* bidiagonal factor U from the U**T*D*U factorization of A.) */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i is not */ /* positive definite, and the solution has not been */ /* computed. The factorization has not been completed */ /* unless i = N. */ /* ===================================================================== */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; } else if (*ldb < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPTSV ", &i__1); return 0; } /* Compute the L*D*L' (or U'*D*U) factorization of A. */ _starpu_dpttrf_(n, &d__[1], &e[1], info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dpttrs_(n, nrhs, &d__[1], &e[1], &b[b_offset], ldb, info); } return 0; /* End of DPTSV */ } /* _starpu_dptsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dptsvx.c000066400000000000000000000243761413463044200207120ustar00rootroot00000000000000/* dptsvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dptsvx_(char *fact, integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dptcon_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dptrfs_( integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dpttrf_( integer *, doublereal *, doublereal *, integer *), _starpu_dpttrs_( integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTSVX uses the factorization A = L*D*L**T to compute the solution */ /* to a real system of linear equations A*X = B, where A is an N-by-N */ /* symmetric positive definite tridiagonal matrix and X and B are */ /* N-by-NRHS matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'N', the matrix A is factored as A = L*D*L**T, where L */ /* is a unit lower bidiagonal matrix and D is diagonal. The */ /* factorization can also be regarded as having the form */ /* A = U**T*D*U. */ /* 2. If the leading i-by-i principal minor is not positive definite, */ /* then the routine returns with INFO = i. Otherwise, the factored */ /* form of A is used to estimate the condition number of the matrix */ /* A. If the reciprocal of the condition number is less than machine */ /* precision, INFO = N+1 is returned as a warning, but the routine */ /* still goes on to solve for X and compute error bounds as */ /* described below. */ /* 3. The system of equations is solved for X using the factored form */ /* of A. */ /* 4. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of A has been */ /* supplied on entry. */ /* = 'F': On entry, DF and EF contain the factored form of A. */ /* D, E, DF, and EF will not be modified. */ /* = 'N': The matrix A will be copied to DF and EF and */ /* factored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the tridiagonal matrix A. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the tridiagonal matrix A. */ /* DF (input or output) DOUBLE PRECISION array, dimension (N) */ /* If FACT = 'F', then DF is an input argument and on entry */ /* contains the n diagonal elements of the diagonal matrix D */ /* from the L*D*L**T factorization of A. */ /* If FACT = 'N', then DF is an output argument and on exit */ /* contains the n diagonal elements of the diagonal matrix D */ /* from the L*D*L**T factorization of A. */ /* EF (input or output) DOUBLE PRECISION array, dimension (N-1) */ /* If FACT = 'F', then EF is an input argument and on entry */ /* contains the (n-1) subdiagonal elements of the unit */ /* bidiagonal factor L from the L*D*L**T factorization of A. */ /* If FACT = 'N', then EF is an output argument and on exit */ /* contains the (n-1) subdiagonal elements of the unit */ /* bidiagonal factor L from the L*D*L**T factorization of A. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The N-by-NRHS right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 of INFO = N+1, the N-by-NRHS solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal condition number of the matrix A. If RCOND */ /* is less than the machine precision (in particular, if */ /* RCOND = 0), the matrix is singular to working precision. */ /* This condition is indicated by a return code of INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in any */ /* element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: the leading minor of order i of A is */ /* not positive definite, so the factorization */ /* could not be completed, and the solution has not */ /* been computed. RCOND = 0 is returned. */ /* = N+1: U is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; --df; --ef; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); if (! nofact && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldx < max(1,*n)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPTSVX", &i__1); return 0; } if (nofact) { /* Compute the L*D*L' (or U'*D*U) factorization of A. */ _starpu_dcopy_(n, &d__[1], &c__1, &df[1], &c__1); if (*n > 1) { i__1 = *n - 1; _starpu_dcopy_(&i__1, &e[1], &c__1, &ef[1], &c__1); } _starpu_dpttrf_(n, &df[1], &ef[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ anorm = _starpu_dlanst_("1", n, &d__[1], &e[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dptcon_(n, &df[1], &ef[1], &anorm, rcond, &work[1], info); /* Compute the solution vectors X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dpttrs_(n, nrhs, &df[1], &ef[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solutions and */ /* compute error bounds and backward error estimates for them. */ _starpu_dptrfs_(n, nrhs, &d__[1], &e[1], &df[1], &ef[1], &b[b_offset], ldb, &x[ x_offset], ldx, &ferr[1], &berr[1], &work[1], info); /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DPTSVX */ } /* _starpu_dptsvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpttrf.c000066400000000000000000000106011413463044200206470ustar00rootroot00000000000000/* dpttrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dpttrf_(integer *n, doublereal *d__, doublereal *e, integer *info) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, i4; doublereal ei; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTTRF computes the L*D*L' factorization of a real symmetric */ /* positive definite tridiagonal matrix A. The factorization may also */ /* be regarded as having the form A = U'*D*U. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix */ /* A. On exit, the n diagonal elements of the diagonal matrix */ /* D from the L*D*L' factorization of A. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix A. On exit, the (n-1) subdiagonal elements of the */ /* unit bidiagonal factor L from the L*D*L' factorization of A. */ /* E can also be regarded as the superdiagonal of the unit */ /* bidiagonal factor U from the U'*D*U factorization of A. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* > 0: if INFO = k, the leading minor of order k is not */ /* positive definite; if k < N, the factorization could not */ /* be completed, while if k = N, the factorization was */ /* completed, but D(N) <= 0. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --e; --d__; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; i__1 = -(*info); _starpu_xerbla_("DPTTRF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Compute the L*D*L' (or U'*D*U) factorization of A. */ i4 = (*n - 1) % 4; i__1 = i4; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] <= 0.) { *info = i__; goto L30; } ei = e[i__]; e[i__] = ei / d__[i__]; d__[i__ + 1] -= e[i__] * ei; /* L10: */ } i__1 = *n - 4; for (i__ = i4 + 1; i__ <= i__1; i__ += 4) { /* Drop out of the loop if d(i) <= 0: the matrix is not positive */ /* definite. */ if (d__[i__] <= 0.) { *info = i__; goto L30; } /* Solve for e(i) and d(i+1). */ ei = e[i__]; e[i__] = ei / d__[i__]; d__[i__ + 1] -= e[i__] * ei; if (d__[i__ + 1] <= 0.) { *info = i__ + 1; goto L30; } /* Solve for e(i+1) and d(i+2). */ ei = e[i__ + 1]; e[i__ + 1] = ei / d__[i__ + 1]; d__[i__ + 2] -= e[i__ + 1] * ei; if (d__[i__ + 2] <= 0.) { *info = i__ + 2; goto L30; } /* Solve for e(i+2) and d(i+3). */ ei = e[i__ + 2]; e[i__ + 2] = ei / d__[i__ + 2]; d__[i__ + 3] -= e[i__ + 2] * ei; if (d__[i__ + 3] <= 0.) { *info = i__ + 3; goto L30; } /* Solve for e(i+3) and d(i+4). */ ei = e[i__ + 3]; e[i__ + 3] = ei / d__[i__ + 3]; d__[i__ + 4] -= e[i__ + 3] * ei; /* L20: */ } /* Check d(n) for positive definiteness. */ if (d__[*n] <= 0.) { *info = *n; } L30: return 0; /* End of DPTTRF */ } /* _starpu_dpttrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dpttrs.c000066400000000000000000000105601413463044200206700ustar00rootroot00000000000000/* dpttrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dpttrs_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer j, jb, nb; extern /* Subroutine */ int _starpu_dptts2_(integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTTRS solves a tridiagonal system of the form */ /* A * X = B */ /* using the L*D*L' factorization of A computed by DPTTRF. D is a */ /* diagonal matrix specified in the vector D, L is a unit bidiagonal */ /* matrix whose subdiagonal is specified in the vector E, and X and B */ /* are N by NRHS matrices. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the tridiagonal matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the diagonal matrix D from the */ /* L*D*L' factorization of A. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the unit bidiagonal factor */ /* L from the L*D*L' factorization of A. E can also be regarded */ /* as the superdiagonal of the unit bidiagonal factor U from the */ /* factorization A = U'*D*U. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side vectors B for the system of */ /* linear equations. */ /* On exit, the solution vectors, X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments. */ /* Parameter adjustments */ --d__; --e; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; } else if (*ldb < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DPTTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } /* Determine the number of right-hand sides to solve at a time. */ if (*nrhs == 1) { nb = 1; } else { /* Computing MAX */ i__1 = 1, i__2 = _starpu_ilaenv_(&c__1, "DPTTRS", " ", n, nrhs, &c_n1, &c_n1); nb = max(i__1,i__2); } if (nb >= *nrhs) { _starpu_dptts2_(n, nrhs, &d__[1], &e[1], &b[b_offset], ldb); } else { i__1 = *nrhs; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ i__3 = *nrhs - j + 1; jb = min(i__3,nb); _starpu_dptts2_(n, &jb, &d__[1], &e[1], &b[j * b_dim1 + 1], ldb); /* L10: */ } } return 0; /* End of DPTTRS */ } /* _starpu_dpttrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dptts2.c000066400000000000000000000072761413463044200206020ustar00rootroot00000000000000/* dptts2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dptts2_(integer *n, integer *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, j; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DPTTS2 solves a tridiagonal system of the form */ /* A * X = B */ /* using the L*D*L' factorization of A computed by DPTTRF. D is a */ /* diagonal matrix specified in the vector D, L is a unit bidiagonal */ /* matrix whose subdiagonal is specified in the vector E, and X and B */ /* are N by NRHS matrices. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the tridiagonal matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the diagonal matrix D from the */ /* L*D*L' factorization of A. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the unit bidiagonal factor */ /* L from the L*D*L' factorization of A. E can also be regarded */ /* as the superdiagonal of the unit bidiagonal factor U from the */ /* factorization A = U'*D*U. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side vectors B for the system of */ /* linear equations. */ /* On exit, the solution vectors, X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --d__; --e; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ if (*n <= 1) { if (*n == 1) { d__1 = 1. / d__[1]; _starpu_dscal_(nrhs, &d__1, &b[b_offset], ldb); } return 0; } /* Solve A * X = B using the factorization A = L*D*L', */ /* overwriting each right hand side vector with its solution. */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Solve L * x = b. */ i__2 = *n; for (i__ = 2; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] -= b[i__ - 1 + j * b_dim1] * e[i__ - 1]; /* L10: */ } /* Solve D * L' * x = b. */ b[*n + j * b_dim1] /= d__[*n]; for (i__ = *n - 1; i__ >= 1; --i__) { b[i__ + j * b_dim1] = b[i__ + j * b_dim1] / d__[i__] - b[i__ + 1 + j * b_dim1] * e[i__]; /* L20: */ } /* L30: */ } return 0; /* End of DPTTS2 */ } /* _starpu_dptts2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/drscl.c000066400000000000000000000065351413463044200204660ustar00rootroot00000000000000/* drscl.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_drscl_(integer *n, doublereal *sa, doublereal *sx, integer *incx) { doublereal mul, cden; logical done; doublereal cnum, cden1, cnum1; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); doublereal bignum, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DRSCL multiplies an n-element real vector x by the real scalar 1/a. */ /* This is done without overflow or underflow as long as */ /* the final result x/a does not overflow or underflow. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of components of the vector x. */ /* SA (input) DOUBLE PRECISION */ /* The scalar a which is used to divide each component of x. */ /* SA must be >= 0, or the subroutine will divide by zero. */ /* SX (input/output) DOUBLE PRECISION array, dimension */ /* (1+(N-1)*abs(INCX)) */ /* The n-element vector x. */ /* INCX (input) INTEGER */ /* The increment between successive values of the vector SX. */ /* > 0: SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i), 1< i<= n */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Quick return if possible */ /* Parameter adjustments */ --sx; /* Function Body */ if (*n <= 0) { return 0; } /* Get machine parameters */ smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); /* Initialize the denominator to SA and the numerator to 1. */ cden = *sa; cnum = 1.; L10: cden1 = cden * smlnum; cnum1 = cnum / bignum; if (abs(cden1) > abs(cnum) && cnum != 0.) { /* Pre-multiply X by SMLNUM if CDEN is large compared to CNUM. */ mul = smlnum; done = FALSE_; cden = cden1; } else if (abs(cnum1) > abs(cden)) { /* Pre-multiply X by BIGNUM if CDEN is small compared to CNUM. */ mul = bignum; done = FALSE_; cnum = cnum1; } else { /* Multiply X by CNUM / CDEN and return. */ mul = cnum / cden; done = TRUE_; } /* Scale the vector X by MUL */ _starpu_dscal_(n, &mul, &sx[1], incx); if (! done) { goto L10; } return 0; /* End of DRSCL */ } /* _starpu_drscl_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbev.c000066400000000000000000000177531413463044200204660ustar00rootroot00000000000000/* dsbev.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b11 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dsbev_(char *jobz, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, z_dim1, z_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps; integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical lower, wantz; extern doublereal _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlansb_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dsbtrd_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsterf_( integer *, doublereal *, doublereal *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBEV computes all the eigenvalues and, optionally, eigenvectors of */ /* a real symmetric band matrix A. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, AB is overwritten by values generated during the */ /* reduction to tridiagonal form. If UPLO = 'U', the first */ /* superdiagonal and the diagonal of the tridiagonal matrix T */ /* are returned in rows KD and KD+1 of AB, and if UPLO = 'L', */ /* the diagonal and first subdiagonal of T are returned in the */ /* first two rows of AB. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD + 1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal */ /* eigenvectors of the matrix A, with the i-th column of Z */ /* holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (max(1,3*N-2)) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of an intermediate tridiagonal */ /* form did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); lower = _starpu_lsame_(uplo, "L"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kd < 0) { *info = -4; } else if (*ldab < *kd + 1) { *info = -6; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBEV ", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (lower) { w[1] = ab[ab_dim1 + 1]; } else { w[1] = ab[*kd + 1 + ab_dim1]; } if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = _starpu_dlansb_("M", uplo, n, kd, &ab[ab_offset], ldab, &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { if (lower) { _starpu_dlascl_("B", kd, kd, &c_b11, &sigma, n, n, &ab[ab_offset], ldab, info); } else { _starpu_dlascl_("Q", kd, kd, &c_b11, &sigma, n, n, &ab[ab_offset], ldab, info); } } /* Call DSBTRD to reduce symmetric band matrix to tridiagonal form. */ inde = 1; indwrk = inde + *n; _starpu_dsbtrd_(jobz, uplo, n, kd, &ab[ab_offset], ldab, &w[1], &work[inde], &z__[ z_offset], ldz, &work[indwrk], &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, call SSTEQR. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { _starpu_dsteqr_(jobz, n, &w[1], &work[inde], &z__[z_offset], ldz, &work[ indwrk], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { if (*info == 0) { imax = *n; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } return 0; /* End of DSBEV */ } /* _starpu_dsbev_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbevd.c000066400000000000000000000261021413463044200206160ustar00rootroot00000000000000/* dsbevd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b11 = 1.; static doublereal c_b18 = 0.; static integer c__1 = 1; /* Subroutine */ int _starpu_dsbevd_(char *jobz, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, z_dim1, z_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps; integer inde; doublereal anrm, rmin, rmax; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo, lwmin; logical lower, wantz; integer indwk2, llwrk2; extern doublereal _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlansb_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dsbtrd_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsterf_( integer *, doublereal *, doublereal *, integer *); integer indwrk, liwmin; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBEVD computes all the eigenvalues and, optionally, eigenvectors of */ /* a real symmetric band matrix A. If eigenvectors are desired, it uses */ /* a divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, AB is overwritten by values generated during the */ /* reduction to tridiagonal form. If UPLO = 'U', the first */ /* superdiagonal and the diagonal of the tridiagonal matrix T */ /* are returned in rows KD and KD+1 of AB, and if UPLO = 'L', */ /* the diagonal and first subdiagonal of T are returned in the */ /* first two rows of AB. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD + 1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal */ /* eigenvectors of the matrix A, with the i-th column of Z */ /* holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, */ /* dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* IF N <= 1, LWORK must be at least 1. */ /* If JOBZ = 'N' and N > 2, LWORK must be at least 2*N. */ /* If JOBZ = 'V' and N > 2, LWORK must be at least */ /* ( 1 + 5*N + 2*N**2 ). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array LIWORK. */ /* If JOBZ = 'N' or N <= 1, LIWORK must be at least 1. */ /* If JOBZ = 'V' and N > 2, LIWORK must be at least 3 + 5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of an intermediate tridiagonal */ /* form did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); lower = _starpu_lsame_(uplo, "L"); lquery = *lwork == -1 || *liwork == -1; *info = 0; if (*n <= 1) { liwmin = 1; lwmin = 1; } else { if (wantz) { liwmin = *n * 5 + 3; /* Computing 2nd power */ i__1 = *n; lwmin = *n * 5 + 1 + (i__1 * i__1 << 1); } else { liwmin = 1; lwmin = *n << 1; } } if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kd < 0) { *info = -4; } else if (*ldab < *kd + 1) { *info = -6; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -9; } if (*info == 0) { work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -11; } else if (*liwork < liwmin && ! lquery) { *info = -13; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBEVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { w[1] = ab[ab_dim1 + 1]; if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = _starpu_dlansb_("M", uplo, n, kd, &ab[ab_offset], ldab, &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { if (lower) { _starpu_dlascl_("B", kd, kd, &c_b11, &sigma, n, n, &ab[ab_offset], ldab, info); } else { _starpu_dlascl_("Q", kd, kd, &c_b11, &sigma, n, n, &ab[ab_offset], ldab, info); } } /* Call DSBTRD to reduce symmetric band matrix to tridiagonal form. */ inde = 1; indwrk = inde + *n; indwk2 = indwrk + *n * *n; llwrk2 = *lwork - indwk2 + 1; _starpu_dsbtrd_(jobz, uplo, n, kd, &ab[ab_offset], ldab, &w[1], &work[inde], &z__[ z_offset], ldz, &work[indwrk], &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, call SSTEDC. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { _starpu_dstedc_("I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & llwrk2, &iwork[1], liwork, info); _starpu_dgemm_("N", "N", n, n, n, &c_b11, &z__[z_offset], ldz, &work[indwrk], n, &c_b18, &work[indwk2], n); _starpu_dlacpy_("A", n, n, &work[indwk2], n, &z__[z_offset], ldz); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { d__1 = 1. / sigma; _starpu_dscal_(n, &d__1, &w[1], &c__1); } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSBEVD */ } /* _starpu_dsbevd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbevx.c000066400000000000000000000406661413463044200206550ustar00rootroot00000000000000/* dsbevx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b14 = 1.; static integer c__1 = 1; static doublereal c_b34 = 0.; /* Subroutine */ int _starpu_dsbevx_(char *jobz, char *range, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *q, integer * ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, q_dim1, q_offset, z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, jj; doublereal eps, vll, vuu, tmp1; integer indd, inde; doublereal anrm; integer imax; doublereal rmin, rmax; logical test; integer itmp1, indee; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iinfo; char order[1]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical lower, wantz; extern doublereal _starpu_dlamch_(char *); logical alleig, indeig; integer iscale, indibl; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlansb_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); logical valeig; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal abstll, bignum; extern /* Subroutine */ int _starpu_dsbtrd_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer indisp; extern /* Subroutine */ int _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indiwo; extern /* Subroutine */ int _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer nsplit; doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBEVX computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric band matrix A. Eigenvalues and eigenvectors can */ /* be selected by specifying either a range of values or a range of */ /* indices for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found; */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found; */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, AB is overwritten by values generated during the */ /* reduction to tridiagonal form. If UPLO = 'U', the first */ /* superdiagonal and the diagonal of the tridiagonal matrix T */ /* are returned in rows KD and KD+1 of AB, and if UPLO = 'L', */ /* the diagonal and first subdiagonal of T are returned in the */ /* first two rows of AB. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD + 1. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* If JOBZ = 'V', the N-by-N orthogonal matrix used in the */ /* reduction to tridiagonal form. */ /* If JOBZ = 'N', the array Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. If JOBZ = 'V', then */ /* LDQ >= max(1,N). */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing AB to tridiagonal form. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* See "Computing Small Singular Values of Bidiagonal Matrices */ /* with Guaranteed High Relative Accuracy," by Demmel and */ /* Kahan, LAPACK Working Note #3. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the selected eigenvalues in */ /* ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M)) */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If an eigenvector fails to converge, then that column of Z */ /* contains the latest approximation to the eigenvector, and the */ /* index of the eigenvector is returned in IFAIL. */ /* If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (7*N) */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (N) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvectors that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, then i eigenvectors failed to converge. */ /* Their indices are stored in array IFAIL. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); lower = _starpu_lsame_(uplo, "L"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*kd < 0) { *info = -5; } else if (*ldab < *kd + 1) { *info = -7; } else if (wantz && *ldq < max(1,*n)) { *info = -9; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -11; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -12; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -13; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -18; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBEVX", &i__1); return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } if (*n == 1) { *m = 1; if (lower) { tmp1 = ab[ab_dim1 + 1]; } else { tmp1 = ab[*kd + 1 + ab_dim1]; } if (valeig) { if (! (*vl < tmp1 && *vu >= tmp1)) { *m = 0; } } if (*m == 1) { w[1] = tmp1; if (wantz) { z__[z_dim1 + 1] = 1.; } } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); /* Scale matrix to allowable range, if necessary. */ iscale = 0; abstll = *abstol; if (valeig) { vll = *vl; vuu = *vu; } else { vll = 0.; vuu = 0.; } anrm = _starpu_dlansb_("M", uplo, n, kd, &ab[ab_offset], ldab, &work[1]); if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { if (lower) { _starpu_dlascl_("B", kd, kd, &c_b14, &sigma, n, n, &ab[ab_offset], ldab, info); } else { _starpu_dlascl_("Q", kd, kd, &c_b14, &sigma, n, n, &ab[ab_offset], ldab, info); } if (*abstol > 0.) { abstll = *abstol * sigma; } if (valeig) { vll = *vl * sigma; vuu = *vu * sigma; } } /* Call DSBTRD to reduce symmetric band matrix to tridiagonal form. */ indd = 1; inde = indd + *n; indwrk = inde + *n; _starpu_dsbtrd_(jobz, uplo, n, kd, &ab[ab_offset], ldab, &work[indd], &work[inde], &q[q_offset], ldq, &work[indwrk], &iinfo); /* If all eigenvalues are desired and ABSTOL is less than or equal */ /* to zero, then call DSTERF or SSTEQR. If this fails for some */ /* eigenvalue, then try DSTEBZ. */ test = FALSE_; if (indeig) { if (*il == 1 && *iu == *n) { test = TRUE_; } } if ((alleig || test) && *abstol <= 0.) { _starpu_dcopy_(n, &work[indd], &c__1, &w[1], &c__1); indee = indwrk + (*n << 1); if (! wantz) { i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsterf_(n, &w[1], &work[indee], info); } else { _starpu_dlacpy_("A", n, n, &q[q_offset], ldq, &z__[z_offset], ldz); i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsteqr_(jobz, n, &w[1], &work[indee], &z__[z_offset], ldz, &work[ indwrk], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ifail[i__] = 0; /* L10: */ } } } if (*info == 0) { *m = *n; goto L30; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, SSTEIN. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } indibl = 1; indisp = indibl + *n; indiwo = indisp + *n; _starpu_dstebz_(range, order, n, &vll, &vuu, il, iu, &abstll, &work[indd], &work[ inde], m, &nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[ indwrk], &iwork[indiwo], info); if (wantz) { _starpu_dstein_(n, &work[indd], &work[inde], m, &w[1], &iwork[indibl], &iwork[ indisp], &z__[z_offset], ldz, &work[indwrk], &iwork[indiwo], & ifail[1], info); /* Apply orthogonal matrix used in reduction to tridiagonal */ /* form to eigenvectors returned by DSTEIN. */ i__1 = *m; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(n, &z__[j * z_dim1 + 1], &c__1, &work[1], &c__1); _starpu_dgemv_("N", n, n, &c_b14, &q[q_offset], ldq, &work[1], &c__1, & c_b34, &z__[j * z_dim1 + 1], &c__1); /* L20: */ } } /* If matrix was scaled, then rescale eigenvalues appropriately. */ L30: if (iscale == 1) { if (*info == 0) { imax = *m; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L40: */ } if (i__ != 0) { itmp1 = iwork[indibl + i__ - 1]; w[i__] = w[j]; iwork[indibl + i__ - 1] = iwork[indibl + j - 1]; w[j] = tmp1; iwork[indibl + j - 1] = itmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); if (*info != 0) { itmp1 = ifail[i__]; ifail[i__] = ifail[j]; ifail[j] = itmp1; } } /* L50: */ } } return 0; /* End of DSBEVX */ } /* _starpu_dsbevx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbgst.c000066400000000000000000001413151413463044200206410ustar00rootroot00000000000000/* dsbgst.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b8 = 0.; static doublereal c_b9 = 1.; static integer c__1 = 1; static doublereal c_b20 = -1.; /* Subroutine */ int _starpu_dsbgst_(char *vect, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *x, integer *ldx, doublereal *work, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, bb_dim1, bb_offset, x_dim1, x_offset, i__1, i__2, i__3, i__4; doublereal d__1; /* Local variables */ integer i__, j, k, l, m; doublereal t; integer i0, i1, i2, j1, j2; doublereal ra; integer nr, nx, ka1, kb1; doublereal ra1; integer j1t, j2t; doublereal bii; integer kbt, nrt, inca; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_drot_(integer *, doublereal *, integer *, doublereal * , integer *, doublereal *, doublereal *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); logical upper, wantx; extern /* Subroutine */ int _starpu_dlar2v_(integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_( char *, integer *), _starpu_dlargv_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); logical update; extern /* Subroutine */ int _starpu_dlartv_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBGST reduces a real symmetric-definite banded generalized */ /* eigenproblem A*x = lambda*B*x to standard form C*y = lambda*y, */ /* such that C has the same bandwidth as A. */ /* B must have been previously factorized as S**T*S by DPBSTF, using a */ /* split Cholesky factorization. A is overwritten by C = X**T*A*X, where */ /* X = S**(-1)*Q and Q is an orthogonal matrix chosen to preserve the */ /* bandwidth of A. */ /* Arguments */ /* ========= */ /* VECT (input) CHARACTER*1 */ /* = 'N': do not form the transformation matrix X; */ /* = 'V': form X. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* KA (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KA >= 0. */ /* KB (input) INTEGER */ /* The number of superdiagonals of the matrix B if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KA >= KB >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first ka+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for max(1,j-ka)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+ka). */ /* On exit, the transformed matrix X**T*A*X, stored in the same */ /* format as A. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KA+1. */ /* BB (input) DOUBLE PRECISION array, dimension (LDBB,N) */ /* The banded factor S from the split Cholesky factorization of */ /* B, as returned by DPBSTF, stored in the first KB+1 rows of */ /* the array. */ /* LDBB (input) INTEGER */ /* The leading dimension of the array BB. LDBB >= KB+1. */ /* X (output) DOUBLE PRECISION array, dimension (LDX,N) */ /* If VECT = 'V', the n-by-n matrix X. */ /* If VECT = 'N', the array X is not referenced. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. */ /* LDX >= max(1,N) if VECT = 'V'; LDX >= 1 otherwise. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; bb_dim1 = *ldbb; bb_offset = 1 + bb_dim1; bb -= bb_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --work; /* Function Body */ wantx = _starpu_lsame_(vect, "V"); upper = _starpu_lsame_(uplo, "U"); ka1 = *ka + 1; kb1 = *kb + 1; *info = 0; if (! wantx && ! _starpu_lsame_(vect, "N")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ka < 0) { *info = -4; } else if (*kb < 0 || *kb > *ka) { *info = -5; } else if (*ldab < *ka + 1) { *info = -7; } else if (*ldbb < *kb + 1) { *info = -9; } else if (*ldx < 1 || wantx && *ldx < max(1,*n)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBGST", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } inca = *ldab * ka1; /* Initialize X to the unit matrix, if needed */ if (wantx) { _starpu_dlaset_("Full", n, n, &c_b8, &c_b9, &x[x_offset], ldx); } /* Set M to the splitting point m. It must be the same value as is */ /* used in DPBSTF. The chosen value allows the arrays WORK and RWORK */ /* to be of dimension (N). */ m = (*n + *kb) / 2; /* The routine works in two phases, corresponding to the two halves */ /* of the split Cholesky factorization of B as S**T*S where */ /* S = ( U ) */ /* ( M L ) */ /* with U upper triangular of order m, and L lower triangular of */ /* order n-m. S has the same bandwidth as B. */ /* S is treated as a product of elementary matrices: */ /* S = S(m)*S(m-1)*...*S(2)*S(1)*S(m+1)*S(m+2)*...*S(n-1)*S(n) */ /* where S(i) is determined by the i-th row of S. */ /* In phase 1, the index i takes the values n, n-1, ... , m+1; */ /* in phase 2, it takes the values 1, 2, ... , m. */ /* For each value of i, the current matrix A is updated by forming */ /* inv(S(i))**T*A*inv(S(i)). This creates a triangular bulge outside */ /* the band of A. The bulge is then pushed down toward the bottom of */ /* A in phase 1, and up toward the top of A in phase 2, by applying */ /* plane rotations. */ /* There are kb*(kb+1)/2 elements in the bulge, but at most 2*kb-1 */ /* of them are linearly independent, so annihilating a bulge requires */ /* only 2*kb-1 plane rotations. The rotations are divided into a 1st */ /* set of kb-1 rotations, and a 2nd set of kb rotations. */ /* Wherever possible, rotations are generated and applied in vector */ /* operations of length NR between the indices J1 and J2 (sometimes */ /* replaced by modified values NRT, J1T or J2T). */ /* The cosines and sines of the rotations are stored in the array */ /* WORK. The cosines of the 1st set of rotations are stored in */ /* elements n+2:n+m-kb-1 and the sines of the 1st set in elements */ /* 2:m-kb-1; the cosines of the 2nd set are stored in elements */ /* n+m-kb+1:2*n and the sines of the second set in elements m-kb+1:n. */ /* The bulges are not formed explicitly; nonzero elements outside the */ /* band are created only when they are required for generating new */ /* rotations; they are stored in the array WORK, in positions where */ /* they are later overwritten by the sines of the rotations which */ /* annihilate them. */ /* **************************** Phase 1 ***************************** */ /* The logical structure of this phase is: */ /* UPDATE = .TRUE. */ /* DO I = N, M + 1, -1 */ /* use S(i) to update A and create a new bulge */ /* apply rotations to push all bulges KA positions downward */ /* END DO */ /* UPDATE = .FALSE. */ /* DO I = M + KA + 1, N - 1 */ /* apply rotations to push all bulges KA positions downward */ /* END DO */ /* To avoid duplicating code, the two loops are merged. */ update = TRUE_; i__ = *n + 1; L10: if (update) { --i__; /* Computing MIN */ i__1 = *kb, i__2 = i__ - 1; kbt = min(i__1,i__2); i0 = i__ - 1; /* Computing MIN */ i__1 = *n, i__2 = i__ + *ka; i1 = min(i__1,i__2); i2 = i__ - kbt + ka1; if (i__ < m + 1) { update = FALSE_; ++i__; i0 = m; if (*ka == 0) { goto L480; } goto L10; } } else { i__ += *ka; if (i__ > *n - 1) { goto L480; } } if (upper) { /* Transform A, working with the upper triangle */ if (update) { /* Form inv(S(i))**T * A * inv(S(i)) */ bii = bb[kb1 + i__ * bb_dim1]; i__1 = i1; for (j = i__; j <= i__1; ++j) { ab[i__ - j + ka1 + j * ab_dim1] /= bii; /* L20: */ } /* Computing MAX */ i__1 = 1, i__2 = i__ - *ka; i__3 = i__; for (j = max(i__1,i__2); j <= i__3; ++j) { ab[j - i__ + ka1 + i__ * ab_dim1] /= bii; /* L30: */ } i__3 = i__ - 1; for (k = i__ - kbt; k <= i__3; ++k) { i__1 = k; for (j = i__ - kbt; j <= i__1; ++j) { ab[j - k + ka1 + k * ab_dim1] = ab[j - k + ka1 + k * ab_dim1] - bb[j - i__ + kb1 + i__ * bb_dim1] * ab[ k - i__ + ka1 + i__ * ab_dim1] - bb[k - i__ + kb1 + i__ * bb_dim1] * ab[j - i__ + ka1 + i__ * ab_dim1] + ab[ka1 + i__ * ab_dim1] * bb[j - i__ + kb1 + i__ * bb_dim1] * bb[k - i__ + kb1 + i__ * bb_dim1]; /* L40: */ } /* Computing MAX */ i__1 = 1, i__2 = i__ - *ka; i__4 = i__ - kbt - 1; for (j = max(i__1,i__2); j <= i__4; ++j) { ab[j - k + ka1 + k * ab_dim1] -= bb[k - i__ + kb1 + i__ * bb_dim1] * ab[j - i__ + ka1 + i__ * ab_dim1]; /* L50: */ } /* L60: */ } i__3 = i1; for (j = i__; j <= i__3; ++j) { /* Computing MAX */ i__4 = j - *ka, i__1 = i__ - kbt; i__2 = i__ - 1; for (k = max(i__4,i__1); k <= i__2; ++k) { ab[k - j + ka1 + j * ab_dim1] -= bb[k - i__ + kb1 + i__ * bb_dim1] * ab[i__ - j + ka1 + j * ab_dim1]; /* L70: */ } /* L80: */ } if (wantx) { /* post-multiply X by inv(S(i)) */ i__3 = *n - m; d__1 = 1. / bii; _starpu_dscal_(&i__3, &d__1, &x[m + 1 + i__ * x_dim1], &c__1); if (kbt > 0) { i__3 = *n - m; _starpu_dger_(&i__3, &kbt, &c_b20, &x[m + 1 + i__ * x_dim1], & c__1, &bb[kb1 - kbt + i__ * bb_dim1], &c__1, &x[m + 1 + (i__ - kbt) * x_dim1], ldx); } } /* store a(i,i1) in RA1 for use in next loop over K */ ra1 = ab[i__ - i1 + ka1 + i1 * ab_dim1]; } /* Generate and apply vectors of rotations to chase all the */ /* existing bulges KA positions down toward the bottom of the */ /* band */ i__3 = *kb - 1; for (k = 1; k <= i__3; ++k) { if (update) { /* Determine the rotations which would annihilate the bulge */ /* which has in theory just been created */ if (i__ - k + *ka < *n && i__ - k > 1) { /* generate rotation to annihilate a(i,i-k+ka+1) */ _starpu_dlartg_(&ab[k + 1 + (i__ - k + *ka) * ab_dim1], &ra1, & work[*n + i__ - k + *ka - m], &work[i__ - k + *ka - m], &ra); /* create nonzero element a(i-k,i-k+ka+1) outside the */ /* band and store it in WORK(i-k) */ t = -bb[kb1 - k + i__ * bb_dim1] * ra1; work[i__ - k] = work[*n + i__ - k + *ka - m] * t - work[ i__ - k + *ka - m] * ab[(i__ - k + *ka) * ab_dim1 + 1]; ab[(i__ - k + *ka) * ab_dim1 + 1] = work[i__ - k + *ka - m] * t + work[*n + i__ - k + *ka - m] * ab[(i__ - k + *ka) * ab_dim1 + 1]; ra1 = ra; } } /* Computing MAX */ i__2 = 1, i__4 = k - i0 + 2; j2 = i__ - k - 1 + max(i__2,i__4) * ka1; nr = (*n - j2 + *ka) / ka1; j1 = j2 + (nr - 1) * ka1; if (update) { /* Computing MAX */ i__2 = j2, i__4 = i__ + (*ka << 1) - k + 1; j2t = max(i__2,i__4); } else { j2t = j2; } nrt = (*n - j2t + *ka) / ka1; i__2 = j1; i__4 = ka1; for (j = j2t; i__4 < 0 ? j >= i__2 : j <= i__2; j += i__4) { /* create nonzero element a(j-ka,j+1) outside the band */ /* and store it in WORK(j-m) */ work[j - m] *= ab[(j + 1) * ab_dim1 + 1]; ab[(j + 1) * ab_dim1 + 1] = work[*n + j - m] * ab[(j + 1) * ab_dim1 + 1]; /* L90: */ } /* generate rotations in 1st set to annihilate elements which */ /* have been created outside the band */ if (nrt > 0) { _starpu_dlargv_(&nrt, &ab[j2t * ab_dim1 + 1], &inca, &work[j2t - m], & ka1, &work[*n + j2t - m], &ka1); } if (nr > 0) { /* apply rotations in 1st set from the right */ i__4 = *ka - 1; for (l = 1; l <= i__4; ++l) { _starpu_dlartv_(&nr, &ab[ka1 - l + j2 * ab_dim1], &inca, &ab[*ka - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2 - m], &work[j2 - m], &ka1); /* L100: */ } /* apply rotations in 1st set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[ka1 + j2 * ab_dim1], &ab[ka1 + (j2 + 1) * ab_dim1], &ab[*ka + (j2 + 1) * ab_dim1], &inca, &work[ *n + j2 - m], &work[j2 - m], &ka1); } /* start applying rotations in 1st set from the left */ i__4 = *kb - k + 1; for (l = *ka - 1; l >= i__4; --l) { nrt = (*n - j2 + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, & ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, & work[*n + j2 - m], &work[j2 - m], &ka1); } /* L110: */ } if (wantx) { /* post-multiply X by product of rotations in 1st set */ i__4 = j1; i__2 = ka1; for (j = j2; i__2 < 0 ? j >= i__4 : j <= i__4; j += i__2) { i__1 = *n - m; _starpu_drot_(&i__1, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j + 1) * x_dim1], &c__1, &work[*n + j - m], &work[j - m]); /* L120: */ } } /* L130: */ } if (update) { if (i2 <= *n && kbt > 0) { /* create nonzero element a(i-kbt,i-kbt+ka+1) outside the */ /* band and store it in WORK(i-kbt) */ work[i__ - kbt] = -bb[kb1 - kbt + i__ * bb_dim1] * ra1; } } for (k = *kb; k >= 1; --k) { if (update) { /* Computing MAX */ i__3 = 2, i__2 = k - i0 + 1; j2 = i__ - k - 1 + max(i__3,i__2) * ka1; } else { /* Computing MAX */ i__3 = 1, i__2 = k - i0 + 1; j2 = i__ - k - 1 + max(i__3,i__2) * ka1; } /* finish applying rotations in 2nd set from the left */ for (l = *kb - k; l >= 1; --l) { nrt = (*n - j2 + *ka + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + (j2 - l + 1) * ab_dim1], &inca, &ab[ l + 1 + (j2 - l + 1) * ab_dim1], &inca, &work[*n + j2 - *ka], &work[j2 - *ka], &ka1); } /* L140: */ } nr = (*n - j2 + *ka) / ka1; j1 = j2 + (nr - 1) * ka1; i__3 = j2; i__2 = -ka1; for (j = j1; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) { work[j] = work[j - *ka]; work[*n + j] = work[*n + j - *ka]; /* L150: */ } i__2 = j1; i__3 = ka1; for (j = j2; i__3 < 0 ? j >= i__2 : j <= i__2; j += i__3) { /* create nonzero element a(j-ka,j+1) outside the band */ /* and store it in WORK(j) */ work[j] *= ab[(j + 1) * ab_dim1 + 1]; ab[(j + 1) * ab_dim1 + 1] = work[*n + j] * ab[(j + 1) * ab_dim1 + 1]; /* L160: */ } if (update) { if (i__ - k < *n - *ka && k <= kbt) { work[i__ - k + *ka] = work[i__ - k]; } } /* L170: */ } for (k = *kb; k >= 1; --k) { /* Computing MAX */ i__3 = 1, i__2 = k - i0 + 1; j2 = i__ - k - 1 + max(i__3,i__2) * ka1; nr = (*n - j2 + *ka) / ka1; j1 = j2 + (nr - 1) * ka1; if (nr > 0) { /* generate rotations in 2nd set to annihilate elements */ /* which have been created outside the band */ _starpu_dlargv_(&nr, &ab[j2 * ab_dim1 + 1], &inca, &work[j2], &ka1, & work[*n + j2], &ka1); /* apply rotations in 2nd set from the right */ i__3 = *ka - 1; for (l = 1; l <= i__3; ++l) { _starpu_dlartv_(&nr, &ab[ka1 - l + j2 * ab_dim1], &inca, &ab[*ka - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2], &work[j2], &ka1); /* L180: */ } /* apply rotations in 2nd set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[ka1 + j2 * ab_dim1], &ab[ka1 + (j2 + 1) * ab_dim1], &ab[*ka + (j2 + 1) * ab_dim1], &inca, &work[ *n + j2], &work[j2], &ka1); } /* start applying rotations in 2nd set from the left */ i__3 = *kb - k + 1; for (l = *ka - 1; l >= i__3; --l) { nrt = (*n - j2 + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, & ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, & work[*n + j2], &work[j2], &ka1); } /* L190: */ } if (wantx) { /* post-multiply X by product of rotations in 2nd set */ i__3 = j1; i__2 = ka1; for (j = j2; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) { i__4 = *n - m; _starpu_drot_(&i__4, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j + 1) * x_dim1], &c__1, &work[*n + j], &work[j]); /* L200: */ } } /* L210: */ } i__2 = *kb - 1; for (k = 1; k <= i__2; ++k) { /* Computing MAX */ i__3 = 1, i__4 = k - i0 + 2; j2 = i__ - k - 1 + max(i__3,i__4) * ka1; /* finish applying rotations in 1st set from the left */ for (l = *kb - k; l >= 1; --l) { nrt = (*n - j2 + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, & ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, & work[*n + j2 - m], &work[j2 - m], &ka1); } /* L220: */ } /* L230: */ } if (*kb > 1) { i__2 = i__ - *kb + (*ka << 1) + 1; for (j = *n - 1; j >= i__2; --j) { work[*n + j - m] = work[*n + j - *ka - m]; work[j - m] = work[j - *ka - m]; /* L240: */ } } } else { /* Transform A, working with the lower triangle */ if (update) { /* Form inv(S(i))**T * A * inv(S(i)) */ bii = bb[i__ * bb_dim1 + 1]; i__2 = i1; for (j = i__; j <= i__2; ++j) { ab[j - i__ + 1 + i__ * ab_dim1] /= bii; /* L250: */ } /* Computing MAX */ i__2 = 1, i__3 = i__ - *ka; i__4 = i__; for (j = max(i__2,i__3); j <= i__4; ++j) { ab[i__ - j + 1 + j * ab_dim1] /= bii; /* L260: */ } i__4 = i__ - 1; for (k = i__ - kbt; k <= i__4; ++k) { i__2 = k; for (j = i__ - kbt; j <= i__2; ++j) { ab[k - j + 1 + j * ab_dim1] = ab[k - j + 1 + j * ab_dim1] - bb[i__ - j + 1 + j * bb_dim1] * ab[i__ - k + 1 + k * ab_dim1] - bb[i__ - k + 1 + k * bb_dim1] * ab[i__ - j + 1 + j * ab_dim1] + ab[i__ * ab_dim1 + 1] * bb[i__ - j + 1 + j * bb_dim1] * bb[i__ - k + 1 + k * bb_dim1]; /* L270: */ } /* Computing MAX */ i__2 = 1, i__3 = i__ - *ka; i__1 = i__ - kbt - 1; for (j = max(i__2,i__3); j <= i__1; ++j) { ab[k - j + 1 + j * ab_dim1] -= bb[i__ - k + 1 + k * bb_dim1] * ab[i__ - j + 1 + j * ab_dim1]; /* L280: */ } /* L290: */ } i__4 = i1; for (j = i__; j <= i__4; ++j) { /* Computing MAX */ i__1 = j - *ka, i__2 = i__ - kbt; i__3 = i__ - 1; for (k = max(i__1,i__2); k <= i__3; ++k) { ab[j - k + 1 + k * ab_dim1] -= bb[i__ - k + 1 + k * bb_dim1] * ab[j - i__ + 1 + i__ * ab_dim1]; /* L300: */ } /* L310: */ } if (wantx) { /* post-multiply X by inv(S(i)) */ i__4 = *n - m; d__1 = 1. / bii; _starpu_dscal_(&i__4, &d__1, &x[m + 1 + i__ * x_dim1], &c__1); if (kbt > 0) { i__4 = *n - m; i__3 = *ldbb - 1; _starpu_dger_(&i__4, &kbt, &c_b20, &x[m + 1 + i__ * x_dim1], & c__1, &bb[kbt + 1 + (i__ - kbt) * bb_dim1], &i__3, &x[m + 1 + (i__ - kbt) * x_dim1], ldx); } } /* store a(i1,i) in RA1 for use in next loop over K */ ra1 = ab[i1 - i__ + 1 + i__ * ab_dim1]; } /* Generate and apply vectors of rotations to chase all the */ /* existing bulges KA positions down toward the bottom of the */ /* band */ i__4 = *kb - 1; for (k = 1; k <= i__4; ++k) { if (update) { /* Determine the rotations which would annihilate the bulge */ /* which has in theory just been created */ if (i__ - k + *ka < *n && i__ - k > 1) { /* generate rotation to annihilate a(i-k+ka+1,i) */ _starpu_dlartg_(&ab[ka1 - k + i__ * ab_dim1], &ra1, &work[*n + i__ - k + *ka - m], &work[i__ - k + *ka - m], &ra) ; /* create nonzero element a(i-k+ka+1,i-k) outside the */ /* band and store it in WORK(i-k) */ t = -bb[k + 1 + (i__ - k) * bb_dim1] * ra1; work[i__ - k] = work[*n + i__ - k + *ka - m] * t - work[ i__ - k + *ka - m] * ab[ka1 + (i__ - k) * ab_dim1] ; ab[ka1 + (i__ - k) * ab_dim1] = work[i__ - k + *ka - m] * t + work[*n + i__ - k + *ka - m] * ab[ka1 + (i__ - k) * ab_dim1]; ra1 = ra; } } /* Computing MAX */ i__3 = 1, i__1 = k - i0 + 2; j2 = i__ - k - 1 + max(i__3,i__1) * ka1; nr = (*n - j2 + *ka) / ka1; j1 = j2 + (nr - 1) * ka1; if (update) { /* Computing MAX */ i__3 = j2, i__1 = i__ + (*ka << 1) - k + 1; j2t = max(i__3,i__1); } else { j2t = j2; } nrt = (*n - j2t + *ka) / ka1; i__3 = j1; i__1 = ka1; for (j = j2t; i__1 < 0 ? j >= i__3 : j <= i__3; j += i__1) { /* create nonzero element a(j+1,j-ka) outside the band */ /* and store it in WORK(j-m) */ work[j - m] *= ab[ka1 + (j - *ka + 1) * ab_dim1]; ab[ka1 + (j - *ka + 1) * ab_dim1] = work[*n + j - m] * ab[ka1 + (j - *ka + 1) * ab_dim1]; /* L320: */ } /* generate rotations in 1st set to annihilate elements which */ /* have been created outside the band */ if (nrt > 0) { _starpu_dlargv_(&nrt, &ab[ka1 + (j2t - *ka) * ab_dim1], &inca, &work[ j2t - m], &ka1, &work[*n + j2t - m], &ka1); } if (nr > 0) { /* apply rotations in 1st set from the left */ i__1 = *ka - 1; for (l = 1; l <= i__1; ++l) { _starpu_dlartv_(&nr, &ab[l + 1 + (j2 - l) * ab_dim1], &inca, &ab[ l + 2 + (j2 - l) * ab_dim1], &inca, &work[*n + j2 - m], &work[j2 - m], &ka1); /* L330: */ } /* apply rotations in 1st set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[j2 * ab_dim1 + 1], &ab[(j2 + 1) * ab_dim1 + 1], &ab[j2 * ab_dim1 + 2], &inca, &work[*n + j2 - m], &work[j2 - m], &ka1); } /* start applying rotations in 1st set from the right */ i__1 = *kb - k + 1; for (l = *ka - 1; l >= i__1; --l) { nrt = (*n - j2 + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[ ka1 - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2 - m], &work[j2 - m], &ka1); } /* L340: */ } if (wantx) { /* post-multiply X by product of rotations in 1st set */ i__1 = j1; i__3 = ka1; for (j = j2; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { i__2 = *n - m; _starpu_drot_(&i__2, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j + 1) * x_dim1], &c__1, &work[*n + j - m], &work[j - m]); /* L350: */ } } /* L360: */ } if (update) { if (i2 <= *n && kbt > 0) { /* create nonzero element a(i-kbt+ka+1,i-kbt) outside the */ /* band and store it in WORK(i-kbt) */ work[i__ - kbt] = -bb[kbt + 1 + (i__ - kbt) * bb_dim1] * ra1; } } for (k = *kb; k >= 1; --k) { if (update) { /* Computing MAX */ i__4 = 2, i__3 = k - i0 + 1; j2 = i__ - k - 1 + max(i__4,i__3) * ka1; } else { /* Computing MAX */ i__4 = 1, i__3 = k - i0 + 1; j2 = i__ - k - 1 + max(i__4,i__3) * ka1; } /* finish applying rotations in 2nd set from the right */ for (l = *kb - k; l >= 1; --l) { nrt = (*n - j2 + *ka + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + (j2 - *ka) * ab_dim1], & inca, &ab[ka1 - l + (j2 - *ka + 1) * ab_dim1], & inca, &work[*n + j2 - *ka], &work[j2 - *ka], &ka1) ; } /* L370: */ } nr = (*n - j2 + *ka) / ka1; j1 = j2 + (nr - 1) * ka1; i__4 = j2; i__3 = -ka1; for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { work[j] = work[j - *ka]; work[*n + j] = work[*n + j - *ka]; /* L380: */ } i__3 = j1; i__4 = ka1; for (j = j2; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { /* create nonzero element a(j+1,j-ka) outside the band */ /* and store it in WORK(j) */ work[j] *= ab[ka1 + (j - *ka + 1) * ab_dim1]; ab[ka1 + (j - *ka + 1) * ab_dim1] = work[*n + j] * ab[ka1 + ( j - *ka + 1) * ab_dim1]; /* L390: */ } if (update) { if (i__ - k < *n - *ka && k <= kbt) { work[i__ - k + *ka] = work[i__ - k]; } } /* L400: */ } for (k = *kb; k >= 1; --k) { /* Computing MAX */ i__4 = 1, i__3 = k - i0 + 1; j2 = i__ - k - 1 + max(i__4,i__3) * ka1; nr = (*n - j2 + *ka) / ka1; j1 = j2 + (nr - 1) * ka1; if (nr > 0) { /* generate rotations in 2nd set to annihilate elements */ /* which have been created outside the band */ _starpu_dlargv_(&nr, &ab[ka1 + (j2 - *ka) * ab_dim1], &inca, &work[j2] , &ka1, &work[*n + j2], &ka1); /* apply rotations in 2nd set from the left */ i__4 = *ka - 1; for (l = 1; l <= i__4; ++l) { _starpu_dlartv_(&nr, &ab[l + 1 + (j2 - l) * ab_dim1], &inca, &ab[ l + 2 + (j2 - l) * ab_dim1], &inca, &work[*n + j2] , &work[j2], &ka1); /* L410: */ } /* apply rotations in 2nd set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[j2 * ab_dim1 + 1], &ab[(j2 + 1) * ab_dim1 + 1], &ab[j2 * ab_dim1 + 2], &inca, &work[*n + j2], & work[j2], &ka1); } /* start applying rotations in 2nd set from the right */ i__4 = *kb - k + 1; for (l = *ka - 1; l >= i__4; --l) { nrt = (*n - j2 + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[ ka1 - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2], &work[j2], &ka1); } /* L420: */ } if (wantx) { /* post-multiply X by product of rotations in 2nd set */ i__4 = j1; i__3 = ka1; for (j = j2; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { i__1 = *n - m; _starpu_drot_(&i__1, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j + 1) * x_dim1], &c__1, &work[*n + j], &work[j]); /* L430: */ } } /* L440: */ } i__3 = *kb - 1; for (k = 1; k <= i__3; ++k) { /* Computing MAX */ i__4 = 1, i__1 = k - i0 + 2; j2 = i__ - k - 1 + max(i__4,i__1) * ka1; /* finish applying rotations in 1st set from the right */ for (l = *kb - k; l >= 1; --l) { nrt = (*n - j2 + l) / ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[ ka1 - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2 - m], &work[j2 - m], &ka1); } /* L450: */ } /* L460: */ } if (*kb > 1) { i__3 = i__ - *kb + (*ka << 1) + 1; for (j = *n - 1; j >= i__3; --j) { work[*n + j - m] = work[*n + j - *ka - m]; work[j - m] = work[j - *ka - m]; /* L470: */ } } } goto L10; L480: /* **************************** Phase 2 ***************************** */ /* The logical structure of this phase is: */ /* UPDATE = .TRUE. */ /* DO I = 1, M */ /* use S(i) to update A and create a new bulge */ /* apply rotations to push all bulges KA positions upward */ /* END DO */ /* UPDATE = .FALSE. */ /* DO I = M - KA - 1, 2, -1 */ /* apply rotations to push all bulges KA positions upward */ /* END DO */ /* To avoid duplicating code, the two loops are merged. */ update = TRUE_; i__ = 0; L490: if (update) { ++i__; /* Computing MIN */ i__3 = *kb, i__4 = m - i__; kbt = min(i__3,i__4); i0 = i__ + 1; /* Computing MAX */ i__3 = 1, i__4 = i__ - *ka; i1 = max(i__3,i__4); i2 = i__ + kbt - ka1; if (i__ > m) { update = FALSE_; --i__; i0 = m + 1; if (*ka == 0) { return 0; } goto L490; } } else { i__ -= *ka; if (i__ < 2) { return 0; } } if (i__ < m - kbt) { nx = m; } else { nx = *n; } if (upper) { /* Transform A, working with the upper triangle */ if (update) { /* Form inv(S(i))**T * A * inv(S(i)) */ bii = bb[kb1 + i__ * bb_dim1]; i__3 = i__; for (j = i1; j <= i__3; ++j) { ab[j - i__ + ka1 + i__ * ab_dim1] /= bii; /* L500: */ } /* Computing MIN */ i__4 = *n, i__1 = i__ + *ka; i__3 = min(i__4,i__1); for (j = i__; j <= i__3; ++j) { ab[i__ - j + ka1 + j * ab_dim1] /= bii; /* L510: */ } i__3 = i__ + kbt; for (k = i__ + 1; k <= i__3; ++k) { i__4 = i__ + kbt; for (j = k; j <= i__4; ++j) { ab[k - j + ka1 + j * ab_dim1] = ab[k - j + ka1 + j * ab_dim1] - bb[i__ - j + kb1 + j * bb_dim1] * ab[ i__ - k + ka1 + k * ab_dim1] - bb[i__ - k + kb1 + k * bb_dim1] * ab[i__ - j + ka1 + j * ab_dim1] + ab[ka1 + i__ * ab_dim1] * bb[i__ - j + kb1 + j * bb_dim1] * bb[i__ - k + kb1 + k * bb_dim1]; /* L520: */ } /* Computing MIN */ i__1 = *n, i__2 = i__ + *ka; i__4 = min(i__1,i__2); for (j = i__ + kbt + 1; j <= i__4; ++j) { ab[k - j + ka1 + j * ab_dim1] -= bb[i__ - k + kb1 + k * bb_dim1] * ab[i__ - j + ka1 + j * ab_dim1]; /* L530: */ } /* L540: */ } i__3 = i__; for (j = i1; j <= i__3; ++j) { /* Computing MIN */ i__1 = j + *ka, i__2 = i__ + kbt; i__4 = min(i__1,i__2); for (k = i__ + 1; k <= i__4; ++k) { ab[j - k + ka1 + k * ab_dim1] -= bb[i__ - k + kb1 + k * bb_dim1] * ab[j - i__ + ka1 + i__ * ab_dim1]; /* L550: */ } /* L560: */ } if (wantx) { /* post-multiply X by inv(S(i)) */ d__1 = 1. / bii; _starpu_dscal_(&nx, &d__1, &x[i__ * x_dim1 + 1], &c__1); if (kbt > 0) { i__3 = *ldbb - 1; _starpu_dger_(&nx, &kbt, &c_b20, &x[i__ * x_dim1 + 1], &c__1, &bb[ *kb + (i__ + 1) * bb_dim1], &i__3, &x[(i__ + 1) * x_dim1 + 1], ldx); } } /* store a(i1,i) in RA1 for use in next loop over K */ ra1 = ab[i1 - i__ + ka1 + i__ * ab_dim1]; } /* Generate and apply vectors of rotations to chase all the */ /* existing bulges KA positions up toward the top of the band */ i__3 = *kb - 1; for (k = 1; k <= i__3; ++k) { if (update) { /* Determine the rotations which would annihilate the bulge */ /* which has in theory just been created */ if (i__ + k - ka1 > 0 && i__ + k < m) { /* generate rotation to annihilate a(i+k-ka-1,i) */ _starpu_dlartg_(&ab[k + 1 + i__ * ab_dim1], &ra1, &work[*n + i__ + k - *ka], &work[i__ + k - *ka], &ra); /* create nonzero element a(i+k-ka-1,i+k) outside the */ /* band and store it in WORK(m-kb+i+k) */ t = -bb[kb1 - k + (i__ + k) * bb_dim1] * ra1; work[m - *kb + i__ + k] = work[*n + i__ + k - *ka] * t - work[i__ + k - *ka] * ab[(i__ + k) * ab_dim1 + 1]; ab[(i__ + k) * ab_dim1 + 1] = work[i__ + k - *ka] * t + work[*n + i__ + k - *ka] * ab[(i__ + k) * ab_dim1 + 1]; ra1 = ra; } } /* Computing MAX */ i__4 = 1, i__1 = k + i0 - m + 1; j2 = i__ + k + 1 - max(i__4,i__1) * ka1; nr = (j2 + *ka - 1) / ka1; j1 = j2 - (nr - 1) * ka1; if (update) { /* Computing MIN */ i__4 = j2, i__1 = i__ - (*ka << 1) + k - 1; j2t = min(i__4,i__1); } else { j2t = j2; } nrt = (j2t + *ka - 1) / ka1; i__4 = j2t; i__1 = ka1; for (j = j1; i__1 < 0 ? j >= i__4 : j <= i__4; j += i__1) { /* create nonzero element a(j-1,j+ka) outside the band */ /* and store it in WORK(j) */ work[j] *= ab[(j + *ka - 1) * ab_dim1 + 1]; ab[(j + *ka - 1) * ab_dim1 + 1] = work[*n + j] * ab[(j + *ka - 1) * ab_dim1 + 1]; /* L570: */ } /* generate rotations in 1st set to annihilate elements which */ /* have been created outside the band */ if (nrt > 0) { _starpu_dlargv_(&nrt, &ab[(j1 + *ka) * ab_dim1 + 1], &inca, &work[j1], &ka1, &work[*n + j1], &ka1); } if (nr > 0) { /* apply rotations in 1st set from the left */ i__1 = *ka - 1; for (l = 1; l <= i__1; ++l) { _starpu_dlartv_(&nr, &ab[ka1 - l + (j1 + l) * ab_dim1], &inca, & ab[*ka - l + (j1 + l) * ab_dim1], &inca, &work[*n + j1], &work[j1], &ka1); /* L580: */ } /* apply rotations in 1st set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[ka1 + j1 * ab_dim1], &ab[ka1 + (j1 - 1) * ab_dim1], &ab[*ka + j1 * ab_dim1], &inca, &work[*n + j1], &work[j1], &ka1); } /* start applying rotations in 1st set from the right */ i__1 = *kb - k + 1; for (l = *ka - 1; l >= i__1; --l) { nrt = (j2 + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + ( j1t - 1) * ab_dim1], &inca, &work[*n + j1t], & work[j1t], &ka1); } /* L590: */ } if (wantx) { /* post-multiply X by product of rotations in 1st set */ i__1 = j2; i__4 = ka1; for (j = j1; i__4 < 0 ? j >= i__1 : j <= i__1; j += i__4) { _starpu_drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 + 1], &c__1, &work[*n + j], &work[j]); /* L600: */ } } /* L610: */ } if (update) { if (i2 > 0 && kbt > 0) { /* create nonzero element a(i+kbt-ka-1,i+kbt) outside the */ /* band and store it in WORK(m-kb+i+kbt) */ work[m - *kb + i__ + kbt] = -bb[kb1 - kbt + (i__ + kbt) * bb_dim1] * ra1; } } for (k = *kb; k >= 1; --k) { if (update) { /* Computing MAX */ i__3 = 2, i__4 = k + i0 - m; j2 = i__ + k + 1 - max(i__3,i__4) * ka1; } else { /* Computing MAX */ i__3 = 1, i__4 = k + i0 - m; j2 = i__ + k + 1 - max(i__3,i__4) * ka1; } /* finish applying rotations in 2nd set from the right */ for (l = *kb - k; l >= 1; --l) { nrt = (j2 + *ka + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + (j1t + *ka) * ab_dim1], &inca, &ab[ l + 1 + (j1t + *ka - 1) * ab_dim1], &inca, &work[* n + m - *kb + j1t + *ka], &work[m - *kb + j1t + * ka], &ka1); } /* L620: */ } nr = (j2 + *ka - 1) / ka1; j1 = j2 - (nr - 1) * ka1; i__3 = j2; i__4 = ka1; for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { work[m - *kb + j] = work[m - *kb + j + *ka]; work[*n + m - *kb + j] = work[*n + m - *kb + j + *ka]; /* L630: */ } i__4 = j2; i__3 = ka1; for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { /* create nonzero element a(j-1,j+ka) outside the band */ /* and store it in WORK(m-kb+j) */ work[m - *kb + j] *= ab[(j + *ka - 1) * ab_dim1 + 1]; ab[(j + *ka - 1) * ab_dim1 + 1] = work[*n + m - *kb + j] * ab[ (j + *ka - 1) * ab_dim1 + 1]; /* L640: */ } if (update) { if (i__ + k > ka1 && k <= kbt) { work[m - *kb + i__ + k - *ka] = work[m - *kb + i__ + k]; } } /* L650: */ } for (k = *kb; k >= 1; --k) { /* Computing MAX */ i__3 = 1, i__4 = k + i0 - m; j2 = i__ + k + 1 - max(i__3,i__4) * ka1; nr = (j2 + *ka - 1) / ka1; j1 = j2 - (nr - 1) * ka1; if (nr > 0) { /* generate rotations in 2nd set to annihilate elements */ /* which have been created outside the band */ _starpu_dlargv_(&nr, &ab[(j1 + *ka) * ab_dim1 + 1], &inca, &work[m - * kb + j1], &ka1, &work[*n + m - *kb + j1], &ka1); /* apply rotations in 2nd set from the left */ i__3 = *ka - 1; for (l = 1; l <= i__3; ++l) { _starpu_dlartv_(&nr, &ab[ka1 - l + (j1 + l) * ab_dim1], &inca, & ab[*ka - l + (j1 + l) * ab_dim1], &inca, &work[*n + m - *kb + j1], &work[m - *kb + j1], &ka1); /* L660: */ } /* apply rotations in 2nd set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[ka1 + j1 * ab_dim1], &ab[ka1 + (j1 - 1) * ab_dim1], &ab[*ka + j1 * ab_dim1], &inca, &work[*n + m - *kb + j1], &work[m - *kb + j1], &ka1); } /* start applying rotations in 2nd set from the right */ i__3 = *kb - k + 1; for (l = *ka - 1; l >= i__3; --l) { nrt = (j2 + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + ( j1t - 1) * ab_dim1], &inca, &work[*n + m - *kb + j1t], &work[m - *kb + j1t], &ka1); } /* L670: */ } if (wantx) { /* post-multiply X by product of rotations in 2nd set */ i__3 = j2; i__4 = ka1; for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { _starpu_drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 + 1], &c__1, &work[*n + m - *kb + j], &work[m - * kb + j]); /* L680: */ } } /* L690: */ } i__4 = *kb - 1; for (k = 1; k <= i__4; ++k) { /* Computing MAX */ i__3 = 1, i__1 = k + i0 - m + 1; j2 = i__ + k + 1 - max(i__3,i__1) * ka1; /* finish applying rotations in 1st set from the right */ for (l = *kb - k; l >= 1; --l) { nrt = (j2 + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + ( j1t - 1) * ab_dim1], &inca, &work[*n + j1t], & work[j1t], &ka1); } /* L700: */ } /* L710: */ } if (*kb > 1) { /* Computing MIN */ i__3 = i__ + *kb; i__4 = min(i__3,m) - (*ka << 1) - 1; for (j = 2; j <= i__4; ++j) { work[*n + j] = work[*n + j + *ka]; work[j] = work[j + *ka]; /* L720: */ } } } else { /* Transform A, working with the lower triangle */ if (update) { /* Form inv(S(i))**T * A * inv(S(i)) */ bii = bb[i__ * bb_dim1 + 1]; i__4 = i__; for (j = i1; j <= i__4; ++j) { ab[i__ - j + 1 + j * ab_dim1] /= bii; /* L730: */ } /* Computing MIN */ i__3 = *n, i__1 = i__ + *ka; i__4 = min(i__3,i__1); for (j = i__; j <= i__4; ++j) { ab[j - i__ + 1 + i__ * ab_dim1] /= bii; /* L740: */ } i__4 = i__ + kbt; for (k = i__ + 1; k <= i__4; ++k) { i__3 = i__ + kbt; for (j = k; j <= i__3; ++j) { ab[j - k + 1 + k * ab_dim1] = ab[j - k + 1 + k * ab_dim1] - bb[j - i__ + 1 + i__ * bb_dim1] * ab[k - i__ + 1 + i__ * ab_dim1] - bb[k - i__ + 1 + i__ * bb_dim1] * ab[j - i__ + 1 + i__ * ab_dim1] + ab[ i__ * ab_dim1 + 1] * bb[j - i__ + 1 + i__ * bb_dim1] * bb[k - i__ + 1 + i__ * bb_dim1]; /* L750: */ } /* Computing MIN */ i__1 = *n, i__2 = i__ + *ka; i__3 = min(i__1,i__2); for (j = i__ + kbt + 1; j <= i__3; ++j) { ab[j - k + 1 + k * ab_dim1] -= bb[k - i__ + 1 + i__ * bb_dim1] * ab[j - i__ + 1 + i__ * ab_dim1]; /* L760: */ } /* L770: */ } i__4 = i__; for (j = i1; j <= i__4; ++j) { /* Computing MIN */ i__1 = j + *ka, i__2 = i__ + kbt; i__3 = min(i__1,i__2); for (k = i__ + 1; k <= i__3; ++k) { ab[k - j + 1 + j * ab_dim1] -= bb[k - i__ + 1 + i__ * bb_dim1] * ab[i__ - j + 1 + j * ab_dim1]; /* L780: */ } /* L790: */ } if (wantx) { /* post-multiply X by inv(S(i)) */ d__1 = 1. / bii; _starpu_dscal_(&nx, &d__1, &x[i__ * x_dim1 + 1], &c__1); if (kbt > 0) { _starpu_dger_(&nx, &kbt, &c_b20, &x[i__ * x_dim1 + 1], &c__1, &bb[ i__ * bb_dim1 + 2], &c__1, &x[(i__ + 1) * x_dim1 + 1], ldx); } } /* store a(i,i1) in RA1 for use in next loop over K */ ra1 = ab[i__ - i1 + 1 + i1 * ab_dim1]; } /* Generate and apply vectors of rotations to chase all the */ /* existing bulges KA positions up toward the top of the band */ i__4 = *kb - 1; for (k = 1; k <= i__4; ++k) { if (update) { /* Determine the rotations which would annihilate the bulge */ /* which has in theory just been created */ if (i__ + k - ka1 > 0 && i__ + k < m) { /* generate rotation to annihilate a(i,i+k-ka-1) */ _starpu_dlartg_(&ab[ka1 - k + (i__ + k - *ka) * ab_dim1], &ra1, & work[*n + i__ + k - *ka], &work[i__ + k - *ka], & ra); /* create nonzero element a(i+k,i+k-ka-1) outside the */ /* band and store it in WORK(m-kb+i+k) */ t = -bb[k + 1 + i__ * bb_dim1] * ra1; work[m - *kb + i__ + k] = work[*n + i__ + k - *ka] * t - work[i__ + k - *ka] * ab[ka1 + (i__ + k - *ka) * ab_dim1]; ab[ka1 + (i__ + k - *ka) * ab_dim1] = work[i__ + k - *ka] * t + work[*n + i__ + k - *ka] * ab[ka1 + (i__ + k - *ka) * ab_dim1]; ra1 = ra; } } /* Computing MAX */ i__3 = 1, i__1 = k + i0 - m + 1; j2 = i__ + k + 1 - max(i__3,i__1) * ka1; nr = (j2 + *ka - 1) / ka1; j1 = j2 - (nr - 1) * ka1; if (update) { /* Computing MIN */ i__3 = j2, i__1 = i__ - (*ka << 1) + k - 1; j2t = min(i__3,i__1); } else { j2t = j2; } nrt = (j2t + *ka - 1) / ka1; i__3 = j2t; i__1 = ka1; for (j = j1; i__1 < 0 ? j >= i__3 : j <= i__3; j += i__1) { /* create nonzero element a(j+ka,j-1) outside the band */ /* and store it in WORK(j) */ work[j] *= ab[ka1 + (j - 1) * ab_dim1]; ab[ka1 + (j - 1) * ab_dim1] = work[*n + j] * ab[ka1 + (j - 1) * ab_dim1]; /* L800: */ } /* generate rotations in 1st set to annihilate elements which */ /* have been created outside the band */ if (nrt > 0) { _starpu_dlargv_(&nrt, &ab[ka1 + j1 * ab_dim1], &inca, &work[j1], &ka1, &work[*n + j1], &ka1); } if (nr > 0) { /* apply rotations in 1st set from the right */ i__1 = *ka - 1; for (l = 1; l <= i__1; ++l) { _starpu_dlartv_(&nr, &ab[l + 1 + j1 * ab_dim1], &inca, &ab[l + 2 + (j1 - 1) * ab_dim1], &inca, &work[*n + j1], & work[j1], &ka1); /* L810: */ } /* apply rotations in 1st set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 2], &inca, &work[*n + j1] , &work[j1], &ka1); } /* start applying rotations in 1st set from the left */ i__1 = *kb - k + 1; for (l = *ka - 1; l >= i__1; --l) { nrt = (j2 + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1] , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1], &inca, &work[*n + j1t], &work[j1t], &ka1); } /* L820: */ } if (wantx) { /* post-multiply X by product of rotations in 1st set */ i__1 = j2; i__3 = ka1; for (j = j1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { _starpu_drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 + 1], &c__1, &work[*n + j], &work[j]); /* L830: */ } } /* L840: */ } if (update) { if (i2 > 0 && kbt > 0) { /* create nonzero element a(i+kbt,i+kbt-ka-1) outside the */ /* band and store it in WORK(m-kb+i+kbt) */ work[m - *kb + i__ + kbt] = -bb[kbt + 1 + i__ * bb_dim1] * ra1; } } for (k = *kb; k >= 1; --k) { if (update) { /* Computing MAX */ i__4 = 2, i__3 = k + i0 - m; j2 = i__ + k + 1 - max(i__4,i__3) * ka1; } else { /* Computing MAX */ i__4 = 1, i__3 = k + i0 - m; j2 = i__ + k + 1 - max(i__4,i__3) * ka1; } /* finish applying rotations in 2nd set from the left */ for (l = *kb - k; l >= 1; --l) { nrt = (j2 + *ka + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t + l - 1) * ab_dim1], &inca, &ab[ka1 - l + (j1t + l - 1) * ab_dim1], & inca, &work[*n + m - *kb + j1t + *ka], &work[m - * kb + j1t + *ka], &ka1); } /* L850: */ } nr = (j2 + *ka - 1) / ka1; j1 = j2 - (nr - 1) * ka1; i__4 = j2; i__3 = ka1; for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { work[m - *kb + j] = work[m - *kb + j + *ka]; work[*n + m - *kb + j] = work[*n + m - *kb + j + *ka]; /* L860: */ } i__3 = j2; i__4 = ka1; for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) { /* create nonzero element a(j+ka,j-1) outside the band */ /* and store it in WORK(m-kb+j) */ work[m - *kb + j] *= ab[ka1 + (j - 1) * ab_dim1]; ab[ka1 + (j - 1) * ab_dim1] = work[*n + m - *kb + j] * ab[ka1 + (j - 1) * ab_dim1]; /* L870: */ } if (update) { if (i__ + k > ka1 && k <= kbt) { work[m - *kb + i__ + k - *ka] = work[m - *kb + i__ + k]; } } /* L880: */ } for (k = *kb; k >= 1; --k) { /* Computing MAX */ i__4 = 1, i__3 = k + i0 - m; j2 = i__ + k + 1 - max(i__4,i__3) * ka1; nr = (j2 + *ka - 1) / ka1; j1 = j2 - (nr - 1) * ka1; if (nr > 0) { /* generate rotations in 2nd set to annihilate elements */ /* which have been created outside the band */ _starpu_dlargv_(&nr, &ab[ka1 + j1 * ab_dim1], &inca, &work[m - *kb + j1], &ka1, &work[*n + m - *kb + j1], &ka1); /* apply rotations in 2nd set from the right */ i__4 = *ka - 1; for (l = 1; l <= i__4; ++l) { _starpu_dlartv_(&nr, &ab[l + 1 + j1 * ab_dim1], &inca, &ab[l + 2 + (j1 - 1) * ab_dim1], &inca, &work[*n + m - *kb + j1], &work[m - *kb + j1], &ka1); /* L890: */ } /* apply rotations in 2nd set from both sides to diagonal */ /* blocks */ _starpu_dlar2v_(&nr, &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 2], &inca, &work[*n + m - *kb + j1], &work[m - *kb + j1], &ka1); } /* start applying rotations in 2nd set from the left */ i__4 = *kb - k + 1; for (l = *ka - 1; l >= i__4; --l) { nrt = (j2 + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1] , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1], &inca, &work[*n + m - *kb + j1t], &work[m - *kb + j1t], &ka1); } /* L900: */ } if (wantx) { /* post-multiply X by product of rotations in 2nd set */ i__4 = j2; i__3 = ka1; for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) { _starpu_drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 + 1], &c__1, &work[*n + m - *kb + j], &work[m - * kb + j]); /* L910: */ } } /* L920: */ } i__3 = *kb - 1; for (k = 1; k <= i__3; ++k) { /* Computing MAX */ i__4 = 1, i__1 = k + i0 - m + 1; j2 = i__ + k + 1 - max(i__4,i__1) * ka1; /* finish applying rotations in 1st set from the left */ for (l = *kb - k; l >= 1; --l) { nrt = (j2 + l - 1) / ka1; j1t = j2 - (nrt - 1) * ka1; if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1] , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1], &inca, &work[*n + j1t], &work[j1t], &ka1); } /* L930: */ } /* L940: */ } if (*kb > 1) { /* Computing MIN */ i__4 = i__ + *kb; i__3 = min(i__4,m) - (*ka << 1) - 1; for (j = 2; j <= i__3; ++j) { work[*n + j] = work[*n + j + *ka]; work[j] = work[j + *ka]; /* L950: */ } } } goto L490; /* End of DSBGST */ } /* _starpu_dsbgst_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbgv.c000066400000000000000000000176761413463044200204740ustar00rootroot00000000000000/* dsbgv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsbgv_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, bb_dim1, bb_offset, z_dim1, z_offset, i__1; /* Local variables */ integer inde; char vect[1]; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical upper, wantz; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpbstf_( char *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dsbtrd_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsbgst_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBGV computes all the eigenvalues, and optionally, the eigenvectors */ /* of a real generalized symmetric-definite banded eigenproblem, of */ /* the form A*x=(lambda)*B*x. Here A and B are assumed to be symmetric */ /* and banded, and B is also positive definite. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* KA (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KA >= 0. */ /* KB (input) INTEGER */ /* The number of superdiagonals of the matrix B if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KB >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first ka+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for max(1,j-ka)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+ka). */ /* On exit, the contents of AB are destroyed. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KA+1. */ /* BB (input/output) DOUBLE PRECISION array, dimension (LDBB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix B, stored in the first kb+1 rows of the array. The */ /* j-th column of B is stored in the j-th column of the array BB */ /* as follows: */ /* if UPLO = 'U', BB(kb+1+i-j,j) = B(i,j) for max(1,j-kb)<=i<=j; */ /* if UPLO = 'L', BB(1+i-j,j) = B(i,j) for j<=i<=min(n,j+kb). */ /* On exit, the factor S from the split Cholesky factorization */ /* B = S**T*S, as returned by DPBSTF. */ /* LDBB (input) INTEGER */ /* The leading dimension of the array BB. LDBB >= KB+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of */ /* eigenvectors, with the i-th column of Z holding the */ /* eigenvector associated with W(i). The eigenvectors are */ /* normalized so that Z**T*B*Z = I. */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= N. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is: */ /* <= N: the algorithm failed to converge: */ /* i off-diagonal elements of an intermediate */ /* tridiagonal form did not converge to zero; */ /* > N: if INFO = N + i, for 1 <= i <= N, then DPBSTF */ /* returned INFO = i: B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; bb_dim1 = *ldbb; bb_offset = 1 + bb_dim1; bb -= bb_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ka < 0) { *info = -4; } else if (*kb < 0 || *kb > *ka) { *info = -5; } else if (*ldab < *ka + 1) { *info = -7; } else if (*ldbb < *kb + 1) { *info = -9; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBGV ", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a split Cholesky factorization of B. */ _starpu_dpbstf_(uplo, n, kb, &bb[bb_offset], ldbb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem. */ inde = 1; indwrk = inde + *n; _starpu_dsbgst_(jobz, uplo, n, ka, kb, &ab[ab_offset], ldab, &bb[bb_offset], ldbb, &z__[z_offset], ldz, &work[indwrk], &iinfo) ; /* Reduce to tridiagonal form. */ if (wantz) { *(unsigned char *)vect = 'U'; } else { *(unsigned char *)vect = 'N'; } _starpu_dsbtrd_(vect, uplo, n, ka, &ab[ab_offset], ldab, &w[1], &work[inde], &z__[ z_offset], ldz, &work[indwrk], &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, call SSTEQR. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { _starpu_dsteqr_(jobz, n, &w[1], &work[inde], &z__[z_offset], ldz, &work[ indwrk], info); } return 0; /* End of DSBGV */ } /* _starpu_dsbgv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbgvd.c000066400000000000000000000264651413463044200206340ustar00rootroot00000000000000/* dsbgvd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b12 = 1.; static doublereal c_b13 = 0.; /* Subroutine */ int _starpu_dsbgvd_(char *jobz, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, bb_dim1, bb_offset, z_dim1, z_offset, i__1; /* Local variables */ integer inde; char vect[1]; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer iinfo, lwmin; logical upper, wantz; integer indwk2, llwrk2; extern /* Subroutine */ int _starpu_dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dpbstf_(char *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dsbtrd_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsbgst_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indwrk, liwmin; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBGVD computes all the eigenvalues, and optionally, the eigenvectors */ /* of a real generalized symmetric-definite banded eigenproblem, of the */ /* form A*x=(lambda)*B*x. Here A and B are assumed to be symmetric and */ /* banded, and B is also positive definite. If eigenvectors are */ /* desired, it uses a divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* KA (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KA >= 0. */ /* KB (input) INTEGER */ /* The number of superdiagonals of the matrix B if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KB >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first ka+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for max(1,j-ka)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+ka). */ /* On exit, the contents of AB are destroyed. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KA+1. */ /* BB (input/output) DOUBLE PRECISION array, dimension (LDBB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix B, stored in the first kb+1 rows of the array. The */ /* j-th column of B is stored in the j-th column of the array BB */ /* as follows: */ /* if UPLO = 'U', BB(ka+1+i-j,j) = B(i,j) for max(1,j-kb)<=i<=j; */ /* if UPLO = 'L', BB(1+i-j,j) = B(i,j) for j<=i<=min(n,j+kb). */ /* On exit, the factor S from the split Cholesky factorization */ /* B = S**T*S, as returned by DPBSTF. */ /* LDBB (input) INTEGER */ /* The leading dimension of the array BB. LDBB >= KB+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of */ /* eigenvectors, with the i-th column of Z holding the */ /* eigenvector associated with W(i). The eigenvectors are */ /* normalized so Z**T*B*Z = I. */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N <= 1, LWORK >= 1. */ /* If JOBZ = 'N' and N > 1, LWORK >= 3*N. */ /* If JOBZ = 'V' and N > 1, LWORK >= 1 + 5*N + 2*N**2. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if LIWORK > 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If JOBZ = 'N' or N <= 1, LIWORK >= 1. */ /* If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is: */ /* <= N: the algorithm failed to converge: */ /* i off-diagonal elements of an intermediate */ /* tridiagonal form did not converge to zero; */ /* > N: if INFO = N + i, for 1 <= i <= N, then DPBSTF */ /* returned INFO = i: B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; bb_dim1 = *ldbb; bb_offset = 1 + bb_dim1; bb -= bb_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1 || *liwork == -1; *info = 0; if (*n <= 1) { liwmin = 1; lwmin = 1; } else if (wantz) { liwmin = *n * 5 + 3; /* Computing 2nd power */ i__1 = *n; lwmin = *n * 5 + 1 + (i__1 * i__1 << 1); } else { liwmin = 1; lwmin = *n << 1; } if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ka < 0) { *info = -4; } else if (*kb < 0 || *kb > *ka) { *info = -5; } else if (*ldab < *ka + 1) { *info = -7; } else if (*ldbb < *kb + 1) { *info = -9; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -12; } if (*info == 0) { work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -14; } else if (*liwork < liwmin && ! lquery) { *info = -16; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBGVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a split Cholesky factorization of B. */ _starpu_dpbstf_(uplo, n, kb, &bb[bb_offset], ldbb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem. */ inde = 1; indwrk = inde + *n; indwk2 = indwrk + *n * *n; llwrk2 = *lwork - indwk2 + 1; _starpu_dsbgst_(jobz, uplo, n, ka, kb, &ab[ab_offset], ldab, &bb[bb_offset], ldbb, &z__[z_offset], ldz, &work[indwrk], &iinfo) ; /* Reduce to tridiagonal form. */ if (wantz) { *(unsigned char *)vect = 'U'; } else { *(unsigned char *)vect = 'N'; } _starpu_dsbtrd_(vect, uplo, n, ka, &ab[ab_offset], ldab, &w[1], &work[inde], &z__[ z_offset], ldz, &work[indwrk], &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, call SSTEDC. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { _starpu_dstedc_("I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & llwrk2, &iwork[1], liwork, info); _starpu_dgemm_("N", "N", n, n, n, &c_b12, &z__[z_offset], ldz, &work[indwrk], n, &c_b13, &work[indwk2], n); _starpu_dlacpy_("A", n, n, &work[indwk2], n, &z__[z_offset], ldz); } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSBGVD */ } /* _starpu_dsbgvd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbgvx.c000066400000000000000000000371171413463044200206540ustar00rootroot00000000000000/* dsbgvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b25 = 1.; static doublereal c_b27 = 0.; /* Subroutine */ int _starpu_dsbgvx_(char *jobz, char *range, char *uplo, integer *n, integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal * bb, integer *ldbb, doublereal *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, bb_dim1, bb_offset, q_dim1, q_offset, z_dim1, z_offset, i__1, i__2; /* Local variables */ integer i__, j, jj; doublereal tmp1; integer indd, inde; char vect[1]; logical test; integer itmp1, indee; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iinfo; char order[1]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical upper, wantz, alleig, indeig; integer indibl; logical valeig; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dpbstf_(char *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dsbtrd_( char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer indisp; extern /* Subroutine */ int _starpu_dsbgst_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *); integer indiwo; extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *), _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer nsplit; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBGVX computes selected eigenvalues, and optionally, eigenvectors */ /* of a real generalized symmetric-definite banded eigenproblem, of */ /* the form A*x=(lambda)*B*x. Here A and B are assumed to be symmetric */ /* and banded, and B is also positive definite. Eigenvalues and */ /* eigenvectors can be selected by specifying either all eigenvalues, */ /* a range of values or a range of indices for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* KA (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KA >= 0. */ /* KB (input) INTEGER */ /* The number of superdiagonals of the matrix B if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KB >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first ka+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for max(1,j-ka)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+ka). */ /* On exit, the contents of AB are destroyed. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KA+1. */ /* BB (input/output) DOUBLE PRECISION array, dimension (LDBB, N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix B, stored in the first kb+1 rows of the array. The */ /* j-th column of B is stored in the j-th column of the array BB */ /* as follows: */ /* if UPLO = 'U', BB(ka+1+i-j,j) = B(i,j) for max(1,j-kb)<=i<=j; */ /* if UPLO = 'L', BB(1+i-j,j) = B(i,j) for j<=i<=min(n,j+kb). */ /* On exit, the factor S from the split Cholesky factorization */ /* B = S**T*S, as returned by DPBSTF. */ /* LDBB (input) INTEGER */ /* The leading dimension of the array BB. LDBB >= KB+1. */ /* Q (output) DOUBLE PRECISION array, dimension (LDQ, N) */ /* If JOBZ = 'V', the n-by-n matrix used in the reduction of */ /* A*x = (lambda)*B*x to standard form, i.e. C*x = (lambda)*x, */ /* and consequently C to tridiagonal form. */ /* If JOBZ = 'N', the array Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. If JOBZ = 'N', */ /* LDQ >= 1. If JOBZ = 'V', LDQ >= max(1,N). */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing A to tridiagonal form. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of */ /* eigenvectors, with the i-th column of Z holding the */ /* eigenvector associated with W(i). The eigenvectors are */ /* normalized so Z**T*B*Z = I. */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (7*N) */ /* IWORK (workspace/output) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (M) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvalues that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0 : successful exit */ /* < 0 : if INFO = -i, the i-th argument had an illegal value */ /* <= N: if INFO = i, then i eigenvectors failed to converge. */ /* Their indices are stored in IFAIL. */ /* > N : DPBSTF returned an error code; i.e., */ /* if INFO = N + i, for 1 <= i <= N, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; bb_dim1 = *ldbb; bb_offset = 1 + bb_dim1; bb -= bb_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*ka < 0) { *info = -5; } else if (*kb < 0 || *kb > *ka) { *info = -6; } else if (*ldab < *ka + 1) { *info = -8; } else if (*ldbb < *kb + 1) { *info = -10; } else if (*ldq < 1 || wantz && *ldq < *n) { *info = -12; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -14; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -15; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -16; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -21; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBGVX", &i__1); return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } /* Form a split Cholesky factorization of B. */ _starpu_dpbstf_(uplo, n, kb, &bb[bb_offset], ldbb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem. */ _starpu_dsbgst_(jobz, uplo, n, ka, kb, &ab[ab_offset], ldab, &bb[bb_offset], ldbb, &q[q_offset], ldq, &work[1], &iinfo); /* Reduce symmetric band matrix to tridiagonal form. */ indd = 1; inde = indd + *n; indwrk = inde + *n; if (wantz) { *(unsigned char *)vect = 'U'; } else { *(unsigned char *)vect = 'N'; } _starpu_dsbtrd_(vect, uplo, n, ka, &ab[ab_offset], ldab, &work[indd], &work[inde], &q[q_offset], ldq, &work[indwrk], &iinfo); /* If all eigenvalues are desired and ABSTOL is less than or equal */ /* to zero, then call DSTERF or SSTEQR. If this fails for some */ /* eigenvalue, then try DSTEBZ. */ test = FALSE_; if (indeig) { if (*il == 1 && *iu == *n) { test = TRUE_; } } if ((alleig || test) && *abstol <= 0.) { _starpu_dcopy_(n, &work[indd], &c__1, &w[1], &c__1); indee = indwrk + (*n << 1); i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); if (! wantz) { _starpu_dsterf_(n, &w[1], &work[indee], info); } else { _starpu_dlacpy_("A", n, n, &q[q_offset], ldq, &z__[z_offset], ldz); _starpu_dsteqr_(jobz, n, &w[1], &work[indee], &z__[z_offset], ldz, &work[ indwrk], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ifail[i__] = 0; /* L10: */ } } } if (*info == 0) { *m = *n; goto L30; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, */ /* call DSTEIN. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } indibl = 1; indisp = indibl + *n; indiwo = indisp + *n; _starpu_dstebz_(range, order, n, vl, vu, il, iu, abstol, &work[indd], &work[inde], m, &nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[indwrk], &iwork[indiwo], info); if (wantz) { _starpu_dstein_(n, &work[indd], &work[inde], m, &w[1], &iwork[indibl], &iwork[ indisp], &z__[z_offset], ldz, &work[indwrk], &iwork[indiwo], & ifail[1], info); /* Apply transformation matrix used in reduction to tridiagonal */ /* form to eigenvectors returned by DSTEIN. */ i__1 = *m; for (j = 1; j <= i__1; ++j) { _starpu_dcopy_(n, &z__[j * z_dim1 + 1], &c__1, &work[1], &c__1); _starpu_dgemv_("N", n, n, &c_b25, &q[q_offset], ldq, &work[1], &c__1, & c_b27, &z__[j * z_dim1 + 1], &c__1); /* L20: */ } } L30: /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L40: */ } if (i__ != 0) { itmp1 = iwork[indibl + i__ - 1]; w[i__] = w[j]; iwork[indibl + i__ - 1] = iwork[indibl + j - 1]; w[j] = tmp1; iwork[indibl + j - 1] = itmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); if (*info != 0) { itmp1 = ifail[i__]; ifail[i__] = ifail[j]; ifail[j] = itmp1; } } /* L50: */ } } return 0; /* End of DSBGVX */ } /* _starpu_dsbgvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsbtrd.c000066400000000000000000000452331413463044200206370ustar00rootroot00000000000000/* dsbtrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b9 = 0.; static doublereal c_b10 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dsbtrd_(char *vect, char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *d__, doublereal *e, doublereal *q, integer *ldq, doublereal *work, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, q_dim1, q_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, k, l, i2, j1, j2, nq, nr, kd1, ibl, iqb, kdn, jin, nrt, kdm1, inca, jend, lend, jinc, incx, last; doublereal temp; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer j1end, j1inc, iqend; extern logical _starpu_lsame_(char *, char *); logical initq, wantq, upper; extern /* Subroutine */ int _starpu_dlar2v_(integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iqaend; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_xerbla_(char *, integer *), _starpu_dlargv_( integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartv_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSBTRD reduces a real symmetric band matrix A to symmetric */ /* tridiagonal form T by an orthogonal similarity transformation: */ /* Q**T * A * Q = T. */ /* Arguments */ /* ========= */ /* VECT (input) CHARACTER*1 */ /* = 'N': do not form Q; */ /* = 'V': form Q; */ /* = 'U': update a matrix X, by forming X*Q. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals of the matrix A if UPLO = 'U', */ /* or the number of subdiagonals if UPLO = 'L'. KD >= 0. */ /* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */ /* On entry, the upper or lower triangle of the symmetric band */ /* matrix A, stored in the first KD+1 rows of the array. The */ /* j-th column of A is stored in the j-th column of the array AB */ /* as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* On exit, the diagonal elements of AB are overwritten by the */ /* diagonal elements of the tridiagonal matrix T; if KD > 0, the */ /* elements on the first superdiagonal (if UPLO = 'U') or the */ /* first subdiagonal (if UPLO = 'L') are overwritten by the */ /* off-diagonal elements of T; the rest of AB is overwritten by */ /* values generated during the reduction. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* D (output) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of the tridiagonal matrix T. */ /* E (output) DOUBLE PRECISION array, dimension (N-1) */ /* The off-diagonal elements of the tridiagonal matrix T: */ /* E(i) = T(i,i+1) if UPLO = 'U'; E(i) = T(i+1,i) if UPLO = 'L'. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, if VECT = 'U', then Q must contain an N-by-N */ /* matrix X; if VECT = 'N' or 'V', then Q need not be set. */ /* On exit: */ /* if VECT = 'V', Q contains the N-by-N orthogonal matrix Q; */ /* if VECT = 'U', Q contains the product X*Q; */ /* if VECT = 'N', the array Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. */ /* LDQ >= 1, and LDQ >= N if VECT = 'V' or 'U'. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* Modified by Linda Kaufman, Bell Labs. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --d__; --e; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --work; /* Function Body */ initq = _starpu_lsame_(vect, "V"); wantq = initq || _starpu_lsame_(vect, "U"); upper = _starpu_lsame_(uplo, "U"); kd1 = *kd + 1; kdm1 = *kd - 1; incx = *ldab - 1; iqend = 1; *info = 0; if (! wantq && ! _starpu_lsame_(vect, "N")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*kd < 0) { *info = -4; } else if (*ldab < kd1) { *info = -6; } else if (*ldq < max(1,*n) && wantq) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSBTRD", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Initialize Q to the unit matrix, if needed */ if (initq) { _starpu_dlaset_("Full", n, n, &c_b9, &c_b10, &q[q_offset], ldq); } /* Wherever possible, plane rotations are generated and applied in */ /* vector operations of length NR over the index set J1:J2:KD1. */ /* The cosines and sines of the plane rotations are stored in the */ /* arrays D and WORK. */ inca = kd1 * *ldab; /* Computing MIN */ i__1 = *n - 1; kdn = min(i__1,*kd); if (upper) { if (*kd > 1) { /* Reduce to tridiagonal form, working with upper triangle */ nr = 0; j1 = kdn + 2; j2 = 1; i__1 = *n - 2; for (i__ = 1; i__ <= i__1; ++i__) { /* Reduce i-th row of matrix to tridiagonal form */ for (k = kdn + 1; k >= 2; --k) { j1 += kdn; j2 += kdn; if (nr > 0) { /* generate plane rotations to annihilate nonzero */ /* elements which have been created outside the band */ _starpu_dlargv_(&nr, &ab[(j1 - 1) * ab_dim1 + 1], &inca, & work[j1], &kd1, &d__[j1], &kd1); /* apply rotations from the right */ /* Dependent on the the number of diagonals either */ /* DLARTV or DROT is used */ if (nr >= (*kd << 1) - 1) { i__2 = *kd - 1; for (l = 1; l <= i__2; ++l) { _starpu_dlartv_(&nr, &ab[l + 1 + (j1 - 1) * ab_dim1], &inca, &ab[l + j1 * ab_dim1], &inca, & d__[j1], &work[j1], &kd1); /* L10: */ } } else { jend = j1 + (nr - 1) * kd1; i__2 = jend; i__3 = kd1; for (jinc = j1; i__3 < 0 ? jinc >= i__2 : jinc <= i__2; jinc += i__3) { _starpu_drot_(&kdm1, &ab[(jinc - 1) * ab_dim1 + 2], & c__1, &ab[jinc * ab_dim1 + 1], &c__1, &d__[jinc], &work[jinc]); /* L20: */ } } } if (k > 2) { if (k <= *n - i__ + 1) { /* generate plane rotation to annihilate a(i,i+k-1) */ /* within the band */ _starpu_dlartg_(&ab[*kd - k + 3 + (i__ + k - 2) * ab_dim1] , &ab[*kd - k + 2 + (i__ + k - 1) * ab_dim1], &d__[i__ + k - 1], &work[i__ + k - 1], &temp); ab[*kd - k + 3 + (i__ + k - 2) * ab_dim1] = temp; /* apply rotation from the right */ i__3 = k - 3; _starpu_drot_(&i__3, &ab[*kd - k + 4 + (i__ + k - 2) * ab_dim1], &c__1, &ab[*kd - k + 3 + (i__ + k - 1) * ab_dim1], &c__1, &d__[i__ + k - 1], &work[i__ + k - 1]); } ++nr; j1 = j1 - kdn - 1; } /* apply plane rotations from both sides to diagonal */ /* blocks */ if (nr > 0) { _starpu_dlar2v_(&nr, &ab[kd1 + (j1 - 1) * ab_dim1], &ab[kd1 + j1 * ab_dim1], &ab[*kd + j1 * ab_dim1], &inca, &d__[j1], &work[j1], &kd1); } /* apply plane rotations from the left */ if (nr > 0) { if ((*kd << 1) - 1 < nr) { /* Dependent on the the number of diagonals either */ /* DLARTV or DROT is used */ i__3 = *kd - 1; for (l = 1; l <= i__3; ++l) { if (j2 + l > *n) { nrt = nr - 1; } else { nrt = nr; } if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[*kd - l + (j1 + l) * ab_dim1], &inca, &ab[*kd - l + 1 + (j1 + l) * ab_dim1], &inca, & d__[j1], &work[j1], &kd1); } /* L30: */ } } else { j1end = j1 + kd1 * (nr - 2); if (j1end >= j1) { i__3 = j1end; i__2 = kd1; for (jin = j1; i__2 < 0 ? jin >= i__3 : jin <= i__3; jin += i__2) { i__4 = *kd - 1; _starpu_drot_(&i__4, &ab[*kd - 1 + (jin + 1) * ab_dim1], &incx, &ab[*kd + (jin + 1) * ab_dim1], &incx, &d__[jin], & work[jin]); /* L40: */ } } /* Computing MIN */ i__2 = kdm1, i__3 = *n - j2; lend = min(i__2,i__3); last = j1end + kd1; if (lend > 0) { _starpu_drot_(&lend, &ab[*kd - 1 + (last + 1) * ab_dim1], &incx, &ab[*kd + (last + 1) * ab_dim1], &incx, &d__[last], &work[ last]); } } } if (wantq) { /* accumulate product of plane rotations in Q */ if (initq) { /* take advantage of the fact that Q was */ /* initially the Identity matrix */ iqend = max(iqend,j2); /* Computing MAX */ i__2 = 0, i__3 = k - 3; i2 = max(i__2,i__3); iqaend = i__ * *kd + 1; if (k == 2) { iqaend += *kd; } iqaend = min(iqaend,iqend); i__2 = j2; i__3 = kd1; for (j = j1; i__3 < 0 ? j >= i__2 : j <= i__2; j += i__3) { ibl = i__ - i2 / kdm1; ++i2; /* Computing MAX */ i__4 = 1, i__5 = j - ibl; iqb = max(i__4,i__5); nq = iqaend + 1 - iqb; /* Computing MIN */ i__4 = iqaend + *kd; iqaend = min(i__4,iqend); _starpu_drot_(&nq, &q[iqb + (j - 1) * q_dim1], &c__1, &q[iqb + j * q_dim1], &c__1, &d__[j], &work[j]); /* L50: */ } } else { i__3 = j2; i__2 = kd1; for (j = j1; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) { _starpu_drot_(n, &q[(j - 1) * q_dim1 + 1], &c__1, &q[ j * q_dim1 + 1], &c__1, &d__[j], & work[j]); /* L60: */ } } } if (j2 + kdn > *n) { /* adjust J2 to keep within the bounds of the matrix */ --nr; j2 = j2 - kdn - 1; } i__2 = j2; i__3 = kd1; for (j = j1; i__3 < 0 ? j >= i__2 : j <= i__2; j += i__3) { /* create nonzero element a(j-1,j+kd) outside the band */ /* and store it in WORK */ work[j + *kd] = work[j] * ab[(j + *kd) * ab_dim1 + 1]; ab[(j + *kd) * ab_dim1 + 1] = d__[j] * ab[(j + *kd) * ab_dim1 + 1]; /* L70: */ } /* L80: */ } /* L90: */ } } if (*kd > 0) { /* copy off-diagonal elements to E */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] = ab[*kd + (i__ + 1) * ab_dim1]; /* L100: */ } } else { /* set E to zero if original matrix was diagonal */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] = 0.; /* L110: */ } } /* copy diagonal elements to D */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = ab[kd1 + i__ * ab_dim1]; /* L120: */ } } else { if (*kd > 1) { /* Reduce to tridiagonal form, working with lower triangle */ nr = 0; j1 = kdn + 2; j2 = 1; i__1 = *n - 2; for (i__ = 1; i__ <= i__1; ++i__) { /* Reduce i-th column of matrix to tridiagonal form */ for (k = kdn + 1; k >= 2; --k) { j1 += kdn; j2 += kdn; if (nr > 0) { /* generate plane rotations to annihilate nonzero */ /* elements which have been created outside the band */ _starpu_dlargv_(&nr, &ab[kd1 + (j1 - kd1) * ab_dim1], &inca, & work[j1], &kd1, &d__[j1], &kd1); /* apply plane rotations from one side */ /* Dependent on the the number of diagonals either */ /* DLARTV or DROT is used */ if (nr > (*kd << 1) - 1) { i__3 = *kd - 1; for (l = 1; l <= i__3; ++l) { _starpu_dlartv_(&nr, &ab[kd1 - l + (j1 - kd1 + l) * ab_dim1], &inca, &ab[kd1 - l + 1 + ( j1 - kd1 + l) * ab_dim1], &inca, &d__[ j1], &work[j1], &kd1); /* L130: */ } } else { jend = j1 + kd1 * (nr - 1); i__3 = jend; i__2 = kd1; for (jinc = j1; i__2 < 0 ? jinc >= i__3 : jinc <= i__3; jinc += i__2) { _starpu_drot_(&kdm1, &ab[*kd + (jinc - *kd) * ab_dim1] , &incx, &ab[kd1 + (jinc - *kd) * ab_dim1], &incx, &d__[jinc], &work[ jinc]); /* L140: */ } } } if (k > 2) { if (k <= *n - i__ + 1) { /* generate plane rotation to annihilate a(i+k-1,i) */ /* within the band */ _starpu_dlartg_(&ab[k - 1 + i__ * ab_dim1], &ab[k + i__ * ab_dim1], &d__[i__ + k - 1], &work[i__ + k - 1], &temp); ab[k - 1 + i__ * ab_dim1] = temp; /* apply rotation from the left */ i__2 = k - 3; i__3 = *ldab - 1; i__4 = *ldab - 1; _starpu_drot_(&i__2, &ab[k - 2 + (i__ + 1) * ab_dim1], & i__3, &ab[k - 1 + (i__ + 1) * ab_dim1], & i__4, &d__[i__ + k - 1], &work[i__ + k - 1]); } ++nr; j1 = j1 - kdn - 1; } /* apply plane rotations from both sides to diagonal */ /* blocks */ if (nr > 0) { _starpu_dlar2v_(&nr, &ab[(j1 - 1) * ab_dim1 + 1], &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 2], & inca, &d__[j1], &work[j1], &kd1); } /* apply plane rotations from the right */ /* Dependent on the the number of diagonals either */ /* DLARTV or DROT is used */ if (nr > 0) { if (nr > (*kd << 1) - 1) { i__2 = *kd - 1; for (l = 1; l <= i__2; ++l) { if (j2 + l > *n) { nrt = nr - 1; } else { nrt = nr; } if (nrt > 0) { _starpu_dlartv_(&nrt, &ab[l + 2 + (j1 - 1) * ab_dim1], &inca, &ab[l + 1 + j1 * ab_dim1], &inca, &d__[j1], &work[ j1], &kd1); } /* L150: */ } } else { j1end = j1 + kd1 * (nr - 2); if (j1end >= j1) { i__2 = j1end; i__3 = kd1; for (j1inc = j1; i__3 < 0 ? j1inc >= i__2 : j1inc <= i__2; j1inc += i__3) { _starpu_drot_(&kdm1, &ab[(j1inc - 1) * ab_dim1 + 3], &c__1, &ab[j1inc * ab_dim1 + 2], &c__1, &d__[j1inc], &work[ j1inc]); /* L160: */ } } /* Computing MIN */ i__3 = kdm1, i__2 = *n - j2; lend = min(i__3,i__2); last = j1end + kd1; if (lend > 0) { _starpu_drot_(&lend, &ab[(last - 1) * ab_dim1 + 3], & c__1, &ab[last * ab_dim1 + 2], &c__1, &d__[last], &work[last]); } } } if (wantq) { /* accumulate product of plane rotations in Q */ if (initq) { /* take advantage of the fact that Q was */ /* initially the Identity matrix */ iqend = max(iqend,j2); /* Computing MAX */ i__3 = 0, i__2 = k - 3; i2 = max(i__3,i__2); iqaend = i__ * *kd + 1; if (k == 2) { iqaend += *kd; } iqaend = min(iqaend,iqend); i__3 = j2; i__2 = kd1; for (j = j1; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) { ibl = i__ - i2 / kdm1; ++i2; /* Computing MAX */ i__4 = 1, i__5 = j - ibl; iqb = max(i__4,i__5); nq = iqaend + 1 - iqb; /* Computing MIN */ i__4 = iqaend + *kd; iqaend = min(i__4,iqend); _starpu_drot_(&nq, &q[iqb + (j - 1) * q_dim1], &c__1, &q[iqb + j * q_dim1], &c__1, &d__[j], &work[j]); /* L170: */ } } else { i__2 = j2; i__3 = kd1; for (j = j1; i__3 < 0 ? j >= i__2 : j <= i__2; j += i__3) { _starpu_drot_(n, &q[(j - 1) * q_dim1 + 1], &c__1, &q[ j * q_dim1 + 1], &c__1, &d__[j], & work[j]); /* L180: */ } } } if (j2 + kdn > *n) { /* adjust J2 to keep within the bounds of the matrix */ --nr; j2 = j2 - kdn - 1; } i__3 = j2; i__2 = kd1; for (j = j1; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) { /* create nonzero element a(j+kd,j-1) outside the */ /* band and store it in WORK */ work[j + *kd] = work[j] * ab[kd1 + j * ab_dim1]; ab[kd1 + j * ab_dim1] = d__[j] * ab[kd1 + j * ab_dim1] ; /* L190: */ } /* L200: */ } /* L210: */ } } if (*kd > 0) { /* copy off-diagonal elements to E */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] = ab[i__ * ab_dim1 + 2]; /* L220: */ } } else { /* set E to zero if original matrix was diagonal */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { e[i__] = 0.; /* L230: */ } } /* copy diagonal elements to D */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = ab[i__ * ab_dim1 + 1]; /* L240: */ } } return 0; /* End of DSBTRD */ } /* _starpu_dsbtrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsfrk.c000066400000000000000000000357121413463044200204670ustar00rootroot00000000000000/* dsfrk.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsfrk_(char *transr, char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, doublereal *c__) { /* System generated locals */ integer a_dim1, a_offset, i__1; /* Local variables */ integer j, n1, n2, nk, info; logical normaltransr; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer nrowa; logical lower; extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical nisodd, notrans; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Julien Langou of the Univ. of Colorado Denver -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Level 3 BLAS like routine for C in RFP Format. */ /* DSFRK performs one of the symmetric rank--k operations */ /* C := alpha*A*A' + beta*C, */ /* or */ /* C := alpha*A'*A + beta*C, */ /* where alpha and beta are real scalars, C is an n--by--n symmetric */ /* matrix and A is an n--by--k matrix in the first case and a k--by--n */ /* matrix in the second case. */ /* Arguments */ /* ========== */ /* TRANSR (input) CHARACTER */ /* = 'N': The Normal Form of RFP A is stored; */ /* = 'T': The Transpose Form of RFP A is stored. */ /* UPLO - (input) CHARACTER */ /* On entry, UPLO specifies whether the upper or lower */ /* triangular part of the array C is to be referenced as */ /* follows: */ /* UPLO = 'U' or 'u' Only the upper triangular part of C */ /* is to be referenced. */ /* UPLO = 'L' or 'l' Only the lower triangular part of C */ /* is to be referenced. */ /* Unchanged on exit. */ /* TRANS - (input) CHARACTER */ /* On entry, TRANS specifies the operation to be performed as */ /* follows: */ /* TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. */ /* TRANS = 'T' or 't' C := alpha*A'*A + beta*C. */ /* Unchanged on exit. */ /* N - (input) INTEGER. */ /* On entry, N specifies the order of the matrix C. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* K - (input) INTEGER. */ /* On entry with TRANS = 'N' or 'n', K specifies the number */ /* of columns of the matrix A, and on entry with TRANS = 'T' */ /* or 't', K specifies the number of rows of the matrix A. K */ /* must be at least zero. */ /* Unchanged on exit. */ /* ALPHA - (input) DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. */ /* Unchanged on exit. */ /* A - (input) DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where KA */ /* is K when TRANS = 'N' or 'n', and is N otherwise. Before */ /* entry with TRANS = 'N' or 'n', the leading N--by--K part of */ /* the array A must contain the matrix A, otherwise the leading */ /* K--by--N part of the array A must contain the matrix A. */ /* Unchanged on exit. */ /* LDA - (input) INTEGER. */ /* On entry, LDA specifies the first dimension of A as declared */ /* in the calling (sub) program. When TRANS = 'N' or 'n' */ /* then LDA must be at least max( 1, n ), otherwise LDA must */ /* be at least max( 1, k ). */ /* Unchanged on exit. */ /* BETA - (input) DOUBLE PRECISION. */ /* On entry, BETA specifies the scalar beta. */ /* Unchanged on exit. */ /* C - (input/output) DOUBLE PRECISION array, dimension ( NT ); */ /* NT = N*(N+1)/2. On entry, the symmetric matrix C in RFP */ /* Format. RFP Format is described by TRANSR, UPLO and N. */ /* Arguments */ /* ========== */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --c__; /* Function Body */ info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); notrans = _starpu_lsame_(trans, "N"); if (notrans) { nrowa = *n; } else { nrowa = *k; } if (! normaltransr && ! _starpu_lsame_(transr, "T")) { info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { info = -2; } else if (! notrans && ! _starpu_lsame_(trans, "T")) { info = -3; } else if (*n < 0) { info = -4; } else if (*k < 0) { info = -5; } else if (*lda < max(1,nrowa)) { info = -8; } if (info != 0) { i__1 = -info; _starpu_xerbla_("DSFRK ", &i__1); return 0; } /* Quick return if possible. */ /* The quick return case: ((ALPHA.EQ.0).AND.(BETA.NE.ZERO)) is not */ /* done (it is in DSYRK for example) and left in the general case. */ if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } if (*alpha == 0. && *beta == 0.) { i__1 = *n * (*n + 1) / 2; for (j = 1; j <= i__1; ++j) { c__[j] = 0.; } return 0; } /* C is N-by-N. */ /* If N is odd, set NISODD = .TRUE., and N1 and N2. */ /* If N is even, NISODD = .FALSE., and NK. */ if (*n % 2 == 0) { nisodd = FALSE_; nk = *n / 2; } else { nisodd = TRUE_; if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } } if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* N is odd, TRANSR = 'N', and UPLO = 'L' */ if (notrans) { /* N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'N' */ _starpu_dsyrk_("L", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[1], n); _starpu_dsyrk_("U", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda, beta, &c__[*n + 1], n); _starpu_dgemm_("N", "T", &n2, &n1, k, alpha, &a[n1 + 1 + a_dim1], lda, &a[a_dim1 + 1], lda, beta, &c__[n1 + 1], n); } else { /* N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'T' */ _starpu_dsyrk_("L", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[1], n); _starpu_dsyrk_("U", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1], lda, beta, &c__[*n + 1], n) ; _starpu_dgemm_("T", "N", &n2, &n1, k, alpha, &a[(n1 + 1) * a_dim1 + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[n1 + 1] , n); } } else { /* N is odd, TRANSR = 'N', and UPLO = 'U' */ if (notrans) { /* N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'N' */ _starpu_dsyrk_("L", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[n2 + 1], n); _starpu_dsyrk_("U", "N", &n2, k, alpha, &a[n2 + a_dim1], lda, beta, &c__[n1 + 1], n); _starpu_dgemm_("N", "T", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda, &a[n2 + a_dim1], lda, beta, &c__[1], n); } else { /* N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'T' */ _starpu_dsyrk_("L", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[n2 + 1], n); _starpu_dsyrk_("U", "T", &n2, k, alpha, &a[n2 * a_dim1 + 1], lda, beta, &c__[n1 + 1], n); _starpu_dgemm_("T", "N", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda, &a[n2 * a_dim1 + 1], lda, beta, &c__[1], n); } } } else { /* N is odd, and TRANSR = 'T' */ if (lower) { /* N is odd, TRANSR = 'T', and UPLO = 'L' */ if (notrans) { /* N is odd, TRANSR = 'T', UPLO = 'L', and TRANS = 'N' */ _starpu_dsyrk_("U", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[1], &n1); _starpu_dsyrk_("L", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda, beta, &c__[2], &n1); _starpu_dgemm_("N", "T", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda, &a[n1 + 1 + a_dim1], lda, beta, &c__[n1 * n1 + 1], &n1); } else { /* N is odd, TRANSR = 'T', UPLO = 'L', and TRANS = 'T' */ _starpu_dsyrk_("U", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[1], &n1); _starpu_dsyrk_("L", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1], lda, beta, &c__[2], &n1); _starpu_dgemm_("T", "N", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda, &a[(n1 + 1) * a_dim1 + 1], lda, beta, &c__[n1 * n1 + 1], &n1); } } else { /* N is odd, TRANSR = 'T', and UPLO = 'U' */ if (notrans) { /* N is odd, TRANSR = 'T', UPLO = 'U', and TRANS = 'N' */ _starpu_dsyrk_("U", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[n2 * n2 + 1], &n2); _starpu_dsyrk_("L", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda, beta, &c__[n1 * n2 + 1], &n2); _starpu_dgemm_("N", "T", &n2, &n1, k, alpha, &a[n1 + 1 + a_dim1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], &n2); } else { /* N is odd, TRANSR = 'T', UPLO = 'U', and TRANS = 'T' */ _starpu_dsyrk_("U", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[n2 * n2 + 1], &n2); _starpu_dsyrk_("L", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1], lda, beta, &c__[n1 * n2 + 1], &n2); _starpu_dgemm_("T", "N", &n2, &n1, k, alpha, &a[(n1 + 1) * a_dim1 + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], & n2); } } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* N is even, TRANSR = 'N', and UPLO = 'L' */ if (notrans) { /* N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'N' */ i__1 = *n + 1; _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[2], &i__1); i__1 = *n + 1; _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda, beta, &c__[1], &i__1); i__1 = *n + 1; _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[nk + 1 + a_dim1], lda, &a[a_dim1 + 1], lda, beta, &c__[nk + 2], & i__1); } else { /* N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'T' */ i__1 = *n + 1; _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[2], &i__1); i__1 = *n + 1; _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[1], &i__1); i__1 = *n + 1; _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[nk + 2] , &i__1); } } else { /* N is even, TRANSR = 'N', and UPLO = 'U' */ if (notrans) { /* N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'N' */ i__1 = *n + 1; _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[nk + 2], &i__1); i__1 = *n + 1; _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda, beta, &c__[nk + 1], &i__1); i__1 = *n + 1; _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda, &a[nk + 1 + a_dim1], lda, beta, &c__[1], &i__1); } else { /* N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'T' */ i__1 = *n + 1; _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[nk + 2], &i__1); i__1 = *n + 1; _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[nk + 1], &i__1); i__1 = *n + 1; _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda, &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[1], & i__1); } } } else { /* N is even, and TRANSR = 'T' */ if (lower) { /* N is even, TRANSR = 'T', and UPLO = 'L' */ if (notrans) { /* N is even, TRANSR = 'T', UPLO = 'L', and TRANS = 'N' */ _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[nk + 1], &nk); _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda, beta, &c__[1], &nk); _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda, &a[nk + 1 + a_dim1], lda, beta, &c__[(nk + 1) * nk + 1], &nk); } else { /* N is even, TRANSR = 'T', UPLO = 'L', and TRANS = 'T' */ _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[nk + 1], &nk); _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[1], &nk); _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda, &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[(nk + 1) * nk + 1], &nk); } } else { /* N is even, TRANSR = 'T', and UPLO = 'U' */ if (notrans) { /* N is even, TRANSR = 'T', UPLO = 'U', and TRANS = 'N' */ _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[nk * (nk + 1) + 1], &nk); _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda, beta, &c__[nk * nk + 1], &nk); _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[nk + 1 + a_dim1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], &nk); } else { /* N is even, TRANSR = 'T', UPLO = 'U', and TRANS = 'T' */ _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta, &c__[nk * (nk + 1) + 1], &nk); _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[nk * nk + 1], &nk); _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], & nk); } } } } return 0; /* End of DSFRK */ } /* _starpu_dsfrk_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsgesv.c000066400000000000000000000323471413463044200206520ustar00rootroot00000000000000/* dsgesv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b10 = -1.; static doublereal c_b11 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu__starpu_dsgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *work, real *swork, integer *iter, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, work_dim1, work_offset, x_dim1, x_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal cte, eps, anrm; integer ptsa; doublereal rnrm, xnrm; integer ptsx; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer iiter; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlag2s_(integer *, integer *, doublereal *, integer *, real *, integer *, integer *), _starpu_slag2d_( integer *, integer *, real *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dgetrf_(integer *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dgetrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_sgetrf_(integer *, integer *, real *, integer *, integer *, integer *), _starpu_sgetrs_(char *, integer *, integer *, real *, integer *, integer *, real *, integer *, integer *); /* -- LAPACK PROTOTYPE driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* February 2007 */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSGESV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N matrix and X and B are N-by-NRHS matrices. */ /* DSGESV first attempts to factorize the matrix in SINGLE PRECISION */ /* and use this factorization within an iterative refinement procedure */ /* to produce a solution with DOUBLE PRECISION normwise backward error */ /* quality (see below). If the approach fails the method switches to a */ /* DOUBLE PRECISION factorization and solve. */ /* The iterative refinement is not going to be a winning strategy if */ /* the ratio SINGLE PRECISION performance over DOUBLE PRECISION */ /* performance is too small. A reasonable strategy should take the */ /* number of right-hand sides and the size of the matrix into account. */ /* This might be done with a call to ILAENV in the future. Up to now, we */ /* always try iterative refinement. */ /* The iterative refinement process is stopped if */ /* ITER > ITERMAX */ /* or for all the RHS we have: */ /* RNRM < SQRT(N)*XNRM*ANRM*EPS*BWDMAX */ /* where */ /* o ITER is the number of the current iteration in the iterative */ /* refinement process */ /* o RNRM is the infinity-norm of the residual */ /* o XNRM is the infinity-norm of the solution */ /* o ANRM is the infinity-operator-norm of the matrix A */ /* o EPS is the machine epsilon returned by DLAMCH('Epsilon') */ /* The value ITERMAX and BWDMAX are fixed to 30 and 1.0D+00 */ /* respectively. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input or input/ouptut) DOUBLE PRECISION array, */ /* dimension (LDA,N) */ /* On entry, the N-by-N coefficient matrix A. */ /* On exit, if iterative refinement has been successfully used */ /* (INFO.EQ.0 and ITER.GE.0, see description below), then A is */ /* unchanged, if double precision factorization has been used */ /* (INFO.EQ.0 and ITER.LT.0, see description below), then the */ /* array A contains the factors L and U from the factorization */ /* A = P*L*U; the unit diagonal elements of L are not stored. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension (N) */ /* The pivot indices that define the permutation matrix P; */ /* row i of the matrix was interchanged with row IPIV(i). */ /* Corresponds either to the single precision factorization */ /* (if INFO.EQ.0 and ITER.GE.0) or the double precision */ /* factorization (if INFO.EQ.0 and ITER.LT.0). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The N-by-NRHS right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0, the N-by-NRHS solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N*NRHS) */ /* This array is used to hold the residual vectors. */ /* SWORK (workspace) REAL array, dimension (N*(N+NRHS)) */ /* This array is used to use the single precision matrix and the */ /* right-hand sides or solutions in single precision. */ /* ITER (output) INTEGER */ /* < 0: iterative refinement has failed, double precision */ /* factorization has been performed */ /* -1 : the routine fell back to full precision for */ /* implementation- or machine-specific reasons */ /* -2 : narrowing the precision induced an overflow, */ /* the routine fell back to full precision */ /* -3 : failure of SGETRF */ /* -31: stop the iterative refinement after the 30th */ /* iterations */ /* > 0: iterative refinement has been sucessfully used. */ /* Returns the number of iterations */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, U(i,i) computed in DOUBLE PRECISION is */ /* exactly zero. The factorization has been completed, */ /* but the factor U is exactly singular, so the solution */ /* could not be computed. */ /* ========= */ /* .. Parameters .. */ /* .. Local Scalars .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ work_dim1 = *n; work_offset = 1 + work_dim1; work -= work_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --swork; /* Function Body */ *info = 0; *iter = 0; /* Test the input parameters. */ if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldx < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSGESV", &i__1); return 0; } /* Quick return if (N.EQ.0). */ if (*n == 0) { return 0; } /* Skip single precision iterative refinement if a priori slower */ /* than double precision factorization. */ if (FALSE_) { *iter = -1; goto L40; } /* Compute some constants. */ anrm = _starpu_dlange_("I", n, n, &a[a_offset], lda, &work[work_offset]); eps = _starpu_dlamch_("Epsilon"); cte = anrm * eps * sqrt((doublereal) (*n)) * 1.; /* Set the indices PTSA, PTSX for referencing SA and SX in SWORK. */ ptsa = 1; ptsx = ptsa + *n * *n; /* Convert B from double precision to single precision and store the */ /* result in SX. */ _starpu_dlag2s_(n, nrhs, &b[b_offset], ldb, &swork[ptsx], n, info); if (*info != 0) { *iter = -2; goto L40; } /* Convert A from double precision to single precision and store the */ /* result in SA. */ _starpu_dlag2s_(n, n, &a[a_offset], lda, &swork[ptsa], n, info); if (*info != 0) { *iter = -2; goto L40; } /* Compute the LU factorization of SA. */ _starpu_sgetrf_(n, n, &swork[ptsa], n, &ipiv[1], info); if (*info != 0) { *iter = -3; goto L40; } /* Solve the system SA*SX = SB. */ _starpu_sgetrs_("No transpose", n, nrhs, &swork[ptsa], n, &ipiv[1], &swork[ptsx], n, info); /* Convert SX back to double precision */ _starpu_slag2d_(n, nrhs, &swork[ptsx], n, &x[x_offset], ldx, info); /* Compute R = B - AX (R is WORK). */ _starpu_dlacpy_("All", n, nrhs, &b[b_offset], ldb, &work[work_offset], n); _starpu_dgemm_("No Transpose", "No Transpose", n, nrhs, n, &c_b10, &a[a_offset], lda, &x[x_offset], ldx, &c_b11, &work[work_offset], n); /* Check whether the NRHS normwise backward errors satisfy the */ /* stopping criterion. If yes, set ITER=0 and return. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { xnrm = (d__1 = x[_starpu_idamax_(n, &x[i__ * x_dim1 + 1], &c__1) + i__ * x_dim1], abs(d__1)); rnrm = (d__1 = work[_starpu_idamax_(n, &work[i__ * work_dim1 + 1], &c__1) + i__ * work_dim1], abs(d__1)); if (rnrm > xnrm * cte) { goto L10; } } /* If we are here, the NRHS normwise backward errors satisfy the */ /* stopping criterion. We are good to exit. */ *iter = 0; return 0; L10: for (iiter = 1; iiter <= 30; ++iiter) { /* Convert R (in WORK) from double precision to single precision */ /* and store the result in SX. */ _starpu_dlag2s_(n, nrhs, &work[work_offset], n, &swork[ptsx], n, info); if (*info != 0) { *iter = -2; goto L40; } /* Solve the system SA*SX = SR. */ _starpu_sgetrs_("No transpose", n, nrhs, &swork[ptsa], n, &ipiv[1], &swork[ ptsx], n, info); /* Convert SX back to double precision and update the current */ /* iterate. */ _starpu_slag2d_(n, nrhs, &swork[ptsx], n, &work[work_offset], n, info); i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_daxpy_(n, &c_b11, &work[i__ * work_dim1 + 1], &c__1, &x[i__ * x_dim1 + 1], &c__1); } /* Compute R = B - AX (R is WORK). */ _starpu_dlacpy_("All", n, nrhs, &b[b_offset], ldb, &work[work_offset], n); _starpu_dgemm_("No Transpose", "No Transpose", n, nrhs, n, &c_b10, &a[ a_offset], lda, &x[x_offset], ldx, &c_b11, &work[work_offset], n); /* Check whether the NRHS normwise backward errors satisfy the */ /* stopping criterion. If yes, set ITER=IITER>0 and return. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { xnrm = (d__1 = x[_starpu_idamax_(n, &x[i__ * x_dim1 + 1], &c__1) + i__ * x_dim1], abs(d__1)); rnrm = (d__1 = work[_starpu_idamax_(n, &work[i__ * work_dim1 + 1], &c__1) + i__ * work_dim1], abs(d__1)); if (rnrm > xnrm * cte) { goto L20; } } /* If we are here, the NRHS normwise backward errors satisfy the */ /* stopping criterion, we are good to exit. */ *iter = iiter; return 0; L20: /* L30: */ ; } /* If we are at this place of the code, this is because we have */ /* performed ITER=ITERMAX iterations and never satisified the */ /* stopping criterion, set up the ITER flag accordingly and follow up */ /* on double precision routine. */ *iter = -31; L40: /* Single-precision iterative refinement failed to converge to a */ /* satisfactory solution, so we resort to double precision. */ _starpu_dgetrf_(n, n, &a[a_offset], lda, &ipiv[1], info); if (*info != 0) { return 0; } _starpu_dlacpy_("All", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dgetrs_("No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &x[x_offset] , ldx, info); return 0; /* End of DSGESV. */ } /* _starpu__starpu_dsgesv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspcon.c000066400000000000000000000124651413463044200206440ustar00rootroot00000000000000/* dspcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspcon_(char *uplo, integer *n, doublereal *ap, integer * ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer i__1; /* Local variables */ integer i__, ip, kase; extern logical _starpu_lsame_(char *, char *); integer isave[3]; logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dsptrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPCON estimates the reciprocal of the condition number (in the */ /* 1-norm) of a real symmetric packed matrix A using the factorization */ /* A = U*D*U**T or A = L*D*L**T computed by DSPTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the details of the factorization are stored */ /* as an upper or lower triangular matrix. */ /* = 'U': Upper triangular, form is A = U*D*U**T; */ /* = 'L': Lower triangular, form is A = L*D*L**T. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSPTRF, stored as a */ /* packed triangular matrix. */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSPTRF. */ /* ANORM (input) DOUBLE PRECISION */ /* The 1-norm of the original matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an */ /* estimate of the 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --iwork; --work; --ipiv; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*anorm < 0.) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm <= 0.) { return 0; } /* Check that the diagonal matrix D is nonsingular. */ if (upper) { /* Upper triangular storage: examine D from bottom to top */ ip = *n * (*n + 1) / 2; for (i__ = *n; i__ >= 1; --i__) { if (ipiv[i__] > 0 && ap[ip] == 0.) { return 0; } ip -= i__; /* L10: */ } } else { /* Lower triangular storage: examine D from top to bottom. */ ip = 1; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ipiv[i__] > 0 && ap[ip] == 0.) { return 0; } ip = ip + *n - i__ + 1; /* L20: */ } } /* Estimate the 1-norm of the inverse. */ kase = 0; L30: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { /* Multiply by inv(L*D*L') or inv(U*D*U'). */ _starpu_dsptrs_(uplo, n, &c__1, &ap[1], &ipiv[1], &work[1], n, info); goto L30; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } return 0; /* End of DSPCON */ } /* _starpu_dspcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspev.c000066400000000000000000000163421413463044200204750ustar00rootroot00000000000000/* dspev.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspev_(char *jobz, char *uplo, integer *n, doublereal * ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps; integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical wantz; extern doublereal _starpu_dlamch_(char *); integer iscale; doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlansp_(char *, char *, integer *, doublereal *, doublereal *); integer indtau; extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dopgtr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsptrd_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPEV computes all the eigenvalues and, optionally, eigenvectors of a */ /* real symmetric matrix A in packed storage. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, AP is overwritten by values generated during the */ /* reduction to tridiagonal form. If UPLO = 'U', the diagonal */ /* and first superdiagonal of the tridiagonal matrix T overwrite */ /* the corresponding elements of A, and if UPLO = 'L', the */ /* diagonal and first subdiagonal of T overwrite the */ /* corresponding elements of A. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal */ /* eigenvectors of the matrix A, with the i-th column of Z */ /* holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of an intermediate tridiagonal */ /* form did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (_starpu_lsame_(uplo, "U") || _starpu_lsame_(uplo, "L"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPEV ", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { w[1] = ap[1]; if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = _starpu_dlansp_("M", uplo, n, &ap[1], &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { i__1 = *n * (*n + 1) / 2; _starpu_dscal_(&i__1, &sigma, &ap[1], &c__1); } /* Call DSPTRD to reduce symmetric packed matrix to tridiagonal form. */ inde = 1; indtau = inde + *n; _starpu_dsptrd_(uplo, n, &ap[1], &w[1], &work[inde], &work[indtau], &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* DOPGTR to generate the orthogonal matrix, then call DSTEQR. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { indwrk = indtau + *n; _starpu_dopgtr_(uplo, n, &ap[1], &work[indtau], &z__[z_offset], ldz, &work[ indwrk], &iinfo); _starpu_dsteqr_(jobz, n, &w[1], &work[inde], &z__[z_offset], ldz, &work[ indtau], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { if (*info == 0) { imax = *n; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } return 0; /* End of DSPEV */ } /* _starpu_dspev_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspevd.c000066400000000000000000000240731413463044200206410ustar00rootroot00000000000000/* dspevd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspevd_(char *jobz, char *uplo, integer *n, doublereal * ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps; integer inde; doublereal anrm, rmin, rmax; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo, lwmin; logical wantz; extern doublereal _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlansp_(char *, char *, integer *, doublereal *, doublereal *); integer indtau; extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indwrk, liwmin; extern /* Subroutine */ int _starpu_dsptrd_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dopmtr_(char *, char *, char *, integer *, integer *, doublereal * , doublereal *, doublereal *, integer *, doublereal *, integer *); integer llwork; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPEVD computes all the eigenvalues and, optionally, eigenvectors */ /* of a real symmetric matrix A in packed storage. If eigenvectors are */ /* desired, it uses a divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, AP is overwritten by values generated during the */ /* reduction to tridiagonal form. If UPLO = 'U', the diagonal */ /* and first superdiagonal of the tridiagonal matrix T overwrite */ /* the corresponding elements of A, and if UPLO = 'L', the */ /* diagonal and first subdiagonal of T overwrite the */ /* corresponding elements of A. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal */ /* eigenvectors of the matrix A, with the i-th column of Z */ /* holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, */ /* dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the required LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N <= 1, LWORK must be at least 1. */ /* If JOBZ = 'N' and N > 1, LWORK must be at least 2*N. */ /* If JOBZ = 'V' and N > 1, LWORK must be at least */ /* 1 + 6*N + N**2. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the required sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the required LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If JOBZ = 'N' or N <= 1, LIWORK must be at least 1. */ /* If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the required sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of an intermediate tridiagonal */ /* form did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); lquery = *lwork == -1 || *liwork == -1; *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (_starpu_lsame_(uplo, "U") || _starpu_lsame_(uplo, "L"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -7; } if (*info == 0) { if (*n <= 1) { liwmin = 1; lwmin = 1; } else { if (wantz) { liwmin = *n * 5 + 3; /* Computing 2nd power */ i__1 = *n; lwmin = *n * 6 + 1 + i__1 * i__1; } else { liwmin = 1; lwmin = *n << 1; } } iwork[1] = liwmin; work[1] = (doublereal) lwmin; if (*lwork < lwmin && ! lquery) { *info = -9; } else if (*liwork < liwmin && ! lquery) { *info = -11; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPEVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { w[1] = ap[1]; if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = _starpu_dlansp_("M", uplo, n, &ap[1], &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { i__1 = *n * (*n + 1) / 2; _starpu_dscal_(&i__1, &sigma, &ap[1], &c__1); } /* Call DSPTRD to reduce symmetric packed matrix to tridiagonal form. */ inde = 1; indtau = inde + *n; _starpu_dsptrd_(uplo, n, &ap[1], &w[1], &work[inde], &work[indtau], &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* DSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ /* tridiagonal matrix, then call DOPMTR to multiply it by the */ /* Householder transformations represented in AP. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { indwrk = indtau + *n; llwork = *lwork - indwrk + 1; _starpu_dstedc_("I", n, &w[1], &work[inde], &z__[z_offset], ldz, &work[indwrk] , &llwork, &iwork[1], liwork, info); _starpu_dopmtr_("L", uplo, "N", n, n, &ap[1], &work[indtau], &z__[z_offset], ldz, &work[indwrk], &iinfo); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { d__1 = 1. / sigma; _starpu_dscal_(n, &d__1, &w[1], &c__1); } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSPEVD */ } /* _starpu_dspevd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspevx.c000066400000000000000000000351161413463044200206650ustar00rootroot00000000000000/* dspevx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspevx_(char *jobz, char *range, char *uplo, integer *n, doublereal *ap, doublereal *vl, doublereal *vu, integer *il, integer * iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, jj; doublereal eps, vll, vuu, tmp1; integer indd, inde; doublereal anrm; integer imax; doublereal rmin, rmax; logical test; integer itmp1, indee; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; char order[1]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical wantz; extern doublereal _starpu_dlamch_(char *); logical alleig, indeig; integer iscale, indibl; logical valeig; doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal abstll, bignum; extern doublereal _starpu_dlansp_(char *, char *, integer *, doublereal *, doublereal *); integer indtau, indisp; extern /* Subroutine */ int _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indiwo; extern /* Subroutine */ int _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dopgtr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsptrd_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dopmtr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer nsplit; doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPEVX computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric matrix A in packed storage. Eigenvalues/vectors */ /* can be selected by specifying either a range of values or a range of */ /* indices for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found; */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found; */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, AP is overwritten by values generated during the */ /* reduction to tridiagonal form. If UPLO = 'U', the diagonal */ /* and first superdiagonal of the tridiagonal matrix T overwrite */ /* the corresponding elements of A, and if UPLO = 'L', the */ /* diagonal and first subdiagonal of T overwrite the */ /* corresponding elements of A. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing AP to tridiagonal form. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* See "Computing Small Singular Values of Bidiagonal Matrices */ /* with Guaranteed High Relative Accuracy," by Demmel and */ /* Kahan, LAPACK Working Note #3. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the selected eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M)) */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If an eigenvector fails to converge, then that column of Z */ /* contains the latest approximation to the eigenvector, and the */ /* index of the eigenvector is returned in IFAIL. */ /* If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (8*N) */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (N) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvectors that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, then i eigenvectors failed to converge. */ /* Their indices are stored in array IFAIL. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (! (_starpu_lsame_(uplo, "L") || _starpu_lsame_(uplo, "U"))) { *info = -3; } else if (*n < 0) { *info = -4; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -7; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -8; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -9; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -14; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPEVX", &i__1); return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } if (*n == 1) { if (alleig || indeig) { *m = 1; w[1] = ap[1]; } else { if (*vl < ap[1] && *vu >= ap[1]) { *m = 1; w[1] = ap[1]; } } if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); /* Scale matrix to allowable range, if necessary. */ iscale = 0; abstll = *abstol; if (valeig) { vll = *vl; vuu = *vu; } else { vll = 0.; vuu = 0.; } anrm = _starpu_dlansp_("M", uplo, n, &ap[1], &work[1]); if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { i__1 = *n * (*n + 1) / 2; _starpu_dscal_(&i__1, &sigma, &ap[1], &c__1); if (*abstol > 0.) { abstll = *abstol * sigma; } if (valeig) { vll = *vl * sigma; vuu = *vu * sigma; } } /* Call DSPTRD to reduce symmetric packed matrix to tridiagonal form. */ indtau = 1; inde = indtau + *n; indd = inde + *n; indwrk = indd + *n; _starpu_dsptrd_(uplo, n, &ap[1], &work[indd], &work[inde], &work[indtau], &iinfo); /* If all eigenvalues are desired and ABSTOL is less than or equal */ /* to zero, then call DSTERF or DOPGTR and SSTEQR. If this fails */ /* for some eigenvalue, then try DSTEBZ. */ test = FALSE_; if (indeig) { if (*il == 1 && *iu == *n) { test = TRUE_; } } if ((alleig || test) && *abstol <= 0.) { _starpu_dcopy_(n, &work[indd], &c__1, &w[1], &c__1); indee = indwrk + (*n << 1); if (! wantz) { i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsterf_(n, &w[1], &work[indee], info); } else { _starpu_dopgtr_(uplo, n, &ap[1], &work[indtau], &z__[z_offset], ldz, & work[indwrk], &iinfo); i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsteqr_(jobz, n, &w[1], &work[indee], &z__[z_offset], ldz, &work[ indwrk], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ifail[i__] = 0; /* L10: */ } } } if (*info == 0) { *m = *n; goto L20; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, SSTEIN. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } indibl = 1; indisp = indibl + *n; indiwo = indisp + *n; _starpu_dstebz_(range, order, n, &vll, &vuu, il, iu, &abstll, &work[indd], &work[ inde], m, &nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[ indwrk], &iwork[indiwo], info); if (wantz) { _starpu_dstein_(n, &work[indd], &work[inde], m, &w[1], &iwork[indibl], &iwork[ indisp], &z__[z_offset], ldz, &work[indwrk], &iwork[indiwo], & ifail[1], info); /* Apply orthogonal matrix used in reduction to tridiagonal */ /* form to eigenvectors returned by DSTEIN. */ _starpu_dopmtr_("L", uplo, "N", n, m, &ap[1], &work[indtau], &z__[z_offset], ldz, &work[indwrk], &iinfo); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ L20: if (iscale == 1) { if (*info == 0) { imax = *m; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L30: */ } if (i__ != 0) { itmp1 = iwork[indibl + i__ - 1]; w[i__] = w[j]; iwork[indibl + i__ - 1] = iwork[indibl + j - 1]; w[j] = tmp1; iwork[indibl + j - 1] = itmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); if (*info != 0) { itmp1 = ifail[i__]; ifail[i__] = ifail[j]; ifail[j] = itmp1; } } /* L40: */ } } return 0; /* End of DSPEVX */ } /* _starpu_dspevx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspgst.c000066400000000000000000000177411413463044200206640ustar00rootroot00000000000000/* dspgst.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b9 = -1.; static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dspgst_(integer *itype, char *uplo, integer *n, doublereal *ap, doublereal *bp, integer *info) { /* System generated locals */ integer i__1, i__2; doublereal d__1; /* Local variables */ integer j, k, j1, k1, jj, kk; doublereal ct, ajj; integer j1j1; doublereal akk; integer k1k1; doublereal bjj, bkk; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dspr2_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dspmv_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPGST reduces a real symmetric-definite generalized eigenproblem */ /* to standard form, using packed storage. */ /* If ITYPE = 1, the problem is A*x = lambda*B*x, */ /* and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) */ /* If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ /* B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L. */ /* B must have been previously factorized as U**T*U or L*L**T by DPPTRF. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); */ /* = 2 or 3: compute U*A*U**T or L**T*A*L. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored and B is factored as */ /* U**T*U; */ /* = 'L': Lower triangle of A is stored and B is factored as */ /* L*L**T. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, if INFO = 0, the transformed matrix, stored in the */ /* same format as A. */ /* BP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The triangular factor from the Cholesky factorization of B, */ /* stored in the same format as A, as returned by DPPTRF. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --bp; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (*itype < 1 || *itype > 3) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPGST", &i__1); return 0; } if (*itype == 1) { if (upper) { /* Compute inv(U')*A*inv(U) */ /* J1 and JJ are the indices of A(1,j) and A(j,j) */ jj = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { j1 = jj + 1; jj += j; /* Compute the j-th column of the upper triangle of A */ bjj = bp[jj]; _starpu_dtpsv_(uplo, "Transpose", "Nonunit", &j, &bp[1], &ap[j1], & c__1); i__2 = j - 1; _starpu_dspmv_(uplo, &i__2, &c_b9, &ap[1], &bp[j1], &c__1, &c_b11, & ap[j1], &c__1); i__2 = j - 1; d__1 = 1. / bjj; _starpu_dscal_(&i__2, &d__1, &ap[j1], &c__1); i__2 = j - 1; ap[jj] = (ap[jj] - _starpu_ddot_(&i__2, &ap[j1], &c__1, &bp[j1], & c__1)) / bjj; /* L10: */ } } else { /* Compute inv(L)*A*inv(L') */ /* KK and K1K1 are the indices of A(k,k) and A(k+1,k+1) */ kk = 1; i__1 = *n; for (k = 1; k <= i__1; ++k) { k1k1 = kk + *n - k + 1; /* Update the lower triangle of A(k:n,k:n) */ akk = ap[kk]; bkk = bp[kk]; /* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; ap[kk] = akk; if (k < *n) { i__2 = *n - k; d__1 = 1. / bkk; _starpu_dscal_(&i__2, &d__1, &ap[kk + 1], &c__1); ct = akk * -.5; i__2 = *n - k; _starpu_daxpy_(&i__2, &ct, &bp[kk + 1], &c__1, &ap[kk + 1], &c__1) ; i__2 = *n - k; _starpu_dspr2_(uplo, &i__2, &c_b9, &ap[kk + 1], &c__1, &bp[kk + 1] , &c__1, &ap[k1k1]); i__2 = *n - k; _starpu_daxpy_(&i__2, &ct, &bp[kk + 1], &c__1, &ap[kk + 1], &c__1) ; i__2 = *n - k; _starpu_dtpsv_(uplo, "No transpose", "Non-unit", &i__2, &bp[k1k1], &ap[kk + 1], &c__1); } kk = k1k1; /* L20: */ } } } else { if (upper) { /* Compute U*A*U' */ /* K1 and KK are the indices of A(1,k) and A(k,k) */ kk = 0; i__1 = *n; for (k = 1; k <= i__1; ++k) { k1 = kk + 1; kk += k; /* Update the upper triangle of A(1:k,1:k) */ akk = ap[kk]; bkk = bp[kk]; i__2 = k - 1; _starpu_dtpmv_(uplo, "No transpose", "Non-unit", &i__2, &bp[1], &ap[ k1], &c__1); ct = akk * .5; i__2 = k - 1; _starpu_daxpy_(&i__2, &ct, &bp[k1], &c__1, &ap[k1], &c__1); i__2 = k - 1; _starpu_dspr2_(uplo, &i__2, &c_b11, &ap[k1], &c__1, &bp[k1], &c__1, & ap[1]); i__2 = k - 1; _starpu_daxpy_(&i__2, &ct, &bp[k1], &c__1, &ap[k1], &c__1); i__2 = k - 1; _starpu_dscal_(&i__2, &bkk, &ap[k1], &c__1); /* Computing 2nd power */ d__1 = bkk; ap[kk] = akk * (d__1 * d__1); /* L30: */ } } else { /* Compute L'*A*L */ /* JJ and J1J1 are the indices of A(j,j) and A(j+1,j+1) */ jj = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { j1j1 = jj + *n - j + 1; /* Compute the j-th column of the lower triangle of A */ ajj = ap[jj]; bjj = bp[jj]; i__2 = *n - j; ap[jj] = ajj * bjj + _starpu_ddot_(&i__2, &ap[jj + 1], &c__1, &bp[jj + 1], &c__1); i__2 = *n - j; _starpu_dscal_(&i__2, &bjj, &ap[jj + 1], &c__1); i__2 = *n - j; _starpu_dspmv_(uplo, &i__2, &c_b11, &ap[j1j1], &bp[jj + 1], &c__1, & c_b11, &ap[jj + 1], &c__1); i__2 = *n - j + 1; _starpu_dtpmv_(uplo, "Transpose", "Non-unit", &i__2, &bp[jj], &ap[jj], &c__1); jj = j1j1; /* L40: */ } } } return 0; /* End of DSPGST */ } /* _starpu_dspgst_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspgv.c000066400000000000000000000171771413463044200205060ustar00rootroot00000000000000/* dspgv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspgv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; /* Local variables */ integer j, neig; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dspev_(char *, char *, integer *, doublereal * , doublereal *, doublereal *, integer *, doublereal *, integer *); char trans[1]; logical upper; extern /* Subroutine */ int _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); logical wantz; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpptrf_( char *, integer *, doublereal *, integer *), _starpu_dspgst_( integer *, char *, integer *, doublereal *, doublereal *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPGV computes all the eigenvalues and, optionally, the eigenvectors */ /* of a real generalized symmetric-definite eigenproblem, of the form */ /* A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. */ /* Here A and B are assumed to be symmetric, stored in packed format, */ /* and B is also positive definite. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* Specifies the problem type to be solved: */ /* = 1: A*x = (lambda)*B*x */ /* = 2: A*B*x = (lambda)*x */ /* = 3: B*A*x = (lambda)*x */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension */ /* (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, the contents of AP are destroyed. */ /* BP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* B, packed columnwise in a linear array. The j-th column of B */ /* is stored in the array BP as follows: */ /* if UPLO = 'U', BP(i + (j-1)*j/2) = B(i,j) for 1<=i<=j; */ /* if UPLO = 'L', BP(i + (j-1)*(2*n-j)/2) = B(i,j) for j<=i<=n. */ /* On exit, the triangular factor U or L from the Cholesky */ /* factorization B = U**T*U or B = L*L**T, in the same storage */ /* format as B. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of */ /* eigenvectors. The eigenvectors are normalized as follows: */ /* if ITYPE = 1 or 2, Z**T*B*Z = I; */ /* if ITYPE = 3, Z**T*inv(B)*Z = I. */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: DPPTRF or DSPEV returned an error code: */ /* <= N: if INFO = i, DSPEV failed to converge; */ /* i off-diagonal elements of an intermediate */ /* tridiagonal form did not converge to zero. */ /* > N: if INFO = n + i, for 1 <= i <= n, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --bp; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -2; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPGV ", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a Cholesky factorization of B. */ _starpu_dpptrf_(uplo, n, &bp[1], info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ _starpu_dspgst_(itype, uplo, n, &ap[1], &bp[1], info); _starpu_dspev_(jobz, uplo, n, &ap[1], &w[1], &z__[z_offset], ldz, &work[1], info); if (wantz) { /* Backtransform eigenvectors to the original problem. */ neig = *n; if (*info > 0) { neig = *info - 1; } if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } i__1 = neig; for (j = 1; j <= i__1; ++j) { _starpu_dtpsv_(uplo, trans, "Non-unit", n, &bp[1], &z__[j * z_dim1 + 1], &c__1); /* L10: */ } } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } i__1 = neig; for (j = 1; j <= i__1; ++j) { _starpu_dtpmv_(uplo, trans, "Non-unit", n, &bp[1], &z__[j * z_dim1 + 1], &c__1); /* L20: */ } } } return 0; /* End of DSPGV */ } /* _starpu_dspgv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspgvd.c000066400000000000000000000252441413463044200206440ustar00rootroot00000000000000/* dspgvd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspgvd_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer j, neig; extern logical _starpu_lsame_(char *, char *); integer lwmin; char trans[1]; logical upper; extern /* Subroutine */ int _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); logical wantz; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dspevd_( char *, char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *); integer liwmin; extern /* Subroutine */ int _starpu_dpptrf_(char *, integer *, doublereal *, integer *), _starpu_dspgst_(integer *, char *, integer *, doublereal *, doublereal *, integer *); logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPGVD computes all the eigenvalues, and optionally, the eigenvectors */ /* of a real generalized symmetric-definite eigenproblem, of the form */ /* A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and */ /* B are assumed to be symmetric, stored in packed format, and B is also */ /* positive definite. */ /* If eigenvectors are desired, it uses a divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* Specifies the problem type to be solved: */ /* = 1: A*x = (lambda)*B*x */ /* = 2: A*B*x = (lambda)*x */ /* = 3: B*A*x = (lambda)*x */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, the contents of AP are destroyed. */ /* BP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* B, packed columnwise in a linear array. The j-th column of B */ /* is stored in the array BP as follows: */ /* if UPLO = 'U', BP(i + (j-1)*j/2) = B(i,j) for 1<=i<=j; */ /* if UPLO = 'L', BP(i + (j-1)*(2*n-j)/2) = B(i,j) for j<=i<=n. */ /* On exit, the triangular factor U or L from the Cholesky */ /* factorization B = U**T*U or B = L*L**T, in the same storage */ /* format as B. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of */ /* eigenvectors. The eigenvectors are normalized as follows: */ /* if ITYPE = 1 or 2, Z**T*B*Z = I; */ /* if ITYPE = 3, Z**T*inv(B)*Z = I. */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the required LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N <= 1, LWORK >= 1. */ /* If JOBZ = 'N' and N > 1, LWORK >= 2*N. */ /* If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the required sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the required LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If JOBZ = 'N' or N <= 1, LIWORK >= 1. */ /* If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the required sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: DPPTRF or DSPEVD returned an error code: */ /* <= N: if INFO = i, DSPEVD failed to converge; */ /* i off-diagonal elements of an intermediate */ /* tridiagonal form did not converge to zero; */ /* > N: if INFO = N + i, for 1 <= i <= N, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --bp; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1 || *liwork == -1; *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -2; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -9; } if (*info == 0) { if (*n <= 1) { liwmin = 1; lwmin = 1; } else { if (wantz) { liwmin = *n * 5 + 3; /* Computing 2nd power */ i__1 = *n; lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); } else { liwmin = 1; lwmin = *n << 1; } } work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -11; } else if (*liwork < liwmin && ! lquery) { *info = -13; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPGVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a Cholesky factorization of BP. */ _starpu_dpptrf_(uplo, n, &bp[1], info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ _starpu_dspgst_(itype, uplo, n, &ap[1], &bp[1], info); _starpu_dspevd_(jobz, uplo, n, &ap[1], &w[1], &z__[z_offset], ldz, &work[1], lwork, &iwork[1], liwork, info); /* Computing MAX */ d__1 = (doublereal) lwmin; lwmin = (integer) max(d__1,work[1]); /* Computing MAX */ d__1 = (doublereal) liwmin, d__2 = (doublereal) iwork[1]; liwmin = (integer) max(d__1,d__2); if (wantz) { /* Backtransform eigenvectors to the original problem. */ neig = *n; if (*info > 0) { neig = *info - 1; } if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } i__1 = neig; for (j = 1; j <= i__1; ++j) { _starpu_dtpsv_(uplo, trans, "Non-unit", n, &bp[1], &z__[j * z_dim1 + 1], &c__1); /* L10: */ } } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } i__1 = neig; for (j = 1; j <= i__1; ++j) { _starpu_dtpmv_(uplo, trans, "Non-unit", n, &bp[1], &z__[j * z_dim1 + 1], &c__1); /* L20: */ } } } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSPGVD */ } /* _starpu_dspgvd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspgvx.c000066400000000000000000000272311413463044200206660ustar00rootroot00000000000000/* dspgvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspgvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublereal *ap, doublereal *bp, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; /* Local variables */ integer j; extern logical _starpu_lsame_(char *, char *); char trans[1]; logical upper; extern /* Subroutine */ int _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); logical wantz, alleig, indeig, valeig; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpptrf_( char *, integer *, doublereal *, integer *), _starpu_dspgst_( integer *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_dspevx_(char *, char *, char *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPGVX computes selected eigenvalues, and optionally, eigenvectors */ /* of a real generalized symmetric-definite eigenproblem, of the form */ /* A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A */ /* and B are assumed to be symmetric, stored in packed storage, and B */ /* is also positive definite. Eigenvalues and eigenvectors can be */ /* selected by specifying either a range of values or a range of indices */ /* for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* Specifies the problem type to be solved: */ /* = 1: A*x = (lambda)*B*x */ /* = 2: A*B*x = (lambda)*x */ /* = 3: B*A*x = (lambda)*x */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A and B are stored; */ /* = 'L': Lower triangle of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrix pencil (A,B). N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, the contents of AP are destroyed. */ /* BP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* B, packed columnwise in a linear array. The j-th column of B */ /* is stored in the array BP as follows: */ /* if UPLO = 'U', BP(i + (j-1)*j/2) = B(i,j) for 1<=i<=j; */ /* if UPLO = 'L', BP(i + (j-1)*(2*n-j)/2) = B(i,j) for j<=i<=n. */ /* On exit, the triangular factor U or L from the Cholesky */ /* factorization B = U**T*U or B = L*L**T, in the same storage */ /* format as B. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing A to tridiagonal form. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* On normal exit, the first M elements contain the selected */ /* eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M)) */ /* If JOBZ = 'N', then Z is not referenced. */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* The eigenvectors are normalized as follows: */ /* if ITYPE = 1 or 2, Z**T*B*Z = I; */ /* if ITYPE = 3, Z**T*inv(B)*Z = I. */ /* If an eigenvector fails to converge, then that column of Z */ /* contains the latest approximation to the eigenvector, and the */ /* index of the eigenvector is returned in IFAIL. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (8*N) */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (N) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvectors that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: DPPTRF or DSPEVX returned an error code: */ /* <= N: if INFO = i, DSPEVX failed to converge; */ /* i eigenvectors failed to converge. Their indices */ /* are stored in array IFAIL. */ /* > N: if INFO = N + i, for 1 <= i <= N, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --bp; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ upper = _starpu_lsame_(uplo, "U"); wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -2; } else if (! (alleig || valeig || indeig)) { *info = -3; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -4; } else if (*n < 0) { *info = -5; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -9; } } else if (indeig) { if (*il < 1) { *info = -10; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -11; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -16; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPGVX", &i__1); return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } /* Form a Cholesky factorization of B. */ _starpu_dpptrf_(uplo, n, &bp[1], info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ _starpu_dspgst_(itype, uplo, n, &ap[1], &bp[1], info); _starpu_dspevx_(jobz, range, uplo, n, &ap[1], vl, vu, il, iu, abstol, m, &w[1], & z__[z_offset], ldz, &work[1], &iwork[1], &ifail[1], info); if (wantz) { /* Backtransform eigenvectors to the original problem. */ if (*info > 0) { *m = *info - 1; } if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } i__1 = *m; for (j = 1; j <= i__1; ++j) { _starpu_dtpsv_(uplo, trans, "Non-unit", n, &bp[1], &z__[j * z_dim1 + 1], &c__1); /* L10: */ } } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } i__1 = *m; for (j = 1; j <= i__1; ++j) { _starpu_dtpmv_(uplo, trans, "Non-unit", n, &bp[1], &z__[j * z_dim1 + 1], &c__1); /* L20: */ } } } return 0; /* End of DSPGVX */ } /* _starpu_dspgvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsposv.c000066400000000000000000000327431413463044200206750ustar00rootroot00000000000000/* dsposv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b10 = -1.; static doublereal c_b11 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu__starpu_dsposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * x, integer *ldx, doublereal *work, real *swork, integer *iter, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, work_dim1, work_offset, x_dim1, x_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__; doublereal cte, eps, anrm; integer ptsa; doublereal rnrm, xnrm; integer ptsx; extern logical _starpu_lsame_(char *, char *); integer iiter; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsymm_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlag2s_(integer *, integer *, doublereal *, integer *, real *, integer *, integer *), _starpu_slag2d_(integer *, integer *, real *, integer *, doublereal *, integer *, integer *), _starpu_dlat2s_(char *, integer *, doublereal *, integer *, real *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dpotrf_(char *, integer *, doublereal *, integer *, integer *), _starpu_dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_spotrf_(char *, integer *, real *, integer *, integer *), _starpu_spotrs_(char *, integer *, integer *, real *, integer *, real *, integer *, integer *); /* -- LAPACK PROTOTYPE driver routine (version 3.1.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. */ /* May 2007 */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPOSV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric positive definite matrix and X and B */ /* are N-by-NRHS matrices. */ /* DSPOSV first attempts to factorize the matrix in SINGLE PRECISION */ /* and use this factorization within an iterative refinement procedure */ /* to produce a solution with DOUBLE PRECISION normwise backward error */ /* quality (see below). If the approach fails the method switches to a */ /* DOUBLE PRECISION factorization and solve. */ /* The iterative refinement is not going to be a winning strategy if */ /* the ratio SINGLE PRECISION performance over DOUBLE PRECISION */ /* performance is too small. A reasonable strategy should take the */ /* number of right-hand sides and the size of the matrix into account. */ /* This might be done with a call to ILAENV in the future. Up to now, we */ /* always try iterative refinement. */ /* The iterative refinement process is stopped if */ /* ITER > ITERMAX */ /* or for all the RHS we have: */ /* RNRM < SQRT(N)*XNRM*ANRM*EPS*BWDMAX */ /* where */ /* o ITER is the number of the current iteration in the iterative */ /* refinement process */ /* o RNRM is the infinity-norm of the residual */ /* o XNRM is the infinity-norm of the solution */ /* o ANRM is the infinity-operator-norm of the matrix A */ /* o EPS is the machine epsilon returned by DLAMCH('Epsilon') */ /* The value ITERMAX and BWDMAX are fixed to 30 and 1.0D+00 */ /* respectively. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input or input/ouptut) DOUBLE PRECISION array, */ /* dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if iterative refinement has been successfully used */ /* (INFO.EQ.0 and ITER.GE.0, see description below), then A is */ /* unchanged, if double precision factorization has been used */ /* (INFO.EQ.0 and ITER.LT.0, see description below), then the */ /* array A contains the factor U or L from the Cholesky */ /* factorization A = U**T*U or A = L*L**T. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The N-by-NRHS right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0, the N-by-NRHS solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N*NRHS) */ /* This array is used to hold the residual vectors. */ /* SWORK (workspace) REAL array, dimension (N*(N+NRHS)) */ /* This array is used to use the single precision matrix and the */ /* right-hand sides or solutions in single precision. */ /* ITER (output) INTEGER */ /* < 0: iterative refinement has failed, double precision */ /* factorization has been performed */ /* -1 : the routine fell back to full precision for */ /* implementation- or machine-specific reasons */ /* -2 : narrowing the precision induced an overflow, */ /* the routine fell back to full precision */ /* -3 : failure of SPOTRF */ /* -31: stop the iterative refinement after the 30th */ /* iterations */ /* > 0: iterative refinement has been sucessfully used. */ /* Returns the number of iterations */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the leading minor of order i of (DOUBLE */ /* PRECISION) A is not positive definite, so the */ /* factorization could not be completed, and the solution */ /* has not been computed. */ /* ========= */ /* .. Parameters .. */ /* .. Local Scalars .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ work_dim1 = *n; work_offset = 1 + work_dim1; work -= work_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --swork; /* Function Body */ *info = 0; *iter = 0; /* Test the input parameters. */ if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldx < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPOSV", &i__1); return 0; } /* Quick return if (N.EQ.0). */ if (*n == 0) { return 0; } /* Skip single precision iterative refinement if a priori slower */ /* than double precision factorization. */ if (FALSE_) { *iter = -1; goto L40; } /* Compute some constants. */ anrm = _starpu_dlansy_("I", uplo, n, &a[a_offset], lda, &work[work_offset]); eps = _starpu_dlamch_("Epsilon"); cte = anrm * eps * sqrt((doublereal) (*n)) * 1.; /* Set the indices PTSA, PTSX for referencing SA and SX in SWORK. */ ptsa = 1; ptsx = ptsa + *n * *n; /* Convert B from double precision to single precision and store the */ /* result in SX. */ _starpu_dlag2s_(n, nrhs, &b[b_offset], ldb, &swork[ptsx], n, info); if (*info != 0) { *iter = -2; goto L40; } /* Convert A from double precision to single precision and store the */ /* result in SA. */ _starpu_dlat2s_(uplo, n, &a[a_offset], lda, &swork[ptsa], n, info); if (*info != 0) { *iter = -2; goto L40; } /* Compute the Cholesky factorization of SA. */ _starpu_spotrf_(uplo, n, &swork[ptsa], n, info); if (*info != 0) { *iter = -3; goto L40; } /* Solve the system SA*SX = SB. */ _starpu_spotrs_(uplo, n, nrhs, &swork[ptsa], n, &swork[ptsx], n, info); /* Convert SX back to double precision */ _starpu_slag2d_(n, nrhs, &swork[ptsx], n, &x[x_offset], ldx, info); /* Compute R = B - AX (R is WORK). */ _starpu_dlacpy_("All", n, nrhs, &b[b_offset], ldb, &work[work_offset], n); _starpu_dsymm_("Left", uplo, n, nrhs, &c_b10, &a[a_offset], lda, &x[x_offset], ldx, &c_b11, &work[work_offset], n); /* Check whether the NRHS normwise backward errors satisfy the */ /* stopping criterion. If yes, set ITER=0 and return. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { xnrm = (d__1 = x[_starpu_idamax_(n, &x[i__ * x_dim1 + 1], &c__1) + i__ * x_dim1], abs(d__1)); rnrm = (d__1 = work[_starpu_idamax_(n, &work[i__ * work_dim1 + 1], &c__1) + i__ * work_dim1], abs(d__1)); if (rnrm > xnrm * cte) { goto L10; } } /* If we are here, the NRHS normwise backward errors satisfy the */ /* stopping criterion. We are good to exit. */ *iter = 0; return 0; L10: for (iiter = 1; iiter <= 30; ++iiter) { /* Convert R (in WORK) from double precision to single precision */ /* and store the result in SX. */ _starpu_dlag2s_(n, nrhs, &work[work_offset], n, &swork[ptsx], n, info); if (*info != 0) { *iter = -2; goto L40; } /* Solve the system SA*SX = SR. */ _starpu_spotrs_(uplo, n, nrhs, &swork[ptsa], n, &swork[ptsx], n, info); /* Convert SX back to double precision and update the current */ /* iterate. */ _starpu_slag2d_(n, nrhs, &swork[ptsx], n, &work[work_offset], n, info); i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_daxpy_(n, &c_b11, &work[i__ * work_dim1 + 1], &c__1, &x[i__ * x_dim1 + 1], &c__1); } /* Compute R = B - AX (R is WORK). */ _starpu_dlacpy_("All", n, nrhs, &b[b_offset], ldb, &work[work_offset], n); _starpu_dsymm_("L", uplo, n, nrhs, &c_b10, &a[a_offset], lda, &x[x_offset], ldx, &c_b11, &work[work_offset], n); /* Check whether the NRHS normwise backward errors satisfy the */ /* stopping criterion. If yes, set ITER=IITER>0 and return. */ i__1 = *nrhs; for (i__ = 1; i__ <= i__1; ++i__) { xnrm = (d__1 = x[_starpu_idamax_(n, &x[i__ * x_dim1 + 1], &c__1) + i__ * x_dim1], abs(d__1)); rnrm = (d__1 = work[_starpu_idamax_(n, &work[i__ * work_dim1 + 1], &c__1) + i__ * work_dim1], abs(d__1)); if (rnrm > xnrm * cte) { goto L20; } } /* If we are here, the NRHS normwise backward errors satisfy the */ /* stopping criterion, we are good to exit. */ *iter = iiter; return 0; L20: /* L30: */ ; } /* If we are at this place of the code, this is because we have */ /* performed ITER=ITERMAX iterations and never satisified the */ /* stopping criterion, set up the ITER flag accordingly and follow */ /* up on double precision routine. */ *iter = -31; L40: /* Single-precision iterative refinement failed to converge to a */ /* satisfactory solution, so we resort to double precision. */ _starpu_dpotrf_(uplo, n, &a[a_offset], lda, info); if (*info != 0) { return 0; } _starpu_dlacpy_("All", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &x[x_offset], ldx, info); return 0; /* End of DSPOSV. */ } /* _starpu__starpu_dsposv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsprfs.c000066400000000000000000000305071413463044200206540ustar00rootroot00000000000000/* dsprfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = -1.; static doublereal c_b14 = 1.; /* Subroutine */ int _starpu_dsprfs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s; integer ik, kk; doublereal xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; extern /* Subroutine */ int _starpu_dspmv_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal lstres; extern /* Subroutine */ int _starpu_dsptrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric indefinite */ /* and packed, and provides error bounds and backward error estimates */ /* for the solution. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangle of the symmetric matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* AFP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The factored form of the matrix A. AFP contains the block */ /* diagonal matrix D and the multipliers used to obtain the */ /* factor U or L from the factorization A = U*D*U**T or */ /* A = L*D*L**T as computed by DSPTRF, stored as a packed */ /* triangular matrix. */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSPTRF. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DSPTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --afp; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -8; } else if (*ldx < max(1,*n)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - A * X */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dspmv_(uplo, n, &c_b12, &ap[1], &x[j * x_dim1 + 1], &c__1, &c_b14, & work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(A)*abs(X) + abs(B). */ kk = 1; if (upper) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); ik = kk; i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[ik], abs(d__1)) * xk; s += (d__1 = ap[ik], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); ++ik; /* L40: */ } work[k] = work[k] + (d__1 = ap[kk + k - 1], abs(d__1)) * xk + s; kk += k; /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); work[k] += (d__1 = ap[kk], abs(d__1)) * xk; ik = kk + 1; i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[ik], abs(d__1)) * xk; s += (d__1 = ap[ik], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); ++ik; /* L60: */ } work[k] += s; kk += *n - k + 1; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dsptrs_(uplo, n, &c__1, &afp[1], &ipiv[1], &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b14, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(A))* */ /* ( abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(A) is the inverse of A */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(A)*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(A)*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(A) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(A'). */ _starpu_dsptrs_(uplo, n, &c__1, &afp[1], &ipiv[1], &work[*n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L110: */ } } else if (kase == 2) { /* Multiply by inv(A)*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L120: */ } _starpu_dsptrs_(uplo, n, &c__1, &afp[1], &ipiv[1], &work[*n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DSPRFS */ } /* _starpu_dsprfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspsv.c000066400000000000000000000140211413463044200205030ustar00rootroot00000000000000/* dspsv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dspsv_(char *uplo, integer *n, integer *nrhs, doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dsptrf_( char *, integer *, doublereal *, integer *, integer *), _starpu_dsptrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPSV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric matrix stored in packed format and X */ /* and B are N-by-NRHS matrices. */ /* The diagonal pivoting method is used to factor A as */ /* A = U * D * U**T, if UPLO = 'U', or */ /* A = L * D * L**T, if UPLO = 'L', */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, D is symmetric and block diagonal with 1-by-1 */ /* and 2-by-2 diagonal blocks. The factored form of A is then used to */ /* solve the system of equations A * X = B. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* See below for further details. */ /* On exit, the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L from the factorization */ /* A = U*D*U**T or A = L*D*L**T as computed by DSPTRF, stored as */ /* a packed triangular matrix in the same storage format as A. */ /* IPIV (output) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D, as */ /* determined by DSPTRF. If IPIV(k) > 0, then rows and columns */ /* k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1 */ /* diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, */ /* then rows and columns k-1 and -IPIV(k) were interchanged and */ /* D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and */ /* IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and */ /* -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 */ /* diagonal block. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, D(i,i) is exactly zero. The factorization */ /* has been completed, but the block diagonal matrix D is */ /* exactly singular, so the solution could not be */ /* computed. */ /* Further Details */ /* =============== */ /* The packed storage scheme is illustrated by the following example */ /* when N = 4, UPLO = 'U': */ /* Two-dimensional storage of the symmetric matrix A: */ /* a11 a12 a13 a14 */ /* a22 a23 a24 */ /* a33 a34 (aij = aji) */ /* a44 */ /* Packed storage of the upper triangle of A: */ /* AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ /* ===================================================================== */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPSV ", &i__1); return 0; } /* Compute the factorization A = U*D*U' or A = L*D*L'. */ _starpu_dsptrf_(uplo, n, &ap[1], &ipiv[1], info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dsptrs_(uplo, n, nrhs, &ap[1], &ipiv[1], &b[b_offset], ldb, info); } return 0; /* End of DSPSV */ } /* _starpu_dspsv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dspsvx.c000066400000000000000000000306621413463044200207040ustar00rootroot00000000000000/* dspsvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dspsvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlansp_(char *, char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dspcon_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dsprfs_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dsptrf_(char *, integer *, doublereal *, integer *, integer *), _starpu_dsptrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPSVX uses the diagonal pivoting factorization A = U*D*U**T or */ /* A = L*D*L**T to compute the solution to a real system of linear */ /* equations A * X = B, where A is an N-by-N symmetric matrix stored */ /* in packed format and X and B are N-by-NRHS matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'N', the diagonal pivoting method is used to factor A as */ /* A = U * D * U**T, if UPLO = 'U', or */ /* A = L * D * L**T, if UPLO = 'L', */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices and D is symmetric and block diagonal with */ /* 1-by-1 and 2-by-2 diagonal blocks. */ /* 2. If some D(i,i)=0, so that D is exactly singular, then the routine */ /* returns with INFO = i. Otherwise, the factored form of A is used */ /* to estimate the condition number of the matrix A. If the */ /* reciprocal of the condition number is less than machine precision, */ /* INFO = N+1 is returned as a warning, but the routine still goes on */ /* to solve for X and compute error bounds as described below. */ /* 3. The system of equations is solved for X using the factored form */ /* of A. */ /* 4. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of A has been */ /* supplied on entry. */ /* = 'F': On entry, AFP and IPIV contain the factored form of */ /* A. AP, AFP and IPIV will not be modified. */ /* = 'N': The matrix A will be copied to AFP and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangle of the symmetric matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* See below for further details. */ /* AFP (input or output) DOUBLE PRECISION array, dimension */ /* (N*(N+1)/2) */ /* If FACT = 'F', then AFP is an input argument and on entry */ /* contains the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L from the factorization */ /* A = U*D*U**T or A = L*D*L**T as computed by DSPTRF, stored as */ /* a packed triangular matrix in the same storage format as A. */ /* If FACT = 'N', then AFP is an output argument and on exit */ /* contains the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L from the factorization */ /* A = U*D*U**T or A = L*D*L**T as computed by DSPTRF, stored as */ /* a packed triangular matrix in the same storage format as A. */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains details of the interchanges and the block structure */ /* of D, as determined by DSPTRF. */ /* If IPIV(k) > 0, then rows and columns k and IPIV(k) were */ /* interchanged and D(k,k) is a 1-by-1 diagonal block. */ /* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and */ /* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) */ /* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = */ /* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were */ /* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains details of the interchanges and the block structure */ /* of D, as determined by DSPTRF. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The N-by-NRHS right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A. If RCOND is less than the machine precision (in */ /* particular, if RCOND = 0), the matrix is singular to working */ /* precision. This condition is indicated by a return code of */ /* INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: D(i,i) is exactly zero. The factorization */ /* has been completed but the factor D is exactly */ /* singular, so the solution and error bounds could */ /* not be computed. RCOND = 0 is returned. */ /* = N+1: D is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* Further Details */ /* =============== */ /* The packed storage scheme is illustrated by the following example */ /* when N = 4, UPLO = 'U': */ /* Two-dimensional storage of the symmetric matrix A: */ /* a11 a12 a13 a14 */ /* a22 a23 a24 */ /* a33 a34 (aij = aji) */ /* a44 */ /* Packed storage of the upper triangle of A: */ /* AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; --afp; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); if (! nofact && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldx < max(1,*n)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPSVX", &i__1); return 0; } if (nofact) { /* Compute the factorization A = U*D*U' or A = L*D*L'. */ i__1 = *n * (*n + 1) / 2; _starpu_dcopy_(&i__1, &ap[1], &c__1, &afp[1], &c__1); _starpu_dsptrf_(uplo, n, &afp[1], &ipiv[1], info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ anorm = _starpu_dlansp_("I", uplo, n, &ap[1], &work[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dspcon_(uplo, n, &afp[1], &ipiv[1], &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution vectors X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dsptrs_(uplo, n, nrhs, &afp[1], &ipiv[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solutions and */ /* compute error bounds and backward error estimates for them. */ _starpu_dsprfs_(uplo, n, nrhs, &ap[1], &afp[1], &ipiv[1], &b[b_offset], ldb, &x[ x_offset], ldx, &ferr[1], &berr[1], &work[1], &iwork[1], info); /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } return 0; /* End of DSPSVX */ } /* _starpu_dspsvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsptrd.c000066400000000000000000000204141413463044200206470ustar00rootroot00000000000000/* dsptrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = 0.; static doublereal c_b14 = -1.; /* Subroutine */ int _starpu_dsptrd_(char *uplo, integer *n, doublereal *ap, doublereal *d__, doublereal *e, doublereal *tau, integer *info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer i__, i1, ii, i1i1; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal taui; extern /* Subroutine */ int _starpu_dspr2_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *); doublereal alpha; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dspmv_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPTRD reduces a real symmetric matrix A stored in packed form to */ /* symmetric tridiagonal form T by an orthogonal similarity */ /* transformation: Q**T * A * Q = T. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, if UPLO = 'U', the diagonal and first superdiagonal */ /* of A are overwritten by the corresponding elements of the */ /* tridiagonal matrix T, and the elements above the first */ /* superdiagonal, with the array TAU, represent the orthogonal */ /* matrix Q as a product of elementary reflectors; if UPLO */ /* = 'L', the diagonal and first subdiagonal of A are over- */ /* written by the corresponding elements of the tridiagonal */ /* matrix T, and the elements below the first subdiagonal, with */ /* the array TAU, represent the orthogonal matrix Q as a product */ /* of elementary reflectors. See Further Details. */ /* D (output) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of the tridiagonal matrix T: */ /* D(i) = A(i,i). */ /* E (output) DOUBLE PRECISION array, dimension (N-1) */ /* The off-diagonal elements of the tridiagonal matrix T: */ /* E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ /* TAU (output) DOUBLE PRECISION array, dimension (N-1) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* If UPLO = 'U', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(n-1) . . . H(2) H(1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in AP, */ /* overwriting A(1:i-1,i+1), and tau is stored in TAU(i). */ /* If UPLO = 'L', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(1) H(2) . . . H(n-1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in AP, */ /* overwriting A(i+2:n,i), and tau is stored in TAU(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ --tau; --e; --d__; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPTRD", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } if (upper) { /* Reduce the upper triangle of A. */ /* I1 is the index in AP of A(1,I+1). */ i1 = *n * (*n - 1) / 2 + 1; for (i__ = *n - 1; i__ >= 1; --i__) { /* Generate elementary reflector H(i) = I - tau * v * v' */ /* to annihilate A(1:i-1,i+1) */ _starpu_dlarfg_(&i__, &ap[i1 + i__ - 1], &ap[i1], &c__1, &taui); e[i__] = ap[i1 + i__ - 1]; if (taui != 0.) { /* Apply H(i) from both sides to A(1:i,1:i) */ ap[i1 + i__ - 1] = 1.; /* Compute y := tau * A * v storing y in TAU(1:i) */ _starpu_dspmv_(uplo, &i__, &taui, &ap[1], &ap[i1], &c__1, &c_b8, &tau[ 1], &c__1); /* Compute w := y - 1/2 * tau * (y'*v) * v */ alpha = taui * -.5 * _starpu_ddot_(&i__, &tau[1], &c__1, &ap[i1], & c__1); _starpu_daxpy_(&i__, &alpha, &ap[i1], &c__1, &tau[1], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w' - w * v' */ _starpu_dspr2_(uplo, &i__, &c_b14, &ap[i1], &c__1, &tau[1], &c__1, & ap[1]); ap[i1 + i__ - 1] = e[i__]; } d__[i__ + 1] = ap[i1 + i__]; tau[i__] = taui; i1 -= i__; /* L10: */ } d__[1] = ap[1]; } else { /* Reduce the lower triangle of A. II is the index in AP of */ /* A(i,i) and I1I1 is the index of A(i+1,i+1). */ ii = 1; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { i1i1 = ii + *n - i__ + 1; /* Generate elementary reflector H(i) = I - tau * v * v' */ /* to annihilate A(i+2:n,i) */ i__2 = *n - i__; _starpu_dlarfg_(&i__2, &ap[ii + 1], &ap[ii + 2], &c__1, &taui); e[i__] = ap[ii + 1]; if (taui != 0.) { /* Apply H(i) from both sides to A(i+1:n,i+1:n) */ ap[ii + 1] = 1.; /* Compute y := tau * A * v storing y in TAU(i:n-1) */ i__2 = *n - i__; _starpu_dspmv_(uplo, &i__2, &taui, &ap[i1i1], &ap[ii + 1], &c__1, & c_b8, &tau[i__], &c__1); /* Compute w := y - 1/2 * tau * (y'*v) * v */ i__2 = *n - i__; alpha = taui * -.5 * _starpu_ddot_(&i__2, &tau[i__], &c__1, &ap[ii + 1], &c__1); i__2 = *n - i__; _starpu_daxpy_(&i__2, &alpha, &ap[ii + 1], &c__1, &tau[i__], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w' - w * v' */ i__2 = *n - i__; _starpu_dspr2_(uplo, &i__2, &c_b14, &ap[ii + 1], &c__1, &tau[i__], & c__1, &ap[i1i1]); ap[ii + 1] = e[i__]; } d__[i__] = ap[ii]; tau[i__] = taui; ii = i1i1; /* L20: */ } d__[*n] = ap[ii]; } return 0; /* End of DSPTRD */ } /* _starpu_dsptrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsptrf.c000066400000000000000000000415641413463044200206620ustar00rootroot00000000000000/* dsptrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dsptrf_(char *uplo, integer *n, doublereal *ap, integer * ipiv, integer *info) { /* System generated locals */ integer i__1, i__2; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal t, r1, d11, d12, d21, d22; integer kc, kk, kp; doublereal wk; integer kx, knc, kpc, npp; doublereal wkm1, wkp1; integer imax, jmax; extern /* Subroutine */ int _starpu_dspr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *); doublereal alpha; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer kstep; logical upper; doublereal absakk; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal colmax, rowmax; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPTRF computes the factorization of a real symmetric matrix A stored */ /* in packed format using the Bunch-Kaufman diagonal pivoting method: */ /* A = U*D*U**T or A = L*D*L**T */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, and D is symmetric and block diagonal with */ /* 1-by-1 and 2-by-2 diagonal blocks. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangle of the symmetric matrix */ /* A, packed columnwise in a linear array. The j-th column of A */ /* is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* On exit, the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L, stored as a packed triangular */ /* matrix overwriting A (see below for further details). */ /* IPIV (output) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D. */ /* If IPIV(k) > 0, then rows and columns k and IPIV(k) were */ /* interchanged and D(k,k) is a 1-by-1 diagonal block. */ /* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and */ /* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) */ /* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = */ /* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were */ /* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, D(i,i) is exactly zero. The factorization */ /* has been completed, but the block diagonal matrix D is */ /* exactly singular, and division by zero will occur if it */ /* is used to solve a system of equations. */ /* Further Details */ /* =============== */ /* 5-96 - Based on modifications by J. Lewis, Boeing Computer Services */ /* Company */ /* If UPLO = 'U', then A = U*D*U', where */ /* U = P(n)*U(n)* ... *P(k)U(k)* ..., */ /* i.e., U is a product of terms P(k)*U(k), where k decreases from n to */ /* 1 in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 */ /* and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as */ /* defined by IPIV(k), and U(k) is a unit upper triangular matrix, such */ /* that if the diagonal block D(k) is of order s (s = 1 or 2), then */ /* ( I v 0 ) k-s */ /* U(k) = ( 0 I 0 ) s */ /* ( 0 0 I ) n-k */ /* k-s s n-k */ /* If s = 1, D(k) overwrites A(k,k), and v overwrites A(1:k-1,k). */ /* If s = 2, the upper triangle of D(k) overwrites A(k-1,k-1), A(k-1,k), */ /* and A(k,k), and v overwrites A(1:k-2,k-1:k). */ /* If UPLO = 'L', then A = L*D*L', where */ /* L = P(1)*L(1)* ... *P(k)*L(k)* ..., */ /* i.e., L is a product of terms P(k)*L(k), where k increases from 1 to */ /* n in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 */ /* and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as */ /* defined by IPIV(k), and L(k) is a unit lower triangular matrix, such */ /* that if the diagonal block D(k) is of order s (s = 1 or 2), then */ /* ( I 0 0 ) k-1 */ /* L(k) = ( 0 I 0 ) s */ /* ( 0 v I ) n-k-s+1 */ /* k-1 s n-k-s+1 */ /* If s = 1, D(k) overwrites A(k,k), and v overwrites A(k+1:n,k). */ /* If s = 2, the lower triangle of D(k) overwrites A(k,k), A(k+1,k), */ /* and A(k+1,k+1), and v overwrites A(k+2:n,k:k+1). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ipiv; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPTRF", &i__1); return 0; } /* Initialize ALPHA for use in choosing pivot block size. */ alpha = (sqrt(17.) + 1.) / 8.; if (upper) { /* Factorize A as U*D*U' using the upper triangle of A */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* 1 or 2 */ k = *n; kc = (*n - 1) * *n / 2 + 1; L10: knc = kc; /* If K < 1, exit from loop */ if (k < 1) { goto L110; } kstep = 1; /* Determine rows and columns to be interchanged and whether */ /* a 1-by-1 or 2-by-2 pivot block will be used */ absakk = (d__1 = ap[kc + k - 1], abs(d__1)); /* IMAX is the row-index of the largest off-diagonal element in */ /* column K, and COLMAX is its absolute value */ if (k > 1) { i__1 = k - 1; imax = _starpu_idamax_(&i__1, &ap[kc], &c__1); colmax = (d__1 = ap[kc + imax - 1], abs(d__1)); } else { colmax = 0.; } if (max(absakk,colmax) == 0.) { /* Column K is zero: set INFO and continue */ if (*info == 0) { *info = k; } kp = k; } else { if (absakk >= alpha * colmax) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else { /* JMAX is the column-index of the largest off-diagonal */ /* element in row IMAX, and ROWMAX is its absolute value */ rowmax = 0.; jmax = imax; kx = imax * (imax + 1) / 2 + imax; i__1 = k; for (j = imax + 1; j <= i__1; ++j) { if ((d__1 = ap[kx], abs(d__1)) > rowmax) { rowmax = (d__1 = ap[kx], abs(d__1)); jmax = j; } kx += j; /* L20: */ } kpc = (imax - 1) * imax / 2 + 1; if (imax > 1) { i__1 = imax - 1; jmax = _starpu_idamax_(&i__1, &ap[kpc], &c__1); /* Computing MAX */ d__2 = rowmax, d__3 = (d__1 = ap[kpc + jmax - 1], abs( d__1)); rowmax = max(d__2,d__3); } if (absakk >= alpha * colmax * (colmax / rowmax)) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else if ((d__1 = ap[kpc + imax - 1], abs(d__1)) >= alpha * rowmax) { /* interchange rows and columns K and IMAX, use 1-by-1 */ /* pivot block */ kp = imax; } else { /* interchange rows and columns K-1 and IMAX, use 2-by-2 */ /* pivot block */ kp = imax; kstep = 2; } } kk = k - kstep + 1; if (kstep == 2) { knc = knc - k + 1; } if (kp != kk) { /* Interchange rows and columns KK and KP in the leading */ /* submatrix A(1:k,1:k) */ i__1 = kp - 1; _starpu_dswap_(&i__1, &ap[knc], &c__1, &ap[kpc], &c__1); kx = kpc + kp - 1; i__1 = kk - 1; for (j = kp + 1; j <= i__1; ++j) { kx = kx + j - 1; t = ap[knc + j - 1]; ap[knc + j - 1] = ap[kx]; ap[kx] = t; /* L30: */ } t = ap[knc + kk - 1]; ap[knc + kk - 1] = ap[kpc + kp - 1]; ap[kpc + kp - 1] = t; if (kstep == 2) { t = ap[kc + k - 2]; ap[kc + k - 2] = ap[kc + kp - 1]; ap[kc + kp - 1] = t; } } /* Update the leading submatrix */ if (kstep == 1) { /* 1-by-1 pivot block D(k): column k now holds */ /* W(k) = U(k)*D(k) */ /* where U(k) is the k-th column of U */ /* Perform a rank-1 update of A(1:k-1,1:k-1) as */ /* A := A - U(k)*D(k)*U(k)' = A - W(k)*1/D(k)*W(k)' */ r1 = 1. / ap[kc + k - 1]; i__1 = k - 1; d__1 = -r1; _starpu_dspr_(uplo, &i__1, &d__1, &ap[kc], &c__1, &ap[1]); /* Store U(k) in column k */ i__1 = k - 1; _starpu_dscal_(&i__1, &r1, &ap[kc], &c__1); } else { /* 2-by-2 pivot block D(k): columns k and k-1 now hold */ /* ( W(k-1) W(k) ) = ( U(k-1) U(k) )*D(k) */ /* where U(k) and U(k-1) are the k-th and (k-1)-th columns */ /* of U */ /* Perform a rank-2 update of A(1:k-2,1:k-2) as */ /* A := A - ( U(k-1) U(k) )*D(k)*( U(k-1) U(k) )' */ /* = A - ( W(k-1) W(k) )*inv(D(k))*( W(k-1) W(k) )' */ if (k > 2) { d12 = ap[k - 1 + (k - 1) * k / 2]; d22 = ap[k - 1 + (k - 2) * (k - 1) / 2] / d12; d11 = ap[k + (k - 1) * k / 2] / d12; t = 1. / (d11 * d22 - 1.); d12 = t / d12; for (j = k - 2; j >= 1; --j) { wkm1 = d12 * (d11 * ap[j + (k - 2) * (k - 1) / 2] - ap[j + (k - 1) * k / 2]); wk = d12 * (d22 * ap[j + (k - 1) * k / 2] - ap[j + (k - 2) * (k - 1) / 2]); for (i__ = j; i__ >= 1; --i__) { ap[i__ + (j - 1) * j / 2] = ap[i__ + (j - 1) * j / 2] - ap[i__ + (k - 1) * k / 2] * wk - ap[ i__ + (k - 2) * (k - 1) / 2] * wkm1; /* L40: */ } ap[j + (k - 1) * k / 2] = wk; ap[j + (k - 2) * (k - 1) / 2] = wkm1; /* L50: */ } } } } /* Store details of the interchanges in IPIV */ if (kstep == 1) { ipiv[k] = kp; } else { ipiv[k] = -kp; ipiv[k - 1] = -kp; } /* Decrease K and return to the start of the main loop */ k -= kstep; kc = knc - k; goto L10; } else { /* Factorize A as L*D*L' using the lower triangle of A */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2 */ k = 1; kc = 1; npp = *n * (*n + 1) / 2; L60: knc = kc; /* If K > N, exit from loop */ if (k > *n) { goto L110; } kstep = 1; /* Determine rows and columns to be interchanged and whether */ /* a 1-by-1 or 2-by-2 pivot block will be used */ absakk = (d__1 = ap[kc], abs(d__1)); /* IMAX is the row-index of the largest off-diagonal element in */ /* column K, and COLMAX is its absolute value */ if (k < *n) { i__1 = *n - k; imax = k + _starpu_idamax_(&i__1, &ap[kc + 1], &c__1); colmax = (d__1 = ap[kc + imax - k], abs(d__1)); } else { colmax = 0.; } if (max(absakk,colmax) == 0.) { /* Column K is zero: set INFO and continue */ if (*info == 0) { *info = k; } kp = k; } else { if (absakk >= alpha * colmax) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else { /* JMAX is the column-index of the largest off-diagonal */ /* element in row IMAX, and ROWMAX is its absolute value */ rowmax = 0.; kx = kc + imax - k; i__1 = imax - 1; for (j = k; j <= i__1; ++j) { if ((d__1 = ap[kx], abs(d__1)) > rowmax) { rowmax = (d__1 = ap[kx], abs(d__1)); jmax = j; } kx = kx + *n - j; /* L70: */ } kpc = npp - (*n - imax + 1) * (*n - imax + 2) / 2 + 1; if (imax < *n) { i__1 = *n - imax; jmax = imax + _starpu_idamax_(&i__1, &ap[kpc + 1], &c__1); /* Computing MAX */ d__2 = rowmax, d__3 = (d__1 = ap[kpc + jmax - imax], abs( d__1)); rowmax = max(d__2,d__3); } if (absakk >= alpha * colmax * (colmax / rowmax)) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else if ((d__1 = ap[kpc], abs(d__1)) >= alpha * rowmax) { /* interchange rows and columns K and IMAX, use 1-by-1 */ /* pivot block */ kp = imax; } else { /* interchange rows and columns K+1 and IMAX, use 2-by-2 */ /* pivot block */ kp = imax; kstep = 2; } } kk = k + kstep - 1; if (kstep == 2) { knc = knc + *n - k + 1; } if (kp != kk) { /* Interchange rows and columns KK and KP in the trailing */ /* submatrix A(k:n,k:n) */ if (kp < *n) { i__1 = *n - kp; _starpu_dswap_(&i__1, &ap[knc + kp - kk + 1], &c__1, &ap[kpc + 1], &c__1); } kx = knc + kp - kk; i__1 = kp - 1; for (j = kk + 1; j <= i__1; ++j) { kx = kx + *n - j + 1; t = ap[knc + j - kk]; ap[knc + j - kk] = ap[kx]; ap[kx] = t; /* L80: */ } t = ap[knc]; ap[knc] = ap[kpc]; ap[kpc] = t; if (kstep == 2) { t = ap[kc + 1]; ap[kc + 1] = ap[kc + kp - k]; ap[kc + kp - k] = t; } } /* Update the trailing submatrix */ if (kstep == 1) { /* 1-by-1 pivot block D(k): column k now holds */ /* W(k) = L(k)*D(k) */ /* where L(k) is the k-th column of L */ if (k < *n) { /* Perform a rank-1 update of A(k+1:n,k+1:n) as */ /* A := A - L(k)*D(k)*L(k)' = A - W(k)*(1/D(k))*W(k)' */ r1 = 1. / ap[kc]; i__1 = *n - k; d__1 = -r1; _starpu_dspr_(uplo, &i__1, &d__1, &ap[kc + 1], &c__1, &ap[kc + *n - k + 1]); /* Store L(k) in column K */ i__1 = *n - k; _starpu_dscal_(&i__1, &r1, &ap[kc + 1], &c__1); } } else { /* 2-by-2 pivot block D(k): columns K and K+1 now hold */ /* ( W(k) W(k+1) ) = ( L(k) L(k+1) )*D(k) */ /* where L(k) and L(k+1) are the k-th and (k+1)-th columns */ /* of L */ if (k < *n - 1) { /* Perform a rank-2 update of A(k+2:n,k+2:n) as */ /* A := A - ( L(k) L(k+1) )*D(k)*( L(k) L(k+1) )' */ /* = A - ( W(k) W(k+1) )*inv(D(k))*( W(k) W(k+1) )' */ d21 = ap[k + 1 + (k - 1) * ((*n << 1) - k) / 2]; d11 = ap[k + 1 + k * ((*n << 1) - k - 1) / 2] / d21; d22 = ap[k + (k - 1) * ((*n << 1) - k) / 2] / d21; t = 1. / (d11 * d22 - 1.); d21 = t / d21; i__1 = *n; for (j = k + 2; j <= i__1; ++j) { wk = d21 * (d11 * ap[j + (k - 1) * ((*n << 1) - k) / 2] - ap[j + k * ((*n << 1) - k - 1) / 2]); wkp1 = d21 * (d22 * ap[j + k * ((*n << 1) - k - 1) / 2] - ap[j + (k - 1) * ((*n << 1) - k) / 2]); i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { ap[i__ + (j - 1) * ((*n << 1) - j) / 2] = ap[i__ + (j - 1) * ((*n << 1) - j) / 2] - ap[i__ + (k - 1) * ((*n << 1) - k) / 2] * wk - ap[i__ + k * ((*n << 1) - k - 1) / 2] * wkp1; /* L90: */ } ap[j + (k - 1) * ((*n << 1) - k) / 2] = wk; ap[j + k * ((*n << 1) - k - 1) / 2] = wkp1; /* L100: */ } } } } /* Store details of the interchanges in IPIV */ if (kstep == 1) { ipiv[k] = kp; } else { ipiv[k] = -kp; ipiv[k + 1] = -kp; } /* Increase K and return to the start of the main loop */ k += kstep; kc = knc + *n - k + 2; goto L60; } L110: return 0; /* End of DSPTRF */ } /* _starpu_dsptrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsptri.c000066400000000000000000000250461413463044200206620ustar00rootroot00000000000000/* dsptri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b11 = -1.; static doublereal c_b13 = 0.; /* Subroutine */ int _starpu_dsptri_(char *uplo, integer *n, doublereal *ap, integer * ipiv, doublereal *work, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ doublereal d__; integer j, k; doublereal t, ak; integer kc, kp, kx, kpc, npp; doublereal akp1; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal temp, akkp1; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer kstep; extern /* Subroutine */ int _starpu_dspmv_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer kcnext; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPTRI computes the inverse of a real symmetric indefinite matrix */ /* A in packed storage using the factorization A = U*D*U**T or */ /* A = L*D*L**T computed by DSPTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the details of the factorization are stored */ /* as an upper or lower triangular matrix. */ /* = 'U': Upper triangular, form is A = U*D*U**T; */ /* = 'L': Lower triangular, form is A = L*D*L**T. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the block diagonal matrix D and the multipliers */ /* used to obtain the factor U or L as computed by DSPTRF, */ /* stored as a packed triangular matrix. */ /* On exit, if INFO = 0, the (symmetric) inverse of the original */ /* matrix, stored as a packed triangular matrix. The j-th column */ /* of inv(A) is stored in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = inv(A)(i,j) for 1<=i<=j; */ /* if UPLO = 'L', */ /* AP(i + (j-1)*(2n-j)/2) = inv(A)(i,j) for j<=i<=n. */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSPTRF. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its */ /* inverse could not be computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --work; --ipiv; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check that the diagonal matrix D is nonsingular. */ if (upper) { /* Upper triangular storage: examine D from bottom to top */ kp = *n * (*n + 1) / 2; for (*info = *n; *info >= 1; --(*info)) { if (ipiv[*info] > 0 && ap[kp] == 0.) { return 0; } kp -= *info; /* L10: */ } } else { /* Lower triangular storage: examine D from top to bottom. */ kp = 1; i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ipiv[*info] > 0 && ap[kp] == 0.) { return 0; } kp = kp + *n - *info + 1; /* L20: */ } } *info = 0; if (upper) { /* Compute inv(A) from the factorization A = U*D*U'. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = 1; kc = 1; L30: /* If K > N, exit from loop. */ if (k > *n) { goto L50; } kcnext = kc + k; if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Invert the diagonal block. */ ap[kc + k - 1] = 1. / ap[kc + k - 1]; /* Compute column K of the inverse. */ if (k > 1) { i__1 = k - 1; _starpu_dcopy_(&i__1, &ap[kc], &c__1, &work[1], &c__1); i__1 = k - 1; _starpu_dspmv_(uplo, &i__1, &c_b11, &ap[1], &work[1], &c__1, &c_b13, & ap[kc], &c__1); i__1 = k - 1; ap[kc + k - 1] -= _starpu_ddot_(&i__1, &work[1], &c__1, &ap[kc], & c__1); } kstep = 1; } else { /* 2 x 2 diagonal block */ /* Invert the diagonal block. */ t = (d__1 = ap[kcnext + k - 1], abs(d__1)); ak = ap[kc + k - 1] / t; akp1 = ap[kcnext + k] / t; akkp1 = ap[kcnext + k - 1] / t; d__ = t * (ak * akp1 - 1.); ap[kc + k - 1] = akp1 / d__; ap[kcnext + k] = ak / d__; ap[kcnext + k - 1] = -akkp1 / d__; /* Compute columns K and K+1 of the inverse. */ if (k > 1) { i__1 = k - 1; _starpu_dcopy_(&i__1, &ap[kc], &c__1, &work[1], &c__1); i__1 = k - 1; _starpu_dspmv_(uplo, &i__1, &c_b11, &ap[1], &work[1], &c__1, &c_b13, & ap[kc], &c__1); i__1 = k - 1; ap[kc + k - 1] -= _starpu_ddot_(&i__1, &work[1], &c__1, &ap[kc], & c__1); i__1 = k - 1; ap[kcnext + k - 1] -= _starpu_ddot_(&i__1, &ap[kc], &c__1, &ap[kcnext] , &c__1); i__1 = k - 1; _starpu_dcopy_(&i__1, &ap[kcnext], &c__1, &work[1], &c__1); i__1 = k - 1; _starpu_dspmv_(uplo, &i__1, &c_b11, &ap[1], &work[1], &c__1, &c_b13, & ap[kcnext], &c__1); i__1 = k - 1; ap[kcnext + k] -= _starpu_ddot_(&i__1, &work[1], &c__1, &ap[kcnext], & c__1); } kstep = 2; kcnext = kcnext + k + 1; } kp = (i__1 = ipiv[k], abs(i__1)); if (kp != k) { /* Interchange rows and columns K and KP in the leading */ /* submatrix A(1:k+1,1:k+1) */ kpc = (kp - 1) * kp / 2 + 1; i__1 = kp - 1; _starpu_dswap_(&i__1, &ap[kc], &c__1, &ap[kpc], &c__1); kx = kpc + kp - 1; i__1 = k - 1; for (j = kp + 1; j <= i__1; ++j) { kx = kx + j - 1; temp = ap[kc + j - 1]; ap[kc + j - 1] = ap[kx]; ap[kx] = temp; /* L40: */ } temp = ap[kc + k - 1]; ap[kc + k - 1] = ap[kpc + kp - 1]; ap[kpc + kp - 1] = temp; if (kstep == 2) { temp = ap[kc + k + k - 1]; ap[kc + k + k - 1] = ap[kc + k + kp - 1]; ap[kc + k + kp - 1] = temp; } } k += kstep; kc = kcnext; goto L30; L50: ; } else { /* Compute inv(A) from the factorization A = L*D*L'. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ npp = *n * (*n + 1) / 2; k = *n; kc = npp; L60: /* If K < 1, exit from loop. */ if (k < 1) { goto L80; } kcnext = kc - (*n - k + 2); if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Invert the diagonal block. */ ap[kc] = 1. / ap[kc]; /* Compute column K of the inverse. */ if (k < *n) { i__1 = *n - k; _starpu_dcopy_(&i__1, &ap[kc + 1], &c__1, &work[1], &c__1); i__1 = *n - k; _starpu_dspmv_(uplo, &i__1, &c_b11, &ap[kc + *n - k + 1], &work[1], & c__1, &c_b13, &ap[kc + 1], &c__1); i__1 = *n - k; ap[kc] -= _starpu_ddot_(&i__1, &work[1], &c__1, &ap[kc + 1], &c__1); } kstep = 1; } else { /* 2 x 2 diagonal block */ /* Invert the diagonal block. */ t = (d__1 = ap[kcnext + 1], abs(d__1)); ak = ap[kcnext] / t; akp1 = ap[kc] / t; akkp1 = ap[kcnext + 1] / t; d__ = t * (ak * akp1 - 1.); ap[kcnext] = akp1 / d__; ap[kc] = ak / d__; ap[kcnext + 1] = -akkp1 / d__; /* Compute columns K-1 and K of the inverse. */ if (k < *n) { i__1 = *n - k; _starpu_dcopy_(&i__1, &ap[kc + 1], &c__1, &work[1], &c__1); i__1 = *n - k; _starpu_dspmv_(uplo, &i__1, &c_b11, &ap[kc + (*n - k + 1)], &work[1], &c__1, &c_b13, &ap[kc + 1], &c__1); i__1 = *n - k; ap[kc] -= _starpu_ddot_(&i__1, &work[1], &c__1, &ap[kc + 1], &c__1); i__1 = *n - k; ap[kcnext + 1] -= _starpu_ddot_(&i__1, &ap[kc + 1], &c__1, &ap[kcnext + 2], &c__1); i__1 = *n - k; _starpu_dcopy_(&i__1, &ap[kcnext + 2], &c__1, &work[1], &c__1); i__1 = *n - k; _starpu_dspmv_(uplo, &i__1, &c_b11, &ap[kc + (*n - k + 1)], &work[1], &c__1, &c_b13, &ap[kcnext + 2], &c__1); i__1 = *n - k; ap[kcnext] -= _starpu_ddot_(&i__1, &work[1], &c__1, &ap[kcnext + 2], & c__1); } kstep = 2; kcnext -= *n - k + 3; } kp = (i__1 = ipiv[k], abs(i__1)); if (kp != k) { /* Interchange rows and columns K and KP in the trailing */ /* submatrix A(k-1:n,k-1:n) */ kpc = npp - (*n - kp + 1) * (*n - kp + 2) / 2 + 1; if (kp < *n) { i__1 = *n - kp; _starpu_dswap_(&i__1, &ap[kc + kp - k + 1], &c__1, &ap[kpc + 1], & c__1); } kx = kc + kp - k; i__1 = kp - 1; for (j = k + 1; j <= i__1; ++j) { kx = kx + *n - j + 1; temp = ap[kc + j - k]; ap[kc + j - k] = ap[kx]; ap[kx] = temp; /* L70: */ } temp = ap[kc]; ap[kc] = ap[kpc]; ap[kpc] = temp; if (kstep == 2) { temp = ap[kc - *n + k - 1]; ap[kc - *n + k - 1] = ap[kc - *n + kp - 1]; ap[kc - *n + kp - 1] = temp; } } k -= kstep; kc = kcnext; goto L60; L80: ; } return 0; /* End of DSPTRI */ } /* _starpu_dsptri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsptrs.c000066400000000000000000000272711413463044200206760ustar00rootroot00000000000000/* dsptrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = -1.; static integer c__1 = 1; static doublereal c_b19 = 1.; /* Subroutine */ int _starpu_dsptrs_(char *uplo, integer *n, integer *nrhs, doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer * info) { /* System generated locals */ integer b_dim1, b_offset, i__1; doublereal d__1; /* Local variables */ integer j, k; doublereal ak, bk; integer kc, kp; doublereal akm1, bkm1; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal akm1k; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal denom; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSPTRS solves a system of linear equations A*X = B with a real */ /* symmetric matrix A stored in packed format using the factorization */ /* A = U*D*U**T or A = L*D*L**T computed by DSPTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the details of the factorization are stored */ /* as an upper or lower triangular matrix. */ /* = 'U': Upper triangular, form is A = U*D*U**T; */ /* = 'L': Lower triangular, form is A = L*D*L**T. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSPTRF, stored as a */ /* packed triangular matrix. */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSPTRF. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --ap; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSPTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (upper) { /* Solve A*X = B, where A = U*D*U'. */ /* First solve U*D*X = B, overwriting B with X. */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = *n; kc = *n * (*n + 1) / 2 + 1; L10: /* If K < 1, exit from loop. */ if (k < 1) { goto L30; } kc -= k; if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(U(K)), where U(K) is the transformation */ /* stored in column K of A. */ i__1 = k - 1; _starpu_dger_(&i__1, nrhs, &c_b7, &ap[kc], &c__1, &b[k + b_dim1], ldb, &b[ b_dim1 + 1], ldb); /* Multiply by the inverse of the diagonal block. */ d__1 = 1. / ap[kc + k - 1]; _starpu_dscal_(nrhs, &d__1, &b[k + b_dim1], ldb); --k; } else { /* 2 x 2 diagonal block */ /* Interchange rows K-1 and -IPIV(K). */ kp = -ipiv[k]; if (kp != k - 1) { _starpu_dswap_(nrhs, &b[k - 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(U(K)), where U(K) is the transformation */ /* stored in columns K-1 and K of A. */ i__1 = k - 2; _starpu_dger_(&i__1, nrhs, &c_b7, &ap[kc], &c__1, &b[k + b_dim1], ldb, &b[ b_dim1 + 1], ldb); i__1 = k - 2; _starpu_dger_(&i__1, nrhs, &c_b7, &ap[kc - (k - 1)], &c__1, &b[k - 1 + b_dim1], ldb, &b[b_dim1 + 1], ldb); /* Multiply by the inverse of the diagonal block. */ akm1k = ap[kc + k - 2]; akm1 = ap[kc - 1] / akm1k; ak = ap[kc + k - 1] / akm1k; denom = akm1 * ak - 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { bkm1 = b[k - 1 + j * b_dim1] / akm1k; bk = b[k + j * b_dim1] / akm1k; b[k - 1 + j * b_dim1] = (ak * bkm1 - bk) / denom; b[k + j * b_dim1] = (akm1 * bk - bkm1) / denom; /* L20: */ } kc = kc - k + 1; k += -2; } goto L10; L30: /* Next solve U'*X = B, overwriting B with X. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = 1; kc = 1; L40: /* If K > N, exit from loop. */ if (k > *n) { goto L50; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Multiply by inv(U'(K)), where U(K) is the transformation */ /* stored in column K of A. */ i__1 = k - 1; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &ap[kc] , &c__1, &c_b19, &b[k + b_dim1], ldb); /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } kc += k; ++k; } else { /* 2 x 2 diagonal block */ /* Multiply by inv(U'(K+1)), where U(K+1) is the transformation */ /* stored in columns K and K+1 of A. */ i__1 = k - 1; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &ap[kc] , &c__1, &c_b19, &b[k + b_dim1], ldb); i__1 = k - 1; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &ap[kc + k], &c__1, &c_b19, &b[k + 1 + b_dim1], ldb); /* Interchange rows K and -IPIV(K). */ kp = -ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } kc = kc + (k << 1) + 1; k += 2; } goto L40; L50: ; } else { /* Solve A*X = B, where A = L*D*L'. */ /* First solve L*D*X = B, overwriting B with X. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = 1; kc = 1; L60: /* If K > N, exit from loop. */ if (k > *n) { goto L80; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(L(K)), where L(K) is the transformation */ /* stored in column K of A. */ if (k < *n) { i__1 = *n - k; _starpu_dger_(&i__1, nrhs, &c_b7, &ap[kc + 1], &c__1, &b[k + b_dim1], ldb, &b[k + 1 + b_dim1], ldb); } /* Multiply by the inverse of the diagonal block. */ d__1 = 1. / ap[kc]; _starpu_dscal_(nrhs, &d__1, &b[k + b_dim1], ldb); kc = kc + *n - k + 1; ++k; } else { /* 2 x 2 diagonal block */ /* Interchange rows K+1 and -IPIV(K). */ kp = -ipiv[k]; if (kp != k + 1) { _starpu_dswap_(nrhs, &b[k + 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(L(K)), where L(K) is the transformation */ /* stored in columns K and K+1 of A. */ if (k < *n - 1) { i__1 = *n - k - 1; _starpu_dger_(&i__1, nrhs, &c_b7, &ap[kc + 2], &c__1, &b[k + b_dim1], ldb, &b[k + 2 + b_dim1], ldb); i__1 = *n - k - 1; _starpu_dger_(&i__1, nrhs, &c_b7, &ap[kc + *n - k + 2], &c__1, &b[k + 1 + b_dim1], ldb, &b[k + 2 + b_dim1], ldb); } /* Multiply by the inverse of the diagonal block. */ akm1k = ap[kc + 1]; akm1 = ap[kc] / akm1k; ak = ap[kc + *n - k + 1] / akm1k; denom = akm1 * ak - 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { bkm1 = b[k + j * b_dim1] / akm1k; bk = b[k + 1 + j * b_dim1] / akm1k; b[k + j * b_dim1] = (ak * bkm1 - bk) / denom; b[k + 1 + j * b_dim1] = (akm1 * bk - bkm1) / denom; /* L70: */ } kc = kc + (*n - k << 1) + 1; k += 2; } goto L60; L80: /* Next solve L'*X = B, overwriting B with X. */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = *n; kc = *n * (*n + 1) / 2 + 1; L90: /* If K < 1, exit from loop. */ if (k < 1) { goto L100; } kc -= *n - k + 1; if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Multiply by inv(L'(K)), where L(K) is the transformation */ /* stored in column K of A. */ if (k < *n) { i__1 = *n - k; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, &ap[kc + 1], &c__1, &c_b19, &b[k + b_dim1], ldb); } /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } --k; } else { /* 2 x 2 diagonal block */ /* Multiply by inv(L'(K-1)), where L(K-1) is the transformation */ /* stored in columns K-1 and K of A. */ if (k < *n) { i__1 = *n - k; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, &ap[kc + 1], &c__1, &c_b19, &b[k + b_dim1], ldb); i__1 = *n - k; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, &ap[kc - (*n - k)], &c__1, &c_b19, &b[k - 1 + b_dim1], ldb); } /* Interchange rows K and -IPIV(K). */ kp = -ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } kc -= *n - k + 2; k += -2; } goto L90; L100: ; } return 0; /* End of DSPTRS */ } /* _starpu_dsptrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstebz.c000066400000000000000000000522101413463044200206410ustar00rootroot00000000000000/* dstebz.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static integer c__0 = 0; /* Subroutine */ int _starpu_dstebz_(char *range, char *order, integer *n, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, doublereal *d__, doublereal *e, integer *m, integer *nsplit, doublereal *w, integer *iblock, integer *isplit, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ double sqrt(doublereal), log(doublereal); /* Local variables */ integer j, ib, jb, ie, je, nb; doublereal gl; integer im, in; doublereal gu; integer iw; doublereal wl, wu; integer nwl; doublereal ulp, wlu, wul; integer nwu; doublereal tmp1, tmp2; integer iend, ioff, iout, itmp1, jdisc; extern logical _starpu_lsame_(char *, char *); integer iinfo; doublereal atoli; integer iwoff; doublereal bnorm; integer itmax; doublereal wkill, rtoli, tnorm; extern doublereal _starpu_dlamch_(char *); integer ibegin; extern /* Subroutine */ int _starpu_dlaebz_(integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer irange, idiscl; doublereal safemn; integer idumma[1]; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer idiscu, iorder; logical ncnvrg; doublereal pivmin; logical toofew; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* 8-18-00: Increase FUDGE factor for T3E (eca) */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEBZ computes the eigenvalues of a symmetric tridiagonal */ /* matrix T. The user may ask for all eigenvalues, all eigenvalues */ /* in the half-open interval (VL, VU], or the IL-th through IU-th */ /* eigenvalues. */ /* To avoid overflow, the matrix must be scaled so that its */ /* largest element is no greater than overflow**(1/2) * */ /* underflow**(1/4) in absolute value, and for greatest */ /* accuracy, it should not be much smaller than that. */ /* See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal */ /* Matrix", Report CS41, Computer Science Dept., Stanford */ /* University, July 21, 1966. */ /* Arguments */ /* ========= */ /* RANGE (input) CHARACTER*1 */ /* = 'A': ("All") all eigenvalues will be found. */ /* = 'V': ("Value") all eigenvalues in the half-open interval */ /* (VL, VU] will be found. */ /* = 'I': ("Index") the IL-th through IU-th eigenvalues (of the */ /* entire matrix) will be found. */ /* ORDER (input) CHARACTER*1 */ /* = 'B': ("By Block") the eigenvalues will be grouped by */ /* split-off block (see IBLOCK, ISPLIT) and */ /* ordered from smallest to largest within */ /* the block. */ /* = 'E': ("Entire matrix") */ /* the eigenvalues for the entire matrix */ /* will be ordered from smallest to */ /* largest. */ /* N (input) INTEGER */ /* The order of the tridiagonal matrix T. N >= 0. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. Eigenvalues less than or equal */ /* to VL, or greater than VU, will not be returned. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute tolerance for the eigenvalues. An eigenvalue */ /* (or cluster) is considered to be located if it has been */ /* determined to lie in an interval whose width is ABSTOL or */ /* less. If ABSTOL is less than or equal to zero, then ULP*|T| */ /* will be used, where |T| means the 1-norm of T. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the tridiagonal matrix T. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) off-diagonal elements of the tridiagonal matrix T. */ /* M (output) INTEGER */ /* The actual number of eigenvalues found. 0 <= M <= N. */ /* (See also the description of INFO=2,3.) */ /* NSPLIT (output) INTEGER */ /* The number of diagonal blocks in the matrix T. */ /* 1 <= NSPLIT <= N. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, the first M elements of W will contain the */ /* eigenvalues. (DSTEBZ may use the remaining N-M elements as */ /* workspace.) */ /* IBLOCK (output) INTEGER array, dimension (N) */ /* At each row/column j where E(j) is zero or small, the */ /* matrix T is considered to split into a block diagonal */ /* matrix. On exit, if INFO = 0, IBLOCK(i) specifies to which */ /* block (from 1 to the number of blocks) the eigenvalue W(i) */ /* belongs. (DSTEBZ may use the remaining N-M elements as */ /* workspace.) */ /* ISPLIT (output) INTEGER array, dimension (N) */ /* The splitting points, at which T breaks up into submatrices. */ /* The first submatrix consists of rows/columns 1 to ISPLIT(1), */ /* the second of rows/columns ISPLIT(1)+1 through ISPLIT(2), */ /* etc., and the NSPLIT-th consists of rows/columns */ /* ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N. */ /* (Only the first NSPLIT elements will actually be used, but */ /* since the user cannot know a priori what value NSPLIT will */ /* have, N words must be reserved for ISPLIT.) */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: some or all of the eigenvalues failed to converge or */ /* were not computed: */ /* =1 or 3: Bisection failed to converge for some */ /* eigenvalues; these eigenvalues are flagged by a */ /* negative block number. The effect is that the */ /* eigenvalues may not be as accurate as the */ /* absolute and relative tolerances. This is */ /* generally caused by unexpectedly inaccurate */ /* arithmetic. */ /* =2 or 3: RANGE='I' only: Not all of the eigenvalues */ /* IL:IU were found. */ /* Effect: M < IU+1-IL */ /* Cause: non-monotonic arithmetic, causing the */ /* Sturm sequence to be non-monotonic. */ /* Cure: recalculate, using RANGE='A', and pick */ /* out eigenvalues IL:IU. In some cases, */ /* increasing the PARAMETER "FUDGE" may */ /* make things work. */ /* = 4: RANGE='I', and the Gershgorin interval */ /* initially used was too small. No eigenvalues */ /* were computed. */ /* Probable cause: your machine has sloppy */ /* floating-point arithmetic. */ /* Cure: Increase the PARAMETER "FUDGE", */ /* recompile, and try again. */ /* Internal Parameters */ /* =================== */ /* RELFAC DOUBLE PRECISION, default = 2.0e0 */ /* The relative tolerance. An interval (a,b] lies within */ /* "relative tolerance" if b-a < RELFAC*ulp*max(|a|,|b|), */ /* where "ulp" is the machine precision (distance from 1 to */ /* the next larger floating point number.) */ /* FUDGE DOUBLE PRECISION, default = 2 */ /* A "fudge factor" to widen the Gershgorin intervals. Ideally, */ /* a value of 1 should work, but on machines with sloppy */ /* arithmetic, this needs to be larger. The default for */ /* publicly released versions should be large enough to handle */ /* the worst machine around. Note that this has no effect */ /* on accuracy of the solution. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --iwork; --work; --isplit; --iblock; --w; --e; --d__; /* Function Body */ *info = 0; /* Decode RANGE */ if (_starpu_lsame_(range, "A")) { irange = 1; } else if (_starpu_lsame_(range, "V")) { irange = 2; } else if (_starpu_lsame_(range, "I")) { irange = 3; } else { irange = 0; } /* Decode ORDER */ if (_starpu_lsame_(order, "B")) { iorder = 2; } else if (_starpu_lsame_(order, "E")) { iorder = 1; } else { iorder = 0; } /* Check for Errors */ if (irange <= 0) { *info = -1; } else if (iorder <= 0) { *info = -2; } else if (*n < 0) { *info = -3; } else if (irange == 2) { if (*vl >= *vu) { *info = -5; } } else if (irange == 3 && (*il < 1 || *il > max(1,*n))) { *info = -6; } else if (irange == 3 && (*iu < min(*n,*il) || *iu > *n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEBZ", &i__1); return 0; } /* Initialize error flags */ *info = 0; ncnvrg = FALSE_; toofew = FALSE_; /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } /* Simplifications: */ if (irange == 3 && *il == 1 && *iu == *n) { irange = 1; } /* Get machine constants */ /* NB is the minimum vector length for vector bisection, or 0 */ /* if only scalar is to be done. */ safemn = _starpu_dlamch_("S"); ulp = _starpu_dlamch_("P"); rtoli = ulp * 2.; nb = _starpu_ilaenv_(&c__1, "DSTEBZ", " ", n, &c_n1, &c_n1, &c_n1); if (nb <= 1) { nb = 0; } /* Special Case when N=1 */ if (*n == 1) { *nsplit = 1; isplit[1] = 1; if (irange == 2 && (*vl >= d__[1] || *vu < d__[1])) { *m = 0; } else { w[1] = d__[1]; iblock[1] = 1; *m = 1; } return 0; } /* Compute Splitting Points */ *nsplit = 1; work[*n] = 0.; pivmin = 1.; /* DIR$ NOVECTOR */ i__1 = *n; for (j = 2; j <= i__1; ++j) { /* Computing 2nd power */ d__1 = e[j - 1]; tmp1 = d__1 * d__1; /* Computing 2nd power */ d__2 = ulp; if ((d__1 = d__[j] * d__[j - 1], abs(d__1)) * (d__2 * d__2) + safemn > tmp1) { isplit[*nsplit] = j - 1; ++(*nsplit); work[j - 1] = 0.; } else { work[j - 1] = tmp1; pivmin = max(pivmin,tmp1); } /* L10: */ } isplit[*nsplit] = *n; pivmin *= safemn; /* Compute Interval and ATOLI */ if (irange == 3) { /* RANGE='I': Compute the interval containing eigenvalues */ /* IL through IU. */ /* Compute Gershgorin interval for entire (split) matrix */ /* and use it as the initial interval */ gu = d__[1]; gl = d__[1]; tmp1 = 0.; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { tmp2 = sqrt(work[j]); /* Computing MAX */ d__1 = gu, d__2 = d__[j] + tmp1 + tmp2; gu = max(d__1,d__2); /* Computing MIN */ d__1 = gl, d__2 = d__[j] - tmp1 - tmp2; gl = min(d__1,d__2); tmp1 = tmp2; /* L20: */ } /* Computing MAX */ d__1 = gu, d__2 = d__[*n] + tmp1; gu = max(d__1,d__2); /* Computing MIN */ d__1 = gl, d__2 = d__[*n] - tmp1; gl = min(d__1,d__2); /* Computing MAX */ d__1 = abs(gl), d__2 = abs(gu); tnorm = max(d__1,d__2); gl = gl - tnorm * 2.1 * ulp * *n - pivmin * 4.2000000000000002; gu = gu + tnorm * 2.1 * ulp * *n + pivmin * 2.1; /* Compute Iteration parameters */ itmax = (integer) ((log(tnorm + pivmin) - log(pivmin)) / log(2.)) + 2; if (*abstol <= 0.) { atoli = ulp * tnorm; } else { atoli = *abstol; } work[*n + 1] = gl; work[*n + 2] = gl; work[*n + 3] = gu; work[*n + 4] = gu; work[*n + 5] = gl; work[*n + 6] = gu; iwork[1] = -1; iwork[2] = -1; iwork[3] = *n + 1; iwork[4] = *n + 1; iwork[5] = *il - 1; iwork[6] = *iu; _starpu_dlaebz_(&c__3, &itmax, n, &c__2, &c__2, &nb, &atoli, &rtoli, &pivmin, &d__[1], &e[1], &work[1], &iwork[5], &work[*n + 1], &work[*n + 5], &iout, &iwork[1], &w[1], &iblock[1], &iinfo); if (iwork[6] == *iu) { wl = work[*n + 1]; wlu = work[*n + 3]; nwl = iwork[1]; wu = work[*n + 4]; wul = work[*n + 2]; nwu = iwork[4]; } else { wl = work[*n + 2]; wlu = work[*n + 4]; nwl = iwork[2]; wu = work[*n + 3]; wul = work[*n + 1]; nwu = iwork[3]; } if (nwl < 0 || nwl >= *n || nwu < 1 || nwu > *n) { *info = 4; return 0; } } else { /* RANGE='A' or 'V' -- Set ATOLI */ /* Computing MAX */ d__3 = abs(d__[1]) + abs(e[1]), d__4 = (d__1 = d__[*n], abs(d__1)) + ( d__2 = e[*n - 1], abs(d__2)); tnorm = max(d__3,d__4); i__1 = *n - 1; for (j = 2; j <= i__1; ++j) { /* Computing MAX */ d__4 = tnorm, d__5 = (d__1 = d__[j], abs(d__1)) + (d__2 = e[j - 1] , abs(d__2)) + (d__3 = e[j], abs(d__3)); tnorm = max(d__4,d__5); /* L30: */ } if (*abstol <= 0.) { atoli = ulp * tnorm; } else { atoli = *abstol; } if (irange == 2) { wl = *vl; wu = *vu; } else { wl = 0.; wu = 0.; } } /* Find Eigenvalues -- Loop Over Blocks and recompute NWL and NWU. */ /* NWL accumulates the number of eigenvalues .le. WL, */ /* NWU accumulates the number of eigenvalues .le. WU */ *m = 0; iend = 0; *info = 0; nwl = 0; nwu = 0; i__1 = *nsplit; for (jb = 1; jb <= i__1; ++jb) { ioff = iend; ibegin = ioff + 1; iend = isplit[jb]; in = iend - ioff; if (in == 1) { /* Special Case -- IN=1 */ if (irange == 1 || wl >= d__[ibegin] - pivmin) { ++nwl; } if (irange == 1 || wu >= d__[ibegin] - pivmin) { ++nwu; } if (irange == 1 || wl < d__[ibegin] - pivmin && wu >= d__[ibegin] - pivmin) { ++(*m); w[*m] = d__[ibegin]; iblock[*m] = jb; } } else { /* General Case -- IN > 1 */ /* Compute Gershgorin Interval */ /* and use it as the initial interval */ gu = d__[ibegin]; gl = d__[ibegin]; tmp1 = 0.; i__2 = iend - 1; for (j = ibegin; j <= i__2; ++j) { tmp2 = (d__1 = e[j], abs(d__1)); /* Computing MAX */ d__1 = gu, d__2 = d__[j] + tmp1 + tmp2; gu = max(d__1,d__2); /* Computing MIN */ d__1 = gl, d__2 = d__[j] - tmp1 - tmp2; gl = min(d__1,d__2); tmp1 = tmp2; /* L40: */ } /* Computing MAX */ d__1 = gu, d__2 = d__[iend] + tmp1; gu = max(d__1,d__2); /* Computing MIN */ d__1 = gl, d__2 = d__[iend] - tmp1; gl = min(d__1,d__2); /* Computing MAX */ d__1 = abs(gl), d__2 = abs(gu); bnorm = max(d__1,d__2); gl = gl - bnorm * 2.1 * ulp * in - pivmin * 2.1; gu = gu + bnorm * 2.1 * ulp * in + pivmin * 2.1; /* Compute ATOLI for the current submatrix */ if (*abstol <= 0.) { /* Computing MAX */ d__1 = abs(gl), d__2 = abs(gu); atoli = ulp * max(d__1,d__2); } else { atoli = *abstol; } if (irange > 1) { if (gu < wl) { nwl += in; nwu += in; goto L70; } gl = max(gl,wl); gu = min(gu,wu); if (gl >= gu) { goto L70; } } /* Set Up Initial Interval */ work[*n + 1] = gl; work[*n + in + 1] = gu; _starpu_dlaebz_(&c__1, &c__0, &in, &in, &c__1, &nb, &atoli, &rtoli, & pivmin, &d__[ibegin], &e[ibegin], &work[ibegin], idumma, & work[*n + 1], &work[*n + (in << 1) + 1], &im, &iwork[1], & w[*m + 1], &iblock[*m + 1], &iinfo); nwl += iwork[1]; nwu += iwork[in + 1]; iwoff = *m - iwork[1]; /* Compute Eigenvalues */ itmax = (integer) ((log(gu - gl + pivmin) - log(pivmin)) / log(2.) ) + 2; _starpu_dlaebz_(&c__2, &itmax, &in, &in, &c__1, &nb, &atoli, &rtoli, & pivmin, &d__[ibegin], &e[ibegin], &work[ibegin], idumma, & work[*n + 1], &work[*n + (in << 1) + 1], &iout, &iwork[1], &w[*m + 1], &iblock[*m + 1], &iinfo); /* Copy Eigenvalues Into W and IBLOCK */ /* Use -JB for block number for unconverged eigenvalues. */ i__2 = iout; for (j = 1; j <= i__2; ++j) { tmp1 = (work[j + *n] + work[j + in + *n]) * .5; /* Flag non-convergence. */ if (j > iout - iinfo) { ncnvrg = TRUE_; ib = -jb; } else { ib = jb; } i__3 = iwork[j + in] + iwoff; for (je = iwork[j] + 1 + iwoff; je <= i__3; ++je) { w[je] = tmp1; iblock[je] = ib; /* L50: */ } /* L60: */ } *m += im; } L70: ; } /* If RANGE='I', then (WL,WU) contains eigenvalues NWL+1,...,NWU */ /* If NWL+1 < IL or NWU > IU, discard extra eigenvalues. */ if (irange == 3) { im = 0; idiscl = *il - 1 - nwl; idiscu = nwu - *iu; if (idiscl > 0 || idiscu > 0) { i__1 = *m; for (je = 1; je <= i__1; ++je) { if (w[je] <= wlu && idiscl > 0) { --idiscl; } else if (w[je] >= wul && idiscu > 0) { --idiscu; } else { ++im; w[im] = w[je]; iblock[im] = iblock[je]; } /* L80: */ } *m = im; } if (idiscl > 0 || idiscu > 0) { /* Code to deal with effects of bad arithmetic: */ /* Some low eigenvalues to be discarded are not in (WL,WLU], */ /* or high eigenvalues to be discarded are not in (WUL,WU] */ /* so just kill off the smallest IDISCL/largest IDISCU */ /* eigenvalues, by simply finding the smallest/largest */ /* eigenvalue(s). */ /* (If N(w) is monotone non-decreasing, this should never */ /* happen.) */ if (idiscl > 0) { wkill = wu; i__1 = idiscl; for (jdisc = 1; jdisc <= i__1; ++jdisc) { iw = 0; i__2 = *m; for (je = 1; je <= i__2; ++je) { if (iblock[je] != 0 && (w[je] < wkill || iw == 0)) { iw = je; wkill = w[je]; } /* L90: */ } iblock[iw] = 0; /* L100: */ } } if (idiscu > 0) { wkill = wl; i__1 = idiscu; for (jdisc = 1; jdisc <= i__1; ++jdisc) { iw = 0; i__2 = *m; for (je = 1; je <= i__2; ++je) { if (iblock[je] != 0 && (w[je] > wkill || iw == 0)) { iw = je; wkill = w[je]; } /* L110: */ } iblock[iw] = 0; /* L120: */ } } im = 0; i__1 = *m; for (je = 1; je <= i__1; ++je) { if (iblock[je] != 0) { ++im; w[im] = w[je]; iblock[im] = iblock[je]; } /* L130: */ } *m = im; } if (idiscl < 0 || idiscu < 0) { toofew = TRUE_; } } /* If ORDER='B', do nothing -- the eigenvalues are already sorted */ /* by block. */ /* If ORDER='E', sort the eigenvalues from smallest to largest */ if (iorder == 1 && *nsplit > 1) { i__1 = *m - 1; for (je = 1; je <= i__1; ++je) { ie = 0; tmp1 = w[je]; i__2 = *m; for (j = je + 1; j <= i__2; ++j) { if (w[j] < tmp1) { ie = j; tmp1 = w[j]; } /* L140: */ } if (ie != 0) { itmp1 = iblock[ie]; w[ie] = w[je]; iblock[ie] = iblock[je]; w[je] = tmp1; iblock[je] = itmp1; } /* L150: */ } } *info = 0; if (ncnvrg) { ++(*info); } if (toofew) { *info += 2; } return 0; /* End of DSTEBZ */ } /* _starpu_dstebz_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstedc.c000066400000000000000000000364011413463044200206200ustar00rootroot00000000000000/* dstedc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__9 = 9; static integer c__0 = 0; static integer c__2 = 2; static doublereal c_b17 = 0.; static doublereal c_b18 = 1.; static integer c__1 = 1; /* Subroutine */ int _starpu_dstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double log(doublereal); integer pow_ii(integer *, integer *); double sqrt(doublereal); /* Local variables */ integer i__, j, k, m; doublereal p; integer ii, lgn; doublereal eps, tiny; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer lwmin; extern /* Subroutine */ int _starpu_dlaed0_(integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer start; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer finish; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *), _starpu_dlasrt_(char *, integer *, doublereal *, integer *); integer liwmin, icompz; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal orgnrm; logical lquery; integer smlsiz, storez, strtrw; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEDC computes all eigenvalues and, optionally, eigenvectors of a */ /* symmetric tridiagonal matrix using the divide and conquer method. */ /* The eigenvectors of a full or band real symmetric matrix can also be */ /* found if DSYTRD or DSPTRD or DSBTRD has been used to reduce this */ /* matrix to tridiagonal form. */ /* This code makes very mild assumptions about floating point */ /* arithmetic. It will work on machines with a guard digit in */ /* add/subtract, or on those binary machines without guard digits */ /* which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ /* It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. See DLAED3 for details. */ /* Arguments */ /* ========= */ /* COMPZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only. */ /* = 'I': Compute eigenvectors of tridiagonal matrix also. */ /* = 'V': Compute eigenvectors of original dense symmetric */ /* matrix also. On entry, Z contains the orthogonal */ /* matrix used to reduce the original matrix to */ /* tridiagonal form. */ /* N (input) INTEGER */ /* The dimension of the symmetric tridiagonal matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the diagonal elements of the tridiagonal matrix. */ /* On exit, if INFO = 0, the eigenvalues in ascending order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the subdiagonal elements of the tridiagonal matrix. */ /* On exit, E has been destroyed. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* On entry, if COMPZ = 'V', then Z contains the orthogonal */ /* matrix used in the reduction to tridiagonal form. */ /* On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ /* orthonormal eigenvectors of the original symmetric matrix, */ /* and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ /* of the symmetric tridiagonal matrix. */ /* If COMPZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1. */ /* If eigenvectors are desired, then LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, */ /* dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If COMPZ = 'N' or N <= 1 then LWORK must be at least 1. */ /* If COMPZ = 'V' and N > 1 then LWORK must be at least */ /* ( 1 + 3*N + 2*N*lg N + 3*N**2 ), */ /* where lg( N ) = smallest integer k such */ /* that 2**k >= N. */ /* If COMPZ = 'I' and N > 1 then LWORK must be at least */ /* ( 1 + 4*N + N**2 ). */ /* Note that for COMPZ = 'I' or 'V', then if N is less than or */ /* equal to the minimum divide size, usually 25, then LWORK need */ /* only be max(1,2*(N-1)). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If COMPZ = 'N' or N <= 1 then LIWORK must be at least 1. */ /* If COMPZ = 'V' and N > 1 then LIWORK must be at least */ /* ( 6 + 6*N + 5*N*lg N ). */ /* If COMPZ = 'I' and N > 1 then LIWORK must be at least */ /* ( 3 + 5*N ). */ /* Note that for COMPZ = 'I' or 'V', then if N is less than or */ /* equal to the minimum divide size, usually 25, then LIWORK */ /* need only be 1. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal size of the IWORK array, */ /* returns this value as the first entry of the IWORK array, and */ /* no error message related to LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: The algorithm failed to compute an eigenvalue while */ /* working on the submatrix lying in rows and columns */ /* INFO/(N+1) through mod(INFO,N+1). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* Modified by Francoise Tisseur, University of Tennessee. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; /* Function Body */ *info = 0; lquery = *lwork == -1 || *liwork == -1; if (_starpu_lsame_(compz, "N")) { icompz = 0; } else if (_starpu_lsame_(compz, "V")) { icompz = 1; } else if (_starpu_lsame_(compz, "I")) { icompz = 2; } else { icompz = -1; } if (icompz < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { *info = -6; } if (*info == 0) { /* Compute the workspace requirements */ smlsiz = _starpu_ilaenv_(&c__9, "DSTEDC", " ", &c__0, &c__0, &c__0, &c__0); if (*n <= 1 || icompz == 0) { liwmin = 1; lwmin = 1; } else if (*n <= smlsiz) { liwmin = 1; lwmin = *n - 1 << 1; } else { lgn = (integer) (log((doublereal) (*n)) / log(2.)); if (pow_ii(&c__2, &lgn) < *n) { ++lgn; } if (pow_ii(&c__2, &lgn) < *n) { ++lgn; } if (icompz == 1) { /* Computing 2nd power */ i__1 = *n; lwmin = *n * 3 + 1 + (*n << 1) * lgn + i__1 * i__1 * 3; liwmin = *n * 6 + 6 + *n * 5 * lgn; } else if (icompz == 2) { /* Computing 2nd power */ i__1 = *n; lwmin = (*n << 2) + 1 + i__1 * i__1; liwmin = *n * 5 + 3; } } work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -8; } else if (*liwork < liwmin && ! lquery) { *info = -10; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEDC", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (icompz != 0) { z__[z_dim1 + 1] = 1.; } return 0; } /* If the following conditional clause is removed, then the routine */ /* will use the Divide and Conquer routine to compute only the */ /* eigenvalues, which requires (3N + 3N**2) real workspace and */ /* (2 + 5N + 2N lg(N)) integer workspace. */ /* Since on many architectures DSTERF is much faster than any other */ /* algorithm for finding eigenvalues only, it is used here */ /* as the default. If the conditional clause is removed, then */ /* information on the size of workspace needs to be changed. */ /* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ if (icompz == 0) { _starpu_dsterf_(n, &d__[1], &e[1], info); goto L50; } /* If N is smaller than the minimum divide size (SMLSIZ+1), then */ /* solve the problem with another solver. */ if (*n <= smlsiz) { _starpu_dsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info); } else { /* If COMPZ = 'V', the Z matrix must be stored elsewhere for later */ /* use. */ if (icompz == 1) { storez = *n * *n + 1; } else { storez = 1; } if (icompz == 2) { _starpu_dlaset_("Full", n, n, &c_b17, &c_b18, &z__[z_offset], ldz); } /* Scale. */ orgnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (orgnrm == 0.) { goto L50; } eps = _starpu_dlamch_("Epsilon"); start = 1; /* while ( START <= N ) */ L10: if (start <= *n) { /* Let FINISH be the position of the next subdiagonal entry */ /* such that E( FINISH ) <= TINY or FINISH = N if no such */ /* subdiagonal exists. The matrix identified by the elements */ /* between START and FINISH constitutes an independent */ /* sub-problem. */ finish = start; L20: if (finish < *n) { tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( d__2 = d__[finish + 1], abs(d__2))); if ((d__1 = e[finish], abs(d__1)) > tiny) { ++finish; goto L20; } } /* (Sub) Problem determined. Compute its size and solve it. */ m = finish - start + 1; if (m == 1) { start = finish + 1; goto L10; } if (m > smlsiz) { /* Scale. */ orgnrm = _starpu_dlanst_("M", &m, &d__[start], &e[start]); _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ start], &m, info); i__1 = m - 1; i__2 = m - 1; _starpu_dlascl_("G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ start], &i__2, info); if (icompz == 1) { strtrw = 1; } else { strtrw = start; } _starpu_dlaed0_(&icompz, n, &m, &d__[start], &e[start], &z__[strtrw + start * z_dim1], ldz, &work[1], n, &work[storez], & iwork[1], info); if (*info != 0) { *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % (m + 1) + start - 1; goto L50; } /* Scale back. */ _starpu_dlascl_("G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ start], &m, info); } else { if (icompz == 1) { /* Since QR won't update a Z matrix which is larger than */ /* the length of D, we must solve the sub-problem in a */ /* workspace and then multiply back into Z. */ _starpu_dsteqr_("I", &m, &d__[start], &e[start], &work[1], &m, & work[m * m + 1], info); _starpu_dlacpy_("A", n, &m, &z__[start * z_dim1 + 1], ldz, &work[ storez], n); _starpu_dgemm_("N", "N", n, &m, &m, &c_b18, &work[storez], n, & work[1], &m, &c_b17, &z__[start * z_dim1 + 1], ldz); } else if (icompz == 2) { _starpu_dsteqr_("I", &m, &d__[start], &e[start], &z__[start + start * z_dim1], ldz, &work[1], info); } else { _starpu_dsterf_(&m, &d__[start], &e[start], info); } if (*info != 0) { *info = start * (*n + 1) + finish; goto L50; } } start = finish + 1; goto L10; } /* endwhile */ /* If the problem split any number of times, then the eigenvalues */ /* will not be properly ordered. Here we permute the eigenvalues */ /* (and the associated eigenvectors) into ascending order. */ if (m != *n) { if (icompz == 0) { /* Use Quick Sort */ _starpu_dlasrt_("I", n, &d__[1], info); } else { /* Use Selection Sort to minimize swaps of eigenvectors */ i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; k = i__; p = d__[i__]; i__2 = *n; for (j = ii; j <= i__2; ++j) { if (d__[j] < p) { k = j; p = d__[j]; } /* L30: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], &c__1); } /* L40: */ } } } } L50: work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSTEDC */ } /* _starpu_dstedc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstegr.c000066400000000000000000000207541413463044200206460ustar00rootroot00000000000000/* dstegr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dstegr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset; /* Local variables */ extern /* Subroutine */ int _starpu_dstemr_(char *, char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, integer *, logical *, doublereal *, integer *, integer *, integer *, integer *); logical tryrac; /* -- LAPACK computational routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEGR computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric tridiagonal matrix T. Any such unreduced matrix has */ /* a well defined set of pairwise different real eigenvalues, the corresponding */ /* real eigenvectors are pairwise orthogonal. */ /* The spectrum may be computed either completely or partially by specifying */ /* either an interval (VL,VU] or a range of indices IL:IU for the desired */ /* eigenvalues. */ /* DSTEGR is a compatability wrapper around the improved DSTEMR routine. */ /* See DSTEMR for further details. */ /* One important change is that the ABSTOL parameter no longer provides any */ /* benefit and hence is no longer used. */ /* Note : DSTEGR and DSTEMR work only on machines which follow */ /* IEEE-754 floating-point standard in their handling of infinities and */ /* NaNs. Normal execution may create these exceptiona values and hence */ /* may abort due to a floating point exception in environments which */ /* do not conform to the IEEE-754 standard. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the N diagonal elements of the tridiagonal matrix */ /* T. On exit, D is overwritten. */ /* E (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the (N-1) subdiagonal elements of the tridiagonal */ /* matrix T in elements 1 to N-1 of E. E(N) need not be set on */ /* input, but is used internally as workspace. */ /* On exit, E is overwritten. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* Unused. Was the absolute error tolerance for the */ /* eigenvalues/eigenvectors in previous versions. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the selected eigenvalues in */ /* ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M) ) */ /* If JOBZ = 'V', and if INFO = 0, then the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix T */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* Supplying N columns is always safe. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', then LDZ >= max(1,N). */ /* ISUPPZ (output) INTEGER ARRAY, dimension ( 2*max(1,M) ) */ /* The support of the eigenvectors in Z, i.e., the indices */ /* indicating the nonzero elements in Z. The i-th computed eigenvector */ /* is nonzero only in elements ISUPPZ( 2*i-1 ) through */ /* ISUPPZ( 2*i ). This is relevant in the case when the matrix */ /* is split. ISUPPZ is only accessed when JOBZ is 'V' and N > 0. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal */ /* (and minimal) LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,18*N) */ /* if JOBZ = 'V', and LWORK >= max(1,12*N) if JOBZ = 'N'. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (LIWORK) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. LIWORK >= max(1,10*N) */ /* if the eigenvectors are desired, and LIWORK >= max(1,8*N) */ /* if only the eigenvalues are to be computed. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal size of the IWORK array, */ /* returns this value as the first entry of the IWORK array, and */ /* no error message related to LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* On exit, INFO */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = 1X, internal error in DLARRE, */ /* if INFO = 2X, internal error in DLARRV. */ /* Here, the digit X = ABS( IINFO ) < 10, where IINFO is */ /* the nonzero error code returned by DLARRE or */ /* DLARRV, respectively. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Inderjit Dhillon, IBM Almaden, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, LBNL/NERSC, USA */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --d__; --e; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --isuppz; --work; --iwork; /* Function Body */ *info = 0; tryrac = FALSE_; _starpu_dstemr_(jobz, range, n, &d__[1], &e[1], vl, vu, il, iu, m, &w[1], &z__[ z_offset], ldz, n, &isuppz[1], &tryrac, &work[1], lwork, &iwork[1] , liwork, info); /* End of DSTEGR */ return 0; } /* _starpu_dstegr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstein.c000066400000000000000000000310621413463044200206360ustar00rootroot00000000000000/* dstein.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__2 = 2; static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dstein_(integer *n, doublereal *d__, doublereal *e, integer *m, doublereal *w, integer *iblock, integer *isplit, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3, d__4, d__5; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, b1, j1, bn; doublereal xj, scl, eps, sep, nrm, tol; integer its; doublereal xjm, ztr, eps1; integer jblk, nblk; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer jmax; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); integer iseed[4], gpind, iinfo; extern doublereal _starpu_dasum_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal ortol; integer indrv1, indrv2, indrv3, indrv4, indrv5; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlagtf_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer * , integer *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dlagts_( integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer nrmchk; extern /* Subroutine */ int _starpu_dlarnv_(integer *, integer *, integer *, doublereal *); integer blksiz; doublereal onenrm, dtpcrt, pertol; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEIN computes the eigenvectors of a real symmetric tridiagonal */ /* matrix T corresponding to specified eigenvalues, using inverse */ /* iteration. */ /* The maximum number of iterations allowed for each eigenvector is */ /* specified by an internal parameter MAXITS (currently set to 5). */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input) DOUBLE PRECISION array, dimension (N) */ /* The n diagonal elements of the tridiagonal matrix T. */ /* E (input) DOUBLE PRECISION array, dimension (N-1) */ /* The (n-1) subdiagonal elements of the tridiagonal matrix */ /* T, in elements 1 to N-1. */ /* M (input) INTEGER */ /* The number of eigenvectors to be found. 0 <= M <= N. */ /* W (input) DOUBLE PRECISION array, dimension (N) */ /* The first M elements of W contain the eigenvalues for */ /* which eigenvectors are to be computed. The eigenvalues */ /* should be grouped by split-off block and ordered from */ /* smallest to largest within the block. ( The output array */ /* W from DSTEBZ with ORDER = 'B' is expected here. ) */ /* IBLOCK (input) INTEGER array, dimension (N) */ /* The submatrix indices associated with the corresponding */ /* eigenvalues in W; IBLOCK(i)=1 if eigenvalue W(i) belongs to */ /* the first submatrix from the top, =2 if W(i) belongs to */ /* the second submatrix, etc. ( The output array IBLOCK */ /* from DSTEBZ is expected here. ) */ /* ISPLIT (input) INTEGER array, dimension (N) */ /* The splitting points, at which T breaks up into submatrices. */ /* The first submatrix consists of rows/columns 1 to */ /* ISPLIT( 1 ), the second of rows/columns ISPLIT( 1 )+1 */ /* through ISPLIT( 2 ), etc. */ /* ( The output array ISPLIT from DSTEBZ is expected here. ) */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, M) */ /* The computed eigenvectors. The eigenvector associated */ /* with the eigenvalue W(i) is stored in the i-th column of */ /* Z. Any vector which fails to converge is set to its current */ /* iterate after MAXITS iterations. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (5*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* IFAIL (output) INTEGER array, dimension (M) */ /* On normal exit, all elements of IFAIL are zero. */ /* If one or more eigenvectors fail to converge after */ /* MAXITS iterations, then their indices are stored in */ /* array IFAIL. */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, then i eigenvectors failed to converge */ /* in MAXITS iterations. Their indices are stored in */ /* array IFAIL. */ /* Internal Parameters */ /* =================== */ /* MAXITS INTEGER, default = 5 */ /* The maximum number of iterations performed. */ /* EXTRA INTEGER, default = 2 */ /* The number of iterations performed after norm growth */ /* criterion is satisfied, should be at least 1. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; --w; --iblock; --isplit; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ *info = 0; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { ifail[i__] = 0; /* L10: */ } if (*n < 0) { *info = -1; } else if (*m < 0 || *m > *n) { *info = -4; } else if (*ldz < max(1,*n)) { *info = -9; } else { i__1 = *m; for (j = 2; j <= i__1; ++j) { if (iblock[j] < iblock[j - 1]) { *info = -6; goto L30; } if (iblock[j] == iblock[j - 1] && w[j] < w[j - 1]) { *info = -5; goto L30; } /* L20: */ } L30: ; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEIN", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *m == 0) { return 0; } else if (*n == 1) { z__[z_dim1 + 1] = 1.; return 0; } /* Get machine constants. */ eps = _starpu_dlamch_("Precision"); /* Initialize seed for random number generator DLARNV. */ for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = 1; /* L40: */ } /* Initialize pointers. */ indrv1 = 0; indrv2 = indrv1 + *n; indrv3 = indrv2 + *n; indrv4 = indrv3 + *n; indrv5 = indrv4 + *n; /* Compute eigenvectors of matrix blocks. */ j1 = 1; i__1 = iblock[*m]; for (nblk = 1; nblk <= i__1; ++nblk) { /* Find starting and ending indices of block nblk. */ if (nblk == 1) { b1 = 1; } else { b1 = isplit[nblk - 1] + 1; } bn = isplit[nblk]; blksiz = bn - b1 + 1; if (blksiz == 1) { goto L60; } gpind = b1; /* Compute reorthogonalization criterion and stopping criterion. */ onenrm = (d__1 = d__[b1], abs(d__1)) + (d__2 = e[b1], abs(d__2)); /* Computing MAX */ d__3 = onenrm, d__4 = (d__1 = d__[bn], abs(d__1)) + (d__2 = e[bn - 1], abs(d__2)); onenrm = max(d__3,d__4); i__2 = bn - 1; for (i__ = b1 + 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__4 = onenrm, d__5 = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[ i__ - 1], abs(d__2)) + (d__3 = e[i__], abs(d__3)); onenrm = max(d__4,d__5); /* L50: */ } ortol = onenrm * .001; dtpcrt = sqrt(.1 / blksiz); /* Loop through eigenvalues of block nblk. */ L60: jblk = 0; i__2 = *m; for (j = j1; j <= i__2; ++j) { if (iblock[j] != nblk) { j1 = j; goto L160; } ++jblk; xj = w[j]; /* Skip all the work if the block size is one. */ if (blksiz == 1) { work[indrv1 + 1] = 1.; goto L120; } /* If eigenvalues j and j-1 are too close, add a relatively */ /* small perturbation. */ if (jblk > 1) { eps1 = (d__1 = eps * xj, abs(d__1)); pertol = eps1 * 10.; sep = xj - xjm; if (sep < pertol) { xj = xjm + pertol; } } its = 0; nrmchk = 0; /* Get random starting vector. */ _starpu_dlarnv_(&c__2, iseed, &blksiz, &work[indrv1 + 1]); /* Copy the matrix T so it won't be destroyed in factorization. */ _starpu_dcopy_(&blksiz, &d__[b1], &c__1, &work[indrv4 + 1], &c__1); i__3 = blksiz - 1; _starpu_dcopy_(&i__3, &e[b1], &c__1, &work[indrv2 + 2], &c__1); i__3 = blksiz - 1; _starpu_dcopy_(&i__3, &e[b1], &c__1, &work[indrv3 + 1], &c__1); /* Compute LU factors with partial pivoting ( PT = LU ) */ tol = 0.; _starpu_dlagtf_(&blksiz, &work[indrv4 + 1], &xj, &work[indrv2 + 2], &work[ indrv3 + 1], &tol, &work[indrv5 + 1], &iwork[1], &iinfo); /* Update iteration count. */ L70: ++its; if (its > 5) { goto L100; } /* Normalize and scale the righthand side vector Pb. */ /* Computing MAX */ d__2 = eps, d__3 = (d__1 = work[indrv4 + blksiz], abs(d__1)); scl = blksiz * onenrm * max(d__2,d__3) / _starpu_dasum_(&blksiz, &work[ indrv1 + 1], &c__1); _starpu_dscal_(&blksiz, &scl, &work[indrv1 + 1], &c__1); /* Solve the system LU = Pb. */ _starpu_dlagts_(&c_n1, &blksiz, &work[indrv4 + 1], &work[indrv2 + 2], & work[indrv3 + 1], &work[indrv5 + 1], &iwork[1], &work[ indrv1 + 1], &tol, &iinfo); /* Reorthogonalize by modified Gram-Schmidt if eigenvalues are */ /* close enough. */ if (jblk == 1) { goto L90; } if ((d__1 = xj - xjm, abs(d__1)) > ortol) { gpind = j; } if (gpind != j) { i__3 = j - 1; for (i__ = gpind; i__ <= i__3; ++i__) { ztr = -_starpu_ddot_(&blksiz, &work[indrv1 + 1], &c__1, &z__[b1 + i__ * z_dim1], &c__1); _starpu_daxpy_(&blksiz, &ztr, &z__[b1 + i__ * z_dim1], &c__1, & work[indrv1 + 1], &c__1); /* L80: */ } } /* Check the infinity norm of the iterate. */ L90: jmax = _starpu_idamax_(&blksiz, &work[indrv1 + 1], &c__1); nrm = (d__1 = work[indrv1 + jmax], abs(d__1)); /* Continue for additional iterations after norm reaches */ /* stopping criterion. */ if (nrm < dtpcrt) { goto L70; } ++nrmchk; if (nrmchk < 3) { goto L70; } goto L110; /* If stopping criterion was not satisfied, update info and */ /* store eigenvector number in array ifail. */ L100: ++(*info); ifail[*info] = j; /* Accept iterate as jth eigenvector. */ L110: scl = 1. / _starpu_dnrm2_(&blksiz, &work[indrv1 + 1], &c__1); jmax = _starpu_idamax_(&blksiz, &work[indrv1 + 1], &c__1); if (work[indrv1 + jmax] < 0.) { scl = -scl; } _starpu_dscal_(&blksiz, &scl, &work[indrv1 + 1], &c__1); L120: i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { z__[i__ + j * z_dim1] = 0.; /* L130: */ } i__3 = blksiz; for (i__ = 1; i__ <= i__3; ++i__) { z__[b1 + i__ - 1 + j * z_dim1] = work[indrv1 + i__]; /* L140: */ } /* Save the shift to check eigenvalue spacing at next */ /* iteration. */ xjm = xj; /* L150: */ } L160: ; } return 0; /* End of DSTEIN */ } /* _starpu_dstein_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstemr.c000066400000000000000000000620141413463044200206470ustar00rootroot00000000000000/* dstemr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b18 = .001; /* Subroutine */ int _starpu_dstemr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j; doublereal r1, r2; integer jj; doublereal cs; integer in; doublereal sn, wl, wu; integer iil, iiu; doublereal eps, tmp; integer indd, iend, jblk, wend; doublereal rmin, rmax; integer itmp; doublereal tnrm; extern /* Subroutine */ int _starpu_dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); integer inde2, itmp2; doublereal rtol1, rtol2; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal scale; integer indgp; extern logical _starpu_lsame_(char *, char *); integer iinfo, iindw, ilast; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer lwmin; logical wantz; extern /* Subroutine */ int _starpu_dlaev2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); logical alleig; integer ibegin; logical indeig; integer iindbl; logical valeig; extern /* Subroutine */ int _starpu_dlarrc_(char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *), _starpu_dlarre_(char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer wbegin; doublereal safmin; extern /* Subroutine */ int _starpu_dlarrj_(integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; integer inderr, iindwk, indgrs, offset; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlarrr_(integer *, doublereal *, doublereal *, integer *), _starpu_dlarrv_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlasrt_(char *, integer *, doublereal *, integer *); doublereal thresh; integer iinspl, ifirst, indwrk, liwmin, nzcmin; doublereal pivmin; integer nsplit; doublereal smlnum; logical lquery, zquery; /* -- LAPACK computational routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEMR computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric tridiagonal matrix T. Any such unreduced matrix has */ /* a well defined set of pairwise different real eigenvalues, the corresponding */ /* real eigenvectors are pairwise orthogonal. */ /* The spectrum may be computed either completely or partially by specifying */ /* either an interval (VL,VU] or a range of indices IL:IU for the desired */ /* eigenvalues. */ /* Depending on the number of desired eigenvalues, these are computed either */ /* by bisection or the dqds algorithm. Numerically orthogonal eigenvectors are */ /* computed by the use of various suitable L D L^T factorizations near clusters */ /* of close eigenvalues (referred to as RRRs, Relatively Robust */ /* Representations). An informal sketch of the algorithm follows. */ /* For each unreduced block (submatrix) of T, */ /* (a) Compute T - sigma I = L D L^T, so that L and D */ /* define all the wanted eigenvalues to high relative accuracy. */ /* This means that small relative changes in the entries of D and L */ /* cause only small relative changes in the eigenvalues and */ /* eigenvectors. The standard (unfactored) representation of the */ /* tridiagonal matrix T does not have this property in general. */ /* (b) Compute the eigenvalues to suitable accuracy. */ /* If the eigenvectors are desired, the algorithm attains full */ /* accuracy of the computed eigenvalues only right before */ /* the corresponding vectors have to be computed, see steps c) and d). */ /* (c) For each cluster of close eigenvalues, select a new */ /* shift close to the cluster, find a new factorization, and refine */ /* the shifted eigenvalues to suitable accuracy. */ /* (d) For each eigenvalue with a large enough relative separation compute */ /* the corresponding eigenvector by forming a rank revealing twisted */ /* factorization. Go back to (c) for any clusters that remain. */ /* For more details, see: */ /* - Inderjit S. Dhillon and Beresford N. Parlett: "Multiple representations */ /* to compute orthogonal eigenvectors of symmetric tridiagonal matrices," */ /* Linear Algebra and its Applications, 387(1), pp. 1-28, August 2004. */ /* - Inderjit Dhillon and Beresford Parlett: "Orthogonal Eigenvectors and */ /* Relative Gaps," SIAM Journal on Matrix Analysis and Applications, Vol. 25, */ /* 2004. Also LAPACK Working Note 154. */ /* - Inderjit Dhillon: "A new O(n^2) algorithm for the symmetric */ /* tridiagonal eigenvalue/eigenvector problem", */ /* Computer Science Division Technical Report No. UCB/CSD-97-971, */ /* UC Berkeley, May 1997. */ /* Notes: */ /* 1.DSTEMR works only on machines which follow IEEE-754 */ /* floating-point standard in their handling of infinities and NaNs. */ /* This permits the use of efficient inner loops avoiding a check for */ /* zero divisors. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the N diagonal elements of the tridiagonal matrix */ /* T. On exit, D is overwritten. */ /* E (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the (N-1) subdiagonal elements of the tridiagonal */ /* matrix T in elements 1 to N-1 of E. E(N) need not be set on */ /* input, but is used internally as workspace. */ /* On exit, E is overwritten. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the selected eigenvalues in */ /* ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M) ) */ /* If JOBZ = 'V', and if INFO = 0, then the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix T */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and can be computed with a workspace */ /* query by setting NZC = -1, see below. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', then LDZ >= max(1,N). */ /* NZC (input) INTEGER */ /* The number of eigenvectors to be held in the array Z. */ /* If RANGE = 'A', then NZC >= max(1,N). */ /* If RANGE = 'V', then NZC >= the number of eigenvalues in (VL,VU]. */ /* If RANGE = 'I', then NZC >= IU-IL+1. */ /* If NZC = -1, then a workspace query is assumed; the */ /* routine calculates the number of columns of the array Z that */ /* are needed to hold the eigenvectors. */ /* This value is returned as the first entry of the Z array, and */ /* no error message related to NZC is issued by XERBLA. */ /* ISUPPZ (output) INTEGER ARRAY, dimension ( 2*max(1,M) ) */ /* The support of the eigenvectors in Z, i.e., the indices */ /* indicating the nonzero elements in Z. The i-th computed eigenvector */ /* is nonzero only in elements ISUPPZ( 2*i-1 ) through */ /* ISUPPZ( 2*i ). This is relevant in the case when the matrix */ /* is split. ISUPPZ is only accessed when JOBZ is 'V' and N > 0. */ /* TRYRAC (input/output) LOGICAL */ /* If TRYRAC.EQ..TRUE., indicates that the code should check whether */ /* the tridiagonal matrix defines its eigenvalues to high relative */ /* accuracy. If so, the code uses relative-accuracy preserving */ /* algorithms that might be (a bit) slower depending on the matrix. */ /* If the matrix does not define its eigenvalues to high relative */ /* accuracy, the code can uses possibly faster algorithms. */ /* If TRYRAC.EQ..FALSE., the code is not required to guarantee */ /* relatively accurate eigenvalues and can use the fastest possible */ /* techniques. */ /* On exit, a .TRUE. TRYRAC will be set to .FALSE. if the matrix */ /* does not define its eigenvalues to high relative accuracy. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal */ /* (and minimal) LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,18*N) */ /* if JOBZ = 'V', and LWORK >= max(1,12*N) if JOBZ = 'N'. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (LIWORK) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. LIWORK >= max(1,10*N) */ /* if the eigenvectors are desired, and LIWORK >= max(1,8*N) */ /* if only the eigenvalues are to be computed. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal size of the IWORK array, */ /* returns this value as the first entry of the IWORK array, and */ /* no error message related to LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* On exit, INFO */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = 1X, internal error in DLARRE, */ /* if INFO = 2X, internal error in DLARRV. */ /* Here, the digit X = ABS( IINFO ) < 10, where IINFO is */ /* the nonzero error code returned by DLARRE or */ /* DLARRV, respectively. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Beresford Parlett, University of California, Berkeley, USA */ /* Jim Demmel, University of California, Berkeley, USA */ /* Inderjit Dhillon, University of Texas, Austin, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Christof Voemel, University of California, Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --isuppz; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); lquery = *lwork == -1 || *liwork == -1; zquery = *nzc == -1; /* DSTEMR needs WORK of size 6*N, IWORK of size 3*N. */ /* In addition, DLARRE needs WORK of size 6*N, IWORK of size 5*N. */ /* Furthermore, DLARRV needs WORK of size 12*N, IWORK of size 7*N. */ if (wantz) { lwmin = *n * 18; liwmin = *n * 10; } else { /* need less workspace if only the eigenvalues are wanted */ lwmin = *n * 12; liwmin = *n << 3; } wl = 0.; wu = 0.; iil = 0; iiu = 0; if (valeig) { /* We do not reference VL, VU in the cases RANGE = 'I','A' */ /* The interval (WL, WU] contains all the wanted eigenvalues. */ /* It is either given by the user or computed in DLARRE. */ wl = *vl; wu = *vu; } else if (indeig) { /* We do not reference IL, IU in the cases RANGE = 'V','A' */ iil = *il; iiu = *iu; } *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (*n < 0) { *info = -3; } else if (valeig && *n > 0 && wu <= wl) { *info = -7; } else if (indeig && (iil < 1 || iil > *n)) { *info = -8; } else if (indeig && (iiu < iil || iiu > *n)) { *info = -9; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -13; } else if (*lwork < lwmin && ! lquery) { *info = -17; } else if (*liwork < liwmin && ! lquery) { *info = -19; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); if (*info == 0) { work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (wantz && alleig) { nzcmin = *n; } else if (wantz && valeig) { _starpu_dlarrc_("T", n, vl, vu, &d__[1], &e[1], &safmin, &nzcmin, &itmp, & itmp2, info); } else if (wantz && indeig) { nzcmin = iiu - iil + 1; } else { /* WANTZ .EQ. FALSE. */ nzcmin = 0; } if (zquery && *info == 0) { z__[z_dim1 + 1] = (doublereal) nzcmin; } else if (*nzc < nzcmin && ! zquery) { *info = -14; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEMR", &i__1); return 0; } else if (lquery || zquery) { return 0; } /* Handle N = 0, 1, and 2 cases immediately */ *m = 0; if (*n == 0) { return 0; } if (*n == 1) { if (alleig || indeig) { *m = 1; w[1] = d__[1]; } else { if (wl < d__[1] && wu >= d__[1]) { *m = 1; w[1] = d__[1]; } } if (wantz && ! zquery) { z__[z_dim1 + 1] = 1.; isuppz[1] = 1; isuppz[2] = 1; } return 0; } if (*n == 2) { if (! wantz) { _starpu_dlae2_(&d__[1], &e[1], &d__[2], &r1, &r2); } else if (wantz && ! zquery) { _starpu_dlaev2_(&d__[1], &e[1], &d__[2], &r1, &r2, &cs, &sn); } if (alleig || valeig && r2 > wl && r2 <= wu || indeig && iil == 1) { ++(*m); w[*m] = r2; if (wantz && ! zquery) { z__[*m * z_dim1 + 1] = -sn; z__[*m * z_dim1 + 2] = cs; /* Note: At most one of SN and CS can be zero. */ if (sn != 0.) { if (cs != 0.) { isuppz[(*m << 1) - 1] = 1; isuppz[(*m << 1) - 1] = 2; } else { isuppz[(*m << 1) - 1] = 1; isuppz[(*m << 1) - 1] = 1; } } else { isuppz[(*m << 1) - 1] = 2; isuppz[*m * 2] = 2; } } } if (alleig || valeig && r1 > wl && r1 <= wu || indeig && iiu == 2) { ++(*m); w[*m] = r1; if (wantz && ! zquery) { z__[*m * z_dim1 + 1] = cs; z__[*m * z_dim1 + 2] = sn; /* Note: At most one of SN and CS can be zero. */ if (sn != 0.) { if (cs != 0.) { isuppz[(*m << 1) - 1] = 1; isuppz[(*m << 1) - 1] = 2; } else { isuppz[(*m << 1) - 1] = 1; isuppz[(*m << 1) - 1] = 1; } } else { isuppz[(*m << 1) - 1] = 2; isuppz[*m * 2] = 2; } } } return 0; } /* Continue with general N */ indgrs = 1; inderr = (*n << 1) + 1; indgp = *n * 3 + 1; indd = (*n << 2) + 1; inde2 = *n * 5 + 1; indwrk = *n * 6 + 1; iinspl = 1; iindbl = *n + 1; iindw = (*n << 1) + 1; iindwk = *n * 3 + 1; /* Scale matrix to allowable range, if necessary. */ /* The allowable range is related to the PIVMIN parameter; see the */ /* comments in DLARRD. The preference for scaling small values */ /* up is heuristic; we expect users' matrices not to be close to the */ /* RMAX threshold. */ scale = 1.; tnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (tnrm > 0. && tnrm < rmin) { scale = rmin / tnrm; } else if (tnrm > rmax) { scale = rmax / tnrm; } if (scale != 1.) { _starpu_dscal_(n, &scale, &d__[1], &c__1); i__1 = *n - 1; _starpu_dscal_(&i__1, &scale, &e[1], &c__1); tnrm *= scale; if (valeig) { /* If eigenvalues in interval have to be found, */ /* scale (WL, WU] accordingly */ wl *= scale; wu *= scale; } } /* Compute the desired eigenvalues of the tridiagonal after splitting */ /* into smaller subblocks if the corresponding off-diagonal elements */ /* are small */ /* THRESH is the splitting parameter for DLARRE */ /* A negative THRESH forces the old splitting criterion based on the */ /* size of the off-diagonal. A positive THRESH switches to splitting */ /* which preserves relative accuracy. */ if (*tryrac) { /* Test whether the matrix warrants the more expensive relative approach. */ _starpu_dlarrr_(n, &d__[1], &e[1], &iinfo); } else { /* The user does not care about relative accurately eigenvalues */ iinfo = -1; } /* Set the splitting criterion */ if (iinfo == 0) { thresh = eps; } else { thresh = -eps; /* relative accuracy is desired but T does not guarantee it */ *tryrac = FALSE_; } if (*tryrac) { /* Copy original diagonal, needed to guarantee relative accuracy */ _starpu_dcopy_(n, &d__[1], &c__1, &work[indd], &c__1); } /* Store the squares of the offdiagonal values of T */ i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { /* Computing 2nd power */ d__1 = e[j]; work[inde2 + j - 1] = d__1 * d__1; /* L5: */ } /* Set the tolerance parameters for bisection */ if (! wantz) { /* DLARRE computes the eigenvalues to full precision. */ rtol1 = eps * 4.; rtol2 = eps * 4.; } else { /* DLARRE computes the eigenvalues to less than full precision. */ /* DLARRV will refine the eigenvalue approximations, and we can */ /* need less accurate initial bisection in DLARRE. */ /* Note: these settings do only affect the subset case and DLARRE */ rtol1 = sqrt(eps); /* Computing MAX */ d__1 = sqrt(eps) * .005, d__2 = eps * 4.; rtol2 = max(d__1,d__2); } _starpu_dlarre_(range, n, &wl, &wu, &iil, &iiu, &d__[1], &e[1], &work[inde2], & rtol1, &rtol2, &thresh, &nsplit, &iwork[iinspl], m, &w[1], &work[ inderr], &work[indgp], &iwork[iindbl], &iwork[iindw], &work[ indgrs], &pivmin, &work[indwrk], &iwork[iindwk], &iinfo); if (iinfo != 0) { *info = abs(iinfo) + 10; return 0; } /* Note that if RANGE .NE. 'V', DLARRE computes bounds on the desired */ /* part of the spectrum. All desired eigenvalues are contained in */ /* (WL,WU] */ if (wantz) { /* Compute the desired eigenvectors corresponding to the computed */ /* eigenvalues */ _starpu_dlarrv_(n, &wl, &wu, &d__[1], &e[1], &pivmin, &iwork[iinspl], m, & c__1, m, &c_b18, &rtol1, &rtol2, &w[1], &work[inderr], &work[ indgp], &iwork[iindbl], &iwork[iindw], &work[indgrs], &z__[ z_offset], ldz, &isuppz[1], &work[indwrk], &iwork[iindwk], & iinfo); if (iinfo != 0) { *info = abs(iinfo) + 20; return 0; } } else { /* DLARRE computes eigenvalues of the (shifted) root representation */ /* DLARRV returns the eigenvalues of the unshifted matrix. */ /* However, if the eigenvectors are not desired by the user, we need */ /* to apply the corresponding shifts from DLARRE to obtain the */ /* eigenvalues of the original matrix. */ i__1 = *m; for (j = 1; j <= i__1; ++j) { itmp = iwork[iindbl + j - 1]; w[j] += e[iwork[iinspl + itmp - 1]]; /* L20: */ } } if (*tryrac) { /* Refine computed eigenvalues so that they are relatively accurate */ /* with respect to the original matrix T. */ ibegin = 1; wbegin = 1; i__1 = iwork[iindbl + *m - 1]; for (jblk = 1; jblk <= i__1; ++jblk) { iend = iwork[iinspl + jblk - 1]; in = iend - ibegin + 1; wend = wbegin - 1; /* check if any eigenvalues have to be refined in this block */ L36: if (wend < *m) { if (iwork[iindbl + wend] == jblk) { ++wend; goto L36; } } if (wend < wbegin) { ibegin = iend + 1; goto L39; } offset = iwork[iindw + wbegin - 1] - 1; ifirst = iwork[iindw + wbegin - 1]; ilast = iwork[iindw + wend - 1]; rtol2 = eps * 4.; _starpu_dlarrj_(&in, &work[indd + ibegin - 1], &work[inde2 + ibegin - 1], &ifirst, &ilast, &rtol2, &offset, &w[wbegin], &work[ inderr + wbegin - 1], &work[indwrk], &iwork[iindwk], & pivmin, &tnrm, &iinfo); ibegin = iend + 1; wbegin = wend + 1; L39: ; } } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (scale != 1.) { d__1 = 1. / scale; _starpu_dscal_(m, &d__1, &w[1], &c__1); } /* If eigenvalues are not in increasing order, then sort them, */ /* possibly along with eigenvectors. */ if (nsplit > 1) { if (! wantz) { _starpu_dlasrt_("I", m, &w[1], &iinfo); if (iinfo != 0) { *info = 3; return 0; } } else { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp) { i__ = jj; tmp = w[jj]; } /* L50: */ } if (i__ != 0) { w[i__] = w[j]; w[j] = tmp; if (wantz) { _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); itmp = isuppz[(i__ << 1) - 1]; isuppz[(i__ << 1) - 1] = isuppz[(j << 1) - 1]; isuppz[(j << 1) - 1] = itmp; itmp = isuppz[i__ * 2]; isuppz[i__ * 2] = isuppz[j * 2]; isuppz[j * 2] = itmp; } } /* L60: */ } } } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSTEMR */ } /* _starpu_dstemr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsteqr.c000066400000000000000000000354601413463044200206600ustar00rootroot00000000000000/* dsteqr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b9 = 0.; static doublereal c_b10 = 1.; static integer c__0 = 0; static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal b, c__, f, g; integer i__, j, k, l, m; doublereal p, r__, s; integer l1, ii, mm, lm1, mm1, nm1; doublereal rt1, rt2, eps; integer lsv; doublereal tst, eps2; integer lend, jtot; extern /* Subroutine */ int _starpu_dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal anorm; extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaev2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); integer lendm1, lendp1; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal safmax; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlasrt_(char *, integer *, doublereal *, integer *); integer lendsv; doublereal ssfmin; integer nmaxit, icompz; doublereal ssfmax; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEQR computes all eigenvalues and, optionally, eigenvectors of a */ /* symmetric tridiagonal matrix using the implicit QL or QR method. */ /* The eigenvectors of a full or band symmetric matrix can also be found */ /* if DSYTRD or DSPTRD or DSBTRD has been used to reduce this matrix to */ /* tridiagonal form. */ /* Arguments */ /* ========= */ /* COMPZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only. */ /* = 'V': Compute eigenvalues and eigenvectors of the original */ /* symmetric matrix. On entry, Z must contain the */ /* orthogonal matrix used to reduce the original matrix */ /* to tridiagonal form. */ /* = 'I': Compute eigenvalues and eigenvectors of the */ /* tridiagonal matrix. Z is initialized to the identity */ /* matrix. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the diagonal elements of the tridiagonal matrix. */ /* On exit, if INFO = 0, the eigenvalues in ascending order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix. */ /* On exit, E has been destroyed. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* On entry, if COMPZ = 'V', then Z contains the orthogonal */ /* matrix used in the reduction to tridiagonal form. */ /* On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ /* orthonormal eigenvectors of the original symmetric matrix, */ /* and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ /* of the symmetric tridiagonal matrix. */ /* If COMPZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* eigenvectors are desired, then LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (max(1,2*N-2)) */ /* If COMPZ = 'N', then WORK is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: the algorithm has failed to find all the eigenvalues in */ /* a total of 30*N iterations; if INFO = i, then i */ /* elements of E have not converged to zero; on exit, D */ /* and E contain the elements of a symmetric tridiagonal */ /* matrix which is orthogonally similar to the original */ /* matrix. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ *info = 0; if (_starpu_lsame_(compz, "N")) { icompz = 0; } else if (_starpu_lsame_(compz, "V")) { icompz = 1; } else if (_starpu_lsame_(compz, "I")) { icompz = 2; } else { icompz = -1; } if (icompz < 0) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEQR", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (icompz == 2) { z__[z_dim1 + 1] = 1.; } return 0; } /* Determine the unit roundoff and over/underflow thresholds. */ eps = _starpu_dlamch_("E"); /* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = _starpu_dlamch_("S"); safmax = 1. / safmin; ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; /* Compute the eigenvalues and eigenvectors of the tridiagonal */ /* matrix. */ if (icompz == 2) { _starpu_dlaset_("Full", n, n, &c_b9, &c_b10, &z__[z_offset], ldz); } nmaxit = *n * 30; jtot = 0; /* Determine where the matrix splits and choose QL or QR iteration */ /* for each block, according to whether top or bottom diagonal */ /* element is smaller. */ l1 = 1; nm1 = *n - 1; L10: if (l1 > *n) { goto L160; } if (l1 > 1) { e[l1 - 1] = 0.; } if (l1 <= nm1) { i__1 = nm1; for (m = l1; m <= i__1; ++m) { tst = (d__1 = e[m], abs(d__1)); if (tst == 0.) { goto L30; } if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } /* L20: */ } } m = *n; L30: l = l1; lsv = l; lend = m; lendsv = lend; l1 = m + 1; if (lend == l) { goto L10; } /* Scale submatrix in rows and columns L to LEND */ i__1 = lend - l + 1; anorm = _starpu_dlanst_("I", &i__1, &d__[l], &e[l]); iscale = 0; if (anorm == 0.) { goto L10; } if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info); } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } if (lend > l) { /* QL Iteration */ /* Look for small subdiagonal element. */ L40: if (l != lend) { lendm1 = lend - 1; i__1 = lendm1; for (m = l; m <= i__1; ++m) { /* Computing 2nd power */ d__2 = (d__1 = e[m], abs(d__1)); tst = d__2 * d__2; if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + 1], abs(d__2)) + safmin) { goto L60; } /* L50: */ } } m = lend; L60: if (m < lend) { e[m] = 0.; } p = d__[l]; if (m == l) { goto L80; } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ /* to compute its eigensystem. */ if (m == l + 1) { if (icompz > 0) { _starpu_dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); work[l] = c__; work[*n - 1 + l] = s; _starpu_dlasr_("R", "V", "B", n, &c__2, &work[l], &work[*n - 1 + l], & z__[l * z_dim1 + 1], ldz); } else { _starpu_dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); } d__[l] = rt1; d__[l + 1] = rt2; e[l] = 0.; l += 2; if (l <= lend) { goto L40; } goto L140; } if (jtot == nmaxit) { goto L140; } ++jtot; /* Form shift. */ g = (d__[l + 1] - p) / (e[l] * 2.); r__ = _starpu_dlapy2_(&g, &c_b10); g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); s = 1.; c__ = 1.; p = 0.; /* Inner loop */ mm1 = m - 1; i__1 = l; for (i__ = mm1; i__ >= i__1; --i__) { f = s * e[i__]; b = c__ * e[i__]; _starpu_dlartg_(&g, &f, &c__, &s, &r__); if (i__ != m - 1) { e[i__ + 1] = r__; } g = d__[i__ + 1] - p; r__ = (d__[i__] - g) * s + c__ * 2. * b; p = s * r__; d__[i__ + 1] = g + p; g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = -s; } /* L70: */ } /* If eigenvectors are desired, then apply saved rotations. */ if (icompz > 0) { mm = m - l + 1; _starpu_dlasr_("R", "V", "B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l * z_dim1 + 1], ldz); } d__[l] -= p; e[l] = g; goto L40; /* Eigenvalue found. */ L80: d__[l] = p; ++l; if (l <= lend) { goto L40; } goto L140; } else { /* QR Iteration */ /* Look for small superdiagonal element. */ L90: if (l != lend) { lendp1 = lend + 1; i__1 = lendp1; for (m = l; m >= i__1; --m) { /* Computing 2nd power */ d__2 = (d__1 = e[m - 1], abs(d__1)); tst = d__2 * d__2; if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - 1], abs(d__2)) + safmin) { goto L110; } /* L100: */ } } m = lend; L110: if (m > lend) { e[m - 1] = 0.; } p = d__[l]; if (m == l) { goto L130; } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ /* to compute its eigensystem. */ if (m == l - 1) { if (icompz > 0) { _starpu_dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) ; work[m] = c__; work[*n - 1 + m] = s; _starpu_dlasr_("R", "V", "F", n, &c__2, &work[m], &work[*n - 1 + m], & z__[(l - 1) * z_dim1 + 1], ldz); } else { _starpu_dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); } d__[l - 1] = rt1; d__[l] = rt2; e[l - 1] = 0.; l += -2; if (l >= lend) { goto L90; } goto L140; } if (jtot == nmaxit) { goto L140; } ++jtot; /* Form shift. */ g = (d__[l - 1] - p) / (e[l - 1] * 2.); r__ = _starpu_dlapy2_(&g, &c_b10); g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); s = 1.; c__ = 1.; p = 0.; /* Inner loop */ lm1 = l - 1; i__1 = lm1; for (i__ = m; i__ <= i__1; ++i__) { f = s * e[i__]; b = c__ * e[i__]; _starpu_dlartg_(&g, &f, &c__, &s, &r__); if (i__ != m) { e[i__ - 1] = r__; } g = d__[i__] - p; r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; p = s * r__; d__[i__] = g + p; g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = s; } /* L120: */ } /* If eigenvectors are desired, then apply saved rotations. */ if (icompz > 0) { mm = l - m + 1; _starpu_dlasr_("R", "V", "F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m * z_dim1 + 1], ldz); } d__[l] -= p; e[lm1] = g; goto L90; /* Eigenvalue found. */ L130: d__[l] = p; --l; if (l >= lend) { goto L90; } goto L140; } /* Undo scaling if necessary */ L140: if (iscale == 1) { i__1 = lendsv - lsv + 1; _starpu_dlascl_("G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info); i__1 = lendsv - lsv; _starpu_dlascl_("G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, info); } else if (iscale == 2) { i__1 = lendsv - lsv + 1; _starpu_dlascl_("G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info); i__1 = lendsv - lsv; _starpu_dlascl_("G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, info); } /* Check for no convergence to an eigenvalue after a total */ /* of N*MAXIT iterations. */ if (jtot < nmaxit) { goto L10; } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } /* L150: */ } goto L190; /* Order eigenvalues and eigenvectors. */ L160: if (icompz == 0) { /* Use Quick Sort */ _starpu_dlasrt_("I", n, &d__[1], info); } else { /* Use Selection Sort to minimize swaps of eigenvectors */ i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; k = i__; p = d__[i__]; i__2 = *n; for (j = ii; j <= i__2; ++j) { if (d__[j] < p) { k = j; p = d__[j]; } /* L170: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], &c__1); } /* L180: */ } } L190: return 0; /* End of DSTEQR */ } /* _starpu_dsteqr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsterf.c000066400000000000000000000234511413463044200206420ustar00rootroot00000000000000/* dsterf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__0 = 0; static integer c__1 = 1; static doublereal c_b32 = 1.; /* Subroutine */ int _starpu_dsterf_(integer *n, doublereal *d__, doublereal *e, integer *info) { /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ doublereal c__; integer i__, l, m; doublereal p, r__, s; integer l1; doublereal bb, rt1, rt2, eps, rte; integer lsv; doublereal eps2, oldc; integer lend, jtot; extern /* Subroutine */ int _starpu_dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal gamma, alpha, sigma, anorm; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal oldgam, safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal safmax; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlasrt_(char *, integer *, doublereal *, integer *); integer lendsv; doublereal ssfmin; integer nmaxit; doublereal ssfmax; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTERF computes all eigenvalues of a symmetric tridiagonal matrix */ /* using the Pal-Walker-Kahan variant of the QL or QR algorithm. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix. */ /* On exit, if INFO = 0, the eigenvalues in ascending order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix. */ /* On exit, E has been destroyed. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: the algorithm failed to find all of the eigenvalues in */ /* a total of 30*N iterations; if INFO = i, then i */ /* elements of E have not converged to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --e; --d__; /* Function Body */ *info = 0; /* Quick return if possible */ if (*n < 0) { *info = -1; i__1 = -(*info); _starpu_xerbla_("DSTERF", &i__1); return 0; } if (*n <= 1) { return 0; } /* Determine the unit roundoff for this environment. */ eps = _starpu_dlamch_("E"); /* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = _starpu_dlamch_("S"); safmax = 1. / safmin; ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; /* Compute the eigenvalues of the tridiagonal matrix. */ nmaxit = *n * 30; sigma = 0.; jtot = 0; /* Determine where the matrix splits and choose QL or QR iteration */ /* for each block, according to whether top or bottom diagonal */ /* element is smaller. */ l1 = 1; L10: if (l1 > *n) { goto L170; } if (l1 > 1) { e[l1 - 1] = 0.; } i__1 = *n - 1; for (m = l1; m <= i__1; ++m) { if ((d__3 = e[m], abs(d__3)) <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } /* L20: */ } m = *n; L30: l = l1; lsv = l; lend = m; lendsv = lend; l1 = m + 1; if (lend == l) { goto L10; } /* Scale submatrix in rows and columns L to LEND */ i__1 = lend - l + 1; anorm = _starpu_dlanst_("I", &i__1, &d__[l], &e[l]); iscale = 0; if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info); i__1 = lend - l; _starpu_dlascl_("G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info); } i__1 = lend - 1; for (i__ = l; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = e[i__]; e[i__] = d__1 * d__1; /* L40: */ } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } if (lend >= l) { /* QL Iteration */ /* Look for small subdiagonal element. */ L50: if (l != lend) { i__1 = lend - 1; for (m = l; m <= i__1; ++m) { if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + 1], abs(d__1))) { goto L70; } /* L60: */ } } m = lend; L70: if (m < lend) { e[m] = 0.; } p = d__[l]; if (m == l) { goto L90; } /* If remaining matrix is 2 by 2, use DLAE2 to compute its */ /* eigenvalues. */ if (m == l + 1) { rte = sqrt(e[l]); _starpu_dlae2_(&d__[l], &rte, &d__[l + 1], &rt1, &rt2); d__[l] = rt1; d__[l + 1] = rt2; e[l] = 0.; l += 2; if (l <= lend) { goto L50; } goto L150; } if (jtot == nmaxit) { goto L150; } ++jtot; /* Form shift. */ rte = sqrt(e[l]); sigma = (d__[l + 1] - p) / (rte * 2.); r__ = _starpu_dlapy2_(&sigma, &c_b32); sigma = p - rte / (sigma + d_sign(&r__, &sigma)); c__ = 1.; s = 0.; gamma = d__[m] - sigma; p = gamma * gamma; /* Inner loop */ i__1 = l; for (i__ = m - 1; i__ >= i__1; --i__) { bb = e[i__]; r__ = p + bb; if (i__ != m - 1) { e[i__ + 1] = s * r__; } oldc = c__; c__ = p / r__; s = bb / r__; oldgam = gamma; alpha = d__[i__]; gamma = c__ * (alpha - sigma) - s * oldgam; d__[i__ + 1] = oldgam + (alpha - gamma); if (c__ != 0.) { p = gamma * gamma / c__; } else { p = oldc * bb; } /* L80: */ } e[l] = s * p; d__[l] = sigma + gamma; goto L50; /* Eigenvalue found. */ L90: d__[l] = p; ++l; if (l <= lend) { goto L50; } goto L150; } else { /* QR Iteration */ /* Look for small superdiagonal element. */ L100: i__1 = lend + 1; for (m = l; m >= i__1; --m) { if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - 1], abs(d__1))) { goto L120; } /* L110: */ } m = lend; L120: if (m > lend) { e[m - 1] = 0.; } p = d__[l]; if (m == l) { goto L140; } /* If remaining matrix is 2 by 2, use DLAE2 to compute its */ /* eigenvalues. */ if (m == l - 1) { rte = sqrt(e[l - 1]); _starpu_dlae2_(&d__[l], &rte, &d__[l - 1], &rt1, &rt2); d__[l] = rt1; d__[l - 1] = rt2; e[l - 1] = 0.; l += -2; if (l >= lend) { goto L100; } goto L150; } if (jtot == nmaxit) { goto L150; } ++jtot; /* Form shift. */ rte = sqrt(e[l - 1]); sigma = (d__[l - 1] - p) / (rte * 2.); r__ = _starpu_dlapy2_(&sigma, &c_b32); sigma = p - rte / (sigma + d_sign(&r__, &sigma)); c__ = 1.; s = 0.; gamma = d__[m] - sigma; p = gamma * gamma; /* Inner loop */ i__1 = l - 1; for (i__ = m; i__ <= i__1; ++i__) { bb = e[i__]; r__ = p + bb; if (i__ != m) { e[i__ - 1] = s * r__; } oldc = c__; c__ = p / r__; s = bb / r__; oldgam = gamma; alpha = d__[i__ + 1]; gamma = c__ * (alpha - sigma) - s * oldgam; d__[i__] = oldgam + (alpha - gamma); if (c__ != 0.) { p = gamma * gamma / c__; } else { p = oldc * bb; } /* L130: */ } e[l - 1] = s * p; d__[l] = sigma + gamma; goto L100; /* Eigenvalue found. */ L140: d__[l] = p; --l; if (l >= lend) { goto L100; } goto L150; } /* Undo scaling if necessary */ L150: if (iscale == 1) { i__1 = lendsv - lsv + 1; _starpu_dlascl_("G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info); } if (iscale == 2) { i__1 = lendsv - lsv + 1; _starpu_dlascl_("G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info); } /* Check for no convergence to an eigenvalue after a total */ /* of N*MAXIT iterations. */ if (jtot < nmaxit) { goto L10; } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } /* L160: */ } goto L180; /* Sort eigenvalues in increasing order. */ L170: _starpu_dlasrt_("I", n, &d__[1], info); L180: return 0; /* End of DSTERF */ } /* _starpu_dsterf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstev.c000066400000000000000000000134531413463044200205010ustar00rootroot00000000000000/* dstev.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dstev_(char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps; integer imax; doublereal rmin, rmax, tnrm; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); logical wantz; extern doublereal _starpu_dlamch_(char *); integer iscale; doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *), _starpu_dsteqr_(char *, integer *, doublereal *, doublereal * , doublereal *, integer *, doublereal *, integer *); doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEV computes all eigenvalues and, optionally, eigenvectors of a */ /* real symmetric tridiagonal matrix A. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix */ /* A. */ /* On exit, if INFO = 0, the eigenvalues in ascending order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix A, stored in elements 1 to N-1 of E. */ /* On exit, the contents of E are destroyed. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal */ /* eigenvectors of the matrix A, with the i-th column of Z */ /* holding the eigenvector associated with D(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (max(1,2*N-2)) */ /* If JOBZ = 'N', WORK is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of E did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEV ", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ iscale = 0; tnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (tnrm > 0. && tnrm < rmin) { iscale = 1; sigma = rmin / tnrm; } else if (tnrm > rmax) { iscale = 1; sigma = rmax / tnrm; } if (iscale == 1) { _starpu_dscal_(n, &sigma, &d__[1], &c__1); i__1 = *n - 1; _starpu_dscal_(&i__1, &sigma, &e[1], &c__1); } /* For eigenvalues only, call DSTERF. For eigenvalues and */ /* eigenvectors, call DSTEQR. */ if (! wantz) { _starpu_dsterf_(n, &d__[1], &e[1], info); } else { _starpu_dsteqr_("I", n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { if (*info == 0) { imax = *n; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &d__[1], &c__1); } return 0; /* End of DSTEV */ } /* _starpu_dstev_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstevd.c000066400000000000000000000203751413463044200206460ustar00rootroot00000000000000/* dstevd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dstevd_(char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps, rmin, rmax, tnrm; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer lwmin; logical wantz; extern doublereal _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer liwmin; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEVD computes all eigenvalues and, optionally, eigenvectors of a */ /* real symmetric tridiagonal matrix. If eigenvectors are desired, it */ /* uses a divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix */ /* A. */ /* On exit, if INFO = 0, the eigenvalues in ascending order. */ /* E (input/output) DOUBLE PRECISION array, dimension (N-1) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix A, stored in elements 1 to N-1 of E. */ /* On exit, the contents of E are destroyed. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, N) */ /* If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal */ /* eigenvectors of the matrix A, with the i-th column of Z */ /* holding the eigenvector associated with D(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, */ /* dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If JOBZ = 'N' or N <= 1 then LWORK must be at least 1. */ /* If JOBZ = 'V' and N > 1 then LWORK must be at least */ /* ( 1 + 4*N + N**2 ). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If JOBZ = 'N' or N <= 1 then LIWORK must be at least 1. */ /* If JOBZ = 'V' and N > 1 then LIWORK must be at least 3+5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of E did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); lquery = *lwork == -1 || *liwork == -1; *info = 0; liwmin = 1; lwmin = 1; if (*n > 1 && wantz) { /* Computing 2nd power */ i__1 = *n; lwmin = (*n << 2) + 1 + i__1 * i__1; liwmin = *n * 5 + 3; } if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldz < 1 || wantz && *ldz < *n) { *info = -6; } if (*info == 0) { work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -8; } else if (*liwork < liwmin && ! lquery) { *info = -10; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ iscale = 0; tnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (tnrm > 0. && tnrm < rmin) { iscale = 1; sigma = rmin / tnrm; } else if (tnrm > rmax) { iscale = 1; sigma = rmax / tnrm; } if (iscale == 1) { _starpu_dscal_(n, &sigma, &d__[1], &c__1); i__1 = *n - 1; _starpu_dscal_(&i__1, &sigma, &e[1], &c__1); } /* For eigenvalues only, call DSTERF. For eigenvalues and */ /* eigenvectors, call DSTEDC. */ if (! wantz) { _starpu_dsterf_(n, &d__[1], &e[1], info); } else { _starpu_dstedc_("I", n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], lwork, &iwork[1], liwork, info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { d__1 = 1. / sigma; _starpu_dscal_(n, &d__1, &d__[1], &c__1); } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSTEVD */ } /* _starpu_dstevd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstevr.c000066400000000000000000000441671413463044200206710ustar00rootroot00000000000000/* dstevr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__10 = 10; static integer c__1 = 1; static integer c__2 = 2; static integer c__3 = 3; static integer c__4 = 4; /* Subroutine */ int _starpu_dstevr_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, jj; doublereal eps, vll, vuu, tmp1; integer imax; doublereal rmin, rmax; logical test; doublereal tnrm; integer itmp1; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); char order[1]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer lwmin; logical wantz; extern doublereal _starpu_dlamch_(char *); logical alleig, indeig; integer iscale, ieeeok, indibl, indifl; logical valeig; doublereal safmin; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); integer indisp; extern /* Subroutine */ int _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indiwo; extern /* Subroutine */ int _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dstemr_(char *, char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, integer *, logical *, doublereal *, integer *, integer *, integer *, integer *); integer liwmin; logical tryrac; integer nsplit; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEVR computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric tridiagonal matrix T. Eigenvalues and */ /* eigenvectors can be selected by specifying either a range of values */ /* or a range of indices for the desired eigenvalues. */ /* Whenever possible, DSTEVR calls DSTEMR to compute the */ /* eigenspectrum using Relatively Robust Representations. DSTEMR */ /* computes eigenvalues by the dqds algorithm, while orthogonal */ /* eigenvectors are computed from various "good" L D L^T representations */ /* (also known as Relatively Robust Representations). Gram-Schmidt */ /* orthogonalization is avoided as far as possible. More specifically, */ /* the various steps of the algorithm are as follows. For the i-th */ /* unreduced block of T, */ /* (a) Compute T - sigma_i = L_i D_i L_i^T, such that L_i D_i L_i^T */ /* is a relatively robust representation, */ /* (b) Compute the eigenvalues, lambda_j, of L_i D_i L_i^T to high */ /* relative accuracy by the dqds algorithm, */ /* (c) If there is a cluster of close eigenvalues, "choose" sigma_i */ /* close to the cluster, and go to step (a), */ /* (d) Given the approximate eigenvalue lambda_j of L_i D_i L_i^T, */ /* compute the corresponding eigenvector by forming a */ /* rank-revealing twisted factorization. */ /* The desired accuracy of the output can be specified by the input */ /* parameter ABSTOL. */ /* For more details, see "A new O(n^2) algorithm for the symmetric */ /* tridiagonal eigenvalue/eigenvector problem", by Inderjit Dhillon, */ /* Computer Science Division Technical Report No. UCB//CSD-97-971, */ /* UC Berkeley, May 1997. */ /* Note 1 : DSTEVR calls DSTEMR when the full spectrum is requested */ /* on machines which conform to the ieee-754 floating point standard. */ /* DSTEVR calls DSTEBZ and DSTEIN on non-ieee machines and */ /* when partial spectrum requests are made. */ /* Normal execution of DSTEMR may create NaNs and infinities and */ /* hence may abort due to a floating point exception in environments */ /* which do not handle NaNs and infinities in the ieee standard default */ /* manner. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* ********* For RANGE = 'V' or 'I' and IU - IL < N - 1, DSTEBZ and */ /* ********* DSTEIN are called */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix */ /* A. */ /* On exit, D may be multiplied by a constant factor chosen */ /* to avoid over/underflow in computing the eigenvalues. */ /* E (input/output) DOUBLE PRECISION array, dimension (max(1,N-1)) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix A in elements 1 to N-1 of E. */ /* On exit, E may be multiplied by a constant factor chosen */ /* to avoid over/underflow in computing the eigenvalues. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing A to tridiagonal form. */ /* See "Computing Small Singular Values of Bidiagonal Matrices */ /* with Guaranteed High Relative Accuracy," by Demmel and */ /* Kahan, LAPACK Working Note #3. */ /* If high relative accuracy is important, set ABSTOL to */ /* DLAMCH( 'Safe minimum' ). Doing so will guarantee that */ /* eigenvalues are computed to high relative accuracy when */ /* possible in future releases. The current code does not */ /* make any guarantees about high relative accuracy, but */ /* future releases will. See J. Barlow and J. Demmel, */ /* "Computing Accurate Eigensystems of Scaled Diagonally */ /* Dominant Matrices", LAPACK Working Note #7, for a discussion */ /* of which matrices define their eigenvalues to high relative */ /* accuracy. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the selected eigenvalues in */ /* ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M) ) */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* ISUPPZ (output) INTEGER array, dimension ( 2*max(1,M) ) */ /* The support of the eigenvectors in Z, i.e., the indices */ /* indicating the nonzero elements in Z. The i-th eigenvector */ /* is nonzero only in elements ISUPPZ( 2*i-1 ) through */ /* ISUPPZ( 2*i ). */ /* ********* Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1 */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal (and */ /* minimal) LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,20*N). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal (and */ /* minimal) LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. LIWORK >= max(1,10*N). */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: Internal error */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Inderjit Dhillon, IBM Almaden, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Ken Stanley, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --isuppz; --work; --iwork; /* Function Body */ ieeeok = _starpu_ilaenv_(&c__10, "DSTEVR", "N", &c__1, &c__2, &c__3, &c__4); wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); lquery = *lwork == -1 || *liwork == -1; /* Computing MAX */ i__1 = 1, i__2 = *n * 20; lwmin = max(i__1,i__2); /* Computing MAX */ i__1 = 1, i__2 = *n * 10; liwmin = max(i__1,i__2); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (*n < 0) { *info = -3; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -7; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -8; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -9; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -14; } } if (*info == 0) { work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -17; } else if (*liwork < liwmin && ! lquery) { *info = -19; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEVR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } if (*n == 1) { if (alleig || indeig) { *m = 1; w[1] = d__[1]; } else { if (*vl < d__[1] && *vu >= d__[1]) { *m = 1; w[1] = d__[1]; } } if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); /* Scale matrix to allowable range, if necessary. */ iscale = 0; vll = *vl; vuu = *vu; tnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (tnrm > 0. && tnrm < rmin) { iscale = 1; sigma = rmin / tnrm; } else if (tnrm > rmax) { iscale = 1; sigma = rmax / tnrm; } if (iscale == 1) { _starpu_dscal_(n, &sigma, &d__[1], &c__1); i__1 = *n - 1; _starpu_dscal_(&i__1, &sigma, &e[1], &c__1); if (valeig) { vll = *vl * sigma; vuu = *vu * sigma; } } /* Initialize indices into workspaces. Note: These indices are used only */ /* if DSTERF or DSTEMR fail. */ /* IWORK(INDIBL:INDIBL+M-1) corresponds to IBLOCK in DSTEBZ and */ /* stores the block indices of each of the M<=N eigenvalues. */ indibl = 1; /* IWORK(INDISP:INDISP+NSPLIT-1) corresponds to ISPLIT in DSTEBZ and */ /* stores the starting and finishing indices of each block. */ indisp = indibl + *n; /* IWORK(INDIFL:INDIFL+N-1) stores the indices of eigenvectors */ /* that corresponding to eigenvectors that fail to converge in */ /* DSTEIN. This information is discarded; if any fail, the driver */ /* returns INFO > 0. */ indifl = indisp + *n; /* INDIWO is the offset of the remaining integer workspace. */ indiwo = indisp + *n; /* If all eigenvalues are desired, then */ /* call DSTERF or DSTEMR. If this fails for some eigenvalue, then */ /* try DSTEBZ. */ test = FALSE_; if (indeig) { if (*il == 1 && *iu == *n) { test = TRUE_; } } if ((alleig || test) && ieeeok == 1) { i__1 = *n - 1; _starpu_dcopy_(&i__1, &e[1], &c__1, &work[1], &c__1); if (! wantz) { _starpu_dcopy_(n, &d__[1], &c__1, &w[1], &c__1); _starpu_dsterf_(n, &w[1], &work[1], info); } else { _starpu_dcopy_(n, &d__[1], &c__1, &work[*n + 1], &c__1); if (*abstol <= *n * 2. * eps) { tryrac = TRUE_; } else { tryrac = FALSE_; } i__1 = *lwork - (*n << 1); _starpu_dstemr_(jobz, "A", n, &work[*n + 1], &work[1], vl, vu, il, iu, m, &w[1], &z__[z_offset], ldz, n, &isuppz[1], &tryrac, &work[ (*n << 1) + 1], &i__1, &iwork[1], liwork, info); } if (*info == 0) { *m = *n; goto L10; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, DSTEIN. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } _starpu_dstebz_(range, order, n, &vll, &vuu, il, iu, abstol, &d__[1], &e[1], m, & nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[1], &iwork[ indiwo], info); if (wantz) { _starpu_dstein_(n, &d__[1], &e[1], m, &w[1], &iwork[indibl], &iwork[indisp], & z__[z_offset], ldz, &work[1], &iwork[indiwo], &iwork[indifl], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ L10: if (iscale == 1) { if (*info == 0) { imax = *m; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L20: */ } if (i__ != 0) { itmp1 = iwork[i__]; w[i__] = w[j]; iwork[i__] = iwork[j]; w[j] = tmp1; iwork[j] = itmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); } /* L30: */ } } /* Causes problems with tests 19 & 20: */ /* IF (wantz .and. INDEIG ) Z( 1,1) = Z(1,1) / 1.002 + .002 */ work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DSTEVR */ } /* _starpu_dstevr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dstevx.c000066400000000000000000000316741413463044200206760ustar00rootroot00000000000000/* dstevx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dstevx_(char *jobz, char *range, integer *n, doublereal * d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, jj; doublereal eps, vll, vuu, tmp1; integer imax; doublereal rmin, rmax; logical test; doublereal tnrm; integer itmp1; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); char order[1]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical wantz; extern doublereal _starpu_dlamch_(char *); logical alleig, indeig; integer iscale, indibl; logical valeig; doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern doublereal _starpu_dlanst_(char *, integer *, doublereal *, doublereal *); integer indisp; extern /* Subroutine */ int _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indiwo; extern /* Subroutine */ int _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer indwrk; extern /* Subroutine */ int _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer nsplit; doublereal smlnum; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSTEVX computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric tridiagonal matrix A. Eigenvalues and */ /* eigenvectors can be selected by specifying either a range of values */ /* or a range of indices for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* N (input) INTEGER */ /* The order of the matrix. N >= 0. */ /* D (input/output) DOUBLE PRECISION array, dimension (N) */ /* On entry, the n diagonal elements of the tridiagonal matrix */ /* A. */ /* On exit, D may be multiplied by a constant factor chosen */ /* to avoid over/underflow in computing the eigenvalues. */ /* E (input/output) DOUBLE PRECISION array, dimension (max(1,N-1)) */ /* On entry, the (n-1) subdiagonal elements of the tridiagonal */ /* matrix A in elements 1 to N-1 of E. */ /* On exit, E may be multiplied by a constant factor chosen */ /* to avoid over/underflow in computing the eigenvalues. */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less */ /* than or equal to zero, then EPS*|T| will be used in */ /* its place, where |T| is the 1-norm of the tridiagonal */ /* matrix. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* See "Computing Small Singular Values of Bidiagonal Matrices */ /* with Guaranteed High Relative Accuracy," by Demmel and */ /* Kahan, LAPACK Working Note #3. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the selected eigenvalues in */ /* ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M) ) */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If an eigenvector fails to converge (INFO > 0), then that */ /* column of Z contains the latest approximation to the */ /* eigenvector, and the index of the eigenvector is returned */ /* in IFAIL. If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (5*N) */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (N) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvectors that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, then i eigenvectors failed to converge. */ /* Their indices are stored in array IFAIL. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --d__; --e; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (*n < 0) { *info = -3; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -7; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -8; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -9; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -14; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSTEVX", &i__1); return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } if (*n == 1) { if (alleig || indeig) { *m = 1; w[1] = d__[1]; } else { if (*vl < d__[1] && *vu >= d__[1]) { *m = 1; w[1] = d__[1]; } } if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); /* Scale matrix to allowable range, if necessary. */ iscale = 0; if (valeig) { vll = *vl; vuu = *vu; } else { vll = 0.; vuu = 0.; } tnrm = _starpu_dlanst_("M", n, &d__[1], &e[1]); if (tnrm > 0. && tnrm < rmin) { iscale = 1; sigma = rmin / tnrm; } else if (tnrm > rmax) { iscale = 1; sigma = rmax / tnrm; } if (iscale == 1) { _starpu_dscal_(n, &sigma, &d__[1], &c__1); i__1 = *n - 1; _starpu_dscal_(&i__1, &sigma, &e[1], &c__1); if (valeig) { vll = *vl * sigma; vuu = *vu * sigma; } } /* If all eigenvalues are desired and ABSTOL is less than zero, then */ /* call DSTERF or SSTEQR. If this fails for some eigenvalue, then */ /* try DSTEBZ. */ test = FALSE_; if (indeig) { if (*il == 1 && *iu == *n) { test = TRUE_; } } if ((alleig || test) && *abstol <= 0.) { _starpu_dcopy_(n, &d__[1], &c__1, &w[1], &c__1); i__1 = *n - 1; _starpu_dcopy_(&i__1, &e[1], &c__1, &work[1], &c__1); indwrk = *n + 1; if (! wantz) { _starpu_dsterf_(n, &w[1], &work[1], info); } else { _starpu_dsteqr_("I", n, &w[1], &work[1], &z__[z_offset], ldz, &work[ indwrk], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ifail[i__] = 0; /* L10: */ } } } if (*info == 0) { *m = *n; goto L20; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, SSTEIN. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } indwrk = 1; indibl = 1; indisp = indibl + *n; indiwo = indisp + *n; _starpu_dstebz_(range, order, n, &vll, &vuu, il, iu, abstol, &d__[1], &e[1], m, & nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[indwrk], & iwork[indiwo], info); if (wantz) { _starpu_dstein_(n, &d__[1], &e[1], m, &w[1], &iwork[indibl], &iwork[indisp], & z__[z_offset], ldz, &work[indwrk], &iwork[indiwo], &ifail[1], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ L20: if (iscale == 1) { if (*info == 0) { imax = *m; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L30: */ } if (i__ != 0) { itmp1 = iwork[indibl + i__ - 1]; w[i__] = w[j]; iwork[indibl + i__ - 1] = iwork[indibl + j - 1]; w[j] = tmp1; iwork[indibl + j - 1] = itmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); if (*info != 0) { itmp1 = ifail[i__]; ifail[i__] = ifail[j]; ifail[j] = itmp1; } } /* L40: */ } } return 0; /* End of DSTEVX */ } /* _starpu_dstevx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsycon.c000066400000000000000000000127751413463044200206610ustar00rootroot00000000000000/* dsycon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dsycon_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal * work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; /* Local variables */ integer i__, kase; extern logical _starpu_lsame_(char *, char *); integer isave[3]; logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYCON estimates the reciprocal of the condition number (in the */ /* 1-norm) of a real symmetric matrix A using the factorization */ /* A = U*D*U**T or A = L*D*L**T computed by DSYTRF. */ /* An estimate is obtained for norm(inv(A)), and the reciprocal of the */ /* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the details of the factorization are stored */ /* as an upper or lower triangular matrix. */ /* = 'U': Upper triangular, form is A = U*D*U**T; */ /* = 'L': Lower triangular, form is A = L*D*L**T. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSYTRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* ANORM (input) DOUBLE PRECISION */ /* The 1-norm of the original matrix A. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an */ /* estimate of the 1-norm of inv(A) computed in this routine. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*anorm < 0.) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYCON", &i__1); return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { *rcond = 1.; return 0; } else if (*anorm <= 0.) { return 0; } /* Check that the diagonal matrix D is nonsingular. */ if (upper) { /* Upper triangular storage: examine D from bottom to top */ for (i__ = *n; i__ >= 1; --i__) { if (ipiv[i__] > 0 && a[i__ + i__ * a_dim1] == 0.) { return 0; } /* L10: */ } } else { /* Lower triangular storage: examine D from top to bottom. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (ipiv[i__] > 0 && a[i__ + i__ * a_dim1] == 0.) { return 0; } /* L20: */ } } /* Estimate the 1-norm of the inverse. */ kase = 0; L30: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { /* Multiply by inv(L*D*L') or inv(U*D*U'). */ _starpu_dsytrs_(uplo, n, &c__1, &a[a_offset], lda, &ipiv[1], &work[1], n, info); goto L30; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } return 0; /* End of DSYCON */ } /* _starpu_dsycon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyequb.c000066400000000000000000000227761413463044200210400ustar00rootroot00000000000000/* dsyequb.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dsyequb_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *s, doublereal *scond, doublereal *amax, doublereal * work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal), log(doublereal), pow_di(doublereal *, integer *); /* Local variables */ doublereal d__; integer i__, j; doublereal t, u, c0, c1, c2, si; logical up; doublereal avg, std, tol, base; integer iter; doublereal smin, smax, scale; extern logical _starpu_lsame_(char *, char *); doublereal sumsq; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; extern /* Subroutine */ int _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYEQUB computes row and column scalings intended to equilibrate a */ /* symmetric matrix A and reduce its condition number */ /* (with respect to the two-norm). S contains the scale factors, */ /* S(i) = 1/sqrt(A(i,i)), chosen so that the scaled matrix B with */ /* elements B(i,j) = S(i)*A(i,j)*S(j) has ones on the diagonal. This */ /* choice of S puts the condition number of B within a factor N of the */ /* smallest possible condition number over all possible diagonal */ /* scalings. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The N-by-N symmetric matrix whose scaling */ /* factors are to be computed. Only the diagonal elements of A */ /* are referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* S (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, S contains the scale factors for A. */ /* SCOND (output) DOUBLE PRECISION */ /* If INFO = 0, S contains the ratio of the smallest S(i) to */ /* the largest S(i). If SCOND >= 0.1 and AMAX is neither too */ /* large nor too small, it is not worth scaling by S. */ /* AMAX (output) DOUBLE PRECISION */ /* Absolute value of largest matrix element. If AMAX is very */ /* close to overflow or very close to underflow, the matrix */ /* should be scaled. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element is nonpositive. */ /* Further Details */ /* ======= ======= */ /* Reference: Livne, O.E. and Golub, G.H., "Scaling by Binormalization", */ /* Numerical Algorithms, vol. 35, no. 1, pp. 97-120, January 2004. */ /* DOI 10.1023/B:NUMA.0000016606.32820.69 */ /* Tech report version: http://ruready.utah.edu/archive/papers/bin.pdf */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s; --work; /* Function Body */ *info = 0; if (! (_starpu_lsame_(uplo, "U") || _starpu_lsame_(uplo, "L"))) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYEQUB", &i__1); return 0; } up = _starpu_lsame_(uplo, "U"); *amax = 0.; /* Quick return if possible. */ if (*n == 0) { *scond = 1.; return 0; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { s[i__] = 0.; } *amax = 0.; if (up) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = s[i__], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); s[i__] = max(d__2,d__3); /* Computing MAX */ d__2 = s[j], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); s[j] = max(d__2,d__3); /* Computing MAX */ d__2 = *amax, d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); *amax = max(d__2,d__3); } /* Computing MAX */ d__2 = s[j], d__3 = (d__1 = a[j + j * a_dim1], abs(d__1)); s[j] = max(d__2,d__3); /* Computing MAX */ d__2 = *amax, d__3 = (d__1 = a[j + j * a_dim1], abs(d__1)); *amax = max(d__2,d__3); } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ d__2 = s[j], d__3 = (d__1 = a[j + j * a_dim1], abs(d__1)); s[j] = max(d__2,d__3); /* Computing MAX */ d__2 = *amax, d__3 = (d__1 = a[j + j * a_dim1], abs(d__1)); *amax = max(d__2,d__3); i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = s[i__], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); s[i__] = max(d__2,d__3); /* Computing MAX */ d__2 = s[j], d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); s[j] = max(d__2,d__3); /* Computing MAX */ d__2 = *amax, d__3 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); *amax = max(d__2,d__3); } } } i__1 = *n; for (j = 1; j <= i__1; ++j) { s[j] = 1. / s[j]; } tol = 1. / sqrt(*n * 2.); for (iter = 1; iter <= 100; ++iter) { scale = 0.; sumsq = 0.; /* BETA = |A|S */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; } if (up) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { t = (d__1 = a[i__ + j * a_dim1], abs(d__1)); work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)) * s[ j]; work[j] += (d__1 = a[i__ + j * a_dim1], abs(d__1)) * s[ i__]; } work[j] += (d__1 = a[j + j * a_dim1], abs(d__1)) * s[j]; } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] += (d__1 = a[j + j * a_dim1], abs(d__1)) * s[j]; i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { t = (d__1 = a[i__ + j * a_dim1], abs(d__1)); work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)) * s[ j]; work[j] += (d__1 = a[i__ + j * a_dim1], abs(d__1)) * s[ i__]; } } } /* avg = s^T beta / n */ avg = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { avg += s[i__] * work[i__]; } avg /= *n; std = 0.; i__1 = *n * 3; for (i__ = (*n << 1) + 1; i__ <= i__1; ++i__) { work[i__] = s[i__ - (*n << 1)] * work[i__ - (*n << 1)] - avg; } _starpu_dlassq_(n, &work[(*n << 1) + 1], &c__1, &scale, &sumsq); std = scale * sqrt(sumsq / *n); if (std < tol * avg) { goto L999; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { t = (d__1 = a[i__ + i__ * a_dim1], abs(d__1)); si = s[i__]; c2 = (*n - 1) * t; c1 = (*n - 2) * (work[i__] - t * si); c0 = -(t * si) * si + work[i__] * 2 * si - *n * avg; d__ = c1 * c1 - c0 * 4 * c2; if (d__ <= 0.) { *info = -1; return 0; } si = c0 * -2 / (c1 + sqrt(d__)); d__ = si - s[i__]; u = 0.; if (up) { i__2 = i__; for (j = 1; j <= i__2; ++j) { t = (d__1 = a[j + i__ * a_dim1], abs(d__1)); u += s[j] * t; work[j] += d__ * t; } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { t = (d__1 = a[i__ + j * a_dim1], abs(d__1)); u += s[j] * t; work[j] += d__ * t; } } else { i__2 = i__; for (j = 1; j <= i__2; ++j) { t = (d__1 = a[i__ + j * a_dim1], abs(d__1)); u += s[j] * t; work[j] += d__ * t; } i__2 = *n; for (j = i__ + 1; j <= i__2; ++j) { t = (d__1 = a[j + i__ * a_dim1], abs(d__1)); u += s[j] * t; work[j] += d__ * t; } } avg += (u + work[i__]) * d__ / *n; s[i__] = si; } } L999: smlnum = _starpu_dlamch_("SAFEMIN"); bignum = 1. / smlnum; smin = bignum; smax = 0.; t = 1. / sqrt(avg); base = _starpu_dlamch_("B"); u = 1. / log(base); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = (integer) (u * log(s[i__] * t)); s[i__] = pow_di(&base, &i__2); /* Computing MIN */ d__1 = smin, d__2 = s[i__]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = smax, d__2 = s[i__]; smax = max(d__1,d__2); } *scond = max(smin,smlnum) / min(smax,bignum); return 0; } /* _starpu_dsyequb_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyev.c000066400000000000000000000205761413463044200205120ustar00rootroot00000000000000/* dsyev.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b17 = 1.; /* Subroutine */ int _starpu_dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer nb; doublereal eps; integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; logical lower, wantz; extern doublereal _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); doublereal safmin; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; integer indtau; extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); integer indwrk; extern /* Subroutine */ int _starpu_dorgtr_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer llwork; doublereal smlnum; integer lwkopt; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYEV computes all eigenvalues and, optionally, eigenvectors of a */ /* real symmetric matrix A. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ /* orthonormal eigenvectors of the matrix A. */ /* If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ /* or the upper triangle (if UPLO='U') of A, including the */ /* diagonal, is destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of the array WORK. LWORK >= max(1,3*N-1). */ /* For optimal efficiency, LWORK >= (NB+2)*N, */ /* where NB is the blocksize for DSYTRD returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the algorithm failed to converge; i */ /* off-diagonal elements of an intermediate tridiagonal */ /* form did not converge to zero. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); lower = _starpu_lsame_(uplo, "L"); lquery = *lwork == -1; *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info == 0) { nb = _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); /* Computing MAX */ i__1 = 1, i__2 = (nb + 2) * *n; lwkopt = max(i__1,i__2); work[1] = (doublereal) lwkopt; /* Computing MAX */ i__1 = 1, i__2 = *n * 3 - 1; if (*lwork < max(i__1,i__2) && ! lquery) { *info = -8; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYEV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { w[1] = a[a_dim1 + 1]; work[1] = 2.; if (wantz) { a[a_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = _starpu_dlansy_("M", uplo, n, &a[a_offset], lda, &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { _starpu_dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, info); } /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ inde = 1; indtau = inde + *n; indwrk = indtau + *n; llwork = *lwork - indwrk + 1; _starpu_dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & work[indwrk], &llwork, &iinfo); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* DORGTR to generate the orthogonal matrix, then call DSTEQR. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { _starpu_dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & llwork, &iinfo); _starpu_dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], info); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { if (*info == 0) { imax = *n; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* Set WORK(1) to optimal workspace size. */ work[1] = (doublereal) lwkopt; return 0; /* End of DSYEV */ } /* _starpu_dsyev_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyevd.c000066400000000000000000000267251413463044200206600ustar00rootroot00000000000000/* dsyevd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b17 = 1.; /* Subroutine */ int _starpu_dsyevd_(char *jobz, char *uplo, integer *n, doublereal * a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal eps; integer inde; doublereal anrm, rmin, rmax; integer lopt; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo, lwmin, liopt; logical lower, wantz; integer indwk2, llwrk2; extern doublereal _starpu_dlamch_(char *); integer iscale; extern /* Subroutine */ int _starpu_dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *), _starpu_dlacpy_( char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; integer indtau; extern /* Subroutine */ int _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); integer indwrk, liwmin; extern /* Subroutine */ int _starpu_dormtr_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer llwork; doublereal smlnum; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYEVD computes all eigenvalues and, optionally, eigenvectors of a */ /* real symmetric matrix A. If eigenvectors are desired, it uses a */ /* divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Because of large use of BLAS of level 3, DSYEVD needs N**2 more */ /* workspace than DSYEVX. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ /* orthonormal eigenvectors of the matrix A. */ /* If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ /* or the upper triangle (if UPLO='U') of A, including the */ /* diagonal, is destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* WORK (workspace/output) DOUBLE PRECISION array, */ /* dimension (LWORK) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N <= 1, LWORK must be at least 1. */ /* If JOBZ = 'N' and N > 1, LWORK must be at least 2*N+1. */ /* If JOBZ = 'V' and N > 1, LWORK must be at least */ /* 1 + 6*N + 2*N**2. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If N <= 1, LIWORK must be at least 1. */ /* If JOBZ = 'N' and N > 1, LIWORK must be at least 1. */ /* If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i and JOBZ = 'N', then the algorithm failed */ /* to converge; i off-diagonal elements of an intermediate */ /* tridiagonal form did not converge to zero; */ /* if INFO = i and JOBZ = 'V', then the algorithm failed */ /* to compute an eigenvalue while working on the submatrix */ /* lying in rows and columns INFO/(N+1) through */ /* mod(INFO,N+1). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Jeff Rutter, Computer Science Division, University of California */ /* at Berkeley, USA */ /* Modified by Francoise Tisseur, University of Tennessee. */ /* Modified description of INFO. Sven, 16 Feb 05. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); lower = _starpu_lsame_(uplo, "L"); lquery = *lwork == -1 || *liwork == -1; *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info == 0) { if (*n <= 1) { liwmin = 1; lwmin = 1; lopt = lwmin; liopt = liwmin; } else { if (wantz) { liwmin = *n * 5 + 3; /* Computing 2nd power */ i__1 = *n; lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); } else { liwmin = 1; lwmin = (*n << 1) + 1; } /* Computing MAX */ i__1 = lwmin, i__2 = (*n << 1) + _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); lopt = max(i__1,i__2); liopt = liwmin; } work[1] = (doublereal) lopt; iwork[1] = liopt; if (*lwork < lwmin && ! lquery) { *info = -8; } else if (*liwork < liwmin && ! lquery) { *info = -10; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYEVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { w[1] = a[a_dim1 + 1]; if (wantz) { a[a_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); /* Scale matrix to allowable range, if necessary. */ anrm = _starpu_dlansy_("M", uplo, n, &a[a_offset], lda, &work[1]); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { _starpu_dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, info); } /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ inde = 1; indtau = inde + *n; indwrk = indtau + *n; llwork = *lwork - indwrk + 1; indwk2 = indwrk + *n * *n; llwrk2 = *lwork - indwk2 + 1; _starpu_dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & work[indwrk], &llwork, &iinfo); lopt = (integer) ((*n << 1) + work[indwrk]); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* DSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ /* tridiagonal matrix, then call DORMTR to multiply it by the */ /* Householder transformations stored in A. */ if (! wantz) { _starpu_dsterf_(n, &w[1], &work[inde], info); } else { _starpu_dstedc_("I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & llwrk2, &iwork[1], liwork, info); _starpu_dormtr_("L", uplo, "N", n, n, &a[a_offset], lda, &work[indtau], &work[ indwrk], n, &work[indwk2], &llwrk2, &iinfo); _starpu_dlacpy_("A", n, n, &work[indwrk], n, &a[a_offset], lda); /* Computing MAX */ /* Computing 2nd power */ i__3 = *n; i__1 = lopt, i__2 = *n * 6 + 1 + (i__3 * i__3 << 1); lopt = max(i__1,i__2); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { d__1 = 1. / sigma; _starpu_dscal_(n, &d__1, &w[1], &c__1); } work[1] = (doublereal) lopt; iwork[1] = liopt; return 0; /* End of DSYEVD */ } /* _starpu_dsyevd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyevr.c000066400000000000000000000557021413463044200206730ustar00rootroot00000000000000/* dsyevr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__10 = 10; static integer c__1 = 1; static integer c__2 = 2; static integer c__3 = 3; static integer c__4 = 4; static integer c_n1 = -1; /* Subroutine */ int _starpu_dsyevr_(char *jobz, char *range, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, nb, jj; doublereal eps, vll, vuu, tmp1; integer indd, inde; doublereal anrm; integer imax; doublereal rmin, rmax; integer inddd, indee; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; char order[1]; integer indwk; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer lwmin; logical lower, wantz; extern doublereal _starpu_dlamch_(char *); logical alleig, indeig; integer iscale, ieeeok, indibl, indifl; logical valeig; doublereal safmin; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal abstll, bignum; integer indtau, indisp; extern /* Subroutine */ int _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indiwo, indwkn; extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dstemr_(char *, char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, integer *, logical *, doublereal *, integer *, integer *, integer *, integer *); integer liwmin; logical tryrac; extern /* Subroutine */ int _starpu_dormtr_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer llwrkn, llwork, nsplit; doublereal smlnum; extern /* Subroutine */ int _starpu_dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYEVR computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric matrix A. Eigenvalues and eigenvectors can be */ /* selected by specifying either a range of values or a range of */ /* indices for the desired eigenvalues. */ /* DSYEVR first reduces the matrix A to tridiagonal form T with a call */ /* to DSYTRD. Then, whenever possible, DSYEVR calls DSTEMR to compute */ /* the eigenspectrum using Relatively Robust Representations. DSTEMR */ /* computes eigenvalues by the dqds algorithm, while orthogonal */ /* eigenvectors are computed from various "good" L D L^T representations */ /* (also known as Relatively Robust Representations). Gram-Schmidt */ /* orthogonalization is avoided as far as possible. More specifically, */ /* the various steps of the algorithm are as follows. */ /* For each unreduced block (submatrix) of T, */ /* (a) Compute T - sigma I = L D L^T, so that L and D */ /* define all the wanted eigenvalues to high relative accuracy. */ /* This means that small relative changes in the entries of D and L */ /* cause only small relative changes in the eigenvalues and */ /* eigenvectors. The standard (unfactored) representation of the */ /* tridiagonal matrix T does not have this property in general. */ /* (b) Compute the eigenvalues to suitable accuracy. */ /* If the eigenvectors are desired, the algorithm attains full */ /* accuracy of the computed eigenvalues only right before */ /* the corresponding vectors have to be computed, see steps c) and d). */ /* (c) For each cluster of close eigenvalues, select a new */ /* shift close to the cluster, find a new factorization, and refine */ /* the shifted eigenvalues to suitable accuracy. */ /* (d) For each eigenvalue with a large enough relative separation compute */ /* the corresponding eigenvector by forming a rank revealing twisted */ /* factorization. Go back to (c) for any clusters that remain. */ /* The desired accuracy of the output can be specified by the input */ /* parameter ABSTOL. */ /* For more details, see DSTEMR's documentation and: */ /* - Inderjit S. Dhillon and Beresford N. Parlett: "Multiple representations */ /* to compute orthogonal eigenvectors of symmetric tridiagonal matrices," */ /* Linear Algebra and its Applications, 387(1), pp. 1-28, August 2004. */ /* - Inderjit Dhillon and Beresford Parlett: "Orthogonal Eigenvectors and */ /* Relative Gaps," SIAM Journal on Matrix Analysis and Applications, Vol. 25, */ /* 2004. Also LAPACK Working Note 154. */ /* - Inderjit Dhillon: "A new O(n^2) algorithm for the symmetric */ /* tridiagonal eigenvalue/eigenvector problem", */ /* Computer Science Division Technical Report No. UCB/CSD-97-971, */ /* UC Berkeley, May 1997. */ /* Note 1 : DSYEVR calls DSTEMR when the full spectrum is requested */ /* on machines which conform to the ieee-754 floating point standard. */ /* DSYEVR calls DSTEBZ and SSTEIN on non-ieee machines and */ /* when partial spectrum requests are made. */ /* Normal execution of DSTEMR may create NaNs and infinities and */ /* hence may abort due to a floating point exception in environments */ /* which do not handle NaNs and infinities in the ieee standard default */ /* manner. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* ********* For RANGE = 'V' or 'I' and IU - IL < N - 1, DSTEBZ and */ /* ********* DSTEIN are called */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, the lower triangle (if UPLO='L') or the upper */ /* triangle (if UPLO='U') of A, including the diagonal, is */ /* destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing A to tridiagonal form. */ /* See "Computing Small Singular Values of Bidiagonal Matrices */ /* with Guaranteed High Relative Accuracy," by Demmel and */ /* Kahan, LAPACK Working Note #3. */ /* If high relative accuracy is important, set ABSTOL to */ /* DLAMCH( 'Safe minimum' ). Doing so will guarantee that */ /* eigenvalues are computed to high relative accuracy when */ /* possible in future releases. The current code does not */ /* make any guarantees about high relative accuracy, but */ /* future releases will. See J. Barlow and J. Demmel, */ /* "Computing Accurate Eigensystems of Scaled Diagonally */ /* Dominant Matrices", LAPACK Working Note #7, for a discussion */ /* of which matrices define their eigenvalues to high relative */ /* accuracy. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* The first M elements contain the selected eigenvalues in */ /* ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M)) */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* Supplying N columns is always safe. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* ISUPPZ (output) INTEGER array, dimension ( 2*max(1,M) ) */ /* The support of the eigenvectors in Z, i.e., the indices */ /* indicating the nonzero elements in Z. The i-th eigenvector */ /* is nonzero only in elements ISUPPZ( 2*i-1 ) through */ /* ISUPPZ( 2*i ). */ /* ********* Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1 */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,26*N). */ /* For optimal efficiency, LWORK >= (NB+6)*N, */ /* where NB is the max of the blocksize for DSYTRD and DORMTR */ /* returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. LIWORK >= max(1,10*N). */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal size of the IWORK array, */ /* returns this value as the first entry of the IWORK array, and */ /* no error message related to LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: Internal error */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Inderjit Dhillon, IBM Almaden, USA */ /* Osni Marques, LBNL/NERSC, USA */ /* Ken Stanley, Computer Science Division, University of */ /* California at Berkeley, USA */ /* Jason Riedy, Computer Science Division, University of */ /* California at Berkeley, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --isuppz; --work; --iwork; /* Function Body */ ieeeok = _starpu_ilaenv_(&c__10, "DSYEVR", "N", &c__1, &c__2, &c__3, &c__4); lower = _starpu_lsame_(uplo, "L"); wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); lquery = *lwork == -1 || *liwork == -1; /* Computing MAX */ i__1 = 1, i__2 = *n * 26; lwmin = max(i__1,i__2); /* Computing MAX */ i__1 = 1, i__2 = *n * 10; liwmin = max(i__1,i__2); *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -8; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -9; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -10; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -15; } else if (*lwork < lwmin && ! lquery) { *info = -18; } else if (*liwork < liwmin && ! lquery) { *info = -20; } } if (*info == 0) { nb = _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMTR", uplo, n, &c_n1, &c_n1, & c_n1); nb = max(i__1,i__2); /* Computing MAX */ i__1 = (nb + 1) * *n; lwkopt = max(i__1,lwmin); work[1] = (doublereal) lwkopt; iwork[1] = liwmin; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYEVR", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { work[1] = 1.; return 0; } if (*n == 1) { work[1] = 7.; if (alleig || indeig) { *m = 1; w[1] = a[a_dim1 + 1]; } else { if (*vl < a[a_dim1 + 1] && *vu >= a[a_dim1 + 1]) { *m = 1; w[1] = a[a_dim1 + 1]; } } if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); /* Scale matrix to allowable range, if necessary. */ iscale = 0; abstll = *abstol; vll = *vl; vuu = *vu; anrm = _starpu_dlansy_("M", uplo, n, &a[a_offset], lda, &work[1]); if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { if (lower) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n - j + 1; _starpu_dscal_(&i__2, &sigma, &a[j + j * a_dim1], &c__1); /* L10: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dscal_(&j, &sigma, &a[j * a_dim1 + 1], &c__1); /* L20: */ } } if (*abstol > 0.) { abstll = *abstol * sigma; } if (valeig) { vll = *vl * sigma; vuu = *vu * sigma; } } /* Initialize indices into workspaces. Note: The IWORK indices are */ /* used only if DSTERF or DSTEMR fail. */ /* WORK(INDTAU:INDTAU+N-1) stores the scalar factors of the */ /* elementary reflectors used in DSYTRD. */ indtau = 1; /* WORK(INDD:INDD+N-1) stores the tridiagonal's diagonal entries. */ indd = indtau + *n; /* WORK(INDE:INDE+N-1) stores the off-diagonal entries of the */ /* tridiagonal matrix from DSYTRD. */ inde = indd + *n; /* WORK(INDDD:INDDD+N-1) is a copy of the diagonal entries over */ /* -written by DSTEMR (the DSTERF path copies the diagonal to W). */ inddd = inde + *n; /* WORK(INDEE:INDEE+N-1) is a copy of the off-diagonal entries over */ /* -written while computing the eigenvalues in DSTERF and DSTEMR. */ indee = inddd + *n; /* INDWK is the starting offset of the left-over workspace, and */ /* LLWORK is the remaining workspace size. */ indwk = indee + *n; llwork = *lwork - indwk + 1; /* IWORK(INDIBL:INDIBL+M-1) corresponds to IBLOCK in DSTEBZ and */ /* stores the block indices of each of the M<=N eigenvalues. */ indibl = 1; /* IWORK(INDISP:INDISP+NSPLIT-1) corresponds to ISPLIT in DSTEBZ and */ /* stores the starting and finishing indices of each block. */ indisp = indibl + *n; /* IWORK(INDIFL:INDIFL+N-1) stores the indices of eigenvectors */ /* that corresponding to eigenvectors that fail to converge in */ /* DSTEIN. This information is discarded; if any fail, the driver */ /* returns INFO > 0. */ indifl = indisp + *n; /* INDIWO is the offset of the remaining integer workspace. */ indiwo = indisp + *n; /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ _starpu_dsytrd_(uplo, n, &a[a_offset], lda, &work[indd], &work[inde], &work[ indtau], &work[indwk], &llwork, &iinfo); /* If all eigenvalues are desired */ /* then call DSTERF or DSTEMR and DORMTR. */ if ((alleig || indeig && *il == 1 && *iu == *n) && ieeeok == 1) { if (! wantz) { _starpu_dcopy_(n, &work[indd], &c__1, &w[1], &c__1); i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsterf_(n, &w[1], &work[indee], info); } else { i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dcopy_(n, &work[indd], &c__1, &work[inddd], &c__1); if (*abstol <= *n * 2. * eps) { tryrac = TRUE_; } else { tryrac = FALSE_; } _starpu_dstemr_(jobz, "A", n, &work[inddd], &work[indee], vl, vu, il, iu, m, &w[1], &z__[z_offset], ldz, n, &isuppz[1], &tryrac, & work[indwk], lwork, &iwork[1], liwork, info); /* Apply orthogonal matrix used in reduction to tridiagonal */ /* form to eigenvectors returned by DSTEIN. */ if (wantz && *info == 0) { indwkn = inde; llwrkn = *lwork - indwkn + 1; _starpu_dormtr_("L", uplo, "N", n, m, &a[a_offset], lda, &work[indtau] , &z__[z_offset], ldz, &work[indwkn], &llwrkn, &iinfo); } } if (*info == 0) { /* Everything worked. Skip DSTEBZ/DSTEIN. IWORK(:) are */ /* undefined. */ *m = *n; goto L30; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, DSTEIN. */ /* Also call DSTEBZ and DSTEIN if DSTEMR fails. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } _starpu_dstebz_(range, order, n, &vll, &vuu, il, iu, &abstll, &work[indd], &work[ inde], m, &nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[ indwk], &iwork[indiwo], info); if (wantz) { _starpu_dstein_(n, &work[indd], &work[inde], m, &w[1], &iwork[indibl], &iwork[ indisp], &z__[z_offset], ldz, &work[indwk], &iwork[indiwo], & iwork[indifl], info); /* Apply orthogonal matrix used in reduction to tridiagonal */ /* form to eigenvectors returned by DSTEIN. */ indwkn = inde; llwrkn = *lwork - indwkn + 1; _starpu_dormtr_("L", uplo, "N", n, m, &a[a_offset], lda, &work[indtau], &z__[ z_offset], ldz, &work[indwkn], &llwrkn, &iinfo); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ /* Jump here if DSTEMR/DSTEIN succeeded. */ L30: if (iscale == 1) { if (*info == 0) { imax = *m; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. Note: We do not sort the IFAIL portion of IWORK. */ /* It may not be initialized (if DSTEMR/DSTEIN succeeded), and we do */ /* not return this detailed information to the user. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L40: */ } if (i__ != 0) { w[i__] = w[j]; w[j] = tmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); } /* L50: */ } } /* Set WORK(1) to optimal workspace size. */ work[1] = (doublereal) lwkopt; iwork[1] = liwmin; return 0; /* End of DSYEVR */ } /* _starpu_dsyevr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyevx.c000066400000000000000000000415161413463044200206770ustar00rootroot00000000000000/* dsyevx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dsyevx_(char *jobz, char *range, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, nb, jj; doublereal eps, vll, vuu, tmp1; integer indd, inde; doublereal anrm; integer imax; doublereal rmin, rmax; logical test; integer itmp1, indee; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical _starpu_lsame_(char *, char *); integer iinfo; char order[1]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical lower, wantz; extern doublereal _starpu_dlamch_(char *); logical alleig, indeig; integer iscale, indibl; logical valeig; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal safmin; extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal abstll, bignum; integer indtau, indisp; extern /* Subroutine */ int _starpu_dstein_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), _starpu_dsterf_(integer *, doublereal *, doublereal *, integer *); integer indiwo, indwkn; extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dstebz_(char *, char *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer indwrk, lwkmin; extern /* Subroutine */ int _starpu_dorgtr_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *), _starpu_dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dormtr_(char *, char *, char *, integer *, integer *, doublereal * , integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); integer llwrkn, llwork, nsplit; doublereal smlnum; extern /* Subroutine */ int _starpu_dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYEVX computes selected eigenvalues and, optionally, eigenvectors */ /* of a real symmetric matrix A. Eigenvalues and eigenvectors can be */ /* selected by specifying either a range of values or a range of indices */ /* for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, the lower triangle (if UPLO='L') or the upper */ /* triangle (if UPLO='U') of A, including the diagonal, is */ /* destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing A to tridiagonal form. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* See "Computing Small Singular Values of Bidiagonal Matrices */ /* with Guaranteed High Relative Accuracy," by Demmel and */ /* Kahan, LAPACK Working Note #3. */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* On normal exit, the first M elements contain the selected */ /* eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M)) */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* If an eigenvector fails to converge, then that column of Z */ /* contains the latest approximation to the eigenvector, and the */ /* index of the eigenvector is returned in IFAIL. */ /* If JOBZ = 'N', then Z is not referenced. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of the array WORK. LWORK >= 1, when N <= 1; */ /* otherwise 8*N. */ /* For optimal efficiency, LWORK >= (NB+3)*N, */ /* where NB is the max of the blocksize for DSYTRD and DORMTR */ /* returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (N) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvectors that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, then i eigenvectors failed to converge. */ /* Their indices are stored in array IFAIL. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ lower = _starpu_lsame_(uplo, "L"); wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); lquery = *lwork == -1; *info = 0; if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -1; } else if (! (alleig || valeig || indeig)) { *info = -2; } else if (! (lower || _starpu_lsame_(uplo, "U"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -8; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -9; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -10; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -15; } } if (*info == 0) { if (*n <= 1) { lwkmin = 1; work[1] = (doublereal) lwkmin; } else { lwkmin = *n << 3; nb = _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__1, "DORMTR", uplo, n, &c_n1, &c_n1, &c_n1); nb = max(i__1,i__2); /* Computing MAX */ i__1 = lwkmin, i__2 = (nb + 3) * *n; lwkopt = max(i__1,i__2); work[1] = (doublereal) lwkopt; } if (*lwork < lwkmin && ! lquery) { *info = -17; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYEVX", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } if (*n == 1) { if (alleig || indeig) { *m = 1; w[1] = a[a_dim1 + 1]; } else { if (*vl < a[a_dim1 + 1] && *vu >= a[a_dim1 + 1]) { *m = 1; w[1] = a[a_dim1 + 1]; } } if (wantz) { z__[z_dim1 + 1] = 1.; } return 0; } /* Get machine constants. */ safmin = _starpu_dlamch_("Safe minimum"); eps = _starpu_dlamch_("Precision"); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); /* Computing MIN */ d__1 = sqrt(bignum), d__2 = 1. / sqrt(sqrt(safmin)); rmax = min(d__1,d__2); /* Scale matrix to allowable range, if necessary. */ iscale = 0; abstll = *abstol; if (valeig) { vll = *vl; vuu = *vu; } anrm = _starpu_dlansy_("M", uplo, n, &a[a_offset], lda, &work[1]); if (anrm > 0. && anrm < rmin) { iscale = 1; sigma = rmin / anrm; } else if (anrm > rmax) { iscale = 1; sigma = rmax / anrm; } if (iscale == 1) { if (lower) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n - j + 1; _starpu_dscal_(&i__2, &sigma, &a[j + j * a_dim1], &c__1); /* L10: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dscal_(&j, &sigma, &a[j * a_dim1 + 1], &c__1); /* L20: */ } } if (*abstol > 0.) { abstll = *abstol * sigma; } if (valeig) { vll = *vl * sigma; vuu = *vu * sigma; } } /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ indtau = 1; inde = indtau + *n; indd = inde + *n; indwrk = indd + *n; llwork = *lwork - indwrk + 1; _starpu_dsytrd_(uplo, n, &a[a_offset], lda, &work[indd], &work[inde], &work[ indtau], &work[indwrk], &llwork, &iinfo); /* If all eigenvalues are desired and ABSTOL is less than or equal to */ /* zero, then call DSTERF or DORGTR and SSTEQR. If this fails for */ /* some eigenvalue, then try DSTEBZ. */ test = FALSE_; if (indeig) { if (*il == 1 && *iu == *n) { test = TRUE_; } } if ((alleig || test) && *abstol <= 0.) { _starpu_dcopy_(n, &work[indd], &c__1, &w[1], &c__1); indee = indwrk + (*n << 1); if (! wantz) { i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsterf_(n, &w[1], &work[indee], info); } else { _starpu_dlacpy_("A", n, n, &a[a_offset], lda, &z__[z_offset], ldz); _starpu_dorgtr_(uplo, n, &z__[z_offset], ldz, &work[indtau], &work[indwrk] , &llwork, &iinfo); i__1 = *n - 1; _starpu_dcopy_(&i__1, &work[inde], &c__1, &work[indee], &c__1); _starpu_dsteqr_(jobz, n, &w[1], &work[indee], &z__[z_offset], ldz, &work[ indwrk], info); if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { ifail[i__] = 0; /* L30: */ } } } if (*info == 0) { *m = *n; goto L40; } *info = 0; } /* Otherwise, call DSTEBZ and, if eigenvectors are desired, SSTEIN. */ if (wantz) { *(unsigned char *)order = 'B'; } else { *(unsigned char *)order = 'E'; } indibl = 1; indisp = indibl + *n; indiwo = indisp + *n; _starpu_dstebz_(range, order, n, &vll, &vuu, il, iu, &abstll, &work[indd], &work[ inde], m, &nsplit, &w[1], &iwork[indibl], &iwork[indisp], &work[ indwrk], &iwork[indiwo], info); if (wantz) { _starpu_dstein_(n, &work[indd], &work[inde], m, &w[1], &iwork[indibl], &iwork[ indisp], &z__[z_offset], ldz, &work[indwrk], &iwork[indiwo], & ifail[1], info); /* Apply orthogonal matrix used in reduction to tridiagonal */ /* form to eigenvectors returned by DSTEIN. */ indwkn = inde; llwrkn = *lwork - indwkn + 1; _starpu_dormtr_("L", uplo, "N", n, m, &a[a_offset], lda, &work[indtau], &z__[ z_offset], ldz, &work[indwkn], &llwrkn, &iinfo); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ L40: if (iscale == 1) { if (*info == 0) { imax = *m; } else { imax = *info - 1; } d__1 = 1. / sigma; _starpu_dscal_(&imax, &d__1, &w[1], &c__1); } /* If eigenvalues are not in order, then sort them, along with */ /* eigenvectors. */ if (wantz) { i__1 = *m - 1; for (j = 1; j <= i__1; ++j) { i__ = 0; tmp1 = w[j]; i__2 = *m; for (jj = j + 1; jj <= i__2; ++jj) { if (w[jj] < tmp1) { i__ = jj; tmp1 = w[jj]; } /* L50: */ } if (i__ != 0) { itmp1 = iwork[indibl + i__ - 1]; w[i__] = w[j]; iwork[indibl + i__ - 1] = iwork[indibl + j - 1]; w[j] = tmp1; iwork[indibl + j - 1] = itmp1; _starpu_dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[j * z_dim1 + 1], &c__1); if (*info != 0) { itmp1 = ifail[i__]; ifail[i__] = ifail[j]; ifail[j] = itmp1; } } /* L60: */ } } /* Set WORK(1) to optimal workspace size. */ work[1] = (doublereal) lwkopt; return 0; /* End of DSYEVX */ } /* _starpu_dsyevx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsygs2.c000066400000000000000000000215161413463044200205660ustar00rootroot00000000000000/* dsygs2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b6 = -1.; static integer c__1 = 1; static doublereal c_b27 = 1.; /* Subroutine */ int _starpu_dsygs2_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer k; doublereal ct, akk, bkk; extern /* Subroutine */ int _starpu_dsyr2_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrsv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYGS2 reduces a real symmetric-definite generalized eigenproblem */ /* to standard form. */ /* If ITYPE = 1, the problem is A*x = lambda*B*x, */ /* and A is overwritten by inv(U')*A*inv(U) or inv(L)*A*inv(L') */ /* If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ /* B*A*x = lambda*x, and A is overwritten by U*A*U` or L'*A*L. */ /* B must have been previously factorized as U'*U or L*L' by DPOTRF. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* = 1: compute inv(U')*A*inv(U) or inv(L)*A*inv(L'); */ /* = 2 or 3: compute U*A*U' or L'*A*L. */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored, and how B has been factorized. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n by n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n by n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the transformed matrix, stored in the */ /* same format as A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,N) */ /* The triangular factor from the Cholesky factorization of B, */ /* as returned by DPOTRF. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (*itype < 1 || *itype > 3) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYGS2", &i__1); return 0; } if (*itype == 1) { if (upper) { /* Compute inv(U')*A*inv(U) */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the upper triangle of A(k:n,k:n) */ akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; /* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; a[k + k * a_dim1] = akk; if (k < *n) { i__2 = *n - k; d__1 = 1. / bkk; _starpu_dscal_(&i__2, &d__1, &a[k + (k + 1) * a_dim1], lda); ct = akk * -.5; i__2 = *n - k; _starpu_daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( k + 1) * a_dim1], lda); i__2 = *n - k; _starpu_dsyr2_(uplo, &i__2, &c_b6, &a[k + (k + 1) * a_dim1], lda, &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) * a_dim1], lda); i__2 = *n - k; _starpu_daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( k + 1) * a_dim1], lda); i__2 = *n - k; _starpu_dtrsv_(uplo, "Transpose", "Non-unit", &i__2, &b[k + 1 + ( k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], lda); } /* L10: */ } } else { /* Compute inv(L)*A*inv(L') */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the lower triangle of A(k:n,k:n) */ akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; /* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; a[k + k * a_dim1] = akk; if (k < *n) { i__2 = *n - k; d__1 = 1. / bkk; _starpu_dscal_(&i__2, &d__1, &a[k + 1 + k * a_dim1], &c__1); ct = akk * -.5; i__2 = *n - k; _starpu_daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + k * a_dim1], &c__1); i__2 = *n - k; _starpu_dsyr2_(uplo, &i__2, &c_b6, &a[k + 1 + k * a_dim1], &c__1, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) * a_dim1], lda); i__2 = *n - k; _starpu_daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + k * a_dim1], &c__1); i__2 = *n - k; _starpu_dtrsv_(uplo, "No transpose", "Non-unit", &i__2, &b[k + 1 + (k + 1) * b_dim1], ldb, &a[k + 1 + k * a_dim1], &c__1); } /* L20: */ } } } else { if (upper) { /* Compute U*A*U' */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the upper triangle of A(1:k,1:k) */ akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; i__2 = k - 1; _starpu_dtrmv_(uplo, "No transpose", "Non-unit", &i__2, &b[b_offset], ldb, &a[k * a_dim1 + 1], &c__1); ct = akk * .5; i__2 = k - 1; _starpu_daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); i__2 = k - 1; _starpu_dsyr2_(uplo, &i__2, &c_b27, &a[k * a_dim1 + 1], &c__1, &b[k * b_dim1 + 1], &c__1, &a[a_offset], lda); i__2 = k - 1; _starpu_daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); i__2 = k - 1; _starpu_dscal_(&i__2, &bkk, &a[k * a_dim1 + 1], &c__1); /* Computing 2nd power */ d__1 = bkk; a[k + k * a_dim1] = akk * (d__1 * d__1); /* L30: */ } } else { /* Compute L'*A*L */ i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Update the lower triangle of A(1:k,1:k) */ akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; i__2 = k - 1; _starpu_dtrmv_(uplo, "Transpose", "Non-unit", &i__2, &b[b_offset], ldb, &a[k + a_dim1], lda); ct = akk * .5; i__2 = k - 1; _starpu_daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); i__2 = k - 1; _starpu_dsyr2_(uplo, &i__2, &c_b27, &a[k + a_dim1], lda, &b[k + b_dim1], ldb, &a[a_offset], lda); i__2 = k - 1; _starpu_daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); i__2 = k - 1; _starpu_dscal_(&i__2, &bkk, &a[k + a_dim1], lda); /* Computing 2nd power */ d__1 = bkk; a[k + k * a_dim1] = akk * (d__1 * d__1); /* L40: */ } } } return 0; /* End of DSYGS2 */ } /* _starpu_dsygs2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsygst.c000066400000000000000000000257451413463044200207000ustar00rootroot00000000000000/* dsygst.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b14 = 1.; static doublereal c_b16 = -.5; static doublereal c_b19 = -1.; static doublereal c_b52 = .5; /* Subroutine */ int _starpu_dsygst_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ integer k, kb, nb; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsymm_( char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dsygs2_( integer *, char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dsyr2k_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *) , _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYGST reduces a real symmetric-definite generalized eigenproblem */ /* to standard form. */ /* If ITYPE = 1, the problem is A*x = lambda*B*x, */ /* and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) */ /* If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ /* B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L. */ /* B must have been previously factorized as U**T*U or L*L**T by DPOTRF. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); */ /* = 2 or 3: compute U*A*U**T or L**T*A*L. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored and B is factored as */ /* U**T*U; */ /* = 'L': Lower triangle of A is stored and B is factored as */ /* L*L**T. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the transformed matrix, stored in the */ /* same format as A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,N) */ /* The triangular factor from the Cholesky factorization of B, */ /* as returned by DPOTRF. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (*itype < 1 || *itype > 3) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYGST", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Determine the block size for this environment. */ nb = _starpu_ilaenv_(&c__1, "DSYGST", uplo, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ _starpu_dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info); } else { /* Use blocked code */ if (*itype == 1) { if (upper) { /* Compute inv(U')*A*inv(U) */ i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the upper triangle of A(k:n,k:n) */ _starpu_dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, info); if (k + kb <= *n) { i__3 = *n - k - kb + 1; _starpu_dtrsm_("Left", uplo, "Transpose", "Non-unit", &kb, & i__3, &c_b14, &b[k + k * b_dim1], ldb, &a[k + (k + kb) * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dsymm_("Left", uplo, &kb, &i__3, &c_b16, &a[k + k * a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, &c_b14, &a[k + (k + kb) * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dsyr2k_(uplo, "Transpose", &i__3, &kb, &c_b19, &a[k + (k + kb) * a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dsymm_("Left", uplo, &kb, &i__3, &c_b16, &a[k + k * a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, &c_b14, &a[k + (k + kb) * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dtrsm_("Right", uplo, "No transpose", "Non-unit", &kb, &i__3, &c_b14, &b[k + kb + (k + kb) * b_dim1] , ldb, &a[k + (k + kb) * a_dim1], lda); } /* L10: */ } } else { /* Compute inv(L)*A*inv(L') */ i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the lower triangle of A(k:n,k:n) */ _starpu_dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, info); if (k + kb <= *n) { i__3 = *n - k - kb + 1; _starpu_dtrsm_("Right", uplo, "Transpose", "Non-unit", &i__3, &kb, &c_b14, &b[k + k * b_dim1], ldb, &a[k + kb + k * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dsymm_("Right", uplo, &i__3, &kb, &c_b16, &a[k + k * a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & c_b14, &a[k + kb + k * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dsyr2k_(uplo, "No transpose", &i__3, &kb, &c_b19, &a[ k + kb + k * a_dim1], lda, &b[k + kb + k * b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dsymm_("Right", uplo, &i__3, &kb, &c_b16, &a[k + k * a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & c_b14, &a[k + kb + k * a_dim1], lda); i__3 = *n - k - kb + 1; _starpu_dtrsm_("Left", uplo, "No transpose", "Non-unit", & i__3, &kb, &c_b14, &b[k + kb + (k + kb) * b_dim1], ldb, &a[k + kb + k * a_dim1], lda); } /* L20: */ } } } else { if (upper) { /* Compute U*A*U' */ i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the upper triangle of A(1:k+kb-1,1:k+kb-1) */ i__3 = k - 1; _starpu_dtrmm_("Left", uplo, "No transpose", "Non-unit", &i__3, & kb, &c_b14, &b[b_offset], ldb, &a[k * a_dim1 + 1], lda) ; i__3 = k - 1; _starpu_dsymm_("Right", uplo, &i__3, &kb, &c_b52, &a[k + k * a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ k * a_dim1 + 1], lda); i__3 = k - 1; _starpu_dsyr2k_(uplo, "No transpose", &i__3, &kb, &c_b14, &a[k * a_dim1 + 1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[a_offset], lda); i__3 = k - 1; _starpu_dsymm_("Right", uplo, &i__3, &kb, &c_b52, &a[k + k * a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ k * a_dim1 + 1], lda); i__3 = k - 1; _starpu_dtrmm_("Right", uplo, "Transpose", "Non-unit", &i__3, &kb, &c_b14, &b[k + k * b_dim1], ldb, &a[k * a_dim1 + 1], lda); _starpu_dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, info); /* L30: */ } } else { /* Compute L'*A*L */ i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Computing MIN */ i__3 = *n - k + 1; kb = min(i__3,nb); /* Update the lower triangle of A(1:k+kb-1,1:k+kb-1) */ i__3 = k - 1; _starpu_dtrmm_("Right", uplo, "No transpose", "Non-unit", &kb, & i__3, &c_b14, &b[b_offset], ldb, &a[k + a_dim1], lda); i__3 = k - 1; _starpu_dsymm_("Left", uplo, &kb, &i__3, &c_b52, &a[k + k * a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + a_dim1], lda); i__3 = k - 1; _starpu_dsyr2k_(uplo, "Transpose", &i__3, &kb, &c_b14, &a[k + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[ a_offset], lda); i__3 = k - 1; _starpu_dsymm_("Left", uplo, &kb, &i__3, &c_b52, &a[k + k * a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + a_dim1], lda); i__3 = k - 1; _starpu_dtrmm_("Left", uplo, "Transpose", "Non-unit", &kb, &i__3, &c_b14, &b[k + k * b_dim1], ldb, &a[k + a_dim1], lda); _starpu_dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, info); /* L40: */ } } } } return 0; /* End of DSYGST */ } /* _starpu_dsygst_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsygv.c000066400000000000000000000224341413463044200205070ustar00rootroot00000000000000/* dsygv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b16 = 1.; /* Subroutine */ int _starpu_dsygv_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ integer nb, neig; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); char trans[1]; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dsyev_(char *, char *, integer *, doublereal * , integer *, doublereal *, doublereal *, integer *, integer *); logical wantz; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dpotrf_(char *, integer *, doublereal *, integer *, integer *); integer lwkmin; extern /* Subroutine */ int _starpu_dsygst_(integer *, char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYGV computes all the eigenvalues, and optionally, the eigenvectors */ /* of a real generalized symmetric-definite eigenproblem, of the form */ /* A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. */ /* Here A and B are assumed to be symmetric and B is also */ /* positive definite. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* Specifies the problem type to be solved: */ /* = 1: A*x = (lambda)*B*x */ /* = 2: A*B*x = (lambda)*x */ /* = 3: B*A*x = (lambda)*x */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ /* matrix Z of eigenvectors. The eigenvectors are normalized */ /* as follows: */ /* if ITYPE = 1 or 2, Z**T*B*Z = I; */ /* if ITYPE = 3, Z**T*inv(B)*Z = I. */ /* If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') */ /* or the lower triangle (if UPLO='L') of A, including the */ /* diagonal, is destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the symmetric positive definite matrix B. */ /* If UPLO = 'U', the leading N-by-N upper triangular part of B */ /* contains the upper triangular part of the matrix B. */ /* If UPLO = 'L', the leading N-by-N lower triangular part of B */ /* contains the lower triangular part of the matrix B. */ /* On exit, if INFO <= N, the part of B containing the matrix is */ /* overwritten by the triangular factor U or L from the Cholesky */ /* factorization B = U**T*U or B = L*L**T. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of the array WORK. LWORK >= max(1,3*N-1). */ /* For optimal efficiency, LWORK >= (NB+2)*N, */ /* where NB is the blocksize for DSYTRD returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: DPOTRF or DSYEV returned an error code: */ /* <= N: if INFO = i, DSYEV failed to converge; */ /* i off-diagonal elements of an intermediate */ /* tridiagonal form did not converge to zero; */ /* > N: if INFO = N + i, for 1 <= i <= N, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --w; --work; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1; *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -2; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info == 0) { /* Computing MAX */ i__1 = 1, i__2 = *n * 3 - 1; lwkmin = max(i__1,i__2); nb = _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); /* Computing MAX */ i__1 = lwkmin, i__2 = (nb + 2) * *n; lwkopt = max(i__1,i__2); work[1] = (doublereal) lwkopt; if (*lwork < lwkmin && ! lquery) { *info = -11; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYGV ", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a Cholesky factorization of B. */ _starpu_dpotrf_(uplo, n, &b[b_offset], ldb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ _starpu_dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info); _starpu_dsyev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, info); if (wantz) { /* Backtransform eigenvectors to the original problem. */ neig = *n; if (*info > 0) { neig = *info - 1; } if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } _starpu_dtrsm_("Left", uplo, trans, "Non-unit", n, &neig, &c_b16, &b[ b_offset], ldb, &a[a_offset], lda); } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } _starpu_dtrmm_("Left", uplo, trans, "Non-unit", n, &neig, &c_b16, &b[ b_offset], ldb, &a[a_offset], lda); } } work[1] = (doublereal) lwkopt; return 0; /* End of DSYGV */ } /* _starpu_dsygv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsygvd.c000066400000000000000000000267741413463044200206660ustar00rootroot00000000000000/* dsygvd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b11 = 1.; /* Subroutine */ int _starpu_dsygvd_(integer *itype, char *jobz, char *uplo, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer lopt; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer lwmin; char trans[1]; integer liopt; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper, wantz; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dpotrf_( char *, integer *, doublereal *, integer *, integer *); integer liwmin; extern /* Subroutine */ int _starpu_dsyevd_(char *, char *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, integer *, integer *), _starpu_dsygst_(integer *, char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); logical lquery; /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYGVD computes all the eigenvalues, and optionally, the eigenvectors */ /* of a real generalized symmetric-definite eigenproblem, of the form */ /* A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and */ /* B are assumed to be symmetric and B is also positive definite. */ /* If eigenvectors are desired, it uses a divide and conquer algorithm. */ /* The divide and conquer algorithm makes very mild assumptions about */ /* floating point arithmetic. It will work on machines with a guard */ /* digit in add/subtract, or on those binary machines without guard */ /* digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ /* Cray-2. It could conceivably fail on hexadecimal or decimal machines */ /* without guard digits, but we know of none. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* Specifies the problem type to be solved: */ /* = 1: A*x = (lambda)*B*x */ /* = 2: A*B*x = (lambda)*x */ /* = 3: B*A*x = (lambda)*x */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangles of A and B are stored; */ /* = 'L': Lower triangles of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ /* matrix Z of eigenvectors. The eigenvectors are normalized */ /* as follows: */ /* if ITYPE = 1 or 2, Z**T*B*Z = I; */ /* if ITYPE = 3, Z**T*inv(B)*Z = I. */ /* If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') */ /* or the lower triangle (if UPLO='L') of A, including the */ /* diagonal, is destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, the symmetric matrix B. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of B contains the */ /* upper triangular part of the matrix B. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of B contains */ /* the lower triangular part of the matrix B. */ /* On exit, if INFO <= N, the part of B containing the matrix is */ /* overwritten by the triangular factor U or L from the Cholesky */ /* factorization B = U**T*U or B = L*L**T. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* If INFO = 0, the eigenvalues in ascending order. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If N <= 1, LWORK >= 1. */ /* If JOBZ = 'N' and N > 1, LWORK >= 2*N+1. */ /* If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal sizes of the WORK and IWORK */ /* arrays, returns these values as the first entries of the WORK */ /* and IWORK arrays, and no error message related to LWORK or */ /* LIWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If N <= 1, LIWORK >= 1. */ /* If JOBZ = 'N' and N > 1, LIWORK >= 1. */ /* If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal sizes of the WORK and */ /* IWORK arrays, returns these values as the first entries of */ /* the WORK and IWORK arrays, and no error message related to */ /* LWORK or LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: DPOTRF or DSYEVD returned an error code: */ /* <= N: if INFO = i and JOBZ = 'N', then the algorithm */ /* failed to converge; i off-diagonal elements of an */ /* intermediate tridiagonal form did not converge to */ /* zero; */ /* if INFO = i and JOBZ = 'V', then the algorithm */ /* failed to compute an eigenvalue while working on */ /* the submatrix lying in rows and columns INFO/(N+1) */ /* through mod(INFO,N+1); */ /* > N: if INFO = N + i, for 1 <= i <= N, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* Modified so that no backsubstitution is performed if DSYEVD fails to */ /* converge (NEIG in old code could be greater than N causing out of */ /* bounds reference to A - reported by Ralf Meyer). Also corrected the */ /* description of INFO and the test on ITYPE. Sven, 16 Feb 05. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --w; --work; --iwork; /* Function Body */ wantz = _starpu_lsame_(jobz, "V"); upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1 || *liwork == -1; *info = 0; if (*n <= 1) { liwmin = 1; lwmin = 1; } else if (wantz) { liwmin = *n * 5 + 3; /* Computing 2nd power */ i__1 = *n; lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); } else { liwmin = 1; lwmin = (*n << 1) + 1; } lopt = lwmin; liopt = liwmin; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -2; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info == 0) { work[1] = (doublereal) lopt; iwork[1] = liopt; if (*lwork < lwmin && ! lquery) { *info = -11; } else if (*liwork < liwmin && ! lquery) { *info = -13; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYGVD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Form a Cholesky factorization of B. */ _starpu_dpotrf_(uplo, n, &b[b_offset], ldb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ _starpu_dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info); _starpu_dsyevd_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, &iwork[ 1], liwork, info); /* Computing MAX */ d__1 = (doublereal) lopt; lopt = (integer) max(d__1,work[1]); /* Computing MAX */ d__1 = (doublereal) liopt, d__2 = (doublereal) iwork[1]; liopt = (integer) max(d__1,d__2); if (wantz && *info == 0) { /* Backtransform eigenvectors to the original problem. */ if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } _starpu_dtrsm_("Left", uplo, trans, "Non-unit", n, n, &c_b11, &b[b_offset] , ldb, &a[a_offset], lda); } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } _starpu_dtrmm_("Left", uplo, trans, "Non-unit", n, n, &c_b11, &b[b_offset] , ldb, &a[a_offset], lda); } } work[1] = (doublereal) lopt; iwork[1] = liopt; return 0; /* End of DSYGVD */ } /* _starpu_dsygvd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsygvx.c000066400000000000000000000334461413463044200207040ustar00rootroot00000000000000/* dsygvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b19 = 1.; /* Subroutine */ int _starpu_dsygvx_(integer *itype, char *jobz, char *range, char * uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset, i__1, i__2; /* Local variables */ integer nb; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); char trans[1]; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper, wantz, alleig, indeig, valeig; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dpotrf_(char *, integer *, doublereal *, integer *, integer *); integer lwkmin; extern /* Subroutine */ int _starpu_dsygst_(integer *, char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; extern /* Subroutine */ int _starpu_dsyevx_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYGVX computes selected eigenvalues, and optionally, eigenvectors */ /* of a real generalized symmetric-definite eigenproblem, of the form */ /* A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A */ /* and B are assumed to be symmetric and B is also positive definite. */ /* Eigenvalues and eigenvectors can be selected by specifying either a */ /* range of values or a range of indices for the desired eigenvalues. */ /* Arguments */ /* ========= */ /* ITYPE (input) INTEGER */ /* Specifies the problem type to be solved: */ /* = 1: A*x = (lambda)*B*x */ /* = 2: A*B*x = (lambda)*x */ /* = 3: B*A*x = (lambda)*x */ /* JOBZ (input) CHARACTER*1 */ /* = 'N': Compute eigenvalues only; */ /* = 'V': Compute eigenvalues and eigenvectors. */ /* RANGE (input) CHARACTER*1 */ /* = 'A': all eigenvalues will be found. */ /* = 'V': all eigenvalues in the half-open interval (VL,VU] */ /* will be found. */ /* = 'I': the IL-th through IU-th eigenvalues will be found. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A and B are stored; */ /* = 'L': Lower triangle of A and B are stored. */ /* N (input) INTEGER */ /* The order of the matrix pencil (A,B). N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of A contains the */ /* upper triangular part of the matrix A. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of A contains */ /* the lower triangular part of the matrix A. */ /* On exit, the lower triangle (if UPLO='L') or the upper */ /* triangle (if UPLO='U') of A, including the diagonal, is */ /* destroyed. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDA, N) */ /* On entry, the symmetric matrix B. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of B contains the */ /* upper triangular part of the matrix B. If UPLO = 'L', */ /* the leading N-by-N lower triangular part of B contains */ /* the lower triangular part of the matrix B. */ /* On exit, if INFO <= N, the part of B containing the matrix is */ /* overwritten by the triangular factor U or L from the Cholesky */ /* factorization B = U**T*U or B = L*L**T. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* VL (input) DOUBLE PRECISION */ /* VU (input) DOUBLE PRECISION */ /* If RANGE='V', the lower and upper bounds of the interval to */ /* be searched for eigenvalues. VL < VU. */ /* Not referenced if RANGE = 'A' or 'I'. */ /* IL (input) INTEGER */ /* IU (input) INTEGER */ /* If RANGE='I', the indices (in ascending order) of the */ /* smallest and largest eigenvalues to be returned. */ /* 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. */ /* Not referenced if RANGE = 'A' or 'V'. */ /* ABSTOL (input) DOUBLE PRECISION */ /* The absolute error tolerance for the eigenvalues. */ /* An approximate eigenvalue is accepted as converged */ /* when it is determined to lie in an interval [a,b] */ /* of width less than or equal to */ /* ABSTOL + EPS * max( |a|,|b| ) , */ /* where EPS is the machine precision. If ABSTOL is less than */ /* or equal to zero, then EPS*|T| will be used in its place, */ /* where |T| is the 1-norm of the tridiagonal matrix obtained */ /* by reducing A to tridiagonal form. */ /* Eigenvalues will be computed most accurately when ABSTOL is */ /* set to twice the underflow threshold 2*DLAMCH('S'), not zero. */ /* If this routine returns with INFO>0, indicating that some */ /* eigenvectors did not converge, try setting ABSTOL to */ /* 2*DLAMCH('S'). */ /* M (output) INTEGER */ /* The total number of eigenvalues found. 0 <= M <= N. */ /* If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1. */ /* W (output) DOUBLE PRECISION array, dimension (N) */ /* On normal exit, the first M elements contain the selected */ /* eigenvalues in ascending order. */ /* Z (output) DOUBLE PRECISION array, dimension (LDZ, max(1,M)) */ /* If JOBZ = 'N', then Z is not referenced. */ /* If JOBZ = 'V', then if INFO = 0, the first M columns of Z */ /* contain the orthonormal eigenvectors of the matrix A */ /* corresponding to the selected eigenvalues, with the i-th */ /* column of Z holding the eigenvector associated with W(i). */ /* The eigenvectors are normalized as follows: */ /* if ITYPE = 1 or 2, Z**T*B*Z = I; */ /* if ITYPE = 3, Z**T*inv(B)*Z = I. */ /* If an eigenvector fails to converge, then that column of Z */ /* contains the latest approximation to the eigenvector, and the */ /* index of the eigenvector is returned in IFAIL. */ /* Note: the user must ensure that at least max(1,M) columns are */ /* supplied in the array Z; if RANGE = 'V', the exact value of M */ /* is not known in advance and an upper bound must be used. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1, and if */ /* JOBZ = 'V', LDZ >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of the array WORK. LWORK >= max(1,8*N). */ /* For optimal efficiency, LWORK >= (NB+3)*N, */ /* where NB is the blocksize for DSYTRD returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (5*N) */ /* IFAIL (output) INTEGER array, dimension (N) */ /* If JOBZ = 'V', then if INFO = 0, the first M elements of */ /* IFAIL are zero. If INFO > 0, then IFAIL contains the */ /* indices of the eigenvectors that failed to converge. */ /* If JOBZ = 'N', then IFAIL is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: DPOTRF or DSYEVX returned an error code: */ /* <= N: if INFO = i, DSYEVX failed to converge; */ /* i eigenvectors failed to converge. Their indices */ /* are stored in array IFAIL. */ /* > N: if INFO = N + i, for 1 <= i <= N, then the leading */ /* minor of order i of B is not positive definite. */ /* The factorization of B could not be completed and */ /* no eigenvalues or eigenvectors were computed. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --w; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; --iwork; --ifail; /* Function Body */ upper = _starpu_lsame_(uplo, "U"); wantz = _starpu_lsame_(jobz, "V"); alleig = _starpu_lsame_(range, "A"); valeig = _starpu_lsame_(range, "V"); indeig = _starpu_lsame_(range, "I"); lquery = *lwork == -1; *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; } else if (! (wantz || _starpu_lsame_(jobz, "N"))) { *info = -2; } else if (! (alleig || valeig || indeig)) { *info = -3; } else if (! (upper || _starpu_lsame_(uplo, "L"))) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else { if (valeig) { if (*n > 0 && *vu <= *vl) { *info = -11; } } else if (indeig) { if (*il < 1 || *il > max(1,*n)) { *info = -12; } else if (*iu < min(*n,*il) || *iu > *n) { *info = -13; } } } if (*info == 0) { if (*ldz < 1 || wantz && *ldz < *n) { *info = -18; } } if (*info == 0) { /* Computing MAX */ i__1 = 1, i__2 = *n << 3; lwkmin = max(i__1,i__2); nb = _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); /* Computing MAX */ i__1 = lwkmin, i__2 = (nb + 3) * *n; lwkopt = max(i__1,i__2); work[1] = (doublereal) lwkopt; if (*lwork < lwkmin && ! lquery) { *info = -20; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYGVX", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ *m = 0; if (*n == 0) { return 0; } /* Form a Cholesky factorization of B. */ _starpu_dpotrf_(uplo, n, &b[b_offset], ldb, info); if (*info != 0) { *info = *n + *info; return 0; } /* Transform problem to standard eigenvalue problem and solve. */ _starpu_dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info); _starpu_dsyevx_(jobz, range, uplo, n, &a[a_offset], lda, vl, vu, il, iu, abstol, m, &w[1], &z__[z_offset], ldz, &work[1], lwork, &iwork[1], &ifail[ 1], info); if (wantz) { /* Backtransform eigenvectors to the original problem. */ if (*info > 0) { *m = *info - 1; } if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)'*y or inv(U)*y */ if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } _starpu_dtrsm_("Left", uplo, trans, "Non-unit", n, m, &c_b19, &b[b_offset] , ldb, &z__[z_offset], ldz); } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U'*y */ if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } _starpu_dtrmm_("Left", uplo, trans, "Non-unit", n, m, &c_b19, &b[b_offset] , ldb, &z__[z_offset], ldz); } } /* Set WORK(1) to optimal workspace size. */ work[1] = (doublereal) lwkopt; return 0; /* End of DSYGVX */ } /* _starpu_dsygvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyrfs.c000066400000000000000000000315531413463044200206670ustar00rootroot00000000000000/* dsyrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b12 = -1.; static doublereal c_b14 = 1.; /* Subroutine */ int _starpu_dsyrfs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s, xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); integer count; logical upper; extern /* Subroutine */ int _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal lstres; extern /* Subroutine */ int _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYRFS improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric indefinite, and */ /* provides error bounds and backward error estimates for the solution. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of A contains the upper triangular part */ /* of the matrix A, and the strictly lower triangular part of A */ /* is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of A contains the lower triangular part of */ /* the matrix A, and the strictly upper triangular part of A is */ /* not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factored form of the matrix A. AF contains the block */ /* diagonal matrix D and the multipliers used to obtain the */ /* factor U or L from the factorization A = U*D*U**T or */ /* A = L*D*L**T as computed by DSYTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DSYTRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Internal Parameters */ /* =================== */ /* ITMAX is the maximum number of steps of iterative refinement. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldaf < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -10; } else if (*ldx < max(1,*n)) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { count = 1; lstres = 3.; L20: /* Loop until stopping criterion is satisfied. */ /* Compute residual R = B - A * X */ _starpu_dcopy_(n, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dsymv_(uplo, n, &c_b12, &a[a_offset], lda, &x[j * x_dim1 + 1], &c__1, &c_b14, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L30: */ } /* Compute abs(A)*abs(X) + abs(B). */ if (upper) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * xk; s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * (d__2 = x[ i__ + j * x_dim1], abs(d__2)); /* L40: */ } work[k] = work[k] + (d__1 = a[k + k * a_dim1], abs(d__1)) * xk + s; /* L50: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; xk = (d__1 = x[k + j * x_dim1], abs(d__1)); work[k] += (d__1 = a[k + k * a_dim1], abs(d__1)) * xk; i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * xk; s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * (d__2 = x[ i__ + j * x_dim1], abs(d__2)); /* L60: */ } work[k] += s; /* L70: */ } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L80: */ } berr[j] = s; /* Test stopping criterion. Continue iterating if */ /* 1) The residual BERR(J) is larger than machine epsilon, and */ /* 2) BERR(J) decreased by at least a factor of 2 during the */ /* last iteration, and */ /* 3) At most ITMAX iterations tried. */ if (berr[j] > eps && berr[j] * 2. <= lstres && count <= 5) { /* Update solution and try again. */ _starpu_dsytrs_(uplo, n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[*n + 1], n, info); _starpu_daxpy_(n, &c_b14, &work[*n + 1], &c__1, &x[j * x_dim1 + 1], &c__1) ; lstres = berr[j]; ++count; goto L20; } /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(A))* */ /* ( abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(A) is the inverse of A */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(A)*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(A)*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(A) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(A)*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L90: */ } kase = 0; L100: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(A'). */ _starpu_dsytrs_(uplo, n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[ *n + 1], n, info); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L110: */ } } else if (kase == 2) { /* Multiply by inv(A)*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L120: */ } _starpu_dsytrs_(uplo, n, &c__1, &af[af_offset], ldaf, &ipiv[1], &work[ *n + 1], n, info); } goto L100; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L130: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L140: */ } return 0; /* End of DSYRFS */ } /* _starpu_dsyrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsyrfsx.c000066400000000000000000000606231413463044200210570ustar00rootroot00000000000000/* dsyrfsx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c_n1 = -1; static integer c__0 = 0; static integer c__1 = 1; /* Subroutine */ int _starpu_dsyrfsx_(char *uplo, char *equed, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *s, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *berr, integer * n_err_bnds__, doublereal *err_bnds_norm__, doublereal * err_bnds_comp__, integer *nparams, doublereal *params, doublereal * work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal illrcond_thresh__, unstable_thresh__, err_lbnd__; integer ref_type__, j; doublereal rcond_tmp__; integer prec_type__; extern doublereal _starpu_dla_syrcond__(char *, integer *, doublereal *, integer * , doublereal *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, ftnlen); doublereal cwise_wrong__; extern /* Subroutine */ int _starpu_dla_syrfsx_extended__(integer *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, logical *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, logical *, integer *, ftnlen); char norm[1]; logical ignore_cwise__; extern logical _starpu_lsame_(char *, char *); doublereal anorm; logical rcequ; extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dsycon_(char *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); extern integer _starpu_ilaprec_(char *); integer ithresh, n_norms__; doublereal rthresh; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYRFSX improves the computed solution to a system of linear */ /* equations when the coefficient matrix is symmetric indefinite, and */ /* provides error bounds and backward error estimates for the */ /* solution. In addition to normwise error bound, the code provides */ /* maximum componentwise error bound if possible. See comments for */ /* ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds. */ /* The original system of linear equations may have been equilibrated */ /* before calling this routine, as described by arguments EQUED and S */ /* below. In this case, the solution and error bounds returned are */ /* for the original unequilibrated system. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* EQUED (input) CHARACTER*1 */ /* Specifies the form of equilibration that was done to A */ /* before calling this routine. This is needed to compute */ /* the solution and error bounds correctly. */ /* = 'N': No equilibration */ /* = 'Y': Both row and column equilibration, i.e., A has been */ /* replaced by diag(S) * A * diag(S). */ /* The right hand side B has been changed accordingly. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of A contains the upper triangular */ /* part of the matrix A, and the strictly lower triangular */ /* part of A is not referenced. If UPLO = 'L', the leading */ /* N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input) DOUBLE PRECISION array, dimension (LDAF,N) */ /* The factored form of the matrix A. AF contains the block */ /* diagonal matrix D and the multipliers used to obtain the */ /* factor U or L from the factorization A = U*D*U**T or A = */ /* L*D*L**T as computed by DSYTRF. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A. If EQUED = 'Y', A is multiplied on */ /* the left and right by diag(S). S is an input argument if FACT = */ /* 'F'; otherwise, S is an output argument. If FACT = 'F' and EQUED */ /* = 'Y', each element of S must be positive. If S is output, each */ /* element of S is a power of the radix. If S is input, each element */ /* of S should be a power of the radix to ensure a reliable solution */ /* and error estimates. Scaling by powers of the radix does not cause */ /* rounding errors unless the result underflows or overflows. */ /* Rounding errors during scaling lead to refining with a matrix that */ /* is not equivalent to the input matrix, producing error estimates */ /* that may not be reliable. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input/output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* On entry, the solution matrix X, as computed by DGETRS. */ /* On exit, the improved solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* Componentwise relative backward error. This is the */ /* componentwise relative backward error of each solution vector X(j) */ /* (i.e., the smallest relative change in any element of A or B that */ /* makes X(j) an exact solution). */ /* N_ERR_BNDS (input) INTEGER */ /* Number of error bounds to return for each right hand side */ /* and each type (normwise or componentwise). See ERR_BNDS_NORM and */ /* ERR_BNDS_COMP below. */ /* ERR_BNDS_NORM (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* normwise relative error, which is defined as follows: */ /* Normwise relative error in the ith solution vector: */ /* max_j (abs(XTRUE(j,i) - X(j,i))) */ /* ------------------------------ */ /* max_j abs(X(j,i)) */ /* The array is indexed by the type of error information as described */ /* below. There currently are up to three pieces of information */ /* returned. */ /* The first index in ERR_BNDS_NORM(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_NORM(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated normwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*A, where S scales each row by a power of the */ /* radix so all absolute row sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* ERR_BNDS_COMP (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS) */ /* For each right-hand side, this array contains information about */ /* various error bounds and condition numbers corresponding to the */ /* componentwise relative error, which is defined as follows: */ /* Componentwise relative error in the ith solution vector: */ /* abs(XTRUE(j,i) - X(j,i)) */ /* max_j ---------------------- */ /* abs(X(j,i)) */ /* The array is indexed by the right-hand side i (on which the */ /* componentwise relative error depends), and the type of error */ /* information as described below. There currently are up to three */ /* pieces of information returned for each right-hand side. If */ /* componentwise accuracy is not requested (PARAMS(3) = 0.0), then */ /* ERR_BNDS_COMP is not accessed. If N_ERR_BNDS .LT. 3, then at most */ /* the first (:,N_ERR_BNDS) entries are returned. */ /* The first index in ERR_BNDS_COMP(i,:) corresponds to the ith */ /* right-hand side. */ /* The second index in ERR_BNDS_COMP(:,err) contains the following */ /* three fields: */ /* err = 1 "Trust/don't trust" boolean. Trust the answer if the */ /* reciprocal condition number is less than the threshold */ /* sqrt(n) * dlamch('Epsilon'). */ /* err = 2 "Guaranteed" error bound: The estimated forward error, */ /* almost certainly within a factor of 10 of the true error */ /* so long as the next entry is greater than the threshold */ /* sqrt(n) * dlamch('Epsilon'). This error bound should only */ /* be trusted if the previous boolean is true. */ /* err = 3 Reciprocal condition number: Estimated componentwise */ /* reciprocal condition number. Compared with the threshold */ /* sqrt(n) * dlamch('Epsilon') to determine if the error */ /* estimate is "guaranteed". These reciprocal condition */ /* numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some */ /* appropriately scaled matrix Z. */ /* Let Z = S*(A*diag(x)), where x is the solution for the */ /* current right-hand side and S scales each row of */ /* A*diag(x) by a power of the radix so all absolute row */ /* sums of Z are approximately 1. */ /* See Lapack Working Note 165 for further details and extra */ /* cautions. */ /* NPARAMS (input) INTEGER */ /* Specifies the number of parameters set in PARAMS. If .LE. 0, the */ /* PARAMS array is never referenced and default values are used. */ /* PARAMS (input / output) DOUBLE PRECISION array, dimension NPARAMS */ /* Specifies algorithm parameters. If an entry is .LT. 0.0, then */ /* that entry will be filled with default value used for that */ /* parameter. Only positions up to NPARAMS are accessed; defaults */ /* are used for higher-numbered parameters. */ /* PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative */ /* refinement or not. */ /* Default: 1.0D+0 */ /* = 0.0 : No refinement is performed, and no error bounds are */ /* computed. */ /* = 1.0 : Use the double-precision refinement algorithm, */ /* possibly with doubled-single computations if the */ /* compilation environment does not support DOUBLE */ /* PRECISION. */ /* (other values are reserved for future use) */ /* PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual */ /* computations allowed for refinement. */ /* Default: 10 */ /* Aggressive: Set to 100 to permit convergence using approximate */ /* factorizations or factorizations other than LU. If */ /* the factorization uses a technique other than */ /* Gaussian elimination, the guarantees in */ /* err_bnds_norm and err_bnds_comp may no longer be */ /* trustworthy. */ /* PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code */ /* will attempt to find a solution with small componentwise */ /* relative error in the double-precision algorithm. Positive */ /* is true, 0.0 is false. */ /* Default: 1.0 (attempt componentwise convergence) */ /* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: Successful exit. The solution to every right-hand side is */ /* guaranteed. */ /* < 0: If INFO = -i, the i-th argument had an illegal value */ /* > 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Check the input parameters. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; ref_type__ = 1; if (*nparams >= 1) { if (params[1] < 0.) { params[1] = 1.; } else { ref_type__ = (integer) params[1]; } } /* Set default parameters. */ illrcond_thresh__ = (doublereal) (*n) * _starpu_dlamch_("Epsilon"); ithresh = 10; rthresh = .5; unstable_thresh__ = .25; ignore_cwise__ = FALSE_; if (*nparams >= 2) { if (params[2] < 0.) { params[2] = (doublereal) ithresh; } else { ithresh = (integer) params[2]; } } if (*nparams >= 3) { if (params[3] < 0.) { if (ignore_cwise__) { params[3] = 0.; } else { params[3] = 1.; } } else { ignore_cwise__ = params[3] == 0.; } } if (ref_type__ == 0 || *n_err_bnds__ == 0) { n_norms__ = 0; } else if (ignore_cwise__) { n_norms__ = 1; } else { n_norms__ = 2; } rcequ = _starpu_lsame_(equed, "Y"); /* Test input parameters. */ if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! rcequ && ! _starpu_lsame_(equed, "N")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -11; } else if (*ldx < max(1,*n)) { *info = -13; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYRFSX", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0 || *nrhs == 0) { *rcond = 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 0.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 0.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 0.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 1.; } } return 0; } /* Default to failure. */ *rcond = 0.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { berr[j] = 1.; if (*n_err_bnds__ >= 1) { err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } else if (*n_err_bnds__ >= 2) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } else if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = 0.; err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = 0.; } } /* Compute the norm of A and the reciprocal of the condition */ /* number of A. */ *(unsigned char *)norm = 'I'; anorm = _starpu_dlansy_(norm, uplo, n, &a[a_offset], lda, &work[1]); _starpu_dsycon_(uplo, n, &af[af_offset], ldaf, &ipiv[1], &anorm, rcond, &work[1], &iwork[1], info); /* Perform refinement on each right-hand side */ if (ref_type__ != 0) { prec_type__ = _starpu_ilaprec_("E"); _starpu_dla_syrfsx_extended__(&prec_type__, uplo, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, &ipiv[1], &rcequ, &s[1], &b[b_offset], ldb, &x[x_offset], ldx, &berr[1], &n_norms__, & err_bnds_norm__[err_bnds_norm_offset], &err_bnds_comp__[ err_bnds_comp_offset], &work[*n + 1], &work[1], &work[(*n << 1) + 1], &work[1], rcond, &ithresh, &rthresh, & unstable_thresh__, &ignore_cwise__, info, (ftnlen)1); } /* Computing MAX */ d__1 = 10., d__2 = sqrt((doublereal) (*n)); err_lbnd__ = max(d__1,d__2) * _starpu_dlamch_("Epsilon"); if (*n_err_bnds__ >= 1 && n_norms__ >= 1) { /* Compute scaled normwise condition number cond(A*C). */ if (rcequ) { rcond_tmp__ = _starpu_dla_syrcond__(uplo, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c_n1, &s[1], info, &work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = _starpu_dla_syrcond__(uplo, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c__0, &s[1], info, &work[1], &iwork[1], (ftnlen)1); } i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] > 1.) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = 1.; err_bnds_norm__[j + err_bnds_norm_dim1] = 0.; if (*info <= *n) { *info = *n + j; } } else if (err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] < err_lbnd__) { err_bnds_norm__[j + (err_bnds_norm_dim1 << 1)] = err_lbnd__; err_bnds_norm__[j + err_bnds_norm_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_norm__[j + err_bnds_norm_dim1 * 3] = rcond_tmp__; } } } if (*n_err_bnds__ >= 1 && n_norms__ >= 2) { /* Compute componentwise condition number cond(A*diag(Y(:,J))) for */ /* each right-hand side using the current solution as an estimate of */ /* the true solution. If the componentwise error estimate is too */ /* large, then the solution is a lousy estimate of truth and the */ /* estimated RCOND may be too optimistic. To avoid misleading users, */ /* the inverse condition number is set to 0.0 when the estimated */ /* cwise error is at least CWISE_WRONG. */ cwise_wrong__ = sqrt(_starpu_dlamch_("Epsilon")); i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < cwise_wrong__) { rcond_tmp__ = _starpu_dla_syrcond__(uplo, n, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &c__1, &x[j * x_dim1 + 1], info, &work[1], &iwork[1], (ftnlen)1); } else { rcond_tmp__ = 0.; } /* Cap the error at 1.0. */ if (*n_err_bnds__ >= 2 && err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] > 1.) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; } /* Threshold the error (see LAWN). */ if (rcond_tmp__ < illrcond_thresh__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = 1.; err_bnds_comp__[j + err_bnds_comp_dim1] = 0.; if (params[3] == 1. && *info < *n + j) { *info = *n + j; } } else if (err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] < err_lbnd__) { err_bnds_comp__[j + (err_bnds_comp_dim1 << 1)] = err_lbnd__; err_bnds_comp__[j + err_bnds_comp_dim1] = 1.; } /* Save the condition number. */ if (*n_err_bnds__ >= 3) { err_bnds_comp__[j + err_bnds_comp_dim1 * 3] = rcond_tmp__; } } } return 0; /* End of DSYRFSX */ } /* _starpu_dsyrfsx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsysv.c000066400000000000000000000164251413463044200205260ustar00rootroot00000000000000/* dsysv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dsysv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ integer nb; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dsytrf_(char *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; extern /* Subroutine */ int _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYSV computes the solution to a real system of linear equations */ /* A * X = B, */ /* where A is an N-by-N symmetric matrix and X and B are N-by-NRHS */ /* matrices. */ /* The diagonal pivoting method is used to factor A as */ /* A = U * D * U**T, if UPLO = 'U', or */ /* A = L * D * L**T, if UPLO = 'L', */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, and D is symmetric and block diagonal with */ /* 1-by-1 and 2-by-2 diagonal blocks. The factored form of A is then */ /* used to solve the system of equations A * X = B. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if INFO = 0, the block diagonal matrix D and the */ /* multipliers used to obtain the factor U or L from the */ /* factorization A = U*D*U**T or A = L*D*L**T as computed by */ /* DSYTRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D, as */ /* determined by DSYTRF. If IPIV(k) > 0, then rows and columns */ /* k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1 */ /* diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, */ /* then rows and columns k-1 and -IPIV(k) were interchanged and */ /* D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and */ /* IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and */ /* -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 */ /* diagonal block. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of WORK. LWORK >= 1, and for best performance */ /* LWORK >= max(1,N*NB), where NB is the optimal blocksize for */ /* DSYTRF. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, D(i,i) is exactly zero. The factorization */ /* has been completed, but the block diagonal matrix D is */ /* exactly singular, so the solution could not be computed. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } else if (*lwork < 1 && ! lquery) { *info = -10; } if (*info == 0) { if (*n == 0) { lwkopt = 1; } else { nb = _starpu_ilaenv_(&c__1, "DSYTRF", uplo, n, &c_n1, &c_n1, &c_n1); lwkopt = *n * nb; } work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYSV ", &i__1); return 0; } else if (lquery) { return 0; } /* Compute the factorization A = U*D*U' or A = L*D*L'. */ _starpu_dsytrf_(uplo, n, &a[a_offset], lda, &ipiv[1], &work[1], lwork, info); if (*info == 0) { /* Solve the system A*X = B, overwriting B with X. */ _starpu_dsytrs_(uplo, n, nrhs, &a[a_offset], lda, &ipiv[1], &b[b_offset], ldb, info); } work[1] = (doublereal) lwkopt; return 0; /* End of DSYSV */ } /* _starpu_dsysv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsysvx.c000066400000000000000000000334311413463044200207120ustar00rootroot00000000000000/* dsysvx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; /* Subroutine */ int _starpu_dsysvx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer * ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer *lwork, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2; /* Local variables */ integer nb; extern logical _starpu_lsame_(char *, char *); doublereal anorm; extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern doublereal _starpu_dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dsycon_(char *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dsyrfs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *), _starpu_dsytrf_(char *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; extern /* Subroutine */ int _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); /* -- LAPACK driver routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYSVX uses the diagonal pivoting factorization to compute the */ /* solution to a real system of linear equations A * X = B, */ /* where A is an N-by-N symmetric matrix and X and B are N-by-NRHS */ /* matrices. */ /* Error bounds on the solution and a condition estimate are also */ /* provided. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'N', the diagonal pivoting method is used to factor A. */ /* The form of the factorization is */ /* A = U * D * U**T, if UPLO = 'U', or */ /* A = L * D * L**T, if UPLO = 'L', */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, and D is symmetric and block diagonal with */ /* 1-by-1 and 2-by-2 diagonal blocks. */ /* 2. If some D(i,i)=0, so that D is exactly singular, then the routine */ /* returns with INFO = i. Otherwise, the factored form of A is used */ /* to estimate the condition number of the matrix A. If the */ /* reciprocal of the condition number is less than machine precision, */ /* INFO = N+1 is returned as a warning, but the routine still goes on */ /* to solve for X and compute error bounds as described below. */ /* 3. The system of equations is solved for X using the factored form */ /* of A. */ /* 4. Iterative refinement is applied to improve the computed solution */ /* matrix and calculate error bounds and backward error estimates */ /* for it. */ /* Arguments */ /* ========= */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of A has been */ /* supplied on entry. */ /* = 'F': On entry, AF and IPIV contain the factored form of */ /* A. AF and IPIV will not be modified. */ /* = 'N': The matrix A will be copied to AF and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of A contains the upper triangular part */ /* of the matrix A, and the strictly lower triangular part of A */ /* is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of A contains the lower triangular part of */ /* the matrix A, and the strictly upper triangular part of A is */ /* not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input or output) DOUBLE PRECISION array, dimension (LDAF,N) */ /* If FACT = 'F', then AF is an input argument and on entry */ /* contains the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L from the factorization */ /* A = U*D*U**T or A = L*D*L**T as computed by DSYTRF. */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L from the factorization */ /* A = U*D*U**T or A = L*D*L**T. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains details of the interchanges and the block structure */ /* of D, as determined by DSYTRF. */ /* If IPIV(k) > 0, then rows and columns k and IPIV(k) were */ /* interchanged and D(k,k) is a 1-by-1 diagonal block. */ /* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and */ /* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) */ /* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = */ /* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were */ /* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains details of the interchanges and the block structure */ /* of D, as determined by DSYTRF. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The N-by-NRHS right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The estimate of the reciprocal condition number of the matrix */ /* A. If RCOND is less than the machine precision (in */ /* particular, if RCOND = 0), the matrix is singular to working */ /* precision. This condition is indicated by a return code of */ /* INFO > 0. */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of WORK. LWORK >= max(1,3*N), and for best */ /* performance, when FACT = 'N', LWORK >= max(1,3*N,N*NB), where */ /* NB is the optimal blocksize for DSYTRF. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, and i is */ /* <= N: D(i,i) is exactly zero. The factorization */ /* has been completed but the factor D is exactly */ /* singular, so the solution and error bounds could */ /* not be computed. RCOND = 0 is returned. */ /* = N+1: D is nonsingular, but RCOND is less than machine */ /* precision, meaning that the matrix is singular */ /* to working precision. Nevertheless, the */ /* solution and error bounds are computed because */ /* there are a number of situations where the */ /* computed solution can be more accurate than the */ /* value of RCOND would suggest. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); lquery = *lwork == -1; if (! nofact && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -11; } else if (*ldx < max(1,*n)) { *info = -13; } else /* if(complicated condition) */ { /* Computing MAX */ i__1 = 1, i__2 = *n * 3; if (*lwork < max(i__1,i__2) && ! lquery) { *info = -18; } } if (*info == 0) { /* Computing MAX */ i__1 = 1, i__2 = *n * 3; lwkopt = max(i__1,i__2); if (nofact) { nb = _starpu_ilaenv_(&c__1, "DSYTRF", uplo, n, &c_n1, &c_n1, &c_n1); /* Computing MAX */ i__1 = lwkopt, i__2 = *n * nb; lwkopt = max(i__1,i__2); } work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYSVX", &i__1); return 0; } else if (lquery) { return 0; } if (nofact) { /* Compute the factorization A = U*D*U' or A = L*D*L'. */ _starpu_dlacpy_(uplo, n, n, &a[a_offset], lda, &af[af_offset], ldaf); _starpu_dsytrf_(uplo, n, &af[af_offset], ldaf, &ipiv[1], &work[1], lwork, info); /* Return if INFO is non-zero. */ if (*info > 0) { *rcond = 0.; return 0; } } /* Compute the norm of the matrix A. */ anorm = _starpu_dlansy_("I", uplo, n, &a[a_offset], lda, &work[1]); /* Compute the reciprocal of the condition number of A. */ _starpu_dsycon_(uplo, n, &af[af_offset], ldaf, &ipiv[1], &anorm, rcond, &work[1], &iwork[1], info); /* Compute the solution vectors X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dsytrs_(uplo, n, nrhs, &af[af_offset], ldaf, &ipiv[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solutions and */ /* compute error bounds and backward error estimates for them. */ _starpu_dsyrfs_(uplo, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, &ipiv[1], &b[b_offset], ldb, &x[x_offset], ldx, &ferr[1], &berr[1], &work[1] , &iwork[1], info); /* Set INFO = N+1 if the matrix is singular to working precision. */ if (*rcond < _starpu_dlamch_("Epsilon")) { *info = *n + 1; } work[1] = (doublereal) lwkopt; return 0; /* End of DSYSVX */ } /* _starpu_dsysvx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsysvxx.c000066400000000000000000000644531413463044200211120ustar00rootroot00000000000000/* dsysvxx.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dsysvxx_(char *fact, char *uplo, integer *n, integer * nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer *ipiv, char *equed, doublereal *s, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal * rpvgrw, doublereal *berr, integer *n_err_bnds__, doublereal * err_bnds_norm__, doublereal *err_bnds_comp__, integer *nparams, doublereal *params, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, af_dim1, af_offset, b_dim1, b_offset, x_dim1, x_offset, err_bnds_norm_dim1, err_bnds_norm_offset, err_bnds_comp_dim1, err_bnds_comp_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer j; doublereal amax, smin, smax; extern doublereal _starpu_dla_syrpvgrw__(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, ftnlen); extern logical _starpu_lsame_(char *, char *); doublereal scond; logical equil, rcequ; extern doublereal _starpu_dlamch_(char *); logical nofact; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; integer infequ; extern /* Subroutine */ int _starpu_dlaqsy_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, char *); doublereal smlnum; extern /* Subroutine */ int _starpu_dsytrf_(char *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlascl2_(integer *, integer *, doublereal *, doublereal *, integer *), _starpu_dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dsyequb_(char *, integer *, doublereal *, integer *, doublereal * , doublereal *, doublereal *, doublereal *, integer *), _starpu_dsyrfsx_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and -- */ /* -- Jason Riedy of Univ. of California Berkeley. -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley and NAG Ltd. -- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYSVXX uses the diagonal pivoting factorization to compute the */ /* solution to a double precision system of linear equations A * X = B, where A */ /* is an N-by-N symmetric matrix and X and B are N-by-NRHS matrices. */ /* If requested, both normwise and maximum componentwise error bounds */ /* are returned. DSYSVXX will return a solution with a tiny */ /* guaranteed error (O(eps) where eps is the working machine */ /* precision) unless the matrix is very ill-conditioned, in which */ /* case a warning is returned. Relevant condition numbers also are */ /* calculated and returned. */ /* DSYSVXX accepts user-provided factorizations and equilibration */ /* factors; see the definitions of the FACT and EQUED options. */ /* Solving with refinement and using a factorization from a previous */ /* DSYSVXX call will also produce a solution with either O(eps) */ /* errors or warnings, but we cannot make that claim for general */ /* user-provided factorizations and equilibration factors if they */ /* differ from what DSYSVXX would itself produce. */ /* Description */ /* =========== */ /* The following steps are performed: */ /* 1. If FACT = 'E', double precision scaling factors are computed to equilibrate */ /* the system: */ /* diag(S)*A*diag(S) *inv(diag(S))*X = diag(S)*B */ /* Whether or not the system will be equilibrated depends on the */ /* scaling of the matrix A, but if equilibration is used, A is */ /* overwritten by diag(S)*A*diag(S) and B by diag(S)*B. */ /* 2. If FACT = 'N' or 'E', the LU decomposition is used to factor */ /* the matrix A (after equilibration if FACT = 'E') as */ /* A = U * D * U**T, if UPLO = 'U', or */ /* A = L * D * L**T, if UPLO = 'L', */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, and D is symmetric and block diagonal with */ /* 1-by-1 and 2-by-2 diagonal blocks. */ /* 3. If some D(i,i)=0, so that D is exactly singular, then the */ /* routine returns with INFO = i. Otherwise, the factored form of A */ /* is used to estimate the condition number of the matrix A (see */ /* argument RCOND). If the reciprocal of the condition number is */ /* less than machine precision, the routine still goes on to solve */ /* for X and compute error bounds as described below. */ /* 4. The system of equations is solved for X using the factored form */ /* of A. */ /* 5. By default (unless PARAMS(LA_LINRX_ITREF_I) is set to zero), */ /* the routine will use iterative refinement to try to get a small */ /* error and error bounds. Refinement calculates the residual to at */ /* least twice the working precision. */ /* 6. If equilibration was used, the matrix X is premultiplied by */ /* diag(R) so that it solves the original system before */ /* equilibration. */ /* Arguments */ /* ========= */ /* Some optional parameters are bundled in the PARAMS array. These */ /* settings determine how refinement is performed, but often the */ /* defaults are acceptable. If the defaults are acceptable, users */ /* can pass NPARAMS = 0 which prevents the source code from accessing */ /* the PARAMS argument. */ /* FACT (input) CHARACTER*1 */ /* Specifies whether or not the factored form of the matrix A is */ /* supplied on entry, and if not, whether the matrix A should be */ /* equilibrated before it is factored. */ /* = 'F': On entry, AF and IPIV contain the factored form of A. */ /* If EQUED is not 'N', the matrix A has been */ /* equilibrated with scaling factors given by S. */ /* A, AF, and IPIV are not modified. */ /* = 'N': The matrix A will be copied to AF and factored. */ /* = 'E': The matrix A will be equilibrated if necessary, then */ /* copied to AF and factored. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The number of linear equations, i.e., the order of the */ /* matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* The symmetric matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of A contains the upper triangular */ /* part of the matrix A, and the strictly lower triangular */ /* part of A is not referenced. If UPLO = 'L', the leading */ /* N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by */ /* diag(S)*A*diag(S). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AF (input or output) DOUBLE PRECISION array, dimension (LDAF,N) */ /* If FACT = 'F', then AF is an input argument and on entry */ /* contains the block diagonal matrix D and the multipliers */ /* used to obtain the factor U or L from the factorization A = */ /* U*D*U**T or A = L*D*L**T as computed by DSYTRF. */ /* If FACT = 'N', then AF is an output argument and on exit */ /* returns the block diagonal matrix D and the multipliers */ /* used to obtain the factor U or L from the factorization A = */ /* U*D*U**T or A = L*D*L**T. */ /* LDAF (input) INTEGER */ /* The leading dimension of the array AF. LDAF >= max(1,N). */ /* IPIV (input or output) INTEGER array, dimension (N) */ /* If FACT = 'F', then IPIV is an input argument and on entry */ /* contains details of the interchanges and the block */ /* structure of D, as determined by DSYTRF. If IPIV(k) > 0, */ /* then rows and columns k and IPIV(k) were interchanged and */ /* D(k,k) is a 1-by-1 diagonal block. If UPLO = 'U' and */ /* IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and */ /* -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 */ /* diagonal block. If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, */ /* then rows and columns k+1 and -IPIV(k) were interchanged */ /* and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* If FACT = 'N', then IPIV is an output argument and on exit */ /* contains details of the interchanges and the block */ /* structure of D, as determined by DSYTRF. */ /* EQUED (input or output) CHARACTER*1 */ /* Specifies the form of equilibration that was done. */ /* = 'N': No equilibration (always true if FACT = 'N'). */ /* = 'Y': Both row and column equilibration, i.e., A has been */ /* replaced by diag(S) * A * diag(S). */ /* EQUED is an input argument if FACT = 'F'; otherwise, it is an */ /* output argument. */ /* S (input or output) DOUBLE PRECISION array, dimension (N) */ /* The scale factors for A. If EQUED = 'Y', A is multiplied on */ /* the left and right by diag(S). S is an input argument if FACT = */ /* 'F'; otherwise, S is an output argument. If FACT = 'F' and EQUED */ /* = 'Y', each element of S must be positive. If S is output, each */ /* element of S is a power of the radix. If S is input, each element */ /* of S should be a power of the radix to ensure a reliable solution */ /* and error estimates. Scaling by powers of the radix does not cause */ /* rounding errors unless the result underflows or overflows. */ /* Rounding errors during scaling lead to refining with a matrix that */ /* is not equivalent to the input matrix, producing error estimates */ /* that may not be reliable. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the N-by-NRHS right hand side matrix B. */ /* On exit, */ /* if EQUED = 'N', B is not modified; */ /* if EQUED = 'Y', B is overwritten by diag(S)*B; */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (output) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* If INFO = 0, the N-by-NRHS solution matrix X to the original */ /* system of equations. Note that A and B are modified on exit if */ /* EQUED .ne. 'N', and the solution to the equilibrated system is */ /* inv(diag(S))*X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* Reciprocal scaled condition number. This is an estimate of the */ /* reciprocal Skeel condition number of the matrix A after */ /* equilibration (if done). If this is less than the machine */ /* precision (in particular, if it is zero), the matrix is singular */ /* to working precision. Note that the error may still be small even */ /* if this number is very small and the matrix appears ill- */ /* conditioned. */ /* RPVGRW (output) DOUBLE PRECISION */ /* Reciprocal pivot growth. On exit, this contains the reciprocal */ /* pivot growth factor norm(A)/norm(U). The "max absolute element" */ /* norm is used. If this is much less than 1, then the stability of */ /* the LU factorization of the (equilibrated) matrix A could be poor. */ /* This also means that the solution X, estimated condition numbers, */ /* and error bounds could be unreliable. If factorization fails with */ /* 0 0 and <= N: U(INFO,INFO) is exactly zero. The factorization */ /* has been completed, but the factor U is exactly singular, so */ /* the solution and error bounds could not be computed. RCOND = 0 */ /* is returned. */ /* = N+J: The solution corresponding to the Jth right-hand side is */ /* not guaranteed. The solutions corresponding to other right- */ /* hand sides K with K > J may not be guaranteed as well, but */ /* only the first such right-hand side is reported. If a small */ /* componentwise error is not requested (PARAMS(3) = 0.0) then */ /* the Jth right-hand side is the first with a normwise error */ /* bound that is not guaranteed (the smallest J such */ /* that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0) */ /* the Jth right-hand side is the first with either a normwise or */ /* componentwise error bound that is not guaranteed (the smallest */ /* J such that either ERR_BNDS_NORM(J,1) = 0.0 or */ /* ERR_BNDS_COMP(J,1) = 0.0). See the definition of */ /* ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information */ /* about all of the right-hand sides check ERR_BNDS_NORM or */ /* ERR_BNDS_COMP. */ /* ================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ err_bnds_comp_dim1 = *nrhs; err_bnds_comp_offset = 1 + err_bnds_comp_dim1; err_bnds_comp__ -= err_bnds_comp_offset; err_bnds_norm_dim1 = *nrhs; err_bnds_norm_offset = 1 + err_bnds_norm_dim1; err_bnds_norm__ -= err_bnds_norm_offset; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; af_dim1 = *ldaf; af_offset = 1 + af_dim1; af -= af_offset; --ipiv; --s; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --berr; --params; --work; --iwork; /* Function Body */ *info = 0; nofact = _starpu_lsame_(fact, "N"); equil = _starpu_lsame_(fact, "E"); smlnum = _starpu_dlamch_("Safe minimum"); bignum = 1. / smlnum; if (nofact || equil) { *(unsigned char *)equed = 'N'; rcequ = FALSE_; } else { rcequ = _starpu_lsame_(equed, "Y"); } /* Default is failure. If an input parameter is wrong or */ /* factorization fails, make everything look horrible. Only the */ /* pivot growth is set here, the rest is initialized in DSYRFSX. */ *rpvgrw = 0.; /* Test the input parameters. PARAMS is not tested until DSYRFSX. */ if (! nofact && ! equil && ! _starpu_lsame_(fact, "F")) { *info = -1; } else if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*nrhs < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldaf < max(1,*n)) { *info = -8; } else if (_starpu_lsame_(fact, "F") && ! (rcequ || _starpu_lsame_( equed, "N"))) { *info = -9; } else { if (rcequ) { smin = bignum; smax = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MIN */ d__1 = smin, d__2 = s[j]; smin = min(d__1,d__2); /* Computing MAX */ d__1 = smax, d__2 = s[j]; smax = max(d__1,d__2); /* L10: */ } if (smin <= 0.) { *info = -10; } else if (*n > 0) { scond = max(smin,smlnum) / min(smax,bignum); } else { scond = 1.; } } if (*info == 0) { if (*ldb < max(1,*n)) { *info = -12; } else if (*ldx < max(1,*n)) { *info = -14; } } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYSVXX", &i__1); return 0; } if (equil) { /* Compute row and column scalings to equilibrate the matrix A. */ _starpu_dsyequb_(uplo, n, &a[a_offset], lda, &s[1], &scond, &amax, &work[1], & infequ); if (infequ == 0) { /* Equilibrate the matrix. */ _starpu_dlaqsy_(uplo, n, &a[a_offset], lda, &s[1], &scond, &amax, equed); rcequ = _starpu_lsame_(equed, "Y"); } } /* Scale the right-hand side. */ if (rcequ) { _starpu_dlascl2_(n, nrhs, &s[1], &b[b_offset], ldb); } if (nofact || equil) { /* Compute the LU factorization of A. */ _starpu_dlacpy_(uplo, n, n, &a[a_offset], lda, &af[af_offset], ldaf); i__1 = max(1,*n) * 5; _starpu_dsytrf_(uplo, n, &af[af_offset], ldaf, &ipiv[1], &work[1], &i__1, info); /* Return if INFO is non-zero. */ if (*info > 0) { /* Pivot in column INFO is exactly 0 */ /* Compute the reciprocal pivot growth factor of the */ /* leading rank-deficient INFO columns of A. */ if (*n > 0) { *rpvgrw = _starpu_dla_syrpvgrw__(uplo, n, info, &a[a_offset], lda, & af[af_offset], ldaf, &ipiv[1], &work[1], (ftnlen)1); } return 0; } } /* Compute the reciprocal pivot growth factor RPVGRW. */ if (*n > 0) { *rpvgrw = _starpu_dla_syrpvgrw__(uplo, n, info, &a[a_offset], lda, &af[ af_offset], ldaf, &ipiv[1], &work[1], (ftnlen)1); } /* Compute the solution matrix X. */ _starpu_dlacpy_("Full", n, nrhs, &b[b_offset], ldb, &x[x_offset], ldx); _starpu_dsytrs_(uplo, n, nrhs, &af[af_offset], ldaf, &ipiv[1], &x[x_offset], ldx, info); /* Use iterative refinement to improve the computed solution and */ /* compute error bounds and backward error estimates for it. */ _starpu_dsyrfsx_(uplo, equed, n, nrhs, &a[a_offset], lda, &af[af_offset], ldaf, & ipiv[1], &s[1], &b[b_offset], ldb, &x[x_offset], ldx, rcond, & berr[1], n_err_bnds__, &err_bnds_norm__[err_bnds_norm_offset], & err_bnds_comp__[err_bnds_comp_offset], nparams, ¶ms[1], &work[ 1], &iwork[1], info); /* Scale solutions. */ if (rcequ) { _starpu_dlascl2_(n, nrhs, &s[1], &x[x_offset], ldx); } return 0; /* End of DSYSVXX */ } /* _starpu_dsysvxx_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsytd2.c000066400000000000000000000231111413463044200205550ustar00rootroot00000000000000/* dsytd2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = 0.; static doublereal c_b14 = -1.; /* Subroutine */ int _starpu_dsytd2_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal taui; extern /* Subroutine */ int _starpu_dsyr2_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal alpha; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer * ); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal */ /* form T by an orthogonal similarity transformation: Q' * A * Q = T. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n-by-n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n-by-n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if UPLO = 'U', the diagonal and first superdiagonal */ /* of A are overwritten by the corresponding elements of the */ /* tridiagonal matrix T, and the elements above the first */ /* superdiagonal, with the array TAU, represent the orthogonal */ /* matrix Q as a product of elementary reflectors; if UPLO */ /* = 'L', the diagonal and first subdiagonal of A are over- */ /* written by the corresponding elements of the tridiagonal */ /* matrix T, and the elements below the first subdiagonal, with */ /* the array TAU, represent the orthogonal matrix Q as a product */ /* of elementary reflectors. See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* D (output) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of the tridiagonal matrix T: */ /* D(i) = A(i,i). */ /* E (output) DOUBLE PRECISION array, dimension (N-1) */ /* The off-diagonal elements of the tridiagonal matrix T: */ /* E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ /* TAU (output) DOUBLE PRECISION array, dimension (N-1) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* Further Details */ /* =============== */ /* If UPLO = 'U', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(n-1) . . . H(2) H(1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ /* A(1:i-1,i+1), and tau in TAU(i). */ /* If UPLO = 'L', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(1) H(2) . . . H(n-1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ /* and tau in TAU(i). */ /* The contents of A on exit are illustrated by the following examples */ /* with n = 5: */ /* if UPLO = 'U': if UPLO = 'L': */ /* ( d e v2 v3 v4 ) ( d ) */ /* ( d e v3 v4 ) ( e d ) */ /* ( d e v4 ) ( v1 e d ) */ /* ( d e ) ( v1 v2 e d ) */ /* ( d ) ( v1 v2 v3 e d ) */ /* where d and e denote diagonal and off-diagonal elements of T, and vi */ /* denotes an element of the vector defining H(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tau; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYTD2", &i__1); return 0; } /* Quick return if possible */ if (*n <= 0) { return 0; } if (upper) { /* Reduce the upper triangle of A */ for (i__ = *n - 1; i__ >= 1; --i__) { /* Generate elementary reflector H(i) = I - tau * v * v' */ /* to annihilate A(1:i-1,i+1) */ _starpu_dlarfg_(&i__, &a[i__ + (i__ + 1) * a_dim1], &a[(i__ + 1) * a_dim1 + 1], &c__1, &taui); e[i__] = a[i__ + (i__ + 1) * a_dim1]; if (taui != 0.) { /* Apply H(i) from both sides to A(1:i,1:i) */ a[i__ + (i__ + 1) * a_dim1] = 1.; /* Compute x := tau * A * v storing x in TAU(1:i) */ _starpu_dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * a_dim1 + 1], &c__1, &c_b8, &tau[1], &c__1); /* Compute w := x - 1/2 * tau * (x'*v) * v */ alpha = taui * -.5 * _starpu_ddot_(&i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1], &c__1); _starpu_daxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ 1], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w' - w * v' */ _starpu_dsyr2_(uplo, &i__, &c_b14, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[1], &c__1, &a[a_offset], lda); a[i__ + (i__ + 1) * a_dim1] = e[i__]; } d__[i__ + 1] = a[i__ + 1 + (i__ + 1) * a_dim1]; tau[i__] = taui; /* L10: */ } d__[1] = a[a_dim1 + 1]; } else { /* Reduce the lower triangle of A */ i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) = I - tau * v * v' */ /* to annihilate A(i+2:n,i) */ i__2 = *n - i__; /* Computing MIN */ i__3 = i__ + 2; _starpu_dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *n)+ i__ * a_dim1], &c__1, &taui); e[i__] = a[i__ + 1 + i__ * a_dim1]; if (taui != 0.) { /* Apply H(i) from both sides to A(i+1:n,i+1:n) */ a[i__ + 1 + i__ * a_dim1] = 1.; /* Compute x := tau * A * v storing y in TAU(i:n-1) */ i__2 = *n - i__; _starpu_dsymv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b8, &tau[ i__], &c__1); /* Compute w := x - 1/2 * tau * (x'*v) * v */ i__2 = *n - i__; alpha = taui * -.5 * _starpu_ddot_(&i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); i__2 = *n - i__; _starpu_daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ i__], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w' - w * v' */ i__2 = *n - i__; _starpu_dsyr2_(uplo, &i__2, &c_b14, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], lda); a[i__ + 1 + i__ * a_dim1] = e[i__]; } d__[i__] = a[i__ + i__ * a_dim1]; tau[i__] = taui; /* L20: */ } d__[*n] = a[*n + *n * a_dim1]; } return 0; /* End of DSYTD2 */ } /* _starpu_dsytd2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsytf2.c000066400000000000000000000420751413463044200205710ustar00rootroot00000000000000/* dsytf2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dsytf2_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1, d__2, d__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal t, r1, d11, d12, d21, d22; integer kk, kp; doublereal wk, wkm1, wkp1; integer imax, jmax; extern /* Subroutine */ int _starpu_dsyr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal alpha; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer kstep; logical upper; doublereal absakk; extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern logical _starpu_disnan_(doublereal *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal colmax, rowmax; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYTF2 computes the factorization of a real symmetric matrix A using */ /* the Bunch-Kaufman diagonal pivoting method: */ /* A = U*D*U' or A = L*D*L' */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, U' is the transpose of U, and D is symmetric and */ /* block diagonal with 1-by-1 and 2-by-2 diagonal blocks. */ /* This is the unblocked version of the algorithm, calling Level 2 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the upper or lower triangular part of the */ /* symmetric matrix A is stored: */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* n-by-n upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n-by-n lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L (see below for further details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D. */ /* If IPIV(k) > 0, then rows and columns k and IPIV(k) were */ /* interchanged and D(k,k) is a 1-by-1 diagonal block. */ /* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and */ /* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) */ /* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = */ /* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were */ /* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* > 0: if INFO = k, D(k,k) is exactly zero. The factorization */ /* has been completed, but the block diagonal matrix D is */ /* exactly singular, and division by zero will occur if it */ /* is used to solve a system of equations. */ /* Further Details */ /* =============== */ /* 09-29-06 - patch from */ /* Bobby Cheng, MathWorks */ /* Replace l.204 and l.372 */ /* IF( MAX( ABSAKK, COLMAX ).EQ.ZERO ) THEN */ /* by */ /* IF( (MAX( ABSAKK, COLMAX ).EQ.ZERO) .OR. DISNAN(ABSAKK) ) THEN */ /* 01-01-96 - Based on modifications by */ /* J. Lewis, Boeing Computer Services Company */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* 1-96 - Based on modifications by J. Lewis, Boeing Computer Services */ /* Company */ /* If UPLO = 'U', then A = U*D*U', where */ /* U = P(n)*U(n)* ... *P(k)U(k)* ..., */ /* i.e., U is a product of terms P(k)*U(k), where k decreases from n to */ /* 1 in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 */ /* and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as */ /* defined by IPIV(k), and U(k) is a unit upper triangular matrix, such */ /* that if the diagonal block D(k) is of order s (s = 1 or 2), then */ /* ( I v 0 ) k-s */ /* U(k) = ( 0 I 0 ) s */ /* ( 0 0 I ) n-k */ /* k-s s n-k */ /* If s = 1, D(k) overwrites A(k,k), and v overwrites A(1:k-1,k). */ /* If s = 2, the upper triangle of D(k) overwrites A(k-1,k-1), A(k-1,k), */ /* and A(k,k), and v overwrites A(1:k-2,k-1:k). */ /* If UPLO = 'L', then A = L*D*L', where */ /* L = P(1)*L(1)* ... *P(k)*L(k)* ..., */ /* i.e., L is a product of terms P(k)*L(k), where k increases from 1 to */ /* n in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 */ /* and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as */ /* defined by IPIV(k), and L(k) is a unit lower triangular matrix, such */ /* that if the diagonal block D(k) is of order s (s = 1 or 2), then */ /* ( I 0 0 ) k-1 */ /* L(k) = ( 0 I 0 ) s */ /* ( 0 v I ) n-k-s+1 */ /* k-1 s n-k-s+1 */ /* If s = 1, D(k) overwrites A(k,k), and v overwrites A(k+1:n,k). */ /* If s = 2, the lower triangle of D(k) overwrites A(k,k), A(k+1,k), */ /* and A(k+1,k+1), and v overwrites A(k+2:n,k:k+1). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYTF2", &i__1); return 0; } /* Initialize ALPHA for use in choosing pivot block size. */ alpha = (sqrt(17.) + 1.) / 8.; if (upper) { /* Factorize A as U*D*U' using the upper triangle of A */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* 1 or 2 */ k = *n; L10: /* If K < 1, exit from loop */ if (k < 1) { goto L70; } kstep = 1; /* Determine rows and columns to be interchanged and whether */ /* a 1-by-1 or 2-by-2 pivot block will be used */ absakk = (d__1 = a[k + k * a_dim1], abs(d__1)); /* IMAX is the row-index of the largest off-diagonal element in */ /* column K, and COLMAX is its absolute value */ if (k > 1) { i__1 = k - 1; imax = _starpu_idamax_(&i__1, &a[k * a_dim1 + 1], &c__1); colmax = (d__1 = a[imax + k * a_dim1], abs(d__1)); } else { colmax = 0.; } if (max(absakk,colmax) == 0. || _starpu_disnan_(&absakk)) { /* Column K is zero or contains a NaN: set INFO and continue */ if (*info == 0) { *info = k; } kp = k; } else { if (absakk >= alpha * colmax) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else { /* JMAX is the column-index of the largest off-diagonal */ /* element in row IMAX, and ROWMAX is its absolute value */ i__1 = k - imax; jmax = imax + _starpu_idamax_(&i__1, &a[imax + (imax + 1) * a_dim1], lda); rowmax = (d__1 = a[imax + jmax * a_dim1], abs(d__1)); if (imax > 1) { i__1 = imax - 1; jmax = _starpu_idamax_(&i__1, &a[imax * a_dim1 + 1], &c__1); /* Computing MAX */ d__2 = rowmax, d__3 = (d__1 = a[jmax + imax * a_dim1], abs(d__1)); rowmax = max(d__2,d__3); } if (absakk >= alpha * colmax * (colmax / rowmax)) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else if ((d__1 = a[imax + imax * a_dim1], abs(d__1)) >= alpha * rowmax) { /* interchange rows and columns K and IMAX, use 1-by-1 */ /* pivot block */ kp = imax; } else { /* interchange rows and columns K-1 and IMAX, use 2-by-2 */ /* pivot block */ kp = imax; kstep = 2; } } kk = k - kstep + 1; if (kp != kk) { /* Interchange rows and columns KK and KP in the leading */ /* submatrix A(1:k,1:k) */ i__1 = kp - 1; _starpu_dswap_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); i__1 = kk - kp - 1; _starpu_dswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); t = a[kk + kk * a_dim1]; a[kk + kk * a_dim1] = a[kp + kp * a_dim1]; a[kp + kp * a_dim1] = t; if (kstep == 2) { t = a[k - 1 + k * a_dim1]; a[k - 1 + k * a_dim1] = a[kp + k * a_dim1]; a[kp + k * a_dim1] = t; } } /* Update the leading submatrix */ if (kstep == 1) { /* 1-by-1 pivot block D(k): column k now holds */ /* W(k) = U(k)*D(k) */ /* where U(k) is the k-th column of U */ /* Perform a rank-1 update of A(1:k-1,1:k-1) as */ /* A := A - U(k)*D(k)*U(k)' = A - W(k)*1/D(k)*W(k)' */ r1 = 1. / a[k + k * a_dim1]; i__1 = k - 1; d__1 = -r1; _starpu_dsyr_(uplo, &i__1, &d__1, &a[k * a_dim1 + 1], &c__1, &a[ a_offset], lda); /* Store U(k) in column k */ i__1 = k - 1; _starpu_dscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); } else { /* 2-by-2 pivot block D(k): columns k and k-1 now hold */ /* ( W(k-1) W(k) ) = ( U(k-1) U(k) )*D(k) */ /* where U(k) and U(k-1) are the k-th and (k-1)-th columns */ /* of U */ /* Perform a rank-2 update of A(1:k-2,1:k-2) as */ /* A := A - ( U(k-1) U(k) )*D(k)*( U(k-1) U(k) )' */ /* = A - ( W(k-1) W(k) )*inv(D(k))*( W(k-1) W(k) )' */ if (k > 2) { d12 = a[k - 1 + k * a_dim1]; d22 = a[k - 1 + (k - 1) * a_dim1] / d12; d11 = a[k + k * a_dim1] / d12; t = 1. / (d11 * d22 - 1.); d12 = t / d12; for (j = k - 2; j >= 1; --j) { wkm1 = d12 * (d11 * a[j + (k - 1) * a_dim1] - a[j + k * a_dim1]); wk = d12 * (d22 * a[j + k * a_dim1] - a[j + (k - 1) * a_dim1]); for (i__ = j; i__ >= 1; --i__) { a[i__ + j * a_dim1] = a[i__ + j * a_dim1] - a[i__ + k * a_dim1] * wk - a[i__ + (k - 1) * a_dim1] * wkm1; /* L20: */ } a[j + k * a_dim1] = wk; a[j + (k - 1) * a_dim1] = wkm1; /* L30: */ } } } } /* Store details of the interchanges in IPIV */ if (kstep == 1) { ipiv[k] = kp; } else { ipiv[k] = -kp; ipiv[k - 1] = -kp; } /* Decrease K and return to the start of the main loop */ k -= kstep; goto L10; } else { /* Factorize A as L*D*L' using the lower triangle of A */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2 */ k = 1; L40: /* If K > N, exit from loop */ if (k > *n) { goto L70; } kstep = 1; /* Determine rows and columns to be interchanged and whether */ /* a 1-by-1 or 2-by-2 pivot block will be used */ absakk = (d__1 = a[k + k * a_dim1], abs(d__1)); /* IMAX is the row-index of the largest off-diagonal element in */ /* column K, and COLMAX is its absolute value */ if (k < *n) { i__1 = *n - k; imax = k + _starpu_idamax_(&i__1, &a[k + 1 + k * a_dim1], &c__1); colmax = (d__1 = a[imax + k * a_dim1], abs(d__1)); } else { colmax = 0.; } if (max(absakk,colmax) == 0. || _starpu_disnan_(&absakk)) { /* Column K is zero or contains a NaN: set INFO and continue */ if (*info == 0) { *info = k; } kp = k; } else { if (absakk >= alpha * colmax) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else { /* JMAX is the column-index of the largest off-diagonal */ /* element in row IMAX, and ROWMAX is its absolute value */ i__1 = imax - k; jmax = k - 1 + _starpu_idamax_(&i__1, &a[imax + k * a_dim1], lda); rowmax = (d__1 = a[imax + jmax * a_dim1], abs(d__1)); if (imax < *n) { i__1 = *n - imax; jmax = imax + _starpu_idamax_(&i__1, &a[imax + 1 + imax * a_dim1], &c__1); /* Computing MAX */ d__2 = rowmax, d__3 = (d__1 = a[jmax + imax * a_dim1], abs(d__1)); rowmax = max(d__2,d__3); } if (absakk >= alpha * colmax * (colmax / rowmax)) { /* no interchange, use 1-by-1 pivot block */ kp = k; } else if ((d__1 = a[imax + imax * a_dim1], abs(d__1)) >= alpha * rowmax) { /* interchange rows and columns K and IMAX, use 1-by-1 */ /* pivot block */ kp = imax; } else { /* interchange rows and columns K+1 and IMAX, use 2-by-2 */ /* pivot block */ kp = imax; kstep = 2; } } kk = k + kstep - 1; if (kp != kk) { /* Interchange rows and columns KK and KP in the trailing */ /* submatrix A(k:n,k:n) */ if (kp < *n) { i__1 = *n - kp; _starpu_dswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); } i__1 = kp - kk - 1; _starpu_dswap_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk + 1) * a_dim1], lda); t = a[kk + kk * a_dim1]; a[kk + kk * a_dim1] = a[kp + kp * a_dim1]; a[kp + kp * a_dim1] = t; if (kstep == 2) { t = a[k + 1 + k * a_dim1]; a[k + 1 + k * a_dim1] = a[kp + k * a_dim1]; a[kp + k * a_dim1] = t; } } /* Update the trailing submatrix */ if (kstep == 1) { /* 1-by-1 pivot block D(k): column k now holds */ /* W(k) = L(k)*D(k) */ /* where L(k) is the k-th column of L */ if (k < *n) { /* Perform a rank-1 update of A(k+1:n,k+1:n) as */ /* A := A - L(k)*D(k)*L(k)' = A - W(k)*(1/D(k))*W(k)' */ d11 = 1. / a[k + k * a_dim1]; i__1 = *n - k; d__1 = -d11; _starpu_dsyr_(uplo, &i__1, &d__1, &a[k + 1 + k * a_dim1], &c__1, & a[k + 1 + (k + 1) * a_dim1], lda); /* Store L(k) in column K */ i__1 = *n - k; _starpu_dscal_(&i__1, &d11, &a[k + 1 + k * a_dim1], &c__1); } } else { /* 2-by-2 pivot block D(k) */ if (k < *n - 1) { /* Perform a rank-2 update of A(k+2:n,k+2:n) as */ /* A := A - ( (A(k) A(k+1))*D(k)**(-1) ) * (A(k) A(k+1))' */ /* where L(k) and L(k+1) are the k-th and (k+1)-th */ /* columns of L */ d21 = a[k + 1 + k * a_dim1]; d11 = a[k + 1 + (k + 1) * a_dim1] / d21; d22 = a[k + k * a_dim1] / d21; t = 1. / (d11 * d22 - 1.); d21 = t / d21; i__1 = *n; for (j = k + 2; j <= i__1; ++j) { wk = d21 * (d11 * a[j + k * a_dim1] - a[j + (k + 1) * a_dim1]); wkp1 = d21 * (d22 * a[j + (k + 1) * a_dim1] - a[j + k * a_dim1]); i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + j * a_dim1] - a[i__ + k * a_dim1] * wk - a[i__ + (k + 1) * a_dim1] * wkp1; /* L50: */ } a[j + k * a_dim1] = wk; a[j + (k + 1) * a_dim1] = wkp1; /* L60: */ } } } } /* Store details of the interchanges in IPIV */ if (kstep == 1) { ipiv[k] = kp; } else { ipiv[k] = -kp; ipiv[k + 1] = -kp; } /* Increase K and return to the start of the main loop */ k += kstep; goto L40; } L70: return 0; /* End of DSYTF2 */ } /* _starpu_dsytf2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsytrd.c000066400000000000000000000263051413463044200206650ustar00rootroot00000000000000/* dsytrd.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b22 = -1.; static doublereal c_b23 = 1.; /* Subroutine */ int _starpu_dsytrd_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, nb, kk, nx, iws; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; logical upper; extern /* Subroutine */ int _starpu_dsytd2_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dsyr2k_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlatrd_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYTRD reduces a real symmetric matrix A to real symmetric */ /* tridiagonal form T by an orthogonal similarity transformation: */ /* Q**T * A * Q = T. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, if UPLO = 'U', the diagonal and first superdiagonal */ /* of A are overwritten by the corresponding elements of the */ /* tridiagonal matrix T, and the elements above the first */ /* superdiagonal, with the array TAU, represent the orthogonal */ /* matrix Q as a product of elementary reflectors; if UPLO */ /* = 'L', the diagonal and first subdiagonal of A are over- */ /* written by the corresponding elements of the tridiagonal */ /* matrix T, and the elements below the first subdiagonal, with */ /* the array TAU, represent the orthogonal matrix Q as a product */ /* of elementary reflectors. See Further Details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* D (output) DOUBLE PRECISION array, dimension (N) */ /* The diagonal elements of the tridiagonal matrix T: */ /* D(i) = A(i,i). */ /* E (output) DOUBLE PRECISION array, dimension (N-1) */ /* The off-diagonal elements of the tridiagonal matrix T: */ /* E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ /* TAU (output) DOUBLE PRECISION array, dimension (N-1) */ /* The scalar factors of the elementary reflectors (see Further */ /* Details). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= 1. */ /* For optimum performance LWORK >= N*NB, where NB is the */ /* optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* If UPLO = 'U', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(n-1) . . . H(2) H(1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ /* A(1:i-1,i+1), and tau in TAU(i). */ /* If UPLO = 'L', the matrix Q is represented as a product of elementary */ /* reflectors */ /* Q = H(1) H(2) . . . H(n-1). */ /* Each H(i) has the form */ /* H(i) = I - tau * v * v' */ /* where tau is a real scalar, and v is a real vector with */ /* v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ /* and tau in TAU(i). */ /* The contents of A on exit are illustrated by the following examples */ /* with n = 5: */ /* if UPLO = 'U': if UPLO = 'L': */ /* ( d e v2 v3 v4 ) ( d ) */ /* ( d e v3 v4 ) ( e d ) */ /* ( d e v4 ) ( v1 e d ) */ /* ( d e ) ( v1 v2 e d ) */ /* ( d ) ( v1 v2 v3 e d ) */ /* where d and e denote diagonal and off-diagonal elements of T, and vi */ /* denotes an element of the vector defining H(i). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tau; --work; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1; if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*lwork < 1 && ! lquery) { *info = -9; } if (*info == 0) { /* Determine the block size. */ nb = _starpu_ilaenv_(&c__1, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYTRD", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { work[1] = 1.; return 0; } nx = *n; iws = 1; if (nb > 1 && nb < *n) { /* Determine when to cross over from blocked to unblocked code */ /* (last block is always handled by unblocked code). */ /* Computing MAX */ i__1 = nb, i__2 = _starpu_ilaenv_(&c__3, "DSYTRD", uplo, n, &c_n1, &c_n1, & c_n1); nx = max(i__1,i__2); if (nx < *n) { /* Determine if workspace is large enough for blocked code. */ ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: determine the */ /* minimum value of NB, and reduce NB or force use of */ /* unblocked code by setting NX = N. */ /* Computing MAX */ i__1 = *lwork / ldwork; nb = max(i__1,1); nbmin = _starpu_ilaenv_(&c__2, "DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1); if (nb < nbmin) { nx = *n; } } } else { nx = *n; } } else { nb = 1; } if (upper) { /* Reduce the upper triangle of A. */ /* Columns 1:kk are handled by the unblocked method. */ kk = *n - (*n - nx + nb - 1) / nb * nb; i__1 = kk + 1; i__2 = -nb; for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the */ /* matrix W which is needed to update the unreduced part of */ /* the matrix */ i__3 = i__ + nb - 1; _starpu_dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & work[1], &ldwork); /* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ /* update of the form: A := A - V*W' - W*V' */ i__3 = i__ - 1; _starpu_dsyr2k_(uplo, "No transpose", &i__3, &nb, &c_b22, &a[i__ * a_dim1 + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda); /* Copy superdiagonal elements back into A, and diagonal */ /* elements into D */ i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j - 1 + j * a_dim1] = e[j - 1]; d__[j] = a[j + j * a_dim1]; /* L10: */ } /* L20: */ } /* Use unblocked code to reduce the last or only block */ _starpu_dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo); } else { /* Reduce the lower triangle of A */ i__2 = *n - nx; i__1 = nb; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the */ /* matrix W which is needed to update the unreduced part of */ /* the matrix */ i__3 = *n - i__ + 1; _starpu_dlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & tau[i__], &work[1], &ldwork); /* Update the unreduced submatrix A(i+ib:n,i+ib:n), using */ /* an update of the form: A := A - V*W' - W*V' */ i__3 = *n - i__ - nb + 1; _starpu_dsyr2k_(uplo, "No transpose", &i__3, &nb, &c_b22, &a[i__ + nb + i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ i__ + nb + (i__ + nb) * a_dim1], lda); /* Copy subdiagonal elements back into A, and diagonal */ /* elements into D */ i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j + 1 + j * a_dim1] = e[j]; d__[j] = a[j + j * a_dim1]; /* L30: */ } /* L40: */ } /* Use unblocked code to reduce the last or only block */ i__1 = *n - i__ + 1; _starpu_dsytd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], &tau[i__], &iinfo); } work[1] = (doublereal) lwkopt; return 0; /* End of DSYTRD */ } /* _starpu_dsytrd_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsytrf.c000066400000000000000000000245231413463044200206670ustar00rootroot00000000000000/* dsytrf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; /* Subroutine */ int _starpu_dsytrf_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer j, k, kb, nb, iws; extern logical _starpu_lsame_(char *, char *); integer nbmin, iinfo; logical upper; extern /* Subroutine */ int _starpu_dsytf2_(char *, integer *, doublereal *, integer *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlasyf_(char *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYTRF computes the factorization of a real symmetric matrix A using */ /* the Bunch-Kaufman diagonal pivoting method. The form of the */ /* factorization is */ /* A = U*D*U**T or A = L*D*L**T */ /* where U (or L) is a product of permutation and unit upper (lower) */ /* triangular matrices, and D is symmetric and block diagonal with */ /* 1-by-1 and 2-by-2 diagonal blocks. */ /* This is the blocked version of the algorithm, calling Level 3 BLAS. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the symmetric matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* On exit, the block diagonal matrix D and the multipliers used */ /* to obtain the factor U or L (see below for further details). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (output) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D. */ /* If IPIV(k) > 0, then rows and columns k and IPIV(k) were */ /* interchanged and D(k,k) is a 1-by-1 diagonal block. */ /* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and */ /* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) */ /* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = */ /* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were */ /* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The length of WORK. LWORK >=1. For best performance */ /* LWORK >= N*NB, where NB is the block size returned by ILAENV. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, D(i,i) is exactly zero. The factorization */ /* has been completed, but the block diagonal matrix D is */ /* exactly singular, and division by zero will occur if it */ /* is used to solve a system of equations. */ /* Further Details */ /* =============== */ /* If UPLO = 'U', then A = U*D*U', where */ /* U = P(n)*U(n)* ... *P(k)U(k)* ..., */ /* i.e., U is a product of terms P(k)*U(k), where k decreases from n to */ /* 1 in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 */ /* and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as */ /* defined by IPIV(k), and U(k) is a unit upper triangular matrix, such */ /* that if the diagonal block D(k) is of order s (s = 1 or 2), then */ /* ( I v 0 ) k-s */ /* U(k) = ( 0 I 0 ) s */ /* ( 0 0 I ) n-k */ /* k-s s n-k */ /* If s = 1, D(k) overwrites A(k,k), and v overwrites A(1:k-1,k). */ /* If s = 2, the upper triangle of D(k) overwrites A(k-1,k-1), A(k-1,k), */ /* and A(k,k), and v overwrites A(1:k-2,k-1:k). */ /* If UPLO = 'L', then A = L*D*L', where */ /* L = P(1)*L(1)* ... *P(k)*L(k)* ..., */ /* i.e., L is a product of terms P(k)*L(k), where k increases from 1 to */ /* n in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 */ /* and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as */ /* defined by IPIV(k), and L(k) is a unit lower triangular matrix, such */ /* that if the diagonal block D(k) is of order s (s = 1 or 2), then */ /* ( I 0 0 ) k-1 */ /* L(k) = ( 0 I 0 ) s */ /* ( 0 v I ) n-k-s+1 */ /* k-1 s n-k-s+1 */ /* If s = 1, D(k) overwrites A(k,k), and v overwrites A(k+1:n,k). */ /* If s = 2, the lower triangle of D(k) overwrites A(k,k), A(k+1,k), */ /* and A(k+1,k+1), and v overwrites A(k+2:n,k:k+1). */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; --work; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); lquery = *lwork == -1; if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } else if (*lwork < 1 && ! lquery) { *info = -7; } if (*info == 0) { /* Determine the block size */ nb = _starpu_ilaenv_(&c__1, "DSYTRF", uplo, n, &c_n1, &c_n1, &c_n1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYTRF", &i__1); return 0; } else if (lquery) { return 0; } nbmin = 2; ldwork = *n; if (nb > 1 && nb < *n) { iws = ldwork * nb; if (*lwork < iws) { /* Computing MAX */ i__1 = *lwork / ldwork; nb = max(i__1,1); /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DSYTRF", uplo, n, &c_n1, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } else { iws = 1; } if (nb < nbmin) { nb = *n; } if (upper) { /* Factorize A as U*D*U' using the upper triangle of A */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* KB, where KB is the number of columns factorized by DLASYF; */ /* KB is either NB or NB-1, or K for the last block */ k = *n; L10: /* If K < 1, exit from loop */ if (k < 1) { goto L40; } if (k > nb) { /* Factorize columns k-kb+1:k of A and use blocked code to */ /* update columns 1:k-kb */ _starpu_dlasyf_(uplo, &k, &nb, &kb, &a[a_offset], lda, &ipiv[1], &work[1], &ldwork, &iinfo); } else { /* Use unblocked code to factorize columns 1:k of A */ _starpu_dsytf2_(uplo, &k, &a[a_offset], lda, &ipiv[1], &iinfo); kb = k; } /* Set INFO on the first occurrence of a zero pivot */ if (*info == 0 && iinfo > 0) { *info = iinfo; } /* Decrease K and return to the start of the main loop */ k -= kb; goto L10; } else { /* Factorize A as L*D*L' using the lower triangle of A */ /* K is the main loop index, increasing from 1 to N in steps of */ /* KB, where KB is the number of columns factorized by DLASYF; */ /* KB is either NB or NB-1, or N-K+1 for the last block */ k = 1; L20: /* If K > N, exit from loop */ if (k > *n) { goto L40; } if (k <= *n - nb) { /* Factorize columns k:k+kb-1 of A and use blocked code to */ /* update columns k+kb:n */ i__1 = *n - k + 1; _starpu_dlasyf_(uplo, &i__1, &nb, &kb, &a[k + k * a_dim1], lda, &ipiv[k], &work[1], &ldwork, &iinfo); } else { /* Use unblocked code to factorize columns k:n of A */ i__1 = *n - k + 1; _starpu_dsytf2_(uplo, &i__1, &a[k + k * a_dim1], lda, &ipiv[k], &iinfo); kb = *n - k + 1; } /* Set INFO on the first occurrence of a zero pivot */ if (*info == 0 && iinfo > 0) { *info = iinfo + k - 1; } /* Adjust IPIV */ i__1 = k + kb - 1; for (j = k; j <= i__1; ++j) { if (ipiv[j] > 0) { ipiv[j] = ipiv[j] + k - 1; } else { ipiv[j] = ipiv[j] - k + 1; } /* L30: */ } /* Increase K and return to the start of the main loop */ k += kb; goto L20; } L40: work[1] = (doublereal) lwkopt; return 0; /* End of DSYTRF */ } /* _starpu_dsytrf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsytri.c000066400000000000000000000256501413463044200206740ustar00rootroot00000000000000/* dsytri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b11 = -1.; static doublereal c_b13 = 0.; /* Subroutine */ int _starpu_dsytri_(char *uplo, integer *n, doublereal *a, integer * lda, integer *ipiv, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; doublereal d__1; /* Local variables */ doublereal d__; integer k; doublereal t, ak; integer kp; doublereal akp1; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal temp, akkp1; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer kstep; logical upper; extern /* Subroutine */ int _starpu_dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYTRI computes the inverse of a real symmetric indefinite matrix */ /* A using the factorization A = U*D*U**T or A = L*D*L**T computed by */ /* DSYTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the details of the factorization are stored */ /* as an upper or lower triangular matrix. */ /* = 'U': Upper triangular, form is A = U*D*U**T; */ /* = 'L': Lower triangular, form is A = L*D*L**T. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the block diagonal matrix D and the multipliers */ /* used to obtain the factor U or L as computed by DSYTRF. */ /* On exit, if INFO = 0, the (symmetric) inverse of the original */ /* matrix. If UPLO = 'U', the upper triangular part of the */ /* inverse is formed and the part of A below the diagonal is not */ /* referenced; if UPLO = 'L' the lower triangular part of the */ /* inverse is formed and the part of A above the diagonal is */ /* not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its */ /* inverse could not be computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; --work; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check that the diagonal matrix D is nonsingular. */ if (upper) { /* Upper triangular storage: examine D from bottom to top */ for (*info = *n; *info >= 1; --(*info)) { if (ipiv[*info] > 0 && a[*info + *info * a_dim1] == 0.) { return 0; } /* L10: */ } } else { /* Lower triangular storage: examine D from top to bottom. */ i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ipiv[*info] > 0 && a[*info + *info * a_dim1] == 0.) { return 0; } /* L20: */ } } *info = 0; if (upper) { /* Compute inv(A) from the factorization A = U*D*U'. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = 1; L30: /* If K > N, exit from loop. */ if (k > *n) { goto L40; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Invert the diagonal block. */ a[k + k * a_dim1] = 1. / a[k + k * a_dim1]; /* Compute column K of the inverse. */ if (k > 1) { i__1 = k - 1; _starpu_dcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &work[1], &c__1); i__1 = k - 1; _starpu_dsymv_(uplo, &i__1, &c_b11, &a[a_offset], lda, &work[1], & c__1, &c_b13, &a[k * a_dim1 + 1], &c__1); i__1 = k - 1; a[k + k * a_dim1] -= _starpu_ddot_(&i__1, &work[1], &c__1, &a[k * a_dim1 + 1], &c__1); } kstep = 1; } else { /* 2 x 2 diagonal block */ /* Invert the diagonal block. */ t = (d__1 = a[k + (k + 1) * a_dim1], abs(d__1)); ak = a[k + k * a_dim1] / t; akp1 = a[k + 1 + (k + 1) * a_dim1] / t; akkp1 = a[k + (k + 1) * a_dim1] / t; d__ = t * (ak * akp1 - 1.); a[k + k * a_dim1] = akp1 / d__; a[k + 1 + (k + 1) * a_dim1] = ak / d__; a[k + (k + 1) * a_dim1] = -akkp1 / d__; /* Compute columns K and K+1 of the inverse. */ if (k > 1) { i__1 = k - 1; _starpu_dcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &work[1], &c__1); i__1 = k - 1; _starpu_dsymv_(uplo, &i__1, &c_b11, &a[a_offset], lda, &work[1], & c__1, &c_b13, &a[k * a_dim1 + 1], &c__1); i__1 = k - 1; a[k + k * a_dim1] -= _starpu_ddot_(&i__1, &work[1], &c__1, &a[k * a_dim1 + 1], &c__1); i__1 = k - 1; a[k + (k + 1) * a_dim1] -= _starpu_ddot_(&i__1, &a[k * a_dim1 + 1], & c__1, &a[(k + 1) * a_dim1 + 1], &c__1); i__1 = k - 1; _starpu_dcopy_(&i__1, &a[(k + 1) * a_dim1 + 1], &c__1, &work[1], & c__1); i__1 = k - 1; _starpu_dsymv_(uplo, &i__1, &c_b11, &a[a_offset], lda, &work[1], & c__1, &c_b13, &a[(k + 1) * a_dim1 + 1], &c__1); i__1 = k - 1; a[k + 1 + (k + 1) * a_dim1] -= _starpu_ddot_(&i__1, &work[1], &c__1, & a[(k + 1) * a_dim1 + 1], &c__1); } kstep = 2; } kp = (i__1 = ipiv[k], abs(i__1)); if (kp != k) { /* Interchange rows and columns K and KP in the leading */ /* submatrix A(1:k+1,1:k+1) */ i__1 = kp - 1; _starpu_dswap_(&i__1, &a[k * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], & c__1); i__1 = k - kp - 1; _starpu_dswap_(&i__1, &a[kp + 1 + k * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); temp = a[k + k * a_dim1]; a[k + k * a_dim1] = a[kp + kp * a_dim1]; a[kp + kp * a_dim1] = temp; if (kstep == 2) { temp = a[k + (k + 1) * a_dim1]; a[k + (k + 1) * a_dim1] = a[kp + (k + 1) * a_dim1]; a[kp + (k + 1) * a_dim1] = temp; } } k += kstep; goto L30; L40: ; } else { /* Compute inv(A) from the factorization A = L*D*L'. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = *n; L50: /* If K < 1, exit from loop. */ if (k < 1) { goto L60; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Invert the diagonal block. */ a[k + k * a_dim1] = 1. / a[k + k * a_dim1]; /* Compute column K of the inverse. */ if (k < *n) { i__1 = *n - k; _starpu_dcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &work[1], &c__1); i__1 = *n - k; _starpu_dsymv_(uplo, &i__1, &c_b11, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, &c_b13, &a[k + 1 + k * a_dim1], & c__1); i__1 = *n - k; a[k + k * a_dim1] -= _starpu_ddot_(&i__1, &work[1], &c__1, &a[k + 1 + k * a_dim1], &c__1); } kstep = 1; } else { /* 2 x 2 diagonal block */ /* Invert the diagonal block. */ t = (d__1 = a[k + (k - 1) * a_dim1], abs(d__1)); ak = a[k - 1 + (k - 1) * a_dim1] / t; akp1 = a[k + k * a_dim1] / t; akkp1 = a[k + (k - 1) * a_dim1] / t; d__ = t * (ak * akp1 - 1.); a[k - 1 + (k - 1) * a_dim1] = akp1 / d__; a[k + k * a_dim1] = ak / d__; a[k + (k - 1) * a_dim1] = -akkp1 / d__; /* Compute columns K-1 and K of the inverse. */ if (k < *n) { i__1 = *n - k; _starpu_dcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &work[1], &c__1); i__1 = *n - k; _starpu_dsymv_(uplo, &i__1, &c_b11, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, &c_b13, &a[k + 1 + k * a_dim1], & c__1); i__1 = *n - k; a[k + k * a_dim1] -= _starpu_ddot_(&i__1, &work[1], &c__1, &a[k + 1 + k * a_dim1], &c__1); i__1 = *n - k; a[k + (k - 1) * a_dim1] -= _starpu_ddot_(&i__1, &a[k + 1 + k * a_dim1] , &c__1, &a[k + 1 + (k - 1) * a_dim1], &c__1); i__1 = *n - k; _starpu_dcopy_(&i__1, &a[k + 1 + (k - 1) * a_dim1], &c__1, &work[1], & c__1); i__1 = *n - k; _starpu_dsymv_(uplo, &i__1, &c_b11, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, &c_b13, &a[k + 1 + (k - 1) * a_dim1] , &c__1); i__1 = *n - k; a[k - 1 + (k - 1) * a_dim1] -= _starpu_ddot_(&i__1, &work[1], &c__1, & a[k + 1 + (k - 1) * a_dim1], &c__1); } kstep = 2; } kp = (i__1 = ipiv[k], abs(i__1)); if (kp != k) { /* Interchange rows and columns K and KP in the trailing */ /* submatrix A(k-1:n,k-1:n) */ if (kp < *n) { i__1 = *n - kp; _starpu_dswap_(&i__1, &a[kp + 1 + k * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); } i__1 = kp - k - 1; _starpu_dswap_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &a[kp + (k + 1) * a_dim1], lda); temp = a[k + k * a_dim1]; a[k + k * a_dim1] = a[kp + kp * a_dim1]; a[kp + kp * a_dim1] = temp; if (kstep == 2) { temp = a[k + (k - 1) * a_dim1]; a[k + (k - 1) * a_dim1] = a[kp + (k - 1) * a_dim1]; a[kp + (k - 1) * a_dim1] = temp; } } k -= kstep; goto L50; L60: ; } return 0; /* End of DSYTRI */ } /* _starpu_dsytri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dsytrs.c000066400000000000000000000274651413463044200207140ustar00rootroot00000000000000/* dsytrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b7 = -1.; static integer c__1 = 1; static doublereal c_b19 = 1.; /* Subroutine */ int _starpu_dsytrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; doublereal d__1; /* Local variables */ integer j, k; doublereal ak, bk; integer kp; doublereal akm1, bkm1; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal akm1k; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); doublereal denom; extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dswap_(integer *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DSYTRS solves a system of linear equations A*X = B with a real */ /* symmetric matrix A using the factorization A = U*D*U**T or */ /* A = L*D*L**T computed by DSYTRF. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the details of the factorization are stored */ /* as an upper or lower triangular matrix. */ /* = 'U': Upper triangular, form is A = U*D*U**T; */ /* = 'L': Lower triangular, form is A = L*D*L**T. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The block diagonal matrix D and the multipliers used to */ /* obtain the factor U or L as computed by DSYTRF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* IPIV (input) INTEGER array, dimension (N) */ /* Details of the interchanges and the block structure of D */ /* as determined by DSYTRF. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DSYTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { return 0; } if (upper) { /* Solve A*X = B, where A = U*D*U'. */ /* First solve U*D*X = B, overwriting B with X. */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = *n; L10: /* If K < 1, exit from loop. */ if (k < 1) { goto L30; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(U(K)), where U(K) is the transformation */ /* stored in column K of A. */ i__1 = k - 1; _starpu_dger_(&i__1, nrhs, &c_b7, &a[k * a_dim1 + 1], &c__1, &b[k + b_dim1], ldb, &b[b_dim1 + 1], ldb); /* Multiply by the inverse of the diagonal block. */ d__1 = 1. / a[k + k * a_dim1]; _starpu_dscal_(nrhs, &d__1, &b[k + b_dim1], ldb); --k; } else { /* 2 x 2 diagonal block */ /* Interchange rows K-1 and -IPIV(K). */ kp = -ipiv[k]; if (kp != k - 1) { _starpu_dswap_(nrhs, &b[k - 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(U(K)), where U(K) is the transformation */ /* stored in columns K-1 and K of A. */ i__1 = k - 2; _starpu_dger_(&i__1, nrhs, &c_b7, &a[k * a_dim1 + 1], &c__1, &b[k + b_dim1], ldb, &b[b_dim1 + 1], ldb); i__1 = k - 2; _starpu_dger_(&i__1, nrhs, &c_b7, &a[(k - 1) * a_dim1 + 1], &c__1, &b[k - 1 + b_dim1], ldb, &b[b_dim1 + 1], ldb); /* Multiply by the inverse of the diagonal block. */ akm1k = a[k - 1 + k * a_dim1]; akm1 = a[k - 1 + (k - 1) * a_dim1] / akm1k; ak = a[k + k * a_dim1] / akm1k; denom = akm1 * ak - 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { bkm1 = b[k - 1 + j * b_dim1] / akm1k; bk = b[k + j * b_dim1] / akm1k; b[k - 1 + j * b_dim1] = (ak * bkm1 - bk) / denom; b[k + j * b_dim1] = (akm1 * bk - bkm1) / denom; /* L20: */ } k += -2; } goto L10; L30: /* Next solve U'*X = B, overwriting B with X. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = 1; L40: /* If K > N, exit from loop. */ if (k > *n) { goto L50; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Multiply by inv(U'(K)), where U(K) is the transformation */ /* stored in column K of A. */ i__1 = k - 1; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &a[k * a_dim1 + 1], &c__1, &c_b19, &b[k + b_dim1], ldb); /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } ++k; } else { /* 2 x 2 diagonal block */ /* Multiply by inv(U'(K+1)), where U(K+1) is the transformation */ /* stored in columns K and K+1 of A. */ i__1 = k - 1; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &a[k * a_dim1 + 1], &c__1, &c_b19, &b[k + b_dim1], ldb); i__1 = k - 1; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &a[(k + 1) * a_dim1 + 1], &c__1, &c_b19, &b[k + 1 + b_dim1], ldb); /* Interchange rows K and -IPIV(K). */ kp = -ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } k += 2; } goto L40; L50: ; } else { /* Solve A*X = B, where A = L*D*L'. */ /* First solve L*D*X = B, overwriting B with X. */ /* K is the main loop index, increasing from 1 to N in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = 1; L60: /* If K > N, exit from loop. */ if (k > *n) { goto L80; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(L(K)), where L(K) is the transformation */ /* stored in column K of A. */ if (k < *n) { i__1 = *n - k; _starpu_dger_(&i__1, nrhs, &c_b7, &a[k + 1 + k * a_dim1], &c__1, &b[k + b_dim1], ldb, &b[k + 1 + b_dim1], ldb); } /* Multiply by the inverse of the diagonal block. */ d__1 = 1. / a[k + k * a_dim1]; _starpu_dscal_(nrhs, &d__1, &b[k + b_dim1], ldb); ++k; } else { /* 2 x 2 diagonal block */ /* Interchange rows K+1 and -IPIV(K). */ kp = -ipiv[k]; if (kp != k + 1) { _starpu_dswap_(nrhs, &b[k + 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); } /* Multiply by inv(L(K)), where L(K) is the transformation */ /* stored in columns K and K+1 of A. */ if (k < *n - 1) { i__1 = *n - k - 1; _starpu_dger_(&i__1, nrhs, &c_b7, &a[k + 2 + k * a_dim1], &c__1, &b[k + b_dim1], ldb, &b[k + 2 + b_dim1], ldb); i__1 = *n - k - 1; _starpu_dger_(&i__1, nrhs, &c_b7, &a[k + 2 + (k + 1) * a_dim1], &c__1, &b[k + 1 + b_dim1], ldb, &b[k + 2 + b_dim1], ldb); } /* Multiply by the inverse of the diagonal block. */ akm1k = a[k + 1 + k * a_dim1]; akm1 = a[k + k * a_dim1] / akm1k; ak = a[k + 1 + (k + 1) * a_dim1] / akm1k; denom = akm1 * ak - 1.; i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { bkm1 = b[k + j * b_dim1] / akm1k; bk = b[k + 1 + j * b_dim1] / akm1k; b[k + j * b_dim1] = (ak * bkm1 - bk) / denom; b[k + 1 + j * b_dim1] = (akm1 * bk - bkm1) / denom; /* L70: */ } k += 2; } goto L60; L80: /* Next solve L'*X = B, overwriting B with X. */ /* K is the main loop index, decreasing from N to 1 in steps of */ /* 1 or 2, depending on the size of the diagonal blocks. */ k = *n; L90: /* If K < 1, exit from loop. */ if (k < 1) { goto L100; } if (ipiv[k] > 0) { /* 1 x 1 diagonal block */ /* Multiply by inv(L'(K)), where L(K) is the transformation */ /* stored in column K of A. */ if (k < *n) { i__1 = *n - k; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, &a[k + 1 + k * a_dim1], &c__1, &c_b19, &b[k + b_dim1], ldb); } /* Interchange rows K and IPIV(K). */ kp = ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } --k; } else { /* 2 x 2 diagonal block */ /* Multiply by inv(L'(K-1)), where L(K-1) is the transformation */ /* stored in columns K-1 and K of A. */ if (k < *n) { i__1 = *n - k; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, &a[k + 1 + k * a_dim1], &c__1, &c_b19, &b[k + b_dim1], ldb); i__1 = *n - k; _starpu_dgemv_("Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, &a[k + 1 + (k - 1) * a_dim1], &c__1, &c_b19, &b[ k - 1 + b_dim1], ldb); } /* Interchange rows K and -IPIV(K). */ kp = -ipiv[k]; if (kp != k) { _starpu_dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); } k += -2; } goto L90; L100: ; } return 0; /* End of DSYTRS */ } /* _starpu_dsytrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtbcon.c000066400000000000000000000161171413463044200206250ustar00rootroot00000000000000/* dtbcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtbcon_(char *norm, char *uplo, char *diag, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *rcond, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, i__1; doublereal d__1; /* Local variables */ integer ix, kase, kase1; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); doublereal anorm; logical upper; doublereal xnorm; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern doublereal _starpu_dlantb_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlatbs_(char *, char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal ainvnm; logical onenrm; char normin[1]; doublereal smlnum; logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTBCON estimates the reciprocal of the condition number of a */ /* triangular band matrix A, in either the 1-norm or the infinity-norm. */ /* The norm of A is computed and an estimate is obtained for */ /* norm(inv(A)), then the reciprocal of the condition number is */ /* computed as */ /* RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies whether the 1-norm condition number or the */ /* infinity-norm condition number is required: */ /* = '1' or 'O': 1-norm; */ /* = 'I': Infinity-norm. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals or subdiagonals of the */ /* triangular band matrix A. KD >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangular band matrix A, stored in the */ /* first kd+1 rows of the array. The j-th column of A is stored */ /* in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* If DIAG = 'U', the diagonal elements of A are not referenced */ /* and are assumed to be 1. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(norm(A) * norm(inv(A))). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); onenrm = *(unsigned char *)norm == '1' || _starpu_lsame_(norm, "O"); nounit = _starpu_lsame_(diag, "N"); if (! onenrm && ! _starpu_lsame_(norm, "I")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*kd < 0) { *info = -5; } else if (*ldab < *kd + 1) { *info = -7; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTBCON", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *rcond = 1.; return 0; } *rcond = 0.; smlnum = _starpu_dlamch_("Safe minimum") * (doublereal) max(1,*n); /* Compute the norm of the triangular matrix A. */ anorm = _starpu_dlantb_(norm, uplo, diag, n, kd, &ab[ab_offset], ldab, &work[1]); /* Continue only if ANORM > 0. */ if (anorm > 0.) { /* Estimate the norm of the inverse of A. */ ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { kase1 = 1; } else { kase1 = 2; } kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { /* Multiply by inv(A). */ _starpu_dlatbs_(uplo, "No transpose", diag, normin, n, kd, &ab[ ab_offset], ldab, &work[1], &scale, &work[(*n << 1) + 1], info) ; } else { /* Multiply by inv(A'). */ _starpu_dlatbs_(uplo, "Transpose", diag, normin, n, kd, &ab[ab_offset] , ldab, &work[1], &scale, &work[(*n << 1) + 1], info); } *(unsigned char *)normin = 'Y'; /* Multiply by 1/SCALE if doing so will not cause overflow. */ if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); xnorm = (d__1 = work[ix], abs(d__1)); if (scale < xnorm * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / anorm / ainvnm; } } L20: return 0; /* End of DTBCON */ } /* _starpu_dtbcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtbrfs.c000066400000000000000000000351131413463044200206350ustar00rootroot00000000000000/* dtbrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b19 = -1.; /* Subroutine */ int _starpu_dtbrfs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s, xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dtbmv_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer * , doublereal *, integer *), _starpu_dtbsv_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal * , doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; char transt[1]; logical nounit; doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTBRFS provides error bounds and backward error estimates for the */ /* solution to a system of linear equations with a triangular band */ /* coefficient matrix. */ /* The solution matrix X must be computed by DTBTRS or some other */ /* means before entering this routine. DTBRFS does not do iterative */ /* refinement because doing so cannot improve the backward error. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals or subdiagonals of the */ /* triangular band matrix A. KD >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangular band matrix A, stored in the */ /* first kd+1 rows of the array. The j-th column of A is stored */ /* in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* If DIAG = 'U', the diagonal elements of A are not referenced */ /* and are assumed to be 1. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* The solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); notran = _starpu_lsame_(trans, "N"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*kd < 0) { *info = -5; } else if (*nrhs < 0) { *info = -6; } else if (*ldab < *kd + 1) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -10; } else if (*ldx < max(1,*n)) { *info = -12; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTBRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *kd + 2; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Compute residual R = B - op(A) * X, */ /* where op(A) = A or A', depending on TRANS. */ _starpu_dcopy_(n, &x[j * x_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dtbmv_(uplo, trans, diag, n, kd, &ab[ab_offset], ldab, &work[*n + 1], &c__1); _starpu_daxpy_(n, &c_b19, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L20: */ } if (notran) { /* Compute abs(A)*abs(X) + abs(B). */ if (upper) { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MAX */ i__3 = 1, i__4 = k - *kd; i__5 = k; for (i__ = max(i__3,i__4); i__ <= i__5; ++i__) { work[i__] += (d__1 = ab[*kd + 1 + i__ - k + k * ab_dim1], abs(d__1)) * xk; /* L30: */ } /* L40: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MAX */ i__5 = 1, i__3 = k - *kd; i__4 = k - 1; for (i__ = max(i__5,i__3); i__ <= i__4; ++i__) { work[i__] += (d__1 = ab[*kd + 1 + i__ - k + k * ab_dim1], abs(d__1)) * xk; /* L50: */ } work[k] += xk; /* L60: */ } } } else { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MIN */ i__5 = *n, i__3 = k + *kd; i__4 = min(i__5,i__3); for (i__ = k; i__ <= i__4; ++i__) { work[i__] += (d__1 = ab[i__ + 1 - k + k * ab_dim1] , abs(d__1)) * xk; /* L70: */ } /* L80: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MIN */ i__5 = *n, i__3 = k + *kd; i__4 = min(i__5,i__3); for (i__ = k + 1; i__ <= i__4; ++i__) { work[i__] += (d__1 = ab[i__ + 1 - k + k * ab_dim1] , abs(d__1)) * xk; /* L90: */ } work[k] += xk; /* L100: */ } } } } else { /* Compute abs(A')*abs(X) + abs(B). */ if (upper) { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; /* Computing MAX */ i__4 = 1, i__5 = k - *kd; i__3 = k; for (i__ = max(i__4,i__5); i__ <= i__3; ++i__) { s += (d__1 = ab[*kd + 1 + i__ - k + k * ab_dim1], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L110: */ } work[k] += s; /* L120: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MAX */ i__3 = 1, i__4 = k - *kd; i__5 = k - 1; for (i__ = max(i__3,i__4); i__ <= i__5; ++i__) { s += (d__1 = ab[*kd + 1 + i__ - k + k * ab_dim1], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L130: */ } work[k] += s; /* L140: */ } } } else { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; /* Computing MIN */ i__3 = *n, i__4 = k + *kd; i__5 = min(i__3,i__4); for (i__ = k; i__ <= i__5; ++i__) { s += (d__1 = ab[i__ + 1 - k + k * ab_dim1], abs( d__1)) * (d__2 = x[i__ + j * x_dim1], abs( d__2)); /* L150: */ } work[k] += s; /* L160: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = (d__1 = x[k + j * x_dim1], abs(d__1)); /* Computing MIN */ i__3 = *n, i__4 = k + *kd; i__5 = min(i__3,i__4); for (i__ = k + 1; i__ <= i__5; ++i__) { s += (d__1 = ab[i__ + 1 - k + k * ab_dim1], abs( d__1)) * (d__2 = x[i__ + j * x_dim1], abs( d__2)); /* L170: */ } work[k] += s; /* L180: */ } } } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L190: */ } berr[j] = s; /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(op(A)))* */ /* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(op(A)) is the inverse of op(A) */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(op(A))*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(op(A)) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L200: */ } kase = 0; L210: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(op(A)'). */ _starpu_dtbsv_(uplo, transt, diag, n, kd, &ab[ab_offset], ldab, &work[ *n + 1], &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L220: */ } } else { /* Multiply by inv(op(A))*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L230: */ } _starpu_dtbsv_(uplo, trans, diag, n, kd, &ab[ab_offset], ldab, &work[* n + 1], &c__1); } goto L210; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L240: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L250: */ } return 0; /* End of DTBRFS */ } /* _starpu_dtbrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtbtrs.c000066400000000000000000000134221413463044200206520ustar00rootroot00000000000000/* dtbtrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtbtrs_(char *uplo, char *trans, char *diag, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer ab_dim1, ab_offset, b_dim1, b_offset, i__1; /* Local variables */ integer j; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtbsv_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTBTRS solves a triangular system of the form */ /* A * X = B or A**T * X = B, */ /* where A is a triangular band matrix of order N, and B is an */ /* N-by NRHS matrix. A check is made to verify that A is nonsingular. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* KD (input) INTEGER */ /* The number of superdiagonals or subdiagonals of the */ /* triangular band matrix A. KD >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) */ /* The upper or lower triangular band matrix A, stored in the */ /* first kd+1 rows of AB. The j-th column of A is stored */ /* in the j-th column of the array AB as follows: */ /* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; */ /* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). */ /* If DIAG = 'U', the diagonal elements of A are not referenced */ /* and are assumed to be 1. */ /* LDAB (input) INTEGER */ /* The leading dimension of the array AB. LDAB >= KD+1. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, if INFO = 0, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of A is zero, */ /* indicating that the matrix is singular and the */ /* solutions X have not been computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ ab_dim1 = *ldab; ab_offset = 1 + ab_dim1; ab -= ab_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; nounit = _starpu_lsame_(diag, "N"); upper = _starpu_lsame_(uplo, "U"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*kd < 0) { *info = -5; } else if (*nrhs < 0) { *info = -6; } else if (*ldab < *kd + 1) { *info = -8; } else if (*ldb < max(1,*n)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTBTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check for singularity. */ if (nounit) { if (upper) { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ab[*kd + 1 + *info * ab_dim1] == 0.) { return 0; } /* L10: */ } } else { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ab[*info * ab_dim1 + 1] == 0.) { return 0; } /* L20: */ } } } *info = 0; /* Solve A * X = B or A' * X = B. */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { _starpu_dtbsv_(uplo, trans, diag, n, kd, &ab[ab_offset], ldab, &b[j * b_dim1 + 1], &c__1); /* L30: */ } return 0; /* End of DTBTRS */ } /* _starpu_dtbtrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtfsm.c000066400000000000000000000702411413463044200204670ustar00rootroot00000000000000/* dtfsm.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b23 = -1.; static doublereal c_b27 = 1.; /* Subroutine */ int _starpu_dtfsm_(char *transr, char *side, char *uplo, char *trans, char *diag, integer *m, integer *n, doublereal *alpha, doublereal *a, doublereal *b, integer *ldb) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; /* Local variables */ integer i__, j, k, m1, m2, n1, n2, info; logical normaltransr; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical lside; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_( char *, integer *); logical misodd, nisodd, notrans; /* -- LAPACK routine (version 3.2.1) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* Level 3 BLAS like routine for A in RFP Format. */ /* DTFSM solves the matrix equation */ /* op( A )*X = alpha*B or X*op( A ) = alpha*B */ /* where alpha is a scalar, X and B are m by n matrices, A is a unit, or */ /* non-unit, upper or lower triangular matrix and op( A ) is one of */ /* op( A ) = A or op( A ) = A'. */ /* A is in Rectangular Full Packed (RFP) Format. */ /* The matrix X is overwritten on B. */ /* Arguments */ /* ========== */ /* TRANSR - (input) CHARACTER */ /* = 'N': The Normal Form of RFP A is stored; */ /* = 'T': The Transpose Form of RFP A is stored. */ /* SIDE - (input) CHARACTER */ /* On entry, SIDE specifies whether op( A ) appears on the left */ /* or right of X as follows: */ /* SIDE = 'L' or 'l' op( A )*X = alpha*B. */ /* SIDE = 'R' or 'r' X*op( A ) = alpha*B. */ /* Unchanged on exit. */ /* UPLO - (input) CHARACTER */ /* On entry, UPLO specifies whether the RFP matrix A came from */ /* an upper or lower triangular matrix as follows: */ /* UPLO = 'U' or 'u' RFP A came from an upper triangular matrix */ /* UPLO = 'L' or 'l' RFP A came from a lower triangular matrix */ /* Unchanged on exit. */ /* TRANS - (input) CHARACTER */ /* On entry, TRANS specifies the form of op( A ) to be used */ /* in the matrix multiplication as follows: */ /* TRANS = 'N' or 'n' op( A ) = A. */ /* TRANS = 'T' or 't' op( A ) = A'. */ /* Unchanged on exit. */ /* DIAG - (input) CHARACTER */ /* On entry, DIAG specifies whether or not RFP A is unit */ /* triangular as follows: */ /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ /* DIAG = 'N' or 'n' A is not assumed to be unit */ /* triangular. */ /* Unchanged on exit. */ /* M - (input) INTEGER. */ /* On entry, M specifies the number of rows of B. M must be at */ /* least zero. */ /* Unchanged on exit. */ /* N - (input) INTEGER. */ /* On entry, N specifies the number of columns of B. N must be */ /* at least zero. */ /* Unchanged on exit. */ /* ALPHA - (input) DOUBLE PRECISION. */ /* On entry, ALPHA specifies the scalar alpha. When alpha is */ /* zero then A is not referenced and B need not be set before */ /* entry. */ /* Unchanged on exit. */ /* A - (input) DOUBLE PRECISION array, dimension (NT); */ /* NT = N*(N+1)/2. On entry, the matrix A in RFP Format. */ /* RFP Format is described by TRANSR, UPLO and N as follows: */ /* If TRANSR='N' then RFP A is (0:N,0:K-1) when N is even; */ /* K=N/2. RFP A is (0:N-1,0:K) when N is odd; K=N/2. If */ /* TRANSR = 'T' then RFP is the transpose of RFP A as */ /* defined when TRANSR = 'N'. The contents of RFP A are defined */ /* by UPLO as follows: If UPLO = 'U' the RFP A contains the NT */ /* elements of upper packed A either in normal or */ /* transpose Format. If UPLO = 'L' the RFP A contains */ /* the NT elements of lower packed A either in normal or */ /* transpose Format. The LDA of RFP A is (N+1)/2 when */ /* TRANSR = 'T'. When TRANSR is 'N' the LDA is N+1 when N is */ /* even and is N when is odd. */ /* See the Note below for more details. Unchanged on exit. */ /* B - (input/ouptut) DOUBLE PRECISION array, DIMENSION (LDB,N) */ /* Before entry, the leading m by n part of the array B must */ /* contain the right-hand side matrix B, and on exit is */ /* overwritten by the solution matrix X. */ /* LDB - (input) INTEGER. */ /* On entry, LDB specifies the first dimension of B as declared */ /* in the calling (sub) program. LDB must be at least */ /* max( 1, m ). */ /* Unchanged on exit. */ /* Further Details */ /* =============== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* Reference */ /* ========= */ /* ===================================================================== */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ b_dim1 = *ldb - 1 - 0 + 1; b_offset = 0 + b_dim1 * 0; b -= b_offset; /* Function Body */ info = 0; normaltransr = _starpu_lsame_(transr, "N"); lside = _starpu_lsame_(side, "L"); lower = _starpu_lsame_(uplo, "L"); notrans = _starpu_lsame_(trans, "N"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { info = -1; } else if (! lside && ! _starpu_lsame_(side, "R")) { info = -2; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { info = -3; } else if (! notrans && ! _starpu_lsame_(trans, "T")) { info = -4; } else if (! _starpu_lsame_(diag, "N") && ! _starpu_lsame_(diag, "U")) { info = -5; } else if (*m < 0) { info = -6; } else if (*n < 0) { info = -7; } else if (*ldb < max(1,*m)) { info = -11; } if (info != 0) { i__1 = -info; _starpu_xerbla_("DTFSM ", &i__1); return 0; } /* Quick return when ( (N.EQ.0).OR.(M.EQ.0) ) */ if (*m == 0 || *n == 0) { return 0; } /* Quick return when ALPHA.EQ.(0D+0) */ if (*alpha == 0.) { i__1 = *n - 1; for (j = 0; j <= i__1; ++j) { i__2 = *m - 1; for (i__ = 0; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; /* L10: */ } /* L20: */ } return 0; } if (lside) { /* SIDE = 'L' */ /* A is M-by-M. */ /* If M is odd, set NISODD = .TRUE., and M1 and M2. */ /* If M is even, NISODD = .FALSE., and M. */ if (*m % 2 == 0) { misodd = FALSE_; k = *m / 2; } else { misodd = TRUE_; if (lower) { m2 = *m / 2; m1 = *m - m2; } else { m1 = *m / 2; m2 = *m - m1; } } if (misodd) { /* SIDE = 'L' and N is odd */ if (normaltransr) { /* SIDE = 'L', N is odd, and TRANSR = 'N' */ if (lower) { /* SIDE ='L', N is odd, TRANSR = 'N', and UPLO = 'L' */ if (notrans) { /* SIDE ='L', N is odd, TRANSR = 'N', UPLO = 'L', and */ /* TRANS = 'N' */ if (*m == 1) { _starpu_dtrsm_("L", "L", "N", diag, &m1, n, alpha, a, m, & b[b_offset], ldb); } else { _starpu_dtrsm_("L", "L", "N", diag, &m1, n, alpha, a, m, & b[b_offset], ldb); _starpu_dgemm_("N", "N", &m2, n, &m1, &c_b23, &a[m1], m, & b[b_offset], ldb, alpha, &b[m1], ldb); _starpu_dtrsm_("L", "U", "T", diag, &m2, n, &c_b27, &a[*m] , m, &b[m1], ldb); } } else { /* SIDE ='L', N is odd, TRANSR = 'N', UPLO = 'L', and */ /* TRANS = 'T' */ if (*m == 1) { _starpu_dtrsm_("L", "L", "T", diag, &m1, n, alpha, a, m, & b[b_offset], ldb); } else { _starpu_dtrsm_("L", "U", "N", diag, &m2, n, alpha, &a[*m], m, &b[m1], ldb); _starpu_dgemm_("T", "N", &m1, n, &m2, &c_b23, &a[m1], m, & b[m1], ldb, alpha, &b[b_offset], ldb); _starpu_dtrsm_("L", "L", "T", diag, &m1, n, &c_b27, a, m, &b[b_offset], ldb); } } } else { /* SIDE ='L', N is odd, TRANSR = 'N', and UPLO = 'U' */ if (! notrans) { /* SIDE ='L', N is odd, TRANSR = 'N', UPLO = 'U', and */ /* TRANS = 'N' */ _starpu_dtrsm_("L", "L", "N", diag, &m1, n, alpha, &a[m2], m, &b[b_offset], ldb); _starpu_dgemm_("T", "N", &m2, n, &m1, &c_b23, a, m, &b[ b_offset], ldb, alpha, &b[m1], ldb); _starpu_dtrsm_("L", "U", "T", diag, &m2, n, &c_b27, &a[m1], m, &b[m1], ldb); } else { /* SIDE ='L', N is odd, TRANSR = 'N', UPLO = 'U', and */ /* TRANS = 'T' */ _starpu_dtrsm_("L", "U", "N", diag, &m2, n, alpha, &a[m1], m, &b[m1], ldb); _starpu_dgemm_("N", "N", &m1, n, &m2, &c_b23, a, m, &b[m1], ldb, alpha, &b[b_offset], ldb); _starpu_dtrsm_("L", "L", "T", diag, &m1, n, &c_b27, &a[m2], m, &b[b_offset], ldb); } } } else { /* SIDE = 'L', N is odd, and TRANSR = 'T' */ if (lower) { /* SIDE ='L', N is odd, TRANSR = 'T', and UPLO = 'L' */ if (notrans) { /* SIDE ='L', N is odd, TRANSR = 'T', UPLO = 'L', and */ /* TRANS = 'N' */ if (*m == 1) { _starpu_dtrsm_("L", "U", "T", diag, &m1, n, alpha, a, &m1, &b[b_offset], ldb); } else { _starpu_dtrsm_("L", "U", "T", diag, &m1, n, alpha, a, &m1, &b[b_offset], ldb); _starpu_dgemm_("T", "N", &m2, n, &m1, &c_b23, &a[m1 * m1], &m1, &b[b_offset], ldb, alpha, &b[m1], ldb); _starpu_dtrsm_("L", "L", "N", diag, &m2, n, &c_b27, &a[1], &m1, &b[m1], ldb); } } else { /* SIDE ='L', N is odd, TRANSR = 'T', UPLO = 'L', and */ /* TRANS = 'T' */ if (*m == 1) { _starpu_dtrsm_("L", "U", "N", diag, &m1, n, alpha, a, &m1, &b[b_offset], ldb); } else { _starpu_dtrsm_("L", "L", "T", diag, &m2, n, alpha, &a[1], &m1, &b[m1], ldb); _starpu_dgemm_("N", "N", &m1, n, &m2, &c_b23, &a[m1 * m1], &m1, &b[m1], ldb, alpha, &b[b_offset], ldb); _starpu_dtrsm_("L", "U", "N", diag, &m1, n, &c_b27, a, & m1, &b[b_offset], ldb); } } } else { /* SIDE ='L', N is odd, TRANSR = 'T', and UPLO = 'U' */ if (! notrans) { /* SIDE ='L', N is odd, TRANSR = 'T', UPLO = 'U', and */ /* TRANS = 'N' */ _starpu_dtrsm_("L", "U", "T", diag, &m1, n, alpha, &a[m2 * m2] , &m2, &b[b_offset], ldb); _starpu_dgemm_("N", "N", &m2, n, &m1, &c_b23, a, &m2, &b[ b_offset], ldb, alpha, &b[m1], ldb); _starpu_dtrsm_("L", "L", "N", diag, &m2, n, &c_b27, &a[m1 * m2], &m2, &b[m1], ldb); } else { /* SIDE ='L', N is odd, TRANSR = 'T', UPLO = 'U', and */ /* TRANS = 'T' */ _starpu_dtrsm_("L", "L", "T", diag, &m2, n, alpha, &a[m1 * m2] , &m2, &b[m1], ldb); _starpu_dgemm_("T", "N", &m1, n, &m2, &c_b23, a, &m2, &b[m1], ldb, alpha, &b[b_offset], ldb); _starpu_dtrsm_("L", "U", "N", diag, &m1, n, &c_b27, &a[m2 * m2], &m2, &b[b_offset], ldb); } } } } else { /* SIDE = 'L' and N is even */ if (normaltransr) { /* SIDE = 'L', N is even, and TRANSR = 'N' */ if (lower) { /* SIDE ='L', N is even, TRANSR = 'N', and UPLO = 'L' */ if (notrans) { /* SIDE ='L', N is even, TRANSR = 'N', UPLO = 'L', */ /* and TRANS = 'N' */ i__1 = *m + 1; _starpu_dtrsm_("L", "L", "N", diag, &k, n, alpha, &a[1], & i__1, &b[b_offset], ldb); i__1 = *m + 1; _starpu_dgemm_("N", "N", &k, n, &k, &c_b23, &a[k + 1], &i__1, &b[b_offset], ldb, alpha, &b[k], ldb); i__1 = *m + 1; _starpu_dtrsm_("L", "U", "T", diag, &k, n, &c_b27, a, &i__1, & b[k], ldb); } else { /* SIDE ='L', N is even, TRANSR = 'N', UPLO = 'L', */ /* and TRANS = 'T' */ i__1 = *m + 1; _starpu_dtrsm_("L", "U", "N", diag, &k, n, alpha, a, &i__1, & b[k], ldb); i__1 = *m + 1; _starpu_dgemm_("T", "N", &k, n, &k, &c_b23, &a[k + 1], &i__1, &b[k], ldb, alpha, &b[b_offset], ldb); i__1 = *m + 1; _starpu_dtrsm_("L", "L", "T", diag, &k, n, &c_b27, &a[1], & i__1, &b[b_offset], ldb); } } else { /* SIDE ='L', N is even, TRANSR = 'N', and UPLO = 'U' */ if (! notrans) { /* SIDE ='L', N is even, TRANSR = 'N', UPLO = 'U', */ /* and TRANS = 'N' */ i__1 = *m + 1; _starpu_dtrsm_("L", "L", "N", diag, &k, n, alpha, &a[k + 1], & i__1, &b[b_offset], ldb); i__1 = *m + 1; _starpu_dgemm_("T", "N", &k, n, &k, &c_b23, a, &i__1, &b[ b_offset], ldb, alpha, &b[k], ldb); i__1 = *m + 1; _starpu_dtrsm_("L", "U", "T", diag, &k, n, &c_b27, &a[k], & i__1, &b[k], ldb); } else { /* SIDE ='L', N is even, TRANSR = 'N', UPLO = 'U', */ /* and TRANS = 'T' */ i__1 = *m + 1; _starpu_dtrsm_("L", "U", "N", diag, &k, n, alpha, &a[k], & i__1, &b[k], ldb); i__1 = *m + 1; _starpu_dgemm_("N", "N", &k, n, &k, &c_b23, a, &i__1, &b[k], ldb, alpha, &b[b_offset], ldb); i__1 = *m + 1; _starpu_dtrsm_("L", "L", "T", diag, &k, n, &c_b27, &a[k + 1], &i__1, &b[b_offset], ldb); } } } else { /* SIDE = 'L', N is even, and TRANSR = 'T' */ if (lower) { /* SIDE ='L', N is even, TRANSR = 'T', and UPLO = 'L' */ if (notrans) { /* SIDE ='L', N is even, TRANSR = 'T', UPLO = 'L', */ /* and TRANS = 'N' */ _starpu_dtrsm_("L", "U", "T", diag, &k, n, alpha, &a[k], &k, & b[b_offset], ldb); _starpu_dgemm_("T", "N", &k, n, &k, &c_b23, &a[k * (k + 1)], & k, &b[b_offset], ldb, alpha, &b[k], ldb); _starpu_dtrsm_("L", "L", "N", diag, &k, n, &c_b27, a, &k, &b[ k], ldb); } else { /* SIDE ='L', N is even, TRANSR = 'T', UPLO = 'L', */ /* and TRANS = 'T' */ _starpu_dtrsm_("L", "L", "T", diag, &k, n, alpha, a, &k, &b[k] , ldb); _starpu_dgemm_("N", "N", &k, n, &k, &c_b23, &a[k * (k + 1)], & k, &b[k], ldb, alpha, &b[b_offset], ldb); _starpu_dtrsm_("L", "U", "N", diag, &k, n, &c_b27, &a[k], &k, &b[b_offset], ldb); } } else { /* SIDE ='L', N is even, TRANSR = 'T', and UPLO = 'U' */ if (! notrans) { /* SIDE ='L', N is even, TRANSR = 'T', UPLO = 'U', */ /* and TRANS = 'N' */ _starpu_dtrsm_("L", "U", "T", diag, &k, n, alpha, &a[k * (k + 1)], &k, &b[b_offset], ldb); _starpu_dgemm_("N", "N", &k, n, &k, &c_b23, a, &k, &b[ b_offset], ldb, alpha, &b[k], ldb); _starpu_dtrsm_("L", "L", "N", diag, &k, n, &c_b27, &a[k * k], &k, &b[k], ldb); } else { /* SIDE ='L', N is even, TRANSR = 'T', UPLO = 'U', */ /* and TRANS = 'T' */ _starpu_dtrsm_("L", "L", "T", diag, &k, n, alpha, &a[k * k], & k, &b[k], ldb); _starpu_dgemm_("T", "N", &k, n, &k, &c_b23, a, &k, &b[k], ldb, alpha, &b[b_offset], ldb); _starpu_dtrsm_("L", "U", "N", diag, &k, n, &c_b27, &a[k * (k + 1)], &k, &b[b_offset], ldb); } } } } } else { /* SIDE = 'R' */ /* A is N-by-N. */ /* If N is odd, set NISODD = .TRUE., and N1 and N2. */ /* If N is even, NISODD = .FALSE., and K. */ if (*n % 2 == 0) { nisodd = FALSE_; k = *n / 2; } else { nisodd = TRUE_; if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } } if (nisodd) { /* SIDE = 'R' and N is odd */ if (normaltransr) { /* SIDE = 'R', N is odd, and TRANSR = 'N' */ if (lower) { /* SIDE ='R', N is odd, TRANSR = 'N', and UPLO = 'L' */ if (notrans) { /* SIDE ='R', N is odd, TRANSR = 'N', UPLO = 'L', and */ /* TRANS = 'N' */ _starpu_dtrsm_("R", "U", "T", diag, m, &n2, alpha, &a[*n], n, &b[n1 * b_dim1], ldb); _starpu_dgemm_("N", "N", m, &n1, &n2, &c_b23, &b[n1 * b_dim1], ldb, &a[n1], n, alpha, b, ldb); _starpu_dtrsm_("R", "L", "N", diag, m, &n1, &c_b27, a, n, b, ldb); } else { /* SIDE ='R', N is odd, TRANSR = 'N', UPLO = 'L', and */ /* TRANS = 'T' */ _starpu_dtrsm_("R", "L", "T", diag, m, &n1, alpha, a, n, b, ldb); _starpu_dgemm_("N", "T", m, &n2, &n1, &c_b23, b, ldb, &a[n1], n, alpha, &b[n1 * b_dim1], ldb); _starpu_dtrsm_("R", "U", "N", diag, m, &n2, &c_b27, &a[*n], n, &b[n1 * b_dim1], ldb); } } else { /* SIDE ='R', N is odd, TRANSR = 'N', and UPLO = 'U' */ if (notrans) { /* SIDE ='R', N is odd, TRANSR = 'N', UPLO = 'U', and */ /* TRANS = 'N' */ _starpu_dtrsm_("R", "L", "T", diag, m, &n1, alpha, &a[n2], n, b, ldb); _starpu_dgemm_("N", "N", m, &n2, &n1, &c_b23, b, ldb, a, n, alpha, &b[n1 * b_dim1], ldb); _starpu_dtrsm_("R", "U", "N", diag, m, &n2, &c_b27, &a[n1], n, &b[n1 * b_dim1], ldb); } else { /* SIDE ='R', N is odd, TRANSR = 'N', UPLO = 'U', and */ /* TRANS = 'T' */ _starpu_dtrsm_("R", "U", "T", diag, m, &n2, alpha, &a[n1], n, &b[n1 * b_dim1], ldb); _starpu_dgemm_("N", "T", m, &n1, &n2, &c_b23, &b[n1 * b_dim1], ldb, a, n, alpha, b, ldb); _starpu_dtrsm_("R", "L", "N", diag, m, &n1, &c_b27, &a[n2], n, b, ldb); } } } else { /* SIDE = 'R', N is odd, and TRANSR = 'T' */ if (lower) { /* SIDE ='R', N is odd, TRANSR = 'T', and UPLO = 'L' */ if (notrans) { /* SIDE ='R', N is odd, TRANSR = 'T', UPLO = 'L', and */ /* TRANS = 'N' */ _starpu_dtrsm_("R", "L", "N", diag, m, &n2, alpha, &a[1], &n1, &b[n1 * b_dim1], ldb); _starpu_dgemm_("N", "T", m, &n1, &n2, &c_b23, &b[n1 * b_dim1], ldb, &a[n1 * n1], &n1, alpha, b, ldb); _starpu_dtrsm_("R", "U", "T", diag, m, &n1, &c_b27, a, &n1, b, ldb); } else { /* SIDE ='R', N is odd, TRANSR = 'T', UPLO = 'L', and */ /* TRANS = 'T' */ _starpu_dtrsm_("R", "U", "N", diag, m, &n1, alpha, a, &n1, b, ldb); _starpu_dgemm_("N", "N", m, &n2, &n1, &c_b23, b, ldb, &a[n1 * n1], &n1, alpha, &b[n1 * b_dim1], ldb); _starpu_dtrsm_("R", "L", "T", diag, m, &n2, &c_b27, &a[1], & n1, &b[n1 * b_dim1], ldb); } } else { /* SIDE ='R', N is odd, TRANSR = 'T', and UPLO = 'U' */ if (notrans) { /* SIDE ='R', N is odd, TRANSR = 'T', UPLO = 'U', and */ /* TRANS = 'N' */ _starpu_dtrsm_("R", "U", "N", diag, m, &n1, alpha, &a[n2 * n2] , &n2, b, ldb); _starpu_dgemm_("N", "T", m, &n2, &n1, &c_b23, b, ldb, a, &n2, alpha, &b[n1 * b_dim1], ldb); _starpu_dtrsm_("R", "L", "T", diag, m, &n2, &c_b27, &a[n1 * n2], &n2, &b[n1 * b_dim1], ldb); } else { /* SIDE ='R', N is odd, TRANSR = 'T', UPLO = 'U', and */ /* TRANS = 'T' */ _starpu_dtrsm_("R", "L", "N", diag, m, &n2, alpha, &a[n1 * n2] , &n2, &b[n1 * b_dim1], ldb); _starpu_dgemm_("N", "N", m, &n1, &n2, &c_b23, &b[n1 * b_dim1], ldb, a, &n2, alpha, b, ldb); _starpu_dtrsm_("R", "U", "T", diag, m, &n1, &c_b27, &a[n2 * n2], &n2, b, ldb); } } } } else { /* SIDE = 'R' and N is even */ if (normaltransr) { /* SIDE = 'R', N is even, and TRANSR = 'N' */ if (lower) { /* SIDE ='R', N is even, TRANSR = 'N', and UPLO = 'L' */ if (notrans) { /* SIDE ='R', N is even, TRANSR = 'N', UPLO = 'L', */ /* and TRANS = 'N' */ i__1 = *n + 1; _starpu_dtrsm_("R", "U", "T", diag, m, &k, alpha, a, &i__1, & b[k * b_dim1], ldb); i__1 = *n + 1; _starpu_dgemm_("N", "N", m, &k, &k, &c_b23, &b[k * b_dim1], ldb, &a[k + 1], &i__1, alpha, b, ldb); i__1 = *n + 1; _starpu_dtrsm_("R", "L", "N", diag, m, &k, &c_b27, &a[1], & i__1, b, ldb); } else { /* SIDE ='R', N is even, TRANSR = 'N', UPLO = 'L', */ /* and TRANS = 'T' */ i__1 = *n + 1; _starpu_dtrsm_("R", "L", "T", diag, m, &k, alpha, &a[1], & i__1, b, ldb); i__1 = *n + 1; _starpu_dgemm_("N", "T", m, &k, &k, &c_b23, b, ldb, &a[k + 1], &i__1, alpha, &b[k * b_dim1], ldb); i__1 = *n + 1; _starpu_dtrsm_("R", "U", "N", diag, m, &k, &c_b27, a, &i__1, & b[k * b_dim1], ldb); } } else { /* SIDE ='R', N is even, TRANSR = 'N', and UPLO = 'U' */ if (notrans) { /* SIDE ='R', N is even, TRANSR = 'N', UPLO = 'U', */ /* and TRANS = 'N' */ i__1 = *n + 1; _starpu_dtrsm_("R", "L", "T", diag, m, &k, alpha, &a[k + 1], & i__1, b, ldb); i__1 = *n + 1; _starpu_dgemm_("N", "N", m, &k, &k, &c_b23, b, ldb, a, &i__1, alpha, &b[k * b_dim1], ldb); i__1 = *n + 1; _starpu_dtrsm_("R", "U", "N", diag, m, &k, &c_b27, &a[k], & i__1, &b[k * b_dim1], ldb); } else { /* SIDE ='R', N is even, TRANSR = 'N', UPLO = 'U', */ /* and TRANS = 'T' */ i__1 = *n + 1; _starpu_dtrsm_("R", "U", "T", diag, m, &k, alpha, &a[k], & i__1, &b[k * b_dim1], ldb); i__1 = *n + 1; _starpu_dgemm_("N", "T", m, &k, &k, &c_b23, &b[k * b_dim1], ldb, a, &i__1, alpha, b, ldb); i__1 = *n + 1; _starpu_dtrsm_("R", "L", "N", diag, m, &k, &c_b27, &a[k + 1], &i__1, b, ldb); } } } else { /* SIDE = 'R', N is even, and TRANSR = 'T' */ if (lower) { /* SIDE ='R', N is even, TRANSR = 'T', and UPLO = 'L' */ if (notrans) { /* SIDE ='R', N is even, TRANSR = 'T', UPLO = 'L', */ /* and TRANS = 'N' */ _starpu_dtrsm_("R", "L", "N", diag, m, &k, alpha, a, &k, &b[k * b_dim1], ldb); _starpu_dgemm_("N", "T", m, &k, &k, &c_b23, &b[k * b_dim1], ldb, &a[(k + 1) * k], &k, alpha, b, ldb); _starpu_dtrsm_("R", "U", "T", diag, m, &k, &c_b27, &a[k], &k, b, ldb); } else { /* SIDE ='R', N is even, TRANSR = 'T', UPLO = 'L', */ /* and TRANS = 'T' */ _starpu_dtrsm_("R", "U", "N", diag, m, &k, alpha, &a[k], &k, b, ldb); _starpu_dgemm_("N", "N", m, &k, &k, &c_b23, b, ldb, &a[(k + 1) * k], &k, alpha, &b[k * b_dim1], ldb); _starpu_dtrsm_("R", "L", "T", diag, m, &k, &c_b27, a, &k, &b[ k * b_dim1], ldb); } } else { /* SIDE ='R', N is even, TRANSR = 'T', and UPLO = 'U' */ if (notrans) { /* SIDE ='R', N is even, TRANSR = 'T', UPLO = 'U', */ /* and TRANS = 'N' */ _starpu_dtrsm_("R", "U", "N", diag, m, &k, alpha, &a[(k + 1) * k], &k, b, ldb); _starpu_dgemm_("N", "T", m, &k, &k, &c_b23, b, ldb, a, &k, alpha, &b[k * b_dim1], ldb); _starpu_dtrsm_("R", "L", "T", diag, m, &k, &c_b27, &a[k * k], &k, &b[k * b_dim1], ldb); } else { /* SIDE ='R', N is even, TRANSR = 'T', UPLO = 'U', */ /* and TRANS = 'T' */ _starpu_dtrsm_("R", "L", "N", diag, m, &k, alpha, &a[k * k], & k, &b[k * b_dim1], ldb); _starpu_dgemm_("N", "N", m, &k, &k, &c_b23, &b[k * b_dim1], ldb, a, &k, alpha, b, ldb); _starpu_dtrsm_("R", "U", "T", diag, m, &k, &c_b27, &a[(k + 1) * k], &k, b, ldb); } } } } } return 0; /* End of DTFSM */ } /* _starpu_dtfsm_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtftri.c000066400000000000000000000325431413463044200206510ustar00rootroot00000000000000/* dtftri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b13 = -1.; static doublereal c_b18 = 1.; /* Subroutine */ int _starpu_dtftri_(char *transr, char *uplo, char *diag, integer *n, doublereal *a, integer *info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer k, n1, n2; logical normaltransr; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nisodd; extern /* Subroutine */ int _starpu_dtrtri_(char *, char *, integer *, doublereal *, integer *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTFTRI computes the inverse of a triangular matrix A stored in RFP */ /* format. */ /* This is a Level 3 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': The Normal TRANSR of RFP A is stored; */ /* = 'T': The Transpose TRANSR of RFP A is stored. */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* DIAG (input) CHARACTER */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (0:nt-1); */ /* nt=N*(N+1)/2. On entry, the triangular factor of a Hermitian */ /* Positive Definite matrix A in RFP format. RFP format is */ /* described by TRANSR, UPLO, and N as follows: If TRANSR = 'N' */ /* then RFP A is (0:N,0:k-1) when N is even; k=N/2. RFP A is */ /* (0:N-1,0:k) when N is odd; k=N/2. IF TRANSR = 'T' then RFP is */ /* the transpose of RFP A as defined when */ /* TRANSR = 'N'. The contents of RFP A are defined by UPLO as */ /* follows: If UPLO = 'U' the RFP A contains the nt elements of */ /* upper packed A; If UPLO = 'L' the RFP A contains the nt */ /* elements of lower packed A. The LDA of RFP A is (N+1)/2 when */ /* TRANSR = 'T'. When TRANSR is 'N' the LDA is N+1 when N is */ /* even and N is odd. See the Note below for more details. */ /* On exit, the (triangular) inverse of the original matrix, in */ /* the same storage format. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ /* matrix is singular and its inverse can not be computed. */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (! _starpu_lsame_(diag, "N") && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTFTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* If N is odd, set NISODD = .TRUE. */ /* If N is even, set K = N/2 and NISODD = .FALSE. */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; } else { nisodd = TRUE_; } /* Set N1 and N2 depending on LOWER */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* start execution: there are eight cases */ if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL and N is odd ( a(0:n-1,0:n1-1) ) */ /* T1 -> a(0,0), T2 -> a(0,1), S -> a(n1,0) */ /* T1 -> a(0), T2 -> a(n), S -> a(n1) */ _starpu_dtrtri_("L", diag, &n1, a, n, info); if (*info > 0) { return 0; } _starpu_dtrmm_("R", "L", "N", diag, &n2, &n1, &c_b13, a, n, &a[n1], n); _starpu_dtrtri_("U", diag, &n2, &a[*n], n, info) ; if (*info > 0) { *info += n1; } if (*info > 0) { return 0; } _starpu_dtrmm_("L", "U", "T", diag, &n2, &n1, &c_b18, &a[*n], n, &a[ n1], n); } else { /* SRPA for UPPER, NORMAL and N is odd ( a(0:n-1,0:n2-1) */ /* T1 -> a(n1+1,0), T2 -> a(n1,0), S -> a(0,0) */ /* T1 -> a(n2), T2 -> a(n1), S -> a(0) */ _starpu_dtrtri_("L", diag, &n1, &a[n2], n, info) ; if (*info > 0) { return 0; } _starpu_dtrmm_("L", "L", "T", diag, &n1, &n2, &c_b13, &a[n2], n, a, n); _starpu_dtrtri_("U", diag, &n2, &a[n1], n, info) ; if (*info > 0) { *info += n1; } if (*info > 0) { return 0; } _starpu_dtrmm_("R", "U", "N", diag, &n1, &n2, &c_b18, &a[n1], n, a, n); } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE and N is odd */ /* T1 -> a(0), T2 -> a(1), S -> a(0+n1*n1) */ _starpu_dtrtri_("U", diag, &n1, a, &n1, info); if (*info > 0) { return 0; } _starpu_dtrmm_("L", "U", "N", diag, &n1, &n2, &c_b13, a, &n1, &a[n1 * n1], &n1); _starpu_dtrtri_("L", diag, &n2, &a[1], &n1, info); if (*info > 0) { *info += n1; } if (*info > 0) { return 0; } _starpu_dtrmm_("R", "L", "T", diag, &n1, &n2, &c_b18, &a[1], &n1, &a[ n1 * n1], &n1); } else { /* SRPA for UPPER, TRANSPOSE and N is odd */ /* T1 -> a(0+n2*n2), T2 -> a(0+n1*n2), S -> a(0) */ _starpu_dtrtri_("U", diag, &n1, &a[n2 * n2], &n2, info); if (*info > 0) { return 0; } _starpu_dtrmm_("R", "U", "T", diag, &n2, &n1, &c_b13, &a[n2 * n2], & n2, a, &n2); _starpu_dtrtri_("L", diag, &n2, &a[n1 * n2], &n2, info); if (*info > 0) { *info += n1; } if (*info > 0) { return 0; } _starpu_dtrmm_("L", "L", "N", diag, &n2, &n1, &c_b18, &a[n1 * n2], & n2, a, &n2); } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(1,0), T2 -> a(0,0), S -> a(k+1,0) */ /* T1 -> a(1), T2 -> a(0), S -> a(k+1) */ i__1 = *n + 1; _starpu_dtrtri_("L", diag, &k, &a[1], &i__1, info); if (*info > 0) { return 0; } i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrmm_("R", "L", "N", diag, &k, &k, &c_b13, &a[1], &i__1, &a[ k + 1], &i__2); i__1 = *n + 1; _starpu_dtrtri_("U", diag, &k, a, &i__1, info); if (*info > 0) { *info += k; } if (*info > 0) { return 0; } i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrmm_("L", "U", "T", diag, &k, &k, &c_b18, a, &i__1, &a[k + 1], &i__2) ; } else { /* SRPA for UPPER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(k+1,0) , T2 -> a(k,0), S -> a(0,0) */ /* T1 -> a(k+1), T2 -> a(k), S -> a(0) */ i__1 = *n + 1; _starpu_dtrtri_("L", diag, &k, &a[k + 1], &i__1, info); if (*info > 0) { return 0; } i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrmm_("L", "L", "T", diag, &k, &k, &c_b13, &a[k + 1], &i__1, a, &i__2); i__1 = *n + 1; _starpu_dtrtri_("U", diag, &k, &a[k], &i__1, info); if (*info > 0) { *info += k; } if (*info > 0) { return 0; } i__1 = *n + 1; i__2 = *n + 1; _starpu_dtrmm_("R", "U", "N", diag, &k, &k, &c_b18, &a[k], &i__1, a, & i__2); } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE and N is even (see paper) */ /* T1 -> B(0,1), T2 -> B(0,0), S -> B(0,k+1) */ /* T1 -> a(0+k), T2 -> a(0+0), S -> a(0+k*(k+1)); lda=k */ _starpu_dtrtri_("U", diag, &k, &a[k], &k, info); if (*info > 0) { return 0; } _starpu_dtrmm_("L", "U", "N", diag, &k, &k, &c_b13, &a[k], &k, &a[k * (k + 1)], &k); _starpu_dtrtri_("L", diag, &k, a, &k, info); if (*info > 0) { *info += k; } if (*info > 0) { return 0; } _starpu_dtrmm_("R", "L", "T", diag, &k, &k, &c_b18, a, &k, &a[k * (k + 1)], &k) ; } else { /* SRPA for UPPER, TRANSPOSE and N is even (see paper) */ /* T1 -> B(0,k+1), T2 -> B(0,k), S -> B(0,0) */ /* T1 -> a(0+k*(k+1)), T2 -> a(0+k*k), S -> a(0+0)); lda=k */ _starpu_dtrtri_("U", diag, &k, &a[k * (k + 1)], &k, info); if (*info > 0) { return 0; } _starpu_dtrmm_("R", "U", "T", diag, &k, &k, &c_b13, &a[k * (k + 1)], & k, a, &k); _starpu_dtrtri_("L", diag, &k, &a[k * k], &k, info); if (*info > 0) { *info += k; } if (*info > 0) { return 0; } _starpu_dtrmm_("L", "L", "N", diag, &k, &k, &c_b18, &a[k * k], &k, a, &k); } } } return 0; /* End of DTFTRI */ } /* _starpu_dtftri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtfttp.c000066400000000000000000000313541413463044200206610ustar00rootroot00000000000000/* dtfttp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtfttp_(char *transr, char *uplo, integer *n, doublereal *arf, doublereal *ap, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ integer i__, j, k, n1, n2, ij, jp, js, nt, lda, ijp; logical normaltransr; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nisodd; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTFTTP copies a triangular matrix A from rectangular full packed */ /* format (TF) to standard packed format (TP). */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': ARF is in Normal format; */ /* = 'T': ARF is in Transpose format; */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* ARF (input) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ), */ /* On entry, the upper or lower triangular matrix A stored in */ /* RFP format. For a further discussion see Notes below. */ /* AP (output) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ), */ /* On exit, the upper or lower triangular matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTFTTP", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (normaltransr) { ap[0] = arf[0]; } else { ap[0] = arf[0]; } return 0; } /* Size of array ARF(0:NT-1) */ nt = *n * (*n + 1) / 2; /* Set N1 and N2 depending on LOWER */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* If N is odd, set NISODD = .TRUE. */ /* If N is even, set K = N/2 and NISODD = .FALSE. */ /* set lda of ARF^C; ARF^C is (0:(N+1)/2-1,0:N-noe) */ /* where noe = 0 if n is even, noe = 1 if n is odd */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; lda = *n + 1; } else { nisodd = TRUE_; lda = *n; } /* ARF^C has lda rows and n+1-noe cols */ if (! normaltransr) { lda = (*n + 1) / 2; } /* start execution: there are eight cases */ if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL and N is odd ( a(0:n-1,0:n1-1) ) */ /* T1 -> a(0,0), T2 -> a(0,1), S -> a(n1,0) */ /* T1 -> a(0), T2 -> a(n), S -> a(n1); lda = n */ ijp = 0; jp = 0; i__1 = n2; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { ij = i__ + jp; ap[ijp] = arf[ij]; ++ijp; } jp += lda; } i__1 = n2 - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = n2; for (j = i__ + 1; j <= i__2; ++j) { ij = i__ + j * lda; ap[ijp] = arf[ij]; ++ijp; } } } else { /* SRPA for UPPER, NORMAL and N is odd ( a(0:n-1,0:n2-1) */ /* T1 -> a(n1+1,0), T2 -> a(n1,0), S -> a(0,0) */ /* T1 -> a(n2), T2 -> a(n1), S -> a(0) */ ijp = 0; i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { ij = n2 + j; i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { ap[ijp] = arf[ij]; ++ijp; ij += lda; } } js = 0; i__1 = *n - 1; for (j = n1; j <= i__1; ++j) { ij = js; i__2 = js + j; for (ij = js; ij <= i__2; ++ij) { ap[ijp] = arf[ij]; ++ijp; } js += lda; } } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE and N is odd */ /* T1 -> A(0,0) , T2 -> A(1,0) , S -> A(0,n1) */ /* T1 -> a(0+0) , T2 -> a(1+0) , S -> a(0+n1*n1); lda=n1 */ ijp = 0; i__1 = n2; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = *n * lda - 1; i__3 = lda; for (ij = i__ * (lda + 1); i__3 < 0 ? ij >= i__2 : ij <= i__2; ij += i__3) { ap[ijp] = arf[ij]; ++ijp; } } js = 1; i__1 = n2 - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + n2 - j - 1; for (ij = js; ij <= i__3; ++ij) { ap[ijp] = arf[ij]; ++ijp; } js = js + lda + 1; } } else { /* SRPA for UPPER, TRANSPOSE and N is odd */ /* T1 -> A(0,n1+1), T2 -> A(0,n1), S -> A(0,0) */ /* T1 -> a(n2*n2), T2 -> a(n1*n2), S -> a(0); lda = n2 */ ijp = 0; js = n2 * lda; i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + j; for (ij = js; ij <= i__3; ++ij) { ap[ijp] = arf[ij]; ++ijp; } js += lda; } i__1 = n1; for (i__ = 0; i__ <= i__1; ++i__) { i__3 = i__ + (n1 + i__) * lda; i__2 = lda; for (ij = i__; i__2 < 0 ? ij >= i__3 : ij <= i__3; ij += i__2) { ap[ijp] = arf[ij]; ++ijp; } } } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* SRPA for LOWER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(1,0), T2 -> a(0,0), S -> a(k+1,0) */ /* T1 -> a(1), T2 -> a(0), S -> a(k+1) */ ijp = 0; jp = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { ij = i__ + 1 + jp; ap[ijp] = arf[ij]; ++ijp; } jp += lda; } i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = k - 1; for (j = i__; j <= i__2; ++j) { ij = i__ + j * lda; ap[ijp] = arf[ij]; ++ijp; } } } else { /* SRPA for UPPER, NORMAL, and N is even ( a(0:n,0:k-1) ) */ /* T1 -> a(k+1,0) , T2 -> a(k,0), S -> a(0,0) */ /* T1 -> a(k+1), T2 -> a(k), S -> a(0) */ ijp = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { ij = k + 1 + j; i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { ap[ijp] = arf[ij]; ++ijp; ij += lda; } } js = 0; i__1 = *n - 1; for (j = k; j <= i__1; ++j) { ij = js; i__2 = js + j; for (ij = js; ij <= i__2; ++ij) { ap[ijp] = arf[ij]; ++ijp; } js += lda; } } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* SRPA for LOWER, TRANSPOSE and N is even (see paper) */ /* T1 -> B(0,1), T2 -> B(0,0), S -> B(0,k+1) */ /* T1 -> a(0+k), T2 -> a(0+0), S -> a(0+k*(k+1)); lda=k */ ijp = 0; i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = (*n + 1) * lda - 1; i__3 = lda; for (ij = i__ + (i__ + 1) * lda; i__3 < 0 ? ij >= i__2 : ij <= i__2; ij += i__3) { ap[ijp] = arf[ij]; ++ijp; } } js = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + k - j - 1; for (ij = js; ij <= i__3; ++ij) { ap[ijp] = arf[ij]; ++ijp; } js = js + lda + 1; } } else { /* SRPA for UPPER, TRANSPOSE and N is even (see paper) */ /* T1 -> B(0,k+1), T2 -> B(0,k), S -> B(0,0) */ /* T1 -> a(0+k*(k+1)), T2 -> a(0+k*k), S -> a(0+0)); lda=k */ ijp = 0; js = (k + 1) * lda; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + j; for (ij = js; ij <= i__3; ++ij) { ap[ijp] = arf[ij]; ++ijp; } js += lda; } i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__3 = i__ + (k + i__) * lda; i__2 = lda; for (ij = i__; i__2 < 0 ? ij >= i__3 : ij <= i__3; ij += i__2) { ap[ijp] = arf[ij]; ++ijp; } } } } } return 0; /* End of DTFTTP */ } /* _starpu_dtfttp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtfttr.c000066400000000000000000000300071413463044200206550ustar00rootroot00000000000000/* dtfttr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtfttr_(char *transr, char *uplo, integer *n, doublereal *arf, doublereal *a, integer *lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, k, l, n1, n2, ij, nt, nx2, np1x2; logical normaltransr; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nisodd; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTFTTR copies a triangular matrix A from rectangular full packed */ /* format (TF) to standard full format (TR). */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': ARF is in Normal format; */ /* = 'T': ARF is in Transpose format. */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* N (input) INTEGER */ /* The order of the matrices ARF and A. N >= 0. */ /* ARF (input) DOUBLE PRECISION array, dimension (N*(N+1)/2). */ /* On entry, the upper (if UPLO = 'U') or lower (if UPLO = 'L') */ /* matrix A in RFP format. See the "Notes" below for more */ /* details. */ /* A (output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On exit, the triangular matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of the array A contains */ /* the upper triangular matrix, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of the array A contains */ /* the lower triangular matrix, and the strictly upper */ /* triangular part of A is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* Reference */ /* ========= */ /* ===================================================================== */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda - 1 - 0 + 1; a_offset = 0 + a_dim1 * 0; a -= a_offset; /* Function Body */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTFTTR", &i__1); return 0; } /* Quick return if possible */ if (*n <= 1) { if (*n == 1) { a[0] = arf[0]; } return 0; } /* Size of array ARF(0:nt-1) */ nt = *n * (*n + 1) / 2; /* set N1 and N2 depending on LOWER: for N even N1=N2=K */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* If N is odd, set NISODD = .TRUE., LDA=N+1 and A is (N+1)--by--K2. */ /* If N is even, set K = N/2 and NISODD = .FALSE., LDA=N and A is */ /* N--by--(N+1)/2. */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; if (! lower) { np1x2 = *n + *n + 2; } } else { nisodd = TRUE_; if (! lower) { nx2 = *n + *n; } } if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* N is odd, TRANSR = 'N', and UPLO = 'L' */ ij = 0; i__1 = n2; for (j = 0; j <= i__1; ++j) { i__2 = n2 + j; for (i__ = n1; i__ <= i__2; ++i__) { a[n2 + j + i__ * a_dim1] = arf[ij]; ++ij; } i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } } } else { /* N is odd, TRANSR = 'N', and UPLO = 'U' */ ij = nt - *n; i__1 = n1; for (j = *n - 1; j >= i__1; --j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } i__2 = n1 - 1; for (l = j - n1; l <= i__2; ++l) { a[j - n1 + l * a_dim1] = arf[ij]; ++ij; } ij -= nx2; } } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* N is odd, TRANSR = 'T', and UPLO = 'L' */ ij = 0; i__1 = n2 - 1; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { a[j + i__ * a_dim1] = arf[ij]; ++ij; } i__2 = *n - 1; for (i__ = n1 + j; i__ <= i__2; ++i__) { a[i__ + (n1 + j) * a_dim1] = arf[ij]; ++ij; } } i__1 = *n - 1; for (j = n2; j <= i__1; ++j) { i__2 = n1 - 1; for (i__ = 0; i__ <= i__2; ++i__) { a[j + i__ * a_dim1] = arf[ij]; ++ij; } } } else { /* N is odd, TRANSR = 'T', and UPLO = 'U' */ ij = 0; i__1 = n1; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = n1; i__ <= i__2; ++i__) { a[j + i__ * a_dim1] = arf[ij]; ++ij; } } i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } i__2 = *n - 1; for (l = n2 + j; l <= i__2; ++l) { a[n2 + j + l * a_dim1] = arf[ij]; ++ij; } } } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* N is even, TRANSR = 'N', and UPLO = 'L' */ ij = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = k + j; for (i__ = k; i__ <= i__2; ++i__) { a[k + j + i__ * a_dim1] = arf[ij]; ++ij; } i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } } } else { /* N is even, TRANSR = 'N', and UPLO = 'U' */ ij = nt - *n - 1; i__1 = k; for (j = *n - 1; j >= i__1; --j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } i__2 = k - 1; for (l = j - k; l <= i__2; ++l) { a[j - k + l * a_dim1] = arf[ij]; ++ij; } ij -= np1x2; } } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* N is even, TRANSR = 'T', and UPLO = 'L' */ ij = 0; j = k; i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { a[j + i__ * a_dim1] = arf[ij]; ++ij; } i__2 = *n - 1; for (i__ = k + 1 + j; i__ <= i__2; ++i__) { a[i__ + (k + 1 + j) * a_dim1] = arf[ij]; ++ij; } } i__1 = *n - 1; for (j = k - 1; j <= i__1; ++j) { i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { a[j + i__ * a_dim1] = arf[ij]; ++ij; } } } else { /* N is even, TRANSR = 'T', and UPLO = 'U' */ ij = 0; i__1 = k; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = k; i__ <= i__2; ++i__) { a[j + i__ * a_dim1] = arf[ij]; ++ij; } } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } i__2 = *n - 1; for (l = k + 1 + j; l <= i__2; ++l) { a[k + 1 + j + l * a_dim1] = arf[ij]; ++ij; } } /* Note that here, on exit of the loop, J = K-1 */ i__1 = j; for (i__ = 0; i__ <= i__1; ++i__) { a[i__ + j * a_dim1] = arf[ij]; ++ij; } } } } return 0; /* End of DTFTTR */ } /* _starpu_dtfttr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgevc.c000066400000000000000000001160071413463044200206270ustar00rootroot00000000000000/* dtgevc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static logical c_true = TRUE_; static integer c__2 = 2; static doublereal c_b34 = 1.; static integer c__1 = 1; static doublereal c_b36 = 0.; static logical c_false = FALSE_; /* Subroutine */ int _starpu_dtgevc_(char *side, char *howmny, logical *select, integer *n, doublereal *s, integer *lds, doublereal *p, integer *ldp, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer *info) { /* System generated locals */ integer p_dim1, p_offset, s_dim1, s_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1, d__2, d__3, d__4, d__5, d__6; /* Local variables */ integer i__, j, ja, jc, je, na, im, jr, jw, nw; doublereal big; logical lsa, lsb; doublereal ulp, sum[4] /* was [2][2] */; integer ibeg, ieig, iend; doublereal dmin__, temp, xmax, sump[4] /* was [2][2] */, sums[4] /* was [2][2] */; extern /* Subroutine */ int _starpu_dlag2_(doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal cim2a, cim2b, cre2a, cre2b, temp2, bdiag[2], acoef, scale; logical ilall; integer iside; doublereal sbeta; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); logical il2by2; integer iinfo; doublereal small; logical compl; doublereal anorm, bnorm; logical compr; extern /* Subroutine */ int _starpu_dlaln2_(logical *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal * , doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal temp2i; extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *); doublereal temp2r; logical ilabad, ilbbad; doublereal acoefa, bcoefa, cimaga, cimagb; logical ilback; doublereal bcoefi, ascale, bscale, creala, crealb; extern doublereal _starpu_dlamch_(char *); doublereal bcoefr, salfar, safmin; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal xscale, bignum; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical ilcomp, ilcplx; integer ihwmny; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGEVC computes some or all of the right and/or left eigenvectors of */ /* a pair of real matrices (S,P), where S is a quasi-triangular matrix */ /* and P is upper triangular. Matrix pairs of this type are produced by */ /* the generalized Schur factorization of a matrix pair (A,B): */ /* A = Q*S*Z**T, B = Q*P*Z**T */ /* as computed by DGGHRD + DHGEQZ. */ /* The right eigenvector x and the left eigenvector y of (S,P) */ /* corresponding to an eigenvalue w are defined by: */ /* S*x = w*P*x, (y**H)*S = w*(y**H)*P, */ /* where y**H denotes the conjugate tranpose of y. */ /* The eigenvalues are not input to this routine, but are computed */ /* directly from the diagonal blocks of S and P. */ /* This routine returns the matrices X and/or Y of right and left */ /* eigenvectors of (S,P), or the products Z*X and/or Q*Y, */ /* where Z and Q are input matrices. */ /* If Q and Z are the orthogonal factors from the generalized Schur */ /* factorization of a matrix pair (A,B), then Z*X and Q*Y */ /* are the matrices of right and left eigenvectors of (A,B). */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'R': compute right eigenvectors only; */ /* = 'L': compute left eigenvectors only; */ /* = 'B': compute both right and left eigenvectors. */ /* HOWMNY (input) CHARACTER*1 */ /* = 'A': compute all right and/or left eigenvectors; */ /* = 'B': compute all right and/or left eigenvectors, */ /* backtransformed by the matrices in VR and/or VL; */ /* = 'S': compute selected right and/or left eigenvectors, */ /* specified by the logical array SELECT. */ /* SELECT (input) LOGICAL array, dimension (N) */ /* If HOWMNY='S', SELECT specifies the eigenvectors to be */ /* computed. If w(j) is a real eigenvalue, the corresponding */ /* real eigenvector is computed if SELECT(j) is .TRUE.. */ /* If w(j) and w(j+1) are the real and imaginary parts of a */ /* complex eigenvalue, the corresponding complex eigenvector */ /* is computed if either SELECT(j) or SELECT(j+1) is .TRUE., */ /* and on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is */ /* set to .FALSE.. */ /* Not referenced if HOWMNY = 'A' or 'B'. */ /* N (input) INTEGER */ /* The order of the matrices S and P. N >= 0. */ /* S (input) DOUBLE PRECISION array, dimension (LDS,N) */ /* The upper quasi-triangular matrix S from a generalized Schur */ /* factorization, as computed by DHGEQZ. */ /* LDS (input) INTEGER */ /* The leading dimension of array S. LDS >= max(1,N). */ /* P (input) DOUBLE PRECISION array, dimension (LDP,N) */ /* The upper triangular matrix P from a generalized Schur */ /* factorization, as computed by DHGEQZ. */ /* 2-by-2 diagonal blocks of P corresponding to 2-by-2 blocks */ /* of S must be in positive diagonal form. */ /* LDP (input) INTEGER */ /* The leading dimension of array P. LDP >= max(1,N). */ /* VL (input/output) DOUBLE PRECISION array, dimension (LDVL,MM) */ /* On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must */ /* contain an N-by-N matrix Q (usually the orthogonal matrix Q */ /* of left Schur vectors returned by DHGEQZ). */ /* On exit, if SIDE = 'L' or 'B', VL contains: */ /* if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P); */ /* if HOWMNY = 'B', the matrix Q*Y; */ /* if HOWMNY = 'S', the left eigenvectors of (S,P) specified by */ /* SELECT, stored consecutively in the columns of */ /* VL, in the same order as their eigenvalues. */ /* A complex eigenvector corresponding to a complex eigenvalue */ /* is stored in two consecutive columns, the first holding the */ /* real part, and the second the imaginary part. */ /* Not referenced if SIDE = 'R'. */ /* LDVL (input) INTEGER */ /* The leading dimension of array VL. LDVL >= 1, and if */ /* SIDE = 'L' or 'B', LDVL >= N. */ /* VR (input/output) DOUBLE PRECISION array, dimension (LDVR,MM) */ /* On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must */ /* contain an N-by-N matrix Z (usually the orthogonal matrix Z */ /* of right Schur vectors returned by DHGEQZ). */ /* On exit, if SIDE = 'R' or 'B', VR contains: */ /* if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P); */ /* if HOWMNY = 'B' or 'b', the matrix Z*X; */ /* if HOWMNY = 'S' or 's', the right eigenvectors of (S,P) */ /* specified by SELECT, stored consecutively in the */ /* columns of VR, in the same order as their */ /* eigenvalues. */ /* A complex eigenvector corresponding to a complex eigenvalue */ /* is stored in two consecutive columns, the first holding the */ /* real part and the second the imaginary part. */ /* Not referenced if SIDE = 'L'. */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. LDVR >= 1, and if */ /* SIDE = 'R' or 'B', LDVR >= N. */ /* MM (input) INTEGER */ /* The number of columns in the arrays VL and/or VR. MM >= M. */ /* M (output) INTEGER */ /* The number of columns in the arrays VL and/or VR actually */ /* used to store the eigenvectors. If HOWMNY = 'A' or 'B', M */ /* is set to N. Each selected real eigenvector occupies one */ /* column and each selected complex eigenvector occupies two */ /* columns. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (6*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit. */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* > 0: the 2-by-2 block (INFO:INFO+1) does not have a complex */ /* eigenvalue. */ /* Further Details */ /* =============== */ /* Allocation of workspace: */ /* ---------- -- --------- */ /* WORK( j ) = 1-norm of j-th column of A, above the diagonal */ /* WORK( N+j ) = 1-norm of j-th column of B, above the diagonal */ /* WORK( 2*N+1:3*N ) = real part of eigenvector */ /* WORK( 3*N+1:4*N ) = imaginary part of eigenvector */ /* WORK( 4*N+1:5*N ) = real part of back-transformed eigenvector */ /* WORK( 5*N+1:6*N ) = imaginary part of back-transformed eigenvector */ /* Rowwise vs. columnwise solution methods: */ /* ------- -- ---------- -------- ------- */ /* Finding a generalized eigenvector consists basically of solving the */ /* singular triangular system */ /* (A - w B) x = 0 (for right) or: (A - w B)**H y = 0 (for left) */ /* Consider finding the i-th right eigenvector (assume all eigenvalues */ /* are real). The equation to be solved is: */ /* n i */ /* 0 = sum C(j,k) v(k) = sum C(j,k) v(k) for j = i,. . .,1 */ /* k=j k=j */ /* where C = (A - w B) (The components v(i+1:n) are 0.) */ /* The "rowwise" method is: */ /* (1) v(i) := 1 */ /* for j = i-1,. . .,1: */ /* i */ /* (2) compute s = - sum C(j,k) v(k) and */ /* k=j+1 */ /* (3) v(j) := s / C(j,j) */ /* Step 2 is sometimes called the "dot product" step, since it is an */ /* inner product between the j-th row and the portion of the eigenvector */ /* that has been computed so far. */ /* The "columnwise" method consists basically in doing the sums */ /* for all the rows in parallel. As each v(j) is computed, the */ /* contribution of v(j) times the j-th column of C is added to the */ /* partial sums. Since FORTRAN arrays are stored columnwise, this has */ /* the advantage that at each step, the elements of C that are accessed */ /* are adjacent to one another, whereas with the rowwise method, the */ /* elements accessed at a step are spaced LDS (and LDP) words apart. */ /* When finding left eigenvectors, the matrix in question is the */ /* transpose of the one in storage, so the rowwise method then */ /* actually accesses columns of A and B at each step, and so is the */ /* preferred method. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and Test the input parameters */ /* Parameter adjustments */ --select; s_dim1 = *lds; s_offset = 1 + s_dim1; s -= s_offset; p_dim1 = *ldp; p_offset = 1 + p_dim1; p -= p_offset; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --work; /* Function Body */ if (_starpu_lsame_(howmny, "A")) { ihwmny = 1; ilall = TRUE_; ilback = FALSE_; } else if (_starpu_lsame_(howmny, "S")) { ihwmny = 2; ilall = FALSE_; ilback = FALSE_; } else if (_starpu_lsame_(howmny, "B")) { ihwmny = 3; ilall = TRUE_; ilback = TRUE_; } else { ihwmny = -1; ilall = TRUE_; } if (_starpu_lsame_(side, "R")) { iside = 1; compl = FALSE_; compr = TRUE_; } else if (_starpu_lsame_(side, "L")) { iside = 2; compl = TRUE_; compr = FALSE_; } else if (_starpu_lsame_(side, "B")) { iside = 3; compl = TRUE_; compr = TRUE_; } else { iside = -1; } *info = 0; if (iside < 0) { *info = -1; } else if (ihwmny < 0) { *info = -2; } else if (*n < 0) { *info = -4; } else if (*lds < max(1,*n)) { *info = -6; } else if (*ldp < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGEVC", &i__1); return 0; } /* Count the number of eigenvectors to be computed */ if (! ilall) { im = 0; ilcplx = FALSE_; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (ilcplx) { ilcplx = FALSE_; goto L10; } if (j < *n) { if (s[j + 1 + j * s_dim1] != 0.) { ilcplx = TRUE_; } } if (ilcplx) { if (select[j] || select[j + 1]) { im += 2; } } else { if (select[j]) { ++im; } } L10: ; } } else { im = *n; } /* Check 2-by-2 diagonal blocks of A, B */ ilabad = FALSE_; ilbbad = FALSE_; i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { if (s[j + 1 + j * s_dim1] != 0.) { if (p[j + j * p_dim1] == 0. || p[j + 1 + (j + 1) * p_dim1] == 0. || p[j + (j + 1) * p_dim1] != 0.) { ilbbad = TRUE_; } if (j < *n - 1) { if (s[j + 2 + (j + 1) * s_dim1] != 0.) { ilabad = TRUE_; } } } /* L20: */ } if (ilabad) { *info = -5; } else if (ilbbad) { *info = -7; } else if (compl && *ldvl < *n || *ldvl < 1) { *info = -10; } else if (compr && *ldvr < *n || *ldvr < 1) { *info = -12; } else if (*mm < im) { *info = -13; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGEVC", &i__1); return 0; } /* Quick return if possible */ *m = im; if (*n == 0) { return 0; } /* Machine Constants */ safmin = _starpu_dlamch_("Safe minimum"); big = 1. / safmin; _starpu_dlabad_(&safmin, &big); ulp = _starpu_dlamch_("Epsilon") * _starpu_dlamch_("Base"); small = safmin * *n / ulp; big = 1. / small; bignum = 1. / (safmin * *n); /* Compute the 1-norm of each column of the strictly upper triangular */ /* part (i.e., excluding all elements belonging to the diagonal */ /* blocks) of A and B to check for possible overflow in the */ /* triangular solver. */ anorm = (d__1 = s[s_dim1 + 1], abs(d__1)); if (*n > 1) { anorm += (d__1 = s[s_dim1 + 2], abs(d__1)); } bnorm = (d__1 = p[p_dim1 + 1], abs(d__1)); work[1] = 0.; work[*n + 1] = 0.; i__1 = *n; for (j = 2; j <= i__1; ++j) { temp = 0.; temp2 = 0.; if (s[j + (j - 1) * s_dim1] == 0.) { iend = j - 1; } else { iend = j - 2; } i__2 = iend; for (i__ = 1; i__ <= i__2; ++i__) { temp += (d__1 = s[i__ + j * s_dim1], abs(d__1)); temp2 += (d__1 = p[i__ + j * p_dim1], abs(d__1)); /* L30: */ } work[j] = temp; work[*n + j] = temp2; /* Computing MIN */ i__3 = j + 1; i__2 = min(i__3,*n); for (i__ = iend + 1; i__ <= i__2; ++i__) { temp += (d__1 = s[i__ + j * s_dim1], abs(d__1)); temp2 += (d__1 = p[i__ + j * p_dim1], abs(d__1)); /* L40: */ } anorm = max(anorm,temp); bnorm = max(bnorm,temp2); /* L50: */ } ascale = 1. / max(anorm,safmin); bscale = 1. / max(bnorm,safmin); /* Left eigenvectors */ if (compl) { ieig = 0; /* Main loop over eigenvalues */ ilcplx = FALSE_; i__1 = *n; for (je = 1; je <= i__1; ++je) { /* Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or */ /* (b) this would be the second of a complex pair. */ /* Check for complex eigenvalue, so as to be sure of which */ /* entry(-ies) of SELECT to look at. */ if (ilcplx) { ilcplx = FALSE_; goto L220; } nw = 1; if (je < *n) { if (s[je + 1 + je * s_dim1] != 0.) { ilcplx = TRUE_; nw = 2; } } if (ilall) { ilcomp = TRUE_; } else if (ilcplx) { ilcomp = select[je] || select[je + 1]; } else { ilcomp = select[je]; } if (! ilcomp) { goto L220; } /* Decide if (a) singular pencil, (b) real eigenvalue, or */ /* (c) complex eigenvalue. */ if (! ilcplx) { if ((d__1 = s[je + je * s_dim1], abs(d__1)) <= safmin && ( d__2 = p[je + je * p_dim1], abs(d__2)) <= safmin) { /* Singular matrix pencil -- return unit eigenvector */ ++ieig; i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vl[jr + ieig * vl_dim1] = 0.; /* L60: */ } vl[ieig + ieig * vl_dim1] = 1.; goto L220; } } /* Clear vector */ i__2 = nw * *n; for (jr = 1; jr <= i__2; ++jr) { work[(*n << 1) + jr] = 0.; /* L70: */ } /* T */ /* Compute coefficients in ( a A - b B ) y = 0 */ /* a is ACOEF */ /* b is BCOEFR + i*BCOEFI */ if (! ilcplx) { /* Real eigenvalue */ /* Computing MAX */ d__3 = (d__1 = s[je + je * s_dim1], abs(d__1)) * ascale, d__4 = (d__2 = p[je + je * p_dim1], abs(d__2)) * bscale, d__3 = max(d__3,d__4); temp = 1. / max(d__3,safmin); salfar = temp * s[je + je * s_dim1] * ascale; sbeta = temp * p[je + je * p_dim1] * bscale; acoef = sbeta * ascale; bcoefr = salfar * bscale; bcoefi = 0.; /* Scale to avoid underflow */ scale = 1.; lsa = abs(sbeta) >= safmin && abs(acoef) < small; lsb = abs(salfar) >= safmin && abs(bcoefr) < small; if (lsa) { scale = small / abs(sbeta) * min(anorm,big); } if (lsb) { /* Computing MAX */ d__1 = scale, d__2 = small / abs(salfar) * min(bnorm,big); scale = max(d__1,d__2); } if (lsa || lsb) { /* Computing MIN */ /* Computing MAX */ d__3 = 1., d__4 = abs(acoef), d__3 = max(d__3,d__4), d__4 = abs(bcoefr); d__1 = scale, d__2 = 1. / (safmin * max(d__3,d__4)); scale = min(d__1,d__2); if (lsa) { acoef = ascale * (scale * sbeta); } else { acoef = scale * acoef; } if (lsb) { bcoefr = bscale * (scale * salfar); } else { bcoefr = scale * bcoefr; } } acoefa = abs(acoef); bcoefa = abs(bcoefr); /* First component is 1 */ work[(*n << 1) + je] = 1.; xmax = 1.; } else { /* Complex eigenvalue */ d__1 = safmin * 100.; _starpu_dlag2_(&s[je + je * s_dim1], lds, &p[je + je * p_dim1], ldp, & d__1, &acoef, &temp, &bcoefr, &temp2, &bcoefi); bcoefi = -bcoefi; if (bcoefi == 0.) { *info = je; return 0; } /* Scale to avoid over/underflow */ acoefa = abs(acoef); bcoefa = abs(bcoefr) + abs(bcoefi); scale = 1.; if (acoefa * ulp < safmin && acoefa >= safmin) { scale = safmin / ulp / acoefa; } if (bcoefa * ulp < safmin && bcoefa >= safmin) { /* Computing MAX */ d__1 = scale, d__2 = safmin / ulp / bcoefa; scale = max(d__1,d__2); } if (safmin * acoefa > ascale) { scale = ascale / (safmin * acoefa); } if (safmin * bcoefa > bscale) { /* Computing MIN */ d__1 = scale, d__2 = bscale / (safmin * bcoefa); scale = min(d__1,d__2); } if (scale != 1.) { acoef = scale * acoef; acoefa = abs(acoef); bcoefr = scale * bcoefr; bcoefi = scale * bcoefi; bcoefa = abs(bcoefr) + abs(bcoefi); } /* Compute first two components of eigenvector */ temp = acoef * s[je + 1 + je * s_dim1]; temp2r = acoef * s[je + je * s_dim1] - bcoefr * p[je + je * p_dim1]; temp2i = -bcoefi * p[je + je * p_dim1]; if (abs(temp) > abs(temp2r) + abs(temp2i)) { work[(*n << 1) + je] = 1.; work[*n * 3 + je] = 0.; work[(*n << 1) + je + 1] = -temp2r / temp; work[*n * 3 + je + 1] = -temp2i / temp; } else { work[(*n << 1) + je + 1] = 1.; work[*n * 3 + je + 1] = 0.; temp = acoef * s[je + (je + 1) * s_dim1]; work[(*n << 1) + je] = (bcoefr * p[je + 1 + (je + 1) * p_dim1] - acoef * s[je + 1 + (je + 1) * s_dim1]) / temp; work[*n * 3 + je] = bcoefi * p[je + 1 + (je + 1) * p_dim1] / temp; } /* Computing MAX */ d__5 = (d__1 = work[(*n << 1) + je], abs(d__1)) + (d__2 = work[*n * 3 + je], abs(d__2)), d__6 = (d__3 = work[(* n << 1) + je + 1], abs(d__3)) + (d__4 = work[*n * 3 + je + 1], abs(d__4)); xmax = max(d__5,d__6); } /* Computing MAX */ d__1 = ulp * acoefa * anorm, d__2 = ulp * bcoefa * bnorm, d__1 = max(d__1,d__2); dmin__ = max(d__1,safmin); /* T */ /* Triangular solve of (a A - b B) y = 0 */ /* T */ /* (rowwise in (a A - b B) , or columnwise in (a A - b B) ) */ il2by2 = FALSE_; i__2 = *n; for (j = je + nw; j <= i__2; ++j) { if (il2by2) { il2by2 = FALSE_; goto L160; } na = 1; bdiag[0] = p[j + j * p_dim1]; if (j < *n) { if (s[j + 1 + j * s_dim1] != 0.) { il2by2 = TRUE_; bdiag[1] = p[j + 1 + (j + 1) * p_dim1]; na = 2; } } /* Check whether scaling is necessary for dot products */ xscale = 1. / max(1.,xmax); /* Computing MAX */ d__1 = work[j], d__2 = work[*n + j], d__1 = max(d__1,d__2), d__2 = acoefa * work[j] + bcoefa * work[*n + j]; temp = max(d__1,d__2); if (il2by2) { /* Computing MAX */ d__1 = temp, d__2 = work[j + 1], d__1 = max(d__1,d__2), d__2 = work[*n + j + 1], d__1 = max(d__1,d__2), d__2 = acoefa * work[j + 1] + bcoefa * work[*n + j + 1]; temp = max(d__1,d__2); } if (temp > bignum * xscale) { i__3 = nw - 1; for (jw = 0; jw <= i__3; ++jw) { i__4 = j - 1; for (jr = je; jr <= i__4; ++jr) { work[(jw + 2) * *n + jr] = xscale * work[(jw + 2) * *n + jr]; /* L80: */ } /* L90: */ } xmax *= xscale; } /* Compute dot products */ /* j-1 */ /* SUM = sum conjg( a*S(k,j) - b*P(k,j) )*x(k) */ /* k=je */ /* To reduce the op count, this is done as */ /* _ j-1 _ j-1 */ /* a*conjg( sum S(k,j)*x(k) ) - b*conjg( sum P(k,j)*x(k) ) */ /* k=je k=je */ /* which may cause underflow problems if A or B are close */ /* to underflow. (E.g., less than SMALL.) */ /* A series of compiler directives to defeat vectorization */ /* for the next loop */ /* $PL$ CMCHAR=' ' */ /* DIR$ NEXTSCALAR */ /* $DIR SCALAR */ /* DIR$ NEXT SCALAR */ /* VD$L NOVECTOR */ /* DEC$ NOVECTOR */ /* VD$ NOVECTOR */ /* VDIR NOVECTOR */ /* VOCL LOOP,SCALAR */ /* IBM PREFER SCALAR */ /* $PL$ CMCHAR='*' */ i__3 = nw; for (jw = 1; jw <= i__3; ++jw) { /* $PL$ CMCHAR=' ' */ /* DIR$ NEXTSCALAR */ /* $DIR SCALAR */ /* DIR$ NEXT SCALAR */ /* VD$L NOVECTOR */ /* DEC$ NOVECTOR */ /* VD$ NOVECTOR */ /* VDIR NOVECTOR */ /* VOCL LOOP,SCALAR */ /* IBM PREFER SCALAR */ /* $PL$ CMCHAR='*' */ i__4 = na; for (ja = 1; ja <= i__4; ++ja) { sums[ja + (jw << 1) - 3] = 0.; sump[ja + (jw << 1) - 3] = 0.; i__5 = j - 1; for (jr = je; jr <= i__5; ++jr) { sums[ja + (jw << 1) - 3] += s[jr + (j + ja - 1) * s_dim1] * work[(jw + 1) * *n + jr]; sump[ja + (jw << 1) - 3] += p[jr + (j + ja - 1) * p_dim1] * work[(jw + 1) * *n + jr]; /* L100: */ } /* L110: */ } /* L120: */ } /* $PL$ CMCHAR=' ' */ /* DIR$ NEXTSCALAR */ /* $DIR SCALAR */ /* DIR$ NEXT SCALAR */ /* VD$L NOVECTOR */ /* DEC$ NOVECTOR */ /* VD$ NOVECTOR */ /* VDIR NOVECTOR */ /* VOCL LOOP,SCALAR */ /* IBM PREFER SCALAR */ /* $PL$ CMCHAR='*' */ i__3 = na; for (ja = 1; ja <= i__3; ++ja) { if (ilcplx) { sum[ja - 1] = -acoef * sums[ja - 1] + bcoefr * sump[ ja - 1] - bcoefi * sump[ja + 1]; sum[ja + 1] = -acoef * sums[ja + 1] + bcoefr * sump[ ja + 1] + bcoefi * sump[ja - 1]; } else { sum[ja - 1] = -acoef * sums[ja - 1] + bcoefr * sump[ ja - 1]; } /* L130: */ } /* T */ /* Solve ( a A - b B ) y = SUM(,) */ /* with scaling and perturbation of the denominator */ _starpu_dlaln2_(&c_true, &na, &nw, &dmin__, &acoef, &s[j + j * s_dim1] , lds, bdiag, &bdiag[1], sum, &c__2, &bcoefr, &bcoefi, &work[(*n << 1) + j], n, &scale, &temp, &iinfo); if (scale < 1.) { i__3 = nw - 1; for (jw = 0; jw <= i__3; ++jw) { i__4 = j - 1; for (jr = je; jr <= i__4; ++jr) { work[(jw + 2) * *n + jr] = scale * work[(jw + 2) * *n + jr]; /* L140: */ } /* L150: */ } xmax = scale * xmax; } xmax = max(xmax,temp); L160: ; } /* Copy eigenvector to VL, back transforming if */ /* HOWMNY='B'. */ ++ieig; if (ilback) { i__2 = nw - 1; for (jw = 0; jw <= i__2; ++jw) { i__3 = *n + 1 - je; _starpu_dgemv_("N", n, &i__3, &c_b34, &vl[je * vl_dim1 + 1], ldvl, &work[(jw + 2) * *n + je], &c__1, &c_b36, &work[( jw + 4) * *n + 1], &c__1); /* L170: */ } _starpu_dlacpy_(" ", n, &nw, &work[(*n << 2) + 1], n, &vl[je * vl_dim1 + 1], ldvl); ibeg = 1; } else { _starpu_dlacpy_(" ", n, &nw, &work[(*n << 1) + 1], n, &vl[ieig * vl_dim1 + 1], ldvl); ibeg = je; } /* Scale eigenvector */ xmax = 0.; if (ilcplx) { i__2 = *n; for (j = ibeg; j <= i__2; ++j) { /* Computing MAX */ d__3 = xmax, d__4 = (d__1 = vl[j + ieig * vl_dim1], abs( d__1)) + (d__2 = vl[j + (ieig + 1) * vl_dim1], abs(d__2)); xmax = max(d__3,d__4); /* L180: */ } } else { i__2 = *n; for (j = ibeg; j <= i__2; ++j) { /* Computing MAX */ d__2 = xmax, d__3 = (d__1 = vl[j + ieig * vl_dim1], abs( d__1)); xmax = max(d__2,d__3); /* L190: */ } } if (xmax > safmin) { xscale = 1. / xmax; i__2 = nw - 1; for (jw = 0; jw <= i__2; ++jw) { i__3 = *n; for (jr = ibeg; jr <= i__3; ++jr) { vl[jr + (ieig + jw) * vl_dim1] = xscale * vl[jr + ( ieig + jw) * vl_dim1]; /* L200: */ } /* L210: */ } } ieig = ieig + nw - 1; L220: ; } } /* Right eigenvectors */ if (compr) { ieig = im + 1; /* Main loop over eigenvalues */ ilcplx = FALSE_; for (je = *n; je >= 1; --je) { /* Skip this iteration if (a) HOWMNY='S' and SELECT=.FALSE., or */ /* (b) this would be the second of a complex pair. */ /* Check for complex eigenvalue, so as to be sure of which */ /* entry(-ies) of SELECT to look at -- if complex, SELECT(JE) */ /* or SELECT(JE-1). */ /* If this is a complex pair, the 2-by-2 diagonal block */ /* corresponding to the eigenvalue is in rows/columns JE-1:JE */ if (ilcplx) { ilcplx = FALSE_; goto L500; } nw = 1; if (je > 1) { if (s[je + (je - 1) * s_dim1] != 0.) { ilcplx = TRUE_; nw = 2; } } if (ilall) { ilcomp = TRUE_; } else if (ilcplx) { ilcomp = select[je] || select[je - 1]; } else { ilcomp = select[je]; } if (! ilcomp) { goto L500; } /* Decide if (a) singular pencil, (b) real eigenvalue, or */ /* (c) complex eigenvalue. */ if (! ilcplx) { if ((d__1 = s[je + je * s_dim1], abs(d__1)) <= safmin && ( d__2 = p[je + je * p_dim1], abs(d__2)) <= safmin) { /* Singular matrix pencil -- unit eigenvector */ --ieig; i__1 = *n; for (jr = 1; jr <= i__1; ++jr) { vr[jr + ieig * vr_dim1] = 0.; /* L230: */ } vr[ieig + ieig * vr_dim1] = 1.; goto L500; } } /* Clear vector */ i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { work[(jw + 2) * *n + jr] = 0.; /* L240: */ } /* L250: */ } /* Compute coefficients in ( a A - b B ) x = 0 */ /* a is ACOEF */ /* b is BCOEFR + i*BCOEFI */ if (! ilcplx) { /* Real eigenvalue */ /* Computing MAX */ d__3 = (d__1 = s[je + je * s_dim1], abs(d__1)) * ascale, d__4 = (d__2 = p[je + je * p_dim1], abs(d__2)) * bscale, d__3 = max(d__3,d__4); temp = 1. / max(d__3,safmin); salfar = temp * s[je + je * s_dim1] * ascale; sbeta = temp * p[je + je * p_dim1] * bscale; acoef = sbeta * ascale; bcoefr = salfar * bscale; bcoefi = 0.; /* Scale to avoid underflow */ scale = 1.; lsa = abs(sbeta) >= safmin && abs(acoef) < small; lsb = abs(salfar) >= safmin && abs(bcoefr) < small; if (lsa) { scale = small / abs(sbeta) * min(anorm,big); } if (lsb) { /* Computing MAX */ d__1 = scale, d__2 = small / abs(salfar) * min(bnorm,big); scale = max(d__1,d__2); } if (lsa || lsb) { /* Computing MIN */ /* Computing MAX */ d__3 = 1., d__4 = abs(acoef), d__3 = max(d__3,d__4), d__4 = abs(bcoefr); d__1 = scale, d__2 = 1. / (safmin * max(d__3,d__4)); scale = min(d__1,d__2); if (lsa) { acoef = ascale * (scale * sbeta); } else { acoef = scale * acoef; } if (lsb) { bcoefr = bscale * (scale * salfar); } else { bcoefr = scale * bcoefr; } } acoefa = abs(acoef); bcoefa = abs(bcoefr); /* First component is 1 */ work[(*n << 1) + je] = 1.; xmax = 1.; /* Compute contribution from column JE of A and B to sum */ /* (See "Further Details", above.) */ i__1 = je - 1; for (jr = 1; jr <= i__1; ++jr) { work[(*n << 1) + jr] = bcoefr * p[jr + je * p_dim1] - acoef * s[jr + je * s_dim1]; /* L260: */ } } else { /* Complex eigenvalue */ d__1 = safmin * 100.; _starpu_dlag2_(&s[je - 1 + (je - 1) * s_dim1], lds, &p[je - 1 + (je - 1) * p_dim1], ldp, &d__1, &acoef, &temp, &bcoefr, & temp2, &bcoefi); if (bcoefi == 0.) { *info = je - 1; return 0; } /* Scale to avoid over/underflow */ acoefa = abs(acoef); bcoefa = abs(bcoefr) + abs(bcoefi); scale = 1.; if (acoefa * ulp < safmin && acoefa >= safmin) { scale = safmin / ulp / acoefa; } if (bcoefa * ulp < safmin && bcoefa >= safmin) { /* Computing MAX */ d__1 = scale, d__2 = safmin / ulp / bcoefa; scale = max(d__1,d__2); } if (safmin * acoefa > ascale) { scale = ascale / (safmin * acoefa); } if (safmin * bcoefa > bscale) { /* Computing MIN */ d__1 = scale, d__2 = bscale / (safmin * bcoefa); scale = min(d__1,d__2); } if (scale != 1.) { acoef = scale * acoef; acoefa = abs(acoef); bcoefr = scale * bcoefr; bcoefi = scale * bcoefi; bcoefa = abs(bcoefr) + abs(bcoefi); } /* Compute first two components of eigenvector */ /* and contribution to sums */ temp = acoef * s[je + (je - 1) * s_dim1]; temp2r = acoef * s[je + je * s_dim1] - bcoefr * p[je + je * p_dim1]; temp2i = -bcoefi * p[je + je * p_dim1]; if (abs(temp) >= abs(temp2r) + abs(temp2i)) { work[(*n << 1) + je] = 1.; work[*n * 3 + je] = 0.; work[(*n << 1) + je - 1] = -temp2r / temp; work[*n * 3 + je - 1] = -temp2i / temp; } else { work[(*n << 1) + je - 1] = 1.; work[*n * 3 + je - 1] = 0.; temp = acoef * s[je - 1 + je * s_dim1]; work[(*n << 1) + je] = (bcoefr * p[je - 1 + (je - 1) * p_dim1] - acoef * s[je - 1 + (je - 1) * s_dim1]) / temp; work[*n * 3 + je] = bcoefi * p[je - 1 + (je - 1) * p_dim1] / temp; } /* Computing MAX */ d__5 = (d__1 = work[(*n << 1) + je], abs(d__1)) + (d__2 = work[*n * 3 + je], abs(d__2)), d__6 = (d__3 = work[(* n << 1) + je - 1], abs(d__3)) + (d__4 = work[*n * 3 + je - 1], abs(d__4)); xmax = max(d__5,d__6); /* Compute contribution from columns JE and JE-1 */ /* of A and B to the sums. */ creala = acoef * work[(*n << 1) + je - 1]; cimaga = acoef * work[*n * 3 + je - 1]; crealb = bcoefr * work[(*n << 1) + je - 1] - bcoefi * work[*n * 3 + je - 1]; cimagb = bcoefi * work[(*n << 1) + je - 1] + bcoefr * work[*n * 3 + je - 1]; cre2a = acoef * work[(*n << 1) + je]; cim2a = acoef * work[*n * 3 + je]; cre2b = bcoefr * work[(*n << 1) + je] - bcoefi * work[*n * 3 + je]; cim2b = bcoefi * work[(*n << 1) + je] + bcoefr * work[*n * 3 + je]; i__1 = je - 2; for (jr = 1; jr <= i__1; ++jr) { work[(*n << 1) + jr] = -creala * s[jr + (je - 1) * s_dim1] + crealb * p[jr + (je - 1) * p_dim1] - cre2a * s[ jr + je * s_dim1] + cre2b * p[jr + je * p_dim1]; work[*n * 3 + jr] = -cimaga * s[jr + (je - 1) * s_dim1] + cimagb * p[jr + (je - 1) * p_dim1] - cim2a * s[jr + je * s_dim1] + cim2b * p[jr + je * p_dim1]; /* L270: */ } } /* Computing MAX */ d__1 = ulp * acoefa * anorm, d__2 = ulp * bcoefa * bnorm, d__1 = max(d__1,d__2); dmin__ = max(d__1,safmin); /* Columnwise triangular solve of (a A - b B) x = 0 */ il2by2 = FALSE_; for (j = je - nw; j >= 1; --j) { /* If a 2-by-2 block, is in position j-1:j, wait until */ /* next iteration to process it (when it will be j:j+1) */ if (! il2by2 && j > 1) { if (s[j + (j - 1) * s_dim1] != 0.) { il2by2 = TRUE_; goto L370; } } bdiag[0] = p[j + j * p_dim1]; if (il2by2) { na = 2; bdiag[1] = p[j + 1 + (j + 1) * p_dim1]; } else { na = 1; } /* Compute x(j) (and x(j+1), if 2-by-2 block) */ _starpu_dlaln2_(&c_false, &na, &nw, &dmin__, &acoef, &s[j + j * s_dim1], lds, bdiag, &bdiag[1], &work[(*n << 1) + j], n, &bcoefr, &bcoefi, sum, &c__2, &scale, &temp, & iinfo); if (scale < 1.) { i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = je; for (jr = 1; jr <= i__2; ++jr) { work[(jw + 2) * *n + jr] = scale * work[(jw + 2) * *n + jr]; /* L280: */ } /* L290: */ } } /* Computing MAX */ d__1 = scale * xmax; xmax = max(d__1,temp); i__1 = nw; for (jw = 1; jw <= i__1; ++jw) { i__2 = na; for (ja = 1; ja <= i__2; ++ja) { work[(jw + 1) * *n + j + ja - 1] = sum[ja + (jw << 1) - 3]; /* L300: */ } /* L310: */ } /* w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling */ if (j > 1) { /* Check whether scaling is necessary for sum. */ xscale = 1. / max(1.,xmax); temp = acoefa * work[j] + bcoefa * work[*n + j]; if (il2by2) { /* Computing MAX */ d__1 = temp, d__2 = acoefa * work[j + 1] + bcoefa * work[*n + j + 1]; temp = max(d__1,d__2); } /* Computing MAX */ d__1 = max(temp,acoefa); temp = max(d__1,bcoefa); if (temp > bignum * xscale) { i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = je; for (jr = 1; jr <= i__2; ++jr) { work[(jw + 2) * *n + jr] = xscale * work[(jw + 2) * *n + jr]; /* L320: */ } /* L330: */ } xmax *= xscale; } /* Compute the contributions of the off-diagonals of */ /* column j (and j+1, if 2-by-2 block) of A and B to the */ /* sums. */ i__1 = na; for (ja = 1; ja <= i__1; ++ja) { if (ilcplx) { creala = acoef * work[(*n << 1) + j + ja - 1]; cimaga = acoef * work[*n * 3 + j + ja - 1]; crealb = bcoefr * work[(*n << 1) + j + ja - 1] - bcoefi * work[*n * 3 + j + ja - 1]; cimagb = bcoefi * work[(*n << 1) + j + ja - 1] + bcoefr * work[*n * 3 + j + ja - 1]; i__2 = j - 1; for (jr = 1; jr <= i__2; ++jr) { work[(*n << 1) + jr] = work[(*n << 1) + jr] - creala * s[jr + (j + ja - 1) * s_dim1] + crealb * p[jr + (j + ja - 1) * p_dim1]; work[*n * 3 + jr] = work[*n * 3 + jr] - cimaga * s[jr + (j + ja - 1) * s_dim1] + cimagb * p[jr + (j + ja - 1) * p_dim1]; /* L340: */ } } else { creala = acoef * work[(*n << 1) + j + ja - 1]; crealb = bcoefr * work[(*n << 1) + j + ja - 1]; i__2 = j - 1; for (jr = 1; jr <= i__2; ++jr) { work[(*n << 1) + jr] = work[(*n << 1) + jr] - creala * s[jr + (j + ja - 1) * s_dim1] + crealb * p[jr + (j + ja - 1) * p_dim1]; /* L350: */ } } /* L360: */ } } il2by2 = FALSE_; L370: ; } /* Copy eigenvector to VR, back transforming if */ /* HOWMNY='B'. */ ieig -= nw; if (ilback) { i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { work[(jw + 4) * *n + jr] = work[(jw + 2) * *n + 1] * vr[jr + vr_dim1]; /* L380: */ } /* A series of compiler directives to defeat */ /* vectorization for the next loop */ i__2 = je; for (jc = 2; jc <= i__2; ++jc) { i__3 = *n; for (jr = 1; jr <= i__3; ++jr) { work[(jw + 4) * *n + jr] += work[(jw + 2) * *n + jc] * vr[jr + jc * vr_dim1]; /* L390: */ } /* L400: */ } /* L410: */ } i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + (ieig + jw) * vr_dim1] = work[(jw + 4) * *n + jr]; /* L420: */ } /* L430: */ } iend = *n; } else { i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = *n; for (jr = 1; jr <= i__2; ++jr) { vr[jr + (ieig + jw) * vr_dim1] = work[(jw + 2) * *n + jr]; /* L440: */ } /* L450: */ } iend = je; } /* Scale eigenvector */ xmax = 0.; if (ilcplx) { i__1 = iend; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ d__3 = xmax, d__4 = (d__1 = vr[j + ieig * vr_dim1], abs( d__1)) + (d__2 = vr[j + (ieig + 1) * vr_dim1], abs(d__2)); xmax = max(d__3,d__4); /* L460: */ } } else { i__1 = iend; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ d__2 = xmax, d__3 = (d__1 = vr[j + ieig * vr_dim1], abs( d__1)); xmax = max(d__2,d__3); /* L470: */ } } if (xmax > safmin) { xscale = 1. / xmax; i__1 = nw - 1; for (jw = 0; jw <= i__1; ++jw) { i__2 = iend; for (jr = 1; jr <= i__2; ++jr) { vr[jr + (ieig + jw) * vr_dim1] = xscale * vr[jr + ( ieig + jw) * vr_dim1]; /* L480: */ } /* L490: */ } } L500: ; } } return 0; /* End of DTGEVC */ } /* _starpu_dtgevc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgex2.c000066400000000000000000000600361413463044200205500ustar00rootroot00000000000000/* dtgex2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__4 = 4; static doublereal c_b5 = 0.; static integer c__1 = 1; static integer c__2 = 2; static doublereal c_b42 = 1.; static doublereal c_b48 = -1.; static integer c__0 = 0; /* Subroutine */ int _starpu_dtgex2_(logical *wantq, logical *wantz, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * q, integer *ldq, doublereal *z__, integer *ldz, integer *j1, integer * n1, integer *n2, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, z_dim1, z_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal f, g; integer i__, m; doublereal s[16] /* was [4][4] */, t[16] /* was [4][4] */, be[2], ai[2] , ar[2], sa, sb, li[16] /* was [4][4] */, ir[16] /* was [4][4] */, ss, ws, eps; logical weak; doublereal ddum; integer idum; doublereal taul[4], dsum; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal taur[4], scpy[16] /* was [4][4] */, tcpy[16] /* was [4][4] */; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal scale, bqra21, brqa21; extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal licop[16] /* was [4][4] */; integer linfo; doublereal ircop[16] /* was [4][4] */, dnorm; integer iwork[4]; extern /* Subroutine */ int _starpu_dlagv2_(doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal * , doublereal *, doublereal *, doublereal *), _starpu_dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dgerq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorgr2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dorm2r_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dormr2_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dtgsy2_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal dscale; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dlassq_(integer * , doublereal *, integer *, doublereal *, doublereal *); logical dtrong; doublereal thresh, smlnum; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGEX2 swaps adjacent diagonal blocks (A11, B11) and (A22, B22) */ /* of size 1-by-1 or 2-by-2 in an upper (quasi) triangular matrix pair */ /* (A, B) by an orthogonal equivalence transformation. */ /* (A, B) must be in generalized real Schur canonical form (as returned */ /* by DGGES), i.e. A is block upper triangular with 1-by-1 and 2-by-2 */ /* diagonal blocks. B is upper triangular. */ /* Optionally, the matrices Q and Z of generalized Schur vectors are */ /* updated. */ /* Q(in) * A(in) * Z(in)' = Q(out) * A(out) * Z(out)' */ /* Q(in) * B(in) * Z(in)' = Q(out) * B(out) * Z(out)' */ /* Arguments */ /* ========= */ /* WANTQ (input) LOGICAL */ /* .TRUE. : update the left transformation matrix Q; */ /* .FALSE.: do not update Q. */ /* WANTZ (input) LOGICAL */ /* .TRUE. : update the right transformation matrix Z; */ /* .FALSE.: do not update Z. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION arrays, dimensions (LDA,N) */ /* On entry, the matrix A in the pair (A, B). */ /* On exit, the updated matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION arrays, dimensions (LDB,N) */ /* On entry, the matrix B in the pair (A, B). */ /* On exit, the updated matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* On entry, if WANTQ = .TRUE., the orthogonal matrix Q. */ /* On exit, the updated matrix Q. */ /* Not referenced if WANTQ = .FALSE.. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= 1. */ /* If WANTQ = .TRUE., LDQ >= N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* On entry, if WANTZ =.TRUE., the orthogonal matrix Z. */ /* On exit, the updated matrix Z. */ /* Not referenced if WANTZ = .FALSE.. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1. */ /* If WANTZ = .TRUE., LDZ >= N. */ /* J1 (input) INTEGER */ /* The index to the first block (A11, B11). 1 <= J1 <= N. */ /* N1 (input) INTEGER */ /* The order of the first block (A11, B11). N1 = 0, 1 or 2. */ /* N2 (input) INTEGER */ /* The order of the second block (A22, B22). N2 = 0, 1 or 2. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)). */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* LWORK >= MAX( 1, N*(N2+N1), (N2+N1)*(N2+N1)*2 ) */ /* INFO (output) INTEGER */ /* =0: Successful exit */ /* >0: If INFO = 1, the transformed matrix (A, B) would be */ /* too far from generalized Schur form; the blocks are */ /* not swapped and (A, B) and (Q, Z) are unchanged. */ /* The problem of swapping is too ill-conditioned. */ /* <0: If INFO = -16: LWORK is too small. Appropriate value */ /* for LWORK is returned in WORK(1). */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* In the current code both weak and strong stability tests are */ /* performed. The user can omit the strong stability test by changing */ /* the internal logical parameter WANDS to .FALSE.. See ref. [2] for */ /* details. */ /* [1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the */ /* Generalized Real Schur Form of a Regular Matrix Pair (A, B), in */ /* M.S. Moonen et al (eds), Linear Algebra for Large Scale and */ /* Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218. */ /* [2] B. Kagstrom and P. Poromaa; Computing Eigenspaces with Specified */ /* Eigenvalues of a Regular Matrix Pair (A, B) and Condition */ /* Estimation: Theory, Algorithms and Software, */ /* Report UMINF - 94.04, Department of Computing Science, Umea */ /* University, S-901 87 Umea, Sweden, 1994. Also as LAPACK Working */ /* Note 87. To appear in Numerical Algorithms, 1996. */ /* ===================================================================== */ /* Replaced various illegal calls to DCOPY by calls to DLASET, or by DO */ /* loops. Sven Hammarling, 1/5/02. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ *info = 0; /* Quick return if possible */ if (*n <= 1 || *n1 <= 0 || *n2 <= 0) { return 0; } if (*n1 > *n || *j1 + *n1 > *n) { return 0; } m = *n1 + *n2; /* Computing MAX */ i__1 = 1, i__2 = *n * m, i__1 = max(i__1,i__2), i__2 = m * m << 1; if (*lwork < max(i__1,i__2)) { *info = -16; /* Computing MAX */ i__1 = 1, i__2 = *n * m, i__1 = max(i__1,i__2), i__2 = m * m << 1; work[1] = (doublereal) max(i__1,i__2); return 0; } weak = FALSE_; dtrong = FALSE_; /* Make a local copy of selected block */ _starpu_dlaset_("Full", &c__4, &c__4, &c_b5, &c_b5, li, &c__4); _starpu_dlaset_("Full", &c__4, &c__4, &c_b5, &c_b5, ir, &c__4); _starpu_dlacpy_("Full", &m, &m, &a[*j1 + *j1 * a_dim1], lda, s, &c__4); _starpu_dlacpy_("Full", &m, &m, &b[*j1 + *j1 * b_dim1], ldb, t, &c__4); /* Compute threshold for testing acceptance of swapping. */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; dscale = 0.; dsum = 1.; _starpu_dlacpy_("Full", &m, &m, s, &c__4, &work[1], &m); i__1 = m * m; _starpu_dlassq_(&i__1, &work[1], &c__1, &dscale, &dsum); _starpu_dlacpy_("Full", &m, &m, t, &c__4, &work[1], &m); i__1 = m * m; _starpu_dlassq_(&i__1, &work[1], &c__1, &dscale, &dsum); dnorm = dscale * sqrt(dsum); /* Computing MAX */ d__1 = eps * 10. * dnorm; thresh = max(d__1,smlnum); if (m == 2) { /* CASE 1: Swap 1-by-1 and 1-by-1 blocks. */ /* Compute orthogonal QL and RQ that swap 1-by-1 and 1-by-1 blocks */ /* using Givens rotations and perform the swap tentatively. */ f = s[5] * t[0] - t[5] * s[0]; g = s[5] * t[4] - t[5] * s[4]; sb = abs(t[5]); sa = abs(s[5]); _starpu_dlartg_(&f, &g, &ir[4], ir, &ddum); ir[1] = -ir[4]; ir[5] = ir[0]; _starpu_drot_(&c__2, s, &c__1, &s[4], &c__1, ir, &ir[1]); _starpu_drot_(&c__2, t, &c__1, &t[4], &c__1, ir, &ir[1]); if (sa >= sb) { _starpu_dlartg_(s, &s[1], li, &li[1], &ddum); } else { _starpu_dlartg_(t, &t[1], li, &li[1], &ddum); } _starpu_drot_(&c__2, s, &c__4, &s[1], &c__4, li, &li[1]); _starpu_drot_(&c__2, t, &c__4, &t[1], &c__4, li, &li[1]); li[5] = li[0]; li[4] = -li[1]; /* Weak stability test: */ /* |S21| + |T21| <= O(EPS * F-norm((S, T))) */ ws = abs(s[1]) + abs(t[1]); weak = ws <= thresh; if (! weak) { goto L70; } if (TRUE_) { /* Strong stability test: */ /* F-norm((A-QL'*S*QR, B-QL'*T*QR)) <= O(EPS*F-norm((A,B))) */ _starpu_dlacpy_("Full", &m, &m, &a[*j1 + *j1 * a_dim1], lda, &work[m * m + 1], &m); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b42, li, &c__4, s, &c__4, &c_b5, & work[1], &m); _starpu_dgemm_("N", "T", &m, &m, &m, &c_b48, &work[1], &m, ir, &c__4, & c_b42, &work[m * m + 1], &m); dscale = 0.; dsum = 1.; i__1 = m * m; _starpu_dlassq_(&i__1, &work[m * m + 1], &c__1, &dscale, &dsum); _starpu_dlacpy_("Full", &m, &m, &b[*j1 + *j1 * b_dim1], ldb, &work[m * m + 1], &m); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b42, li, &c__4, t, &c__4, &c_b5, & work[1], &m); _starpu_dgemm_("N", "T", &m, &m, &m, &c_b48, &work[1], &m, ir, &c__4, & c_b42, &work[m * m + 1], &m); i__1 = m * m; _starpu_dlassq_(&i__1, &work[m * m + 1], &c__1, &dscale, &dsum); ss = dscale * sqrt(dsum); dtrong = ss <= thresh; if (! dtrong) { goto L70; } } /* Update (A(J1:J1+M-1, M+J1:N), B(J1:J1+M-1, M+J1:N)) and */ /* (A(1:J1-1, J1:J1+M), B(1:J1-1, J1:J1+M)). */ i__1 = *j1 + 1; _starpu_drot_(&i__1, &a[*j1 * a_dim1 + 1], &c__1, &a[(*j1 + 1) * a_dim1 + 1], &c__1, ir, &ir[1]); i__1 = *j1 + 1; _starpu_drot_(&i__1, &b[*j1 * b_dim1 + 1], &c__1, &b[(*j1 + 1) * b_dim1 + 1], &c__1, ir, &ir[1]); i__1 = *n - *j1 + 1; _starpu_drot_(&i__1, &a[*j1 + *j1 * a_dim1], lda, &a[*j1 + 1 + *j1 * a_dim1], lda, li, &li[1]); i__1 = *n - *j1 + 1; _starpu_drot_(&i__1, &b[*j1 + *j1 * b_dim1], ldb, &b[*j1 + 1 + *j1 * b_dim1], ldb, li, &li[1]); /* Set N1-by-N2 (2,1) - blocks to ZERO. */ a[*j1 + 1 + *j1 * a_dim1] = 0.; b[*j1 + 1 + *j1 * b_dim1] = 0.; /* Accumulate transformations into Q and Z if requested. */ if (*wantz) { _starpu_drot_(n, &z__[*j1 * z_dim1 + 1], &c__1, &z__[(*j1 + 1) * z_dim1 + 1], &c__1, ir, &ir[1]); } if (*wantq) { _starpu_drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[(*j1 + 1) * q_dim1 + 1], &c__1, li, &li[1]); } /* Exit with INFO = 0 if swap was successfully performed. */ return 0; } else { /* CASE 2: Swap 1-by-1 and 2-by-2 blocks, or 2-by-2 */ /* and 2-by-2 blocks. */ /* Solve the generalized Sylvester equation */ /* S11 * R - L * S22 = SCALE * S12 */ /* T11 * R - L * T22 = SCALE * T12 */ /* for R and L. Solutions in LI and IR. */ _starpu_dlacpy_("Full", n1, n2, &t[(*n1 + 1 << 2) - 4], &c__4, li, &c__4); _starpu_dlacpy_("Full", n1, n2, &s[(*n1 + 1 << 2) - 4], &c__4, &ir[*n2 + 1 + ( *n1 + 1 << 2) - 5], &c__4); _starpu_dtgsy2_("N", &c__0, n1, n2, s, &c__4, &s[*n1 + 1 + (*n1 + 1 << 2) - 5] , &c__4, &ir[*n2 + 1 + (*n1 + 1 << 2) - 5], &c__4, t, &c__4, & t[*n1 + 1 + (*n1 + 1 << 2) - 5], &c__4, li, &c__4, &scale, & dsum, &dscale, iwork, &idum, &linfo); /* Compute orthogonal matrix QL: */ /* QL' * LI = [ TL ] */ /* [ 0 ] */ /* where */ /* LI = [ -L ] */ /* [ SCALE * identity(N2) ] */ i__1 = *n2; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dscal_(n1, &c_b48, &li[(i__ << 2) - 4], &c__1); li[*n1 + i__ + (i__ << 2) - 5] = scale; /* L10: */ } _starpu_dgeqr2_(&m, n2, li, &c__4, taul, &work[1], &linfo); if (linfo != 0) { goto L70; } _starpu_dorg2r_(&m, &m, n2, li, &c__4, taul, &work[1], &linfo); if (linfo != 0) { goto L70; } /* Compute orthogonal matrix RQ: */ /* IR * RQ' = [ 0 TR], */ /* where IR = [ SCALE * identity(N1), R ] */ i__1 = *n1; for (i__ = 1; i__ <= i__1; ++i__) { ir[*n2 + i__ + (i__ << 2) - 5] = scale; /* L20: */ } _starpu_dgerq2_(n1, &m, &ir[*n2], &c__4, taur, &work[1], &linfo); if (linfo != 0) { goto L70; } _starpu_dorgr2_(&m, &m, n1, ir, &c__4, taur, &work[1], &linfo); if (linfo != 0) { goto L70; } /* Perform the swapping tentatively: */ _starpu_dgemm_("T", "N", &m, &m, &m, &c_b42, li, &c__4, s, &c__4, &c_b5, & work[1], &m); _starpu_dgemm_("N", "T", &m, &m, &m, &c_b42, &work[1], &m, ir, &c__4, &c_b5, s, &c__4); _starpu_dgemm_("T", "N", &m, &m, &m, &c_b42, li, &c__4, t, &c__4, &c_b5, & work[1], &m); _starpu_dgemm_("N", "T", &m, &m, &m, &c_b42, &work[1], &m, ir, &c__4, &c_b5, t, &c__4); _starpu_dlacpy_("F", &m, &m, s, &c__4, scpy, &c__4); _starpu_dlacpy_("F", &m, &m, t, &c__4, tcpy, &c__4); _starpu_dlacpy_("F", &m, &m, ir, &c__4, ircop, &c__4); _starpu_dlacpy_("F", &m, &m, li, &c__4, licop, &c__4); /* Triangularize the B-part by an RQ factorization. */ /* Apply transformation (from left) to A-part, giving S. */ _starpu_dgerq2_(&m, &m, t, &c__4, taur, &work[1], &linfo); if (linfo != 0) { goto L70; } _starpu_dormr2_("R", "T", &m, &m, &m, t, &c__4, taur, s, &c__4, &work[1], & linfo); if (linfo != 0) { goto L70; } _starpu_dormr2_("L", "N", &m, &m, &m, t, &c__4, taur, ir, &c__4, &work[1], & linfo); if (linfo != 0) { goto L70; } /* Compute F-norm(S21) in BRQA21. (T21 is 0.) */ dscale = 0.; dsum = 1.; i__1 = *n2; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlassq_(n1, &s[*n2 + 1 + (i__ << 2) - 5], &c__1, &dscale, &dsum); /* L30: */ } brqa21 = dscale * sqrt(dsum); /* Triangularize the B-part by a QR factorization. */ /* Apply transformation (from right) to A-part, giving S. */ _starpu_dgeqr2_(&m, &m, tcpy, &c__4, taul, &work[1], &linfo); if (linfo != 0) { goto L70; } _starpu_dorm2r_("L", "T", &m, &m, &m, tcpy, &c__4, taul, scpy, &c__4, &work[1] , info); _starpu_dorm2r_("R", "N", &m, &m, &m, tcpy, &c__4, taul, licop, &c__4, &work[ 1], info); if (linfo != 0) { goto L70; } /* Compute F-norm(S21) in BQRA21. (T21 is 0.) */ dscale = 0.; dsum = 1.; i__1 = *n2; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlassq_(n1, &scpy[*n2 + 1 + (i__ << 2) - 5], &c__1, &dscale, & dsum); /* L40: */ } bqra21 = dscale * sqrt(dsum); /* Decide which method to use. */ /* Weak stability test: */ /* F-norm(S21) <= O(EPS * F-norm((S, T))) */ if (bqra21 <= brqa21 && bqra21 <= thresh) { _starpu_dlacpy_("F", &m, &m, scpy, &c__4, s, &c__4); _starpu_dlacpy_("F", &m, &m, tcpy, &c__4, t, &c__4); _starpu_dlacpy_("F", &m, &m, ircop, &c__4, ir, &c__4); _starpu_dlacpy_("F", &m, &m, licop, &c__4, li, &c__4); } else if (brqa21 >= thresh) { goto L70; } /* Set lower triangle of B-part to zero */ i__1 = m - 1; i__2 = m - 1; _starpu_dlaset_("Lower", &i__1, &i__2, &c_b5, &c_b5, &t[1], &c__4); if (TRUE_) { /* Strong stability test: */ /* F-norm((A-QL*S*QR', B-QL*T*QR')) <= O(EPS*F-norm((A,B))) */ _starpu_dlacpy_("Full", &m, &m, &a[*j1 + *j1 * a_dim1], lda, &work[m * m + 1], &m); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b42, li, &c__4, s, &c__4, &c_b5, & work[1], &m); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b48, &work[1], &m, ir, &c__4, & c_b42, &work[m * m + 1], &m); dscale = 0.; dsum = 1.; i__1 = m * m; _starpu_dlassq_(&i__1, &work[m * m + 1], &c__1, &dscale, &dsum); _starpu_dlacpy_("Full", &m, &m, &b[*j1 + *j1 * b_dim1], ldb, &work[m * m + 1], &m); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b42, li, &c__4, t, &c__4, &c_b5, & work[1], &m); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b48, &work[1], &m, ir, &c__4, & c_b42, &work[m * m + 1], &m); i__1 = m * m; _starpu_dlassq_(&i__1, &work[m * m + 1], &c__1, &dscale, &dsum); ss = dscale * sqrt(dsum); dtrong = ss <= thresh; if (! dtrong) { goto L70; } } /* If the swap is accepted ("weakly" and "strongly"), apply the */ /* transformations and set N1-by-N2 (2,1)-block to zero. */ _starpu_dlaset_("Full", n1, n2, &c_b5, &c_b5, &s[*n2], &c__4); /* copy back M-by-M diagonal block starting at index J1 of (A, B) */ _starpu_dlacpy_("F", &m, &m, s, &c__4, &a[*j1 + *j1 * a_dim1], lda) ; _starpu_dlacpy_("F", &m, &m, t, &c__4, &b[*j1 + *j1 * b_dim1], ldb) ; _starpu_dlaset_("Full", &c__4, &c__4, &c_b5, &c_b5, t, &c__4); /* Standardize existing 2-by-2 blocks. */ i__1 = m * m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; /* L50: */ } work[1] = 1.; t[0] = 1.; idum = *lwork - m * m - 2; if (*n2 > 1) { _starpu_dlagv2_(&a[*j1 + *j1 * a_dim1], lda, &b[*j1 + *j1 * b_dim1], ldb, ar, ai, be, &work[1], &work[2], t, &t[1]); work[m + 1] = -work[2]; work[m + 2] = work[1]; t[*n2 + (*n2 << 2) - 5] = t[0]; t[4] = -t[1]; } work[m * m] = 1.; t[m + (m << 2) - 5] = 1.; if (*n1 > 1) { _starpu_dlagv2_(&a[*j1 + *n2 + (*j1 + *n2) * a_dim1], lda, &b[*j1 + *n2 + (*j1 + *n2) * b_dim1], ldb, taur, taul, &work[m * m + 1], &work[*n2 * m + *n2 + 1], &work[*n2 * m + *n2 + 2], &t[* n2 + 1 + (*n2 + 1 << 2) - 5], &t[m + (m - 1 << 2) - 5]); work[m * m] = work[*n2 * m + *n2 + 1]; work[m * m - 1] = -work[*n2 * m + *n2 + 2]; t[m + (m << 2) - 5] = t[*n2 + 1 + (*n2 + 1 << 2) - 5]; t[m - 1 + (m << 2) - 5] = -t[m + (m - 1 << 2) - 5]; } _starpu_dgemm_("T", "N", n2, n1, n2, &c_b42, &work[1], &m, &a[*j1 + (*j1 + * n2) * a_dim1], lda, &c_b5, &work[m * m + 1], n2); _starpu_dlacpy_("Full", n2, n1, &work[m * m + 1], n2, &a[*j1 + (*j1 + *n2) * a_dim1], lda); _starpu_dgemm_("T", "N", n2, n1, n2, &c_b42, &work[1], &m, &b[*j1 + (*j1 + * n2) * b_dim1], ldb, &c_b5, &work[m * m + 1], n2); _starpu_dlacpy_("Full", n2, n1, &work[m * m + 1], n2, &b[*j1 + (*j1 + *n2) * b_dim1], ldb); _starpu_dgemm_("N", "N", &m, &m, &m, &c_b42, li, &c__4, &work[1], &m, &c_b5, & work[m * m + 1], &m); _starpu_dlacpy_("Full", &m, &m, &work[m * m + 1], &m, li, &c__4); _starpu_dgemm_("N", "N", n2, n1, n1, &c_b42, &a[*j1 + (*j1 + *n2) * a_dim1], lda, &t[*n2 + 1 + (*n2 + 1 << 2) - 5], &c__4, &c_b5, &work[1], n2); _starpu_dlacpy_("Full", n2, n1, &work[1], n2, &a[*j1 + (*j1 + *n2) * a_dim1], lda); _starpu_dgemm_("N", "N", n2, n1, n1, &c_b42, &b[*j1 + (*j1 + *n2) * b_dim1], ldb, &t[*n2 + 1 + (*n2 + 1 << 2) - 5], &c__4, &c_b5, &work[1], n2); _starpu_dlacpy_("Full", n2, n1, &work[1], n2, &b[*j1 + (*j1 + *n2) * b_dim1], ldb); _starpu_dgemm_("T", "N", &m, &m, &m, &c_b42, ir, &c__4, t, &c__4, &c_b5, & work[1], &m); _starpu_dlacpy_("Full", &m, &m, &work[1], &m, ir, &c__4); /* Accumulate transformations into Q and Z if requested. */ if (*wantq) { _starpu_dgemm_("N", "N", n, &m, &m, &c_b42, &q[*j1 * q_dim1 + 1], ldq, li, &c__4, &c_b5, &work[1], n); _starpu_dlacpy_("Full", n, &m, &work[1], n, &q[*j1 * q_dim1 + 1], ldq); } if (*wantz) { _starpu_dgemm_("N", "N", n, &m, &m, &c_b42, &z__[*j1 * z_dim1 + 1], ldz, ir, &c__4, &c_b5, &work[1], n); _starpu_dlacpy_("Full", n, &m, &work[1], n, &z__[*j1 * z_dim1 + 1], ldz); } /* Update (A(J1:J1+M-1, M+J1:N), B(J1:J1+M-1, M+J1:N)) and */ /* (A(1:J1-1, J1:J1+M), B(1:J1-1, J1:J1+M)). */ i__ = *j1 + m; if (i__ <= *n) { i__1 = *n - i__ + 1; _starpu_dgemm_("T", "N", &m, &i__1, &m, &c_b42, li, &c__4, &a[*j1 + i__ * a_dim1], lda, &c_b5, &work[1], &m); i__1 = *n - i__ + 1; _starpu_dlacpy_("Full", &m, &i__1, &work[1], &m, &a[*j1 + i__ * a_dim1], lda); i__1 = *n - i__ + 1; _starpu_dgemm_("T", "N", &m, &i__1, &m, &c_b42, li, &c__4, &b[*j1 + i__ * b_dim1], lda, &c_b5, &work[1], &m); i__1 = *n - i__ + 1; _starpu_dlacpy_("Full", &m, &i__1, &work[1], &m, &b[*j1 + i__ * b_dim1], ldb); } i__ = *j1 - 1; if (i__ > 0) { _starpu_dgemm_("N", "N", &i__, &m, &m, &c_b42, &a[*j1 * a_dim1 + 1], lda, ir, &c__4, &c_b5, &work[1], &i__); _starpu_dlacpy_("Full", &i__, &m, &work[1], &i__, &a[*j1 * a_dim1 + 1], lda); _starpu_dgemm_("N", "N", &i__, &m, &m, &c_b42, &b[*j1 * b_dim1 + 1], ldb, ir, &c__4, &c_b5, &work[1], &i__); _starpu_dlacpy_("Full", &i__, &m, &work[1], &i__, &b[*j1 * b_dim1 + 1], ldb); } /* Exit with INFO = 0 if swap was successfully performed. */ return 0; } /* Exit with INFO = 1 if swap was rejected. */ L70: *info = 1; return 0; /* End of DTGEX2 */ } /* _starpu_dtgex2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgexc.c000066400000000000000000000336131413463044200206320ustar00rootroot00000000000000/* dtgexc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dtgexc_(logical *wantq, logical *wantz, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * q, integer *ldq, doublereal *z__, integer *ldz, integer *ifst, integer *ilst, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, z_dim1, z_offset, i__1; /* Local variables */ integer nbf, nbl, here, lwmin; extern /* Subroutine */ int _starpu_dtgex2_(logical *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); integer nbnext; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGEXC reorders the generalized real Schur decomposition of a real */ /* matrix pair (A,B) using an orthogonal equivalence transformation */ /* (A, B) = Q * (A, B) * Z', */ /* so that the diagonal block of (A, B) with row index IFST is moved */ /* to row ILST. */ /* (A, B) must be in generalized real Schur canonical form (as returned */ /* by DGGES), i.e. A is block upper triangular with 1-by-1 and 2-by-2 */ /* diagonal blocks. B is upper triangular. */ /* Optionally, the matrices Q and Z of generalized Schur vectors are */ /* updated. */ /* Q(in) * A(in) * Z(in)' = Q(out) * A(out) * Z(out)' */ /* Q(in) * B(in) * Z(in)' = Q(out) * B(out) * Z(out)' */ /* Arguments */ /* ========= */ /* WANTQ (input) LOGICAL */ /* .TRUE. : update the left transformation matrix Q; */ /* .FALSE.: do not update Q. */ /* WANTZ (input) LOGICAL */ /* .TRUE. : update the right transformation matrix Z; */ /* .FALSE.: do not update Z. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the matrix A in generalized real Schur canonical */ /* form. */ /* On exit, the updated matrix A, again in generalized */ /* real Schur canonical form. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the matrix B in generalized real Schur canonical */ /* form (A,B). */ /* On exit, the updated matrix B, again in generalized */ /* real Schur canonical form (A,B). */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* On entry, if WANTQ = .TRUE., the orthogonal matrix Q. */ /* On exit, the updated matrix Q. */ /* If WANTQ = .FALSE., Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= 1. */ /* If WANTQ = .TRUE., LDQ >= N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* On entry, if WANTZ = .TRUE., the orthogonal matrix Z. */ /* On exit, the updated matrix Z. */ /* If WANTZ = .FALSE., Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1. */ /* If WANTZ = .TRUE., LDZ >= N. */ /* IFST (input/output) INTEGER */ /* ILST (input/output) INTEGER */ /* Specify the reordering of the diagonal blocks of (A, B). */ /* The block with row index IFST is moved to row ILST, by a */ /* sequence of swapping between adjacent blocks. */ /* On exit, if IFST pointed on entry to the second row of */ /* a 2-by-2 block, it is changed to point to the first row; */ /* ILST always points to the first row of the block in its */ /* final position (which may differ from its input value by */ /* +1 or -1). 1 <= IFST, ILST <= N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* LWORK >= 1 when N <= 1, otherwise LWORK >= 4*N + 16. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* =0: successful exit. */ /* <0: if INFO = -i, the i-th argument had an illegal value. */ /* =1: The transformed matrix pair (A, B) would be too far */ /* from generalized Schur form; the problem is ill- */ /* conditioned. (A, B) may have been partially reordered, */ /* and ILST points to the first row of the current */ /* position of the block being moved. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* [1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the */ /* Generalized Real Schur Form of a Regular Matrix Pair (A, B), in */ /* M.S. Moonen et al (eds), Linear Algebra for Large Scale and */ /* Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test input arguments. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -7; } else if (*ldq < 1 || *wantq && *ldq < max(1,*n)) { *info = -9; } else if (*ldz < 1 || *wantz && *ldz < max(1,*n)) { *info = -11; } else if (*ifst < 1 || *ifst > *n) { *info = -12; } else if (*ilst < 1 || *ilst > *n) { *info = -13; } if (*info == 0) { if (*n <= 1) { lwmin = 1; } else { lwmin = (*n << 2) + 16; } work[1] = (doublereal) lwmin; if (*lwork < lwmin && ! lquery) { *info = -15; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGEXC", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n <= 1) { return 0; } /* Determine the first row of the specified block and find out */ /* if it is 1-by-1 or 2-by-2. */ if (*ifst > 1) { if (a[*ifst + (*ifst - 1) * a_dim1] != 0.) { --(*ifst); } } nbf = 1; if (*ifst < *n) { if (a[*ifst + 1 + *ifst * a_dim1] != 0.) { nbf = 2; } } /* Determine the first row of the final block */ /* and find out if it is 1-by-1 or 2-by-2. */ if (*ilst > 1) { if (a[*ilst + (*ilst - 1) * a_dim1] != 0.) { --(*ilst); } } nbl = 1; if (*ilst < *n) { if (a[*ilst + 1 + *ilst * a_dim1] != 0.) { nbl = 2; } } if (*ifst == *ilst) { return 0; } if (*ifst < *ilst) { /* Update ILST. */ if (nbf == 2 && nbl == 1) { --(*ilst); } if (nbf == 1 && nbl == 2) { ++(*ilst); } here = *ifst; L10: /* Swap with next one below. */ if (nbf == 1 || nbf == 2) { /* Current block either 1-by-1 or 2-by-2. */ nbnext = 1; if (here + nbf + 1 <= *n) { if (a[here + nbf + 1 + (here + nbf) * a_dim1] != 0.) { nbnext = 2; } } _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[ q_offset], ldq, &z__[z_offset], ldz, &here, &nbf, &nbnext, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } here += nbnext; /* Test if 2-by-2 block breaks into two 1-by-1 blocks. */ if (nbf == 2) { if (a[here + 1 + here * a_dim1] == 0.) { nbf = 3; } } } else { /* Current block consists of two 1-by-1 blocks, each of which */ /* must be swapped individually. */ nbnext = 1; if (here + 3 <= *n) { if (a[here + 3 + (here + 2) * a_dim1] != 0.) { nbnext = 2; } } i__1 = here + 1; _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[ q_offset], ldq, &z__[z_offset], ldz, &i__1, &c__1, & nbnext, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } if (nbnext == 1) { /* Swap two 1-by-1 blocks. */ _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, &here, &c__1, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } ++here; } else { /* Recompute NBNEXT in case of 2-by-2 split. */ if (a[here + 2 + (here + 1) * a_dim1] == 0.) { nbnext = 1; } if (nbnext == 2) { /* 2-by-2 block did not split. */ _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, & here, &c__1, &nbnext, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } here += 2; } else { /* 2-by-2 block did split. */ _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, & here, &c__1, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } ++here; _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, & here, &c__1, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } ++here; } } } if (here < *ilst) { goto L10; } } else { here = *ifst; L20: /* Swap with next one below. */ if (nbf == 1 || nbf == 2) { /* Current block either 1-by-1 or 2-by-2. */ nbnext = 1; if (here >= 3) { if (a[here - 1 + (here - 2) * a_dim1] != 0.) { nbnext = 2; } } i__1 = here - nbnext; _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[ q_offset], ldq, &z__[z_offset], ldz, &i__1, &nbnext, &nbf, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } here -= nbnext; /* Test if 2-by-2 block breaks into two 1-by-1 blocks. */ if (nbf == 2) { if (a[here + 1 + here * a_dim1] == 0.) { nbf = 3; } } } else { /* Current block consists of two 1-by-1 blocks, each of which */ /* must be swapped individually. */ nbnext = 1; if (here >= 3) { if (a[here - 1 + (here - 2) * a_dim1] != 0.) { nbnext = 2; } } i__1 = here - nbnext; _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[ q_offset], ldq, &z__[z_offset], ldz, &i__1, &nbnext, & c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } if (nbnext == 1) { /* Swap two 1-by-1 blocks. */ _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, &here, & nbnext, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } --here; } else { /* Recompute NBNEXT in case of 2-by-2 split. */ if (a[here + (here - 1) * a_dim1] == 0.) { nbnext = 1; } if (nbnext == 2) { /* 2-by-2 block did not split. */ i__1 = here - 1; _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, & i__1, &c__2, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } here += -2; } else { /* 2-by-2 block did split. */ _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, & here, &c__1, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } --here; _starpu_dtgex2_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, & here, &c__1, &c__1, &work[1], lwork, info); if (*info != 0) { *ilst = here; return 0; } --here; } } } if (here > *ilst) { goto L20; } } *ilst = here; work[1] = (doublereal) lwmin; return 0; /* End of DTGEXC */ } /* _starpu_dtgexc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgsen.c000066400000000000000000000676421413463044200206510ustar00rootroot00000000000000/* dtgsen.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; static doublereal c_b28 = 1.; /* Subroutine */ int _starpu_dtgsen_(integer *ijob, logical *wantq, logical *wantz, logical *select, integer *n, doublereal *a, integer *lda, doublereal * b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, integer *m, doublereal *pl, doublereal *pr, doublereal *dif, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, z_dim1, z_offset, i__1, i__2; doublereal d__1; /* Builtin functions */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ integer i__, k, n1, n2, kk, ks, mn2, ijb; doublereal eps; integer kase; logical pair; integer ierr; doublereal dsum; logical swap; extern /* Subroutine */ int _starpu_dlag2_(doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); integer isave[3]; logical wantd; integer lwmin; logical wantp; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); logical wantd1, wantd2; extern doublereal _starpu_dlamch_(char *); doublereal dscale, rdscal; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dtgexc_(logical *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, integer *), _starpu_dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); integer liwmin; extern /* Subroutine */ int _starpu_dtgsyl_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *); doublereal smlnum; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* January 2007 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGSEN reorders the generalized real Schur decomposition of a real */ /* matrix pair (A, B) (in terms of an orthonormal equivalence trans- */ /* formation Q' * (A, B) * Z), so that a selected cluster of eigenvalues */ /* appears in the leading diagonal blocks of the upper quasi-triangular */ /* matrix A and the upper triangular B. The leading columns of Q and */ /* Z form orthonormal bases of the corresponding left and right eigen- */ /* spaces (deflating subspaces). (A, B) must be in generalized real */ /* Schur canonical form (as returned by DGGES), i.e. A is block upper */ /* triangular with 1-by-1 and 2-by-2 diagonal blocks. B is upper */ /* triangular. */ /* DTGSEN also computes the generalized eigenvalues */ /* w(j) = (ALPHAR(j) + i*ALPHAI(j))/BETA(j) */ /* of the reordered matrix pair (A, B). */ /* Optionally, DTGSEN computes the estimates of reciprocal condition */ /* numbers for eigenvalues and eigenspaces. These are Difu[(A11,B11), */ /* (A22,B22)] and Difl[(A11,B11), (A22,B22)], i.e. the separation(s) */ /* between the matrix pairs (A11, B11) and (A22,B22) that correspond to */ /* the selected cluster and the eigenvalues outside the cluster, resp., */ /* and norms of "projections" onto left and right eigenspaces w.r.t. */ /* the selected cluster in the (1,1)-block. */ /* Arguments */ /* ========= */ /* IJOB (input) INTEGER */ /* Specifies whether condition numbers are required for the */ /* cluster of eigenvalues (PL and PR) or the deflating subspaces */ /* (Difu and Difl): */ /* =0: Only reorder w.r.t. SELECT. No extras. */ /* =1: Reciprocal of norms of "projections" onto left and right */ /* eigenspaces w.r.t. the selected cluster (PL and PR). */ /* =2: Upper bounds on Difu and Difl. F-norm-based estimate */ /* (DIF(1:2)). */ /* =3: Estimate of Difu and Difl. 1-norm-based estimate */ /* (DIF(1:2)). */ /* About 5 times as expensive as IJOB = 2. */ /* =4: Compute PL, PR and DIF (i.e. 0, 1 and 2 above): Economic */ /* version to get it all. */ /* =5: Compute PL, PR and DIF (i.e. 0, 1 and 3 above) */ /* WANTQ (input) LOGICAL */ /* .TRUE. : update the left transformation matrix Q; */ /* .FALSE.: do not update Q. */ /* WANTZ (input) LOGICAL */ /* .TRUE. : update the right transformation matrix Z; */ /* .FALSE.: do not update Z. */ /* SELECT (input) LOGICAL array, dimension (N) */ /* SELECT specifies the eigenvalues in the selected cluster. */ /* To select a real eigenvalue w(j), SELECT(j) must be set to */ /* .TRUE.. To select a complex conjugate pair of eigenvalues */ /* w(j) and w(j+1), corresponding to a 2-by-2 diagonal block, */ /* either SELECT(j) or SELECT(j+1) or both must be set to */ /* .TRUE.; a complex conjugate pair of eigenvalues must be */ /* either both included in the cluster or both excluded. */ /* N (input) INTEGER */ /* The order of the matrices A and B. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension(LDA,N) */ /* On entry, the upper quasi-triangular matrix A, with (A, B) in */ /* generalized real Schur canonical form. */ /* On exit, A is overwritten by the reordered matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension(LDB,N) */ /* On entry, the upper triangular matrix B, with (A, B) in */ /* generalized real Schur canonical form. */ /* On exit, B is overwritten by the reordered matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */ /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will */ /* be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i */ /* and BETA(j),j=1,...,N are the diagonals of the complex Schur */ /* form (S,T) that would result if the 2-by-2 diagonal blocks of */ /* the real generalized Schur form of (A,B) were further reduced */ /* to triangular form using complex unitary transformations. */ /* If ALPHAI(j) is zero, then the j-th eigenvalue is real; if */ /* positive, then the j-th and (j+1)-st eigenvalues are a */ /* complex conjugate pair, with ALPHAI(j+1) negative. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, if WANTQ = .TRUE., Q is an N-by-N matrix. */ /* On exit, Q has been postmultiplied by the left orthogonal */ /* transformation matrix which reorder (A, B); The leading M */ /* columns of Q form orthonormal bases for the specified pair of */ /* left eigenspaces (deflating subspaces). */ /* If WANTQ = .FALSE., Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= 1; */ /* and if WANTQ = .TRUE., LDQ >= N. */ /* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */ /* On entry, if WANTZ = .TRUE., Z is an N-by-N matrix. */ /* On exit, Z has been postmultiplied by the left orthogonal */ /* transformation matrix which reorder (A, B); The leading M */ /* columns of Z form orthonormal bases for the specified pair of */ /* left eigenspaces (deflating subspaces). */ /* If WANTZ = .FALSE., Z is not referenced. */ /* LDZ (input) INTEGER */ /* The leading dimension of the array Z. LDZ >= 1; */ /* If WANTZ = .TRUE., LDZ >= N. */ /* M (output) INTEGER */ /* The dimension of the specified pair of left and right eigen- */ /* spaces (deflating subspaces). 0 <= M <= N. */ /* PL (output) DOUBLE PRECISION */ /* PR (output) DOUBLE PRECISION */ /* If IJOB = 1, 4 or 5, PL, PR are lower bounds on the */ /* reciprocal of the norm of "projections" onto left and right */ /* eigenspaces with respect to the selected cluster. */ /* 0 < PL, PR <= 1. */ /* If M = 0 or M = N, PL = PR = 1. */ /* If IJOB = 0, 2 or 3, PL and PR are not referenced. */ /* DIF (output) DOUBLE PRECISION array, dimension (2). */ /* If IJOB >= 2, DIF(1:2) store the estimates of Difu and Difl. */ /* If IJOB = 2 or 4, DIF(1:2) are F-norm-based upper bounds on */ /* Difu and Difl. If IJOB = 3 or 5, DIF(1:2) are 1-norm-based */ /* estimates of Difu and Difl. */ /* If M = 0 or N, DIF(1:2) = F-norm([A, B]). */ /* If IJOB = 0 or 1, DIF is not referenced. */ /* WORK (workspace/output) DOUBLE PRECISION array, */ /* dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= 4*N+16. */ /* If IJOB = 1, 2 or 4, LWORK >= MAX(4*N+16, 2*M*(N-M)). */ /* If IJOB = 3 or 5, LWORK >= MAX(4*N+16, 4*M*(N-M)). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) */ /* IF IJOB = 0, IWORK is not referenced. Otherwise, */ /* on exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. LIWORK >= 1. */ /* If IJOB = 1, 2 or 4, LIWORK >= N+6. */ /* If IJOB = 3 or 5, LIWORK >= MAX(2*M*(N-M), N+6). */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal size of the IWORK array, */ /* returns this value as the first entry of the IWORK array, and */ /* no error message related to LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* =0: Successful exit. */ /* <0: If INFO = -i, the i-th argument had an illegal value. */ /* =1: Reordering of (A, B) failed because the transformed */ /* matrix pair (A, B) would be too far from generalized */ /* Schur form; the problem is very ill-conditioned. */ /* (A, B) may have been partially reordered. */ /* If requested, 0 is returned in DIF(*), PL and PR. */ /* Further Details */ /* =============== */ /* DTGSEN first collects the selected eigenvalues by computing */ /* orthogonal U and W that move them to the top left corner of (A, B). */ /* In other words, the selected eigenvalues are the eigenvalues of */ /* (A11, B11) in: */ /* U'*(A, B)*W = (A11 A12) (B11 B12) n1 */ /* ( 0 A22),( 0 B22) n2 */ /* n1 n2 n1 n2 */ /* where N = n1+n2 and U' means the transpose of U. The first n1 columns */ /* of U and W span the specified pair of left and right eigenspaces */ /* (deflating subspaces) of (A, B). */ /* If (A, B) has been obtained from the generalized real Schur */ /* decomposition of a matrix pair (C, D) = Q*(A, B)*Z', then the */ /* reordered generalized real Schur form of (C, D) is given by */ /* (C, D) = (Q*U)*(U'*(A, B)*W)*(Z*W)', */ /* and the first n1 columns of Q*U and Z*W span the corresponding */ /* deflating subspaces of (C, D) (Q and Z store Q*U and Z*W, resp.). */ /* Note that if the selected eigenvalue is sufficiently ill-conditioned, */ /* then its value may differ significantly from its value before */ /* reordering. */ /* The reciprocal condition numbers of the left and right eigenspaces */ /* spanned by the first n1 columns of U and W (or Q*U and Z*W) may */ /* be returned in DIF(1:2), corresponding to Difu and Difl, resp. */ /* The Difu and Difl are defined as: */ /* Difu[(A11, B11), (A22, B22)] = sigma-min( Zu ) */ /* and */ /* Difl[(A11, B11), (A22, B22)] = Difu[(A22, B22), (A11, B11)], */ /* where sigma-min(Zu) is the smallest singular value of the */ /* (2*n1*n2)-by-(2*n1*n2) matrix */ /* Zu = [ kron(In2, A11) -kron(A22', In1) ] */ /* [ kron(In2, B11) -kron(B22', In1) ]. */ /* Here, Inx is the identity matrix of size nx and A22' is the */ /* transpose of A22. kron(X, Y) is the Kronecker product between */ /* the matrices X and Y. */ /* When DIF(2) is small, small changes in (A, B) can cause large changes */ /* in the deflating subspace. An approximate (asymptotic) bound on the */ /* maximum angular error in the computed deflating subspaces is */ /* EPS * norm((A, B)) / DIF(2), */ /* where EPS is the machine precision. */ /* The reciprocal norm of the projectors on the left and right */ /* eigenspaces associated with (A11, B11) may be returned in PL and PR. */ /* They are computed as follows. First we compute L and R so that */ /* P*(A, B)*Q is block diagonal, where */ /* P = ( I -L ) n1 Q = ( I R ) n1 */ /* ( 0 I ) n2 and ( 0 I ) n2 */ /* n1 n2 n1 n2 */ /* and (L, R) is the solution to the generalized Sylvester equation */ /* A11*R - L*A22 = -A12 */ /* B11*R - L*B22 = -B12 */ /* Then PL = (F-norm(L)**2+1)**(-1/2) and PR = (F-norm(R)**2+1)**(-1/2). */ /* An approximate (asymptotic) bound on the average absolute error of */ /* the selected eigenvalues is */ /* EPS * norm((A, B)) / PL. */ /* There are also global error bounds which valid for perturbations up */ /* to a certain restriction: A lower bound (x) on the smallest */ /* F-norm(E,F) for which an eigenvalue of (A11, B11) may move and */ /* coalesce with an eigenvalue of (A22, B22) under perturbation (E,F), */ /* (i.e. (A + E, B + F), is */ /* x = min(Difu,Difl)/((1/(PL*PL)+1/(PR*PR))**(1/2)+2*max(1/PL,1/PR)). */ /* An approximate bound on x can be computed from DIF(1:2), PL and PR. */ /* If y = ( F-norm(E,F) / x) <= 1, the angles between the perturbed */ /* (L', R') and unperturbed (L, R) left and right deflating subspaces */ /* associated with the selected cluster in the (1,1)-blocks can be */ /* bounded as */ /* max-angle(L, L') <= arctan( y * PL / (1 - y * (1 - PL * PL)**(1/2)) */ /* max-angle(R, R') <= arctan( y * PR / (1 - y * (1 - PR * PR)**(1/2)) */ /* See LAPACK User's Guide section 4.11 or the following references */ /* for more information. */ /* Note that if the default method for computing the Frobenius-norm- */ /* based estimate DIF is not wanted (see DLATDF), then the parameter */ /* IDIFJB (see below) should be changed from 3 to 4 (routine DLATDF */ /* (IJOB = 2 will be used)). See DTGSYL for more details. */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* References */ /* ========== */ /* [1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the */ /* Generalized Real Schur Form of a Regular Matrix Pair (A, B), in */ /* M.S. Moonen et al (eds), Linear Algebra for Large Scale and */ /* Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218. */ /* [2] B. Kagstrom and P. Poromaa; Computing Eigenspaces with Specified */ /* Eigenvalues of a Regular Matrix Pair (A, B) and Condition */ /* Estimation: Theory, Algorithms and Software, */ /* Report UMINF - 94.04, Department of Computing Science, Umea */ /* University, S-901 87 Umea, Sweden, 1994. Also as LAPACK Working */ /* Note 87. To appear in Numerical Algorithms, 1996. */ /* [3] B. Kagstrom and P. Poromaa, LAPACK-Style Algorithms and Software */ /* for Solving the Generalized Sylvester Equation and Estimating the */ /* Separation between Regular Matrix Pairs, Report UMINF - 93.23, */ /* Department of Computing Science, Umea University, S-901 87 Umea, */ /* Sweden, December 1993, Revised April 1994, Also as LAPACK Working */ /* Note 75. To appear in ACM Trans. on Math. Software, Vol 22, No 1, */ /* 1996. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters */ /* Parameter adjustments */ --select; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alphar; --alphai; --beta; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --dif; --work; --iwork; /* Function Body */ *info = 0; lquery = *lwork == -1 || *liwork == -1; if (*ijob < 0 || *ijob > 5) { *info = -1; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldq < 1 || *wantq && *ldq < *n) { *info = -14; } else if (*ldz < 1 || *wantz && *ldz < *n) { *info = -16; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGSEN", &i__1); return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; ierr = 0; wantp = *ijob == 1 || *ijob >= 4; wantd1 = *ijob == 2 || *ijob == 4; wantd2 = *ijob == 3 || *ijob == 5; wantd = wantd1 || wantd2; /* Set M to the dimension of the specified pair of deflating */ /* subspaces. */ *m = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { if (k < *n) { if (a[k + 1 + k * a_dim1] == 0.) { if (select[k]) { ++(*m); } } else { pair = TRUE_; if (select[k] || select[k + 1]) { *m += 2; } } } else { if (select[*n]) { ++(*m); } } } /* L10: */ } if (*ijob == 1 || *ijob == 2 || *ijob == 4) { /* Computing MAX */ i__1 = 1, i__2 = (*n << 2) + 16, i__1 = max(i__1,i__2), i__2 = (*m << 1) * (*n - *m); lwmin = max(i__1,i__2); /* Computing MAX */ i__1 = 1, i__2 = *n + 6; liwmin = max(i__1,i__2); } else if (*ijob == 3 || *ijob == 5) { /* Computing MAX */ i__1 = 1, i__2 = (*n << 2) + 16, i__1 = max(i__1,i__2), i__2 = (*m << 2) * (*n - *m); lwmin = max(i__1,i__2); /* Computing MAX */ i__1 = 1, i__2 = (*m << 1) * (*n - *m), i__1 = max(i__1,i__2), i__2 = *n + 6; liwmin = max(i__1,i__2); } else { /* Computing MAX */ i__1 = 1, i__2 = (*n << 2) + 16; lwmin = max(i__1,i__2); liwmin = 1; } work[1] = (doublereal) lwmin; iwork[1] = liwmin; if (*lwork < lwmin && ! lquery) { *info = -22; } else if (*liwork < liwmin && ! lquery) { *info = -24; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGSEN", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible. */ if (*m == *n || *m == 0) { if (wantp) { *pl = 1.; *pr = 1.; } if (wantd) { dscale = 0.; dsum = 1.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { _starpu_dlassq_(n, &a[i__ * a_dim1 + 1], &c__1, &dscale, &dsum); _starpu_dlassq_(n, &b[i__ * b_dim1 + 1], &c__1, &dscale, &dsum); /* L20: */ } dif[1] = dscale * sqrt(dsum); dif[2] = dif[1]; } goto L60; } /* Collect the selected blocks at the top-left corner of (A, B). */ ks = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { swap = select[k]; if (k < *n) { if (a[k + 1 + k * a_dim1] != 0.) { pair = TRUE_; swap = swap || select[k + 1]; } } if (swap) { ++ks; /* Swap the K-th block to position KS. */ /* Perform the reordering of diagonal blocks in (A, B) */ /* by orthogonal transformation matrices and update */ /* Q and Z accordingly (if requested): */ kk = k; if (k != ks) { _starpu_dtgexc_(wantq, wantz, n, &a[a_offset], lda, &b[b_offset], ldb, &q[q_offset], ldq, &z__[z_offset], ldz, &kk, &ks, &work[1], lwork, &ierr); } if (ierr > 0) { /* Swap is rejected: exit. */ *info = 1; if (wantp) { *pl = 0.; *pr = 0.; } if (wantd) { dif[1] = 0.; dif[2] = 0.; } goto L60; } if (pair) { ++ks; } } } /* L30: */ } if (wantp) { /* Solve generalized Sylvester equation for R and L */ /* and compute PL and PR. */ n1 = *m; n2 = *n - *m; i__ = n1 + 1; ijb = 0; _starpu_dlacpy_("Full", &n1, &n2, &a[i__ * a_dim1 + 1], lda, &work[1], &n1); _starpu_dlacpy_("Full", &n1, &n2, &b[i__ * b_dim1 + 1], ldb, &work[n1 * n2 + 1], &n1); i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("N", &ijb, &n1, &n2, &a[a_offset], lda, &a[i__ + i__ * a_dim1] , lda, &work[1], &n1, &b[b_offset], ldb, &b[i__ + i__ * b_dim1], ldb, &work[n1 * n2 + 1], &n1, &dscale, &dif[1], & work[(n1 * n2 << 1) + 1], &i__1, &iwork[1], &ierr); /* Estimate the reciprocal of norms of "projections" onto left */ /* and right eigenspaces. */ rdscal = 0.; dsum = 1.; i__1 = n1 * n2; _starpu_dlassq_(&i__1, &work[1], &c__1, &rdscal, &dsum); *pl = rdscal * sqrt(dsum); if (*pl == 0.) { *pl = 1.; } else { *pl = dscale / (sqrt(dscale * dscale / *pl + *pl) * sqrt(*pl)); } rdscal = 0.; dsum = 1.; i__1 = n1 * n2; _starpu_dlassq_(&i__1, &work[n1 * n2 + 1], &c__1, &rdscal, &dsum); *pr = rdscal * sqrt(dsum); if (*pr == 0.) { *pr = 1.; } else { *pr = dscale / (sqrt(dscale * dscale / *pr + *pr) * sqrt(*pr)); } } if (wantd) { /* Compute estimates of Difu and Difl. */ if (wantd1) { n1 = *m; n2 = *n - *m; i__ = n1 + 1; ijb = 3; /* Frobenius norm-based Difu-estimate. */ i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("N", &ijb, &n1, &n2, &a[a_offset], lda, &a[i__ + i__ * a_dim1], lda, &work[1], &n1, &b[b_offset], ldb, &b[i__ + i__ * b_dim1], ldb, &work[n1 * n2 + 1], &n1, &dscale, & dif[1], &work[(n1 << 1) * n2 + 1], &i__1, &iwork[1], & ierr); /* Frobenius norm-based Difl-estimate. */ i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("N", &ijb, &n2, &n1, &a[i__ + i__ * a_dim1], lda, &a[ a_offset], lda, &work[1], &n2, &b[i__ + i__ * b_dim1], ldb, &b[b_offset], ldb, &work[n1 * n2 + 1], &n2, &dscale, &dif[2], &work[(n1 << 1) * n2 + 1], &i__1, &iwork[1], & ierr); } else { /* Compute 1-norm-based estimates of Difu and Difl using */ /* reversed communication with DLACN2. In each step a */ /* generalized Sylvester equation or a transposed variant */ /* is solved. */ kase = 0; n1 = *m; n2 = *n - *m; i__ = n1 + 1; ijb = 0; mn2 = (n1 << 1) * n2; /* 1-norm-based estimate of Difu. */ L40: _starpu_dlacn2_(&mn2, &work[mn2 + 1], &work[1], &iwork[1], &dif[1], &kase, isave); if (kase != 0) { if (kase == 1) { /* Solve generalized Sylvester equation. */ i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("N", &ijb, &n1, &n2, &a[a_offset], lda, &a[i__ + i__ * a_dim1], lda, &work[1], &n1, &b[b_offset], ldb, &b[i__ + i__ * b_dim1], ldb, &work[n1 * n2 + 1], &n1, &dscale, &dif[1], &work[(n1 << 1) * n2 + 1], &i__1, &iwork[1], &ierr); } else { /* Solve the transposed variant. */ i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("T", &ijb, &n1, &n2, &a[a_offset], lda, &a[i__ + i__ * a_dim1], lda, &work[1], &n1, &b[b_offset], ldb, &b[i__ + i__ * b_dim1], ldb, &work[n1 * n2 + 1], &n1, &dscale, &dif[1], &work[(n1 << 1) * n2 + 1], &i__1, &iwork[1], &ierr); } goto L40; } dif[1] = dscale / dif[1]; /* 1-norm-based estimate of Difl. */ L50: _starpu_dlacn2_(&mn2, &work[mn2 + 1], &work[1], &iwork[1], &dif[2], &kase, isave); if (kase != 0) { if (kase == 1) { /* Solve generalized Sylvester equation. */ i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("N", &ijb, &n2, &n1, &a[i__ + i__ * a_dim1], lda, &a[a_offset], lda, &work[1], &n2, &b[i__ + i__ * b_dim1], ldb, &b[b_offset], ldb, &work[n1 * n2 + 1], &n2, &dscale, &dif[2], &work[(n1 << 1) * n2 + 1], &i__1, &iwork[1], &ierr); } else { /* Solve the transposed variant. */ i__1 = *lwork - (n1 << 1) * n2; _starpu_dtgsyl_("T", &ijb, &n2, &n1, &a[i__ + i__ * a_dim1], lda, &a[a_offset], lda, &work[1], &n2, &b[i__ + i__ * b_dim1], ldb, &b[b_offset], ldb, &work[n1 * n2 + 1], &n2, &dscale, &dif[2], &work[(n1 << 1) * n2 + 1], &i__1, &iwork[1], &ierr); } goto L50; } dif[2] = dscale / dif[2]; } } L60: /* Compute generalized eigenvalues of reordered pair (A, B) and */ /* normalize the generalized Schur form. */ pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { if (k < *n) { if (a[k + 1 + k * a_dim1] != 0.) { pair = TRUE_; } } if (pair) { /* Compute the eigenvalue(s) at position K. */ work[1] = a[k + k * a_dim1]; work[2] = a[k + 1 + k * a_dim1]; work[3] = a[k + (k + 1) * a_dim1]; work[4] = a[k + 1 + (k + 1) * a_dim1]; work[5] = b[k + k * b_dim1]; work[6] = b[k + 1 + k * b_dim1]; work[7] = b[k + (k + 1) * b_dim1]; work[8] = b[k + 1 + (k + 1) * b_dim1]; d__1 = smlnum * eps; _starpu_dlag2_(&work[1], &c__2, &work[5], &c__2, &d__1, &beta[k], & beta[k + 1], &alphar[k], &alphar[k + 1], &alphai[k]); alphai[k + 1] = -alphai[k]; } else { if (d_sign(&c_b28, &b[k + k * b_dim1]) < 0.) { /* If B(K,K) is negative, make it positive */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { a[k + i__ * a_dim1] = -a[k + i__ * a_dim1]; b[k + i__ * b_dim1] = -b[k + i__ * b_dim1]; if (*wantq) { q[i__ + k * q_dim1] = -q[i__ + k * q_dim1]; } /* L70: */ } } alphar[k] = a[k + k * a_dim1]; alphai[k] = 0.; beta[k] = b[k + k * b_dim1]; } } /* L80: */ } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DTGSEN */ } /* _starpu_dtgsen_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgsja.c000066400000000000000000000460001413463044200206220ustar00rootroot00000000000000/* dtgsja.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b13 = 0.; static doublereal c_b14 = 1.; static integer c__1 = 1; static doublereal c_b43 = -1.; /* Subroutine */ int _starpu_dtgsja_(char *jobu, char *jobv, char *jobq, integer *m, integer *p, integer *n, integer *k, integer *l, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *tola, doublereal *tolb, doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer * ldq, doublereal *work, integer *ncycle, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, u_dim1, u_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4; doublereal d__1; /* Local variables */ integer i__, j; doublereal a1, a2, a3, b1, b2, b3, csq, csu, csv, snq, rwk, snu, snv; extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); doublereal gamma; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical initq, initu, initv, wantq, upper; doublereal error, ssmin; logical wantu, wantv; extern /* Subroutine */ int _starpu_dlags2_(logical *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlapll_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *); integer kcycle; extern /* Subroutine */ int _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGSJA computes the generalized singular value decomposition (GSVD) */ /* of two real upper triangular (or trapezoidal) matrices A and B. */ /* On entry, it is assumed that matrices A and B have the following */ /* forms, which may be obtained by the preprocessing subroutine DGGSVP */ /* from a general M-by-N matrix A and P-by-N matrix B: */ /* N-K-L K L */ /* A = K ( 0 A12 A13 ) if M-K-L >= 0; */ /* L ( 0 0 A23 ) */ /* M-K-L ( 0 0 0 ) */ /* N-K-L K L */ /* A = K ( 0 A12 A13 ) if M-K-L < 0; */ /* M-K ( 0 0 A23 ) */ /* N-K-L K L */ /* B = L ( 0 0 B13 ) */ /* P-L ( 0 0 0 ) */ /* where the K-by-K matrix A12 and L-by-L matrix B13 are nonsingular */ /* upper triangular; A23 is L-by-L upper triangular if M-K-L >= 0, */ /* otherwise A23 is (M-K)-by-L upper trapezoidal. */ /* On exit, */ /* U'*A*Q = D1*( 0 R ), V'*B*Q = D2*( 0 R ), */ /* where U, V and Q are orthogonal matrices, Z' denotes the transpose */ /* of Z, R is a nonsingular upper triangular matrix, and D1 and D2 are */ /* ``diagonal'' matrices, which are of the following structures: */ /* If M-K-L >= 0, */ /* K L */ /* D1 = K ( I 0 ) */ /* L ( 0 C ) */ /* M-K-L ( 0 0 ) */ /* K L */ /* D2 = L ( 0 S ) */ /* P-L ( 0 0 ) */ /* N-K-L K L */ /* ( 0 R ) = K ( 0 R11 R12 ) K */ /* L ( 0 0 R22 ) L */ /* where */ /* C = diag( ALPHA(K+1), ... , ALPHA(K+L) ), */ /* S = diag( BETA(K+1), ... , BETA(K+L) ), */ /* C**2 + S**2 = I. */ /* R is stored in A(1:K+L,N-K-L+1:N) on exit. */ /* If M-K-L < 0, */ /* K M-K K+L-M */ /* D1 = K ( I 0 0 ) */ /* M-K ( 0 C 0 ) */ /* K M-K K+L-M */ /* D2 = M-K ( 0 S 0 ) */ /* K+L-M ( 0 0 I ) */ /* P-L ( 0 0 0 ) */ /* N-K-L K M-K K+L-M */ /* ( 0 R ) = K ( 0 R11 R12 R13 ) */ /* M-K ( 0 0 R22 R23 ) */ /* K+L-M ( 0 0 0 R33 ) */ /* where */ /* C = diag( ALPHA(K+1), ... , ALPHA(M) ), */ /* S = diag( BETA(K+1), ... , BETA(M) ), */ /* C**2 + S**2 = I. */ /* R = ( R11 R12 R13 ) is stored in A(1:M, N-K-L+1:N) and R33 is stored */ /* ( 0 R22 R23 ) */ /* in B(M-K+1:L,N+M-K-L+1:N) on exit. */ /* The computation of the orthogonal transformation matrices U, V or Q */ /* is optional. These matrices may either be formed explicitly, or they */ /* may be postmultiplied into input matrices U1, V1, or Q1. */ /* Arguments */ /* ========= */ /* JOBU (input) CHARACTER*1 */ /* = 'U': U must contain an orthogonal matrix U1 on entry, and */ /* the product U1*U is returned; */ /* = 'I': U is initialized to the unit matrix, and the */ /* orthogonal matrix U is returned; */ /* = 'N': U is not computed. */ /* JOBV (input) CHARACTER*1 */ /* = 'V': V must contain an orthogonal matrix V1 on entry, and */ /* the product V1*V is returned; */ /* = 'I': V is initialized to the unit matrix, and the */ /* orthogonal matrix V is returned; */ /* = 'N': V is not computed. */ /* JOBQ (input) CHARACTER*1 */ /* = 'Q': Q must contain an orthogonal matrix Q1 on entry, and */ /* the product Q1*Q is returned; */ /* = 'I': Q is initialized to the unit matrix, and the */ /* orthogonal matrix Q is returned; */ /* = 'N': Q is not computed. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* P (input) INTEGER */ /* The number of rows of the matrix B. P >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrices A and B. N >= 0. */ /* K (input) INTEGER */ /* L (input) INTEGER */ /* K and L specify the subblocks in the input matrices A and B: */ /* A23 = A(K+1:MIN(K+L,M),N-L+1:N) and B13 = B(1:L,N-L+1:N) */ /* of A and B, whose GSVD is going to be computed by DTGSJA. */ /* See Further details. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, A(N-K+1:N,1:MIN(K+L,M) ) contains the triangular */ /* matrix R or part of R. See Purpose for details. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,N) */ /* On entry, the P-by-N matrix B. */ /* On exit, if necessary, B(M-K+1:L,N+M-K-L+1:N) contains */ /* a part of R. See Purpose for details. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,P). */ /* TOLA (input) DOUBLE PRECISION */ /* TOLB (input) DOUBLE PRECISION */ /* TOLA and TOLB are the convergence criteria for the Jacobi- */ /* Kogbetliantz iteration procedure. Generally, they are the */ /* same as used in the preprocessing step, say */ /* TOLA = max(M,N)*norm(A)*MAZHEPS, */ /* TOLB = max(P,N)*norm(B)*MAZHEPS. */ /* ALPHA (output) DOUBLE PRECISION array, dimension (N) */ /* BETA (output) DOUBLE PRECISION array, dimension (N) */ /* On exit, ALPHA and BETA contain the generalized singular */ /* value pairs of A and B; */ /* ALPHA(1:K) = 1, */ /* BETA(1:K) = 0, */ /* and if M-K-L >= 0, */ /* ALPHA(K+1:K+L) = diag(C), */ /* BETA(K+1:K+L) = diag(S), */ /* or if M-K-L < 0, */ /* ALPHA(K+1:M)= C, ALPHA(M+1:K+L)= 0 */ /* BETA(K+1:M) = S, BETA(M+1:K+L) = 1. */ /* Furthermore, if K+L < N, */ /* ALPHA(K+L+1:N) = 0 and */ /* BETA(K+L+1:N) = 0. */ /* U (input/output) DOUBLE PRECISION array, dimension (LDU,M) */ /* On entry, if JOBU = 'U', U must contain a matrix U1 (usually */ /* the orthogonal matrix returned by DGGSVP). */ /* On exit, */ /* if JOBU = 'I', U contains the orthogonal matrix U; */ /* if JOBU = 'U', U contains the product U1*U. */ /* If JOBU = 'N', U is not referenced. */ /* LDU (input) INTEGER */ /* The leading dimension of the array U. LDU >= max(1,M) if */ /* JOBU = 'U'; LDU >= 1 otherwise. */ /* V (input/output) DOUBLE PRECISION array, dimension (LDV,P) */ /* On entry, if JOBV = 'V', V must contain a matrix V1 (usually */ /* the orthogonal matrix returned by DGGSVP). */ /* On exit, */ /* if JOBV = 'I', V contains the orthogonal matrix V; */ /* if JOBV = 'V', V contains the product V1*V. */ /* If JOBV = 'N', V is not referenced. */ /* LDV (input) INTEGER */ /* The leading dimension of the array V. LDV >= max(1,P) if */ /* JOBV = 'V'; LDV >= 1 otherwise. */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, if JOBQ = 'Q', Q must contain a matrix Q1 (usually */ /* the orthogonal matrix returned by DGGSVP). */ /* On exit, */ /* if JOBQ = 'I', Q contains the orthogonal matrix Q; */ /* if JOBQ = 'Q', Q contains the product Q1*Q. */ /* If JOBQ = 'N', Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N) if */ /* JOBQ = 'Q'; LDQ >= 1 otherwise. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (2*N) */ /* NCYCLE (output) INTEGER */ /* The number of cycles required for convergence. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value. */ /* = 1: the procedure does not converge after MAXIT cycles. */ /* Internal Parameters */ /* =================== */ /* MAXIT INTEGER */ /* MAXIT specifies the total loops that the iterative procedure */ /* may take. If after MAXIT cycles, the routine fails to */ /* converge, we return INFO = 1. */ /* Further Details */ /* =============== */ /* DTGSJA essentially uses a variant of Kogbetliantz algorithm to reduce */ /* min(L,M-K)-by-L triangular (or trapezoidal) matrix A23 and L-by-L */ /* matrix B13 to the form: */ /* U1'*A13*Q1 = C1*R1; V1'*B13*Q1 = S1*R1, */ /* where U1, V1 and Q1 are orthogonal matrix, and Z' is the transpose */ /* of Z. C1 and S1 are diagonal matrices satisfying */ /* C1**2 + S1**2 = I, */ /* and R1 is an L-by-L nonsingular upper triangular matrix. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; --alpha; --beta; u_dim1 = *ldu; u_offset = 1 + u_dim1; u -= u_offset; v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --work; /* Function Body */ initu = _starpu_lsame_(jobu, "I"); wantu = initu || _starpu_lsame_(jobu, "U"); initv = _starpu_lsame_(jobv, "I"); wantv = initv || _starpu_lsame_(jobv, "V"); initq = _starpu_lsame_(jobq, "I"); wantq = initq || _starpu_lsame_(jobq, "Q"); *info = 0; if (! (initu || wantu || _starpu_lsame_(jobu, "N"))) { *info = -1; } else if (! (initv || wantv || _starpu_lsame_(jobv, "N"))) { *info = -2; } else if (! (initq || wantq || _starpu_lsame_(jobq, "N"))) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*p < 0) { *info = -5; } else if (*n < 0) { *info = -6; } else if (*lda < max(1,*m)) { *info = -10; } else if (*ldb < max(1,*p)) { *info = -12; } else if (*ldu < 1 || wantu && *ldu < *m) { *info = -18; } else if (*ldv < 1 || wantv && *ldv < *p) { *info = -20; } else if (*ldq < 1 || wantq && *ldq < *n) { *info = -22; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGSJA", &i__1); return 0; } /* Initialize U, V and Q, if necessary */ if (initu) { _starpu_dlaset_("Full", m, m, &c_b13, &c_b14, &u[u_offset], ldu); } if (initv) { _starpu_dlaset_("Full", p, p, &c_b13, &c_b14, &v[v_offset], ldv); } if (initq) { _starpu_dlaset_("Full", n, n, &c_b13, &c_b14, &q[q_offset], ldq); } /* Loop until convergence */ upper = FALSE_; for (kcycle = 1; kcycle <= 40; ++kcycle) { upper = ! upper; i__1 = *l - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *l; for (j = i__ + 1; j <= i__2; ++j) { a1 = 0.; a2 = 0.; a3 = 0.; if (*k + i__ <= *m) { a1 = a[*k + i__ + (*n - *l + i__) * a_dim1]; } if (*k + j <= *m) { a3 = a[*k + j + (*n - *l + j) * a_dim1]; } b1 = b[i__ + (*n - *l + i__) * b_dim1]; b3 = b[j + (*n - *l + j) * b_dim1]; if (upper) { if (*k + i__ <= *m) { a2 = a[*k + i__ + (*n - *l + j) * a_dim1]; } b2 = b[i__ + (*n - *l + j) * b_dim1]; } else { if (*k + j <= *m) { a2 = a[*k + j + (*n - *l + i__) * a_dim1]; } b2 = b[j + (*n - *l + i__) * b_dim1]; } _starpu_dlags2_(&upper, &a1, &a2, &a3, &b1, &b2, &b3, &csu, &snu, & csv, &snv, &csq, &snq); /* Update (K+I)-th and (K+J)-th rows of matrix A: U'*A */ if (*k + j <= *m) { _starpu_drot_(l, &a[*k + j + (*n - *l + 1) * a_dim1], lda, &a[*k + i__ + (*n - *l + 1) * a_dim1], lda, &csu, &snu); } /* Update I-th and J-th rows of matrix B: V'*B */ _starpu_drot_(l, &b[j + (*n - *l + 1) * b_dim1], ldb, &b[i__ + (*n - * l + 1) * b_dim1], ldb, &csv, &snv); /* Update (N-L+I)-th and (N-L+J)-th columns of matrices */ /* A and B: A*Q and B*Q */ /* Computing MIN */ i__4 = *k + *l; i__3 = min(i__4,*m); _starpu_drot_(&i__3, &a[(*n - *l + j) * a_dim1 + 1], &c__1, &a[(*n - * l + i__) * a_dim1 + 1], &c__1, &csq, &snq); _starpu_drot_(l, &b[(*n - *l + j) * b_dim1 + 1], &c__1, &b[(*n - *l + i__) * b_dim1 + 1], &c__1, &csq, &snq); if (upper) { if (*k + i__ <= *m) { a[*k + i__ + (*n - *l + j) * a_dim1] = 0.; } b[i__ + (*n - *l + j) * b_dim1] = 0.; } else { if (*k + j <= *m) { a[*k + j + (*n - *l + i__) * a_dim1] = 0.; } b[j + (*n - *l + i__) * b_dim1] = 0.; } /* Update orthogonal matrices U, V, Q, if desired. */ if (wantu && *k + j <= *m) { _starpu_drot_(m, &u[(*k + j) * u_dim1 + 1], &c__1, &u[(*k + i__) * u_dim1 + 1], &c__1, &csu, &snu); } if (wantv) { _starpu_drot_(p, &v[j * v_dim1 + 1], &c__1, &v[i__ * v_dim1 + 1], &c__1, &csv, &snv); } if (wantq) { _starpu_drot_(n, &q[(*n - *l + j) * q_dim1 + 1], &c__1, &q[(*n - * l + i__) * q_dim1 + 1], &c__1, &csq, &snq); } /* L10: */ } /* L20: */ } if (! upper) { /* The matrices A13 and B13 were lower triangular at the start */ /* of the cycle, and are now upper triangular. */ /* Convergence test: test the parallelism of the corresponding */ /* rows of A and B. */ error = 0.; /* Computing MIN */ i__2 = *l, i__3 = *m - *k; i__1 = min(i__2,i__3); for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *l - i__ + 1; _starpu_dcopy_(&i__2, &a[*k + i__ + (*n - *l + i__) * a_dim1], lda, & work[1], &c__1); i__2 = *l - i__ + 1; _starpu_dcopy_(&i__2, &b[i__ + (*n - *l + i__) * b_dim1], ldb, &work[* l + 1], &c__1); i__2 = *l - i__ + 1; _starpu_dlapll_(&i__2, &work[1], &c__1, &work[*l + 1], &c__1, &ssmin); error = max(error,ssmin); /* L30: */ } if (abs(error) <= min(*tola,*tolb)) { goto L50; } } /* End of cycle loop */ /* L40: */ } /* The algorithm has not converged after MAXIT cycles. */ *info = 1; goto L100; L50: /* If ERROR <= MIN(TOLA,TOLB), then the algorithm has converged. */ /* Compute the generalized singular value pairs (ALPHA, BETA), and */ /* set the triangular matrix R to array A. */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { alpha[i__] = 1.; beta[i__] = 0.; /* L60: */ } /* Computing MIN */ i__2 = *l, i__3 = *m - *k; i__1 = min(i__2,i__3); for (i__ = 1; i__ <= i__1; ++i__) { a1 = a[*k + i__ + (*n - *l + i__) * a_dim1]; b1 = b[i__ + (*n - *l + i__) * b_dim1]; if (a1 != 0.) { gamma = b1 / a1; /* change sign if necessary */ if (gamma < 0.) { i__2 = *l - i__ + 1; _starpu_dscal_(&i__2, &c_b43, &b[i__ + (*n - *l + i__) * b_dim1], ldb) ; if (wantv) { _starpu_dscal_(p, &c_b43, &v[i__ * v_dim1 + 1], &c__1); } } d__1 = abs(gamma); _starpu_dlartg_(&d__1, &c_b14, &beta[*k + i__], &alpha[*k + i__], &rwk); if (alpha[*k + i__] >= beta[*k + i__]) { i__2 = *l - i__ + 1; d__1 = 1. / alpha[*k + i__]; _starpu_dscal_(&i__2, &d__1, &a[*k + i__ + (*n - *l + i__) * a_dim1], lda); } else { i__2 = *l - i__ + 1; d__1 = 1. / beta[*k + i__]; _starpu_dscal_(&i__2, &d__1, &b[i__ + (*n - *l + i__) * b_dim1], ldb); i__2 = *l - i__ + 1; _starpu_dcopy_(&i__2, &b[i__ + (*n - *l + i__) * b_dim1], ldb, &a[*k + i__ + (*n - *l + i__) * a_dim1], lda); } } else { alpha[*k + i__] = 0.; beta[*k + i__] = 1.; i__2 = *l - i__ + 1; _starpu_dcopy_(&i__2, &b[i__ + (*n - *l + i__) * b_dim1], ldb, &a[*k + i__ + (*n - *l + i__) * a_dim1], lda); } /* L70: */ } /* Post-assignment */ i__1 = *k + *l; for (i__ = *m + 1; i__ <= i__1; ++i__) { alpha[i__] = 0.; beta[i__] = 1.; /* L80: */ } if (*k + *l < *n) { i__1 = *n; for (i__ = *k + *l + 1; i__ <= i__1; ++i__) { alpha[i__] = 0.; beta[i__] = 0.; /* L90: */ } } L100: *ncycle = kcycle; return 0; /* End of DTGSJA */ } /* _starpu_dtgsja_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgsna.c000066400000000000000000000562531413463044200206410ustar00rootroot00000000000000/* dtgsna.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b19 = 1.; static doublereal c_b21 = 0.; static integer c__2 = 2; static logical c_false = FALSE_; static integer c__3 = 3; /* Subroutine */ int _starpu_dtgsna_(char *job, char *howmny, logical *select, integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *dif, integer *mm, integer *m, doublereal * work, integer *lwork, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, k; doublereal c1, c2; integer n1, n2, ks, iz; doublereal eps, beta, cond; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); logical pair; integer ierr; doublereal uhav, uhbv; integer ifst; doublereal lnrm; integer ilst; doublereal rnrm; extern /* Subroutine */ int _starpu_dlag2_(doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal root1, root2, scale; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal uhavi, uhbvi, tmpii; integer lwmin; logical wants; doublereal tmpir, tmpri, dummy[1], tmprr; extern doublereal _starpu_dlapy2_(doublereal *, doublereal *); doublereal dummy1[1]; extern doublereal _starpu_dlamch_(char *); doublereal alphai, alphar; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *), _starpu_dtgexc_(logical *, logical *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, integer *); logical wantbh, wantdf, somcon; doublereal alprqt; extern /* Subroutine */ int _starpu_dtgsyl_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *); doublereal smlnum; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGSNA estimates reciprocal condition numbers for specified */ /* eigenvalues and/or eigenvectors of a matrix pair (A, B) in */ /* generalized real Schur canonical form (or of any matrix pair */ /* (Q*A*Z', Q*B*Z') with orthogonal matrices Q and Z, where */ /* Z' denotes the transpose of Z. */ /* (A, B) must be in generalized real Schur form (as returned by DGGES), */ /* i.e. A is block upper triangular with 1-by-1 and 2-by-2 diagonal */ /* blocks. B is upper triangular. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies whether condition numbers are required for */ /* eigenvalues (S) or eigenvectors (DIF): */ /* = 'E': for eigenvalues only (S); */ /* = 'V': for eigenvectors only (DIF); */ /* = 'B': for both eigenvalues and eigenvectors (S and DIF). */ /* HOWMNY (input) CHARACTER*1 */ /* = 'A': compute condition numbers for all eigenpairs; */ /* = 'S': compute condition numbers for selected eigenpairs */ /* specified by the array SELECT. */ /* SELECT (input) LOGICAL array, dimension (N) */ /* If HOWMNY = 'S', SELECT specifies the eigenpairs for which */ /* condition numbers are required. To select condition numbers */ /* for the eigenpair corresponding to a real eigenvalue w(j), */ /* SELECT(j) must be set to .TRUE.. To select condition numbers */ /* corresponding to a complex conjugate pair of eigenvalues w(j) */ /* and w(j+1), either SELECT(j) or SELECT(j+1) or both, must be */ /* set to .TRUE.. */ /* If HOWMNY = 'A', SELECT is not referenced. */ /* N (input) INTEGER */ /* The order of the square matrix pair (A, B). N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The upper quasi-triangular matrix A in the pair (A,B). */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,N) */ /* The upper triangular matrix B in the pair (A,B). */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* VL (input) DOUBLE PRECISION array, dimension (LDVL,M) */ /* If JOB = 'E' or 'B', VL must contain left eigenvectors of */ /* (A, B), corresponding to the eigenpairs specified by HOWMNY */ /* and SELECT. The eigenvectors must be stored in consecutive */ /* columns of VL, as returned by DTGEVC. */ /* If JOB = 'V', VL is not referenced. */ /* LDVL (input) INTEGER */ /* The leading dimension of the array VL. LDVL >= 1. */ /* If JOB = 'E' or 'B', LDVL >= N. */ /* VR (input) DOUBLE PRECISION array, dimension (LDVR,M) */ /* If JOB = 'E' or 'B', VR must contain right eigenvectors of */ /* (A, B), corresponding to the eigenpairs specified by HOWMNY */ /* and SELECT. The eigenvectors must be stored in consecutive */ /* columns ov VR, as returned by DTGEVC. */ /* If JOB = 'V', VR is not referenced. */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. LDVR >= 1. */ /* If JOB = 'E' or 'B', LDVR >= N. */ /* S (output) DOUBLE PRECISION array, dimension (MM) */ /* If JOB = 'E' or 'B', the reciprocal condition numbers of the */ /* selected eigenvalues, stored in consecutive elements of the */ /* array. For a complex conjugate pair of eigenvalues two */ /* consecutive elements of S are set to the same value. Thus */ /* S(j), DIF(j), and the j-th columns of VL and VR all */ /* correspond to the same eigenpair (but not in general the */ /* j-th eigenpair, unless all eigenpairs are selected). */ /* If JOB = 'V', S is not referenced. */ /* DIF (output) DOUBLE PRECISION array, dimension (MM) */ /* If JOB = 'V' or 'B', the estimated reciprocal condition */ /* numbers of the selected eigenvectors, stored in consecutive */ /* elements of the array. For a complex eigenvector two */ /* consecutive elements of DIF are set to the same value. If */ /* the eigenvalues cannot be reordered to compute DIF(j), DIF(j) */ /* is set to 0; this can only occur when the true value would be */ /* very small anyway. */ /* If JOB = 'E', DIF is not referenced. */ /* MM (input) INTEGER */ /* The number of elements in the arrays S and DIF. MM >= M. */ /* M (output) INTEGER */ /* The number of elements of the arrays S and DIF used to store */ /* the specified condition numbers; for each selected real */ /* eigenvalue one element is used, and for each selected complex */ /* conjugate pair of eigenvalues, two elements are used. */ /* If HOWMNY = 'A', M is set to N. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,N). */ /* If JOB = 'V' or 'B' LWORK >= 2*N*(N+2)+16. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (N + 6) */ /* If JOB = 'E', IWORK is not referenced. */ /* INFO (output) INTEGER */ /* =0: Successful exit */ /* <0: If INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The reciprocal of the condition number of a generalized eigenvalue */ /* w = (a, b) is defined as */ /* S(w) = (|u'Av|**2 + |u'Bv|**2)**(1/2) / (norm(u)*norm(v)) */ /* where u and v are the left and right eigenvectors of (A, B) */ /* corresponding to w; |z| denotes the absolute value of the complex */ /* number, and norm(u) denotes the 2-norm of the vector u. */ /* The pair (a, b) corresponds to an eigenvalue w = a/b (= u'Av/u'Bv) */ /* of the matrix pair (A, B). If both a and b equal zero, then (A B) is */ /* singular and S(I) = -1 is returned. */ /* An approximate error bound on the chordal distance between the i-th */ /* computed generalized eigenvalue w and the corresponding exact */ /* eigenvalue lambda is */ /* chord(w, lambda) <= EPS * norm(A, B) / S(I) */ /* where EPS is the machine precision. */ /* The reciprocal of the condition number DIF(i) of right eigenvector u */ /* and left eigenvector v corresponding to the generalized eigenvalue w */ /* is defined as follows: */ /* a) If the i-th eigenvalue w = (a,b) is real */ /* Suppose U and V are orthogonal transformations such that */ /* U'*(A, B)*V = (S, T) = ( a * ) ( b * ) 1 */ /* ( 0 S22 ),( 0 T22 ) n-1 */ /* 1 n-1 1 n-1 */ /* Then the reciprocal condition number DIF(i) is */ /* Difl((a, b), (S22, T22)) = sigma-min( Zl ), */ /* where sigma-min(Zl) denotes the smallest singular value of the */ /* 2(n-1)-by-2(n-1) matrix */ /* Zl = [ kron(a, In-1) -kron(1, S22) ] */ /* [ kron(b, In-1) -kron(1, T22) ] . */ /* Here In-1 is the identity matrix of size n-1. kron(X, Y) is the */ /* Kronecker product between the matrices X and Y. */ /* Note that if the default method for computing DIF(i) is wanted */ /* (see DLATDF), then the parameter DIFDRI (see below) should be */ /* changed from 3 to 4 (routine DLATDF(IJOB = 2 will be used)). */ /* See DTGSYL for more details. */ /* b) If the i-th and (i+1)-th eigenvalues are complex conjugate pair, */ /* Suppose U and V are orthogonal transformations such that */ /* U'*(A, B)*V = (S, T) = ( S11 * ) ( T11 * ) 2 */ /* ( 0 S22 ),( 0 T22) n-2 */ /* 2 n-2 2 n-2 */ /* and (S11, T11) corresponds to the complex conjugate eigenvalue */ /* pair (w, conjg(w)). There exist unitary matrices U1 and V1 such */ /* that */ /* U1'*S11*V1 = ( s11 s12 ) and U1'*T11*V1 = ( t11 t12 ) */ /* ( 0 s22 ) ( 0 t22 ) */ /* where the generalized eigenvalues w = s11/t11 and */ /* conjg(w) = s22/t22. */ /* Then the reciprocal condition number DIF(i) is bounded by */ /* min( d1, max( 1, |real(s11)/real(s22)| )*d2 ) */ /* where, d1 = Difl((s11, t11), (s22, t22)) = sigma-min(Z1), where */ /* Z1 is the complex 2-by-2 matrix */ /* Z1 = [ s11 -s22 ] */ /* [ t11 -t22 ], */ /* This is done by computing (using real arithmetic) the */ /* roots of the characteristical polynomial det(Z1' * Z1 - lambda I), */ /* where Z1' denotes the conjugate transpose of Z1 and det(X) denotes */ /* the determinant of X. */ /* and d2 is an upper bound on Difl((S11, T11), (S22, T22)), i.e. an */ /* upper bound on sigma-min(Z2), where Z2 is (2n-2)-by-(2n-2) */ /* Z2 = [ kron(S11', In-2) -kron(I2, S22) ] */ /* [ kron(T11', In-2) -kron(I2, T22) ] */ /* Note that if the default method for computing DIF is wanted (see */ /* DLATDF), then the parameter DIFDRI (see below) should be changed */ /* from 3 to 4 (routine DLATDF(IJOB = 2 will be used)). See DTGSYL */ /* for more details. */ /* For each eigenvalue/vector specified by SELECT, DIF stores a */ /* Frobenius norm-based estimate of Difl. */ /* An approximate error bound for the i-th computed eigenvector VL(i) or */ /* VR(i) is given by */ /* EPS * norm(A, B) / DIF(i). */ /* See ref. [2-3] for more details and further references. */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* References */ /* ========== */ /* [1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the */ /* Generalized Real Schur Form of a Regular Matrix Pair (A, B), in */ /* M.S. Moonen et al (eds), Linear Algebra for Large Scale and */ /* Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218. */ /* [2] B. Kagstrom and P. Poromaa; Computing Eigenspaces with Specified */ /* Eigenvalues of a Regular Matrix Pair (A, B) and Condition */ /* Estimation: Theory, Algorithms and Software, */ /* Report UMINF - 94.04, Department of Computing Science, Umea */ /* University, S-901 87 Umea, Sweden, 1994. Also as LAPACK Working */ /* Note 87. To appear in Numerical Algorithms, 1996. */ /* [3] B. Kagstrom and P. Poromaa, LAPACK-Style Algorithms and Software */ /* for Solving the Generalized Sylvester Equation and Estimating the */ /* Separation between Regular Matrix Pairs, Report UMINF - 93.23, */ /* Department of Computing Science, Umea University, S-901 87 Umea, */ /* Sweden, December 1993, Revised April 1994, Also as LAPACK Working */ /* Note 75. To appear in ACM Trans. on Math. Software, Vol 22, */ /* No 1, 1996. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters */ /* Parameter adjustments */ --select; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --s; --dif; --work; --iwork; /* Function Body */ wantbh = _starpu_lsame_(job, "B"); wants = _starpu_lsame_(job, "E") || wantbh; wantdf = _starpu_lsame_(job, "V") || wantbh; somcon = _starpu_lsame_(howmny, "S"); *info = 0; lquery = *lwork == -1; if (! wants && ! wantdf) { *info = -1; } else if (! _starpu_lsame_(howmny, "A") && ! somcon) { *info = -2; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } else if (wants && *ldvl < *n) { *info = -10; } else if (wants && *ldvr < *n) { *info = -12; } else { /* Set M to the number of eigenpairs for which condition numbers */ /* are required, and test MM. */ if (somcon) { *m = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { if (k < *n) { if (a[k + 1 + k * a_dim1] == 0.) { if (select[k]) { ++(*m); } } else { pair = TRUE_; if (select[k] || select[k + 1]) { *m += 2; } } } else { if (select[*n]) { ++(*m); } } } /* L10: */ } } else { *m = *n; } if (*n == 0) { lwmin = 1; } else if (_starpu_lsame_(job, "V") || _starpu_lsame_(job, "B")) { lwmin = (*n << 1) * (*n + 2) + 16; } else { lwmin = *n; } work[1] = (doublereal) lwmin; if (*mm < *m) { *info = -15; } else if (*lwork < lwmin && ! lquery) { *info = -18; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGSNA", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; ks = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Determine whether A(k,k) begins a 1-by-1 or 2-by-2 block. */ if (pair) { pair = FALSE_; goto L20; } else { if (k < *n) { pair = a[k + 1 + k * a_dim1] != 0.; } } /* Determine whether condition numbers are required for the k-th */ /* eigenpair. */ if (somcon) { if (pair) { if (! select[k] && ! select[k + 1]) { goto L20; } } else { if (! select[k]) { goto L20; } } } ++ks; if (wants) { /* Compute the reciprocal condition number of the k-th */ /* eigenvalue. */ if (pair) { /* Complex eigenvalue pair. */ d__1 = _starpu_dnrm2_(n, &vr[ks * vr_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vr[(ks + 1) * vr_dim1 + 1], &c__1); rnrm = _starpu_dlapy2_(&d__1, &d__2); d__1 = _starpu_dnrm2_(n, &vl[ks * vl_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vl[(ks + 1) * vl_dim1 + 1], &c__1); lnrm = _starpu_dlapy2_(&d__1, &d__2); _starpu_dgemv_("N", n, n, &c_b19, &a[a_offset], lda, &vr[ks * vr_dim1 + 1], &c__1, &c_b21, &work[1], &c__1); tmprr = _starpu_ddot_(n, &work[1], &c__1, &vl[ks * vl_dim1 + 1], & c__1); tmpri = _starpu_ddot_(n, &work[1], &c__1, &vl[(ks + 1) * vl_dim1 + 1], &c__1); _starpu_dgemv_("N", n, n, &c_b19, &a[a_offset], lda, &vr[(ks + 1) * vr_dim1 + 1], &c__1, &c_b21, &work[1], &c__1); tmpii = _starpu_ddot_(n, &work[1], &c__1, &vl[(ks + 1) * vl_dim1 + 1], &c__1); tmpir = _starpu_ddot_(n, &work[1], &c__1, &vl[ks * vl_dim1 + 1], & c__1); uhav = tmprr + tmpii; uhavi = tmpir - tmpri; _starpu_dgemv_("N", n, n, &c_b19, &b[b_offset], ldb, &vr[ks * vr_dim1 + 1], &c__1, &c_b21, &work[1], &c__1); tmprr = _starpu_ddot_(n, &work[1], &c__1, &vl[ks * vl_dim1 + 1], & c__1); tmpri = _starpu_ddot_(n, &work[1], &c__1, &vl[(ks + 1) * vl_dim1 + 1], &c__1); _starpu_dgemv_("N", n, n, &c_b19, &b[b_offset], ldb, &vr[(ks + 1) * vr_dim1 + 1], &c__1, &c_b21, &work[1], &c__1); tmpii = _starpu_ddot_(n, &work[1], &c__1, &vl[(ks + 1) * vl_dim1 + 1], &c__1); tmpir = _starpu_ddot_(n, &work[1], &c__1, &vl[ks * vl_dim1 + 1], & c__1); uhbv = tmprr + tmpii; uhbvi = tmpir - tmpri; uhav = _starpu_dlapy2_(&uhav, &uhavi); uhbv = _starpu_dlapy2_(&uhbv, &uhbvi); cond = _starpu_dlapy2_(&uhav, &uhbv); s[ks] = cond / (rnrm * lnrm); s[ks + 1] = s[ks]; } else { /* Real eigenvalue. */ rnrm = _starpu_dnrm2_(n, &vr[ks * vr_dim1 + 1], &c__1); lnrm = _starpu_dnrm2_(n, &vl[ks * vl_dim1 + 1], &c__1); _starpu_dgemv_("N", n, n, &c_b19, &a[a_offset], lda, &vr[ks * vr_dim1 + 1], &c__1, &c_b21, &work[1], &c__1); uhav = _starpu_ddot_(n, &work[1], &c__1, &vl[ks * vl_dim1 + 1], &c__1) ; _starpu_dgemv_("N", n, n, &c_b19, &b[b_offset], ldb, &vr[ks * vr_dim1 + 1], &c__1, &c_b21, &work[1], &c__1); uhbv = _starpu_ddot_(n, &work[1], &c__1, &vl[ks * vl_dim1 + 1], &c__1) ; cond = _starpu_dlapy2_(&uhav, &uhbv); if (cond == 0.) { s[ks] = -1.; } else { s[ks] = cond / (rnrm * lnrm); } } } if (wantdf) { if (*n == 1) { dif[ks] = _starpu_dlapy2_(&a[a_dim1 + 1], &b[b_dim1 + 1]); goto L20; } /* Estimate the reciprocal condition number of the k-th */ /* eigenvectors. */ if (pair) { /* Copy the 2-by 2 pencil beginning at (A(k,k), B(k, k)). */ /* Compute the eigenvalue(s) at position K. */ work[1] = a[k + k * a_dim1]; work[2] = a[k + 1 + k * a_dim1]; work[3] = a[k + (k + 1) * a_dim1]; work[4] = a[k + 1 + (k + 1) * a_dim1]; work[5] = b[k + k * b_dim1]; work[6] = b[k + 1 + k * b_dim1]; work[7] = b[k + (k + 1) * b_dim1]; work[8] = b[k + 1 + (k + 1) * b_dim1]; d__1 = smlnum * eps; _starpu_dlag2_(&work[1], &c__2, &work[5], &c__2, &d__1, &beta, dummy1, &alphar, dummy, &alphai); alprqt = 1.; c1 = (alphar * alphar + alphai * alphai + beta * beta) * 2.; c2 = beta * 4. * beta * alphai * alphai; root1 = c1 + sqrt(c1 * c1 - c2 * 4.); root2 = c2 / root1; root1 /= 2.; /* Computing MIN */ d__1 = sqrt(root1), d__2 = sqrt(root2); cond = min(d__1,d__2); } /* Copy the matrix (A, B) to the array WORK and swap the */ /* diagonal block beginning at A(k,k) to the (1,1) position. */ _starpu_dlacpy_("Full", n, n, &a[a_offset], lda, &work[1], n); _starpu_dlacpy_("Full", n, n, &b[b_offset], ldb, &work[*n * *n + 1], n); ifst = k; ilst = 1; i__2 = *lwork - (*n << 1) * *n; _starpu_dtgexc_(&c_false, &c_false, n, &work[1], n, &work[*n * *n + 1], n, dummy, &c__1, dummy1, &c__1, &ifst, &ilst, &work[(*n * * n << 1) + 1], &i__2, &ierr); if (ierr > 0) { /* Ill-conditioned problem - swap rejected. */ dif[ks] = 0.; } else { /* Reordering successful, solve generalized Sylvester */ /* equation for R and L, */ /* A22 * R - L * A11 = A12 */ /* B22 * R - L * B11 = B12, */ /* and compute estimate of Difl((A11,B11), (A22, B22)). */ n1 = 1; if (work[2] != 0.) { n1 = 2; } n2 = *n - n1; if (n2 == 0) { dif[ks] = cond; } else { i__ = *n * *n + 1; iz = (*n << 1) * *n + 1; i__2 = *lwork - (*n << 1) * *n; _starpu_dtgsyl_("N", &c__3, &n2, &n1, &work[*n * n1 + n1 + 1], n, &work[1], n, &work[n1 + 1], n, &work[*n * n1 + n1 + i__], n, &work[i__], n, &work[n1 + i__], n, & scale, &dif[ks], &work[iz + 1], &i__2, &iwork[1], &ierr); if (pair) { /* Computing MIN */ d__1 = max(1.,alprqt) * dif[ks]; dif[ks] = min(d__1,cond); } } } if (pair) { dif[ks + 1] = dif[ks]; } } if (pair) { ++ks; } L20: ; } work[1] = (doublereal) lwmin; return 0; /* End of DTGSNA */ } /* _starpu_dtgsna_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgsy2.c000066400000000000000000001006671413463044200205740ustar00rootroot00000000000000/* dtgsy2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__8 = 8; static integer c__1 = 1; static doublereal c_b27 = -1.; static doublereal c_b42 = 1.; static doublereal c_b56 = 0.; /* Subroutine */ int _starpu_dtgsy2_(char *trans, integer *ijob, integer *m, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * scale, doublereal *rdsum, doublereal *rdscal, integer *iwork, integer *pq, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, d_dim1, d_offset, e_dim1, e_offset, f_dim1, f_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, k, p, q; doublereal z__[64] /* was [8][8] */; integer ie, je, mb, nb, ii, jj, is, js; doublereal rhs[8]; integer isp1, jsp1; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); integer ierr, zdim, ipiv[8], jpiv[8]; doublereal alpha; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *) , _starpu_dgesc2_(integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *), _starpu_dgetc2_(integer *, doublereal *, integer *, integer *, integer *, integer *), _starpu_dlatdf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *); doublereal scaloc; extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical notran; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGSY2 solves the generalized Sylvester equation: */ /* A * R - L * B = scale * C (1) */ /* D * R - L * E = scale * F, */ /* using Level 1 and 2 BLAS. where R and L are unknown M-by-N matrices, */ /* (A, D), (B, E) and (C, F) are given matrix pairs of size M-by-M, */ /* N-by-N and M-by-N, respectively, with real entries. (A, D) and (B, E) */ /* must be in generalized Schur canonical form, i.e. A, B are upper */ /* quasi triangular and D, E are upper triangular. The solution (R, L) */ /* overwrites (C, F). 0 <= SCALE <= 1 is an output scaling factor */ /* chosen to avoid overflow. */ /* In matrix notation solving equation (1) corresponds to solve */ /* Z*x = scale*b, where Z is defined as */ /* Z = [ kron(In, A) -kron(B', Im) ] (2) */ /* [ kron(In, D) -kron(E', Im) ], */ /* Ik is the identity matrix of size k and X' is the transpose of X. */ /* kron(X, Y) is the Kronecker product between the matrices X and Y. */ /* In the process of solving (1), we solve a number of such systems */ /* where Dim(In), Dim(In) = 1 or 2. */ /* If TRANS = 'T', solve the transposed system Z'*y = scale*b for y, */ /* which is equivalent to solve for R and L in */ /* A' * R + D' * L = scale * C (3) */ /* R * B' + L * E' = scale * -F */ /* This case is used to compute an estimate of Dif[(A, D), (B, E)] = */ /* sigma_min(Z) using reverse communicaton with DLACON. */ /* DTGSY2 also (IJOB >= 1) contributes to the computation in DTGSYL */ /* of an upper bound on the separation between to matrix pairs. Then */ /* the input (A, D), (B, E) are sub-pencils of the matrix pair in */ /* DTGSYL. See DTGSYL for details. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* = 'N', solve the generalized Sylvester equation (1). */ /* = 'T': solve the 'transposed' system (3). */ /* IJOB (input) INTEGER */ /* Specifies what kind of functionality to be performed. */ /* = 0: solve (1) only. */ /* = 1: A contribution from this subsystem to a Frobenius */ /* norm-based estimate of the separation between two matrix */ /* pairs is computed. (look ahead strategy is used). */ /* = 2: A contribution from this subsystem to a Frobenius */ /* norm-based estimate of the separation between two matrix */ /* pairs is computed. (DGECON on sub-systems is used.) */ /* Not referenced if TRANS = 'T'. */ /* M (input) INTEGER */ /* On entry, M specifies the order of A and D, and the row */ /* dimension of C, F, R and L. */ /* N (input) INTEGER */ /* On entry, N specifies the order of B and E, and the column */ /* dimension of C, F, R and L. */ /* A (input) DOUBLE PRECISION array, dimension (LDA, M) */ /* On entry, A contains an upper quasi triangular matrix. */ /* LDA (input) INTEGER */ /* The leading dimension of the matrix A. LDA >= max(1, M). */ /* B (input) DOUBLE PRECISION array, dimension (LDB, N) */ /* On entry, B contains an upper quasi triangular matrix. */ /* LDB (input) INTEGER */ /* The leading dimension of the matrix B. LDB >= max(1, N). */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC, N) */ /* On entry, C contains the right-hand-side of the first matrix */ /* equation in (1). */ /* On exit, if IJOB = 0, C has been overwritten by the */ /* solution R. */ /* LDC (input) INTEGER */ /* The leading dimension of the matrix C. LDC >= max(1, M). */ /* D (input) DOUBLE PRECISION array, dimension (LDD, M) */ /* On entry, D contains an upper triangular matrix. */ /* LDD (input) INTEGER */ /* The leading dimension of the matrix D. LDD >= max(1, M). */ /* E (input) DOUBLE PRECISION array, dimension (LDE, N) */ /* On entry, E contains an upper triangular matrix. */ /* LDE (input) INTEGER */ /* The leading dimension of the matrix E. LDE >= max(1, N). */ /* F (input/output) DOUBLE PRECISION array, dimension (LDF, N) */ /* On entry, F contains the right-hand-side of the second matrix */ /* equation in (1). */ /* On exit, if IJOB = 0, F has been overwritten by the */ /* solution L. */ /* LDF (input) INTEGER */ /* The leading dimension of the matrix F. LDF >= max(1, M). */ /* SCALE (output) DOUBLE PRECISION */ /* On exit, 0 <= SCALE <= 1. If 0 < SCALE < 1, the solutions */ /* R and L (C and F on entry) will hold the solutions to a */ /* slightly perturbed system but the input matrices A, B, D and */ /* E have not been changed. If SCALE = 0, R and L will hold the */ /* solutions to the homogeneous system with C = F = 0. Normally, */ /* SCALE = 1. */ /* RDSUM (input/output) DOUBLE PRECISION */ /* On entry, the sum of squares of computed contributions to */ /* the Dif-estimate under computation by DTGSYL, where the */ /* scaling factor RDSCAL (see below) has been factored out. */ /* On exit, the corresponding sum of squares updated with the */ /* contributions from the current sub-system. */ /* If TRANS = 'T' RDSUM is not touched. */ /* NOTE: RDSUM only makes sense when DTGSY2 is called by DTGSYL. */ /* RDSCAL (input/output) DOUBLE PRECISION */ /* On entry, scaling factor used to prevent overflow in RDSUM. */ /* On exit, RDSCAL is updated w.r.t. the current contributions */ /* in RDSUM. */ /* If TRANS = 'T', RDSCAL is not touched. */ /* NOTE: RDSCAL only makes sense when DTGSY2 is called by */ /* DTGSYL. */ /* IWORK (workspace) INTEGER array, dimension (M+N+2) */ /* PQ (output) INTEGER */ /* On exit, the number of subsystems (of size 2-by-2, 4-by-4 and */ /* 8-by-8) solved by this routine. */ /* INFO (output) INTEGER */ /* On exit, if INFO is set to */ /* =0: Successful exit */ /* <0: If INFO = -i, the i-th argument had an illegal value. */ /* >0: The matrix pairs (A, D) and (B, E) have common or very */ /* close eigenvalues. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* ===================================================================== */ /* Replaced various illegal calls to DCOPY by calls to DLASET. */ /* Sven Hammarling, 27/5/02. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; d_dim1 = *ldd; d_offset = 1 + d_dim1; d__ -= d_offset; e_dim1 = *lde; e_offset = 1 + e_dim1; e -= e_offset; f_dim1 = *ldf; f_offset = 1 + f_dim1; f -= f_offset; --iwork; /* Function Body */ *info = 0; ierr = 0; notran = _starpu_lsame_(trans, "N"); if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -1; } else if (notran) { if (*ijob < 0 || *ijob > 2) { *info = -2; } } if (*info == 0) { if (*m <= 0) { *info = -3; } else if (*n <= 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*ldd < max(1,*m)) { *info = -12; } else if (*lde < max(1,*n)) { *info = -14; } else if (*ldf < max(1,*m)) { *info = -16; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGSY2", &i__1); return 0; } /* Determine block structure of A */ *pq = 0; p = 0; i__ = 1; L10: if (i__ > *m) { goto L20; } ++p; iwork[p] = i__; if (i__ == *m) { goto L20; } if (a[i__ + 1 + i__ * a_dim1] != 0.) { i__ += 2; } else { ++i__; } goto L10; L20: iwork[p + 1] = *m + 1; /* Determine block structure of B */ q = p + 1; j = 1; L30: if (j > *n) { goto L40; } ++q; iwork[q] = j; if (j == *n) { goto L40; } if (b[j + 1 + j * b_dim1] != 0.) { j += 2; } else { ++j; } goto L30; L40: iwork[q + 1] = *n + 1; *pq = p * (q - p - 1); if (notran) { /* Solve (I, J) - subsystem */ /* A(I, I) * R(I, J) - L(I, J) * B(J, J) = C(I, J) */ /* D(I, I) * R(I, J) - L(I, J) * E(J, J) = F(I, J) */ /* for I = P, P - 1, ..., 1; J = 1, 2, ..., Q */ *scale = 1.; scaloc = 1.; i__1 = q; for (j = p + 2; j <= i__1; ++j) { js = iwork[j]; jsp1 = js + 1; je = iwork[j + 1] - 1; nb = je - js + 1; for (i__ = p; i__ >= 1; --i__) { is = iwork[i__]; isp1 = is + 1; ie = iwork[i__ + 1] - 1; mb = ie - is + 1; zdim = mb * nb << 1; if (mb == 1 && nb == 1) { /* Build a 2-by-2 system Z * x = RHS */ z__[0] = a[is + is * a_dim1]; z__[1] = d__[is + is * d_dim1]; z__[8] = -b[js + js * b_dim1]; z__[9] = -e[js + js * e_dim1]; /* Set up right hand side(s) */ rhs[0] = c__[is + js * c_dim1]; rhs[1] = f[is + js * f_dim1]; /* Solve Z * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } if (*ijob == 0) { _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__2 = *n; for (k = 1; k <= i__2; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], & c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L50: */ } *scale *= scaloc; } } else { _starpu_dlatdf_(ijob, &zdim, z__, &c__8, rhs, rdsum, rdscal, ipiv, jpiv); } /* Unpack solution vector(s) */ c__[is + js * c_dim1] = rhs[0]; f[is + js * f_dim1] = rhs[1]; /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (i__ > 1) { alpha = -rhs[0]; i__2 = is - 1; _starpu_daxpy_(&i__2, &alpha, &a[is * a_dim1 + 1], &c__1, & c__[js * c_dim1 + 1], &c__1); i__2 = is - 1; _starpu_daxpy_(&i__2, &alpha, &d__[is * d_dim1 + 1], &c__1, & f[js * f_dim1 + 1], &c__1); } if (j < q) { i__2 = *n - je; _starpu_daxpy_(&i__2, &rhs[1], &b[js + (je + 1) * b_dim1], ldb, &c__[is + (je + 1) * c_dim1], ldc); i__2 = *n - je; _starpu_daxpy_(&i__2, &rhs[1], &e[js + (je + 1) * e_dim1], lde, &f[is + (je + 1) * f_dim1], ldf); } } else if (mb == 1 && nb == 2) { /* Build a 4-by-4 system Z * x = RHS */ z__[0] = a[is + is * a_dim1]; z__[1] = 0.; z__[2] = d__[is + is * d_dim1]; z__[3] = 0.; z__[8] = 0.; z__[9] = a[is + is * a_dim1]; z__[10] = 0.; z__[11] = d__[is + is * d_dim1]; z__[16] = -b[js + js * b_dim1]; z__[17] = -b[js + jsp1 * b_dim1]; z__[18] = -e[js + js * e_dim1]; z__[19] = -e[js + jsp1 * e_dim1]; z__[24] = -b[jsp1 + js * b_dim1]; z__[25] = -b[jsp1 + jsp1 * b_dim1]; z__[26] = 0.; z__[27] = -e[jsp1 + jsp1 * e_dim1]; /* Set up right hand side(s) */ rhs[0] = c__[is + js * c_dim1]; rhs[1] = c__[is + jsp1 * c_dim1]; rhs[2] = f[is + js * f_dim1]; rhs[3] = f[is + jsp1 * f_dim1]; /* Solve Z * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } if (*ijob == 0) { _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__2 = *n; for (k = 1; k <= i__2; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], & c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L60: */ } *scale *= scaloc; } } else { _starpu_dlatdf_(ijob, &zdim, z__, &c__8, rhs, rdsum, rdscal, ipiv, jpiv); } /* Unpack solution vector(s) */ c__[is + js * c_dim1] = rhs[0]; c__[is + jsp1 * c_dim1] = rhs[1]; f[is + js * f_dim1] = rhs[2]; f[is + jsp1 * f_dim1] = rhs[3]; /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (i__ > 1) { i__2 = is - 1; _starpu_dger_(&i__2, &nb, &c_b27, &a[is * a_dim1 + 1], &c__1, rhs, &c__1, &c__[js * c_dim1 + 1], ldc); i__2 = is - 1; _starpu_dger_(&i__2, &nb, &c_b27, &d__[is * d_dim1 + 1], & c__1, rhs, &c__1, &f[js * f_dim1 + 1], ldf); } if (j < q) { i__2 = *n - je; _starpu_daxpy_(&i__2, &rhs[2], &b[js + (je + 1) * b_dim1], ldb, &c__[is + (je + 1) * c_dim1], ldc); i__2 = *n - je; _starpu_daxpy_(&i__2, &rhs[2], &e[js + (je + 1) * e_dim1], lde, &f[is + (je + 1) * f_dim1], ldf); i__2 = *n - je; _starpu_daxpy_(&i__2, &rhs[3], &b[jsp1 + (je + 1) * b_dim1], ldb, &c__[is + (je + 1) * c_dim1], ldc); i__2 = *n - je; _starpu_daxpy_(&i__2, &rhs[3], &e[jsp1 + (je + 1) * e_dim1], lde, &f[is + (je + 1) * f_dim1], ldf); } } else if (mb == 2 && nb == 1) { /* Build a 4-by-4 system Z * x = RHS */ z__[0] = a[is + is * a_dim1]; z__[1] = a[isp1 + is * a_dim1]; z__[2] = d__[is + is * d_dim1]; z__[3] = 0.; z__[8] = a[is + isp1 * a_dim1]; z__[9] = a[isp1 + isp1 * a_dim1]; z__[10] = d__[is + isp1 * d_dim1]; z__[11] = d__[isp1 + isp1 * d_dim1]; z__[16] = -b[js + js * b_dim1]; z__[17] = 0.; z__[18] = -e[js + js * e_dim1]; z__[19] = 0.; z__[24] = 0.; z__[25] = -b[js + js * b_dim1]; z__[26] = 0.; z__[27] = -e[js + js * e_dim1]; /* Set up right hand side(s) */ rhs[0] = c__[is + js * c_dim1]; rhs[1] = c__[isp1 + js * c_dim1]; rhs[2] = f[is + js * f_dim1]; rhs[3] = f[isp1 + js * f_dim1]; /* Solve Z * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } if (*ijob == 0) { _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__2 = *n; for (k = 1; k <= i__2; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], & c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L70: */ } *scale *= scaloc; } } else { _starpu_dlatdf_(ijob, &zdim, z__, &c__8, rhs, rdsum, rdscal, ipiv, jpiv); } /* Unpack solution vector(s) */ c__[is + js * c_dim1] = rhs[0]; c__[isp1 + js * c_dim1] = rhs[1]; f[is + js * f_dim1] = rhs[2]; f[isp1 + js * f_dim1] = rhs[3]; /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (i__ > 1) { i__2 = is - 1; _starpu_dgemv_("N", &i__2, &mb, &c_b27, &a[is * a_dim1 + 1], lda, rhs, &c__1, &c_b42, &c__[js * c_dim1 + 1] , &c__1); i__2 = is - 1; _starpu_dgemv_("N", &i__2, &mb, &c_b27, &d__[is * d_dim1 + 1], ldd, rhs, &c__1, &c_b42, &f[js * f_dim1 + 1], &c__1); } if (j < q) { i__2 = *n - je; _starpu_dger_(&mb, &i__2, &c_b42, &rhs[2], &c__1, &b[js + (je + 1) * b_dim1], ldb, &c__[is + (je + 1) * c_dim1], ldc); i__2 = *n - je; _starpu_dger_(&mb, &i__2, &c_b42, &rhs[2], &c__1, &e[js + (je + 1) * e_dim1], lde, &f[is + (je + 1) * f_dim1], ldf); } } else if (mb == 2 && nb == 2) { /* Build an 8-by-8 system Z * x = RHS */ _starpu_dlaset_("F", &c__8, &c__8, &c_b56, &c_b56, z__, &c__8); z__[0] = a[is + is * a_dim1]; z__[1] = a[isp1 + is * a_dim1]; z__[4] = d__[is + is * d_dim1]; z__[8] = a[is + isp1 * a_dim1]; z__[9] = a[isp1 + isp1 * a_dim1]; z__[12] = d__[is + isp1 * d_dim1]; z__[13] = d__[isp1 + isp1 * d_dim1]; z__[18] = a[is + is * a_dim1]; z__[19] = a[isp1 + is * a_dim1]; z__[22] = d__[is + is * d_dim1]; z__[26] = a[is + isp1 * a_dim1]; z__[27] = a[isp1 + isp1 * a_dim1]; z__[30] = d__[is + isp1 * d_dim1]; z__[31] = d__[isp1 + isp1 * d_dim1]; z__[32] = -b[js + js * b_dim1]; z__[34] = -b[js + jsp1 * b_dim1]; z__[36] = -e[js + js * e_dim1]; z__[38] = -e[js + jsp1 * e_dim1]; z__[41] = -b[js + js * b_dim1]; z__[43] = -b[js + jsp1 * b_dim1]; z__[45] = -e[js + js * e_dim1]; z__[47] = -e[js + jsp1 * e_dim1]; z__[48] = -b[jsp1 + js * b_dim1]; z__[50] = -b[jsp1 + jsp1 * b_dim1]; z__[54] = -e[jsp1 + jsp1 * e_dim1]; z__[57] = -b[jsp1 + js * b_dim1]; z__[59] = -b[jsp1 + jsp1 * b_dim1]; z__[63] = -e[jsp1 + jsp1 * e_dim1]; /* Set up right hand side(s) */ k = 1; ii = mb * nb + 1; i__2 = nb - 1; for (jj = 0; jj <= i__2; ++jj) { _starpu_dcopy_(&mb, &c__[is + (js + jj) * c_dim1], &c__1, & rhs[k - 1], &c__1); _starpu_dcopy_(&mb, &f[is + (js + jj) * f_dim1], &c__1, &rhs[ ii - 1], &c__1); k += mb; ii += mb; /* L80: */ } /* Solve Z * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } if (*ijob == 0) { _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__2 = *n; for (k = 1; k <= i__2; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], & c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L90: */ } *scale *= scaloc; } } else { _starpu_dlatdf_(ijob, &zdim, z__, &c__8, rhs, rdsum, rdscal, ipiv, jpiv); } /* Unpack solution vector(s) */ k = 1; ii = mb * nb + 1; i__2 = nb - 1; for (jj = 0; jj <= i__2; ++jj) { _starpu_dcopy_(&mb, &rhs[k - 1], &c__1, &c__[is + (js + jj) * c_dim1], &c__1); _starpu_dcopy_(&mb, &rhs[ii - 1], &c__1, &f[is + (js + jj) * f_dim1], &c__1); k += mb; ii += mb; /* L100: */ } /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (i__ > 1) { i__2 = is - 1; _starpu_dgemm_("N", "N", &i__2, &nb, &mb, &c_b27, &a[is * a_dim1 + 1], lda, rhs, &mb, &c_b42, &c__[js * c_dim1 + 1], ldc); i__2 = is - 1; _starpu_dgemm_("N", "N", &i__2, &nb, &mb, &c_b27, &d__[is * d_dim1 + 1], ldd, rhs, &mb, &c_b42, &f[js * f_dim1 + 1], ldf); } if (j < q) { k = mb * nb + 1; i__2 = *n - je; _starpu_dgemm_("N", "N", &mb, &i__2, &nb, &c_b42, &rhs[k - 1], &mb, &b[js + (je + 1) * b_dim1], ldb, &c_b42, &c__[is + (je + 1) * c_dim1], ldc); i__2 = *n - je; _starpu_dgemm_("N", "N", &mb, &i__2, &nb, &c_b42, &rhs[k - 1], &mb, &e[js + (je + 1) * e_dim1], lde, &c_b42, &f[is + (je + 1) * f_dim1], ldf); } } /* L110: */ } /* L120: */ } } else { /* Solve (I, J) - subsystem */ /* A(I, I)' * R(I, J) + D(I, I)' * L(J, J) = C(I, J) */ /* R(I, I) * B(J, J) + L(I, J) * E(J, J) = -F(I, J) */ /* for I = 1, 2, ..., P, J = Q, Q - 1, ..., 1 */ *scale = 1.; scaloc = 1.; i__1 = p; for (i__ = 1; i__ <= i__1; ++i__) { is = iwork[i__]; isp1 = is + 1; ie = i__; mb = ie - is + 1; i__2 = p + 2; for (j = q; j >= i__2; --j) { js = iwork[j]; jsp1 = js + 1; je = iwork[j + 1] - 1; nb = je - js + 1; zdim = mb * nb << 1; if (mb == 1 && nb == 1) { /* Build a 2-by-2 system Z' * x = RHS */ z__[0] = a[is + is * a_dim1]; z__[1] = -b[js + js * b_dim1]; z__[8] = d__[is + is * d_dim1]; z__[9] = -e[js + js * e_dim1]; /* Set up right hand side(s) */ rhs[0] = c__[is + js * c_dim1]; rhs[1] = f[is + js * f_dim1]; /* Solve Z' * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__3 = *n; for (k = 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L130: */ } *scale *= scaloc; } /* Unpack solution vector(s) */ c__[is + js * c_dim1] = rhs[0]; f[is + js * f_dim1] = rhs[1]; /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (j > p + 2) { alpha = rhs[0]; i__3 = js - 1; _starpu_daxpy_(&i__3, &alpha, &b[js * b_dim1 + 1], &c__1, &f[ is + f_dim1], ldf); alpha = rhs[1]; i__3 = js - 1; _starpu_daxpy_(&i__3, &alpha, &e[js * e_dim1 + 1], &c__1, &f[ is + f_dim1], ldf); } if (i__ < p) { alpha = -rhs[0]; i__3 = *m - ie; _starpu_daxpy_(&i__3, &alpha, &a[is + (ie + 1) * a_dim1], lda, &c__[ie + 1 + js * c_dim1], &c__1); alpha = -rhs[1]; i__3 = *m - ie; _starpu_daxpy_(&i__3, &alpha, &d__[is + (ie + 1) * d_dim1], ldd, &c__[ie + 1 + js * c_dim1], &c__1); } } else if (mb == 1 && nb == 2) { /* Build a 4-by-4 system Z' * x = RHS */ z__[0] = a[is + is * a_dim1]; z__[1] = 0.; z__[2] = -b[js + js * b_dim1]; z__[3] = -b[jsp1 + js * b_dim1]; z__[8] = 0.; z__[9] = a[is + is * a_dim1]; z__[10] = -b[js + jsp1 * b_dim1]; z__[11] = -b[jsp1 + jsp1 * b_dim1]; z__[16] = d__[is + is * d_dim1]; z__[17] = 0.; z__[18] = -e[js + js * e_dim1]; z__[19] = 0.; z__[24] = 0.; z__[25] = d__[is + is * d_dim1]; z__[26] = -e[js + jsp1 * e_dim1]; z__[27] = -e[jsp1 + jsp1 * e_dim1]; /* Set up right hand side(s) */ rhs[0] = c__[is + js * c_dim1]; rhs[1] = c__[is + jsp1 * c_dim1]; rhs[2] = f[is + js * f_dim1]; rhs[3] = f[is + jsp1 * f_dim1]; /* Solve Z' * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__3 = *n; for (k = 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L140: */ } *scale *= scaloc; } /* Unpack solution vector(s) */ c__[is + js * c_dim1] = rhs[0]; c__[is + jsp1 * c_dim1] = rhs[1]; f[is + js * f_dim1] = rhs[2]; f[is + jsp1 * f_dim1] = rhs[3]; /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (j > p + 2) { i__3 = js - 1; _starpu_daxpy_(&i__3, rhs, &b[js * b_dim1 + 1], &c__1, &f[is + f_dim1], ldf); i__3 = js - 1; _starpu_daxpy_(&i__3, &rhs[1], &b[jsp1 * b_dim1 + 1], &c__1, & f[is + f_dim1], ldf); i__3 = js - 1; _starpu_daxpy_(&i__3, &rhs[2], &e[js * e_dim1 + 1], &c__1, &f[ is + f_dim1], ldf); i__3 = js - 1; _starpu_daxpy_(&i__3, &rhs[3], &e[jsp1 * e_dim1 + 1], &c__1, & f[is + f_dim1], ldf); } if (i__ < p) { i__3 = *m - ie; _starpu_dger_(&i__3, &nb, &c_b27, &a[is + (ie + 1) * a_dim1], lda, rhs, &c__1, &c__[ie + 1 + js * c_dim1], ldc); i__3 = *m - ie; _starpu_dger_(&i__3, &nb, &c_b27, &d__[is + (ie + 1) * d_dim1] , ldd, &rhs[2], &c__1, &c__[ie + 1 + js * c_dim1], ldc); } } else if (mb == 2 && nb == 1) { /* Build a 4-by-4 system Z' * x = RHS */ z__[0] = a[is + is * a_dim1]; z__[1] = a[is + isp1 * a_dim1]; z__[2] = -b[js + js * b_dim1]; z__[3] = 0.; z__[8] = a[isp1 + is * a_dim1]; z__[9] = a[isp1 + isp1 * a_dim1]; z__[10] = 0.; z__[11] = -b[js + js * b_dim1]; z__[16] = d__[is + is * d_dim1]; z__[17] = d__[is + isp1 * d_dim1]; z__[18] = -e[js + js * e_dim1]; z__[19] = 0.; z__[24] = 0.; z__[25] = d__[isp1 + isp1 * d_dim1]; z__[26] = 0.; z__[27] = -e[js + js * e_dim1]; /* Set up right hand side(s) */ rhs[0] = c__[is + js * c_dim1]; rhs[1] = c__[isp1 + js * c_dim1]; rhs[2] = f[is + js * f_dim1]; rhs[3] = f[isp1 + js * f_dim1]; /* Solve Z' * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__3 = *n; for (k = 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L150: */ } *scale *= scaloc; } /* Unpack solution vector(s) */ c__[is + js * c_dim1] = rhs[0]; c__[isp1 + js * c_dim1] = rhs[1]; f[is + js * f_dim1] = rhs[2]; f[isp1 + js * f_dim1] = rhs[3]; /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (j > p + 2) { i__3 = js - 1; _starpu_dger_(&mb, &i__3, &c_b42, rhs, &c__1, &b[js * b_dim1 + 1], &c__1, &f[is + f_dim1], ldf); i__3 = js - 1; _starpu_dger_(&mb, &i__3, &c_b42, &rhs[2], &c__1, &e[js * e_dim1 + 1], &c__1, &f[is + f_dim1], ldf); } if (i__ < p) { i__3 = *m - ie; _starpu_dgemv_("T", &mb, &i__3, &c_b27, &a[is + (ie + 1) * a_dim1], lda, rhs, &c__1, &c_b42, &c__[ie + 1 + js * c_dim1], &c__1); i__3 = *m - ie; _starpu_dgemv_("T", &mb, &i__3, &c_b27, &d__[is + (ie + 1) * d_dim1], ldd, &rhs[2], &c__1, &c_b42, &c__[ie + 1 + js * c_dim1], &c__1); } } else if (mb == 2 && nb == 2) { /* Build an 8-by-8 system Z' * x = RHS */ _starpu_dlaset_("F", &c__8, &c__8, &c_b56, &c_b56, z__, &c__8); z__[0] = a[is + is * a_dim1]; z__[1] = a[is + isp1 * a_dim1]; z__[4] = -b[js + js * b_dim1]; z__[6] = -b[jsp1 + js * b_dim1]; z__[8] = a[isp1 + is * a_dim1]; z__[9] = a[isp1 + isp1 * a_dim1]; z__[13] = -b[js + js * b_dim1]; z__[15] = -b[jsp1 + js * b_dim1]; z__[18] = a[is + is * a_dim1]; z__[19] = a[is + isp1 * a_dim1]; z__[20] = -b[js + jsp1 * b_dim1]; z__[22] = -b[jsp1 + jsp1 * b_dim1]; z__[26] = a[isp1 + is * a_dim1]; z__[27] = a[isp1 + isp1 * a_dim1]; z__[29] = -b[js + jsp1 * b_dim1]; z__[31] = -b[jsp1 + jsp1 * b_dim1]; z__[32] = d__[is + is * d_dim1]; z__[33] = d__[is + isp1 * d_dim1]; z__[36] = -e[js + js * e_dim1]; z__[41] = d__[isp1 + isp1 * d_dim1]; z__[45] = -e[js + js * e_dim1]; z__[50] = d__[is + is * d_dim1]; z__[51] = d__[is + isp1 * d_dim1]; z__[52] = -e[js + jsp1 * e_dim1]; z__[54] = -e[jsp1 + jsp1 * e_dim1]; z__[59] = d__[isp1 + isp1 * d_dim1]; z__[61] = -e[js + jsp1 * e_dim1]; z__[63] = -e[jsp1 + jsp1 * e_dim1]; /* Set up right hand side(s) */ k = 1; ii = mb * nb + 1; i__3 = nb - 1; for (jj = 0; jj <= i__3; ++jj) { _starpu_dcopy_(&mb, &c__[is + (js + jj) * c_dim1], &c__1, & rhs[k - 1], &c__1); _starpu_dcopy_(&mb, &f[is + (js + jj) * f_dim1], &c__1, &rhs[ ii - 1], &c__1); k += mb; ii += mb; /* L160: */ } /* Solve Z' * x = RHS */ _starpu_dgetc2_(&zdim, z__, &c__8, ipiv, jpiv, &ierr); if (ierr > 0) { *info = ierr; } _starpu_dgesc2_(&zdim, z__, &c__8, rhs, ipiv, jpiv, &scaloc); if (scaloc != 1.) { i__3 = *n; for (k = 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L170: */ } *scale *= scaloc; } /* Unpack solution vector(s) */ k = 1; ii = mb * nb + 1; i__3 = nb - 1; for (jj = 0; jj <= i__3; ++jj) { _starpu_dcopy_(&mb, &rhs[k - 1], &c__1, &c__[is + (js + jj) * c_dim1], &c__1); _starpu_dcopy_(&mb, &rhs[ii - 1], &c__1, &f[is + (js + jj) * f_dim1], &c__1); k += mb; ii += mb; /* L180: */ } /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (j > p + 2) { i__3 = js - 1; _starpu_dgemm_("N", "T", &mb, &i__3, &nb, &c_b42, &c__[is + js * c_dim1], ldc, &b[js * b_dim1 + 1], ldb, & c_b42, &f[is + f_dim1], ldf); i__3 = js - 1; _starpu_dgemm_("N", "T", &mb, &i__3, &nb, &c_b42, &f[is + js * f_dim1], ldf, &e[js * e_dim1 + 1], lde, & c_b42, &f[is + f_dim1], ldf); } if (i__ < p) { i__3 = *m - ie; _starpu_dgemm_("T", "N", &i__3, &nb, &mb, &c_b27, &a[is + (ie + 1) * a_dim1], lda, &c__[is + js * c_dim1], ldc, &c_b42, &c__[ie + 1 + js * c_dim1], ldc); i__3 = *m - ie; _starpu_dgemm_("T", "N", &i__3, &nb, &mb, &c_b27, &d__[is + ( ie + 1) * d_dim1], ldd, &f[is + js * f_dim1], ldf, &c_b42, &c__[ie + 1 + js * c_dim1], ldc); } } /* L190: */ } /* L200: */ } } return 0; /* End of DTGSY2 */ } /* _starpu_dtgsy2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtgsyl.c000066400000000000000000000521561413463044200206650ustar00rootroot00000000000000/* dtgsyl.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__2 = 2; static integer c_n1 = -1; static integer c__5 = 5; static doublereal c_b14 = 0.; static integer c__1 = 1; static doublereal c_b51 = -1.; static doublereal c_b52 = 1.; /* Subroutine */ int _starpu_dtgsyl_(char *trans, integer *ijob, integer *m, integer * n, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * scale, doublereal *dif, doublereal *work, integer *lwork, integer * iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, d_dim1, d_offset, e_dim1, e_offset, f_dim1, f_offset, i__1, i__2, i__3, i__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k, p, q, ie, je, mb, nb, is, js, pq; doublereal dsum; integer ppqq; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *), _starpu_dgemm_(char *, char *, integer *, integer *, integer * , doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer ifunc, linfo, lwmin; doublereal scale2; extern /* Subroutine */ int _starpu_dtgsy2_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, integer *, integer *); doublereal dscale, scaloc; extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer iround; logical notran; integer isolve; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTGSYL solves the generalized Sylvester equation: */ /* A * R - L * B = scale * C (1) */ /* D * R - L * E = scale * F */ /* where R and L are unknown m-by-n matrices, (A, D), (B, E) and */ /* (C, F) are given matrix pairs of size m-by-m, n-by-n and m-by-n, */ /* respectively, with real entries. (A, D) and (B, E) must be in */ /* generalized (real) Schur canonical form, i.e. A, B are upper quasi */ /* triangular and D, E are upper triangular. */ /* The solution (R, L) overwrites (C, F). 0 <= SCALE <= 1 is an output */ /* scaling factor chosen to avoid overflow. */ /* In matrix notation (1) is equivalent to solve Zx = scale b, where */ /* Z is defined as */ /* Z = [ kron(In, A) -kron(B', Im) ] (2) */ /* [ kron(In, D) -kron(E', Im) ]. */ /* Here Ik is the identity matrix of size k and X' is the transpose of */ /* X. kron(X, Y) is the Kronecker product between the matrices X and Y. */ /* If TRANS = 'T', DTGSYL solves the transposed system Z'*y = scale*b, */ /* which is equivalent to solve for R and L in */ /* A' * R + D' * L = scale * C (3) */ /* R * B' + L * E' = scale * (-F) */ /* This case (TRANS = 'T') is used to compute an one-norm-based estimate */ /* of Dif[(A,D), (B,E)], the separation between the matrix pairs (A,D) */ /* and (B,E), using DLACON. */ /* If IJOB >= 1, DTGSYL computes a Frobenius norm-based estimate */ /* of Dif[(A,D),(B,E)]. That is, the reciprocal of a lower bound on the */ /* reciprocal of the smallest singular value of Z. See [1-2] for more */ /* information. */ /* This is a level 3 BLAS algorithm. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* = 'N', solve the generalized Sylvester equation (1). */ /* = 'T', solve the 'transposed' system (3). */ /* IJOB (input) INTEGER */ /* Specifies what kind of functionality to be performed. */ /* =0: solve (1) only. */ /* =1: The functionality of 0 and 3. */ /* =2: The functionality of 0 and 4. */ /* =3: Only an estimate of Dif[(A,D), (B,E)] is computed. */ /* (look ahead strategy IJOB = 1 is used). */ /* =4: Only an estimate of Dif[(A,D), (B,E)] is computed. */ /* ( DGECON on sub-systems is used ). */ /* Not referenced if TRANS = 'T'. */ /* M (input) INTEGER */ /* The order of the matrices A and D, and the row dimension of */ /* the matrices C, F, R and L. */ /* N (input) INTEGER */ /* The order of the matrices B and E, and the column dimension */ /* of the matrices C, F, R and L. */ /* A (input) DOUBLE PRECISION array, dimension (LDA, M) */ /* The upper quasi triangular matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1, M). */ /* B (input) DOUBLE PRECISION array, dimension (LDB, N) */ /* The upper quasi triangular matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1, N). */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC, N) */ /* On entry, C contains the right-hand-side of the first matrix */ /* equation in (1) or (3). */ /* On exit, if IJOB = 0, 1 or 2, C has been overwritten by */ /* the solution R. If IJOB = 3 or 4 and TRANS = 'N', C holds R, */ /* the solution achieved during the computation of the */ /* Dif-estimate. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1, M). */ /* D (input) DOUBLE PRECISION array, dimension (LDD, M) */ /* The upper triangular matrix D. */ /* LDD (input) INTEGER */ /* The leading dimension of the array D. LDD >= max(1, M). */ /* E (input) DOUBLE PRECISION array, dimension (LDE, N) */ /* The upper triangular matrix E. */ /* LDE (input) INTEGER */ /* The leading dimension of the array E. LDE >= max(1, N). */ /* F (input/output) DOUBLE PRECISION array, dimension (LDF, N) */ /* On entry, F contains the right-hand-side of the second matrix */ /* equation in (1) or (3). */ /* On exit, if IJOB = 0, 1 or 2, F has been overwritten by */ /* the solution L. If IJOB = 3 or 4 and TRANS = 'N', F holds L, */ /* the solution achieved during the computation of the */ /* Dif-estimate. */ /* LDF (input) INTEGER */ /* The leading dimension of the array F. LDF >= max(1, M). */ /* DIF (output) DOUBLE PRECISION */ /* On exit DIF is the reciprocal of a lower bound of the */ /* reciprocal of the Dif-function, i.e. DIF is an upper bound of */ /* Dif[(A,D), (B,E)] = sigma_min(Z), where Z as in (2). */ /* IF IJOB = 0 or TRANS = 'T', DIF is not touched. */ /* SCALE (output) DOUBLE PRECISION */ /* On exit SCALE is the scaling factor in (1) or (3). */ /* If 0 < SCALE < 1, C and F hold the solutions R and L, resp., */ /* to a slightly perturbed system but the input matrices A, B, D */ /* and E have not been changed. If SCALE = 0, C and F hold the */ /* solutions R and L, respectively, to the homogeneous system */ /* with C = F = 0. Normally, SCALE = 1. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK > = 1. */ /* If IJOB = 1 or 2 and TRANS = 'N', LWORK >= max(1,2*M*N). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (M+N+6) */ /* INFO (output) INTEGER */ /* =0: successful exit */ /* <0: If INFO = -i, the i-th argument had an illegal value. */ /* >0: (A, D) and (B, E) have common or close eigenvalues. */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* Bo Kagstrom and Peter Poromaa, Department of Computing Science, */ /* Umea University, S-901 87 Umea, Sweden. */ /* [1] B. Kagstrom and P. Poromaa, LAPACK-Style Algorithms and Software */ /* for Solving the Generalized Sylvester Equation and Estimating the */ /* Separation between Regular Matrix Pairs, Report UMINF - 93.23, */ /* Department of Computing Science, Umea University, S-901 87 Umea, */ /* Sweden, December 1993, Revised April 1994, Also as LAPACK Working */ /* Note 75. To appear in ACM Trans. on Math. Software, Vol 22, */ /* No 1, 1996. */ /* [2] B. Kagstrom, A Perturbation Analysis of the Generalized Sylvester */ /* Equation (AR - LB, DR - LE ) = (C, F), SIAM J. Matrix Anal. */ /* Appl., 15(4):1045-1060, 1994 */ /* [3] B. Kagstrom and L. Westin, Generalized Schur Methods with */ /* Condition Estimators for Solving the Generalized Sylvester */ /* Equation, IEEE Transactions on Automatic Control, Vol. 34, No. 7, */ /* July 1989, pp 745-751. */ /* ===================================================================== */ /* Replaced various illegal calls to DCOPY by calls to DLASET. */ /* Sven Hammarling, 1/5/02. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; d_dim1 = *ldd; d_offset = 1 + d_dim1; d__ -= d_offset; e_dim1 = *lde; e_offset = 1 + e_dim1; e -= e_offset; f_dim1 = *ldf; f_offset = 1 + f_dim1; f -= f_offset; --work; --iwork; /* Function Body */ *info = 0; notran = _starpu_lsame_(trans, "N"); lquery = *lwork == -1; if (! notran && ! _starpu_lsame_(trans, "T")) { *info = -1; } else if (notran) { if (*ijob < 0 || *ijob > 4) { *info = -2; } } if (*info == 0) { if (*m <= 0) { *info = -3; } else if (*n <= 0) { *info = -4; } else if (*lda < max(1,*m)) { *info = -6; } else if (*ldb < max(1,*n)) { *info = -8; } else if (*ldc < max(1,*m)) { *info = -10; } else if (*ldd < max(1,*m)) { *info = -12; } else if (*lde < max(1,*n)) { *info = -14; } else if (*ldf < max(1,*m)) { *info = -16; } } if (*info == 0) { if (notran) { if (*ijob == 1 || *ijob == 2) { /* Computing MAX */ i__1 = 1, i__2 = (*m << 1) * *n; lwmin = max(i__1,i__2); } else { lwmin = 1; } } else { lwmin = 1; } work[1] = (doublereal) lwmin; if (*lwork < lwmin && ! lquery) { *info = -20; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTGSYL", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { *scale = 1.; if (notran) { if (*ijob != 0) { *dif = 0.; } } return 0; } /* Determine optimal block sizes MB and NB */ mb = _starpu_ilaenv_(&c__2, "DTGSYL", trans, m, n, &c_n1, &c_n1); nb = _starpu_ilaenv_(&c__5, "DTGSYL", trans, m, n, &c_n1, &c_n1); isolve = 1; ifunc = 0; if (notran) { if (*ijob >= 3) { ifunc = *ijob - 2; _starpu_dlaset_("F", m, n, &c_b14, &c_b14, &c__[c_offset], ldc) ; _starpu_dlaset_("F", m, n, &c_b14, &c_b14, &f[f_offset], ldf); } else if (*ijob >= 1) { isolve = 2; } } if (mb <= 1 && nb <= 1 || mb >= *m && nb >= *n) { i__1 = isolve; for (iround = 1; iround <= i__1; ++iround) { /* Use unblocked Level 2 solver */ dscale = 0.; dsum = 1.; pq = 0; _starpu_dtgsy2_(trans, &ifunc, m, n, &a[a_offset], lda, &b[b_offset], ldb, &c__[c_offset], ldc, &d__[d_offset], ldd, &e[e_offset], lde, &f[f_offset], ldf, scale, &dsum, &dscale, &iwork[1], &pq, info); if (dscale != 0.) { if (*ijob == 1 || *ijob == 3) { *dif = sqrt((doublereal) ((*m << 1) * *n)) / (dscale * sqrt(dsum)); } else { *dif = sqrt((doublereal) pq) / (dscale * sqrt(dsum)); } } if (isolve == 2 && iround == 1) { if (notran) { ifunc = *ijob; } scale2 = *scale; _starpu_dlacpy_("F", m, n, &c__[c_offset], ldc, &work[1], m); _starpu_dlacpy_("F", m, n, &f[f_offset], ldf, &work[*m * *n + 1], m); _starpu_dlaset_("F", m, n, &c_b14, &c_b14, &c__[c_offset], ldc); _starpu_dlaset_("F", m, n, &c_b14, &c_b14, &f[f_offset], ldf); } else if (isolve == 2 && iround == 2) { _starpu_dlacpy_("F", m, n, &work[1], m, &c__[c_offset], ldc); _starpu_dlacpy_("F", m, n, &work[*m * *n + 1], m, &f[f_offset], ldf); *scale = scale2; } /* L30: */ } return 0; } /* Determine block structure of A */ p = 0; i__ = 1; L40: if (i__ > *m) { goto L50; } ++p; iwork[p] = i__; i__ += mb; if (i__ >= *m) { goto L50; } if (a[i__ + (i__ - 1) * a_dim1] != 0.) { ++i__; } goto L40; L50: iwork[p + 1] = *m + 1; if (iwork[p] == iwork[p + 1]) { --p; } /* Determine block structure of B */ q = p + 1; j = 1; L60: if (j > *n) { goto L70; } ++q; iwork[q] = j; j += nb; if (j >= *n) { goto L70; } if (b[j + (j - 1) * b_dim1] != 0.) { ++j; } goto L60; L70: iwork[q + 1] = *n + 1; if (iwork[q] == iwork[q + 1]) { --q; } if (notran) { i__1 = isolve; for (iround = 1; iround <= i__1; ++iround) { /* Solve (I, J)-subsystem */ /* A(I, I) * R(I, J) - L(I, J) * B(J, J) = C(I, J) */ /* D(I, I) * R(I, J) - L(I, J) * E(J, J) = F(I, J) */ /* for I = P, P - 1,..., 1; J = 1, 2,..., Q */ dscale = 0.; dsum = 1.; pq = 0; *scale = 1.; i__2 = q; for (j = p + 2; j <= i__2; ++j) { js = iwork[j]; je = iwork[j + 1] - 1; nb = je - js + 1; for (i__ = p; i__ >= 1; --i__) { is = iwork[i__]; ie = iwork[i__ + 1] - 1; mb = ie - is + 1; ppqq = 0; _starpu_dtgsy2_(trans, &ifunc, &mb, &nb, &a[is + is * a_dim1], lda, &b[js + js * b_dim1], ldb, &c__[is + js * c_dim1], ldc, &d__[is + is * d_dim1], ldd, &e[js + js * e_dim1], lde, &f[is + js * f_dim1], ldf, & scaloc, &dsum, &dscale, &iwork[q + 2], &ppqq, & linfo); if (linfo > 0) { *info = linfo; } pq += ppqq; if (scaloc != 1.) { i__3 = js - 1; for (k = 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L80: */ } i__3 = je; for (k = js; k <= i__3; ++k) { i__4 = is - 1; _starpu_dscal_(&i__4, &scaloc, &c__[k * c_dim1 + 1], & c__1); i__4 = is - 1; _starpu_dscal_(&i__4, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L90: */ } i__3 = je; for (k = js; k <= i__3; ++k) { i__4 = *m - ie; _starpu_dscal_(&i__4, &scaloc, &c__[ie + 1 + k * c_dim1], &c__1); i__4 = *m - ie; _starpu_dscal_(&i__4, &scaloc, &f[ie + 1 + k * f_dim1], & c__1); /* L100: */ } i__3 = *n; for (k = je + 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L110: */ } *scale *= scaloc; } /* Substitute R(I, J) and L(I, J) into remaining */ /* equation. */ if (i__ > 1) { i__3 = is - 1; _starpu_dgemm_("N", "N", &i__3, &nb, &mb, &c_b51, &a[is * a_dim1 + 1], lda, &c__[is + js * c_dim1], ldc, &c_b52, &c__[js * c_dim1 + 1], ldc); i__3 = is - 1; _starpu_dgemm_("N", "N", &i__3, &nb, &mb, &c_b51, &d__[is * d_dim1 + 1], ldd, &c__[is + js * c_dim1], ldc, &c_b52, &f[js * f_dim1 + 1], ldf); } if (j < q) { i__3 = *n - je; _starpu_dgemm_("N", "N", &mb, &i__3, &nb, &c_b52, &f[is + js * f_dim1], ldf, &b[js + (je + 1) * b_dim1], ldb, &c_b52, &c__[is + (je + 1) * c_dim1], ldc); i__3 = *n - je; _starpu_dgemm_("N", "N", &mb, &i__3, &nb, &c_b52, &f[is + js * f_dim1], ldf, &e[js + (je + 1) * e_dim1], lde, &c_b52, &f[is + (je + 1) * f_dim1], ldf); } /* L120: */ } /* L130: */ } if (dscale != 0.) { if (*ijob == 1 || *ijob == 3) { *dif = sqrt((doublereal) ((*m << 1) * *n)) / (dscale * sqrt(dsum)); } else { *dif = sqrt((doublereal) pq) / (dscale * sqrt(dsum)); } } if (isolve == 2 && iround == 1) { if (notran) { ifunc = *ijob; } scale2 = *scale; _starpu_dlacpy_("F", m, n, &c__[c_offset], ldc, &work[1], m); _starpu_dlacpy_("F", m, n, &f[f_offset], ldf, &work[*m * *n + 1], m); _starpu_dlaset_("F", m, n, &c_b14, &c_b14, &c__[c_offset], ldc); _starpu_dlaset_("F", m, n, &c_b14, &c_b14, &f[f_offset], ldf); } else if (isolve == 2 && iround == 2) { _starpu_dlacpy_("F", m, n, &work[1], m, &c__[c_offset], ldc); _starpu_dlacpy_("F", m, n, &work[*m * *n + 1], m, &f[f_offset], ldf); *scale = scale2; } /* L150: */ } } else { /* Solve transposed (I, J)-subsystem */ /* A(I, I)' * R(I, J) + D(I, I)' * L(I, J) = C(I, J) */ /* R(I, J) * B(J, J)' + L(I, J) * E(J, J)' = -F(I, J) */ /* for I = 1,2,..., P; J = Q, Q-1,..., 1 */ *scale = 1.; i__1 = p; for (i__ = 1; i__ <= i__1; ++i__) { is = iwork[i__]; ie = iwork[i__ + 1] - 1; mb = ie - is + 1; i__2 = p + 2; for (j = q; j >= i__2; --j) { js = iwork[j]; je = iwork[j + 1] - 1; nb = je - js + 1; _starpu_dtgsy2_(trans, &ifunc, &mb, &nb, &a[is + is * a_dim1], lda, & b[js + js * b_dim1], ldb, &c__[is + js * c_dim1], ldc, &d__[is + is * d_dim1], ldd, &e[js + js * e_dim1], lde, &f[is + js * f_dim1], ldf, &scaloc, &dsum, & dscale, &iwork[q + 2], &ppqq, &linfo); if (linfo > 0) { *info = linfo; } if (scaloc != 1.) { i__3 = js - 1; for (k = 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L160: */ } i__3 = je; for (k = js; k <= i__3; ++k) { i__4 = is - 1; _starpu_dscal_(&i__4, &scaloc, &c__[k * c_dim1 + 1], &c__1); i__4 = is - 1; _starpu_dscal_(&i__4, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L170: */ } i__3 = je; for (k = js; k <= i__3; ++k) { i__4 = *m - ie; _starpu_dscal_(&i__4, &scaloc, &c__[ie + 1 + k * c_dim1], & c__1); i__4 = *m - ie; _starpu_dscal_(&i__4, &scaloc, &f[ie + 1 + k * f_dim1], &c__1) ; /* L180: */ } i__3 = *n; for (k = je + 1; k <= i__3; ++k) { _starpu_dscal_(m, &scaloc, &c__[k * c_dim1 + 1], &c__1); _starpu_dscal_(m, &scaloc, &f[k * f_dim1 + 1], &c__1); /* L190: */ } *scale *= scaloc; } /* Substitute R(I, J) and L(I, J) into remaining equation. */ if (j > p + 2) { i__3 = js - 1; _starpu_dgemm_("N", "T", &mb, &i__3, &nb, &c_b52, &c__[is + js * c_dim1], ldc, &b[js * b_dim1 + 1], ldb, &c_b52, & f[is + f_dim1], ldf); i__3 = js - 1; _starpu_dgemm_("N", "T", &mb, &i__3, &nb, &c_b52, &f[is + js * f_dim1], ldf, &e[js * e_dim1 + 1], lde, &c_b52, & f[is + f_dim1], ldf); } if (i__ < p) { i__3 = *m - ie; _starpu_dgemm_("T", "N", &i__3, &nb, &mb, &c_b51, &a[is + (ie + 1) * a_dim1], lda, &c__[is + js * c_dim1], ldc, & c_b52, &c__[ie + 1 + js * c_dim1], ldc); i__3 = *m - ie; _starpu_dgemm_("T", "N", &i__3, &nb, &mb, &c_b51, &d__[is + (ie + 1) * d_dim1], ldd, &f[is + js * f_dim1], ldf, & c_b52, &c__[ie + 1 + js * c_dim1], ldc); } /* L200: */ } /* L210: */ } } work[1] = (doublereal) lwmin; return 0; /* End of DTGSYL */ } /* _starpu_dtgsyl_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtpcon.c000066400000000000000000000150521413463044200206400ustar00rootroot00000000000000/* dtpcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtpcon_(char *norm, char *uplo, char *diag, integer *n, doublereal *ap, doublereal *rcond, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer i__1; doublereal d__1; /* Local variables */ integer ix, kase, kase1; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); doublereal anorm; logical upper; doublereal xnorm; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlantp_(char *, char *, char *, integer *, doublereal *, doublereal *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dlatps_(char *, char *, char *, char *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); logical onenrm; char normin[1]; doublereal smlnum; logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPCON estimates the reciprocal of the condition number of a packed */ /* triangular matrix A, in either the 1-norm or the infinity-norm. */ /* The norm of A is computed and an estimate is obtained for */ /* norm(inv(A)), then the reciprocal of the condition number is */ /* computed as */ /* RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies whether the 1-norm condition number or the */ /* infinity-norm condition number is required: */ /* = '1' or 'O': 1-norm; */ /* = 'I': Infinity-norm. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangular matrix A, packed columnwise in */ /* a linear array. The j-th column of A is stored in the array */ /* AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* If DIAG = 'U', the diagonal elements of A are not referenced */ /* and are assumed to be 1. */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(norm(A) * norm(inv(A))). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --iwork; --work; --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); onenrm = *(unsigned char *)norm == '1' || _starpu_lsame_(norm, "O"); nounit = _starpu_lsame_(diag, "N"); if (! onenrm && ! _starpu_lsame_(norm, "I")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTPCON", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *rcond = 1.; return 0; } *rcond = 0.; smlnum = _starpu_dlamch_("Safe minimum") * (doublereal) max(1,*n); /* Compute the norm of the triangular matrix A. */ anorm = _starpu_dlantp_(norm, uplo, diag, n, &ap[1], &work[1]); /* Continue only if ANORM > 0. */ if (anorm > 0.) { /* Estimate the norm of the inverse of A. */ ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { kase1 = 1; } else { kase1 = 2; } kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { /* Multiply by inv(A). */ _starpu_dlatps_(uplo, "No transpose", diag, normin, n, &ap[1], &work[ 1], &scale, &work[(*n << 1) + 1], info); } else { /* Multiply by inv(A'). */ _starpu_dlatps_(uplo, "Transpose", diag, normin, n, &ap[1], &work[1], &scale, &work[(*n << 1) + 1], info); } *(unsigned char *)normin = 'Y'; /* Multiply by 1/SCALE if doing so will not cause overflow. */ if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); xnorm = (d__1 = work[ix], abs(d__1)); if (scale < xnorm * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / anorm / ainvnm; } } L20: return 0; /* End of DTPCON */ } /* _starpu_dtpcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtprfs.c000066400000000000000000000330731413463044200206560ustar00rootroot00000000000000/* dtprfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b19 = -1.; /* Subroutine */ int _starpu_dtprfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s; integer kc; doublereal xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; char transt[1]; logical nounit; doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPRFS provides error bounds and backward error estimates for the */ /* solution to a system of linear equations with a triangular packed */ /* coefficient matrix. */ /* The solution matrix X must be computed by DTPTRS or some other */ /* means before entering this routine. DTPRFS does not do iterative */ /* refinement because doing so cannot improve the backward error. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangular matrix A, packed columnwise in */ /* a linear array. The j-th column of A is stored in the array */ /* AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* If DIAG = 'U', the diagonal elements of A are not referenced */ /* and are assumed to be 1. */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* The solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); notran = _starpu_lsame_(trans, "N"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } else if (*ldx < max(1,*n)) { *info = -10; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTPRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Compute residual R = B - op(A) * X, */ /* where op(A) = A or A', depending on TRANS. */ _starpu_dcopy_(n, &x[j * x_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dtpmv_(uplo, trans, diag, n, &ap[1], &work[*n + 1], &c__1); _starpu_daxpy_(n, &c_b19, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L20: */ } if (notran) { /* Compute abs(A)*abs(X) + abs(B). */ if (upper) { kc = 1; if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[kc + i__ - 1], abs(d__1)) * xk; /* L30: */ } kc += k; /* L40: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[kc + i__ - 1], abs(d__1)) * xk; /* L50: */ } work[k] += xk; kc += k; /* L60: */ } } } else { kc = 1; if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = k; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[kc + i__ - k], abs(d__1)) * xk; /* L70: */ } kc = kc + *n - k + 1; /* L80: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = ap[kc + i__ - k], abs(d__1)) * xk; /* L90: */ } work[k] += xk; kc = kc + *n - k + 1; /* L100: */ } } } } else { /* Compute abs(A')*abs(X) + abs(B). */ if (upper) { kc = 1; if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; i__3 = k; for (i__ = 1; i__ <= i__3; ++i__) { s += (d__1 = ap[kc + i__ - 1], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L110: */ } work[k] += s; kc += k; /* L120: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { s += (d__1 = ap[kc + i__ - 1], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L130: */ } work[k] += s; kc += k; /* L140: */ } } } else { kc = 1; if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; i__3 = *n; for (i__ = k; i__ <= i__3; ++i__) { s += (d__1 = ap[kc + i__ - k], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L150: */ } work[k] += s; kc = kc + *n - k + 1; /* L160: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { s += (d__1 = ap[kc + i__ - k], abs(d__1)) * (d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L170: */ } work[k] += s; kc = kc + *n - k + 1; /* L180: */ } } } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L190: */ } berr[j] = s; /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(op(A)))* */ /* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(op(A)) is the inverse of op(A) */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(op(A))*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(op(A)) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L200: */ } kase = 0; L210: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(op(A)'). */ _starpu_dtpsv_(uplo, transt, diag, n, &ap[1], &work[*n + 1], &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L220: */ } } else { /* Multiply by inv(op(A))*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L230: */ } _starpu_dtpsv_(uplo, trans, diag, n, &ap[1], &work[*n + 1], &c__1); } goto L210; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L240: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L250: */ } return 0; /* End of DTPRFS */ } /* _starpu_dtprfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtptri.c000066400000000000000000000132641413463044200206620ustar00rootroot00000000000000/* dtptri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtptri_(char *uplo, char *diag, integer *n, doublereal * ap, integer *info) { /* System generated locals */ integer i__1, i__2; /* Local variables */ integer j, jc, jj; doublereal ajj; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtpmv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); integer jclast; logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPTRI computes the inverse of a real upper or lower triangular */ /* matrix A stored in packed format. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input/output) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* On entry, the upper or lower triangular matrix A, stored */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*((2*n-j)/2) = A(i,j) for j<=i<=n. */ /* See below for further details. */ /* On exit, the (triangular) inverse of the original matrix, in */ /* the same packed storage format. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ /* matrix is singular and its inverse can not be computed. */ /* Further Details */ /* =============== */ /* A triangular matrix A can be transferred to packed storage using one */ /* of the following program segments: */ /* UPLO = 'U': UPLO = 'L': */ /* JC = 1 JC = 1 */ /* DO 2 J = 1, N DO 2 J = 1, N */ /* DO 1 I = 1, J DO 1 I = J, N */ /* AP(JC+I-1) = A(I,J) AP(JC+I-J) = A(I,J) */ /* 1 CONTINUE 1 CONTINUE */ /* JC = JC + J JC = JC + N - J + 1 */ /* 2 CONTINUE 2 CONTINUE */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTPTRI", &i__1); return 0; } /* Check for singularity if non-unit. */ if (nounit) { if (upper) { jj = 0; i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { jj += *info; if (ap[jj] == 0.) { return 0; } /* L10: */ } } else { jj = 1; i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ap[jj] == 0.) { return 0; } jj = jj + *n - *info + 1; /* L20: */ } } *info = 0; } if (upper) { /* Compute inverse of upper triangular matrix. */ jc = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (nounit) { ap[jc + j - 1] = 1. / ap[jc + j - 1]; ajj = -ap[jc + j - 1]; } else { ajj = -1.; } /* Compute elements 1:j-1 of j-th column. */ i__2 = j - 1; _starpu_dtpmv_("Upper", "No transpose", diag, &i__2, &ap[1], &ap[jc], & c__1); i__2 = j - 1; _starpu_dscal_(&i__2, &ajj, &ap[jc], &c__1); jc += j; /* L30: */ } } else { /* Compute inverse of lower triangular matrix. */ jc = *n * (*n + 1) / 2; for (j = *n; j >= 1; --j) { if (nounit) { ap[jc] = 1. / ap[jc]; ajj = -ap[jc]; } else { ajj = -1.; } if (j < *n) { /* Compute elements j+1:n of j-th column. */ i__1 = *n - j; _starpu_dtpmv_("Lower", "No transpose", diag, &i__1, &ap[jclast], &ap[ jc + 1], &c__1); i__1 = *n - j; _starpu_dscal_(&i__1, &ajj, &ap[jc + 1], &c__1); } jclast = jc; jc = jc - *n + j - 2; /* L40: */ } } return 0; /* End of DTPTRI */ } /* _starpu_dtptri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtptrs.c000066400000000000000000000123071413463044200206710ustar00rootroot00000000000000/* dtptrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtptrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer * info) { /* System generated locals */ integer b_dim1, b_offset, i__1; /* Local variables */ integer j, jc; extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_dtpsv_(char *, char *, char *, integer *, doublereal *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPTRS solves a triangular system of the form */ /* A * X = B or A**T * X = B, */ /* where A is a triangular matrix of order N stored in packed format, */ /* and B is an N-by-NRHS matrix. A check is made to verify that A is */ /* nonsingular. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension (N*(N+1)/2) */ /* The upper or lower triangular matrix A, packed columnwise in */ /* a linear array. The j-th column of A is stored in the array */ /* AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, if INFO = 0, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of A is zero, */ /* indicating that the matrix is singular and the */ /* solutions X have not been computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*ldb < max(1,*n)) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTPTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check for singularity. */ if (nounit) { if (upper) { jc = 1; i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ap[jc + *info - 1] == 0.) { return 0; } jc += *info; /* L10: */ } } else { jc = 1; i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (ap[jc] == 0.) { return 0; } jc = jc + *n - *info + 1; /* L20: */ } } } *info = 0; /* Solve A * x = b or A' * x = b. */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { _starpu_dtpsv_(uplo, trans, diag, n, &ap[1], &b[j * b_dim1 + 1], &c__1); /* L30: */ } return 0; /* End of DTPTRS */ } /* _starpu_dtptrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtpttf.c000066400000000000000000000273341413463044200206640ustar00rootroot00000000000000/* dtpttf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtpttf_(char *transr, char *uplo, integer *n, doublereal *ap, doublereal *arf, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ integer i__, j, k, n1, n2, ij, jp, js, nt, lda, ijp; logical normaltransr; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nisodd; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* Purpose */ /* ======= */ /* DTPTTF copies a triangular matrix A from standard packed format (TP) */ /* to rectangular full packed format (TF). */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': ARF in Normal format is wanted; */ /* = 'T': ARF in Conjugate-transpose format is wanted. */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ), */ /* On entry, the upper or lower triangular matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* ARF (output) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ), */ /* On exit, the upper or lower triangular matrix A stored in */ /* RFP format. For a further discussion see Notes below. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTPTTF", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (normaltransr) { arf[0] = ap[0]; } else { arf[0] = ap[0]; } return 0; } /* Size of array ARF(0:NT-1) */ nt = *n * (*n + 1) / 2; /* Set N1 and N2 depending on LOWER */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* If N is odd, set NISODD = .TRUE. */ /* If N is even, set K = N/2 and NISODD = .FALSE. */ /* set lda of ARF^C; ARF^C is (0:(N+1)/2-1,0:N-noe) */ /* where noe = 0 if n is even, noe = 1 if n is odd */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; lda = *n + 1; } else { nisodd = TRUE_; lda = *n; } /* ARF^C has lda rows and n+1-noe cols */ if (! normaltransr) { lda = (*n + 1) / 2; } /* start execution: there are eight cases */ if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* N is odd, TRANSR = 'N', and UPLO = 'L' */ ijp = 0; jp = 0; i__1 = n2; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { ij = i__ + jp; arf[ij] = ap[ijp]; ++ijp; } jp += lda; } i__1 = n2 - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = n2; for (j = i__ + 1; j <= i__2; ++j) { ij = i__ + j * lda; arf[ij] = ap[ijp]; ++ijp; } } } else { /* N is odd, TRANSR = 'N', and UPLO = 'U' */ ijp = 0; i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { ij = n2 + j; i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = ap[ijp]; ++ijp; ij += lda; } } js = 0; i__1 = *n - 1; for (j = n1; j <= i__1; ++j) { ij = js; i__2 = js + j; for (ij = js; ij <= i__2; ++ij) { arf[ij] = ap[ijp]; ++ijp; } js += lda; } } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* N is odd, TRANSR = 'T', and UPLO = 'L' */ ijp = 0; i__1 = n2; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = *n * lda - 1; i__3 = lda; for (ij = i__ * (lda + 1); i__3 < 0 ? ij >= i__2 : ij <= i__2; ij += i__3) { arf[ij] = ap[ijp]; ++ijp; } } js = 1; i__1 = n2 - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + n2 - j - 1; for (ij = js; ij <= i__3; ++ij) { arf[ij] = ap[ijp]; ++ijp; } js = js + lda + 1; } } else { /* N is odd, TRANSR = 'T', and UPLO = 'U' */ ijp = 0; js = n2 * lda; i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + j; for (ij = js; ij <= i__3; ++ij) { arf[ij] = ap[ijp]; ++ijp; } js += lda; } i__1 = n1; for (i__ = 0; i__ <= i__1; ++i__) { i__3 = i__ + (n1 + i__) * lda; i__2 = lda; for (ij = i__; i__2 < 0 ? ij >= i__3 : ij <= i__3; ij += i__2) { arf[ij] = ap[ijp]; ++ijp; } } } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* N is even, TRANSR = 'N', and UPLO = 'L' */ ijp = 0; jp = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { ij = i__ + 1 + jp; arf[ij] = ap[ijp]; ++ijp; } jp += lda; } i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = k - 1; for (j = i__; j <= i__2; ++j) { ij = i__ + j * lda; arf[ij] = ap[ijp]; ++ijp; } } } else { /* N is even, TRANSR = 'N', and UPLO = 'U' */ ijp = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { ij = k + 1 + j; i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = ap[ijp]; ++ijp; ij += lda; } } js = 0; i__1 = *n - 1; for (j = k; j <= i__1; ++j) { ij = js; i__2 = js + j; for (ij = js; ij <= i__2; ++ij) { arf[ij] = ap[ijp]; ++ijp; } js += lda; } } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* N is even, TRANSR = 'T', and UPLO = 'L' */ ijp = 0; i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__2 = (*n + 1) * lda - 1; i__3 = lda; for (ij = i__ + (i__ + 1) * lda; i__3 < 0 ? ij >= i__2 : ij <= i__2; ij += i__3) { arf[ij] = ap[ijp]; ++ijp; } } js = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + k - j - 1; for (ij = js; ij <= i__3; ++ij) { arf[ij] = ap[ijp]; ++ijp; } js = js + lda + 1; } } else { /* N is even, TRANSR = 'T', and UPLO = 'U' */ ijp = 0; js = (k + 1) * lda; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__3 = js + j; for (ij = js; ij <= i__3; ++ij) { arf[ij] = ap[ijp]; ++ijp; } js += lda; } i__1 = k - 1; for (i__ = 0; i__ <= i__1; ++i__) { i__3 = i__ + (k + i__) * lda; i__2 = lda; for (ij = i__; i__2 < 0 ? ij >= i__3 : ij <= i__3; ij += i__2) { arf[ij] = ap[ijp]; ++ijp; } } } } } return 0; /* End of DTPTTF */ } /* _starpu_dtpttf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtpttr.c000066400000000000000000000101101413463044200206600ustar00rootroot00000000000000/* dtpttr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtpttr_(char *uplo, integer *n, doublereal *ap, doublereal *a, integer *lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, k; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Julien Langou of the Univ. of Colorado Denver -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTPTTR copies a triangular matrix A from standard packed format (TP) */ /* to standard full format (TR). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular. */ /* = 'L': A is lower triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* AP (input) DOUBLE PRECISION array, dimension ( N*(N+1)/2 ), */ /* On entry, the upper or lower triangular matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* A (output) DOUBLE PRECISION array, dimension ( LDA, N ) */ /* On exit, the triangular matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ --ap; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; lower = _starpu_lsame_(uplo, "L"); if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTPTTR", &i__1); return 0; } if (lower) { k = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { ++k; a[i__ + j * a_dim1] = ap[k]; } } } else { k = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ++k; a[i__ + j * a_dim1] = ap[k]; } } } return 0; /* End of DTPTTR */ } /* _starpu_dtpttr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrcon.c000066400000000000000000000157341413463044200206510ustar00rootroot00000000000000/* dtrcon.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtrcon_(char *norm, char *uplo, char *diag, integer *n, doublereal *a, integer *lda, doublereal *rcond, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1; doublereal d__1; /* Local variables */ integer ix, kase, kase1; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_drscl_(integer *, doublereal *, doublereal *, integer *); doublereal anorm; logical upper; doublereal xnorm; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); extern doublereal _starpu_dlantr_(char *, char *, char *, integer *, integer *, doublereal *, integer *, doublereal *); doublereal ainvnm; extern /* Subroutine */ int _starpu_dlatrs_(char *, char *, char *, char *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *); logical onenrm; char normin[1]; doublereal smlnum; logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRCON estimates the reciprocal of the condition number of a */ /* triangular matrix A, in either the 1-norm or the infinity-norm. */ /* The norm of A is computed and an estimate is obtained for */ /* norm(inv(A)), then the reciprocal of the condition number is */ /* computed as */ /* RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ /* Arguments */ /* ========= */ /* NORM (input) CHARACTER*1 */ /* Specifies whether the 1-norm condition number or the */ /* infinity-norm condition number is required: */ /* = '1' or 'O': 1-norm; */ /* = 'I': Infinity-norm. */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of the array A contains the upper */ /* triangular matrix, and the strictly lower triangular part of */ /* A is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of the array A contains the lower triangular */ /* matrix, and the strictly upper triangular part of A is not */ /* referenced. If DIAG = 'U', the diagonal elements of A are */ /* also not referenced and are assumed to be 1. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* RCOND (output) DOUBLE PRECISION */ /* The reciprocal of the condition number of the matrix A, */ /* computed as RCOND = 1/(norm(A) * norm(inv(A))). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); onenrm = *(unsigned char *)norm == '1' || _starpu_lsame_(norm, "O"); nounit = _starpu_lsame_(diag, "N"); if (! onenrm && ! _starpu_lsame_(norm, "I")) { *info = -1; } else if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*lda < max(1,*n)) { *info = -6; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRCON", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { *rcond = 1.; return 0; } *rcond = 0.; smlnum = _starpu_dlamch_("Safe minimum") * (doublereal) max(1,*n); /* Compute the norm of the triangular matrix A. */ anorm = _starpu_dlantr_(norm, uplo, diag, n, n, &a[a_offset], lda, &work[1]); /* Continue only if ANORM > 0. */ if (anorm > 0.) { /* Estimate the norm of the inverse of A. */ ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { kase1 = 1; } else { kase1 = 2; } kase = 0; L10: _starpu_dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { /* Multiply by inv(A). */ _starpu_dlatrs_(uplo, "No transpose", diag, normin, n, &a[a_offset], lda, &work[1], &scale, &work[(*n << 1) + 1], info); } else { /* Multiply by inv(A'). */ _starpu_dlatrs_(uplo, "Transpose", diag, normin, n, &a[a_offset], lda, &work[1], &scale, &work[(*n << 1) + 1], info); } *(unsigned char *)normin = 'Y'; /* Multiply by 1/SCALE if doing so will not cause overflow. */ if (scale != 1.) { ix = _starpu_idamax_(n, &work[1], &c__1); xnorm = (d__1 = work[ix], abs(d__1)); if (scale < xnorm * smlnum || scale == 0.) { goto L20; } _starpu_drscl_(n, &scale, &work[1], &c__1); } goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { *rcond = 1. / anorm / ainvnm; } } L20: return 0; /* End of DTRCON */ } /* _starpu_dtrcon_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrevc.c000066400000000000000000001021321413463044200206340ustar00rootroot00000000000000/* dtrevc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static logical c_false = FALSE_; static integer c__1 = 1; static doublereal c_b22 = 1.; static doublereal c_b25 = 0.; static integer c__2 = 2; static logical c_true = TRUE_; /* Subroutine */ int _starpu_dtrevc_(char *side, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, doublereal *work, integer *info) { /* System generated locals */ integer t_dim1, t_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k; doublereal x[4] /* was [2][2] */; integer j1, j2, n2, ii, ki, ip, is; doublereal wi, wr, rec, ulp, beta, emax; logical pair; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); logical allv; integer ierr; doublereal unfl, ovfl, smin; logical over; doublereal vmax; integer jnxt; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); doublereal scale; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); doublereal remax; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); logical leftv, bothv; extern /* Subroutine */ int _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); doublereal vcrit; logical somev; doublereal xnorm; extern /* Subroutine */ int _starpu_dlaln2_(logical *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal * , doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern integer _starpu_idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; logical rightv; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTREVC computes some or all of the right and/or left eigenvectors of */ /* a real upper quasi-triangular matrix T. */ /* Matrices of this type are produced by the Schur factorization of */ /* a real general matrix: A = Q*T*Q**T, as computed by DHSEQR. */ /* The right eigenvector x and the left eigenvector y of T corresponding */ /* to an eigenvalue w are defined by: */ /* T*x = w*x, (y**H)*T = w*(y**H) */ /* where y**H denotes the conjugate transpose of y. */ /* The eigenvalues are not input to this routine, but are read directly */ /* from the diagonal blocks of T. */ /* This routine returns the matrices X and/or Y of right and left */ /* eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an */ /* input matrix. If Q is the orthogonal factor that reduces a matrix */ /* A to Schur form T, then Q*X and Q*Y are the matrices of right and */ /* left eigenvectors of A. */ /* Arguments */ /* ========= */ /* SIDE (input) CHARACTER*1 */ /* = 'R': compute right eigenvectors only; */ /* = 'L': compute left eigenvectors only; */ /* = 'B': compute both right and left eigenvectors. */ /* HOWMNY (input) CHARACTER*1 */ /* = 'A': compute all right and/or left eigenvectors; */ /* = 'B': compute all right and/or left eigenvectors, */ /* backtransformed by the matrices in VR and/or VL; */ /* = 'S': compute selected right and/or left eigenvectors, */ /* as indicated by the logical array SELECT. */ /* SELECT (input/output) LOGICAL array, dimension (N) */ /* If HOWMNY = 'S', SELECT specifies the eigenvectors to be */ /* computed. */ /* If w(j) is a real eigenvalue, the corresponding real */ /* eigenvector is computed if SELECT(j) is .TRUE.. */ /* If w(j) and w(j+1) are the real and imaginary parts of a */ /* complex eigenvalue, the corresponding complex eigenvector is */ /* computed if either SELECT(j) or SELECT(j+1) is .TRUE., and */ /* on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is set to */ /* .FALSE.. */ /* Not referenced if HOWMNY = 'A' or 'B'. */ /* N (input) INTEGER */ /* The order of the matrix T. N >= 0. */ /* T (input) DOUBLE PRECISION array, dimension (LDT,N) */ /* The upper quasi-triangular matrix T in Schur canonical form. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= max(1,N). */ /* VL (input/output) DOUBLE PRECISION array, dimension (LDVL,MM) */ /* On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must */ /* contain an N-by-N matrix Q (usually the orthogonal matrix Q */ /* of Schur vectors returned by DHSEQR). */ /* On exit, if SIDE = 'L' or 'B', VL contains: */ /* if HOWMNY = 'A', the matrix Y of left eigenvectors of T; */ /* if HOWMNY = 'B', the matrix Q*Y; */ /* if HOWMNY = 'S', the left eigenvectors of T specified by */ /* SELECT, stored consecutively in the columns */ /* of VL, in the same order as their */ /* eigenvalues. */ /* A complex eigenvector corresponding to a complex eigenvalue */ /* is stored in two consecutive columns, the first holding the */ /* real part, and the second the imaginary part. */ /* Not referenced if SIDE = 'R'. */ /* LDVL (input) INTEGER */ /* The leading dimension of the array VL. LDVL >= 1, and if */ /* SIDE = 'L' or 'B', LDVL >= N. */ /* VR (input/output) DOUBLE PRECISION array, dimension (LDVR,MM) */ /* On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must */ /* contain an N-by-N matrix Q (usually the orthogonal matrix Q */ /* of Schur vectors returned by DHSEQR). */ /* On exit, if SIDE = 'R' or 'B', VR contains: */ /* if HOWMNY = 'A', the matrix X of right eigenvectors of T; */ /* if HOWMNY = 'B', the matrix Q*X; */ /* if HOWMNY = 'S', the right eigenvectors of T specified by */ /* SELECT, stored consecutively in the columns */ /* of VR, in the same order as their */ /* eigenvalues. */ /* A complex eigenvector corresponding to a complex eigenvalue */ /* is stored in two consecutive columns, the first holding the */ /* real part and the second the imaginary part. */ /* Not referenced if SIDE = 'L'. */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. LDVR >= 1, and if */ /* SIDE = 'R' or 'B', LDVR >= N. */ /* MM (input) INTEGER */ /* The number of columns in the arrays VL and/or VR. MM >= M. */ /* M (output) INTEGER */ /* The number of columns in the arrays VL and/or VR actually */ /* used to store the eigenvectors. */ /* If HOWMNY = 'A' or 'B', M is set to N. */ /* Each selected real eigenvector occupies one column and each */ /* selected complex eigenvector occupies two columns. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The algorithm used in this program is basically backward (forward) */ /* substitution, with scaling to make the the code robust against */ /* possible overflow. */ /* Each eigenvector is normalized so that the element of largest */ /* magnitude has magnitude 1; here the magnitude of a complex number */ /* (x,y) is taken to be |x| + |y|. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters */ /* Parameter adjustments */ --select; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --work; /* Function Body */ bothv = _starpu_lsame_(side, "B"); rightv = _starpu_lsame_(side, "R") || bothv; leftv = _starpu_lsame_(side, "L") || bothv; allv = _starpu_lsame_(howmny, "A"); over = _starpu_lsame_(howmny, "B"); somev = _starpu_lsame_(howmny, "S"); *info = 0; if (! rightv && ! leftv) { *info = -1; } else if (! allv && ! over && ! somev) { *info = -2; } else if (*n < 0) { *info = -4; } else if (*ldt < max(1,*n)) { *info = -6; } else if (*ldvl < 1 || leftv && *ldvl < *n) { *info = -8; } else if (*ldvr < 1 || rightv && *ldvr < *n) { *info = -10; } else { /* Set M to the number of columns required to store the selected */ /* eigenvectors, standardize the array SELECT if necessary, and */ /* test MM. */ if (somev) { *m = 0; pair = FALSE_; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (pair) { pair = FALSE_; select[j] = FALSE_; } else { if (j < *n) { if (t[j + 1 + j * t_dim1] == 0.) { if (select[j]) { ++(*m); } } else { pair = TRUE_; if (select[j] || select[j + 1]) { select[j] = TRUE_; *m += 2; } } } else { if (select[*n]) { ++(*m); } } } /* L10: */ } } else { *m = *n; } if (*mm < *m) { *info = -11; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTREVC", &i__1); return 0; } /* Quick return if possible. */ if (*n == 0) { return 0; } /* Set the constants to control overflow. */ unfl = _starpu_dlamch_("Safe minimum"); ovfl = 1. / unfl; _starpu_dlabad_(&unfl, &ovfl); ulp = _starpu_dlamch_("Precision"); smlnum = unfl * (*n / ulp); bignum = (1. - ulp) / smlnum; /* Compute 1-norm of each column of strictly upper triangular */ /* part of T to control overflow in triangular solver. */ work[1] = 0.; i__1 = *n; for (j = 2; j <= i__1; ++j) { work[j] = 0.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[j] += (d__1 = t[i__ + j * t_dim1], abs(d__1)); /* L20: */ } /* L30: */ } /* Index IP is used to specify the real or complex eigenvalue: */ /* IP = 0, real eigenvalue, */ /* 1, first of conjugate complex pair: (wr,wi) */ /* -1, second of conjugate complex pair: (wr,wi) */ n2 = *n << 1; if (rightv) { /* Compute right eigenvectors. */ ip = 0; is = *m; for (ki = *n; ki >= 1; --ki) { if (ip == 1) { goto L130; } if (ki == 1) { goto L40; } if (t[ki + (ki - 1) * t_dim1] == 0.) { goto L40; } ip = -1; L40: if (somev) { if (ip == 0) { if (! select[ki]) { goto L130; } } else { if (! select[ki - 1]) { goto L130; } } } /* Compute the KI-th eigenvalue (WR,WI). */ wr = t[ki + ki * t_dim1]; wi = 0.; if (ip != 0) { wi = sqrt((d__1 = t[ki + (ki - 1) * t_dim1], abs(d__1))) * sqrt((d__2 = t[ki - 1 + ki * t_dim1], abs(d__2))); } /* Computing MAX */ d__1 = ulp * (abs(wr) + abs(wi)); smin = max(d__1,smlnum); if (ip == 0) { /* Real right eigenvector */ work[ki + *n] = 1.; /* Form right-hand side */ i__1 = ki - 1; for (k = 1; k <= i__1; ++k) { work[k + *n] = -t[k + ki * t_dim1]; /* L50: */ } /* Solve the upper quasi-triangular system: */ /* (T(1:KI-1,1:KI-1) - WR)*X = SCALE*WORK. */ jnxt = ki - 1; for (j = ki - 1; j >= 1; --j) { if (j > jnxt) { goto L60; } j1 = j; j2 = j; jnxt = j - 1; if (j > 1) { if (t[j + (j - 1) * t_dim1] != 0.) { j1 = j - 1; jnxt = j - 2; } } if (j1 == j2) { /* 1-by-1 diagonal block */ _starpu_dlaln2_(&c_false, &c__1, &c__1, &smin, &c_b22, &t[j + j * t_dim1], ldt, &c_b22, &c_b22, &work[j + * n], n, &wr, &c_b25, x, &c__2, &scale, &xnorm, &ierr); /* Scale X(1,1) to avoid overflow when updating */ /* the right-hand side. */ if (xnorm > 1.) { if (work[j] > bignum / xnorm) { x[0] /= xnorm; scale /= xnorm; } } /* Scale if necessary */ if (scale != 1.) { _starpu_dscal_(&ki, &scale, &work[*n + 1], &c__1); } work[j + *n] = x[0]; /* Update right-hand side */ i__1 = j - 1; d__1 = -x[0]; _starpu_daxpy_(&i__1, &d__1, &t[j * t_dim1 + 1], &c__1, &work[ *n + 1], &c__1); } else { /* 2-by-2 diagonal block */ _starpu_dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b22, &t[j - 1 + (j - 1) * t_dim1], ldt, &c_b22, &c_b22, & work[j - 1 + *n], n, &wr, &c_b25, x, &c__2, & scale, &xnorm, &ierr); /* Scale X(1,1) and X(2,1) to avoid overflow when */ /* updating the right-hand side. */ if (xnorm > 1.) { /* Computing MAX */ d__1 = work[j - 1], d__2 = work[j]; beta = max(d__1,d__2); if (beta > bignum / xnorm) { x[0] /= xnorm; x[1] /= xnorm; scale /= xnorm; } } /* Scale if necessary */ if (scale != 1.) { _starpu_dscal_(&ki, &scale, &work[*n + 1], &c__1); } work[j - 1 + *n] = x[0]; work[j + *n] = x[1]; /* Update right-hand side */ i__1 = j - 2; d__1 = -x[0]; _starpu_daxpy_(&i__1, &d__1, &t[(j - 1) * t_dim1 + 1], &c__1, &work[*n + 1], &c__1); i__1 = j - 2; d__1 = -x[1]; _starpu_daxpy_(&i__1, &d__1, &t[j * t_dim1 + 1], &c__1, &work[ *n + 1], &c__1); } L60: ; } /* Copy the vector x or Q*x to VR and normalize. */ if (! over) { _starpu_dcopy_(&ki, &work[*n + 1], &c__1, &vr[is * vr_dim1 + 1], & c__1); ii = _starpu_idamax_(&ki, &vr[is * vr_dim1 + 1], &c__1); remax = 1. / (d__1 = vr[ii + is * vr_dim1], abs(d__1)); _starpu_dscal_(&ki, &remax, &vr[is * vr_dim1 + 1], &c__1); i__1 = *n; for (k = ki + 1; k <= i__1; ++k) { vr[k + is * vr_dim1] = 0.; /* L70: */ } } else { if (ki > 1) { i__1 = ki - 1; _starpu_dgemv_("N", n, &i__1, &c_b22, &vr[vr_offset], ldvr, & work[*n + 1], &c__1, &work[ki + *n], &vr[ki * vr_dim1 + 1], &c__1); } ii = _starpu_idamax_(n, &vr[ki * vr_dim1 + 1], &c__1); remax = 1. / (d__1 = vr[ii + ki * vr_dim1], abs(d__1)); _starpu_dscal_(n, &remax, &vr[ki * vr_dim1 + 1], &c__1); } } else { /* Complex right eigenvector. */ /* Initial solve */ /* [ (T(KI-1,KI-1) T(KI-1,KI) ) - (WR + I* WI)]*X = 0. */ /* [ (T(KI,KI-1) T(KI,KI) ) ] */ if ((d__1 = t[ki - 1 + ki * t_dim1], abs(d__1)) >= (d__2 = t[ ki + (ki - 1) * t_dim1], abs(d__2))) { work[ki - 1 + *n] = 1.; work[ki + n2] = wi / t[ki - 1 + ki * t_dim1]; } else { work[ki - 1 + *n] = -wi / t[ki + (ki - 1) * t_dim1]; work[ki + n2] = 1.; } work[ki + *n] = 0.; work[ki - 1 + n2] = 0.; /* Form right-hand side */ i__1 = ki - 2; for (k = 1; k <= i__1; ++k) { work[k + *n] = -work[ki - 1 + *n] * t[k + (ki - 1) * t_dim1]; work[k + n2] = -work[ki + n2] * t[k + ki * t_dim1]; /* L80: */ } /* Solve upper quasi-triangular system: */ /* (T(1:KI-2,1:KI-2) - (WR+i*WI))*X = SCALE*(WORK+i*WORK2) */ jnxt = ki - 2; for (j = ki - 2; j >= 1; --j) { if (j > jnxt) { goto L90; } j1 = j; j2 = j; jnxt = j - 1; if (j > 1) { if (t[j + (j - 1) * t_dim1] != 0.) { j1 = j - 1; jnxt = j - 2; } } if (j1 == j2) { /* 1-by-1 diagonal block */ _starpu_dlaln2_(&c_false, &c__1, &c__2, &smin, &c_b22, &t[j + j * t_dim1], ldt, &c_b22, &c_b22, &work[j + * n], n, &wr, &wi, x, &c__2, &scale, &xnorm, & ierr); /* Scale X(1,1) and X(1,2) to avoid overflow when */ /* updating the right-hand side. */ if (xnorm > 1.) { if (work[j] > bignum / xnorm) { x[0] /= xnorm; x[2] /= xnorm; scale /= xnorm; } } /* Scale if necessary */ if (scale != 1.) { _starpu_dscal_(&ki, &scale, &work[*n + 1], &c__1); _starpu_dscal_(&ki, &scale, &work[n2 + 1], &c__1); } work[j + *n] = x[0]; work[j + n2] = x[2]; /* Update the right-hand side */ i__1 = j - 1; d__1 = -x[0]; _starpu_daxpy_(&i__1, &d__1, &t[j * t_dim1 + 1], &c__1, &work[ *n + 1], &c__1); i__1 = j - 1; d__1 = -x[2]; _starpu_daxpy_(&i__1, &d__1, &t[j * t_dim1 + 1], &c__1, &work[ n2 + 1], &c__1); } else { /* 2-by-2 diagonal block */ _starpu_dlaln2_(&c_false, &c__2, &c__2, &smin, &c_b22, &t[j - 1 + (j - 1) * t_dim1], ldt, &c_b22, &c_b22, & work[j - 1 + *n], n, &wr, &wi, x, &c__2, & scale, &xnorm, &ierr); /* Scale X to avoid overflow when updating */ /* the right-hand side. */ if (xnorm > 1.) { /* Computing MAX */ d__1 = work[j - 1], d__2 = work[j]; beta = max(d__1,d__2); if (beta > bignum / xnorm) { rec = 1. / xnorm; x[0] *= rec; x[2] *= rec; x[1] *= rec; x[3] *= rec; scale *= rec; } } /* Scale if necessary */ if (scale != 1.) { _starpu_dscal_(&ki, &scale, &work[*n + 1], &c__1); _starpu_dscal_(&ki, &scale, &work[n2 + 1], &c__1); } work[j - 1 + *n] = x[0]; work[j + *n] = x[1]; work[j - 1 + n2] = x[2]; work[j + n2] = x[3]; /* Update the right-hand side */ i__1 = j - 2; d__1 = -x[0]; _starpu_daxpy_(&i__1, &d__1, &t[(j - 1) * t_dim1 + 1], &c__1, &work[*n + 1], &c__1); i__1 = j - 2; d__1 = -x[1]; _starpu_daxpy_(&i__1, &d__1, &t[j * t_dim1 + 1], &c__1, &work[ *n + 1], &c__1); i__1 = j - 2; d__1 = -x[2]; _starpu_daxpy_(&i__1, &d__1, &t[(j - 1) * t_dim1 + 1], &c__1, &work[n2 + 1], &c__1); i__1 = j - 2; d__1 = -x[3]; _starpu_daxpy_(&i__1, &d__1, &t[j * t_dim1 + 1], &c__1, &work[ n2 + 1], &c__1); } L90: ; } /* Copy the vector x or Q*x to VR and normalize. */ if (! over) { _starpu_dcopy_(&ki, &work[*n + 1], &c__1, &vr[(is - 1) * vr_dim1 + 1], &c__1); _starpu_dcopy_(&ki, &work[n2 + 1], &c__1, &vr[is * vr_dim1 + 1], & c__1); emax = 0.; i__1 = ki; for (k = 1; k <= i__1; ++k) { /* Computing MAX */ d__3 = emax, d__4 = (d__1 = vr[k + (is - 1) * vr_dim1] , abs(d__1)) + (d__2 = vr[k + is * vr_dim1], abs(d__2)); emax = max(d__3,d__4); /* L100: */ } remax = 1. / emax; _starpu_dscal_(&ki, &remax, &vr[(is - 1) * vr_dim1 + 1], &c__1); _starpu_dscal_(&ki, &remax, &vr[is * vr_dim1 + 1], &c__1); i__1 = *n; for (k = ki + 1; k <= i__1; ++k) { vr[k + (is - 1) * vr_dim1] = 0.; vr[k + is * vr_dim1] = 0.; /* L110: */ } } else { if (ki > 2) { i__1 = ki - 2; _starpu_dgemv_("N", n, &i__1, &c_b22, &vr[vr_offset], ldvr, & work[*n + 1], &c__1, &work[ki - 1 + *n], &vr[( ki - 1) * vr_dim1 + 1], &c__1); i__1 = ki - 2; _starpu_dgemv_("N", n, &i__1, &c_b22, &vr[vr_offset], ldvr, & work[n2 + 1], &c__1, &work[ki + n2], &vr[ki * vr_dim1 + 1], &c__1); } else { _starpu_dscal_(n, &work[ki - 1 + *n], &vr[(ki - 1) * vr_dim1 + 1], &c__1); _starpu_dscal_(n, &work[ki + n2], &vr[ki * vr_dim1 + 1], & c__1); } emax = 0.; i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Computing MAX */ d__3 = emax, d__4 = (d__1 = vr[k + (ki - 1) * vr_dim1] , abs(d__1)) + (d__2 = vr[k + ki * vr_dim1], abs(d__2)); emax = max(d__3,d__4); /* L120: */ } remax = 1. / emax; _starpu_dscal_(n, &remax, &vr[(ki - 1) * vr_dim1 + 1], &c__1); _starpu_dscal_(n, &remax, &vr[ki * vr_dim1 + 1], &c__1); } } --is; if (ip != 0) { --is; } L130: if (ip == 1) { ip = 0; } if (ip == -1) { ip = 1; } /* L140: */ } } if (leftv) { /* Compute left eigenvectors. */ ip = 0; is = 1; i__1 = *n; for (ki = 1; ki <= i__1; ++ki) { if (ip == -1) { goto L250; } if (ki == *n) { goto L150; } if (t[ki + 1 + ki * t_dim1] == 0.) { goto L150; } ip = 1; L150: if (somev) { if (! select[ki]) { goto L250; } } /* Compute the KI-th eigenvalue (WR,WI). */ wr = t[ki + ki * t_dim1]; wi = 0.; if (ip != 0) { wi = sqrt((d__1 = t[ki + (ki + 1) * t_dim1], abs(d__1))) * sqrt((d__2 = t[ki + 1 + ki * t_dim1], abs(d__2))); } /* Computing MAX */ d__1 = ulp * (abs(wr) + abs(wi)); smin = max(d__1,smlnum); if (ip == 0) { /* Real left eigenvector. */ work[ki + *n] = 1.; /* Form right-hand side */ i__2 = *n; for (k = ki + 1; k <= i__2; ++k) { work[k + *n] = -t[ki + k * t_dim1]; /* L160: */ } /* Solve the quasi-triangular system: */ /* (T(KI+1:N,KI+1:N) - WR)'*X = SCALE*WORK */ vmax = 1.; vcrit = bignum; jnxt = ki + 1; i__2 = *n; for (j = ki + 1; j <= i__2; ++j) { if (j < jnxt) { goto L170; } j1 = j; j2 = j; jnxt = j + 1; if (j < *n) { if (t[j + 1 + j * t_dim1] != 0.) { j2 = j + 1; jnxt = j + 2; } } if (j1 == j2) { /* 1-by-1 diagonal block */ /* Scale if necessary to avoid overflow when forming */ /* the right-hand side. */ if (work[j] > vcrit) { rec = 1. / vmax; i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &rec, &work[ki + *n], &c__1); vmax = 1.; vcrit = bignum; } i__3 = j - ki - 1; work[j + *n] -= _starpu_ddot_(&i__3, &t[ki + 1 + j * t_dim1], &c__1, &work[ki + 1 + *n], &c__1); /* Solve (T(J,J)-WR)'*X = WORK */ _starpu_dlaln2_(&c_false, &c__1, &c__1, &smin, &c_b22, &t[j + j * t_dim1], ldt, &c_b22, &c_b22, &work[j + * n], n, &wr, &c_b25, x, &c__2, &scale, &xnorm, &ierr); /* Scale if necessary */ if (scale != 1.) { i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &scale, &work[ki + *n], &c__1); } work[j + *n] = x[0]; /* Computing MAX */ d__2 = (d__1 = work[j + *n], abs(d__1)); vmax = max(d__2,vmax); vcrit = bignum / vmax; } else { /* 2-by-2 diagonal block */ /* Scale if necessary to avoid overflow when forming */ /* the right-hand side. */ /* Computing MAX */ d__1 = work[j], d__2 = work[j + 1]; beta = max(d__1,d__2); if (beta > vcrit) { rec = 1. / vmax; i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &rec, &work[ki + *n], &c__1); vmax = 1.; vcrit = bignum; } i__3 = j - ki - 1; work[j + *n] -= _starpu_ddot_(&i__3, &t[ki + 1 + j * t_dim1], &c__1, &work[ki + 1 + *n], &c__1); i__3 = j - ki - 1; work[j + 1 + *n] -= _starpu_ddot_(&i__3, &t[ki + 1 + (j + 1) * t_dim1], &c__1, &work[ki + 1 + *n], &c__1); /* Solve */ /* [T(J,J)-WR T(J,J+1) ]'* X = SCALE*( WORK1 ) */ /* [T(J+1,J) T(J+1,J+1)-WR] ( WORK2 ) */ _starpu_dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b22, &t[j + j * t_dim1], ldt, &c_b22, &c_b22, &work[j + * n], n, &wr, &c_b25, x, &c__2, &scale, &xnorm, &ierr); /* Scale if necessary */ if (scale != 1.) { i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &scale, &work[ki + *n], &c__1); } work[j + *n] = x[0]; work[j + 1 + *n] = x[1]; /* Computing MAX */ d__3 = (d__1 = work[j + *n], abs(d__1)), d__4 = (d__2 = work[j + 1 + *n], abs(d__2)), d__3 = max( d__3,d__4); vmax = max(d__3,vmax); vcrit = bignum / vmax; } L170: ; } /* Copy the vector x or Q*x to VL and normalize. */ if (! over) { i__2 = *n - ki + 1; _starpu_dcopy_(&i__2, &work[ki + *n], &c__1, &vl[ki + is * vl_dim1], &c__1); i__2 = *n - ki + 1; ii = _starpu_idamax_(&i__2, &vl[ki + is * vl_dim1], &c__1) + ki - 1; remax = 1. / (d__1 = vl[ii + is * vl_dim1], abs(d__1)); i__2 = *n - ki + 1; _starpu_dscal_(&i__2, &remax, &vl[ki + is * vl_dim1], &c__1); i__2 = ki - 1; for (k = 1; k <= i__2; ++k) { vl[k + is * vl_dim1] = 0.; /* L180: */ } } else { if (ki < *n) { i__2 = *n - ki; _starpu_dgemv_("N", n, &i__2, &c_b22, &vl[(ki + 1) * vl_dim1 + 1], ldvl, &work[ki + 1 + *n], &c__1, &work[ ki + *n], &vl[ki * vl_dim1 + 1], &c__1); } ii = _starpu_idamax_(n, &vl[ki * vl_dim1 + 1], &c__1); remax = 1. / (d__1 = vl[ii + ki * vl_dim1], abs(d__1)); _starpu_dscal_(n, &remax, &vl[ki * vl_dim1 + 1], &c__1); } } else { /* Complex left eigenvector. */ /* Initial solve: */ /* ((T(KI,KI) T(KI,KI+1) )' - (WR - I* WI))*X = 0. */ /* ((T(KI+1,KI) T(KI+1,KI+1)) ) */ if ((d__1 = t[ki + (ki + 1) * t_dim1], abs(d__1)) >= (d__2 = t[ki + 1 + ki * t_dim1], abs(d__2))) { work[ki + *n] = wi / t[ki + (ki + 1) * t_dim1]; work[ki + 1 + n2] = 1.; } else { work[ki + *n] = 1.; work[ki + 1 + n2] = -wi / t[ki + 1 + ki * t_dim1]; } work[ki + 1 + *n] = 0.; work[ki + n2] = 0.; /* Form right-hand side */ i__2 = *n; for (k = ki + 2; k <= i__2; ++k) { work[k + *n] = -work[ki + *n] * t[ki + k * t_dim1]; work[k + n2] = -work[ki + 1 + n2] * t[ki + 1 + k * t_dim1] ; /* L190: */ } /* Solve complex quasi-triangular system: */ /* ( T(KI+2,N:KI+2,N) - (WR-i*WI) )*X = WORK1+i*WORK2 */ vmax = 1.; vcrit = bignum; jnxt = ki + 2; i__2 = *n; for (j = ki + 2; j <= i__2; ++j) { if (j < jnxt) { goto L200; } j1 = j; j2 = j; jnxt = j + 1; if (j < *n) { if (t[j + 1 + j * t_dim1] != 0.) { j2 = j + 1; jnxt = j + 2; } } if (j1 == j2) { /* 1-by-1 diagonal block */ /* Scale if necessary to avoid overflow when */ /* forming the right-hand side elements. */ if (work[j] > vcrit) { rec = 1. / vmax; i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &rec, &work[ki + *n], &c__1); i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &rec, &work[ki + n2], &c__1); vmax = 1.; vcrit = bignum; } i__3 = j - ki - 2; work[j + *n] -= _starpu_ddot_(&i__3, &t[ki + 2 + j * t_dim1], &c__1, &work[ki + 2 + *n], &c__1); i__3 = j - ki - 2; work[j + n2] -= _starpu_ddot_(&i__3, &t[ki + 2 + j * t_dim1], &c__1, &work[ki + 2 + n2], &c__1); /* Solve (T(J,J)-(WR-i*WI))*(X11+i*X12)= WK+I*WK2 */ d__1 = -wi; _starpu_dlaln2_(&c_false, &c__1, &c__2, &smin, &c_b22, &t[j + j * t_dim1], ldt, &c_b22, &c_b22, &work[j + * n], n, &wr, &d__1, x, &c__2, &scale, &xnorm, & ierr); /* Scale if necessary */ if (scale != 1.) { i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &scale, &work[ki + *n], &c__1); i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &scale, &work[ki + n2], &c__1); } work[j + *n] = x[0]; work[j + n2] = x[2]; /* Computing MAX */ d__3 = (d__1 = work[j + *n], abs(d__1)), d__4 = (d__2 = work[j + n2], abs(d__2)), d__3 = max(d__3, d__4); vmax = max(d__3,vmax); vcrit = bignum / vmax; } else { /* 2-by-2 diagonal block */ /* Scale if necessary to avoid overflow when forming */ /* the right-hand side elements. */ /* Computing MAX */ d__1 = work[j], d__2 = work[j + 1]; beta = max(d__1,d__2); if (beta > vcrit) { rec = 1. / vmax; i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &rec, &work[ki + *n], &c__1); i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &rec, &work[ki + n2], &c__1); vmax = 1.; vcrit = bignum; } i__3 = j - ki - 2; work[j + *n] -= _starpu_ddot_(&i__3, &t[ki + 2 + j * t_dim1], &c__1, &work[ki + 2 + *n], &c__1); i__3 = j - ki - 2; work[j + n2] -= _starpu_ddot_(&i__3, &t[ki + 2 + j * t_dim1], &c__1, &work[ki + 2 + n2], &c__1); i__3 = j - ki - 2; work[j + 1 + *n] -= _starpu_ddot_(&i__3, &t[ki + 2 + (j + 1) * t_dim1], &c__1, &work[ki + 2 + *n], &c__1); i__3 = j - ki - 2; work[j + 1 + n2] -= _starpu_ddot_(&i__3, &t[ki + 2 + (j + 1) * t_dim1], &c__1, &work[ki + 2 + n2], &c__1); /* Solve 2-by-2 complex linear equation */ /* ([T(j,j) T(j,j+1) ]'-(wr-i*wi)*I)*X = SCALE*B */ /* ([T(j+1,j) T(j+1,j+1)] ) */ d__1 = -wi; _starpu_dlaln2_(&c_true, &c__2, &c__2, &smin, &c_b22, &t[j + j * t_dim1], ldt, &c_b22, &c_b22, &work[j + * n], n, &wr, &d__1, x, &c__2, &scale, &xnorm, & ierr); /* Scale if necessary */ if (scale != 1.) { i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &scale, &work[ki + *n], &c__1); i__3 = *n - ki + 1; _starpu_dscal_(&i__3, &scale, &work[ki + n2], &c__1); } work[j + *n] = x[0]; work[j + n2] = x[2]; work[j + 1 + *n] = x[1]; work[j + 1 + n2] = x[3]; /* Computing MAX */ d__1 = abs(x[0]), d__2 = abs(x[2]), d__1 = max(d__1, d__2), d__2 = abs(x[1]), d__1 = max(d__1,d__2) , d__2 = abs(x[3]), d__1 = max(d__1,d__2); vmax = max(d__1,vmax); vcrit = bignum / vmax; } L200: ; } /* Copy the vector x or Q*x to VL and normalize. */ if (! over) { i__2 = *n - ki + 1; _starpu_dcopy_(&i__2, &work[ki + *n], &c__1, &vl[ki + is * vl_dim1], &c__1); i__2 = *n - ki + 1; _starpu_dcopy_(&i__2, &work[ki + n2], &c__1, &vl[ki + (is + 1) * vl_dim1], &c__1); emax = 0.; i__2 = *n; for (k = ki; k <= i__2; ++k) { /* Computing MAX */ d__3 = emax, d__4 = (d__1 = vl[k + is * vl_dim1], abs( d__1)) + (d__2 = vl[k + (is + 1) * vl_dim1], abs(d__2)); emax = max(d__3,d__4); /* L220: */ } remax = 1. / emax; i__2 = *n - ki + 1; _starpu_dscal_(&i__2, &remax, &vl[ki + is * vl_dim1], &c__1); i__2 = *n - ki + 1; _starpu_dscal_(&i__2, &remax, &vl[ki + (is + 1) * vl_dim1], &c__1) ; i__2 = ki - 1; for (k = 1; k <= i__2; ++k) { vl[k + is * vl_dim1] = 0.; vl[k + (is + 1) * vl_dim1] = 0.; /* L230: */ } } else { if (ki < *n - 1) { i__2 = *n - ki - 1; _starpu_dgemv_("N", n, &i__2, &c_b22, &vl[(ki + 2) * vl_dim1 + 1], ldvl, &work[ki + 2 + *n], &c__1, &work[ ki + *n], &vl[ki * vl_dim1 + 1], &c__1); i__2 = *n - ki - 1; _starpu_dgemv_("N", n, &i__2, &c_b22, &vl[(ki + 2) * vl_dim1 + 1], ldvl, &work[ki + 2 + n2], &c__1, &work[ ki + 1 + n2], &vl[(ki + 1) * vl_dim1 + 1], & c__1); } else { _starpu_dscal_(n, &work[ki + *n], &vl[ki * vl_dim1 + 1], & c__1); _starpu_dscal_(n, &work[ki + 1 + n2], &vl[(ki + 1) * vl_dim1 + 1], &c__1); } emax = 0.; i__2 = *n; for (k = 1; k <= i__2; ++k) { /* Computing MAX */ d__3 = emax, d__4 = (d__1 = vl[k + ki * vl_dim1], abs( d__1)) + (d__2 = vl[k + (ki + 1) * vl_dim1], abs(d__2)); emax = max(d__3,d__4); /* L240: */ } remax = 1. / emax; _starpu_dscal_(n, &remax, &vl[ki * vl_dim1 + 1], &c__1); _starpu_dscal_(n, &remax, &vl[(ki + 1) * vl_dim1 + 1], &c__1); } } ++is; if (ip != 0) { ++is; } L250: if (ip == -1) { ip = 0; } if (ip == 1) { ip = -1; } /* L260: */ } } return 0; /* End of DTREVC */ } /* _starpu_dtrevc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrexc.c000066400000000000000000000245751413463044200206540ustar00rootroot00000000000000/* dtrexc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; /* Subroutine */ int _starpu_dtrexc_(char *compq, integer *n, doublereal *t, integer * ldt, doublereal *q, integer *ldq, integer *ifst, integer *ilst, doublereal *work, integer *info) { /* System generated locals */ integer q_dim1, q_offset, t_dim1, t_offset, i__1; /* Local variables */ integer nbf, nbl, here; extern logical _starpu_lsame_(char *, char *); logical wantq; extern /* Subroutine */ int _starpu_dlaexc_(logical *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); integer nbnext; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTREXC reorders the real Schur factorization of a real matrix */ /* A = Q*T*Q**T, so that the diagonal block of T with row index IFST is */ /* moved to row ILST. */ /* The real Schur form T is reordered by an orthogonal similarity */ /* transformation Z**T*T*Z, and optionally the matrix Q of Schur vectors */ /* is updated by postmultiplying it with Z. */ /* T must be in Schur canonical form (as returned by DHSEQR), that is, */ /* block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each */ /* 2-by-2 diagonal block has its diagonal elements equal and its */ /* off-diagonal elements of opposite sign. */ /* Arguments */ /* ========= */ /* COMPQ (input) CHARACTER*1 */ /* = 'V': update the matrix Q of Schur vectors; */ /* = 'N': do not update Q. */ /* N (input) INTEGER */ /* The order of the matrix T. N >= 0. */ /* T (input/output) DOUBLE PRECISION array, dimension (LDT,N) */ /* On entry, the upper quasi-triangular matrix T, in Schur */ /* Schur canonical form. */ /* On exit, the reordered upper quasi-triangular matrix, again */ /* in Schur canonical form. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= max(1,N). */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, if COMPQ = 'V', the matrix Q of Schur vectors. */ /* On exit, if COMPQ = 'V', Q has been postmultiplied by the */ /* orthogonal transformation matrix Z which reorders T. */ /* If COMPQ = 'N', Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. LDQ >= max(1,N). */ /* IFST (input/output) INTEGER */ /* ILST (input/output) INTEGER */ /* Specify the reordering of the diagonal blocks of T. */ /* The block with row index IFST is moved to row ILST, by a */ /* sequence of transpositions between adjacent blocks. */ /* On exit, if IFST pointed on entry to the second row of a */ /* 2-by-2 block, it is changed to point to the first row; ILST */ /* always points to the first row of the block in its final */ /* position (which may differ from its input value by +1 or -1). */ /* 1 <= IFST <= N; 1 <= ILST <= N. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* = 1: two adjacent blocks were too close to swap (the problem */ /* is very ill-conditioned); T may have been partially */ /* reordered, and ILST points to the first row of the */ /* current position of the block being moved. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input arguments. */ /* Parameter adjustments */ t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --work; /* Function Body */ *info = 0; wantq = _starpu_lsame_(compq, "V"); if (! wantq && ! _starpu_lsame_(compq, "N")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*ldt < max(1,*n)) { *info = -4; } else if (*ldq < 1 || wantq && *ldq < max(1,*n)) { *info = -6; } else if (*ifst < 1 || *ifst > *n) { *info = -7; } else if (*ilst < 1 || *ilst > *n) { *info = -8; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTREXC", &i__1); return 0; } /* Quick return if possible */ if (*n <= 1) { return 0; } /* Determine the first row of specified block */ /* and find out it is 1 by 1 or 2 by 2. */ if (*ifst > 1) { if (t[*ifst + (*ifst - 1) * t_dim1] != 0.) { --(*ifst); } } nbf = 1; if (*ifst < *n) { if (t[*ifst + 1 + *ifst * t_dim1] != 0.) { nbf = 2; } } /* Determine the first row of the final block */ /* and find out it is 1 by 1 or 2 by 2. */ if (*ilst > 1) { if (t[*ilst + (*ilst - 1) * t_dim1] != 0.) { --(*ilst); } } nbl = 1; if (*ilst < *n) { if (t[*ilst + 1 + *ilst * t_dim1] != 0.) { nbl = 2; } } if (*ifst == *ilst) { return 0; } if (*ifst < *ilst) { /* Update ILST */ if (nbf == 2 && nbl == 1) { --(*ilst); } if (nbf == 1 && nbl == 2) { ++(*ilst); } here = *ifst; L10: /* Swap block with next one below */ if (nbf == 1 || nbf == 2) { /* Current block either 1 by 1 or 2 by 2 */ nbnext = 1; if (here + nbf + 1 <= *n) { if (t[here + nbf + 1 + (here + nbf) * t_dim1] != 0.) { nbnext = 2; } } _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, & nbf, &nbnext, &work[1], info); if (*info != 0) { *ilst = here; return 0; } here += nbnext; /* Test if 2 by 2 block breaks into two 1 by 1 blocks */ if (nbf == 2) { if (t[here + 1 + here * t_dim1] == 0.) { nbf = 3; } } } else { /* Current block consists of two 1 by 1 blocks each of which */ /* must be swapped individually */ nbnext = 1; if (here + 3 <= *n) { if (t[here + 3 + (here + 2) * t_dim1] != 0.) { nbnext = 2; } } i__1 = here + 1; _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, & c__1, &nbnext, &work[1], info); if (*info != 0) { *ilst = here; return 0; } if (nbnext == 1) { /* Swap two 1 by 1 blocks, no problems possible */ _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & here, &c__1, &nbnext, &work[1], info); ++here; } else { /* Recompute NBNEXT in case 2 by 2 split */ if (t[here + 2 + (here + 1) * t_dim1] == 0.) { nbnext = 1; } if (nbnext == 2) { /* 2 by 2 Block did not split */ _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & here, &c__1, &nbnext, &work[1], info); if (*info != 0) { *ilst = here; return 0; } here += 2; } else { /* 2 by 2 Block did split */ _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & here, &c__1, &c__1, &work[1], info); i__1 = here + 1; _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & i__1, &c__1, &c__1, &work[1], info); here += 2; } } } if (here < *ilst) { goto L10; } } else { here = *ifst; L20: /* Swap block with next one above */ if (nbf == 1 || nbf == 2) { /* Current block either 1 by 1 or 2 by 2 */ nbnext = 1; if (here >= 3) { if (t[here - 1 + (here - 2) * t_dim1] != 0.) { nbnext = 2; } } i__1 = here - nbnext; _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, & nbnext, &nbf, &work[1], info); if (*info != 0) { *ilst = here; return 0; } here -= nbnext; /* Test if 2 by 2 block breaks into two 1 by 1 blocks */ if (nbf == 2) { if (t[here + 1 + here * t_dim1] == 0.) { nbf = 3; } } } else { /* Current block consists of two 1 by 1 blocks each of which */ /* must be swapped individually */ nbnext = 1; if (here >= 3) { if (t[here - 1 + (here - 2) * t_dim1] != 0.) { nbnext = 2; } } i__1 = here - nbnext; _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, & nbnext, &c__1, &work[1], info); if (*info != 0) { *ilst = here; return 0; } if (nbnext == 1) { /* Swap two 1 by 1 blocks, no problems possible */ _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & here, &nbnext, &c__1, &work[1], info); --here; } else { /* Recompute NBNEXT in case 2 by 2 split */ if (t[here + (here - 1) * t_dim1] == 0.) { nbnext = 1; } if (nbnext == 2) { /* 2 by 2 Block did not split */ i__1 = here - 1; _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & i__1, &c__2, &c__1, &work[1], info); if (*info != 0) { *ilst = here; return 0; } here += -2; } else { /* 2 by 2 Block did split */ _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & here, &c__1, &c__1, &work[1], info); i__1 = here - 1; _starpu_dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, & i__1, &c__1, &c__1, &work[1], info); here += -2; } } } if (here > *ilst) { goto L20; } } *ilst = here; return 0; /* End of DTREXC */ } /* _starpu_dtrexc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrrfs.c000066400000000000000000000334501413463044200206570ustar00rootroot00000000000000/* dtrrfs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b19 = -1.; /* Subroutine */ int _starpu_dtrrfs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, x_dim1, x_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ integer i__, j, k; doublereal s, xk; integer nz; doublereal eps; integer kase; doublereal safe1, safe2; extern logical _starpu_lsame_(char *, char *); integer isave[3]; extern /* Subroutine */ int _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrsv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlamch_(char *); doublereal safmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical notran; char transt[1]; logical nounit; doublereal lstres; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRRFS provides error bounds and backward error estimates for the */ /* solution to a system of linear equations with a triangular */ /* coefficient matrix. */ /* The solution matrix X must be computed by DTRTRS or some other */ /* means before entering this routine. DTRRFS does not do iterative */ /* refinement because doing so cannot improve the backward error. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrices B and X. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of the array A contains the upper */ /* triangular matrix, and the strictly lower triangular part of */ /* A is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of the array A contains the lower triangular */ /* matrix, and the strictly upper triangular part of A is not */ /* referenced. If DIAG = 'U', the diagonal elements of A are */ /* also not referenced and are assumed to be 1. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* The right hand side matrix B. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* X (input) DOUBLE PRECISION array, dimension (LDX,NRHS) */ /* The solution matrix X. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. LDX >= max(1,N). */ /* FERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The estimated forward error bound for each solution vector */ /* X(j) (the j-th column of the solution matrix X). */ /* If XTRUE is the true solution corresponding to X(j), FERR(j) */ /* is an estimated upper bound for the magnitude of the largest */ /* element in (X(j) - XTRUE) divided by the magnitude of the */ /* largest element in X(j). The estimate is as reliable as */ /* the estimate for RCOND, and is almost always a slight */ /* overestimate of the true error. */ /* BERR (output) DOUBLE PRECISION array, dimension (NRHS) */ /* The componentwise relative backward error of each solution */ /* vector X(j) (i.e., the smallest relative change in */ /* any element of A or B that makes X(j) an exact solution). */ /* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) */ /* IWORK (workspace) INTEGER array, dimension (N) */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --ferr; --berr; --work; --iwork; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); notran = _starpu_lsame_(trans, "N"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! notran && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldx < max(1,*n)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRRFS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { ferr[j] = 0.; berr[j] = 0.; /* L10: */ } return 0; } if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } /* NZ = maximum number of nonzero elements in each row of A, plus 1 */ nz = *n + 1; eps = _starpu_dlamch_("Epsilon"); safmin = _starpu_dlamch_("Safe minimum"); safe1 = nz * safmin; safe2 = safe1 / eps; /* Do for each right hand side */ i__1 = *nrhs; for (j = 1; j <= i__1; ++j) { /* Compute residual R = B - op(A) * X, */ /* where op(A) = A or A', depending on TRANS. */ _starpu_dcopy_(n, &x[j * x_dim1 + 1], &c__1, &work[*n + 1], &c__1); _starpu_dtrmv_(uplo, trans, diag, n, &a[a_offset], lda, &work[*n + 1], &c__1); _starpu_daxpy_(n, &c_b19, &b[j * b_dim1 + 1], &c__1, &work[*n + 1], &c__1); /* Compute componentwise relative backward error from formula */ /* max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) ) */ /* where abs(Z) is the componentwise absolute value of the matrix */ /* or vector Z. If the i-th component of the denominator is less */ /* than SAFE2, then SAFE1 is added to the i-th components of the */ /* numerator and denominator before dividing. */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] = (d__1 = b[i__ + j * b_dim1], abs(d__1)); /* L20: */ } if (notran) { /* Compute abs(A)*abs(X) + abs(B). */ if (upper) { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs( d__1)) * xk; /* L30: */ } /* L40: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs( d__1)) * xk; /* L50: */ } work[k] += xk; /* L60: */ } } } else { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = k; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs( d__1)) * xk; /* L70: */ } /* L80: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { xk = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { work[i__] += (d__1 = a[i__ + k * a_dim1], abs( d__1)) * xk; /* L90: */ } work[k] += xk; /* L100: */ } } } } else { /* Compute abs(A')*abs(X) + abs(B). */ if (upper) { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; i__3 = k; for (i__ = 1; i__ <= i__3; ++i__) { s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L110: */ } work[k] += s; /* L120: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L130: */ } work[k] += s; /* L140: */ } } } else { if (nounit) { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = 0.; i__3 = *n; for (i__ = k; i__ <= i__3; ++i__) { s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L150: */ } work[k] += s; /* L160: */ } } else { i__2 = *n; for (k = 1; k <= i__2; ++k) { s = (d__1 = x[k + j * x_dim1], abs(d__1)); i__3 = *n; for (i__ = k + 1; i__ <= i__3; ++i__) { s += (d__1 = a[i__ + k * a_dim1], abs(d__1)) * ( d__2 = x[i__ + j * x_dim1], abs(d__2)); /* L170: */ } work[k] += s; /* L180: */ } } } } s = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { /* Computing MAX */ d__2 = s, d__3 = (d__1 = work[*n + i__], abs(d__1)) / work[ i__]; s = max(d__2,d__3); } else { /* Computing MAX */ d__2 = s, d__3 = ((d__1 = work[*n + i__], abs(d__1)) + safe1) / (work[i__] + safe1); s = max(d__2,d__3); } /* L190: */ } berr[j] = s; /* Bound error from formula */ /* norm(X - XTRUE) / norm(X) .le. FERR = */ /* norm( abs(inv(op(A)))* */ /* ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X) */ /* where */ /* norm(Z) is the magnitude of the largest component of Z */ /* inv(op(A)) is the inverse of op(A) */ /* abs(Z) is the componentwise absolute value of the matrix or */ /* vector Z */ /* NZ is the maximum number of nonzeros in any row of A, plus 1 */ /* EPS is machine epsilon */ /* The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B)) */ /* is incremented by SAFE1 if the i-th component of */ /* abs(op(A))*abs(X) + abs(B) is less than SAFE2. */ /* Use DLACN2 to estimate the infinity-norm of the matrix */ /* inv(op(A)) * diag(W), */ /* where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { if (work[i__] > safe2) { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__]; } else { work[i__] = (d__1 = work[*n + i__], abs(d__1)) + nz * eps * work[i__] + safe1; } /* L200: */ } kase = 0; L210: _starpu_dlacn2_(n, &work[(*n << 1) + 1], &work[*n + 1], &iwork[1], &ferr[j], & kase, isave); if (kase != 0) { if (kase == 1) { /* Multiply by diag(W)*inv(op(A)'). */ _starpu_dtrsv_(uplo, transt, diag, n, &a[a_offset], lda, &work[*n + 1] , &c__1); i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L220: */ } } else { /* Multiply by inv(op(A))*diag(W). */ i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { work[*n + i__] = work[i__] * work[*n + i__]; /* L230: */ } _starpu_dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &work[*n + 1], &c__1); } goto L210; } /* Normalize error. */ lstres = 0.; i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* Computing MAX */ d__2 = lstres, d__3 = (d__1 = x[i__ + j * x_dim1], abs(d__1)); lstres = max(d__2,d__3); /* L240: */ } if (lstres != 0.) { ferr[j] /= lstres; } /* L250: */ } return 0; /* End of DTRRFS */ } /* _starpu_dtrrfs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrsen.c000066400000000000000000000410531413463044200206500ustar00rootroot00000000000000/* dtrsen.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c_n1 = -1; /* Subroutine */ int _starpu_dtrsen_(char *job, char *compq, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, doublereal *wr, doublereal *wi, integer *m, doublereal *s, doublereal *sep, doublereal *work, integer *lwork, integer *iwork, integer * liwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, t_dim1, t_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer k, n1, n2, kk, nn, ks; doublereal est; integer kase; logical pair; integer ierr; logical swap; doublereal scale; extern logical _starpu_lsame_(char *, char *); integer isave[3], lwmin; logical wantq, wants; doublereal rnorm; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical wantbh; extern /* Subroutine */ int _starpu_dtrexc_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); integer liwmin; logical wantsp, lquery; extern /* Subroutine */ int _starpu_dtrsyl_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRSEN reorders the real Schur factorization of a real matrix */ /* A = Q*T*Q**T, so that a selected cluster of eigenvalues appears in */ /* the leading diagonal blocks of the upper quasi-triangular matrix T, */ /* and the leading columns of Q form an orthonormal basis of the */ /* corresponding right invariant subspace. */ /* Optionally the routine computes the reciprocal condition numbers of */ /* the cluster of eigenvalues and/or the invariant subspace. */ /* T must be in Schur canonical form (as returned by DHSEQR), that is, */ /* block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each */ /* 2-by-2 diagonal block has its diagonal elemnts equal and its */ /* off-diagonal elements of opposite sign. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies whether condition numbers are required for the */ /* cluster of eigenvalues (S) or the invariant subspace (SEP): */ /* = 'N': none; */ /* = 'E': for eigenvalues only (S); */ /* = 'V': for invariant subspace only (SEP); */ /* = 'B': for both eigenvalues and invariant subspace (S and */ /* SEP). */ /* COMPQ (input) CHARACTER*1 */ /* = 'V': update the matrix Q of Schur vectors; */ /* = 'N': do not update Q. */ /* SELECT (input) LOGICAL array, dimension (N) */ /* SELECT specifies the eigenvalues in the selected cluster. To */ /* select a real eigenvalue w(j), SELECT(j) must be set to */ /* .TRUE.. To select a complex conjugate pair of eigenvalues */ /* w(j) and w(j+1), corresponding to a 2-by-2 diagonal block, */ /* either SELECT(j) or SELECT(j+1) or both must be set to */ /* .TRUE.; a complex conjugate pair of eigenvalues must be */ /* either both included in the cluster or both excluded. */ /* N (input) INTEGER */ /* The order of the matrix T. N >= 0. */ /* T (input/output) DOUBLE PRECISION array, dimension (LDT,N) */ /* On entry, the upper quasi-triangular matrix T, in Schur */ /* canonical form. */ /* On exit, T is overwritten by the reordered matrix T, again in */ /* Schur canonical form, with the selected eigenvalues in the */ /* leading diagonal blocks. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= max(1,N). */ /* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */ /* On entry, if COMPQ = 'V', the matrix Q of Schur vectors. */ /* On exit, if COMPQ = 'V', Q has been postmultiplied by the */ /* orthogonal transformation matrix which reorders T; the */ /* leading M columns of Q form an orthonormal basis for the */ /* specified invariant subspace. */ /* If COMPQ = 'N', Q is not referenced. */ /* LDQ (input) INTEGER */ /* The leading dimension of the array Q. */ /* LDQ >= 1; and if COMPQ = 'V', LDQ >= N. */ /* WR (output) DOUBLE PRECISION array, dimension (N) */ /* WI (output) DOUBLE PRECISION array, dimension (N) */ /* The real and imaginary parts, respectively, of the reordered */ /* eigenvalues of T. The eigenvalues are stored in the same */ /* order as on the diagonal of T, with WR(i) = T(i,i) and, if */ /* T(i:i+1,i:i+1) is a 2-by-2 diagonal block, WI(i) > 0 and */ /* WI(i+1) = -WI(i). Note that if a complex eigenvalue is */ /* sufficiently ill-conditioned, then its value may differ */ /* significantly from its value before reordering. */ /* M (output) INTEGER */ /* The dimension of the specified invariant subspace. */ /* 0 < = M <= N. */ /* S (output) DOUBLE PRECISION */ /* If JOB = 'E' or 'B', S is a lower bound on the reciprocal */ /* condition number for the selected cluster of eigenvalues. */ /* S cannot underestimate the true reciprocal condition number */ /* by more than a factor of sqrt(N). If M = 0 or N, S = 1. */ /* If JOB = 'N' or 'V', S is not referenced. */ /* SEP (output) DOUBLE PRECISION */ /* If JOB = 'V' or 'B', SEP is the estimated reciprocal */ /* condition number of the specified invariant subspace. If */ /* M = 0 or N, SEP = norm(T). */ /* If JOB = 'N' or 'E', SEP is not referenced. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* If JOB = 'N', LWORK >= max(1,N); */ /* if JOB = 'E', LWORK >= max(1,M*(N-M)); */ /* if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)). */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* IWORK (workspace) INTEGER array, dimension (MAX(1,LIWORK)) */ /* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ /* LIWORK (input) INTEGER */ /* The dimension of the array IWORK. */ /* If JOB = 'N' or 'E', LIWORK >= 1; */ /* if JOB = 'V' or 'B', LIWORK >= max(1,M*(N-M)). */ /* If LIWORK = -1, then a workspace query is assumed; the */ /* routine only calculates the optimal size of the IWORK array, */ /* returns this value as the first entry of the IWORK array, and */ /* no error message related to LIWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* = 1: reordering of T failed because some eigenvalues are too */ /* close to separate (the problem is very ill-conditioned); */ /* T may have been partially reordered, and WR and WI */ /* contain the eigenvalues in the same order as in T; S and */ /* SEP (if requested) are set to zero. */ /* Further Details */ /* =============== */ /* DTRSEN first collects the selected eigenvalues by computing an */ /* orthogonal transformation Z to move them to the top left corner of T. */ /* In other words, the selected eigenvalues are the eigenvalues of T11 */ /* in: */ /* Z'*T*Z = ( T11 T12 ) n1 */ /* ( 0 T22 ) n2 */ /* n1 n2 */ /* where N = n1+n2 and Z' means the transpose of Z. The first n1 columns */ /* of Z span the specified invariant subspace of T. */ /* If T has been obtained from the real Schur factorization of a matrix */ /* A = Q*T*Q', then the reordered real Schur factorization of A is given */ /* by A = (Q*Z)*(Z'*T*Z)*(Q*Z)', and the first n1 columns of Q*Z span */ /* the corresponding invariant subspace of A. */ /* The reciprocal condition number of the average of the eigenvalues of */ /* T11 may be returned in S. S lies between 0 (very badly conditioned) */ /* and 1 (very well conditioned). It is computed as follows. First we */ /* compute R so that */ /* P = ( I R ) n1 */ /* ( 0 0 ) n2 */ /* n1 n2 */ /* is the projector on the invariant subspace associated with T11. */ /* R is the solution of the Sylvester equation: */ /* T11*R - R*T22 = T12. */ /* Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote */ /* the two-norm of M. Then S is computed as the lower bound */ /* (1 + F-norm(R)**2)**(-1/2) */ /* on the reciprocal of 2-norm(P), the true reciprocal condition number. */ /* S cannot underestimate 1 / 2-norm(P) by more than a factor of */ /* sqrt(N). */ /* An approximate error bound for the computed average of the */ /* eigenvalues of T11 is */ /* EPS * norm(T) / S */ /* where EPS is the machine precision. */ /* The reciprocal condition number of the right invariant subspace */ /* spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP. */ /* SEP is defined as the separation of T11 and T22: */ /* sep( T11, T22 ) = sigma-min( C ) */ /* where sigma-min(C) is the smallest singular value of the */ /* n1*n2-by-n1*n2 matrix */ /* C = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) ) */ /* I(m) is an m by m identity matrix, and kprod denotes the Kronecker */ /* product. We estimate sigma-min(C) by the reciprocal of an estimate of */ /* the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C) */ /* cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2). */ /* When SEP is small, small changes in T can cause large changes in */ /* the invariant subspace. An approximate bound on the maximum angular */ /* error in the computed right invariant subspace is */ /* EPS * norm(T) / SEP */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters */ /* Parameter adjustments */ --select; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; --wr; --wi; --work; --iwork; /* Function Body */ wantbh = _starpu_lsame_(job, "B"); wants = _starpu_lsame_(job, "E") || wantbh; wantsp = _starpu_lsame_(job, "V") || wantbh; wantq = _starpu_lsame_(compq, "V"); *info = 0; lquery = *lwork == -1; if (! _starpu_lsame_(job, "N") && ! wants && ! wantsp) { *info = -1; } else if (! _starpu_lsame_(compq, "N") && ! wantq) { *info = -2; } else if (*n < 0) { *info = -4; } else if (*ldt < max(1,*n)) { *info = -6; } else if (*ldq < 1 || wantq && *ldq < *n) { *info = -8; } else { /* Set M to the dimension of the specified invariant subspace, */ /* and test LWORK and LIWORK. */ *m = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { if (k < *n) { if (t[k + 1 + k * t_dim1] == 0.) { if (select[k]) { ++(*m); } } else { pair = TRUE_; if (select[k] || select[k + 1]) { *m += 2; } } } else { if (select[*n]) { ++(*m); } } } /* L10: */ } n1 = *m; n2 = *n - *m; nn = n1 * n2; if (wantsp) { /* Computing MAX */ i__1 = 1, i__2 = nn << 1; lwmin = max(i__1,i__2); liwmin = max(1,nn); } else if (_starpu_lsame_(job, "N")) { lwmin = max(1,*n); liwmin = 1; } else if (_starpu_lsame_(job, "E")) { lwmin = max(1,nn); liwmin = 1; } if (*lwork < lwmin && ! lquery) { *info = -15; } else if (*liwork < liwmin && ! lquery) { *info = -17; } } if (*info == 0) { work[1] = (doublereal) lwmin; iwork[1] = liwmin; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRSEN", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible. */ if (*m == *n || *m == 0) { if (wants) { *s = 1.; } if (wantsp) { *sep = _starpu_dlange_("1", n, n, &t[t_offset], ldt, &work[1]); } goto L40; } /* Collect the selected blocks at the top-left corner of T. */ ks = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { swap = select[k]; if (k < *n) { if (t[k + 1 + k * t_dim1] != 0.) { pair = TRUE_; swap = swap || select[k + 1]; } } if (swap) { ++ks; /* Swap the K-th block to position KS. */ ierr = 0; kk = k; if (k != ks) { _starpu_dtrexc_(compq, n, &t[t_offset], ldt, &q[q_offset], ldq, & kk, &ks, &work[1], &ierr); } if (ierr == 1 || ierr == 2) { /* Blocks too close to swap: exit. */ *info = 1; if (wants) { *s = 0.; } if (wantsp) { *sep = 0.; } goto L40; } if (pair) { ++ks; } } } /* L20: */ } if (wants) { /* Solve Sylvester equation for R: */ /* T11*R - R*T22 = scale*T12 */ _starpu_dlacpy_("F", &n1, &n2, &t[(n1 + 1) * t_dim1 + 1], ldt, &work[1], &n1); _starpu_dtrsyl_("N", "N", &c_n1, &n1, &n2, &t[t_offset], ldt, &t[n1 + 1 + (n1 + 1) * t_dim1], ldt, &work[1], &n1, &scale, &ierr); /* Estimate the reciprocal of the condition number of the cluster */ /* of eigenvalues. */ rnorm = _starpu_dlange_("F", &n1, &n2, &work[1], &n1, &work[1]); if (rnorm == 0.) { *s = 1.; } else { *s = scale / (sqrt(scale * scale / rnorm + rnorm) * sqrt(rnorm)); } } if (wantsp) { /* Estimate sep(T11,T22). */ est = 0.; kase = 0; L30: _starpu_dlacn2_(&nn, &work[nn + 1], &work[1], &iwork[1], &est, &kase, isave); if (kase != 0) { if (kase == 1) { /* Solve T11*R - R*T22 = scale*X. */ _starpu_dtrsyl_("N", "N", &c_n1, &n1, &n2, &t[t_offset], ldt, &t[n1 + 1 + (n1 + 1) * t_dim1], ldt, &work[1], &n1, &scale, & ierr); } else { /* Solve T11'*R - R*T22' = scale*X. */ _starpu_dtrsyl_("T", "T", &c_n1, &n1, &n2, &t[t_offset], ldt, &t[n1 + 1 + (n1 + 1) * t_dim1], ldt, &work[1], &n1, &scale, & ierr); } goto L30; } *sep = scale / est; } L40: /* Store the output eigenvalues in WR and WI. */ i__1 = *n; for (k = 1; k <= i__1; ++k) { wr[k] = t[k + k * t_dim1]; wi[k] = 0.; /* L50: */ } i__1 = *n - 1; for (k = 1; k <= i__1; ++k) { if (t[k + 1 + k * t_dim1] != 0.) { wi[k] = sqrt((d__1 = t[k + (k + 1) * t_dim1], abs(d__1))) * sqrt(( d__2 = t[k + 1 + k * t_dim1], abs(d__2))); wi[k + 1] = -wi[k]; } /* L60: */ } work[1] = (doublereal) lwmin; iwork[1] = liwmin; return 0; /* End of DTRSEN */ } /* _starpu_dtrsen_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrsna.c000066400000000000000000000450751413463044200206540ustar00rootroot00000000000000/* dtrsna.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static logical c_true = TRUE_; static logical c_false = FALSE_; /* Subroutine */ int _starpu_dtrsna_(char *job, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *sep, integer *mm, integer *m, doublereal *work, integer *ldwork, integer * iwork, integer *info) { /* System generated locals */ integer t_dim1, t_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, work_dim1, work_offset, i__1, i__2; doublereal d__1, d__2; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ integer i__, j, k, n2; doublereal cs; integer nn, ks; doublereal sn, mu, eps, est; integer kase; doublereal cond; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); logical pair; integer ierr; doublereal dumm, prod; integer ifst; doublereal lnrm; integer ilst; doublereal rnrm; extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *); doublereal prod1, prod2, scale, delta; extern logical _starpu_lsame_(char *, char *); integer isave[3]; logical wants; doublereal dummy[1]; extern /* Subroutine */ int _starpu_dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); extern doublereal _starpu_dlapy2_(doublereal *, doublereal *); extern /* Subroutine */ int _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *); extern /* Subroutine */ int _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); doublereal bignum; logical wantbh; extern /* Subroutine */ int _starpu_dlaqtr_(logical *, logical *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *), _starpu_dtrexc_(char *, integer * , doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *); logical somcon; doublereal smlnum; logical wantsp; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRSNA estimates reciprocal condition numbers for specified */ /* eigenvalues and/or right eigenvectors of a real upper */ /* quasi-triangular matrix T (or of any matrix Q*T*Q**T with Q */ /* orthogonal). */ /* T must be in Schur canonical form (as returned by DHSEQR), that is, */ /* block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each */ /* 2-by-2 diagonal block has its diagonal elements equal and its */ /* off-diagonal elements of opposite sign. */ /* Arguments */ /* ========= */ /* JOB (input) CHARACTER*1 */ /* Specifies whether condition numbers are required for */ /* eigenvalues (S) or eigenvectors (SEP): */ /* = 'E': for eigenvalues only (S); */ /* = 'V': for eigenvectors only (SEP); */ /* = 'B': for both eigenvalues and eigenvectors (S and SEP). */ /* HOWMNY (input) CHARACTER*1 */ /* = 'A': compute condition numbers for all eigenpairs; */ /* = 'S': compute condition numbers for selected eigenpairs */ /* specified by the array SELECT. */ /* SELECT (input) LOGICAL array, dimension (N) */ /* If HOWMNY = 'S', SELECT specifies the eigenpairs for which */ /* condition numbers are required. To select condition numbers */ /* for the eigenpair corresponding to a real eigenvalue w(j), */ /* SELECT(j) must be set to .TRUE.. To select condition numbers */ /* corresponding to a complex conjugate pair of eigenvalues w(j) */ /* and w(j+1), either SELECT(j) or SELECT(j+1) or both, must be */ /* set to .TRUE.. */ /* If HOWMNY = 'A', SELECT is not referenced. */ /* N (input) INTEGER */ /* The order of the matrix T. N >= 0. */ /* T (input) DOUBLE PRECISION array, dimension (LDT,N) */ /* The upper quasi-triangular matrix T, in Schur canonical form. */ /* LDT (input) INTEGER */ /* The leading dimension of the array T. LDT >= max(1,N). */ /* VL (input) DOUBLE PRECISION array, dimension (LDVL,M) */ /* If JOB = 'E' or 'B', VL must contain left eigenvectors of T */ /* (or of any Q*T*Q**T with Q orthogonal), corresponding to the */ /* eigenpairs specified by HOWMNY and SELECT. The eigenvectors */ /* must be stored in consecutive columns of VL, as returned by */ /* DHSEIN or DTREVC. */ /* If JOB = 'V', VL is not referenced. */ /* LDVL (input) INTEGER */ /* The leading dimension of the array VL. */ /* LDVL >= 1; and if JOB = 'E' or 'B', LDVL >= N. */ /* VR (input) DOUBLE PRECISION array, dimension (LDVR,M) */ /* If JOB = 'E' or 'B', VR must contain right eigenvectors of T */ /* (or of any Q*T*Q**T with Q orthogonal), corresponding to the */ /* eigenpairs specified by HOWMNY and SELECT. The eigenvectors */ /* must be stored in consecutive columns of VR, as returned by */ /* DHSEIN or DTREVC. */ /* If JOB = 'V', VR is not referenced. */ /* LDVR (input) INTEGER */ /* The leading dimension of the array VR. */ /* LDVR >= 1; and if JOB = 'E' or 'B', LDVR >= N. */ /* S (output) DOUBLE PRECISION array, dimension (MM) */ /* If JOB = 'E' or 'B', the reciprocal condition numbers of the */ /* selected eigenvalues, stored in consecutive elements of the */ /* array. For a complex conjugate pair of eigenvalues two */ /* consecutive elements of S are set to the same value. Thus */ /* S(j), SEP(j), and the j-th columns of VL and VR all */ /* correspond to the same eigenpair (but not in general the */ /* j-th eigenpair, unless all eigenpairs are selected). */ /* If JOB = 'V', S is not referenced. */ /* SEP (output) DOUBLE PRECISION array, dimension (MM) */ /* If JOB = 'V' or 'B', the estimated reciprocal condition */ /* numbers of the selected eigenvectors, stored in consecutive */ /* elements of the array. For a complex eigenvector two */ /* consecutive elements of SEP are set to the same value. If */ /* the eigenvalues cannot be reordered to compute SEP(j), SEP(j) */ /* is set to 0; this can only occur when the true value would be */ /* very small anyway. */ /* If JOB = 'E', SEP is not referenced. */ /* MM (input) INTEGER */ /* The number of elements in the arrays S (if JOB = 'E' or 'B') */ /* and/or SEP (if JOB = 'V' or 'B'). MM >= M. */ /* M (output) INTEGER */ /* The number of elements of the arrays S and/or SEP actually */ /* used to store the estimated condition numbers. */ /* If HOWMNY = 'A', M is set to N. */ /* WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,N+6) */ /* If JOB = 'E', WORK is not referenced. */ /* LDWORK (input) INTEGER */ /* The leading dimension of the array WORK. */ /* LDWORK >= 1; and if JOB = 'V' or 'B', LDWORK >= N. */ /* IWORK (workspace) INTEGER array, dimension (2*(N-1)) */ /* If JOB = 'E', IWORK is not referenced. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The reciprocal of the condition number of an eigenvalue lambda is */ /* defined as */ /* S(lambda) = |v'*u| / (norm(u)*norm(v)) */ /* where u and v are the right and left eigenvectors of T corresponding */ /* to lambda; v' denotes the conjugate-transpose of v, and norm(u) */ /* denotes the Euclidean norm. These reciprocal condition numbers always */ /* lie between zero (very badly conditioned) and one (very well */ /* conditioned). If n = 1, S(lambda) is defined to be 1. */ /* An approximate error bound for a computed eigenvalue W(i) is given by */ /* EPS * norm(T) / S(i) */ /* where EPS is the machine precision. */ /* The reciprocal of the condition number of the right eigenvector u */ /* corresponding to lambda is defined as follows. Suppose */ /* T = ( lambda c ) */ /* ( 0 T22 ) */ /* Then the reciprocal condition number is */ /* SEP( lambda, T22 ) = sigma-min( T22 - lambda*I ) */ /* where sigma-min denotes the smallest singular value. We approximate */ /* the smallest singular value by the reciprocal of an estimate of the */ /* one-norm of the inverse of T22 - lambda*I. If n = 1, SEP(1) is */ /* defined to be abs(T(1,1)). */ /* An approximate error bound for a computed right eigenvector VR(i) */ /* is given by */ /* EPS * norm(T) / SEP(i) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and test the input parameters */ /* Parameter adjustments */ --select; t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; vl_dim1 = *ldvl; vl_offset = 1 + vl_dim1; vl -= vl_offset; vr_dim1 = *ldvr; vr_offset = 1 + vr_dim1; vr -= vr_offset; --s; --sep; work_dim1 = *ldwork; work_offset = 1 + work_dim1; work -= work_offset; --iwork; /* Function Body */ wantbh = _starpu_lsame_(job, "B"); wants = _starpu_lsame_(job, "E") || wantbh; wantsp = _starpu_lsame_(job, "V") || wantbh; somcon = _starpu_lsame_(howmny, "S"); *info = 0; if (! wants && ! wantsp) { *info = -1; } else if (! _starpu_lsame_(howmny, "A") && ! somcon) { *info = -2; } else if (*n < 0) { *info = -4; } else if (*ldt < max(1,*n)) { *info = -6; } else if (*ldvl < 1 || wants && *ldvl < *n) { *info = -8; } else if (*ldvr < 1 || wants && *ldvr < *n) { *info = -10; } else { /* Set M to the number of eigenpairs for which condition numbers */ /* are required, and test MM. */ if (somcon) { *m = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { if (pair) { pair = FALSE_; } else { if (k < *n) { if (t[k + 1 + k * t_dim1] == 0.) { if (select[k]) { ++(*m); } } else { pair = TRUE_; if (select[k] || select[k + 1]) { *m += 2; } } } else { if (select[*n]) { ++(*m); } } } /* L10: */ } } else { *m = *n; } if (*mm < *m) { *info = -13; } else if (*ldwork < 1 || wantsp && *ldwork < *n) { *info = -16; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRSNA", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } if (*n == 1) { if (somcon) { if (! select[1]) { return 0; } } if (wants) { s[1] = 1.; } if (wantsp) { sep[1] = (d__1 = t[t_dim1 + 1], abs(d__1)); } return 0; } /* Get machine constants */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S") / eps; bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); ks = 0; pair = FALSE_; i__1 = *n; for (k = 1; k <= i__1; ++k) { /* Determine whether T(k,k) begins a 1-by-1 or 2-by-2 block. */ if (pair) { pair = FALSE_; goto L60; } else { if (k < *n) { pair = t[k + 1 + k * t_dim1] != 0.; } } /* Determine whether condition numbers are required for the k-th */ /* eigenpair. */ if (somcon) { if (pair) { if (! select[k] && ! select[k + 1]) { goto L60; } } else { if (! select[k]) { goto L60; } } } ++ks; if (wants) { /* Compute the reciprocal condition number of the k-th */ /* eigenvalue. */ if (! pair) { /* Real eigenvalue. */ prod = _starpu_ddot_(n, &vr[ks * vr_dim1 + 1], &c__1, &vl[ks * vl_dim1 + 1], &c__1); rnrm = _starpu_dnrm2_(n, &vr[ks * vr_dim1 + 1], &c__1); lnrm = _starpu_dnrm2_(n, &vl[ks * vl_dim1 + 1], &c__1); s[ks] = abs(prod) / (rnrm * lnrm); } else { /* Complex eigenvalue. */ prod1 = _starpu_ddot_(n, &vr[ks * vr_dim1 + 1], &c__1, &vl[ks * vl_dim1 + 1], &c__1); prod1 += _starpu_ddot_(n, &vr[(ks + 1) * vr_dim1 + 1], &c__1, &vl[(ks + 1) * vl_dim1 + 1], &c__1); prod2 = _starpu_ddot_(n, &vl[ks * vl_dim1 + 1], &c__1, &vr[(ks + 1) * vr_dim1 + 1], &c__1); prod2 -= _starpu_ddot_(n, &vl[(ks + 1) * vl_dim1 + 1], &c__1, &vr[ks * vr_dim1 + 1], &c__1); d__1 = _starpu_dnrm2_(n, &vr[ks * vr_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vr[(ks + 1) * vr_dim1 + 1], &c__1); rnrm = _starpu_dlapy2_(&d__1, &d__2); d__1 = _starpu_dnrm2_(n, &vl[ks * vl_dim1 + 1], &c__1); d__2 = _starpu_dnrm2_(n, &vl[(ks + 1) * vl_dim1 + 1], &c__1); lnrm = _starpu_dlapy2_(&d__1, &d__2); cond = _starpu_dlapy2_(&prod1, &prod2) / (rnrm * lnrm); s[ks] = cond; s[ks + 1] = cond; } } if (wantsp) { /* Estimate the reciprocal condition number of the k-th */ /* eigenvector. */ /* Copy the matrix T to the array WORK and swap the diagonal */ /* block beginning at T(k,k) to the (1,1) position. */ _starpu_dlacpy_("Full", n, n, &t[t_offset], ldt, &work[work_offset], ldwork); ifst = k; ilst = 1; _starpu_dtrexc_("No Q", n, &work[work_offset], ldwork, dummy, &c__1, & ifst, &ilst, &work[(*n + 1) * work_dim1 + 1], &ierr); if (ierr == 1 || ierr == 2) { /* Could not swap because blocks not well separated */ scale = 1.; est = bignum; } else { /* Reordering successful */ if (work[work_dim1 + 2] == 0.) { /* Form C = T22 - lambda*I in WORK(2:N,2:N). */ i__2 = *n; for (i__ = 2; i__ <= i__2; ++i__) { work[i__ + i__ * work_dim1] -= work[work_dim1 + 1]; /* L20: */ } n2 = 1; nn = *n - 1; } else { /* Triangularize the 2 by 2 block by unitary */ /* transformation U = [ cs i*ss ] */ /* [ i*ss cs ]. */ /* such that the (1,1) position of WORK is complex */ /* eigenvalue lambda with positive imaginary part. (2,2) */ /* position of WORK is the complex eigenvalue lambda */ /* with negative imaginary part. */ mu = sqrt((d__1 = work[(work_dim1 << 1) + 1], abs(d__1))) * sqrt((d__2 = work[work_dim1 + 2], abs(d__2))); delta = _starpu_dlapy2_(&mu, &work[work_dim1 + 2]); cs = mu / delta; sn = -work[work_dim1 + 2] / delta; /* Form */ /* C' = WORK(2:N,2:N) + i*[rwork(1) ..... rwork(n-1) ] */ /* [ mu ] */ /* [ .. ] */ /* [ .. ] */ /* [ mu ] */ /* where C' is conjugate transpose of complex matrix C, */ /* and RWORK is stored starting in the N+1-st column of */ /* WORK. */ i__2 = *n; for (j = 3; j <= i__2; ++j) { work[j * work_dim1 + 2] = cs * work[j * work_dim1 + 2] ; work[j + j * work_dim1] -= work[work_dim1 + 1]; /* L30: */ } work[(work_dim1 << 1) + 2] = 0.; work[(*n + 1) * work_dim1 + 1] = mu * 2.; i__2 = *n - 1; for (i__ = 2; i__ <= i__2; ++i__) { work[i__ + (*n + 1) * work_dim1] = sn * work[(i__ + 1) * work_dim1 + 1]; /* L40: */ } n2 = 2; nn = *n - 1 << 1; } /* Estimate norm(inv(C')) */ est = 0.; kase = 0; L50: _starpu_dlacn2_(&nn, &work[(*n + 2) * work_dim1 + 1], &work[(*n + 4) * work_dim1 + 1], &iwork[1], &est, &kase, isave); if (kase != 0) { if (kase == 1) { if (n2 == 1) { /* Real eigenvalue: solve C'*x = scale*c. */ i__2 = *n - 1; _starpu_dlaqtr_(&c_true, &c_true, &i__2, &work[(work_dim1 << 1) + 2], ldwork, dummy, &dumm, &scale, &work[(*n + 4) * work_dim1 + 1], &work[(* n + 6) * work_dim1 + 1], &ierr); } else { /* Complex eigenvalue: solve */ /* C'*(p+iq) = scale*(c+id) in real arithmetic. */ i__2 = *n - 1; _starpu_dlaqtr_(&c_true, &c_false, &i__2, &work[( work_dim1 << 1) + 2], ldwork, &work[(*n + 1) * work_dim1 + 1], &mu, &scale, &work[(* n + 4) * work_dim1 + 1], &work[(*n + 6) * work_dim1 + 1], &ierr); } } else { if (n2 == 1) { /* Real eigenvalue: solve C*x = scale*c. */ i__2 = *n - 1; _starpu_dlaqtr_(&c_false, &c_true, &i__2, &work[( work_dim1 << 1) + 2], ldwork, dummy, & dumm, &scale, &work[(*n + 4) * work_dim1 + 1], &work[(*n + 6) * work_dim1 + 1], & ierr); } else { /* Complex eigenvalue: solve */ /* C*(p+iq) = scale*(c+id) in real arithmetic. */ i__2 = *n - 1; _starpu_dlaqtr_(&c_false, &c_false, &i__2, &work[( work_dim1 << 1) + 2], ldwork, &work[(*n + 1) * work_dim1 + 1], &mu, &scale, &work[(* n + 4) * work_dim1 + 1], &work[(*n + 6) * work_dim1 + 1], &ierr); } } goto L50; } } sep[ks] = scale / max(est,smlnum); if (pair) { sep[ks + 1] = sep[ks]; } } if (pair) { ++ks; } L60: ; } return 0; /* End of DTRSNA */ } /* _starpu_dtrsna_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrsyl.c000066400000000000000000001105321413463044200206710ustar00rootroot00000000000000/* dtrsyl.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static logical c_false = FALSE_; static integer c__2 = 2; static doublereal c_b26 = 1.; static doublereal c_b30 = 0.; static logical c_true = TRUE_; /* Subroutine */ int _starpu_dtrsyl_(char *trana, char *tranb, integer *isgn, integer *m, integer *n, doublereal *a, integer *lda, doublereal *b, integer * ldb, doublereal *c__, integer *ldc, doublereal *scale, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2; /* Local variables */ integer j, k, l; doublereal x[4] /* was [2][2] */; integer k1, k2, l1, l2; doublereal a11, db, da11, vec[4] /* was [2][2] */, dum[1], eps, sgn; extern doublereal _starpu_ddot_(integer *, doublereal *, integer *, doublereal *, integer *); integer ierr; doublereal smin, suml, sumr; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); integer knext, lnext; doublereal xnorm; extern /* Subroutine */ int _starpu_dlaln2_(logical *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal * , doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlasy2_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlabad_(doublereal *, doublereal *); extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *); doublereal scaloc; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); doublereal bignum; logical notrna, notrnb; doublereal smlnum; /* -- LAPACK routine (version 3.2) -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRSYL solves the real Sylvester matrix equation: */ /* op(A)*X + X*op(B) = scale*C or */ /* op(A)*X - X*op(B) = scale*C, */ /* where op(A) = A or A**T, and A and B are both upper quasi- */ /* triangular. A is M-by-M and B is N-by-N; the right hand side C and */ /* the solution X are M-by-N; and scale is an output scale factor, set */ /* <= 1 to avoid overflow in X. */ /* A and B must be in Schur canonical form (as returned by DHSEQR), that */ /* is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; */ /* each 2-by-2 diagonal block has its diagonal elements equal and its */ /* off-diagonal elements of opposite sign. */ /* Arguments */ /* ========= */ /* TRANA (input) CHARACTER*1 */ /* Specifies the option op(A): */ /* = 'N': op(A) = A (No transpose) */ /* = 'T': op(A) = A**T (Transpose) */ /* = 'C': op(A) = A**H (Conjugate transpose = Transpose) */ /* TRANB (input) CHARACTER*1 */ /* Specifies the option op(B): */ /* = 'N': op(B) = B (No transpose) */ /* = 'T': op(B) = B**T (Transpose) */ /* = 'C': op(B) = B**H (Conjugate transpose = Transpose) */ /* ISGN (input) INTEGER */ /* Specifies the sign in the equation: */ /* = +1: solve op(A)*X + X*op(B) = scale*C */ /* = -1: solve op(A)*X - X*op(B) = scale*C */ /* M (input) INTEGER */ /* The order of the matrix A, and the number of rows in the */ /* matrices X and C. M >= 0. */ /* N (input) INTEGER */ /* The order of the matrix B, and the number of columns in the */ /* matrices X and C. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,M) */ /* The upper quasi-triangular matrix A, in Schur canonical form. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input) DOUBLE PRECISION array, dimension (LDB,N) */ /* The upper quasi-triangular matrix B, in Schur canonical form. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* C (input/output) DOUBLE PRECISION array, dimension (LDC,N) */ /* On entry, the M-by-N right hand side matrix C. */ /* On exit, C is overwritten by the solution matrix X. */ /* LDC (input) INTEGER */ /* The leading dimension of the array C. LDC >= max(1,M) */ /* SCALE (output) DOUBLE PRECISION */ /* The scale factor, scale, set <= 1 to avoid overflow in X. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* = 1: A and B have common or very close eigenvalues; perturbed */ /* values were used to solve the equation (but the matrices */ /* A and B are unchanged). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Decode and Test input parameters */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; /* Function Body */ notrna = _starpu_lsame_(trana, "N"); notrnb = _starpu_lsame_(tranb, "N"); *info = 0; if (! notrna && ! _starpu_lsame_(trana, "T") && ! _starpu_lsame_( trana, "C")) { *info = -1; } else if (! notrnb && ! _starpu_lsame_(tranb, "T") && ! _starpu_lsame_(tranb, "C")) { *info = -2; } else if (*isgn != 1 && *isgn != -1) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; } else if (*lda < max(1,*m)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } else if (*ldc < max(1,*m)) { *info = -11; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRSYL", &i__1); return 0; } /* Quick return if possible */ *scale = 1.; if (*m == 0 || *n == 0) { return 0; } /* Set constants to control overflow */ eps = _starpu_dlamch_("P"); smlnum = _starpu_dlamch_("S"); bignum = 1. / smlnum; _starpu_dlabad_(&smlnum, &bignum); smlnum = smlnum * (doublereal) (*m * *n) / eps; bignum = 1. / smlnum; /* Computing MAX */ d__1 = smlnum, d__2 = eps * _starpu_dlange_("M", m, m, &a[a_offset], lda, dum), d__1 = max(d__1,d__2), d__2 = eps * _starpu_dlange_("M", n, n, &b[b_offset], ldb, dum); smin = max(d__1,d__2); sgn = (doublereal) (*isgn); if (notrna && notrnb) { /* Solve A*X + ISGN*X*B = scale*C. */ /* The (K,L)th block of X is determined starting from */ /* bottom-left corner column by column by */ /* A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L) */ /* Where */ /* M L-1 */ /* R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)]. */ /* I=K+1 J=1 */ /* Start column loop (index = L) */ /* L1 (L2) : column index of the first (first) row of X(K,L). */ lnext = 1; i__1 = *n; for (l = 1; l <= i__1; ++l) { if (l < lnext) { goto L60; } if (l == *n) { l1 = l; l2 = l; } else { if (b[l + 1 + l * b_dim1] != 0.) { l1 = l; l2 = l + 1; lnext = l + 2; } else { l1 = l; l2 = l; lnext = l + 1; } } /* Start row loop (index = K) */ /* K1 (K2): row index of the first (last) row of X(K,L). */ knext = *m; for (k = *m; k >= 1; --k) { if (k > knext) { goto L50; } if (k == 1) { k1 = k; k2 = k; } else { if (a[k + (k - 1) * a_dim1] != 0.) { k1 = k - 1; k2 = k; knext = k - 2; } else { k1 = k; k2 = k; knext = k - 1; } } if (l1 == l2 && k1 == k2) { i__2 = *m - k1; /* Computing MIN */ i__3 = k1 + 1; /* Computing MIN */ i__4 = k1 + 1; suml = _starpu_ddot_(&i__2, &a[k1 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l1 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); scaloc = 1.; a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1]; da11 = abs(a11); if (da11 <= smin) { a11 = smin; da11 = smin; *info = 1; } db = abs(vec[0]); if (da11 < 1. && db > 1.) { if (db > bignum * da11) { scaloc = 1. / db; } } x[0] = vec[0] * scaloc / a11; if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L10: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; } else if (l1 == l2 && k1 != k2) { i__2 = *m - k2; /* Computing MIN */ i__3 = k2 + 1; /* Computing MIN */ i__4 = k2 + 1; suml = _starpu_ddot_(&i__2, &a[k1 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l1 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__2 = *m - k2; /* Computing MIN */ i__3 = k2 + 1; /* Computing MIN */ i__4 = k2 + 1; suml = _starpu_ddot_(&i__2, &a[k2 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l1 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); d__1 = -sgn * b[l1 + l1 * b_dim1]; _starpu_dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L20: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k2 + l1 * c_dim1] = x[1]; } else if (l1 != l2 && k1 == k2) { i__2 = *m - k1; /* Computing MIN */ i__3 = k1 + 1; /* Computing MIN */ i__4 = k1 + 1; suml = _starpu_ddot_(&i__2, &a[k1 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l1 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * sumr)); i__2 = *m - k1; /* Computing MIN */ i__3 = k1 + 1; /* Computing MIN */ i__4 = k1 + 1; suml = _starpu_ddot_(&i__2, &a[k1 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l2 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l2 * b_dim1 + 1], &c__1); vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * sumr)); d__1 = -sgn * a[k1 + k1 * a_dim1]; _starpu_dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L30: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[1]; } else if (l1 != l2 && k1 != k2) { i__2 = *m - k2; /* Computing MIN */ i__3 = k2 + 1; /* Computing MIN */ i__4 = k2 + 1; suml = _starpu_ddot_(&i__2, &a[k1 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l1 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__2 = *m - k2; /* Computing MIN */ i__3 = k2 + 1; /* Computing MIN */ i__4 = k2 + 1; suml = _starpu_ddot_(&i__2, &a[k1 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l2 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l2 * b_dim1 + 1], &c__1); vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr); i__2 = *m - k2; /* Computing MIN */ i__3 = k2 + 1; /* Computing MIN */ i__4 = k2 + 1; suml = _starpu_ddot_(&i__2, &a[k2 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l1 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); i__2 = *m - k2; /* Computing MIN */ i__3 = k2 + 1; /* Computing MIN */ i__4 = k2 + 1; suml = _starpu_ddot_(&i__2, &a[k2 + min(i__3, *m)* a_dim1], lda, & c__[min(i__4, *m)+ l2 * c_dim1], &c__1); i__2 = l1 - 1; sumr = _starpu_ddot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l2 * b_dim1 + 1], &c__1); vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr); _starpu_dlasy2_(&c_false, &c_false, isgn, &c__2, &c__2, &a[k1 + k1 * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &c__2, &scaloc, x, &c__2, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L40: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[2]; c__[k2 + l1 * c_dim1] = x[1]; c__[k2 + l2 * c_dim1] = x[3]; } L50: ; } L60: ; } } else if (! notrna && notrnb) { /* Solve A' *X + ISGN*X*B = scale*C. */ /* The (K,L)th block of X is determined starting from */ /* upper-left corner column by column by */ /* A(K,K)'*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L) */ /* Where */ /* K-1 L-1 */ /* R(K,L) = SUM [A(I,K)'*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)] */ /* I=1 J=1 */ /* Start column loop (index = L) */ /* L1 (L2): column index of the first (last) row of X(K,L) */ lnext = 1; i__1 = *n; for (l = 1; l <= i__1; ++l) { if (l < lnext) { goto L120; } if (l == *n) { l1 = l; l2 = l; } else { if (b[l + 1 + l * b_dim1] != 0.) { l1 = l; l2 = l + 1; lnext = l + 2; } else { l1 = l; l2 = l; lnext = l + 1; } } /* Start row loop (index = K) */ /* K1 (K2): row index of the first (last) row of X(K,L) */ knext = 1; i__2 = *m; for (k = 1; k <= i__2; ++k) { if (k < knext) { goto L110; } if (k == *m) { k1 = k; k2 = k; } else { if (a[k + 1 + k * a_dim1] != 0.) { k1 = k; k2 = k + 1; knext = k + 2; } else { k1 = k; k2 = k; knext = k + 1; } } if (l1 == l2 && k1 == k2) { i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); scaloc = 1.; a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1]; da11 = abs(a11); if (da11 <= smin) { a11 = smin; da11 = smin; *info = 1; } db = abs(vec[0]); if (da11 < 1. && db > 1.) { if (db > bignum * da11) { scaloc = 1. / db; } } x[0] = vec[0] * scaloc / a11; if (scaloc != 1.) { i__3 = *n; for (j = 1; j <= i__3; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L70: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; } else if (l1 == l2 && k1 != k2) { i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); d__1 = -sgn * b[l1 + l1 * b_dim1]; _starpu_dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__3 = *n; for (j = 1; j <= i__3; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L80: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k2 + l1 * c_dim1] = x[1]; } else if (l1 != l2 && k1 == k2) { i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * sumr)); i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l2 * b_dim1 + 1], &c__1); vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * sumr)); d__1 = -sgn * a[k1 + k1 * a_dim1]; _starpu_dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__3 = *n; for (j = 1; j <= i__3; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L90: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[1]; } else if (l1 != l2 && k1 != k2) { i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l2 * b_dim1 + 1], &c__1); vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr); i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l1 * b_dim1 + 1], &c__1); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); i__3 = k1 - 1; suml = _starpu_ddot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l2 * c_dim1 + 1], &c__1); i__3 = l1 - 1; sumr = _starpu_ddot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l2 * b_dim1 + 1], &c__1); vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr); _starpu_dlasy2_(&c_true, &c_false, isgn, &c__2, &c__2, &a[k1 + k1 * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, & c__2, &scaloc, x, &c__2, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__3 = *n; for (j = 1; j <= i__3; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L100: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[2]; c__[k2 + l1 * c_dim1] = x[1]; c__[k2 + l2 * c_dim1] = x[3]; } L110: ; } L120: ; } } else if (! notrna && ! notrnb) { /* Solve A'*X + ISGN*X*B' = scale*C. */ /* The (K,L)th block of X is determined starting from */ /* top-right corner column by column by */ /* A(K,K)'*X(K,L) + ISGN*X(K,L)*B(L,L)' = C(K,L) - R(K,L) */ /* Where */ /* K-1 N */ /* R(K,L) = SUM [A(I,K)'*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)']. */ /* I=1 J=L+1 */ /* Start column loop (index = L) */ /* L1 (L2): column index of the first (last) row of X(K,L) */ lnext = *n; for (l = *n; l >= 1; --l) { if (l > lnext) { goto L180; } if (l == 1) { l1 = l; l2 = l; } else { if (b[l + (l - 1) * b_dim1] != 0.) { l1 = l - 1; l2 = l; lnext = l - 2; } else { l1 = l; l2 = l; lnext = l - 1; } } /* Start row loop (index = K) */ /* K1 (K2): row index of the first (last) row of X(K,L) */ knext = 1; i__1 = *m; for (k = 1; k <= i__1; ++k) { if (k < knext) { goto L170; } if (k == *m) { k1 = k; k2 = k; } else { if (a[k + 1 + k * a_dim1] != 0.) { k1 = k; k2 = k + 1; knext = k + 2; } else { k1 = k; k2 = k; knext = k + 1; } } if (l1 == l2 && k1 == k2) { i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__2 = *n - l1; /* Computing MIN */ i__3 = l1 + 1; /* Computing MIN */ i__4 = l1 + 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + min(i__3, *n)* c_dim1], ldc, &b[l1 + min(i__4, *n)* b_dim1], ldb); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); scaloc = 1.; a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1]; da11 = abs(a11); if (da11 <= smin) { a11 = smin; da11 = smin; *info = 1; } db = abs(vec[0]); if (da11 < 1. && db > 1.) { if (db > bignum * da11) { scaloc = 1. / db; } } x[0] = vec[0] * scaloc / a11; if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L130: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; } else if (l1 == l2 && k1 != k2) { i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + min(i__3, *n)* c_dim1], ldc, &b[l1 + min(i__4, *n)* b_dim1], ldb); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k2 + min(i__3, *n)* c_dim1], ldc, &b[l1 + min(i__4, *n)* b_dim1], ldb); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); d__1 = -sgn * b[l1 + l1 * b_dim1]; _starpu_dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L140: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k2 + l1 * c_dim1] = x[1]; } else if (l1 != l2 && k1 == k2) { i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + min(i__3, *n)* c_dim1], ldc, &b[l1 + min(i__4, *n)* b_dim1], ldb); vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * sumr)); i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + min(i__3, *n)* c_dim1], ldc, &b[l2 + min(i__4, *n)* b_dim1], ldb); vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * sumr)); d__1 = -sgn * a[k1 + k1 * a_dim1]; _starpu_dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L150: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[1]; } else if (l1 != l2 && k1 != k2) { i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + min(i__3, *n)* c_dim1], ldc, &b[l1 + min(i__4, *n)* b_dim1], ldb); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k1 + min(i__3, *n)* c_dim1], ldc, &b[l2 + min(i__4, *n)* b_dim1], ldb); vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr); i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k2 + min(i__3, *n)* c_dim1], ldc, &b[l1 + min(i__4, *n)* b_dim1], ldb); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); i__2 = k1 - 1; suml = _starpu_ddot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l2 * c_dim1 + 1], &c__1); i__2 = *n - l2; /* Computing MIN */ i__3 = l2 + 1; /* Computing MIN */ i__4 = l2 + 1; sumr = _starpu_ddot_(&i__2, &c__[k2 + min(i__3, *n)* c_dim1], ldc, &b[l2 + min(i__4, *n)* b_dim1], ldb); vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr); _starpu_dlasy2_(&c_true, &c_true, isgn, &c__2, &c__2, &a[k1 + k1 * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, & c__2, &scaloc, x, &c__2, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__2 = *n; for (j = 1; j <= i__2; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L160: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[2]; c__[k2 + l1 * c_dim1] = x[1]; c__[k2 + l2 * c_dim1] = x[3]; } L170: ; } L180: ; } } else if (notrna && ! notrnb) { /* Solve A*X + ISGN*X*B' = scale*C. */ /* The (K,L)th block of X is determined starting from */ /* bottom-right corner column by column by */ /* A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L)' = C(K,L) - R(K,L) */ /* Where */ /* M N */ /* R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)']. */ /* I=K+1 J=L+1 */ /* Start column loop (index = L) */ /* L1 (L2): column index of the first (last) row of X(K,L) */ lnext = *n; for (l = *n; l >= 1; --l) { if (l > lnext) { goto L240; } if (l == 1) { l1 = l; l2 = l; } else { if (b[l + (l - 1) * b_dim1] != 0.) { l1 = l - 1; l2 = l; lnext = l - 2; } else { l1 = l; l2 = l; lnext = l - 1; } } /* Start row loop (index = K) */ /* K1 (K2): row index of the first (last) row of X(K,L) */ knext = *m; for (k = *m; k >= 1; --k) { if (k > knext) { goto L230; } if (k == 1) { k1 = k; k2 = k; } else { if (a[k + (k - 1) * a_dim1] != 0.) { k1 = k - 1; k2 = k; knext = k - 2; } else { k1 = k; k2 = k; knext = k - 1; } } if (l1 == l2 && k1 == k2) { i__1 = *m - k1; /* Computing MIN */ i__2 = k1 + 1; /* Computing MIN */ i__3 = k1 + 1; suml = _starpu_ddot_(&i__1, &a[k1 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l1 * c_dim1], &c__1); i__1 = *n - l1; /* Computing MIN */ i__2 = l1 + 1; /* Computing MIN */ i__3 = l1 + 1; sumr = _starpu_ddot_(&i__1, &c__[k1 + min(i__2, *n)* c_dim1], ldc, &b[l1 + min(i__3, *n)* b_dim1], ldb); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); scaloc = 1.; a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1]; da11 = abs(a11); if (da11 <= smin) { a11 = smin; da11 = smin; *info = 1; } db = abs(vec[0]); if (da11 < 1. && db > 1.) { if (db > bignum * da11) { scaloc = 1. / db; } } x[0] = vec[0] * scaloc / a11; if (scaloc != 1.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L190: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; } else if (l1 == l2 && k1 != k2) { i__1 = *m - k2; /* Computing MIN */ i__2 = k2 + 1; /* Computing MIN */ i__3 = k2 + 1; suml = _starpu_ddot_(&i__1, &a[k1 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l1 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k1 + min(i__2, *n)* c_dim1], ldc, &b[l1 + min(i__3, *n)* b_dim1], ldb); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__1 = *m - k2; /* Computing MIN */ i__2 = k2 + 1; /* Computing MIN */ i__3 = k2 + 1; suml = _starpu_ddot_(&i__1, &a[k2 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l1 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k2 + min(i__2, *n)* c_dim1], ldc, &b[l1 + min(i__3, *n)* b_dim1], ldb); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); d__1 = -sgn * b[l1 + l1 * b_dim1]; _starpu_dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L200: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k2 + l1 * c_dim1] = x[1]; } else if (l1 != l2 && k1 == k2) { i__1 = *m - k1; /* Computing MIN */ i__2 = k1 + 1; /* Computing MIN */ i__3 = k1 + 1; suml = _starpu_ddot_(&i__1, &a[k1 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l1 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k1 + min(i__2, *n)* c_dim1], ldc, &b[l1 + min(i__3, *n)* b_dim1], ldb); vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * sumr)); i__1 = *m - k1; /* Computing MIN */ i__2 = k1 + 1; /* Computing MIN */ i__3 = k1 + 1; suml = _starpu_ddot_(&i__1, &a[k1 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l2 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k1 + min(i__2, *n)* c_dim1], ldc, &b[l2 + min(i__3, *n)* b_dim1], ldb); vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * sumr)); d__1 = -sgn * a[k1 + k1 * a_dim1]; _starpu_dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1, &c_b30, x, &c__2, &scaloc, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L210: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[1]; } else if (l1 != l2 && k1 != k2) { i__1 = *m - k2; /* Computing MIN */ i__2 = k2 + 1; /* Computing MIN */ i__3 = k2 + 1; suml = _starpu_ddot_(&i__1, &a[k1 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l1 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k1 + min(i__2, *n)* c_dim1], ldc, &b[l1 + min(i__3, *n)* b_dim1], ldb); vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr); i__1 = *m - k2; /* Computing MIN */ i__2 = k2 + 1; /* Computing MIN */ i__3 = k2 + 1; suml = _starpu_ddot_(&i__1, &a[k1 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l2 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k1 + min(i__2, *n)* c_dim1], ldc, &b[l2 + min(i__3, *n)* b_dim1], ldb); vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr); i__1 = *m - k2; /* Computing MIN */ i__2 = k2 + 1; /* Computing MIN */ i__3 = k2 + 1; suml = _starpu_ddot_(&i__1, &a[k2 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l1 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k2 + min(i__2, *n)* c_dim1], ldc, &b[l1 + min(i__3, *n)* b_dim1], ldb); vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr); i__1 = *m - k2; /* Computing MIN */ i__2 = k2 + 1; /* Computing MIN */ i__3 = k2 + 1; suml = _starpu_ddot_(&i__1, &a[k2 + min(i__2, *m)* a_dim1], lda, & c__[min(i__3, *m)+ l2 * c_dim1], &c__1); i__1 = *n - l2; /* Computing MIN */ i__2 = l2 + 1; /* Computing MIN */ i__3 = l2 + 1; sumr = _starpu_ddot_(&i__1, &c__[k2 + min(i__2, *n)* c_dim1], ldc, &b[l2 + min(i__3, *n)* b_dim1], ldb); vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr); _starpu_dlasy2_(&c_false, &c_true, isgn, &c__2, &c__2, &a[k1 + k1 * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, & c__2, &scaloc, x, &c__2, &xnorm, &ierr); if (ierr != 0) { *info = 1; } if (scaloc != 1.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { _starpu_dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1); /* L220: */ } *scale *= scaloc; } c__[k1 + l1 * c_dim1] = x[0]; c__[k1 + l2 * c_dim1] = x[2]; c__[k2 + l1 * c_dim1] = x[1]; c__[k2 + l2 * c_dim1] = x[3]; } L230: ; } L240: ; } } return 0; /* End of DTRSYL */ } /* _starpu_dtrsyl_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrti2.c000066400000000000000000000121351413463044200205600ustar00rootroot00000000000000/* dtrti2.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_dtrti2_(char *uplo, char *diag, integer *n, doublereal * a, integer *lda, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer j; doublereal ajj; extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *, integer *); extern logical _starpu_lsame_(char *, char *); logical upper; extern /* Subroutine */ int _starpu_dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_(char *, integer *); logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRTI2 computes the inverse of a real upper or lower triangular */ /* matrix. */ /* This is the Level 2 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* Specifies whether the matrix A is upper or lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* DIAG (input) CHARACTER*1 */ /* Specifies whether or not the matrix A is unit triangular. */ /* = 'N': Non-unit triangular */ /* = 'U': Unit triangular */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the triangular matrix A. If UPLO = 'U', the */ /* leading n by n upper triangular part of the array A contains */ /* the upper triangular matrix, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading n by n lower triangular part of the array A contains */ /* the lower triangular matrix, and the strictly upper */ /* triangular part of A is not referenced. If DIAG = 'U', the */ /* diagonal elements of A are also not referenced and are */ /* assumed to be 1. */ /* On exit, the (triangular) inverse of the original matrix, in */ /* the same storage format. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -k, the k-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRTI2", &i__1); return 0; } if (upper) { /* Compute inverse of upper triangular matrix. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { if (nounit) { a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; ajj = -a[j + j * a_dim1]; } else { ajj = -1.; } /* Compute elements 1:j-1 of j-th column. */ i__2 = j - 1; _starpu_dtrmv_("Upper", "No transpose", diag, &i__2, &a[a_offset], lda, & a[j * a_dim1 + 1], &c__1); i__2 = j - 1; _starpu_dscal_(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1); /* L10: */ } } else { /* Compute inverse of lower triangular matrix. */ for (j = *n; j >= 1; --j) { if (nounit) { a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; ajj = -a[j + j * a_dim1]; } else { ajj = -1.; } if (j < *n) { /* Compute elements j+1:n of j-th column. */ i__1 = *n - j; _starpu_dtrmv_("Lower", "No transpose", diag, &i__1, &a[j + 1 + (j + 1) * a_dim1], lda, &a[j + 1 + j * a_dim1], &c__1); i__1 = *n - j; _starpu_dscal_(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1); } /* L20: */ } } return 0; /* End of DTRTI2 */ } /* _starpu_dtrti2_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrtri.c000066400000000000000000000157121413463044200206640ustar00rootroot00000000000000/* dtrtri.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static doublereal c_b18 = 1.; static doublereal c_b22 = -1.; /* Subroutine */ int _starpu_dtrtri_(char *uplo, char *diag, integer *n, doublereal * a, integer *lda, integer *info) { /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, i__1, i__2[2], i__3, i__4, i__5; char ch__1[2]; /* Builtin functions */ /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer j, jb, nb, nn; extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dtrsm_( char *, char *, char *, char *, integer *, integer *, doublereal * , doublereal *, integer *, doublereal *, integer *); logical upper; extern /* Subroutine */ int _starpu_dtrti2_(char *, char *, integer *, doublereal *, integer *, integer *), _starpu_xerbla_(char *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRTRI computes the inverse of a real upper or lower triangular */ /* matrix A. */ /* This is the Level 3 BLAS version of the algorithm. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the triangular matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of the array A contains */ /* the upper triangular matrix, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of the array A contains */ /* the lower triangular matrix, and the strictly upper */ /* triangular part of A is not referenced. If DIAG = 'U', the */ /* diagonal elements of A are also not referenced and are */ /* assumed to be 1. */ /* On exit, the (triangular) inverse of the original matrix, in */ /* the same storage format. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ /* matrix is singular and its inverse can not be computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ *info = 0; upper = _starpu_lsame_(uplo, "U"); nounit = _starpu_lsame_(diag, "N"); if (! upper && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRTRI", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check for singularity if non-unit. */ if (nounit) { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (a[*info + *info * a_dim1] == 0.) { return 0; } /* L10: */ } *info = 0; } /* Determine the block size for this environment. */ /* Writing concatenation */ i__2[0] = 1, a__1[0] = uplo; i__2[1] = 1, a__1[1] = diag; s_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); nb = _starpu_ilaenv_(&c__1, "DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ _starpu_dtrti2_(uplo, diag, n, &a[a_offset], lda, info); } else { /* Use blocked code */ if (upper) { /* Compute inverse of upper triangular matrix */ i__1 = *n; i__3 = nb; for (j = 1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { /* Computing MIN */ i__4 = nb, i__5 = *n - j + 1; jb = min(i__4,i__5); /* Compute rows 1:j-1 of current block column */ i__4 = j - 1; _starpu_dtrmm_("Left", "Upper", "No transpose", diag, &i__4, &jb, & c_b18, &a[a_offset], lda, &a[j * a_dim1 + 1], lda); i__4 = j - 1; _starpu_dtrsm_("Right", "Upper", "No transpose", diag, &i__4, &jb, & c_b22, &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], lda); /* Compute inverse of current diagonal block */ _starpu_dtrti2_("Upper", diag, &jb, &a[j + j * a_dim1], lda, info); /* L20: */ } } else { /* Compute inverse of lower triangular matrix */ nn = (*n - 1) / nb * nb + 1; i__3 = -nb; for (j = nn; i__3 < 0 ? j >= 1 : j <= 1; j += i__3) { /* Computing MIN */ i__1 = nb, i__4 = *n - j + 1; jb = min(i__1,i__4); if (j + jb <= *n) { /* Compute rows j+jb:n of current block column */ i__1 = *n - j - jb + 1; _starpu_dtrmm_("Left", "Lower", "No transpose", diag, &i__1, &jb, &c_b18, &a[j + jb + (j + jb) * a_dim1], lda, &a[j + jb + j * a_dim1], lda); i__1 = *n - j - jb + 1; _starpu_dtrsm_("Right", "Lower", "No transpose", diag, &i__1, &jb, &c_b22, &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda); } /* Compute inverse of current diagonal block */ _starpu_dtrti2_("Lower", diag, &jb, &a[j + j * a_dim1], lda, info); /* L30: */ } } } return 0; /* End of DTRTRI */ } /* _starpu_dtrtri_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrtrs.c000066400000000000000000000126071413463044200206760ustar00rootroot00000000000000/* dtrtrs.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static doublereal c_b12 = 1.; /* Subroutine */ int _starpu_dtrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical _starpu_lsame_(char *, char *); extern /* Subroutine */ int _starpu_dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_xerbla_( char *, integer *); logical nounit; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRTRS solves a triangular system of the form */ /* A * X = B or A**T * X = B, */ /* where A is a triangular matrix of order N, and B is an N-by-NRHS */ /* matrix. A check is made to verify that A is nonsingular. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER*1 */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': A * X = B (No transpose) */ /* = 'T': A**T * X = B (Transpose) */ /* = 'C': A**H * X = B (Conjugate transpose = Transpose) */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of columns */ /* of the matrix B. NRHS >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The triangular matrix A. If UPLO = 'U', the leading N-by-N */ /* upper triangular part of the array A contains the upper */ /* triangular matrix, and the strictly lower triangular part of */ /* A is not referenced. If UPLO = 'L', the leading N-by-N lower */ /* triangular part of the array A contains the lower triangular */ /* matrix, and the strictly upper triangular part of A is not */ /* referenced. If DIAG = 'U', the diagonal elements of A are */ /* also not referenced and are assumed to be 1. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the right hand side matrix B. */ /* On exit, if INFO = 0, the solution matrix X. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= max(1,N). */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of A is zero, */ /* indicating that the matrix is singular and the solutions */ /* X have not been computed. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; /* Function Body */ *info = 0; nounit = _starpu_lsame_(diag, "N"); if (! _starpu_lsame_(uplo, "U") && ! _starpu_lsame_(uplo, "L")) { *info = -1; } else if (! _starpu_lsame_(trans, "N") && ! _starpu_lsame_(trans, "T") && ! _starpu_lsame_(trans, "C")) { *info = -2; } else if (! nounit && ! _starpu_lsame_(diag, "U")) { *info = -3; } else if (*n < 0) { *info = -4; } else if (*nrhs < 0) { *info = -5; } else if (*lda < max(1,*n)) { *info = -7; } else if (*ldb < max(1,*n)) { *info = -9; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRTRS", &i__1); return 0; } /* Quick return if possible */ if (*n == 0) { return 0; } /* Check for singularity. */ if (nounit) { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (a[*info + *info * a_dim1] == 0.) { return 0; } /* L10: */ } } *info = 0; /* Solve A * x = b or A' * x = b. */ _starpu_dtrsm_("Left", uplo, trans, diag, n, nrhs, &c_b12, &a[a_offset], lda, &b[ b_offset], ldb); return 0; /* End of DTRTRS */ } /* _starpu_dtrtrs_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrttf.c000066400000000000000000000276661413463044200206760ustar00rootroot00000000000000/* dtrttf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrttf_(char *transr, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *arf, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, k, l, n1, n2, ij, nt, nx2, np1x2; logical normaltransr; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); logical nisodd; /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRTTF copies a triangular matrix A from standard full format (TR) */ /* to rectangular full packed format (TF) . */ /* Arguments */ /* ========= */ /* TRANSR (input) CHARACTER */ /* = 'N': ARF in Normal form is wanted; */ /* = 'T': ARF in Transpose form is wanted. */ /* UPLO (input) CHARACTER */ /* = 'U': Upper triangle of A is stored; */ /* = 'L': Lower triangle of A is stored. */ /* N (input) INTEGER */ /* The order of the matrix A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N). */ /* On entry, the triangular matrix A. If UPLO = 'U', the */ /* leading N-by-N upper triangular part of the array A contains */ /* the upper triangular matrix, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of the array A contains */ /* the lower triangular matrix, and the strictly upper */ /* triangular part of A is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the matrix A. LDA >= max(1,N). */ /* ARF (output) DOUBLE PRECISION array, dimension (NT). */ /* NT=N*(N+1)/2. On exit, the triangular matrix A in RFP format. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Notes */ /* ===== */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* even. We give an example where N = 6. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 05 00 */ /* 11 12 13 14 15 10 11 */ /* 22 23 24 25 20 21 22 */ /* 33 34 35 30 31 32 33 */ /* 44 45 40 41 42 43 44 */ /* 55 50 51 52 53 54 55 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(4:6,0:2) consists of */ /* the transpose of the first three columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:2,0:2) consists of */ /* the transpose of the last three columns of AP lower. */ /* This covers the case N even and TRANSR = 'N'. */ /* RFP A RFP A */ /* 03 04 05 33 43 53 */ /* 13 14 15 00 44 54 */ /* 23 24 25 10 11 55 */ /* 33 34 35 20 21 22 */ /* 00 44 45 30 31 32 */ /* 01 11 55 40 41 42 */ /* 02 12 22 50 51 52 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 03 13 23 33 00 01 02 33 00 10 20 30 40 50 */ /* 04 14 24 34 44 11 12 43 44 11 21 31 41 51 */ /* 05 15 25 35 45 55 22 53 54 55 22 32 42 52 */ /* We first consider Rectangular Full Packed (RFP) Format when N is */ /* odd. We give an example where N = 5. */ /* AP is Upper AP is Lower */ /* 00 01 02 03 04 00 */ /* 11 12 13 14 10 11 */ /* 22 23 24 20 21 22 */ /* 33 34 30 31 32 33 */ /* 44 40 41 42 43 44 */ /* Let TRANSR = 'N'. RFP holds AP as follows: */ /* For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last */ /* three columns of AP upper. The lower triangle A(3:4,0:1) consists of */ /* the transpose of the first two columns of AP upper. */ /* For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first */ /* three columns of AP lower. The upper triangle A(0:1,1:2) consists of */ /* the transpose of the last two columns of AP lower. */ /* This covers the case N odd and TRANSR = 'N'. */ /* RFP A RFP A */ /* 02 03 04 00 33 43 */ /* 12 13 14 10 11 44 */ /* 22 23 24 20 21 22 */ /* 00 33 34 30 31 32 */ /* 01 11 44 40 41 42 */ /* Now let TRANSR = 'T'. RFP A in both UPLO cases is just the */ /* transpose of RFP A above. One therefore gets: */ /* RFP A RFP A */ /* 02 12 22 00 01 00 10 20 30 40 50 */ /* 03 13 23 33 11 33 11 21 31 41 51 */ /* 04 14 24 34 44 43 44 22 32 42 52 */ /* Reference */ /* ========= */ /* ===================================================================== */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda - 1 - 0 + 1; a_offset = 0 + a_dim1 * 0; a -= a_offset; /* Function Body */ *info = 0; normaltransr = _starpu_lsame_(transr, "N"); lower = _starpu_lsame_(uplo, "L"); if (! normaltransr && ! _starpu_lsame_(transr, "T")) { *info = -1; } else if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -2; } else if (*n < 0) { *info = -3; } else if (*lda < max(1,*n)) { *info = -5; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRTTF", &i__1); return 0; } /* Quick return if possible */ if (*n <= 1) { if (*n == 1) { arf[0] = a[0]; } return 0; } /* Size of array ARF(0:nt-1) */ nt = *n * (*n + 1) / 2; /* Set N1 and N2 depending on LOWER: for N even N1=N2=K */ if (lower) { n2 = *n / 2; n1 = *n - n2; } else { n1 = *n / 2; n2 = *n - n1; } /* If N is odd, set NISODD = .TRUE., LDA=N+1 and A is (N+1)--by--K2. */ /* If N is even, set K = N/2 and NISODD = .FALSE., LDA=N and A is */ /* N--by--(N+1)/2. */ if (*n % 2 == 0) { k = *n / 2; nisodd = FALSE_; if (! lower) { np1x2 = *n + *n + 2; } } else { nisodd = TRUE_; if (! lower) { nx2 = *n + *n; } } if (nisodd) { /* N is odd */ if (normaltransr) { /* N is odd and TRANSR = 'N' */ if (lower) { /* N is odd, TRANSR = 'N', and UPLO = 'L' */ ij = 0; i__1 = n2; for (j = 0; j <= i__1; ++j) { i__2 = n2 + j; for (i__ = n1; i__ <= i__2; ++i__) { arf[ij] = a[n2 + j + i__ * a_dim1]; ++ij; } i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } } } else { /* N is odd, TRANSR = 'N', and UPLO = 'U' */ ij = nt - *n; i__1 = n1; for (j = *n - 1; j >= i__1; --j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } i__2 = n1 - 1; for (l = j - n1; l <= i__2; ++l) { arf[ij] = a[j - n1 + l * a_dim1]; ++ij; } ij -= nx2; } } } else { /* N is odd and TRANSR = 'T' */ if (lower) { /* N is odd, TRANSR = 'T', and UPLO = 'L' */ ij = 0; i__1 = n2 - 1; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[j + i__ * a_dim1]; ++ij; } i__2 = *n - 1; for (i__ = n1 + j; i__ <= i__2; ++i__) { arf[ij] = a[i__ + (n1 + j) * a_dim1]; ++ij; } } i__1 = *n - 1; for (j = n2; j <= i__1; ++j) { i__2 = n1 - 1; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[j + i__ * a_dim1]; ++ij; } } } else { /* N is odd, TRANSR = 'T', and UPLO = 'U' */ ij = 0; i__1 = n1; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = n1; i__ <= i__2; ++i__) { arf[ij] = a[j + i__ * a_dim1]; ++ij; } } i__1 = n1 - 1; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } i__2 = *n - 1; for (l = n2 + j; l <= i__2; ++l) { arf[ij] = a[n2 + j + l * a_dim1]; ++ij; } } } } } else { /* N is even */ if (normaltransr) { /* N is even and TRANSR = 'N' */ if (lower) { /* N is even, TRANSR = 'N', and UPLO = 'L' */ ij = 0; i__1 = k - 1; for (j = 0; j <= i__1; ++j) { i__2 = k + j; for (i__ = k; i__ <= i__2; ++i__) { arf[ij] = a[k + j + i__ * a_dim1]; ++ij; } i__2 = *n - 1; for (i__ = j; i__ <= i__2; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } } } else { /* N is even, TRANSR = 'N', and UPLO = 'U' */ ij = nt - *n - 1; i__1 = k; for (j = *n - 1; j >= i__1; --j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } i__2 = k - 1; for (l = j - k; l <= i__2; ++l) { arf[ij] = a[j - k + l * a_dim1]; ++ij; } ij -= np1x2; } } } else { /* N is even and TRANSR = 'T' */ if (lower) { /* N is even, TRANSR = 'T', and UPLO = 'L' */ ij = 0; j = k; i__1 = *n - 1; for (i__ = k; i__ <= i__1; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[j + i__ * a_dim1]; ++ij; } i__2 = *n - 1; for (i__ = k + 1 + j; i__ <= i__2; ++i__) { arf[ij] = a[i__ + (k + 1 + j) * a_dim1]; ++ij; } } i__1 = *n - 1; for (j = k - 1; j <= i__1; ++j) { i__2 = k - 1; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[j + i__ * a_dim1]; ++ij; } } } else { /* N is even, TRANSR = 'T', and UPLO = 'U' */ ij = 0; i__1 = k; for (j = 0; j <= i__1; ++j) { i__2 = *n - 1; for (i__ = k; i__ <= i__2; ++i__) { arf[ij] = a[j + i__ * a_dim1]; ++ij; } } i__1 = k - 2; for (j = 0; j <= i__1; ++j) { i__2 = j; for (i__ = 0; i__ <= i__2; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } i__2 = *n - 1; for (l = k + 1 + j; l <= i__2; ++l) { arf[ij] = a[k + 1 + j + l * a_dim1]; ++ij; } } /* Note that here, on exit of the loop, J = K-1 */ i__1 = j; for (i__ = 0; i__ <= i__1; ++i__) { arf[ij] = a[i__ + j * a_dim1]; ++ij; } } } } return 0; /* End of DTRTTF */ } /* _starpu_dtrttf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtrttp.c000066400000000000000000000100701413463044200206650ustar00rootroot00000000000000/* dtrttp.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_dtrttp_(char *uplo, integer *n, doublereal *a, integer * lda, doublereal *ap, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ integer i__, j, k; extern logical _starpu_lsame_(char *, char *); logical lower; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- */ /* -- and Julien Langou of the Univ. of Colorado Denver -- */ /* -- November 2008 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTRTTP copies a triangular matrix A from full format (TR) to standard */ /* packed format (TP). */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular. */ /* = 'L': A is lower triangular. */ /* N (input) INTEGER */ /* The order of the matrices AP and A. N >= 0. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* On exit, the triangular matrix A. If UPLO = 'U', the leading */ /* N-by-N upper triangular part of A contains the upper */ /* triangular part of the matrix A, and the strictly lower */ /* triangular part of A is not referenced. If UPLO = 'L', the */ /* leading N-by-N lower triangular part of A contains the lower */ /* triangular part of the matrix A, and the strictly upper */ /* triangular part of A is not referenced. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,N). */ /* AP (output) DOUBLE PRECISION array, dimension (N*(N+1)/2 */ /* On exit, the upper or lower triangular matrix A, packed */ /* columnwise in a linear array. The j-th column of A is stored */ /* in the array AP as follows: */ /* if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ /* if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ap; /* Function Body */ *info = 0; lower = _starpu_lsame_(uplo, "L"); if (! lower && ! _starpu_lsame_(uplo, "U")) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*lda < max(1,*n)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTRTTP", &i__1); return 0; } if (lower) { k = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { ++k; ap[k] = a[i__ + j * a_dim1]; } } } else { k = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { ++k; ap[k] = a[i__ + j * a_dim1]; } } } return 0; /* End of DTRTTP */ } /* _starpu_dtrttp_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtzrqf.c000066400000000000000000000150671413463044200206710ustar00rootroot00000000000000/* dtzrqf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static doublereal c_b8 = 1.; /* Subroutine */ int _starpu_dtzrqf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ integer i__, k, m1; extern /* Subroutine */ int _starpu_dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), _starpu_dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), _starpu_daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), _starpu_dlarfp_( integer *, doublereal *, doublereal *, integer *, doublereal *), _starpu_xerbla_(char *, integer *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This routine is deprecated and has been replaced by routine DTZRZF. */ /* DTZRQF reduces the M-by-N ( M<=N ) real upper trapezoidal matrix A */ /* to upper triangular form by means of orthogonal transformations. */ /* The upper trapezoidal matrix A is factored as */ /* A = ( R 0 ) * Z, */ /* where Z is an N-by-N orthogonal matrix and R is an M-by-M upper */ /* triangular matrix. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= M. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the leading M-by-N upper trapezoidal part of the */ /* array A must contain the matrix to be factorized. */ /* On exit, the leading M-by-M upper triangular part of A */ /* contains the upper triangular matrix R, and elements M+1 to */ /* N of the first M rows of A, with the array TAU, represent the */ /* orthogonal matrix Z as a product of M elementary reflectors. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (M) */ /* The scalar factors of the elementary reflectors. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* The factorization is obtained by Householder's method. The kth */ /* transformation matrix, Z( k ), which is used to introduce zeros into */ /* the ( m - k + 1 )th row of A, is given in the form */ /* Z( k ) = ( I 0 ), */ /* ( 0 T( k ) ) */ /* where */ /* T( k ) = I - tau*u( k )*u( k )', u( k ) = ( 1 ), */ /* ( 0 ) */ /* ( z( k ) ) */ /* tau is a scalar and z( k ) is an ( n - m ) element vector. */ /* tau and z( k ) are chosen to annihilate the elements of the kth row */ /* of X. */ /* The scalar tau is returned in the kth element of TAU and the vector */ /* u( k ) in the kth row of A, such that the elements of z( k ) are */ /* in a( k, m + 1 ), ..., a( k, n ). The elements of R are returned in */ /* the upper triangular part of A. */ /* Z is given by */ /* Z = Z( 1 ) * Z( 2 ) * ... * Z( m ). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input parameters. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTZRQF", &i__1); return 0; } /* Perform the factorization. */ if (*m == 0) { return 0; } if (*m == *n) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tau[i__] = 0.; /* L10: */ } } else { /* Computing MIN */ i__1 = *m + 1; m1 = min(i__1,*n); for (k = *m; k >= 1; --k) { /* Use a Householder reflection to zero the kth row of A. */ /* First set up the reflection. */ i__1 = *n - *m + 1; _starpu_dlarfp_(&i__1, &a[k + k * a_dim1], &a[k + m1 * a_dim1], lda, &tau[ k]); if (tau[k] != 0. && k > 1) { /* We now perform the operation A := A*P( k ). */ /* Use the first ( k - 1 ) elements of TAU to store a( k ), */ /* where a( k ) consists of the first ( k - 1 ) elements of */ /* the kth column of A. Also let B denote the first */ /* ( k - 1 ) rows of the last ( n - m ) columns of A. */ i__1 = k - 1; _starpu_dcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &tau[1], &c__1); /* Form w = a( k ) + B*z( k ) in TAU. */ i__1 = k - 1; i__2 = *n - *m; _starpu_dgemv_("No transpose", &i__1, &i__2, &c_b8, &a[m1 * a_dim1 + 1], lda, &a[k + m1 * a_dim1], lda, &c_b8, &tau[1], & c__1); /* Now form a( k ) := a( k ) - tau*w */ /* and B := B - tau*w*z( k )'. */ i__1 = k - 1; d__1 = -tau[k]; _starpu_daxpy_(&i__1, &d__1, &tau[1], &c__1, &a[k * a_dim1 + 1], & c__1); i__1 = k - 1; i__2 = *n - *m; d__1 = -tau[k]; _starpu_dger_(&i__1, &i__2, &d__1, &tau[1], &c__1, &a[k + m1 * a_dim1] , lda, &a[m1 * a_dim1 + 1], lda); } /* L20: */ } } return 0; /* End of DTZRQF */ } /* _starpu_dtzrqf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dtzrzf.c000066400000000000000000000213201413463044200206670ustar00rootroot00000000000000/* dtzrzf.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Table of constant values */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* Subroutine */ int _starpu_dtzrzf_(integer *m, integer *n, doublereal *a, integer * lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, m1, ib, nb, ki, kk, mu, nx, iws, nbmin; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *), _starpu_dlarzb_( char *, char *, char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *); extern /* Subroutine */ int _starpu_dlarzt_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), _starpu_dlatrz_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *); integer ldwork, lwkopt; logical lquery; /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DTZRZF reduces the M-by-N ( M<=N ) real upper trapezoidal matrix A */ /* to upper triangular form by means of orthogonal transformations. */ /* The upper trapezoidal matrix A is factored as */ /* A = ( R 0 ) * Z, */ /* where Z is an N-by-N orthogonal matrix and R is an M-by-M upper */ /* triangular matrix. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= M. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the leading M-by-N upper trapezoidal part of the */ /* array A must contain the matrix to be factorized. */ /* On exit, the leading M-by-M upper triangular part of A */ /* contains the upper triangular matrix R, and elements M+1 to */ /* N of the first M rows of A, with the array TAU, represent the */ /* orthogonal matrix Z as a product of M elementary reflectors. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* TAU (output) DOUBLE PRECISION array, dimension (M) */ /* The scalar factors of the elementary reflectors. */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. LWORK >= max(1,M). */ /* For optimum performance LWORK >= M*NB, where NB is */ /* the optimal blocksize. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* Further Details */ /* =============== */ /* Based on contributions by */ /* A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ /* The factorization is obtained by Householder's method. The kth */ /* transformation matrix, Z( k ), which is used to introduce zeros into */ /* the ( m - k + 1 )th row of A, is given in the form */ /* Z( k ) = ( I 0 ), */ /* ( 0 T( k ) ) */ /* where */ /* T( k ) = I - tau*u( k )*u( k )', u( k ) = ( 1 ), */ /* ( 0 ) */ /* ( z( k ) ) */ /* tau is a scalar and z( k ) is an ( n - m ) element vector. */ /* tau and z( k ) are chosen to annihilate the elements of the kth row */ /* of X. */ /* The scalar tau is returned in the kth element of TAU and the vector */ /* u( k ) in the kth row of A, such that the elements of z( k ) are */ /* in a( k, m + 1 ), ..., a( k, n ). The elements of R are returned in */ /* the upper triangular part of A. */ /* Z is given by */ /* Z = Z( 1 ) * Z( 2 ) * ... * Z( m ). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Test the input arguments */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < *m) { *info = -2; } else if (*lda < max(1,*m)) { *info = -4; } if (*info == 0) { if (*m == 0 || *m == *n) { lwkopt = 1; } else { /* Determine the block size. */ nb = _starpu_ilaenv_(&c__1, "DGERQF", " ", m, n, &c_n1, &c_n1); lwkopt = *m * nb; } work[1] = (doublereal) lwkopt; if (*lwork < max(1,*m) && ! lquery) { *info = -7; } } if (*info != 0) { i__1 = -(*info); _starpu_xerbla_("DTZRZF", &i__1); return 0; } else if (lquery) { return 0; } /* Quick return if possible */ if (*m == 0) { return 0; } else if (*m == *n) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { tau[i__] = 0.; /* L10: */ } return 0; } nbmin = 2; nx = 1; iws = *m; if (nb > 1 && nb < *m) { /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ i__1 = 0, i__2 = _starpu_ilaenv_(&c__3, "DGERQF", " ", m, n, &c_n1, &c_n1); nx = max(i__1,i__2); if (nx < *m) { /* Determine if workspace is large enough for blocked code. */ ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ nb = *lwork / ldwork; /* Computing MAX */ i__1 = 2, i__2 = _starpu_ilaenv_(&c__2, "DGERQF", " ", m, n, &c_n1, & c_n1); nbmin = max(i__1,i__2); } } } if (nb >= nbmin && nb < *m && nx < *m) { /* Use blocked code initially. */ /* The last kk rows are handled by the block method. */ /* Computing MIN */ i__1 = *m + 1; m1 = min(i__1,*n); ki = (*m - nx - 1) / nb * nb; /* Computing MIN */ i__1 = *m, i__2 = ki + nb; kk = min(i__1,i__2); i__1 = *m - kk + 1; i__2 = -nb; for (i__ = *m - kk + ki + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ i__3 = *m - i__ + 1; ib = min(i__3,nb); /* Compute the TZ factorization of the current block */ /* A(i:i+ib-1,i:n) */ i__3 = *n - i__ + 1; i__4 = *n - *m; _starpu_dlatrz_(&ib, &i__3, &i__4, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1]); if (i__ > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ i__3 = *n - *m; _starpu_dlarzt_("Backward", "Rowwise", &i__3, &ib, &a[i__ + m1 * a_dim1], lda, &tau[i__], &work[1], &ldwork); /* Apply H to A(1:i-1,i:n) from the right */ i__3 = i__ - 1; i__4 = *n - i__ + 1; i__5 = *n - *m; _starpu_dlarzb_("Right", "No transpose", "Backward", "Rowwise", &i__3, &i__4, &ib, &i__5, &a[i__ + m1 * a_dim1], lda, &work[ 1], &ldwork, &a[i__ * a_dim1 + 1], lda, &work[ib + 1], &ldwork) ; } /* L20: */ } mu = i__ + nb - 1; } else { mu = *m; } /* Use unblocked code to factor the last or only block */ if (mu > 0) { i__2 = *n - *m; _starpu_dlatrz_(&mu, n, &i__2, &a[a_offset], lda, &tau[1], &work[1]); } work[1] = (doublereal) lwkopt; return 0; /* End of DTZRZF */ } /* _starpu_dtzrzf_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/dzsum1.c000066400000000000000000000051321413463044200205720ustar00rootroot00000000000000/* dzsum1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" doublereal _starpu_dzsum1_(integer *n, doublecomplex *cx, integer *incx) { /* System generated locals */ integer i__1, i__2; doublereal ret_val; /* Builtin functions */ double z_abs(doublecomplex *); /* Local variables */ integer i__, nincx; doublereal stemp; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DZSUM1 takes the sum of the absolute values of a complex */ /* vector and returns a double precision result. */ /* Based on DZASUM from the Level 1 BLAS. */ /* The change is to use the 'genuine' absolute value. */ /* Contributed by Nick Higham for use with ZLACON. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of elements in the vector CX. */ /* CX (input) COMPLEX*16 array, dimension (N) */ /* The vector whose elements will be summed. */ /* INCX (input) INTEGER */ /* The spacing between successive values of CX. INCX > 0. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --cx; /* Function Body */ ret_val = 0.; stemp = 0.; if (*n <= 0) { return ret_val; } if (*incx == 1) { goto L20; } /* CODE FOR INCREMENT NOT EQUAL TO 1 */ nincx = *n * *incx; i__1 = nincx; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* NEXT LINE MODIFIED. */ stemp += z_abs(&cx[i__]); /* L10: */ } ret_val = stemp; return ret_val; /* CODE FOR INCREMENT EQUAL TO 1 */ L20: i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { /* NEXT LINE MODIFIED. */ stemp += z_abs(&cx[i__]); /* L30: */ } ret_val = stemp; return ret_val; /* End of DZSUM1 */ } /* _starpu_dzsum1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/icmax1.c000066400000000000000000000053701413463044200205350ustar00rootroot00000000000000/* icmax1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_icmax1_(integer *n, complex *cx, integer *incx) { /* System generated locals */ integer ret_val, i__1; /* Builtin functions */ double c_abs(complex *); /* Local variables */ integer i__, ix; real smax; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ICMAX1 finds the index of the element whose real part has maximum */ /* absolute value. */ /* Based on ICAMAX from Level 1 BLAS. */ /* The change is to use the 'genuine' absolute value. */ /* Contributed by Nick Higham for use with CLACON. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of elements in the vector CX. */ /* CX (input) COMPLEX array, dimension (N) */ /* The vector whose elements will be summed. */ /* INCX (input) INTEGER */ /* The spacing between successive values of CX. INCX >= 1. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Statement Functions .. */ /* .. */ /* .. Statement Function definitions .. */ /* NEXT LINE IS THE ONLY MODIFICATION. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --cx; /* Function Body */ ret_val = 0; if (*n < 1) { return ret_val; } ret_val = 1; if (*n == 1) { return ret_val; } if (*incx == 1) { goto L30; } /* CODE FOR INCREMENT NOT EQUAL TO 1 */ ix = 1; smax = c_abs(&cx[1]); ix += *incx; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (c_abs(&cx[ix]) <= smax) { goto L10; } ret_val = i__; smax = c_abs(&cx[ix]); L10: ix += *incx; /* L20: */ } return ret_val; /* CODE FOR INCREMENT EQUAL TO 1 */ L30: smax = c_abs(&cx[1]); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (c_abs(&cx[i__]) <= smax) { goto L40; } ret_val = i__; smax = c_abs(&cx[i__]); L40: ; } return ret_val; /* End of ICMAX1 */ } /* _starpu_icmax1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ieeeck.c000066400000000000000000000065711413463044200206040ustar00rootroot00000000000000/* ieeeck.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ieeeck_(integer *ispec, real *zero, real *one) { /* System generated locals */ integer ret_val; /* Local variables */ real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, newzro; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* IEEECK is called from the ILAENV to verify that Infinity and */ /* possibly NaN arithmetic is safe (i.e. will not trap). */ /* Arguments */ /* ========= */ /* ISPEC (input) INTEGER */ /* Specifies whether to test just for inifinity arithmetic */ /* or whether to test for infinity and NaN arithmetic. */ /* = 0: Verify infinity arithmetic only. */ /* = 1: Verify infinity and NaN arithmetic. */ /* ZERO (input) REAL */ /* Must contain the value 0.0 */ /* This is passed to prevent the compiler from optimizing */ /* away this code. */ /* ONE (input) REAL */ /* Must contain the value 1.0 */ /* This is passed to prevent the compiler from optimizing */ /* away this code. */ /* RETURN VALUE: INTEGER */ /* = 0: Arithmetic failed to produce the correct answers */ /* = 1: Arithmetic produced the correct answers */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ ret_val = 1; posinf = *one / *zero; if (posinf <= *one) { ret_val = 0; return ret_val; } neginf = -(*one) / *zero; if (neginf >= *zero) { ret_val = 0; return ret_val; } negzro = *one / (neginf + *one); if (negzro != *zero) { ret_val = 0; return ret_val; } neginf = *one / negzro; if (neginf >= *zero) { ret_val = 0; return ret_val; } newzro = negzro + *zero; if (newzro != *zero) { ret_val = 0; return ret_val; } posinf = *one / newzro; if (posinf <= *one) { ret_val = 0; return ret_val; } neginf *= posinf; if (neginf >= *zero) { ret_val = 0; return ret_val; } posinf *= posinf; if (posinf <= *one) { ret_val = 0; return ret_val; } /* Return if we were only asked to check infinity arithmetic */ if (*ispec == 0) { return ret_val; } nan1 = posinf + neginf; nan2 = posinf / neginf; nan3 = posinf / posinf; nan4 = posinf * *zero; nan5 = neginf * negzro; nan6 = nan5 * 0.f; if (nan1 == nan1) { ret_val = 0; return ret_val; } if (nan2 == nan2) { ret_val = 0; return ret_val; } if (nan3 == nan3) { ret_val = 0; return ret_val; } if (nan4 == nan4) { ret_val = 0; return ret_val; } if (nan5 == nan5) { ret_val = 0; return ret_val; } if (nan6 == nan6) { ret_val = 0; return ret_val; } return ret_val; } /* _starpu_ieeeck_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaclc.c000066400000000000000000000050521413463044200205770ustar00rootroot00000000000000/* ilaclc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilaclc_(integer *m, integer *n, complex *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1, i__2; /* Local variables */ integer i__; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILACLC scans A for its last non-zero column. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) COMPLEX array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*n == 0) { ret_val = *n; } else /* if(complicated condition) */ { i__1 = *n * a_dim1 + 1; i__2 = *m + *n * a_dim1; if (a[i__1].r != 0.f || a[i__1].i != 0.f || (a[i__2].r != 0.f || a[ i__2].i != 0.f)) { ret_val = *n; } else { /* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__ + ret_val * a_dim1; if (a[i__2].r != 0.f || a[i__2].i != 0.f) { return ret_val; } } } } } return ret_val; } /* _starpu_ilaclc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaclr.c000066400000000000000000000050601413463044200206150ustar00rootroot00000000000000/* ilaclr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilaclr_(integer *m, integer *n, complex *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1, i__2; /* Local variables */ integer i__, j; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILACLR scans A for its last non-zero row. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) COMPLEX array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*m == 0) { ret_val = *m; } else /* if(complicated condition) */ { i__1 = *m + a_dim1; i__2 = *m + *n * a_dim1; if (a[i__1].r != 0.f || a[i__1].i != 0.f || (a[i__2].r != 0.f || a[ i__2].i != 0.f)) { ret_val = *m; } else { /* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { i__2 = i__ + j * a_dim1; if (a[i__2].r != 0.f || a[i__2].i != 0.f) { break; } } ret_val = max(ret_val,i__); } } } return ret_val; } /* _starpu_ilaclr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/iladiag.c000066400000000000000000000035051413463044200207430ustar00rootroot00000000000000/* iladiag.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iladiag_(char *diag) { /* System generated locals */ integer ret_val; /* Local variables */ extern logical _starpu_lsame_(char *, char *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* October 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine translated from a character string specifying if a */ /* matrix has unit diagonal or not to the relevant BLAST-specified */ /* integer constant. */ /* ILADIAG returns an INTEGER. If ILADIAG < 0, then the input is not a */ /* character indicating a unit or non-unit diagonal. Otherwise ILADIAG */ /* returns the constant value corresponding to DIAG. */ /* Arguments */ /* ========= */ /* DIAG (input) CHARACTER*1 */ /* = 'N': A is non-unit triangular; */ /* = 'U': A is unit triangular. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ if (_starpu_lsame_(diag, "N")) { ret_val = 131; } else if (_starpu_lsame_(diag, "U")) { ret_val = 132; } else { ret_val = -1; } return ret_val; /* End of ILADIAG */ } /* _starpu_iladiag_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/iladlc.c000066400000000000000000000046141413463044200206030ustar00rootroot00000000000000/* iladlc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iladlc_(integer *m, integer *n, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; /* Local variables */ integer i__; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILADLC scans A for its last non-zero column. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*n == 0) { ret_val = *n; } else if (a[*n * a_dim1 + 1] != 0. || a[*m + *n * a_dim1] != 0.) { ret_val = *n; } else { /* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (a[i__ + ret_val * a_dim1] != 0.) { return ret_val; } } } } return ret_val; } /* _starpu_iladlc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/iladlr.c000066400000000000000000000046011413463044200206160ustar00rootroot00000000000000/* iladlr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iladlr_(integer *m, integer *n, doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; /* Local variables */ integer i__, j; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILADLR scans A for its last non-zero row. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) DOUBLE PRECISION array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*m == 0) { ret_val = *m; } else if (a[*m + a_dim1] != 0. || a[*m + *n * a_dim1] != 0.) { ret_val = *m; } else { /* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { if (a[i__ + j * a_dim1] != 0.) { break; } } ret_val = max(ret_val,i__); } } return ret_val; } /* _starpu_iladlr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaenv.c000066400000000000000000000467721413463044200206440ustar00rootroot00000000000000/* ilaenv.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" #include "string.h" /* Table of constant values */ static integer c__1 = 1; static real c_b163 = 0.f; static real c_b164 = 1.f; static integer c__0 = 0; integer _starpu_ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, integer *n4) { /* System generated locals */ integer ret_val; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer s_cmp(char *, char *, ftnlen, ftnlen); /* Local variables */ integer i__; char c1[1], c2[1], c3[1], c4[1]; integer ic, nb, iz, nx; logical cname; integer nbmin; logical sname; extern integer _starpu_ieeeck_(integer *, real *, real *); char subnam[1]; extern integer _starpu_iparmq_(integer *, char *, char *, integer *, integer *, integer *, integer *); ftnlen name_len, opts_len; name_len = strlen (name__); opts_len = strlen (opts); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILAENV is called from the LAPACK routines to choose problem-dependent */ /* parameters for the local environment. See ISPEC for a description of */ /* the parameters. */ /* ILAENV returns an INTEGER */ /* if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC */ /* if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value. */ /* This version provides a set of parameters which should give good, */ /* but not optimal, performance on many of the currently available */ /* computers. Users are encouraged to modify this subroutine to set */ /* the tuning parameters for their particular machine using the option */ /* and problem size information in the arguments. */ /* This routine will not function correctly if it is converted to all */ /* lower case. Converting it to all upper case is allowed. */ /* Arguments */ /* ========= */ /* ISPEC (input) INTEGER */ /* Specifies the parameter to be returned as the value of */ /* ILAENV. */ /* = 1: the optimal blocksize; if this value is 1, an unblocked */ /* algorithm will give the best performance. */ /* = 2: the minimum block size for which the block routine */ /* should be used; if the usable block size is less than */ /* this value, an unblocked routine should be used. */ /* = 3: the crossover point (in a block routine, for N less */ /* than this value, an unblocked routine should be used) */ /* = 4: the number of shifts, used in the nonsymmetric */ /* eigenvalue routines (DEPRECATED) */ /* = 5: the minimum column dimension for blocking to be used; */ /* rectangular blocks must have dimension at least k by m, */ /* where k is given by ILAENV(2,...) and m by ILAENV(5,...) */ /* = 6: the crossover point for the SVD (when reducing an m by n */ /* matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds */ /* this value, a QR factorization is used first to reduce */ /* the matrix to a triangular form.) */ /* = 7: the number of processors */ /* = 8: the crossover point for the multishift QR method */ /* for nonsymmetric eigenvalue problems (DEPRECATED) */ /* = 9: maximum size of the subproblems at the bottom of the */ /* computation tree in the divide-and-conquer algorithm */ /* (used by xGELSD and xGESDD) */ /* =10: ieee NaN arithmetic can be trusted not to trap */ /* =11: infinity arithmetic can be trusted not to trap */ /* 12 <= ISPEC <= 16: */ /* xHSEQR or one of its subroutines, */ /* see IPARMQ for detailed explanation */ /* NAME (input) CHARACTER*(*) */ /* The name of the calling subroutine, in either upper case or */ /* lower case. */ /* OPTS (input) CHARACTER*(*) */ /* The character options to the subroutine NAME, concatenated */ /* into a single character string. For example, UPLO = 'U', */ /* TRANS = 'T', and DIAG = 'N' for a triangular routine would */ /* be specified as OPTS = 'UTN'. */ /* N1 (input) INTEGER */ /* N2 (input) INTEGER */ /* N3 (input) INTEGER */ /* N4 (input) INTEGER */ /* Problem dimensions for the subroutine NAME; these may not all */ /* be required. */ /* Further Details */ /* =============== */ /* The following conventions have been used when calling ILAENV from the */ /* LAPACK routines: */ /* 1) OPTS is a concatenation of all of the character options to */ /* subroutine NAME, in the same order that they appear in the */ /* argument list for NAME, even if they are not used in determining */ /* the value of the parameter specified by ISPEC. */ /* 2) The problem dimensions N1, N2, N3, N4 are specified in the order */ /* that they appear in the argument list for NAME. N1 is used */ /* first, N2 second, and so on, and unused problem dimensions are */ /* passed a value of -1. */ /* 3) The parameter value returned by ILAENV is checked for validity in */ /* the calling subroutine. For example, ILAENV is used to retrieve */ /* the optimal blocksize for STRTRI as follows: */ /* NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) */ /* IF( NB.LE.1 ) NB = MAX( 1, N ) */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ switch (*ispec) { case 1: goto L10; case 2: goto L10; case 3: goto L10; case 4: goto L80; case 5: goto L90; case 6: goto L100; case 7: goto L110; case 8: goto L120; case 9: goto L130; case 10: goto L140; case 11: goto L150; case 12: goto L160; case 13: goto L160; case 14: goto L160; case 15: goto L160; case 16: goto L160; } /* Invalid value for ISPEC */ ret_val = -1; return ret_val; L10: /* Convert NAME to upper case if the first character is lower case. */ ret_val = 1; s_copy(subnam, name__, (ftnlen)1, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { /* ASCII character set */ if (ic >= 97 && ic <= 122) { *(unsigned char *)subnam = (char) (ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 97 && ic <= 122) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); } /* L20: */ } } } else if (iz == 233 || iz == 169) { /* EBCDIC character set */ if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { *(unsigned char *)subnam = (char) (ic + 64); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); } /* L30: */ } } } else if (iz == 218 || iz == 250) { /* Prime machines: ASCII+128 */ if (ic >= 225 && ic <= 250) { *(unsigned char *)subnam = (char) (ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 225 && ic <= 250) { *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); } /* L40: */ } } } *(unsigned char *)c1 = *(unsigned char *)subnam; sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; if (! (cname || sname)) { return ret_val; } s_copy(c2, subnam + 1, (ftnlen)1, (ftnlen)2); s_copy(c3, subnam + 3, (ftnlen)1, (ftnlen)3); s_copy(c4, c3 + 1, (ftnlen)1, (ftnlen)2); switch (*ispec) { case 1: goto L50; case 2: goto L60; case 3: goto L70; } L50: /* ISPEC = 1: block size */ /* In these examples, separate code is provided for setting NB for */ /* real and complex. We assume that NB will take the same value in */ /* single or double precision. */ nb = 1; if (s_cmp(c2, "GE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } else if (s_cmp(c3, "QRF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "RQF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) 1, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "HRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "BRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } else if (s_cmp(c3, "TRI", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "PO", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "SY", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } else if (sname && s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nb = 32; } else if (sname && s_cmp(c3, "GST", (ftnlen)1, (ftnlen)3) == 0) { nb = 64; } } else if (cname && s_cmp(c2, "HE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { nb = 64; } else if (s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nb = 32; } else if (s_cmp(c3, "GST", (ftnlen)1, (ftnlen)3) == 0) { nb = 64; } } else if (sname && s_cmp(c2, "OR", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nb = 32; } } } else if (s_cmp(c2, "GB", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { if (*n4 <= 64) { nb = 1; } else { nb = 32; } } else { if (*n4 <= 64) { nb = 1; } else { nb = 32; } } } } else if (s_cmp(c2, "PB", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { if (*n2 <= 64) { nb = 1; } else { nb = 32; } } else { if (*n2 <= 64) { nb = 1; } else { nb = 32; } } } } else if (s_cmp(c2, "TR", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRI", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (s_cmp(c2, "LA", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "UUM", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } } else if (sname && s_cmp(c2, "ST", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "EBZ", (ftnlen)1, (ftnlen)3) == 0) { nb = 1; } } ret_val = nb; return ret_val; L60: /* ISPEC = 2: minimum block size */ nbmin = 2; if (s_cmp(c2, "GE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "QRF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)1, ( ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "HRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "BRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } else if (s_cmp(c3, "TRI", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } } else if (s_cmp(c2, "SY", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nbmin = 8; } else { nbmin = 8; } } else if (sname && s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nbmin = 2; } } else if (cname && s_cmp(c2, "HE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nbmin = 2; } } else if (sname && s_cmp(c2, "OR", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nbmin = 2; } } } ret_val = nbmin; return ret_val; L70: /* ISPEC = 3: crossover point */ nx = 0; if (s_cmp(c2, "GE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "QRF", (ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( ftnlen)1, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)1, ( ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } else if (s_cmp(c3, "HRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } else if (s_cmp(c3, "BRD", (ftnlen)1, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } } else if (s_cmp(c2, "SY", (ftnlen)1, (ftnlen)2) == 0) { if (sname && s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nx = 32; } } else if (cname && s_cmp(c2, "HE", (ftnlen)1, (ftnlen)2) == 0) { if (s_cmp(c3, "TRD", (ftnlen)1, (ftnlen)3) == 0) { nx = 32; } } else if (sname && s_cmp(c2, "OR", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nx = 128; } } } else if (cname && s_cmp(c2, "UN", (ftnlen)1, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { if (s_cmp(c4, "QR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "RQ", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)1, ( ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "HR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp( c4, "TR", (ftnlen)1, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( ftnlen)1, (ftnlen)2) == 0) { nx = 128; } } } ret_val = nx; return ret_val; L80: /* ISPEC = 4: number of shifts (used by xHSEQR) */ ret_val = 6; return ret_val; L90: /* ISPEC = 5: minimum column dimension (not used) */ ret_val = 2; return ret_val; L100: /* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); return ret_val; L110: /* ISPEC = 7: number of processors (not used) */ ret_val = 1; return ret_val; L120: /* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ ret_val = 50; return ret_val; L130: /* ISPEC = 9: maximum size of the subproblems at the bottom of the */ /* computation tree in the divide-and-conquer algorithm */ /* (used by xGELSD and xGESDD) */ ret_val = 25; return ret_val; L140: /* ISPEC = 10: ieee NaN arithmetic can be trusted not to trap */ /* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = _starpu_ieeeck_(&c__1, &c_b163, &c_b164); } return ret_val; L150: /* ISPEC = 11: infinity arithmetic can be trusted not to trap */ /* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = _starpu_ieeeck_(&c__0, &c_b163, &c_b164); } return ret_val; L160: /* 12 <= ISPEC <= 16: xHSEQR or one of its subroutines. */ ret_val = _starpu_iparmq_(ispec, name__, opts, n1, n2, n3, n4) ; return ret_val; /* End of ILAENV */ } /* _starpu_ilaenv_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaprec.c000066400000000000000000000040651413463044200207720ustar00rootroot00000000000000/* ilaprec.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilaprec_(char *prec) { /* System generated locals */ integer ret_val; /* Local variables */ extern logical _starpu_lsame_(char *, char *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* October 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine translated from a character string specifying an */ /* intermediate precision to the relevant BLAST-specified integer */ /* constant. */ /* ILAPREC returns an INTEGER. If ILAPREC < 0, then the input is not a */ /* character indicating a supported intermediate precision. Otherwise */ /* ILAPREC returns the constant value corresponding to PREC. */ /* Arguments */ /* ========= */ /* PREC (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'S': Single */ /* = 'D': Double */ /* = 'I': Indigenous */ /* = 'X', 'E': Extra */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ if (_starpu_lsame_(prec, "S")) { ret_val = 211; } else if (_starpu_lsame_(prec, "D")) { ret_val = 212; } else if (_starpu_lsame_(prec, "I")) { ret_val = 213; } else if (_starpu_lsame_(prec, "X") || _starpu_lsame_(prec, "E")) { ret_val = 214; } else { ret_val = -1; } return ret_val; /* End of ILAPREC */ } /* _starpu_ilaprec_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaslc.c000066400000000000000000000045751413463044200206300ustar00rootroot00000000000000/* ilaslc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilaslc_(integer *m, integer *n, real *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; /* Local variables */ integer i__; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILASLC scans A for its last non-zero column. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) REAL array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*n == 0) { ret_val = *n; } else if (a[*n * a_dim1 + 1] != 0.f || a[*m + *n * a_dim1] != 0.f) { ret_val = *n; } else { /* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { if (a[i__ + ret_val * a_dim1] != 0.f) { return ret_val; } } } } return ret_val; } /* _starpu_ilaslc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaslr.c000066400000000000000000000045761413463044200206500ustar00rootroot00000000000000/* ilaslr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilaslr_(integer *m, integer *n, real *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; /* Local variables */ integer i__, j; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILASLR scans A for its last non-zero row. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) REAL array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*m == 0) { ret_val = *m; } else if (a[*m + a_dim1] != 0.f || a[*m + *n * a_dim1] != 0.f) { ret_val = *m; } else { /* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { if (a[i__ + j * a_dim1] != 0.f) { break; } } ret_val = max(ret_val,i__); } } return ret_val; } /* _starpu_ilaslr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilatrans.c000066400000000000000000000037171413463044200211730ustar00rootroot00000000000000/* ilatrans.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilatrans_(char *trans) { /* System generated locals */ integer ret_val; /* Local variables */ extern logical _starpu_lsame_(char *, char *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* October 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine translates from a character string specifying a */ /* transposition operation to the relevant BLAST-specified integer */ /* constant. */ /* ILATRANS returns an INTEGER. If ILATRANS < 0, then the input is not */ /* a character indicating a transposition operator. Otherwise ILATRANS */ /* returns the constant value corresponding to TRANS. */ /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* Specifies the form of the system of equations: */ /* = 'N': No transpose */ /* = 'T': Transpose */ /* = 'C': Conjugate transpose */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ if (_starpu_lsame_(trans, "N")) { ret_val = 111; } else if (_starpu_lsame_(trans, "T")) { ret_val = 112; } else if (_starpu_lsame_(trans, "C")) { ret_val = 113; } else { ret_val = -1; } return ret_val; /* End of ILATRANS */ } /* _starpu_ilatrans_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilauplo.c000066400000000000000000000035101413463044200210120ustar00rootroot00000000000000/* ilauplo.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilauplo_(char *uplo) { /* System generated locals */ integer ret_val; /* Local variables */ extern logical _starpu_lsame_(char *, char *); /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* October 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine translated from a character string specifying a */ /* upper- or lower-triangular matrix to the relevant BLAST-specified */ /* integer constant. */ /* ILAUPLO returns an INTEGER. If ILAUPLO < 0, then the input is not */ /* a character indicating an upper- or lower-triangular matrix. */ /* Otherwise ILAUPLO returns the constant value corresponding to UPLO. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER */ /* = 'U': A is upper triangular; */ /* = 'L': A is lower triangular. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ if (_starpu_lsame_(uplo, "U")) { ret_val = 121; } else if (_starpu_lsame_(uplo, "L")) { ret_val = 122; } else { ret_val = -1; } return ret_val; /* End of ILAUPLO */ } /* _starpu_ilauplo_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilaver.c000066400000000000000000000027431413463044200206360ustar00rootroot00000000000000/* ilaver.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_ilaver_(integer *vers_major__, integer *vers_minor__, integer *vers_patch__) { /* -- LAPACK routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. */ /* Purpose */ /* ======= */ /* This subroutine return the Lapack version */ /* Arguments */ /* ========= */ /* VERS_MAJOR (output) INTEGER */ /* return the lapack major version */ /* VERS_MINOR (output) INTEGER */ /* return the lapack minor version from the major version */ /* VERS_PATCH (output) INTEGER */ /* return the lapack patch version from the minor version */ /* ===================================================================== */ /* ===================================================================== */ *vers_major__ = 3; *vers_minor__ = 1; *vers_patch__ = 1; /* ===================================================================== */ return 0; } /* _starpu_ilaver_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilazlc.c000066400000000000000000000050551413463044200206310ustar00rootroot00000000000000/* ilazlc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1, i__2; /* Local variables */ integer i__; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILAZLC scans A for its last non-zero column. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) COMPLEX*16 array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*n == 0) { ret_val = *n; } else /* if(complicated condition) */ { i__1 = *n * a_dim1 + 1; i__2 = *m + *n * a_dim1; if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] .i != 0.)) { ret_val = *n; } else { /* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__ + ret_val * a_dim1; if (a[i__2].r != 0. || a[i__2].i != 0.) { return ret_val; } } } } } return ret_val; } /* _starpu_ilazlc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/ilazlr.c000066400000000000000000000050521413463044200206450ustar00rootroot00000000000000/* ilazlr.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1, i__2; /* Local variables */ integer i__, j; /* -- LAPACK auxiliary routine (version 3.2.1) -- */ /* -- April 2009 -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* ILAZLR scans A for its last non-zero row. */ /* Arguments */ /* ========= */ /* M (input) INTEGER */ /* The number of rows of the matrix A. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. */ /* A (input) COMPLEX*16 array, dimension (LDA,N) */ /* The m by n matrix A. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Executable Statements .. */ /* Quick test for the common case where one corner is non-zero. */ /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; /* Function Body */ if (*m == 0) { ret_val = *m; } else /* if(complicated condition) */ { i__1 = *m + a_dim1; i__2 = *m + *n * a_dim1; if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] .i != 0.)) { ret_val = *m; } else { /* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { for (i__ = *m; i__ >= 1; --i__) { i__2 = i__ + j * a_dim1; if (a[i__2].r != 0. || a[i__2].i != 0.) { break; } } ret_val = max(ret_val,i__); } } } return ret_val; } /* _starpu_ilazlr_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/iparmq.c000066400000000000000000000241731413463044200206460ustar00rootroot00000000000000/* iparmq.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer *ilo, integer *ihi, integer *lwork) { /* System generated locals */ integer ret_val, i__1, i__2; real r__1; /* Builtin functions */ double log(doublereal); integer i_nint(real *); /* Local variables */ integer nh, ns; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* Purpose */ /* ======= */ /* This program sets problem and machine dependent parameters */ /* useful for xHSEQR and its subroutines. It is called whenever */ /* ILAENV is called with 12 <= ISPEC <= 16 */ /* Arguments */ /* ========= */ /* ISPEC (input) integer scalar */ /* ISPEC specifies which tunable parameter IPARMQ should */ /* return. */ /* ISPEC=12: (INMIN) Matrices of order nmin or less */ /* are sent directly to xLAHQR, the implicit */ /* double shift QR algorithm. NMIN must be */ /* at least 11. */ /* ISPEC=13: (INWIN) Size of the deflation window. */ /* This is best set greater than or equal to */ /* the number of simultaneous shifts NS. */ /* Larger matrices benefit from larger deflation */ /* windows. */ /* ISPEC=14: (INIBL) Determines when to stop nibbling and */ /* invest in an (expensive) multi-shift QR sweep. */ /* If the aggressive early deflation subroutine */ /* finds LD converged eigenvalues from an order */ /* NW deflation window and LD.GT.(NW*NIBBLE)/100, */ /* then the next QR sweep is skipped and early */ /* deflation is applied immediately to the */ /* remaining active diagonal block. Setting */ /* IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a */ /* multi-shift QR sweep whenever early deflation */ /* finds a converged eigenvalue. Setting */ /* IPARMQ(ISPEC=14) greater than or equal to 100 */ /* prevents TTQRE from skipping a multi-shift */ /* QR sweep. */ /* ISPEC=15: (NSHFTS) The number of simultaneous shifts in */ /* a multi-shift QR iteration. */ /* ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the */ /* following meanings. */ /* 0: During the multi-shift QR sweep, */ /* xLAQR5 does not accumulate reflections and */ /* does not use matrix-matrix multiply to */ /* update the far-from-diagonal matrix */ /* entries. */ /* 1: During the multi-shift QR sweep, */ /* xLAQR5 and/or xLAQRaccumulates reflections and uses */ /* matrix-matrix multiply to update the */ /* far-from-diagonal matrix entries. */ /* 2: During the multi-shift QR sweep. */ /* xLAQR5 accumulates reflections and takes */ /* advantage of 2-by-2 block structure during */ /* matrix-matrix multiplies. */ /* (If xTRMM is slower than xGEMM, then */ /* IPARMQ(ISPEC=16)=1 may be more efficient than */ /* IPARMQ(ISPEC=16)=2 despite the greater level of */ /* arithmetic work implied by the latter choice.) */ /* NAME (input) character string */ /* Name of the calling subroutine */ /* OPTS (input) character string */ /* This is a concatenation of the string arguments to */ /* TTQRE. */ /* N (input) integer scalar */ /* N is the order of the Hessenberg matrix H. */ /* ILO (input) INTEGER */ /* IHI (input) INTEGER */ /* It is assumed that H is already upper triangular */ /* in rows and columns 1:ILO-1 and IHI+1:N. */ /* LWORK (input) integer scalar */ /* The amount of workspace available. */ /* Further Details */ /* =============== */ /* Little is known about how best to choose these parameters. */ /* It is possible to use different values of the parameters */ /* for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR. */ /* It is probably best to choose different parameters for */ /* different matrices and different parameters at different */ /* times during the iteration, but this has not been */ /* implemented --- yet. */ /* The best choices of most of the parameters depend */ /* in an ill-understood way on the relative execution */ /* rate of xLAQR3 and xLAQR5 and on the nature of each */ /* particular eigenvalue problem. Experiment may be the */ /* only practical way to determine which choices are most */ /* effective. */ /* Following is a list of default values supplied by IPARMQ. */ /* These defaults may be adjusted in order to attain better */ /* performance in any particular computational environment. */ /* IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point. */ /* Default: 75. (Must be at least 11.) */ /* IPARMQ(ISPEC=13) Recommended deflation window size. */ /* This depends on ILO, IHI and NS, the */ /* number of simultaneous shifts returned */ /* by IPARMQ(ISPEC=15). The default for */ /* (IHI-ILO+1).LE.500 is NS. The default */ /* for (IHI-ILO+1).GT.500 is 3*NS/2. */ /* IPARMQ(ISPEC=14) Nibble crossover point. Default: 14. */ /* IPARMQ(ISPEC=15) Number of simultaneous shifts, NS. */ /* a multi-shift QR iteration. */ /* If IHI-ILO+1 is ... */ /* greater than ...but less ... the */ /* or equal to ... than default is */ /* 0 30 NS = 2+ */ /* 30 60 NS = 4+ */ /* 60 150 NS = 10 */ /* 150 590 NS = ** */ /* 590 3000 NS = 64 */ /* 3000 6000 NS = 128 */ /* 6000 infinity NS = 256 */ /* (+) By default matrices of this order are */ /* passed to the implicit double shift routine */ /* xLAHQR. See IPARMQ(ISPEC=12) above. These */ /* values of NS are used only in case of a rare */ /* xLAHQR failure. */ /* (**) The asterisks (**) indicate an ad-hoc */ /* function increasing from 10 to 64. */ /* IPARMQ(ISPEC=16) Select structured matrix multiply. */ /* (See ISPEC=16 above for details.) */ /* Default: 3. */ /* ================================================================ */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ if (*ispec == 15 || *ispec == 13 || *ispec == 16) { /* ==== Set the number simultaneous shifts ==== */ nh = *ihi - *ilo + 1; ns = 2; if (nh >= 30) { ns = 4; } if (nh >= 60) { ns = 10; } if (nh >= 150) { /* Computing MAX */ r__1 = log((real) nh) / log(2.f); i__1 = 10, i__2 = nh / i_nint(&r__1); ns = max(i__1,i__2); } if (nh >= 590) { ns = 64; } if (nh >= 3000) { ns = 128; } if (nh >= 6000) { ns = 256; } /* Computing MAX */ i__1 = 2, i__2 = ns - ns % 2; ns = max(i__1,i__2); } if (*ispec == 12) { /* ===== Matrices of order smaller than NMIN get sent */ /* . to xLAHQR, the classic double shift algorithm. */ /* . This must be at least 11. ==== */ ret_val = 75; } else if (*ispec == 14) { /* ==== INIBL: skip a multi-shift qr iteration and */ /* . whenever aggressive early deflation finds */ /* . at least (NIBBLE*(window size)/100) deflations. ==== */ ret_val = 14; } else if (*ispec == 15) { /* ==== NSHFTS: The number of simultaneous shifts ===== */ ret_val = ns; } else if (*ispec == 13) { /* ==== NW: deflation window size. ==== */ if (nh <= 500) { ret_val = ns; } else { ret_val = ns * 3 / 2; } } else if (*ispec == 16) { /* ==== IACC22: Whether to accumulate reflections */ /* . before updating the far-from-diagonal elements */ /* . and whether to use 2-by-2 block structure while */ /* . doing it. A small amount of work could be saved */ /* . by making this choice dependent also upon the */ /* . NH=IHI-ILO+1. */ ret_val = 0; if (ns >= 14) { ret_val = 1; } if (ns >= 14) { ret_val = 2; } } else { /* ===== invalid value of ispec ===== */ ret_val = -1; } /* ==== End of IPARMQ ==== */ return ret_val; } /* _starpu_iparmq_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/izmax1.c000066400000000000000000000054151413463044200205640ustar00rootroot00000000000000/* izmax1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" integer _starpu_izmax1_(integer *n, doublecomplex *cx, integer *incx) { /* System generated locals */ integer ret_val, i__1; /* Builtin functions */ double z_abs(doublecomplex *); /* Local variables */ integer i__, ix; doublereal smax; /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* IZMAX1 finds the index of the element whose real part has maximum */ /* absolute value. */ /* Based on IZAMAX from Level 1 BLAS. */ /* The change is to use the 'genuine' absolute value. */ /* Contributed by Nick Higham for use with ZLACON. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of elements in the vector CX. */ /* CX (input) COMPLEX*16 array, dimension (N) */ /* The vector whose elements will be summed. */ /* INCX (input) INTEGER */ /* The spacing between successive values of CX. INCX >= 1. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Statement Functions .. */ /* .. */ /* .. Statement Function definitions .. */ /* NEXT LINE IS THE ONLY MODIFICATION. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --cx; /* Function Body */ ret_val = 0; if (*n < 1) { return ret_val; } ret_val = 1; if (*n == 1) { return ret_val; } if (*incx == 1) { goto L30; } /* CODE FOR INCREMENT NOT EQUAL TO 1 */ ix = 1; smax = z_abs(&cx[1]); ix += *incx; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (z_abs(&cx[ix]) <= smax) { goto L10; } ret_val = i__; smax = z_abs(&cx[ix]); L10: ix += *incx; /* L20: */ } return ret_val; /* CODE FOR INCREMENT EQUAL TO 1 */ L30: smax = z_abs(&cx[1]); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { if (z_abs(&cx[i__]) <= smax) { goto L40; } ret_val = i__; smax = z_abs(&cx[i__]); L40: ; } return ret_val; /* End of IZMAX1 */ } /* _starpu_izmax1_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/lsamen.c000066400000000000000000000047111413463044200206300ustar00rootroot00000000000000/* lsamen.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" #include "string.h" logical _starpu_lsamen_(integer *n, char *ca, char *cb) { /* System generated locals */ integer i__1; logical ret_val; /* Builtin functions */ integer i_len(char *, ftnlen); /* Local variables */ integer i__; extern logical _starpu_lsame_(char *, char *); ftnlen ca_len, cb_len; ca_len = strlen (ca); cb_len = strlen (cb); /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* LSAMEN tests if the first N letters of CA are the same as the */ /* first N letters of CB, regardless of case. */ /* LSAMEN returns .TRUE. if CA and CB are equivalent except for case */ /* and .FALSE. otherwise. LSAMEN also returns .FALSE. if LEN( CA ) */ /* or LEN( CB ) is less than N. */ /* Arguments */ /* ========= */ /* N (input) INTEGER */ /* The number of characters in CA and CB to be compared. */ /* CA (input) CHARACTER*(*) */ /* CB (input) CHARACTER*(*) */ /* CA and CB specify two character strings of length at least N. */ /* Only the first N characters of each string will be accessed. */ /* ===================================================================== */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ ret_val = FALSE_; if (i_len(ca, ca_len) < *n || i_len(cb, cb_len) < *n) { goto L20; } /* Do for each character in the two strings. */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Test if the characters are equal using LSAME. */ if (! _starpu_lsame_(ca + (i__ - 1), cb + (i__ - 1))) { goto L20; } /* L10: */ } ret_val = TRUE_; L20: return ret_val; /* End of LSAMEN */ } /* _starpu_lsamen_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/maxloc.c000066400000000000000000000030761413463044200206370ustar00rootroot00000000000000/* maxloc.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" /* ********************************************************************************** */ integer _starpu_smaxloc_(real *a, integer *dimm) { /* System generated locals */ integer ret_val, i__1; /* Local variables */ integer i__; real smax; /* Parameter adjustments */ --a; /* Function Body */ ret_val = 1; smax = a[1]; i__1 = *dimm; for (i__ = 2; i__ <= i__1; ++i__) { if (smax < a[i__]) { smax = a[i__]; ret_val = i__; } /* L10: */ } return ret_val; } /* _starpu_smaxloc_ */ /* ********************************************************************************** */ integer _starpu_dmaxloc_(doublereal *a, integer *dimm) { /* System generated locals */ integer ret_val, i__1; /* Local variables */ integer i__; doublereal dmax__; /* Parameter adjustments */ --a; /* Function Body */ ret_val = 1; dmax__ = a[1]; i__1 = *dimm; for (i__ = 2; i__ <= i__1; ++i__) { if (dmax__ < a[i__]) { dmax__ = a[i__]; ret_val = i__; } /* L20: */ } return ret_val; } /* _starpu_dmaxloc_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/xerbla.c000066400000000000000000000034261413463044200206300ustar00rootroot00000000000000/* xerbla.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" #include "stdio.h" /* Table of constant values */ static integer c__1 = 1; /* Subroutine */ int _starpu_xerbla_(char *srname, integer *info) { /* -- LAPACK auxiliary routine (version 3.2) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* XERBLA is an error handler for the LAPACK routines. */ /* It is called by an LAPACK routine if an input parameter has an */ /* invalid value. A message is printed and execution stops. */ /* Installers may consider modifying the STOP statement in order to */ /* call system-specific exception-handling facilities. */ /* Arguments */ /* ========= */ /* SRNAME (input) CHARACTER*(*) */ /* The name of the routine which called XERBLA. */ /* INFO (input) INTEGER */ /* The position of the invalid parameter in the parameter list */ /* of the calling routine. */ /* ===================================================================== */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ printf("** On entry to %s, parameter number %ld had an illegal value\n", srname, *info); /* End of XERBLA */ return 0; } /* _starpu_xerbla_ */ starpu-1.3.9+dfsg/min-dgels/base/SRC/xerbla_array.c000066400000000000000000000064361413463044200220320ustar00rootroot00000000000000/* _starpu_xerbla_array.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" #include "blaswrap.h" /* Subroutine */ int _starpu_xerbla_array__(char *srname_array__, integer * srname_len__, integer *info, ftnlen srname_array_len) { /* System generated locals */ integer i__1, i__2, i__3; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer i_len(char *, ftnlen); /* Local variables */ integer i__; extern /* Subroutine */ int _starpu_xerbla_(char *, integer *); char srname[32]; /* -- LAPACK auxiliary routine (version 3.0) -- */ /* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ /* September 19, 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* XERBLA_ARRAY assists other languages in calling XERBLA, the LAPACK */ /* and BLAS error handler. Rather than taking a Fortran string argument */ /* as the function's name, XERBLA_ARRAY takes an array of single */ /* characters along with the array's length. XERBLA_ARRAY then copies */ /* up to 32 characters of that array into a Fortran string and passes */ /* that to XERBLA. If called with a non-positive SRNAME_LEN, */ /* XERBLA_ARRAY will call XERBLA with a string of all blank characters. */ /* Say some macro or other device makes XERBLA_ARRAY available to C99 */ /* by a name lapack_xerbla and with a common Fortran calling convention. */ /* Then a C99 program could invoke XERBLA via: */ /* { */ /* int flen = strlen(__func__); */ /* lapack_xerbla(__func__, &flen, &info); */ /* } */ /* Providing XERBLA_ARRAY is not necessary for intercepting LAPACK */ /* errors. XERBLA_ARRAY calls XERBLA. */ /* Arguments */ /* ========= */ /* SRNAME_ARRAY (input) CHARACTER(1) array, dimension (SRNAME_LEN) */ /* The name of the routine which called XERBLA_ARRAY. */ /* SRNAME_LEN (input) INTEGER */ /* The length of the name in SRNAME_ARRAY. */ /* INFO (input) INTEGER */ /* The position of the invalid parameter in the parameter list */ /* of the calling routine. */ /* ===================================================================== */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --srname_array__; /* Function Body */ s_copy(srname, "", (ftnlen)32, (ftnlen)0); /* Computing MIN */ i__2 = *srname_len__, i__3 = i_len(srname, (ftnlen)32); i__1 = min(i__2,i__3); for (i__ = 1; i__ <= i__1; ++i__) { *(unsigned char *)&srname[i__ - 1] = *(unsigned char *)& srname_array__[i__]; } _starpu_xerbla_(srname, info); return 0; } /* _starpu_xerbla_array__ */ starpu-1.3.9+dfsg/min-dgels/base/make.inc000066400000000000000000000042351413463044200201670ustar00rootroot00000000000000# -*- Makefile -*- #################################################################### # LAPACK make include file. # # LAPACK, Version 3.2.1 # # June 2009 # #################################################################### # # See the INSTALL/ directory for more examples. # SHELL = /bin/sh # # The machine (platform) identifier to append to the library names # PLAT = _LINUX # # Modify the FORTRAN and OPTS definitions to refer to the # compiler and desired compiler options for your machine. NOOPT # refers to the compiler options desired when NO OPTIMIZATION is # selected. Define LOADER and LOADOPTS to refer to the loader # and desired load options for your machine. # ####################################################### # This is used to compile C libary #CC = gcc # if no wrapping of the blas library is needed, uncomment next line #CC = gcc -DNO_BLAS_WRAP CFLAGS = -O3 -I$(TOPDIR)/INCLUDE -fPIC #LOADER = gcc LOADER = $(CC) LOADOPTS = NOOPT = -O0 -I$(TOPDIR)/INCLUDE DRVCFLAGS = $(CFLAGS) F2CCFLAGS = $(CFLAGS) ####################################################################### # # Timer for the SECOND and DSECND routines # # Default : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME # TIMER = EXT_ETIME # For RS6K : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME_ # TIMER = EXT_ETIME_ # For gfortran compiler: SECOND and DSECND will use a call to the INTERNAL FUNCTION ETIME # TIMER = INT_ETIME # If your Fortran compiler does not provide etime (like Nag Fortran Compiler, etc...) # SECOND and DSECND will use a call to the Fortran standard INTERNAL FUNCTION CPU_TIME TIMER = INT_CPU_TIME # If neither of this works...you can use the NONE value... In that case, SECOND and DSECND will always return 0 # TIMER = NONE # # The archiver and the flag(s) to use when building archive (library) # If you system has no ranlib, set RANLIB = echo. # ARCH = ar ARCHFLAGS= cr RANLIB = ranlib BLASLIB=../../../build/minlibblas.a F2CLIB=../../../build/minlibf2c.a starpu-1.3.9+dfsg/mpi/000077500000000000000000000000001413463044200145475ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/GNUmakefile.in000066400000000000000000000032701413463044200172300ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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= @STARPU_BUILD_EXAMPLES_TRUE@SUBDIRS += examples @STARPU_BUILD_TESTS_TRUE@SUBDIRS += tests all: @STARPU_SIMGRID_FALSE@check: check-recursive @STARPU_SIMGRID_FALSE@ : # divide by 4 the number of jobs to run in parallel, since mpirun will start 4 # processes in the tests and examples @STARPU_SIMGRID_FALSE@check-recursive: @STARPU_SIMGRID_FALSE@ RET=0 ; \ @STARPU_SIMGRID_FALSE@ NJOBS=`printf %s "$(MAKEFLAGS)" | sed -ne 's/.*-j \?\([0-9]\+\).*/\1/p'` ; \ @STARPU_SIMGRID_FALSE@ JOBS="" ; \ @STARPU_SIMGRID_FALSE@ if [ -n "$$NJOBS" ] ; then \ @STARPU_SIMGRID_FALSE@ if [ "$$NJOBS" -ge 4 ] ; then \ @STARPU_SIMGRID_FALSE@ JOBS="-j$$(($$NJOBS / 4))" ; \ @STARPU_SIMGRID_FALSE@ else \ @STARPU_SIMGRID_FALSE@ JOBS="-j1" ; \ @STARPU_SIMGRID_FALSE@ fi ; \ @STARPU_SIMGRID_FALSE@ fi ; \ @STARPU_SIMGRID_FALSE@ for i in $(SUBDIRS) ; do \ @STARPU_SIMGRID_FALSE@ $(MAKE) check -C $$i MAKEFLAGS="$(MAKEFLAGS) $$JOBS" || RET=1; \ @STARPU_SIMGRID_FALSE@ done ; \ @STARPU_SIMGRID_FALSE@ exit $$RET %: force @$(MAKE) -f Makefile $@ force: ; starpu-1.3.9+dfsg/mpi/Makefile.am000066400000000000000000000021711413463044200166040ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-subdirtests.mk SUBDIRS=src if STARPU_BUILD_EXAMPLES SUBDIRS += examples endif if STARPU_BUILD_TESTS SUBDIRS += tests endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpumpi.pc starpumpi-1.0.pc starpumpi-1.1.pc starpumpi-1.2.pc starpumpi-1.3.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu_mpi.h \ include/starpu_mpi_lb.h \ include/fstarpu_mpi_mod.f90 starpu-1.3.9+dfsg/mpi/Makefile.in000066400000000000000000000740751413463044200166310ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_BUILD_EXAMPLES_TRUE@am__append_1 = examples @STARPU_BUILD_TESTS_TRUE@am__append_2 = tests subdir = mpi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = libstarpumpi.pc starpumpi-1.0.pc starpumpi-1.1.pc \ starpumpi-1.2.pc starpumpi-1.3.pc GNUmakefile 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 distdir-am 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 examples tests am__DIST_COMMON = $(srcdir)/GNUmakefile.in $(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 \ $(srcdir)/starpumpi-1.3.pc.in \ $(top_srcdir)/starpu-subdirtests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpumpi.pc starpumpi-1.0.pc starpumpi-1.1.pc starpumpi-1.2.pc starpumpi-1.3.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu_mpi.h \ include/starpu_mpi_lb.h \ include/fstarpu_mpi_mod.f90 all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-subdirtests.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/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-subdirtests.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): 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)/$@ starpumpi-1.3.pc: $(top_builddir)/config.status $(srcdir)/starpumpi-1.3.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ GNUmakefile: $(top_builddir)/config.status $(srcdir)/GNUmakefile.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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET showfailed: @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET showsuite: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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.3.9+dfsg/mpi/examples/000077500000000000000000000000001413463044200163655ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/Makefile.am000066400000000000000000000277101413463044200204300ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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) noinst_PROGRAMS = if STARPU_HAVE_WINDOWS LOADER_BIN = else loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ -I$(top_srcdir)/src/ if !STARPU_SIMGRID LOADER = loader LOADER_BIN = $(abs_top_builddir)/mpi/examples/$(LOADER) noinst_PROGRAMS += loader endif loader_SOURCES = ../../tests/loader.c endif if STARPU_SIMGRID MPI = $(abs_top_builddir)/tools/starpu_smpirun -np 4 -platform $(abs_top_srcdir)/tools/perfmodels/cluster.xml -hostfile $(abs_top_srcdir)/tools/perfmodels/hostfile else # 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 endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=3 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(MPI) $(LOADER_BIN) else TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=3 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) endif if STARPU_MPI_CHECK TESTS = $(starpu_mpi_EXAMPLES) 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 if STARPU_COVERITY include $(top_srcdir)/starpu-mynvcc.mk else NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) .cu.cubin: $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) .cu.o: $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) 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@ ../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 # ################### examplebin_PROGRAMS += \ stencil/stencil5 starpu_mpi_EXAMPLES += \ stencil/stencil5 if STARPU_USE_MPI_MPI examplebin_PROGRAMS += \ stencil/stencil5_lb starpu_mpi_EXAMPLES += \ stencil/stencil5_lb endif ################## # Cache examples # ################## examplebin_PROGRAMS += \ cache/cache \ cache/cache_disable starpu_mpi_EXAMPLES += \ cache/cache \ cache/cache_disable ################## # MPI LU example # ################## if !STARPU_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 if !STARPU_SIMGRID starpu_mpi_EXAMPLES += \ mpi_lu/plu_implicit_example_float \ mpi_lu/plu_implicit_example_double \ mpi_lu/plu_outofcore_example_float \ mpi_lu/plu_outofcore_example_double endif 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 ######################## # MPI Cholesky example # ######################## if !STARPU_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 ######################## # MPI Matrix mult example # ######################## examplebin_PROGRAMS += \ matrix_mult/mm matrix_mult_mm_SOURCES = \ matrix_mult/mm.c matrix_mult_mm_LDADD = \ -lm if !STARPU_SIMGRID starpu_mpi_EXAMPLES += \ matrix_mult/mm endif ########################################## # Native Fortran MPI Matrix mult example # ########################################## if STARPU_HAVE_MPIFORT if !STARPU_SANITIZE examplebin_PROGRAMS += \ native_fortran/nf_mm \ native_fortran/nf_mm_task_build \ 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_mm_task_build_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_task_build.f90 native_fortran_nf_mm_task_build_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 if !STARPU_SIMGRID starpu_mpi_EXAMPLES += \ native_fortran/nf_mm \ native_fortran/nf_mm_task_build \ native_fortran/nf_basic_ring endif endif endif ################### # complex example # ################### examplebin_PROGRAMS += \ complex/mpi_complex complex_mpi_complex_SOURCES = \ complex/mpi_complex.c \ ../../examples/interface/complex_interface.c starpu_mpi_EXAMPLES += \ complex/mpi_complex ######################### # user_datatype example # ######################### examplebin_PROGRAMS += \ user_datatype/user_datatype \ user_datatype/user_datatype2 \ user_datatype/user_datatype_early user_datatype_user_datatype_SOURCES = \ user_datatype/user_datatype.c \ user_datatype/my_interface.c user_datatype_user_datatype2_SOURCES = \ user_datatype/user_datatype2.c \ user_datatype/my_interface.c user_datatype_user_datatype_early_SOURCES = \ user_datatype/user_datatype_early.c \ user_datatype/my_interface.c if !STARPU_SIMGRID starpu_mpi_EXAMPLES += \ user_datatype/user_datatype2 \ user_datatype/user_datatype_early \ user_datatype/user_datatype endif ################### # comm example # ################### examplebin_PROGRAMS += \ comm/comm \ comm/mix_comm if !STARPU_SIMGRID starpu_mpi_EXAMPLES += \ comm/comm \ comm/mix_comm endif ################## # filter example # ################## examplebin_PROGRAMS += \ filters/filter if !STARPU_SIMGRID starpu_mpi_EXAMPLES += \ filters/filter endif if STARPU_HAVE_MPIFORT 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_mm_task_build.o: $(top_srcdir)/mpi/examples/native_fortran/nf_mm_task_build.f90 nf_mm_cl.mod fstarpu_mpi_mod.mod fstarpu_mod.mod $(AM_V_FC)$(FC) $(native_fortran_nf_mm__task_build_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_mm_task_build.f90' || echo '$(srcdir)/'`native_fortran/nf_mm_task_build.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 starpu-1.3.9+dfsg/mpi/examples/Makefile.in000066400000000000000000005366671413463044200204610ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(am__EXEEXT_1) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_FALSE@am__append_1 = loader @STARPU_MPI_CHECK_TRUE@TESTS = $(am__EXEEXT_8) check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_8) examplebin_PROGRAMS = stencil/stencil5$(EXEEXT) $(am__EXEEXT_2) \ cache/cache$(EXEEXT) cache/cache_disable$(EXEEXT) \ $(am__EXEEXT_9) matrix_mult/mm$(EXEEXT) $(am__EXEEXT_10) \ complex/mpi_complex$(EXEEXT) \ user_datatype/user_datatype$(EXEEXT) \ user_datatype/user_datatype2$(EXEEXT) \ user_datatype/user_datatype_early$(EXEEXT) comm/comm$(EXEEXT) \ comm/mix_comm$(EXEEXT) filters/filter$(EXEEXT) @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_2 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) @STARPU_USE_MPI_MPI_TRUE@am__append_3 = \ @STARPU_USE_MPI_MPI_TRUE@ stencil/stencil5_lb @STARPU_USE_MPI_MPI_TRUE@am__append_4 = \ @STARPU_USE_MPI_MPI_TRUE@ stencil/stencil5_lb ################## # MPI LU example # ################## ######################## # MPI Cholesky example # ######################## @STARPU_NO_BLAS_LIB_FALSE@am__append_5 = mpi_lu/plu_example_float \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_double \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_float \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_double \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_float \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_double \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__append_6 = \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_implicit_example_float \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_implicit_example_double \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_outofcore_example_float \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_outofcore_example_double @STARPU_NO_BLAS_LIB_FALSE@am__append_7 = \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed @STARPU_SIMGRID_FALSE@am__append_8 = \ @STARPU_SIMGRID_FALSE@ matrix_mult/mm ########################################## # Native Fortran MPI Matrix mult example # ########################################## @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am__append_9 = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm_task_build \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__append_10 = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_mm \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_mm_task_build \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_basic_ring @STARPU_SIMGRID_FALSE@am__append_11 = user_datatype/user_datatype2 \ @STARPU_SIMGRID_FALSE@ user_datatype/user_datatype_early \ @STARPU_SIMGRID_FALSE@ user_datatype/user_datatype comm/comm \ @STARPU_SIMGRID_FALSE@ comm/mix_comm filters/filter subdir = mpi/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_USE_MPI_MPI_TRUE@am__EXEEXT_2 = stencil/stencil5_lb$(EXEEXT) @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_3 = mpi_lu/plu_implicit_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_implicit_example_double$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_outofcore_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@@STARPU_SIMGRID_FALSE@ mpi_lu/plu_outofcore_example_double$(EXEEXT) @STARPU_NO_BLAS_LIB_FALSE@am__EXEEXT_4 = matrix_decomposition/mpi_cholesky$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_5 = matrix_mult/mm$(EXEEXT) @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_6 = native_fortran/nf_mm$(EXEEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_mm_task_build$(EXEEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@ native_fortran/nf_basic_ring$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_7 = \ @STARPU_SIMGRID_FALSE@ user_datatype/user_datatype2$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ user_datatype/user_datatype_early$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ user_datatype/user_datatype$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ comm/comm$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ comm/mix_comm$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ filters/filter$(EXEEXT) am__EXEEXT_8 = stencil/stencil5$(EXEEXT) $(am__EXEEXT_2) \ cache/cache$(EXEEXT) cache/cache_disable$(EXEEXT) \ $(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5) \ $(am__EXEEXT_6) complex/mpi_complex$(EXEEXT) $(am__EXEEXT_7) @STARPU_NO_BLAS_LIB_FALSE@am__EXEEXT_9 = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_double$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_double$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_float$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_double$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky$(EXEEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed$(EXEEXT) @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am__EXEEXT_10 = native_fortran/nf_mm$(EXEEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm_task_build$(EXEEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) $(noinst_PROGRAMS) cache_cache_SOURCES = cache/cache.c cache_cache_OBJECTS = cache.$(OBJEXT) cache_cache_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 cache_cache_disable_SOURCES = cache/cache_disable.c cache_cache_disable_OBJECTS = cache_disable.$(OBJEXT) cache_cache_disable_LDADD = $(LDADD) comm_comm_SOURCES = comm/comm.c comm_comm_OBJECTS = comm.$(OBJEXT) comm_comm_LDADD = $(LDADD) comm_mix_comm_SOURCES = comm/mix_comm.c comm_mix_comm_OBJECTS = mix_comm.$(OBJEXT) comm_mix_comm_LDADD = $(LDADD) am_complex_mpi_complex_OBJECTS = mpi_complex.$(OBJEXT) \ complex_interface.$(OBJEXT) complex_mpi_complex_OBJECTS = $(am_complex_mpi_complex_OBJECTS) complex_mpi_complex_LDADD = $(LDADD) filters_filter_SOURCES = filters/filter.c filters_filter_OBJECTS = filter.$(OBJEXT) filters_filter_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 @STARPU_NO_BLAS_LIB_FALSE@am_matrix_decomposition_mpi_cholesky_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_codelets.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_decomposition_params.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_decomposition_matrix.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) matrix_decomposition_mpi_cholesky_OBJECTS = \ $(am_matrix_decomposition_mpi_cholesky_OBJECTS) am__DEPENDENCIES_1 = @STARPU_NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_DEPENDENCIES = \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_matrix_decomposition_mpi_cholesky_distributed_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_distributed.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_cholesky_codelets.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_decomposition_params.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_decomposition_matrix.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) matrix_decomposition_mpi_cholesky_distributed_OBJECTS = \ $(am_matrix_decomposition_mpi_cholesky_distributed_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_distributed_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) am_matrix_mult_mm_OBJECTS = mm.$(OBJEXT) matrix_mult_mm_OBJECTS = $(am_matrix_mult_mm_OBJECTS) matrix_mult_mm_DEPENDENCIES = 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 @STARPU_NO_BLAS_LIB_FALSE@am_mpi_lu_plu_example_double_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ plu_example_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ plu_solve_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pdlu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pdlu.$(OBJEXT) blas.$(OBJEXT) mpi_lu_plu_example_double_OBJECTS = \ $(am_mpi_lu_plu_example_double_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_example_double_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_mpi_lu_plu_example_float_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ plu_example_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ plu_solve_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pslu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pslu.$(OBJEXT) blas.$(OBJEXT) mpi_lu_plu_example_float_OBJECTS = \ $(am_mpi_lu_plu_example_float_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_example_float_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_mpi_lu_plu_implicit_example_double_OBJECTS = plu_implicit_example_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ plu_solve_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pdlu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pdlu_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_implicit_example_double_OBJECTS = \ $(am_mpi_lu_plu_implicit_example_double_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_double_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_mpi_lu_plu_implicit_example_float_OBJECTS = plu_implicit_example_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ plu_solve_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pslu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pslu_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_implicit_example_float_OBJECTS = \ $(am_mpi_lu_plu_implicit_example_float_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_float_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_mpi_lu_plu_outofcore_example_double_OBJECTS = plu_outofcore_example_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ plu_solve_double.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pdlu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pdlu_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_outofcore_example_double_OBJECTS = \ $(am_mpi_lu_plu_outofcore_example_double_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_double_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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 @STARPU_NO_BLAS_LIB_FALSE@am_mpi_lu_plu_outofcore_example_float_OBJECTS = plu_outofcore_example_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ plu_solve_float.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pslu_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ pslu_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) mpi_lu_plu_outofcore_example_float_OBJECTS = \ $(am_mpi_lu_plu_outofcore_example_float_OBJECTS) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_float_DEPENDENCIES = \ @STARPU_NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) \ @STARPU_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 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am_native_fortran_nf_basic_ring_OBJECTS = fstarpu_mpi_mod.$(OBJEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mod.$(OBJEXT) \ @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 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am_native_fortran_nf_mm_OBJECTS = nf_mm_cl.$(OBJEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mpi_mod.$(OBJEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mod.$(OBJEXT) \ @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 = am__native_fortran_nf_mm_task_build_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_task_build.f90 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@am_native_fortran_nf_mm_task_build_OBJECTS = nf_mm_cl.$(OBJEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mpi_mod.$(OBJEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ fstarpu_mod.$(OBJEXT) \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ nf_mm_task_build.$(OBJEXT) native_fortran_nf_mm_task_build_OBJECTS = \ $(am_native_fortran_nf_mm_task_build_OBJECTS) native_fortran_nf_mm_task_build_DEPENDENCIES = stencil_stencil5_SOURCES = stencil/stencil5.c stencil_stencil5_OBJECTS = stencil5.$(OBJEXT) stencil_stencil5_LDADD = $(LDADD) stencil_stencil5_lb_SOURCES = stencil/stencil5_lb.c stencil_stencil5_lb_OBJECTS = stencil5_lb.$(OBJEXT) stencil_stencil5_lb_LDADD = $(LDADD) am_user_datatype_user_datatype_OBJECTS = user_datatype.$(OBJEXT) \ my_interface.$(OBJEXT) user_datatype_user_datatype_OBJECTS = \ $(am_user_datatype_user_datatype_OBJECTS) user_datatype_user_datatype_LDADD = $(LDADD) am_user_datatype_user_datatype2_OBJECTS = user_datatype2.$(OBJEXT) \ my_interface.$(OBJEXT) user_datatype_user_datatype2_OBJECTS = \ $(am_user_datatype_user_datatype2_OBJECTS) user_datatype_user_datatype2_LDADD = $(LDADD) am_user_datatype_user_datatype_early_OBJECTS = \ user_datatype_early.$(OBJEXT) my_interface.$(OBJEXT) user_datatype_user_datatype_early_OBJECTS = \ $(am_user_datatype_user_datatype_early_OBJECTS) user_datatype_user_datatype_early_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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/blas.Po ./$(DEPDIR)/cache.Po \ ./$(DEPDIR)/cache_disable.Po ./$(DEPDIR)/comm.Po \ ./$(DEPDIR)/complex_interface.Po ./$(DEPDIR)/filter.Po \ ./$(DEPDIR)/loader-loader.Po ./$(DEPDIR)/mix_comm.Po \ ./$(DEPDIR)/mm.Po ./$(DEPDIR)/mpi_cholesky.Po \ ./$(DEPDIR)/mpi_cholesky_codelets.Po \ ./$(DEPDIR)/mpi_cholesky_distributed.Po \ ./$(DEPDIR)/mpi_cholesky_kernels.Po \ ./$(DEPDIR)/mpi_cholesky_models.Po ./$(DEPDIR)/mpi_complex.Po \ ./$(DEPDIR)/mpi_decomposition_matrix.Po \ ./$(DEPDIR)/mpi_decomposition_params.Po \ ./$(DEPDIR)/my_interface.Po ./$(DEPDIR)/pdlu.Po \ ./$(DEPDIR)/pdlu_implicit.Po ./$(DEPDIR)/pdlu_kernels.Po \ ./$(DEPDIR)/plu_example_double.Po \ ./$(DEPDIR)/plu_example_float.Po \ ./$(DEPDIR)/plu_implicit_example_double.Po \ ./$(DEPDIR)/plu_implicit_example_float.Po \ ./$(DEPDIR)/plu_outofcore_example_double.Po \ ./$(DEPDIR)/plu_outofcore_example_float.Po \ ./$(DEPDIR)/plu_solve_double.Po ./$(DEPDIR)/plu_solve_float.Po \ ./$(DEPDIR)/pslu.Po ./$(DEPDIR)/pslu_implicit.Po \ ./$(DEPDIR)/pslu_kernels.Po ./$(DEPDIR)/stencil5.Po \ ./$(DEPDIR)/stencil5_lb.Po ./$(DEPDIR)/user_datatype.Po \ ./$(DEPDIR)/user_datatype2.Po \ ./$(DEPDIR)/user_datatype_early.Po 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 = cache/cache.c cache/cache_disable.c comm/comm.c \ comm/mix_comm.c $(complex_mpi_complex_SOURCES) \ filters/filter.c $(loader_SOURCES) \ $(matrix_decomposition_mpi_cholesky_SOURCES) \ $(matrix_decomposition_mpi_cholesky_distributed_SOURCES) \ $(matrix_mult_mm_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) \ $(native_fortran_nf_mm_task_build_SOURCES) stencil/stencil5.c \ stencil/stencil5_lb.c $(user_datatype_user_datatype_SOURCES) \ $(user_datatype_user_datatype2_SOURCES) \ $(user_datatype_user_datatype_early_SOURCES) DIST_SOURCES = cache/cache.c cache/cache_disable.c comm/comm.c \ comm/mix_comm.c $(complex_mpi_complex_SOURCES) \ filters/filter.c $(am__loader_SOURCES_DIST) \ $(am__matrix_decomposition_mpi_cholesky_SOURCES_DIST) \ $(am__matrix_decomposition_mpi_cholesky_distributed_SOURCES_DIST) \ $(matrix_mult_mm_SOURCES) \ $(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) \ $(am__native_fortran_nf_mm_task_build_SOURCES_DIST) \ stencil/stencil5.c stencil/stencil5_lb.c \ $(user_datatype_user_datatype_SOURCES) \ $(user_datatype_user_datatype2_SOURCES) \ $(user_datatype_user_datatype_early_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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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-mynvcc.mk $(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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_LIBS@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) 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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_2) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 CCLD = $(MPICC) FCLD = $(MPIFORT) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_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/ -I$(top_srcdir)/src/ @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_QUICK_CHECK_FALSE@@STARPU_SIMGRID_FALSE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 # we always test on 4 processes, the execution time is not that bigger @STARPU_QUICK_CHECK_TRUE@@STARPU_SIMGRID_FALSE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_SIMGRID_TRUE@MPI = $(abs_top_builddir)/tools/starpu_smpirun -np 4 -platform $(abs_top_srcdir)/tools/perfmodels/cluster.xml -hostfile $(abs_top_srcdir)/tools/perfmodels/hostfile @STARPU_HAVE_AM111_FALSE@TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=3 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=3 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@LOG_COMPILER = $(MPI) $(LOADER_BIN) starpu_mpi_EXAMPLES = stencil/stencil5 $(am__append_4) cache/cache \ cache/cache_disable $(am__append_6) $(am__append_7) \ $(am__append_8) $(am__append_10) complex/mpi_complex \ $(am__append_11) 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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_0 = @echo " myNVCC " $@; @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_1 = @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc = $(V_mynvcc_$(V)) 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) @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_example_float_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_example_float_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pslu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pslu.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_example_double_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_example_double_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_example_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pdlu.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_float_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_float_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pslu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pslu_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_double_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_implicit_example_double_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_implicit_example_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_float_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_float_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_float.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pslu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pslu_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_double_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_LIBNUMA_LDFLAGS) \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@mpi_lu_plu_outofcore_example_double_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_outofcore_example_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/plu_solve_double.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ mpi_lu/pdlu_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_codelets.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_params.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_matrix.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm @STARPU_NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_distributed_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_distributed.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_cholesky_codelets.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_params.c \ @STARPU_NO_BLAS_LIB_FALSE@ matrix_decomposition/mpi_decomposition_matrix.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@matrix_decomposition_mpi_cholesky_distributed_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) -lm matrix_mult_mm_SOURCES = \ matrix_mult/mm.c matrix_mult_mm_LDADD = \ -lm @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_mm_SOURCES = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm_cl.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm.f90 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_mm_LDADD = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ -lm @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_mm_task_build_SOURCES = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm_cl.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_mm_task_build.f90 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_mm_task_build_LDADD = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ -lm @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_basic_ring_SOURCES = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(top_srcdir)/include/fstarpu_mod.f90 \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ native_fortran/nf_basic_ring.f90 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@native_fortran_nf_basic_ring_LDADD = \ @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ -lm complex_mpi_complex_SOURCES = \ complex/mpi_complex.c \ ../../examples/interface/complex_interface.c user_datatype_user_datatype_SOURCES = \ user_datatype/user_datatype.c \ user_datatype/my_interface.c user_datatype_user_datatype2_SOURCES = \ user_datatype/user_datatype2.c \ user_datatype/my_interface.c user_datatype_user_datatype_early_SOURCES = \ user_datatype/user_datatype_early.c \ 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 $(top_srcdir)/starpu-mynvcc.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu.mk $(top_srcdir)/starpu-mynvcc.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 cache/$(am__dirstamp): @$(MKDIR_P) cache @: > cache/$(am__dirstamp) cache/cache$(EXEEXT): $(cache_cache_OBJECTS) $(cache_cache_DEPENDENCIES) $(EXTRA_cache_cache_DEPENDENCIES) cache/$(am__dirstamp) @rm -f cache/cache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cache_cache_OBJECTS) $(cache_cache_LDADD) $(LIBS) cache/cache_disable$(EXEEXT): $(cache_cache_disable_OBJECTS) $(cache_cache_disable_DEPENDENCIES) $(EXTRA_cache_cache_disable_DEPENDENCIES) cache/$(am__dirstamp) @rm -f cache/cache_disable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cache_cache_disable_OBJECTS) $(cache_cache_disable_LDADD) $(LIBS) 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) filters/$(am__dirstamp): @$(MKDIR_P) filters @: > filters/$(am__dirstamp) filters/filter$(EXEEXT): $(filters_filter_OBJECTS) $(filters_filter_DEPENDENCIES) $(EXTRA_filters_filter_DEPENDENCIES) filters/$(am__dirstamp) @rm -f filters/filter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(filters_filter_OBJECTS) $(filters_filter_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) matrix_mult/$(am__dirstamp): @$(MKDIR_P) matrix_mult @: > matrix_mult/$(am__dirstamp) matrix_mult/mm$(EXEEXT): $(matrix_mult_mm_OBJECTS) $(matrix_mult_mm_DEPENDENCIES) $(EXTRA_matrix_mult_mm_DEPENDENCIES) matrix_mult/$(am__dirstamp) @rm -f matrix_mult/mm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(matrix_mult_mm_OBJECTS) $(matrix_mult_mm_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) native_fortran/nf_mm_task_build$(EXEEXT): $(native_fortran_nf_mm_task_build_OBJECTS) $(native_fortran_nf_mm_task_build_DEPENDENCIES) $(EXTRA_native_fortran_nf_mm_task_build_DEPENDENCIES) native_fortran/$(am__dirstamp) @rm -f native_fortran/nf_mm_task_build$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(native_fortran_nf_mm_task_build_OBJECTS) $(native_fortran_nf_mm_task_build_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) stencil/stencil5_lb$(EXEEXT): $(stencil_stencil5_lb_OBJECTS) $(stencil_stencil5_lb_DEPENDENCIES) $(EXTRA_stencil_stencil5_lb_DEPENDENCIES) stencil/$(am__dirstamp) @rm -f stencil/stencil5_lb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(stencil_stencil5_lb_OBJECTS) $(stencil_stencil5_lb_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) user_datatype/user_datatype2$(EXEEXT): $(user_datatype_user_datatype2_OBJECTS) $(user_datatype_user_datatype2_DEPENDENCIES) $(EXTRA_user_datatype_user_datatype2_DEPENDENCIES) user_datatype/$(am__dirstamp) @rm -f user_datatype/user_datatype2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(user_datatype_user_datatype2_OBJECTS) $(user_datatype_user_datatype2_LDADD) $(LIBS) user_datatype/user_datatype_early$(EXEEXT): $(user_datatype_user_datatype_early_OBJECTS) $(user_datatype_user_datatype_early_DEPENDENCIES) $(EXTRA_user_datatype_user_datatype_early_DEPENDENCIES) user_datatype/$(am__dirstamp) @rm -f user_datatype/user_datatype_early$(EXEEXT) $(AM_V_CCLD)$(LINK) $(user_datatype_user_datatype_early_OBJECTS) $(user_datatype_user_datatype_early_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_disable.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_comm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_codelets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_distributed.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_cholesky_models.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_complex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_decomposition_matrix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_decomposition_params.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/my_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdlu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdlu_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdlu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_example_double.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_example_float.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_implicit_example_double.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_implicit_example_float.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_outofcore_example_double.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_outofcore_example_float.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_solve_double.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plu_solve_float.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pslu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pslu_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pslu_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stencil5_lb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_datatype.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_datatype2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_datatype_early.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 $@ $< cache.o: cache/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 'cache/cache.c' || echo '$(srcdir)/'`cache/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='cache/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 'cache/cache.c' || echo '$(srcdir)/'`cache/cache.c cache.obj: cache/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 'cache/cache.c'; then $(CYGPATH_W) 'cache/cache.c'; else $(CYGPATH_W) '$(srcdir)/cache/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='cache/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 'cache/cache.c'; then $(CYGPATH_W) 'cache/cache.c'; else $(CYGPATH_W) '$(srcdir)/cache/cache.c'; fi` cache_disable.o: cache/cache_disable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cache_disable.o -MD -MP -MF $(DEPDIR)/cache_disable.Tpo -c -o cache_disable.o `test -f 'cache/cache_disable.c' || echo '$(srcdir)/'`cache/cache_disable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cache_disable.Tpo $(DEPDIR)/cache_disable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cache/cache_disable.c' object='cache_disable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_disable.o `test -f 'cache/cache_disable.c' || echo '$(srcdir)/'`cache/cache_disable.c cache_disable.obj: cache/cache_disable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cache_disable.obj -MD -MP -MF $(DEPDIR)/cache_disable.Tpo -c -o cache_disable.obj `if test -f 'cache/cache_disable.c'; then $(CYGPATH_W) 'cache/cache_disable.c'; else $(CYGPATH_W) '$(srcdir)/cache/cache_disable.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cache_disable.Tpo $(DEPDIR)/cache_disable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cache/cache_disable.c' object='cache_disable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_disable.obj `if test -f 'cache/cache_disable.c'; then $(CYGPATH_W) 'cache/cache_disable.c'; else $(CYGPATH_W) '$(srcdir)/cache/cache_disable.c'; fi` 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` filter.o: filters/filter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filter.o -MD -MP -MF $(DEPDIR)/filter.Tpo -c -o filter.o `test -f 'filters/filter.c' || echo '$(srcdir)/'`filters/filter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/filter.Tpo $(DEPDIR)/filter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/filter.c' object='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 filter.o `test -f 'filters/filter.c' || echo '$(srcdir)/'`filters/filter.c filter.obj: filters/filter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filter.obj -MD -MP -MF $(DEPDIR)/filter.Tpo -c -o filter.obj `if test -f 'filters/filter.c'; then $(CYGPATH_W) 'filters/filter.c'; else $(CYGPATH_W) '$(srcdir)/filters/filter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/filter.Tpo $(DEPDIR)/filter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters/filter.c' object='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 filter.obj `if test -f 'filters/filter.c'; then $(CYGPATH_W) 'filters/filter.c'; else $(CYGPATH_W) '$(srcdir)/filters/filter.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` mm.o: matrix_mult/mm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mm.o -MD -MP -MF $(DEPDIR)/mm.Tpo -c -o mm.o `test -f 'matrix_mult/mm.c' || echo '$(srcdir)/'`matrix_mult/mm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mm.Tpo $(DEPDIR)/mm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_mult/mm.c' object='mm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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.o `test -f 'matrix_mult/mm.c' || echo '$(srcdir)/'`matrix_mult/mm.c mm.obj: matrix_mult/mm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mm.obj -MD -MP -MF $(DEPDIR)/mm.Tpo -c -o mm.obj `if test -f 'matrix_mult/mm.c'; then $(CYGPATH_W) 'matrix_mult/mm.c'; else $(CYGPATH_W) '$(srcdir)/matrix_mult/mm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mm.Tpo $(DEPDIR)/mm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matrix_mult/mm.c' object='mm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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.obj `if test -f 'matrix_mult/mm.c'; then $(CYGPATH_W) 'matrix_mult/mm.c'; else $(CYGPATH_W) '$(srcdir)/matrix_mult/mm.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` stencil5_lb.o: stencil/stencil5_lb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stencil5_lb.o -MD -MP -MF $(DEPDIR)/stencil5_lb.Tpo -c -o stencil5_lb.o `test -f 'stencil/stencil5_lb.c' || echo '$(srcdir)/'`stencil/stencil5_lb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stencil5_lb.Tpo $(DEPDIR)/stencil5_lb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stencil/stencil5_lb.c' object='stencil5_lb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_lb.o `test -f 'stencil/stencil5_lb.c' || echo '$(srcdir)/'`stencil/stencil5_lb.c stencil5_lb.obj: stencil/stencil5_lb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stencil5_lb.obj -MD -MP -MF $(DEPDIR)/stencil5_lb.Tpo -c -o stencil5_lb.obj `if test -f 'stencil/stencil5_lb.c'; then $(CYGPATH_W) 'stencil/stencil5_lb.c'; else $(CYGPATH_W) '$(srcdir)/stencil/stencil5_lb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stencil5_lb.Tpo $(DEPDIR)/stencil5_lb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stencil/stencil5_lb.c' object='stencil5_lb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_lb.obj `if test -f 'stencil/stencil5_lb.c'; then $(CYGPATH_W) 'stencil/stencil5_lb.c'; else $(CYGPATH_W) '$(srcdir)/stencil/stencil5_lb.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` user_datatype2.o: user_datatype/user_datatype2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_datatype2.o -MD -MP -MF $(DEPDIR)/user_datatype2.Tpo -c -o user_datatype2.o `test -f 'user_datatype/user_datatype2.c' || echo '$(srcdir)/'`user_datatype/user_datatype2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_datatype2.Tpo $(DEPDIR)/user_datatype2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/user_datatype2.c' object='user_datatype2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_datatype2.o `test -f 'user_datatype/user_datatype2.c' || echo '$(srcdir)/'`user_datatype/user_datatype2.c user_datatype2.obj: user_datatype/user_datatype2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_datatype2.obj -MD -MP -MF $(DEPDIR)/user_datatype2.Tpo -c -o user_datatype2.obj `if test -f 'user_datatype/user_datatype2.c'; then $(CYGPATH_W) 'user_datatype/user_datatype2.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/user_datatype2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_datatype2.Tpo $(DEPDIR)/user_datatype2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/user_datatype2.c' object='user_datatype2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_datatype2.obj `if test -f 'user_datatype/user_datatype2.c'; then $(CYGPATH_W) 'user_datatype/user_datatype2.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/user_datatype2.c'; fi` user_datatype_early.o: user_datatype/user_datatype_early.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_datatype_early.o -MD -MP -MF $(DEPDIR)/user_datatype_early.Tpo -c -o user_datatype_early.o `test -f 'user_datatype/user_datatype_early.c' || echo '$(srcdir)/'`user_datatype/user_datatype_early.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_datatype_early.Tpo $(DEPDIR)/user_datatype_early.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/user_datatype_early.c' object='user_datatype_early.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_early.o `test -f 'user_datatype/user_datatype_early.c' || echo '$(srcdir)/'`user_datatype/user_datatype_early.c user_datatype_early.obj: user_datatype/user_datatype_early.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT user_datatype_early.obj -MD -MP -MF $(DEPDIR)/user_datatype_early.Tpo -c -o user_datatype_early.obj `if test -f 'user_datatype/user_datatype_early.c'; then $(CYGPATH_W) 'user_datatype/user_datatype_early.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/user_datatype_early.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/user_datatype_early.Tpo $(DEPDIR)/user_datatype_early.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user_datatype/user_datatype_early.c' object='user_datatype_early.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_early.obj `if test -f 'user_datatype/user_datatype_early.c'; then $(CYGPATH_W) 'user_datatype/user_datatype_early.c'; else $(CYGPATH_W) '$(srcdir)/user_datatype/user_datatype_early.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 $@ $< @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` @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` @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` @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` @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` @STARPU_HAVE_MPIFORT_FALSE@nf_mm_task_build.o: native_fortran/nf_mm_task_build.f90 @STARPU_SANITIZE_TRUE@nf_mm_task_build.o: native_fortran/nf_mm_task_build.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_mm_task_build.o `test -f 'native_fortran/nf_mm_task_build.f90' || echo '$(srcdir)/'`native_fortran/nf_mm_task_build.f90 nf_mm_task_build.obj: native_fortran/nf_mm_task_build.f90 $(AM_V_FC)$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c -o nf_mm_task_build.obj `if test -f 'native_fortran/nf_mm_task_build.f90'; then $(CYGPATH_W) 'native_fortran/nf_mm_task_build.f90'; else $(CYGPATH_W) '$(srcdir)/native_fortran/nf_mm_task_build.f90'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf cache/.libs cache/_libs -rm -rf comm/.libs comm/_libs -rm -rf complex/.libs complex/_libs -rm -rf filters/.libs filters/_libs -rm -rf matrix_decomposition/.libs matrix_decomposition/_libs -rm -rf matrix_mult/.libs matrix_mult/_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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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) stencil/stencil5_lb.log: stencil/stencil5_lb$(EXEEXT) @p='stencil/stencil5_lb$(EXEEXT)'; \ b='stencil/stencil5_lb'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/cache.log: cache/cache$(EXEEXT) @p='cache/cache$(EXEEXT)'; \ b='cache/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/cache_disable.log: cache/cache_disable$(EXEEXT) @p='cache/cache_disable$(EXEEXT)'; \ b='cache/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) mpi_lu/plu_implicit_example_float.log: mpi_lu/plu_implicit_example_float$(EXEEXT) @p='mpi_lu/plu_implicit_example_float$(EXEEXT)'; \ b='mpi_lu/plu_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) mpi_lu/plu_implicit_example_double.log: mpi_lu/plu_implicit_example_double$(EXEEXT) @p='mpi_lu/plu_implicit_example_double$(EXEEXT)'; \ b='mpi_lu/plu_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) mpi_lu/plu_outofcore_example_float.log: mpi_lu/plu_outofcore_example_float$(EXEEXT) @p='mpi_lu/plu_outofcore_example_float$(EXEEXT)'; \ b='mpi_lu/plu_outofcore_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) mpi_lu/plu_outofcore_example_double.log: mpi_lu/plu_outofcore_example_double$(EXEEXT) @p='mpi_lu/plu_outofcore_example_double$(EXEEXT)'; \ b='mpi_lu/plu_outofcore_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) 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) matrix_mult/mm.log: matrix_mult/mm$(EXEEXT) @p='matrix_mult/mm$(EXEEXT)'; \ b='matrix_mult/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_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_mm_task_build.log: native_fortran/nf_mm_task_build$(EXEEXT) @p='native_fortran/nf_mm_task_build$(EXEEXT)'; \ b='native_fortran/nf_mm_task_build'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_datatype2.log: user_datatype/user_datatype2$(EXEEXT) @p='user_datatype/user_datatype2$(EXEEXT)'; \ b='user_datatype/user_datatype2'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_early.log: user_datatype/user_datatype_early$(EXEEXT) @p='user_datatype/user_datatype_early$(EXEEXT)'; \ b='user_datatype/user_datatype_early'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) filters/filter.log: filters/filter$(EXEEXT) @p='filters/filter$(EXEEXT)'; \ b='filters/filter'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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 cache/$(am__dirstamp) -rm -f comm/$(am__dirstamp) -rm -f complex/$(am__dirstamp) -rm -f filters/$(am__dirstamp) -rm -f matrix_decomposition/$(am__dirstamp) -rm -f matrix_mult/$(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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/blas.Po -rm -f ./$(DEPDIR)/cache.Po -rm -f ./$(DEPDIR)/cache_disable.Po -rm -f ./$(DEPDIR)/comm.Po -rm -f ./$(DEPDIR)/complex_interface.Po -rm -f ./$(DEPDIR)/filter.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/mix_comm.Po -rm -f ./$(DEPDIR)/mm.Po -rm -f ./$(DEPDIR)/mpi_cholesky.Po -rm -f ./$(DEPDIR)/mpi_cholesky_codelets.Po -rm -f ./$(DEPDIR)/mpi_cholesky_distributed.Po -rm -f ./$(DEPDIR)/mpi_cholesky_kernels.Po -rm -f ./$(DEPDIR)/mpi_cholesky_models.Po -rm -f ./$(DEPDIR)/mpi_complex.Po -rm -f ./$(DEPDIR)/mpi_decomposition_matrix.Po -rm -f ./$(DEPDIR)/mpi_decomposition_params.Po -rm -f ./$(DEPDIR)/my_interface.Po -rm -f ./$(DEPDIR)/pdlu.Po -rm -f ./$(DEPDIR)/pdlu_implicit.Po -rm -f ./$(DEPDIR)/pdlu_kernels.Po -rm -f ./$(DEPDIR)/plu_example_double.Po -rm -f ./$(DEPDIR)/plu_example_float.Po -rm -f ./$(DEPDIR)/plu_implicit_example_double.Po -rm -f ./$(DEPDIR)/plu_implicit_example_float.Po -rm -f ./$(DEPDIR)/plu_outofcore_example_double.Po -rm -f ./$(DEPDIR)/plu_outofcore_example_float.Po -rm -f ./$(DEPDIR)/plu_solve_double.Po -rm -f ./$(DEPDIR)/plu_solve_float.Po -rm -f ./$(DEPDIR)/pslu.Po -rm -f ./$(DEPDIR)/pslu_implicit.Po -rm -f ./$(DEPDIR)/pslu_kernels.Po -rm -f ./$(DEPDIR)/stencil5.Po -rm -f ./$(DEPDIR)/stencil5_lb.Po -rm -f ./$(DEPDIR)/user_datatype.Po -rm -f ./$(DEPDIR)/user_datatype2.Po -rm -f ./$(DEPDIR)/user_datatype_early.Po -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 -f ./$(DEPDIR)/blas.Po -rm -f ./$(DEPDIR)/cache.Po -rm -f ./$(DEPDIR)/cache_disable.Po -rm -f ./$(DEPDIR)/comm.Po -rm -f ./$(DEPDIR)/complex_interface.Po -rm -f ./$(DEPDIR)/filter.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/mix_comm.Po -rm -f ./$(DEPDIR)/mm.Po -rm -f ./$(DEPDIR)/mpi_cholesky.Po -rm -f ./$(DEPDIR)/mpi_cholesky_codelets.Po -rm -f ./$(DEPDIR)/mpi_cholesky_distributed.Po -rm -f ./$(DEPDIR)/mpi_cholesky_kernels.Po -rm -f ./$(DEPDIR)/mpi_cholesky_models.Po -rm -f ./$(DEPDIR)/mpi_complex.Po -rm -f ./$(DEPDIR)/mpi_decomposition_matrix.Po -rm -f ./$(DEPDIR)/mpi_decomposition_params.Po -rm -f ./$(DEPDIR)/my_interface.Po -rm -f ./$(DEPDIR)/pdlu.Po -rm -f ./$(DEPDIR)/pdlu_implicit.Po -rm -f ./$(DEPDIR)/pdlu_kernels.Po -rm -f ./$(DEPDIR)/plu_example_double.Po -rm -f ./$(DEPDIR)/plu_example_float.Po -rm -f ./$(DEPDIR)/plu_implicit_example_double.Po -rm -f ./$(DEPDIR)/plu_implicit_example_float.Po -rm -f ./$(DEPDIR)/plu_outofcore_example_double.Po -rm -f ./$(DEPDIR)/plu_outofcore_example_float.Po -rm -f ./$(DEPDIR)/plu_solve_double.Po -rm -f ./$(DEPDIR)/plu_solve_float.Po -rm -f ./$(DEPDIR)/pslu.Po -rm -f ./$(DEPDIR)/pslu_implicit.Po -rm -f ./$(DEPDIR)/pslu_kernels.Po -rm -f ./$(DEPDIR)/stencil5.Po -rm -f ./$(DEPDIR)/stencil5_lb.Po -rm -f ./$(DEPDIR)/user_datatype.Po -rm -f ./$(DEPDIR)/user_datatype2.Po -rm -f ./$(DEPDIR)/user_datatype_early.Po -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-exec \ install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ @$(MKDIR_P) `dirname $@` @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(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 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mod.mod: fstarpu_mod.o @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mpi_mod.mod: fstarpu_mpi_mod.o @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@nf_mm_cl.mod: nf_mm_cl.o @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mod.o: $(top_srcdir)/include/fstarpu_mod.f90 @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 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@fstarpu_mpi_mod.o: $(top_srcdir)/mpi/include/fstarpu_mpi_mod.f90 fstarpu_mod.mod @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 @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 @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 @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 @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 @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@nf_mm_task_build.o: $(top_srcdir)/mpi/examples/native_fortran/nf_mm_task_build.f90 nf_mm_cl.mod fstarpu_mpi_mod.mod fstarpu_mod.mod @STARPU_HAVE_MPIFORT_TRUE@@STARPU_SANITIZE_FALSE@ $(AM_V_FC)$(FC) $(native_fortran_nf_mm__task_build_FCFLAGS) $(FCFLAGS) -c -o $@ `test -f 'native_fortran/nf_mm_task_build.f90' || echo '$(srcdir)/'`native_fortran/nf_mm_task_build.f90 @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 @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.3.9+dfsg/mpi/examples/cache/000077500000000000000000000000001413463044200174305ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/cache/cache.c000066400000000000000000000057131413463044200206450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 mycodelet_r = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_R}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_w = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_W}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_rw = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &starpu_perfmodel_nop, }; void test(struct starpu_codelet *codelet, enum starpu_data_access_mode mode, starpu_data_handle_t data, int rank, int in_cache) { int cache; 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"); cache = starpu_mpi_cached_receive(data); if (rank == 1) { if (in_cache) { STARPU_ASSERT_MSG(cache == 1, "Data should be in cache\n"); } else { STARPU_ASSERT_MSG(cache == 0, "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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); return starpu_mpi_cache_is_enabled() == 0 ? STARPU_TEST_SKIPPED : 0; } starpu-1.3.9+dfsg/mpi/examples/cache/cache_disable.c000066400000000000000000000052431413463044200223260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 mycodelet_r = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_R}, .model = &starpu_perfmodel_nop, }; int main(int argc, char **argv) { int rank, n; int ret; unsigned *val; starpu_data_handle_t data; int in_cache; int cache; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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"); in_cache = starpu_mpi_cached_receive(data); if (rank == 1) { STARPU_ASSERT_MSG(in_cache == 1, "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 in_cache = starpu_mpi_cached_receive(data); if (rank == 1) { STARPU_ASSERT_MSG(in_cache == 0, "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"); in_cache = starpu_mpi_cached_receive(data); if (rank == 1) { STARPU_ASSERT_MSG(in_cache == 0, "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(); return cache == 0 ? STARPU_TEST_SKIPPED : 0; } starpu-1.3.9+dfsg/mpi/examples/comm/000077500000000000000000000000001413463044200173205ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/comm/comm.c000066400000000000000000000113151413463044200204200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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" #define DATA0_TAG 12 #define DATA1_TAG 22 void func_cpu(void *descr[], 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}, .model = &starpu_perfmodel_nop, }; 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_mpi_init_conf(NULL, NULL, 0, newcomm, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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], DATA1_TAG, 0, newcomm); } else starpu_variable_data_register(&data[0], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[0], DATA0_TAG, 0, newcomm); if (newrank == 0) { starpu_mpi_req req[2]; starpu_mpi_issend(data[1], &req[0], 1, DATA1_TAG, newcomm); starpu_mpi_isend(data[0], &req[1], 1, DATA0_TAG, 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, DATA0_TAG, newcomm, MPI_STATUS_IGNORE); starpu_data_acquire(data[0], STARPU_R); xx = (int *)starpu_variable_get_local_ptr(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_data_release(data[0]); starpu_variable_data_register(&data[1], -1, (uintptr_t)NULL, sizeof(int)); starpu_mpi_data_register_comm(data[1], DATA1_TAG, 0, newcomm); starpu_mpi_recv(data[0], 0, DATA1_TAG, newcomm, MPI_STATUS_IGNORE); starpu_data_acquire(data[0], STARPU_R); xx = (int *)starpu_variable_get_local_ptr(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_data_release(data[0]); } 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(); MPI_Comm_free(&newcomm); MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/examples/comm/mix_comm.c000066400000000000000000000140461413463044200213010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], 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}, .model = &starpu_perfmodel_nop, }; 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_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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_R); xx = (int *)starpu_variable_get_local_ptr(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_data_release(data[0]); 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_R); xx = (int *)starpu_variable_get_local_ptr(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_data_release(data[0]); } if (rank == 0) { starpu_data_acquire(data[2], STARPU_R); 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_R); int *xx = (int *)starpu_variable_get_local_ptr(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))); starpu_data_release(data[2]); } 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(); MPI_Comm_free(&newcomm); MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/examples/complex/000077500000000000000000000000001413463044200200345ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/complex/mpi_complex.c000066400000000000000000000076771413463044200225350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *_args) { (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}, .model = &starpu_perfmodel_nop, }; int main(int argc, char **argv) { int rank, nodes; int ret; int compare=0; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2 || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (nodes < 2) fprintf(stderr, "We need at least 2 processes.\n"); else fprintf(stderr, "We need at least 1 CPU.\n"); } starpu_mpi_shutdown(); return 77; } 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); // Ping-pong 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); } // Ping if (rank == 0) { starpu_data_handle_t xhandle; double xreal = 4.0; double ximaginary = 8.0; starpu_complex_data_register(&xhandle, STARPU_MAIN_RAM, &xreal, &ximaginary, 1); starpu_mpi_send(xhandle, 1, 10, MPI_COMM_WORLD); starpu_data_unregister(xhandle); } else if (rank == 1) { MPI_Status status; starpu_data_handle_t xhandle; double xreal = 14.0; double ximaginary = 18.0; starpu_complex_data_register(&xhandle, STARPU_MAIN_RAM, &xreal, &ximaginary, 1); starpu_mpi_recv(xhandle, 0, 10, MPI_COMM_WORLD, &status); starpu_data_unregister(xhandle); FPRINTF(stderr, "[received] real %f imaginary %f\n", xreal, ximaginary); STARPU_ASSERT_MSG(xreal == 4 && ximaginary == 8, "Incorrect received value\n"); } starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_data_unregister(handle2); starpu_mpi_shutdown(); return (rank == 0) ? !compare : 0; } starpu-1.3.9+dfsg/mpi/examples/filters/000077500000000000000000000000001413463044200200355ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/filters/filter.c000066400000000000000000000115601413463044200214710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 declare a new filter function. */ #include #define NX 20 #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 rank; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); fprintf(stderr, "computing on rank %d\n", rank); unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); int *val = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); starpu_codelet_unpack_args(cl_arg, &factor); for (i = 0; i < n; i++) val[i] *= factor; } struct starpu_codelet cl = { .cpu_funcs = {cpu_func}, .cpu_funcs_name = {"cpu_func"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "vector_scal" }; void vector_filter(void *father_interface, void *child_interface, 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); STARPU_ASSERT(nchunks == 2); STARPU_ASSERT_MSG((nx % nchunks) == 0, "nx=%u is not a multiple of nchunks %u\n", nx, nchunks); vector_child->id = vector_father->id; vector_child->nx = nx/2; vector_child->elemsize = elemsize; vector_child->allocsize = vector_child->nx * elemsize; if (vector_father->dev_handle) { size_t offset = (id *(nx/nchunks)) * elemsize; 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; } } int main(int argc, char **argv) { int i, rank, nodes; int vector[NX]; int vector_check[NX]; starpu_data_handle_t vhandle; starpu_data_handle_t handles[2]; int factor[2] = {2, 3}; int ret; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2 || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (nodes < 2) fprintf(stderr, "We need at least 2 processes.\n"); else fprintf(stderr, "We need at least 1 CPU.\n"); } starpu_mpi_shutdown(); return 77; } for(i=0 ; i #include #ifdef STARPU_HAVE_VALGRIND_H #include #endif #ifdef STARPU_HAVE_HELGRIND_H #include #endif #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.3.9+dfsg/mpi/examples/matrix_decomposition/000077500000000000000000000000001413463044200226255ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky.c000066400000000000000000000042231413463044200254600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 "helper.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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); starpu_cublas_init(); if (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0) { if (rank == 0) { FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } parse_args(argc, argv, nodes); matrix_init(&bmat, rank, nodes, 1); matrix_display(bmat, rank, nodes); dw_cholesky(bmat, size/nblocks, rank, nodes, &timing, &flops); #ifndef STARPU_SIMGRID matrix_display(bmat, rank, nodes); if (check && rank == 0) dw_cholesky_check_computation(bmat, rank, nodes, &correctness, &flops, 0.001); #endif matrix_free(&bmat, rank, nodes, 1); starpu_cublas_shutdown(); starpu_mpi_shutdown(); #ifndef STARPU_SIMGRID if (check && rank == 0) 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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky.h000066400000000000000000000021331413463044200254630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_codelets.c000066400000000000000000000240121413463044200273400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 /* 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 */ /* * 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, .color = 0xffff00, }; 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 .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &chol_model_21, .color = 0x8080ff, }; 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 .cuda_flags = {STARPU_CUDA_ASYNC}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW | STARPU_COMMUTE}, .model = &chol_model_22, .color = 0x00ff00, }; /* * 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 k, m, n; unsigned nn = size/nblocks; 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(m=0 ; m mm) { rmat[mm+nn*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 (mm = 0; mm < size; mm++) { for (nn = 0; nn < size; nn++) { if (nn <= mm) { printf("%2.2f\t", test_mat[mm +nn*size]); } else { printf(".\t"); } } printf("\n"); } } *correctness = 1; for(n = 0; n < nblocks ; n++) { for (m = 0; m < nblocks; m++) { for (nn = BLOCKSIZE*n ; nn < BLOCKSIZE*(n+1); nn++) { for (mm = BLOCKSIZE*m ; mm < BLOCKSIZE*(m+1); mm++) { if (nn <= mm) { float orig = (1.0f/(1.0f+nn+mm)) + ((nn == mm)?1.0f*size:0.0f); float err = fabsf(test_mat[mm +nn*size] - orig) / orig; if (err > epsilon) { FPRINTF(stderr, "[%d] Error[%u, %u] --> %2.20f != %2.20f (err %2.20f)\n", rank, nn, mm, test_mat[mm +nn*size], orig, err); *correctness = 0; *flops = 0; break; } } } } } } free(rmat); free(test_mat); } starpu-1.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_codelets.h000066400000000000000000000021071413463044200273460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, double epsilon); #endif /* __MPI_CHOLESKY_CODELETS_H__ */ starpu-1.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_distributed.c000066400000000000000000000036141413463044200300650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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" /* This is the same as matrix_decomposition, but the matrix is not allocated in * totality on all nodes, thus allowing much bigger matrices, but doesn't allow * trivial checks */ 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=1; #endif ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); starpu_cublas_init(); parse_args(argc, argv, nodes); if (check) { fprintf(stderr,"can't check in distributed mode\n"); check = 0; } matrix_init(&bmat, rank, nodes, 0); dw_cholesky(bmat, size/nblocks, rank, nodes, &timing, &flops); matrix_free(&bmat, rank, nodes, 0); starpu_cublas_shutdown(); starpu_mpi_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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_kernels.c000066400000000000000000000153751413463044200272150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 #include #ifdef 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, void *_args) { (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]); 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: { 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); 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, void *_args) { (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, void *_args) { (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); #else starpu_cublas_set_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 = cudaDeviceSynchronize(); #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 starpu-1.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_kernels.h000066400000000000000000000022551413463044200272130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_models.c000066400000000000000000000020451413463044200270230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_cholesky_models.h000066400000000000000000000016411413463044200270310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_decomposition_matrix.c000066400000000000000000000060561413463044200301050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 y, int x, int nb_nodes) { (void)nb_nodes; //return (x+y) % nb_nodes; return (x%dblockx)+(y%dblocky)*dblockx; } void matrix_display(float ***bmat, int rank, int nodes) { int n; if (!display) return; starpu_mpi_barrier(MPI_COMM_WORLD); for (n = 0; n < rank; n++) starpu_mpi_barrier(MPI_COMM_WORLD); unsigned y; printf("[%d] Input :\n", rank); for(y=0 ; y #include #include #include #ifdef STARPU_QUICK_CHECK unsigned size = 2*320; 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 check = 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); } else if (strcmp(argv[i], "-dblockx") == 0) { char *argptr; dblockx = strtol(argv[++i], &argptr, 10); } else if (strcmp(argv[i], "-dblocky") == 0) { char *argptr; dblocky = 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-prio") == 0) { noprio = 1; } else if (strcmp(argv[i], "-check") == 0) { check = 1; } else if (strcmp(argv[i], "-display") == 0) { display = 1; } else /* if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) */ { printf("usage : %s [-size size] [-nblocks nblocks] [-no-prio] [-display] [-check]\n", argv[0]); fprintf(stderr,"Currently selected: %ux%u and %ux%u blocks\n", size, size, nblocks, nblocks); exit(0); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) size = 16; #endif 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.3.9+dfsg/mpi/examples/matrix_decomposition/mpi_decomposition_params.h000066400000000000000000000020621413463044200300620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 check; 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.3.9+dfsg/mpi/examples/matrix_mult/000077500000000000000000000000001413463044200207325ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/matrix_mult/mm.c000066400000000000000000000236331413463044200215160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 illustrates how to distribute a pre-existing data structure to * a set of computing nodes using StarPU-MPI routines. */ #include #include #include #include #include #include #include "helper.h" #define VERBOSE 0 static int N = 16; /* Matrix size */ static int BS = 4; /* Block size */ #define NB ((N)/(BS)) /* Number of blocks */ /* Matrices. Will be allocated as regular, linearized C arrays */ static double *A = NULL; /* A will be partitioned as BS rows x N cols blocks */ static double *B = NULL; /* B will be partitioned as N rows x BS cols blocks */ static double *C = NULL; /* C will be partitioned as BS rows x BS cols blocks */ /* Arrays of data handles for managing matrix blocks */ static starpu_data_handle_t *A_h; static starpu_data_handle_t *B_h; static starpu_data_handle_t *C_h; static int comm_rank; /* mpi rank of the process */ static int comm_size; /* size of the mpi session */ static void alloc_matrices(void) { /* Regular 'malloc' can also be used instead, however, starpu_malloc make sure that * the area is allocated in suitably pinned memory to improve data transfers, especially * with CUDA */ starpu_malloc((void **)&A, N*N*sizeof(double)); starpu_malloc((void **)&B, N*N*sizeof(double)); starpu_malloc((void **)&C, N*N*sizeof(double)); } static void free_matrices(void) { starpu_free(A); starpu_free(B); starpu_free(C); } static void init_matrices(void) { int row,col; for (row = 0; row < N; row++) { for (col = 0; col < N; col++) { A[row*N+col] = (row==col)?2:0; B[row*N+col] = row*N+col; C[row*N+col] = 0; } } } #if VERBOSE static void disp_matrix(double *m) { int row,col; for (row = 0; row < N; row++) { for (col = 0; col < N; col++) { printf("\t%.2lf", m[row*N+col]); } printf("\n"); } } #endif static void check_result(void) { int row,col; for (row = 0; row < N; row++) { for (col = 0; col < N; col++) { if (fabs(C[row*N+col] - 2*(row*N+col)) > 1.0) { fprintf(stderr, "check failed\n"); exit(1); } } } #if VERBOSE printf("success\n"); #endif } /* Register the matrix blocks to StarPU and to StarPU-MPI */ static void register_matrices() { A_h = calloc(NB, sizeof(starpu_data_handle_t)); B_h = calloc(NB, sizeof(starpu_data_handle_t)); C_h = calloc(NB*NB, sizeof(starpu_data_handle_t)); /* Memory region, where the data being registered resides. * In this example, all blocks are allocated by node 0, thus * - node 0 specifies STARPU_MAIN_RAM to indicate that it owns the block in its main memory * - nodes !0 specify -1 to indicate that they don't have a copy of the block initially */ int mr = (comm_rank == 0) ? STARPU_MAIN_RAM : -1; /* mpi tag used for the block */ starpu_mpi_tag_t tag = 0; int b_row,b_col; for (b_row = 0; b_row < NB; b_row++) { /* Register a block to StarPU */ starpu_matrix_data_register(&A_h[b_row], mr, (comm_rank == 0)?(uintptr_t)(A+b_row*BS*N):0, N, N, BS, sizeof(double)); /* Register a block to StarPU-MPI, specifying the mpi tag to use for transfering the block * and the rank of the owner node. * * Note: StarPU-MPI is an autonomous layer built on top of StarPU, hence the two separate * registration steps. */ starpu_data_set_coordinates(A_h[b_row], 2, 0, b_row); starpu_mpi_data_register(A_h[b_row], tag++, 0); } for (b_col = 0; b_col < NB; b_col++) { starpu_matrix_data_register(&B_h[b_col], mr, (comm_rank == 0)?(uintptr_t)(B+b_col*BS):0, N, BS, N, sizeof(double)); starpu_data_set_coordinates(B_h[b_col], 2, b_col, 0); starpu_mpi_data_register(B_h[b_col], tag++, 0); } for (b_row = 0; b_row < NB; b_row++) { for (b_col = 0; b_col < NB; b_col++) { starpu_matrix_data_register(&C_h[b_row*NB+b_col], mr, (comm_rank == 0)?(uintptr_t)(C+b_row*BS*N+b_col*BS):0, N, BS, BS, sizeof(double)); starpu_data_set_coordinates(C_h[b_row*NB+b_col], 2, b_col, b_row); starpu_mpi_data_register(C_h[b_row*NB+b_col], tag++, 0); } } } /* Transfer ownership of the C matrix blocks following some user-defined distribution over the nodes. * Note: since C will be Write-accessed, it will implicitly define which node perform the task * associated to a given block. */ static void distribute_matrix_C(void) { int b_row,b_col; for (b_row = 0; b_row < NB; b_row++) { for (b_col = 0; b_col < NB; b_col++) { starpu_data_handle_t h = C_h[b_row*NB+b_col]; /* Select the node where the block should be computed. */ int target_rank = (b_row+b_col)%comm_size; /* Move the block on to its new owner. */ starpu_mpi_data_migrate(MPI_COMM_WORLD, h, target_rank); } } } /* Transfer ownership of the C matrix blocks back to node 0, for display purpose. This is not mandatory. */ static void undistribute_matrix_C(void) { int b_row,b_col; for (b_row = 0; b_row < NB; b_row++) { for (b_col = 0; b_col < NB; b_col++) { starpu_data_handle_t h = C_h[b_row*NB+b_col]; starpu_mpi_data_migrate(MPI_COMM_WORLD, h, 0); } } } /* Unregister matrices from the StarPU management. */ static void unregister_matrices() { int b_row,b_col; for (b_row = 0; b_row < NB; b_row++) { starpu_data_unregister(A_h[b_row]); } for (b_col = 0; b_col < NB; b_col++) { starpu_data_unregister(B_h[b_col]); } for (b_row = 0; b_row < NB; b_row++) { for (b_col = 0; b_col < NB; b_col++) { starpu_data_unregister(C_h[b_row*NB+b_col]); } } free(A_h); free(B_h); free(C_h); } /* Perform the actual computation. In a real-life case, this would rather call a BLAS 'gemm' routine * instead. */ static void cpu_mult(void *handles[], void *arg) { (void)arg; double *block_A = (double *)STARPU_MATRIX_GET_PTR(handles[0]); double *block_B = (double *)STARPU_MATRIX_GET_PTR(handles[1]); double *block_C = (double *)STARPU_MATRIX_GET_PTR(handles[2]); unsigned n_col_A = STARPU_MATRIX_GET_NX(handles[0]); unsigned n_col_B = STARPU_MATRIX_GET_NX(handles[1]); unsigned n_col_C = STARPU_MATRIX_GET_NX(handles[2]); unsigned n_row_A = STARPU_MATRIX_GET_NY(handles[0]); unsigned n_row_B = STARPU_MATRIX_GET_NY(handles[1]); unsigned n_row_C = STARPU_MATRIX_GET_NY(handles[2]); unsigned ld_A = STARPU_MATRIX_GET_LD(handles[0]); unsigned ld_B = STARPU_MATRIX_GET_LD(handles[1]); unsigned ld_C = STARPU_MATRIX_GET_LD(handles[2]); /* Sanity check, not needed in real life case */ assert(n_col_C == n_col_B); assert(n_row_C == n_row_A); assert(n_col_A == n_row_B); unsigned i,j,k; for (k = 0; k < n_row_C; k++) { for (j = 0; j < n_col_C; j++) { for (i = 0; i < n_col_A; i++) { block_C[k*ld_C+j] += block_A[k*ld_A+i] * block_B[i*ld_B+j]; } #if VERBOSE /* For illustration purpose, shows which node computed * the block in the decimal part of the cell */ block_C[k*ld_C+j] += comm_rank / 100.0; #endif } } } /* Define a StarPU 'codelet' structure for the matrix multiply kernel above. * This structure enable specifying multiple implementations for the kernel (such as CUDA or OpenCL versions) */ static struct starpu_codelet gemm_cl = { .cpu_funcs = {cpu_mult}, /* cpu implementation(s) of the routine */ .nbuffers = 3, /* number of data handles referenced by this routine */ .modes = {STARPU_R, STARPU_R, STARPU_RW} /* access modes for each data handle */ }; int main(int argc, char *argv[]) { /* Initializes STarPU and the StarPU-MPI layer */ int ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_ini_conft"); if (starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } /* Parse the matrix size and block size optional args */ if (argc > 1) { N = atoi(argv[1]); if (N < 1) { fprintf(stderr, "invalid matrix size\n"); exit(1); } if (argc > 2) { BS = atoi(argv[2]); } if (BS < 1 || N % BS != 0) { fprintf(stderr, "invalid block size\n"); exit(1); } } /* Get the process rank and session size */ starpu_mpi_comm_rank(MPI_COMM_WORLD, &comm_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &comm_size); if (comm_rank == 0) { #if VERBOSE printf("N = %d\n", N); printf("BS = %d\n", BS); printf("NB = %d\n", NB); printf("comm_size = %d\n", comm_size); #endif /* In this example, node rank 0 performs all the memory allocations and initializations, * and the blocks are later distributed on the other nodes. * This is not mandatory however, and blocks could be allocated on other nodes right * from the beginning, depending on the application needs (in particular for the case * where the session wide data footprint is larger than a single node available memory. */ alloc_matrices(); init_matrices(); } /* Register matrices to StarPU and StarPU-MPI */ register_matrices(); /* Distribute C blocks */ distribute_matrix_C(); int b_row,b_col; for (b_row = 0; b_row < NB; b_row++) { for (b_col = 0; b_col < NB; b_col++) { starpu_mpi_task_insert(MPI_COMM_WORLD, &gemm_cl, STARPU_R, A_h[b_row], STARPU_R, B_h[b_col], STARPU_RW, C_h[b_row*NB+b_col], 0); } } starpu_task_wait_for_all(); undistribute_matrix_C(); unregister_matrices(); if (comm_rank == 0) { #if VERBOSE disp_matrix(C); #endif check_result(); free_matrices(); } starpu_mpi_shutdown(); return 0; } starpu-1.3.9+dfsg/mpi/examples/mpi_lu/000077500000000000000000000000001413463044200176525ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/mpi_lu/mpi_lu-double.h000066400000000000000000000024441413463044200225640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/examples/mpi_lu/mpi_lu-float.h000066400000000000000000000024411413463044200224140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/examples/mpi_lu/pdlu.c000066400000000000000000000013351413463044200207640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/pdlu_implicit.c000066400000000000000000000014221413463044200226530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/pdlu_kernels.c000066400000000000000000000013451413463044200225100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_example.c000066400000000000000000000362551413463044200223440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "helper.h" #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 unsigned no_prio = 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) { (void)rank; 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); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { size = 4; nblocks = 4; } #endif } 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) { (void)rank; (void)pnblocks; (void)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)] += 1; (*blockptr)[tmp*((size/nblocks)+1)] *= 100; } } /* 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; int ret; unsigned i, j; /* * 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); ret = starpu_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); /* We disable sequential consistency in this example */ starpu_data_set_default_sequential_consistency_flag(0); if (p == -1 && q==-1) { fprintf(stderr, "Setting default values for p and q\n"); p = (q % 2 == 0) ? 2 : 1; q = world_size / p; } STARPU_ASSERT_MSG(p*q == world_size, "p=%d, q=%d, world_size=%d\n", 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, no_prio); /* * 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 */ for (j = 0; j < nblocks; j++) { for (i = 0; i < nblocks; i++) { starpu_data_unregister(dataA_handles[j+nblocks*i]); TYPE *blockptr = dataA[j+i*nblocks]; if (blockptr != STARPU_POISON_PTR) starpu_free(blockptr); } } free(dataA_handles); free(dataA); barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); starpu_cublas_shutdown(); starpu_mpi_shutdown(); #if 0 MPI_Finalize(); #endif return 0; } starpu-1.3.9+dfsg/mpi/examples/mpi_lu/plu_example_double.c000066400000000000000000000013441413463044200236650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_example_float.c000066400000000000000000000013431413463044200235170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_implicit_example.c000066400000000000000000000212551413463044200242300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "helper.h" #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 unsigned no_prio = 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); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { size = 4; nblocks = 4; } #endif } 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; int ret; unsigned i, j; starpu_srand48((long int)time(NULL)); parse_args(argc, argv); ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); if (p == -1 && q==-1) { fprintf(stderr, "Setting default values for p and q\n"); p = (q % 2 == 0) ? 2 : 1; q = world_size / p; } STARPU_ASSERT_MSG(p*q == world_size, "p=%d, q=%d, world_size=%d\n", 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, no_prio); /* * 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]); TYPE *blockptr = dataA[j+i*nblocks]; if (blockptr != STARPU_POISON_PTR) starpu_free(blockptr); } } free(dataA_handles); free(dataA); starpu_cublas_shutdown(); starpu_mpi_shutdown(); return 0; } starpu-1.3.9+dfsg/mpi/examples/mpi_lu/plu_implicit_example_double.c000066400000000000000000000014311413463044200255540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_implicit_example_float.c000066400000000000000000000014301413463044200254060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_outofcore_example.c000066400000000000000000000231261413463044200244220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "helper.h" #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 size_t blocksize; static unsigned check = 0; static int p = -1; static int q = -1; static unsigned display = 0; static unsigned no_prio = 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; static void **disk_objs; static int disk_node; 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); } } #ifdef STARPU_HAVE_VALGRIND_H if (RUNNING_ON_VALGRIND) { size = 4; nblocks = 4; } #endif } 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() { 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)); disk_objs = calloc(nblocks*nblocks, sizeof(*disk_objs)); disk_node = starpu_disk_register(&starpu_disk_unistd_ops, path, STARPU_MAX(16*1024*1024, size*size*sizeof(TYPE))); assert(disk_node >= 0); 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) { snprintf(filename, sizeof(filename), "%u,%u", i, j); /* Register it to StarPU */ disk_objs[j+nblocks*i] = starpu_disk_open(disk_node, filename, blocksize); if (!disk_objs[j+nblocks*i]) { fprintf(stderr,"could not open %s\n", filename); exit(1); } starpu_matrix_data_register(handleptr, disk_node, (uintptr_t) disk_objs[j+nblocks*i], size/nblocks, size/nblocks, size/nblocks, sizeof(TYPE)); starpu_data_acquire_on_node(*handleptr, STARPU_MAIN_RAM, STARPU_W); void *interface = starpu_data_get_interface_on_node(*handleptr, STARPU_MAIN_RAM); TYPE *data = (void*) STARPU_MATRIX_GET_PTR(interface); fill_block_with_random(data, size, nblocks); if (i == j) { unsigned tmp; for (tmp = 0; tmp < size/nblocks; tmp++) { data[tmp*((size/nblocks)+1)] += 1; data[tmp*((size/nblocks)+1)] *= 100; } } starpu_data_release_on_node(*handleptr, STARPU_MAIN_RAM); } else { disk_objs[j+nblocks*i] = NULL; 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) { (void)i; (void)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]; } #if STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else 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); blocksize = (size_t)(size/nblocks)*(size/nblocks)*sizeof(TYPE); ret = mkdir(path, 0777); if (ret != 0 && errno != EEXIST) { fprintf(stderr,"%s does not exist\n", path); exit(1); } ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); if (p == -1 && q==-1) { fprintf(stderr, "Setting default values for p and q\n"); p = (q % 2 == 0) ? 2 : 1; q = world_size / p; } STARPU_ASSERT_MSG(p*q == world_size, "p=%d, q=%d, world_size=%d\n", 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, no_prio); /* * 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]); if (disk_objs[j+nblocks*i]) starpu_disk_close(disk_node, disk_objs[j+nblocks*i], blocksize); } } free(dataA_handles); free(disk_objs); starpu_cublas_shutdown(); starpu_mpi_shutdown(); return 0; } #endif starpu-1.3.9+dfsg/mpi/examples/mpi_lu/plu_outofcore_example_double.c000066400000000000000000000014321413463044200257500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_outofcore_example_float.c000066400000000000000000000014311413463044200256020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_solve.c000066400000000000000000000233251413463044200220330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/mpi/examples/mpi_lu/plu_solve_double.c000066400000000000000000000013421413463044200233600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/plu_solve_float.c000066400000000000000000000013411413463044200232120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/pslu.c000066400000000000000000000013341413463044200210020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/pslu_implicit.c000066400000000000000000000014211413463044200226710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/pslu_kernels.c000066400000000000000000000013441413463044200225260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/mpi/examples/mpi_lu/pxlu.c000066400000000000000000000527121413463044200210150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, starpu_mpi_tag_t 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]; starpu_mpi_tag_t 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; starpu_mpi_tag_t 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, starpu_mpi_tag_t 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 if (k > 0) { unsigned i; 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) { unsigned j; 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 starpu_mpi_tag_t 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); starpu_mpi_tag_t 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, (unsigned long long) 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) { /* 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]; unsigned start; unsigned bound; #ifdef SINGLE_TMP1221 bound = 0; start = (k-1)+1; #else bound = 1; start = (k-2)+1; #endif if (k > bound) { unsigned i; for (i = start; i < nblocks; i++) { 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 starpu_mpi_tag_t 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); starpu_mpi_tag_t 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) { /* 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]; unsigned bound; unsigned start; #ifdef SINGLE_TMP1221 bound = 0; start = (k-1)+1; #else bound = 1; start = (k-2)+1; #endif if (k > bound) { unsigned j; for (j = start; j < nblocks; j++) { 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 starpu_mpi_tag_t 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); starpu_mpi_tag_t 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, unsigned _no_prio) { double start; double end; nblocks = _nblocks; rank = _rank; world_size = _world_size; no_prio = _no_prio; /* 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.3.9+dfsg/mpi/examples/mpi_lu/pxlu.h000066400000000000000000000043721413463044200210210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, unsigned no_prio); 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.3.9+dfsg/mpi/examples/mpi_lu/pxlu_implicit.c000066400000000000000000000111001413463044200226710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, unsigned _no_prio) { double start; double end; nblocks = _nblocks; rank = _rank; world_size = _world_size; no_prio = _no_prio; /* 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.3.9+dfsg/mpi/examples/mpi_lu/pxlu_kernels.c000066400000000000000000000256551413463044200225460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, 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); #else (void)_args; #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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_PLU_STR(lu_model_22_openblas) #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, 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); #else (void)_args; #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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_PLU_STR(lu_model_12_openblas) #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, 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); #else (void)_args; #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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_PLU_STR(lu_model_21_openblas) #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, 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); #else (void)_args; #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) #elif defined(STARPU_OPENBLAS) .symbol = STARPU_PLU_STR(lu_model_11_openblas) #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.3.9+dfsg/mpi/examples/mpi_lu/pxlu_kernels.h000066400000000000000000000020741413463044200225410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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)) extern struct starpu_codelet STARPU_PLU(cl11); extern struct starpu_codelet STARPU_PLU(cl12); extern struct starpu_codelet STARPU_PLU(cl21); extern struct starpu_codelet STARPU_PLU(cl22); #endif // __PXLU_KERNELS_H__ starpu-1.3.9+dfsg/mpi/examples/native_fortran/000077500000000000000000000000001413463044200214065ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/native_fortran/nf_basic_ring.f90000066400000000000000000000077711413463044200245250ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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_int64_t) :: 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.3.9+dfsg/mpi/examples/native_fortran/nf_mm.f90000066400000000000000000000170431413463044200230270ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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_size, comm_rank integer(c_int), target :: 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, rank integer(c_int64_t) :: tag 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 call fstarpu_mpi_task_insert((/ c_loc(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.3.9+dfsg/mpi/examples/native_fortran/nf_mm_cl.f90000066400000000000000000000056651413463044200235140ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/examples/native_fortran/nf_mm_task_build.f90000066400000000000000000000202301413463044200252200ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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_size, comm_rank integer(c_int), target :: 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 type(c_ptr) :: task integer(c_int) :: ncpu integer(c_int) :: ret integer(c_int) :: row, col integer(c_int) :: b_row, b_col integer(c_int) :: mr, rank integer(c_int64_t) :: tag 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 task = fstarpu_mpi_task_build((/ c_loc(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 /)) if (c_associated(task)) then ret = fstarpu_task_submit(task) endif call fstarpu_mpi_task_post_build((/ c_loc(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.3.9+dfsg/mpi/examples/stencil/000077500000000000000000000000001413463044200200265ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/examples/stencil/stencil5.c000066400000000000000000000167021413463044200217260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args) { (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}, .model = &starpu_perfmodel_nop, }; #ifdef STARPU_QUICK_CHECK # define NITER_DEF 5 # define X 4 # define Y 4 #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; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); 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 this 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 #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[], void *_args) { (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}, .model = &starpu_perfmodel_nop, }; #ifdef STARPU_QUICK_CHECK # define NITER_DEF 5 # define X 4 # define Y 4 #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; } 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; } } } void get_neighbors(int **neighbor_ids, int *nneighbors) { int rank, size; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size <= 2) { *nneighbors = 1; *neighbor_ids = malloc(sizeof(int)); *neighbor_ids[0] = rank==size-1?0:rank+1; fprintf(stderr, "rank %d has neighbor %d\n", rank, *neighbor_ids[0]); } else { *nneighbors = 2; *neighbor_ids = malloc(2*sizeof(int)); (*neighbor_ids)[0] = rank==size-1?0:rank+1; (*neighbor_ids)[1] = rank==0?size-1:rank-1; fprintf(stderr, "rank %d has neighbor %d and %d\n", rank, (*neighbor_ids)[0], (*neighbor_ids)[1]); } } struct data_node { starpu_data_handle_t data_handle; int node; }; struct data_node data_nodes[X][Y]; void get_data_unit_to_migrate(starpu_data_handle_t **handle_unit, int *nhandles, int dst_node) { int rank, x, y; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); fprintf(stderr, "Looking to move data from %d to %d\n", rank, dst_node); for(x = 0; x < X; x++) { for (y = 0; y < Y; y++) { if (data_nodes[x][y].node == rank) { *handle_unit = malloc(sizeof(starpu_data_handle_t)); *handle_unit[0] = data_nodes[x][y].data_handle; *nhandles = 1; data_nodes[x][y].node = dst_node; return; } } } *nhandles = 0; } int main(int argc, char **argv) { int my_rank, size, x, y, loop; float mean=0; float matrix[X][Y]; struct starpu_mpi_lb_conf itf; int ret; itf.get_neighbors = get_neighbors; itf.get_data_unit_to_migrate = get_data_unit_to_migrate; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &my_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size > 2) { FPRINTF(stderr, "Only works with 2 nodes\n"); starpu_mpi_shutdown(); return 77; } if (starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return 77; } { char sleep_thr[10]; snprintf(sleep_thr, 10, "%d", Y); setenv("LB_HEAT_SLEEP_THRESHOLD", sleep_thr, 1); } starpu_mpi_lb_init("heat", &itf); 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++) { data_nodes[x][y].node = my_distrib(x, y, size); if (data_nodes[x][y].node == my_rank) { //FPRINTF(stderr, "[%d] Owning data[%d][%d]\n", my_rank, x, y); starpu_variable_data_register(&data_nodes[x][y].data_handle, 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 this 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_nodes[x][y].data_handle, -1, (uintptr_t)NULL, sizeof(float)); } else { /* I know it's useless to allocate anything for this */ data_nodes[x][y].data_handle = NULL; } if (data_nodes[x][y].data_handle) { starpu_data_set_coordinates(data_nodes[x][y].data_handle, 2, x, y); starpu_mpi_data_register(data_nodes[x][y].data_handle, (y*X)+x, data_nodes[x][y].node); } } } /* First computation with initial distribution */ for(loop=0 ; loop #include #include "my_interface.h" void starpu_my_data_display_codelet_cpu(void *descr[], void *_args) { char c = STARPU_MY_DATA_GET_CHAR(descr[0]); int d = STARPU_MY_DATA_GET_INT(descr[0]); char msg[100]=""; if (_args) starpu_codelet_unpack_args(_args, &msg); fprintf(stderr, "[%s] My value = '%c' %d\n", msg, c, d); } void starpu_my_data_compare_codelet_cpu(void *descr[], void *_args) { int *compare; starpu_codelet_unpack_args(_args, &compare); int d0 = STARPU_MY_DATA_GET_INT(descr[0]); char c0 = STARPU_MY_DATA_GET_CHAR(descr[0]); int d1 = STARPU_MY_DATA_GET_INT(descr[1]); char c1 = STARPU_MY_DATA_GET_CHAR(descr[1]); *compare = (d0 == d1 && c0 == c1); } void _starpu_my_data_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}; struct starpu_my_data *myinterface; myinterface = malloc(sizeof(struct starpu_my_data)); MPI_Get_address(myinterface, displacements); MPI_Get_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"); free(myinterface); } int starpu_my_data_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype) { (void)handle; _starpu_my_data_datatype_allocate(mpi_datatype); return 0; } void starpu_my_data_datatype_free(MPI_Datatype *mpi_datatype) { MPI_Type_free(mpi_datatype); } int starpu_my_data2_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype) { (void)handle; (void)mpi_datatype; return -1; } void starpu_my_data2_datatype_free(MPI_Datatype *mpi_datatype) { STARPU_ASSERT_MSG(0, "should not be called\n"); } char starpu_my_data_interface_get_char(void *interface) { struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) interface; struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr; return data->c; } int starpu_my_data_interface_get_int(void *interface) { struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) interface; struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr; return data->d; } int starpu_my_data_get_int(starpu_data_handle_t handle) { struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr; return data->d; } char starpu_my_data_get_char(starpu_data_handle_t handle) { struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr; return data->c; } static void data_register_data_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_my_data_interface *my_data_interface = (struct starpu_my_data_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_my_data_interface *local_interface = (struct starpu_my_data_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = my_data_interface->ptr; local_interface->dev_handle = my_data_interface->dev_handle; local_interface->offset = my_data_interface->offset; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; } } } static starpu_ssize_t data_allocate_data_on_node(void *data_interface, unsigned node) { uintptr_t addr = 0, handle; struct starpu_my_data_interface *my_data_interface = (struct starpu_my_data_interface *) data_interface; starpu_ssize_t allocated_memory = sizeof(int)+sizeof(char); handle = starpu_malloc_on_node(node, allocated_memory); if (!handle) return -ENOMEM; if (starpu_node_get_kind(node) != STARPU_OPENCL_RAM) addr = handle; /* update the data properly in consequence */ my_data_interface->ptr = addr; my_data_interface->dev_handle = handle; my_data_interface->offset = 0; return allocated_memory; } static void data_free_data_on_node(void *data_interface, unsigned node) { struct starpu_my_data_interface *my_data_interface = (struct starpu_my_data_interface *) data_interface; starpu_free_on_node(node, my_data_interface->dev_handle, sizeof(int)+sizeof(char)); } static size_t data_get_size(starpu_data_handle_t handle) { (void)handle; return sizeof(int) + sizeof(char); } static size_t data_get_alloc_size(starpu_data_handle_t handle) { (void)handle; return sizeof(int) + sizeof(char); } static uint32_t data_footprint(starpu_data_handle_t handle) { struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return starpu_hash_crc32c_be(my_data->ptr, 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 int data_pack_data2(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); *count = sizeof(int) + sizeof(char); if (ptr != NULL) { int d = starpu_my_data_get_int(handle); char c = starpu_my_data_get_char(handle); *ptr = (void*) starpu_malloc_on_node_flags(node, *count, 0); memcpy(*ptr, &d, sizeof(int)); char *x = *ptr; x += sizeof(int); memcpy(x, &c, sizeof(char)); } return 0; } static int data_unpack_data2(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count) { (void)count; STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); STARPU_ASSERT(count == sizeof(int)+sizeof(char)); struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) starpu_data_get_interface_on_node(handle, node); struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr; memcpy(&data->d, ptr, sizeof(int)); char *x = ptr; x += sizeof(int); memcpy(&data->c, x, sizeof(char)); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); return 0; } static starpu_ssize_t data_describe(void *data_interface, char *buf, size_t size) { struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) data_interface; struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr; if (data) return snprintf(buf, size, "Data%d-%c", data->d, data->c); else return snprintf(buf, size, "DataUNKNOWN"); } static void *data_to_pointer(void *data_interface, unsigned node) { (void) node; struct starpu_my_data_interface *my_data_interface = data_interface; return (void*) my_data_interface->ptr; } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_my_data_interface *src = src_interface; struct starpu_my_data_interface *dst = dst_interface; int ret = 0; fprintf(stderr, "copying data src=%p to dst=%p\n", (void*) src->ptr, (void*) dst->ptr); if (starpu_interface_copy(src->dev_handle, src->offset, src_node, dst->dev_handle, dst->offset, dst_node, sizeof(int) + sizeof(char), 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, .get_alloc_size = data_get_alloc_size, .footprint = data_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct starpu_my_data_interface), .to_pointer = data_to_pointer, .pack_data = data_pack_data, .unpack_data = data_unpack_data, .describe = data_describe }; void starpu_my_data_register(starpu_data_handle_t *handleptr, unsigned home_node, struct starpu_my_data *xc) { if (interface_data_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_data_ops.interfaceid = starpu_data_interface_get_next_id(); starpu_mpi_interface_datatype_register(interface_data_ops.interfaceid, starpu_my_data_datatype_allocate, starpu_my_data_datatype_free); } struct starpu_my_data_interface data = { .id = interface_data_ops.interfaceid, .ptr = (uintptr_t) xc, .dev_handle = (uintptr_t) xc, .offset = 0, }; starpu_data_register(handleptr, home_node, &data, &interface_data_ops); } void starpu_my_data_shutdown(void) { starpu_mpi_interface_datatype_unregister(interface_data_ops.interfaceid); } static struct starpu_data_interface_ops interface_data2_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, .get_alloc_size = data_get_alloc_size, .footprint = data_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct starpu_my_data_interface), .to_pointer = data_to_pointer, .pack_data = data_pack_data2, .unpack_data = data_unpack_data2, .describe = data_describe }; void starpu_my_data2_register(starpu_data_handle_t *handleptr, unsigned home_node, struct starpu_my_data *xc) { if (interface_data2_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_data2_ops.interfaceid = starpu_data_interface_get_next_id(); starpu_mpi_interface_datatype_register(interface_data2_ops.interfaceid, starpu_my_data2_datatype_allocate, starpu_my_data2_datatype_free); } struct starpu_my_data_interface data = { .id = interface_data_ops.interfaceid, .ptr = (uintptr_t) xc, .dev_handle = (uintptr_t) xc, .offset = 0, }; starpu_data_register(handleptr, home_node, &data, &interface_data2_ops); } void starpu_my_data2_shutdown(void) { starpu_mpi_interface_datatype_unregister(interface_data2_ops.interfaceid); } starpu-1.3.9+dfsg/mpi/examples/user_datatype/my_interface.h000066400000000000000000000056461413463044200240670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_data_interface { enum starpu_data_interface_id id; /**< Identifier of the interface */ uintptr_t ptr; /**< local pointer of the data */ uintptr_t dev_handle; /**< device handle of the data. */ size_t offset; /**< offset in the data */ }; struct starpu_my_data { int d; char c; }; void starpu_my_data_register(starpu_data_handle_t *handle, unsigned home_node, struct starpu_my_data *xc); void starpu_my_data2_register(starpu_data_handle_t *handle, unsigned home_node, struct starpu_my_data *xc); char starpu_my_data_get_char(starpu_data_handle_t handle); int starpu_my_data_get_int(starpu_data_handle_t handle); char starpu_my_data_interface_get_char(void *interface); int starpu_my_data_interface_get_int(void *interface); #define STARPU_MY_DATA_GET_CHAR(interface) starpu_my_data_interface_get_char(interface) #define STARPU_MY_DATA_GET_INT(interface) starpu_my_data_interface_get_int(interface) void _starpu_my_data_datatype_allocate(MPI_Datatype *mpi_datatype); int starpu_my_data_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype); void starpu_my_data_datatype_free(MPI_Datatype *mpi_datatype); int starpu_my_data2_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype); void starpu_my_data2_datatype_free(MPI_Datatype *mpi_datatype); void starpu_my_data_display_codelet_cpu(void *descr[], void *_args); void starpu_my_data_compare_codelet_cpu(void *descr[], void *_args); static struct starpu_codelet starpu_my_data_display_codelet = { .cpu_funcs = {starpu_my_data_display_codelet_cpu}, .cpu_funcs_name = {"starpu_my_data_display_codelet_cpu"}, .nbuffers = 1, .modes = {STARPU_R}, .model = &starpu_perfmodel_nop, .name = "starpu_my_data_display_codelet" }; static struct starpu_codelet starpu_my_data_compare_codelet = { .cpu_funcs = {starpu_my_data_compare_codelet_cpu}, .cpu_funcs_name = {"starpu_my_data_compare_codelet_cpu"}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R}, .model = &starpu_perfmodel_nop, .name = "starpu_my_data_compare_codelet" }; void starpu_my_data_shutdown(void); void starpu_my_data2_shutdown(void); #endif /* __MY_INTERFACE_H */ starpu-1.3.9+dfsg/mpi/examples/user_datatype/user_datatype.c000066400000000000000000000106651413463044200242630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2 || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (nodes < 2) fprintf(stderr, "We need at least 2 processes.\n"); else fprintf(stderr, "We need at least 1 CPU.\n"); } starpu_mpi_shutdown(); return 77; } struct starpu_my_data my0 = {.d = 42 , .c = 'n'}; struct starpu_my_data my1 = {.d = 98 , .c = 'z'}; starpu_data_handle_t handle0; starpu_data_handle_t handle1; if (rank == 1) { my0.d = 0; my0.c = 'z'; } starpu_my_data_register(&handle0, STARPU_MAIN_RAM, &my0); starpu_my_data_register(&handle1, -1, &my1); // Send data directly with MPI if (rank == 0) { MPI_Datatype mpi_datatype; _starpu_my_data_datatype_allocate(&mpi_datatype); MPI_Send(&my0, 1, mpi_datatype, 1, 42, MPI_COMM_WORLD); starpu_my_data_datatype_free(&mpi_datatype); } else if (rank == 1) { MPI_Datatype mpi_datatype; MPI_Status status; struct starpu_my_data myx; _starpu_my_data_datatype_allocate(&mpi_datatype); MPI_Recv(&myx, 1, mpi_datatype, 0, 42, MPI_COMM_WORLD, &status); FPRINTF(stderr, "[mpi] Received value: '%c' %d\n", myx.c, myx.d); starpu_my_data_datatype_free(&mpi_datatype); STARPU_ASSERT_MSG(myx.d == 42 && myx.c == 'n', "Incorrect received value\n"); } if (rank == 0) { struct starpu_my_data myx = {.d = 98 , .c = 'z'}; starpu_data_handle_t handlex; starpu_my_data_register(&handlex, STARPU_MAIN_RAM, &myx); starpu_mpi_send(handlex, 1, 10, MPI_COMM_WORLD); starpu_data_unregister(handlex); } else if (rank == 1) { MPI_Status status; struct starpu_my_data myx = {.d = 11 , .c = 'a'}; starpu_data_handle_t handlex; starpu_my_data_register(&handlex, STARPU_MAIN_RAM, &myx); starpu_mpi_recv(handlex, 0, 10, MPI_COMM_WORLD, &status); starpu_data_unregister(handlex); FPRINTF(stderr, "[starpu mpi] myx.d=%d myx.c=%c\n", myx.d, myx.c); STARPU_ASSERT_MSG(myx.d == 98 && myx.c == 'z', "Incorrect received value\n"); } if (rank == 0) { int *compare_ptr = &compare; starpu_task_insert(&starpu_my_data_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_data_display_codelet, STARPU_VALUE, "node0 received value", strlen("node0 received value")+1, STARPU_R, handle1, 0); starpu_task_insert(&starpu_my_data_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_data_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_data_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_data_unregister(handle0); starpu_data_unregister(handle1); starpu_my_data_shutdown(); starpu_mpi_shutdown(); if (rank == 0) { FPRINTF(stderr, "[node 0] %s\n", compare==1?"SUCCESS":"FAILURE"); } return (rank == 0) ? !compare : 0; } starpu-1.3.9+dfsg/mpi/examples/user_datatype/user_datatype2.c000066400000000000000000000063021413463044200243360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2 || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (nodes < 2) fprintf(stderr, "We need at least 2 processes.\n"); else fprintf(stderr, "We need at least 1 CPU.\n"); } starpu_mpi_shutdown(); return 77; } struct starpu_my_data my0 = {.d = 42 , .c = 'n'}; struct starpu_my_data my1 = {.d = 98 , .c = 'z'}; starpu_data_handle_t handle0; starpu_data_handle_t handle1; if (rank == 1) { my0.d = 0; my0.c = 'z'; } starpu_my_data2_register(&handle0, STARPU_MAIN_RAM, &my0); starpu_my_data2_register(&handle1, -1, &my1); starpu_mpi_barrier(MPI_COMM_WORLD); if (rank == 0) { int *compare_ptr = &compare; starpu_task_insert(&starpu_my_data_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_data_display_codelet, STARPU_VALUE, "node0 received value", strlen("node0 received value")+1, STARPU_R, handle1, 0); starpu_task_insert(&starpu_my_data_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_data_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_data_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_my_data2_shutdown(); starpu_mpi_shutdown(); if (rank == 0) { FPRINTF(stderr, "[node 0] %s\n", compare==1?"SUCCESS":"FAILURE"); } return (rank == 0) ? !compare : 0; } starpu-1.3.9+dfsg/mpi/examples/user_datatype/user_datatype_early.c000066400000000000000000000062261413463044200254550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (nodes < 2 || (starpu_cpu_worker_get_count() == 0)) { if (rank == 0) { if (nodes < 2) fprintf(stderr, "We need at least 2 processes.\n"); else fprintf(stderr, "We need at least 1 CPU.\n"); } starpu_mpi_shutdown(); return 77; } struct starpu_my_data my0 = {.d = 42 , .c = 'n'}; struct starpu_my_data my1 = {.d = 11 , .c = 'a'}; if (rank == 1) { my0.d *= 2; my0.c += 1; my1.d *= 2; my1.c += 1; } starpu_data_handle_t handle0; starpu_data_handle_t handle1; starpu_my_data_register(&handle0, STARPU_MAIN_RAM, &my0); starpu_my_data_register(&handle1, STARPU_MAIN_RAM, &my1); if (rank == 0) { starpu_mpi_send(handle0, 1, 10, MPI_COMM_WORLD); starpu_mpi_send(handle1, 1, 20, MPI_COMM_WORLD); } else if (rank == 1) { // We want handle0 to be received as early_data and as starpu_mpi_data_register() has not be called, it will be received as raw memory, and then unpacked with MPI_Unpack() starpu_task_insert(&starpu_my_data_display_codelet, STARPU_VALUE, "node1 handle0 init value", strlen("node1 handle0 init value")+1, STARPU_R, handle0, 0); starpu_task_insert(&starpu_my_data_display_codelet, STARPU_VALUE, "node1 handle1 init value", strlen("node1 handle1 init value")+1, STARPU_R, handle1, 0); starpu_mpi_recv(handle1, 0, 20, MPI_COMM_WORLD, MPI_STATUS_IGNORE); starpu_mpi_recv(handle0, 0, 10, MPI_COMM_WORLD, MPI_STATUS_IGNORE); starpu_task_insert(&starpu_my_data_display_codelet, STARPU_VALUE, "node1 handle0 received value", strlen("node1 handle0 received value")+1, STARPU_R, handle0, 0); starpu_task_insert(&starpu_my_data_display_codelet, STARPU_VALUE, "node1 handle1 received value", strlen("node1 handle1 received value")+1, STARPU_R, handle1, 0); } starpu_mpi_wait_for_all(MPI_COMM_WORLD); starpu_mpi_barrier(MPI_COMM_WORLD); starpu_data_unregister(handle0); starpu_data_unregister(handle1); if (rank == 1) { STARPU_ASSERT_MSG(my0.d == 42 && my0.c == 'n' && my1.d == 11 && my1.c == 'a', "Incorrect received values"); } starpu_my_data_shutdown(); starpu_mpi_shutdown(); return 0; } starpu-1.3.9+dfsg/mpi/include/000077500000000000000000000000001413463044200161725ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/include/fstarpu_mpi_mod.f90000066400000000000000000001266141413463044200217140ustar00rootroot00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even 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, starpu_mpi_tag_t data_tag, MPI_Comm comm); function fstarpu_mpi_isend (dh, mpi_req, dst, data_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_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_isend ! == mpi/include/starpu_mpi.h == ! int starpu_mpi_isend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm); function fstarpu_mpi_isend_prio (dh, mpi_req, dst, data_tag, prio, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_prio type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: mpi_req integer(c_int), value, intent(in) :: dst integer(c_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: prio integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_isend_prio ! int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm); function fstarpu_mpi_irecv (dh, mpi_req, src, data_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_int64_t), value, intent(in) :: data_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, starpu_mpi_tag_t data_tag, MPI_Comm comm); function fstarpu_mpi_send (dh, dst, data_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_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_send ! int starpu_mpi_send_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm); function fstarpu_mpi_send_prio (dh, dst, data_tag, prio, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_send_prio type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: prio integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_send_prio ! int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, MPI_Status *status); function fstarpu_mpi_recv (dh, src, data_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_int64_t), value, intent(in) :: data_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, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_isend_detached (dh, dst, data_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_int64_t), value, intent(in) :: data_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_isend_detached_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_isend_detached_prio (dh, dst, data_tag, prio, mpi_comm, callback, arg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_detached_prio type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: prio 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_prio ! int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_recv_detached (dh, src, data_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_int64_t), value, intent(in) :: data_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, starpu_mpi_tag_t data_tag, MPI_Comm comm); function fstarpu_mpi_issend (dh, mpi_req, dst, data_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_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_issend ! int starpu_mpi_issend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm); function fstarpu_mpi_issend_prio (dh, mpi_req, dst, data_tag, prio, mpi_comm) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_issend_prio type(c_ptr), value, intent(in) :: dh type(c_ptr), value, intent(in) :: mpi_req integer(c_int), value, intent(in) :: dst integer(c_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: prio integer(c_int), value, intent(in) :: mpi_comm end function fstarpu_mpi_issend_prio ! int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_issend_detached (dh, dst, data_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_int64_t), value, intent(in) :: data_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_issend_detached_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, void (*callback)(void *), void *arg); function fstarpu_mpi_issend_detached_prio (dh, dst, data_tag, prio, mpi_comm, callback, arg) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_issend_detached_prio type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: prio 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_prio ! 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, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency); function fstarpu_mpi_recv_detached_sequential_consistency (dh, src, data_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_int64_t), value, intent(in) :: data_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(arglist) bind(C) use iso_c_binding, only: c_ptr type(c_ptr) :: fstarpu_mpi_task_build 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, ...); subroutine fstarpu_mpi_task_post_build(arglist) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), dimension(*), intent(in) :: arglist end subroutine fstarpu_mpi_task_post_build ! int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...); subroutine fstarpu_mpi_task_insert(arglist) bind(C) use iso_c_binding, only: c_ptr type(c_ptr), dimension(*), intent(in) :: arglist end subroutine fstarpu_mpi_task_insert subroutine fstarpu_mpi_insert_task(arglist) bind(C,name="fstarpu_mpi_task_insert") use iso_c_binding, only: c_ptr type(c_ptr), dimension(*), intent(in) :: arglist end subroutine 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 ! void starpu_mpi_redux_data_prio(MPI_Comm comm, starpu_data_handle_t data_handle, int prio); subroutine fstarpu_mpi_redux_data_prio(mpi_comm,dh, prio) 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) :: prio end subroutine fstarpu_mpi_redux_data_prio ! 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, starpu_mpi_tag_t data_tag, MPI_Comm comm, starpu_tag_t tag); function fstarpu_mpi_isend_detached_unlock_tag (dh, dst, data_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_int64_t), value, intent(in) :: data_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_isend_detached_unlock_tag_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, starpu_tag_t tag); function fstarpu_mpi_isend_detached_unlock_tag_prio (dh, dst, data_tag, prio, mpi_comm, starpu_tag) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_detached_unlock_tag_prio type(c_ptr), value, intent(in) :: dh integer(c_int), value, intent(in) :: dst integer(c_int64_t), value, intent(in) :: data_tag integer(c_int), value, intent(in) :: prio integer(c_int), value, intent(in) :: mpi_comm type(c_ptr), value, intent(in) :: starpu_tag end function fstarpu_mpi_isend_detached_unlock_tag_prio ! int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, starpu_tag_t tag); function fstarpu_mpi_recv_detached_unlock_tag (dh, src, data_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_int64_t), value, intent(in) :: data_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 *data_tag, MPI_Comm *comm, starpu_tag_t tag); function fstarpu_mpi_isend_array_detached_unlock_tag (array_size, dhs, dsts, data_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_int64_t), intent(in) :: data_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_isend_array_detached_unlock_tag_prio(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *data_tag, int *prio, MPI_Comm *comm, starpu_tag_t tag); function fstarpu_mpi_isend_array_detached_unlock_tag_prio (array_size, dhs, dsts, data_tags, prio, mpi_comms, & starpu_tag) bind(C) use iso_c_binding implicit none integer(c_int) :: fstarpu_mpi_isend_array_detached_unlock_tag_prio integer(c_int), value, intent(in) :: array_size type(c_ptr), intent(in) :: dhs(*) integer(c_int), intent(in) :: dsts(*) integer(c_int64_t), intent(in) :: data_tags(*) integer(c_int), intent(in) :: prio(*) integer(c_int), intent(in) :: mpi_comms(*) type(c_ptr), value, intent(in) :: starpu_tag end function fstarpu_mpi_isend_array_detached_unlock_tag_prio ! 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); function fstarpu_mpi_recv_array_detached_unlock_tag (array_size, dhs, srcs, data_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_int64_t), intent(in) :: data_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_int64_t), 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_int64_t), 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_int64_t), 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_int64_t), 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_int64_t) :: 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.3.9+dfsg/mpi/include/starpu_mpi.h000066400000000000000000000710631413463044200205350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include #ifdef __cplusplus extern "C" { #endif /** @defgroup API_MPI_Support MPI Support @{ */ /** @name Initialisation @{ */ /** Initialize the StarPU library with the given \p conf, and initialize the StarPU-MPI library with the given MPI communicator \p comm. \p initialize_mpi indicates if MPI should be initialized or not by StarPU. StarPU-MPI takes the opportunity to modify \p conf to either reserve a core for its MPI thread (by default), or execute MPI calls on the CPU driver 0 between tasks. */ int starpu_mpi_init_conf(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm, struct starpu_conf *conf); /** Same as starpu_mpi_init_conf(), except that this does not initialize the StarPU library. The caller thus has to call starpu_init() before this, and it can not reserve a core for the MPI communications. */ int starpu_mpi_init_comm(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm); /** Call starpu_mpi_init_comm() with the MPI communicator \c MPI_COMM_WORLD. */ int starpu_mpi_init(int *argc, char ***argv, int initialize_mpi); /** @deprecated This function has been made deprecated. One should use instead the function starpu_mpi_init(). This function does not call \c MPI_Init(), it should be called beforehand. */ int starpu_mpi_initialize(void) STARPU_DEPRECATED; /** @deprecated 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, ...). */ int starpu_mpi_initialize_extended(int *rank, int *world_size) STARPU_DEPRECATED; /** Clean the starpumpi library. This must be called after calling any \c starpu_mpi functions and before the call to starpu_shutdown(), if any. \c MPI_Finalize() will be called if StarPU-MPI has been initialized by starpu_mpi_init(). */ int starpu_mpi_shutdown(void); /** 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). */ void starpu_mpi_comm_amounts_retrieve(size_t *comm_amounts); /** Return in \p size the size of the communicator \p comm */ int starpu_mpi_comm_size(MPI_Comm comm, int *size); /** Return in \p rank the rank of the calling process in the communicator \p comm */ int starpu_mpi_comm_rank(MPI_Comm comm, int *rank); /** Return the rank of the calling process in the communicator \c MPI_COMM_WORLD */ int starpu_mpi_world_rank(void); /** Return the size of the communicator \c MPI_COMM_WORLD */ int starpu_mpi_world_size(void); /** When given to the function starpu_mpi_comm_get_attr(), retrieve the value for the upper bound for tag value. */ #define STARPU_MPI_TAG_UB MPI_TAG_UB /** Retrieve an attribute value by key, similarly to the MPI function \c MPI_comm_get_attr(), except that the value is a pointer to int64_t instead of int. 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. */ int starpu_mpi_comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag); int starpu_mpi_get_communication_tag(void); void starpu_mpi_set_communication_tag(int tag); /** @} */ /** @name Communication \anchor MPIPtpCommunication @{ */ /** Opaque type for communication request */ typedef void *starpu_mpi_req; /** Type of the message tag. */ typedef int64_t starpu_mpi_tag_t; /** Post a standard-mode, non blocking send of \p data_handle to the node \p dest using the message tag \p data_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. */ int starpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm); /** Similar to starpu_mpi_isend(), but take a priority \p prio. */ int starpu_mpi_isend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm); /** Post a nonblocking receive in \p data_handle from the node \p source using the message tag \p data_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. */ int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm); /** Perform a standard-mode, blocking send of \p data_handle to the node \p dest using the message tag \p data_tag within the communicator \p comm. */ int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm); /** Similar to starpu_mpi_send(), but take a priority \p prio. */ int starpu_mpi_send_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm); /** Perform a standard-mode, blocking receive in \p data_handle from the node \p source using the message tag \p data_tag within the communicator \p comm. The value of \p status cannot be NULL, use the predefined value MPI_STATUS_IGNORE to ignore the status. */ int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, MPI_Status *status); /** Post a standard-mode, non blocking send of \p data_handle to the node \p dest using the message tag \p data_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. */ int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg); /** Similar to starpu_mpi_isend_detached, but take a priority \p prio. */ int starpu_mpi_isend_detached_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, void (*callback)(void *), void *arg); /** Post a nonblocking receive in \p data_handle from the node \p source using the message tag \p data_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. */ int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg); /** Post a nonblocking receive in \p data_handle from the node \p source using the message tag \p data_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. */ int starpu_mpi_irecv_detached_sequential_consistency(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency); /** Perform a synchronous-mode, non-blocking send of \p data_handle to the node \p dest using the message tag \p data_tag within the communicator \p comm. */ int starpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm); /** Similar to starpu_mpi_issend(), but take a priority \p prio. */ int starpu_mpi_issend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm); /** Perform a synchronous-mode, non-blocking send of \p data_handle to the node \p dest using the message tag \p data_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. */ int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg); /** Similar to starpu_mpi_issend_detached(), but take a priority \p prio. */ int starpu_mpi_issend_detached_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, void (*callback)(void *), void *arg); /** Return when the operation identified by request \p req is complete. The value of \p status cannot be NULL, use the predefined value MPI_STATUS_IGNORE to ignore the status. */ int starpu_mpi_wait(starpu_mpi_req *req, MPI_Status *status); /** 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. */ int starpu_mpi_test(starpu_mpi_req *req, int *flag, MPI_Status *status); /** Block the caller until all group members of the communicator \p comm have called it. */ int starpu_mpi_barrier(MPI_Comm comm); /** Wait until all StarPU tasks and communications for the given communicator are completed. */ int starpu_mpi_wait_for_all(MPI_Comm comm); /** Post a standard-mode, non blocking send of \p data_handle to the node \p dest using the message tag \p data_tag within the communicator \p comm. On completion, \p tag is unlocked. */ int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, starpu_tag_t tag); /** Similar to starpu_mpi_isend_detached_unlock_tag(), but take a priority \p prio. */ int starpu_mpi_isend_detached_unlock_tag_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, starpu_tag_t tag); /** Post a nonblocking receive in \p data_handle from the node \p source using the message tag \p data_tag within the communicator \p comm. On completion, \p tag is unlocked. */ int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm, starpu_tag_t tag); /** Post \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 data_tag within the n-th communicator of the array \p comm. On completion of the all the requests, \p tag is unlocked. */ int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, starpu_mpi_tag_t *data_tag, MPI_Comm *comm, starpu_tag_t tag); /** Similar to starpu_mpi_isend_array_detached_unlock_tag(), but take a priority \p prio. */ int starpu_mpi_isend_array_detached_unlock_tag_prio(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, starpu_mpi_tag_t *data_tag, int *prio, MPI_Comm *comm, starpu_tag_t tag); /** Post \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 data_tag within the n-th communicator of the array \p comm. On completion of the all the requests, \p tag is unlocked. */ int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, starpu_mpi_tag_t *data_tag, MPI_Comm *comm, starpu_tag_t tag); typedef int (*starpu_mpi_datatype_allocate_func_t)(starpu_data_handle_t, MPI_Datatype *); typedef void (*starpu_mpi_datatype_free_func_t)(MPI_Datatype *); /** Register functions to create and free a MPI datatype for the given handle. Similar to starpu_mpi_interface_datatype_register(). 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. */ 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); /** Register functions to create and free a MPI datatype for the given interface id. Similar to starpu_mpi_datatype_register(). 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. */ int starpu_mpi_interface_datatype_register(enum starpu_data_interface_id id, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func); /** Unregister the MPI datatype functions stored for the interface of the given handle. */ int starpu_mpi_datatype_unregister(starpu_data_handle_t handle); /** Unregister the MPI datatype functions stored for the interface of the given interface id. Similar to starpu_mpi_datatype_unregister(). */ int starpu_mpi_interface_datatype_unregister(enum starpu_data_interface_id id); /** @} */ /** @name Communication Cache @{ */ /** Return 1 if the communication cache is enabled, 0 otherwise */ int starpu_mpi_cache_is_enabled(); /** If \p enabled is 1, enable the communication cache. Otherwise, clean the cache if it was enabled and disable it. */ int starpu_mpi_cache_set(int enabled); /** 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). */ void starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle); /** 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). */ void starpu_mpi_cache_flush_all_data(MPI_Comm comm); /** 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. */ int starpu_mpi_cached_receive(starpu_data_handle_t data_handle); /** * If \p data is already available in the reception cache, return 1 * If \p data is NOT available in the reception cache, add it to the * cache and return 0 * Return 0 if the communication cache is not enabled */ int starpu_mpi_cached_receive_set(starpu_data_handle_t data); /** * Remove \p data from the reception cache */ void starpu_mpi_cached_receive_clear(starpu_data_handle_t data); /** 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. */ int starpu_mpi_cached_send(starpu_data_handle_t data_handle, int dest); /** * If \p data is already available in the emission cache for node * \p dest, return 1 * If \p data is NOT available in the emission cache for node \p dest, * add it to the cache and return 0 * Return 0 if the communication cache is not enabled */ int starpu_mpi_cached_send_set(starpu_data_handle_t data, int dest); /** * Remove \p data from the emission cache */ void starpu_mpi_cached_send_clear(starpu_data_handle_t data); /** @} */ /** @name MPI Insert Task \anchor MPIInsertTask @{ */ /** 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. */ #define STARPU_MPI_PER_NODE -2 /** 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. */ void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle, starpu_mpi_tag_t data_tag, int rank, MPI_Comm comm); /** Register to MPI a StarPU data handle with the given tag, rank and the MPI communicator \c MPI_COMM_WORLD. It also automatically clears the MPI communication cache when unregistering the data. */ #define starpu_mpi_data_register(data_handle, data_tag, rank) starpu_mpi_data_register_comm(data_handle, data_tag, rank, MPI_COMM_WORLD) /** 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. */ void starpu_mpi_data_set_tag(starpu_data_handle_t handle, starpu_mpi_tag_t data_tag); /** Symbol kept for backward compatibility. Call function starpu_mpi_data_set_tag() */ #define starpu_data_set_tag starpu_mpi_data_set_tag /** 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. */ void starpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Comm comm); /** Register to MPI a StarPU data handle with the given rank and the MPI communicator \c MPI_COMM_WORLD. No tag will be defined. It also automatically clears the MPI communication cache when unregistering the data. */ #define starpu_mpi_data_set_rank(handle, rank) starpu_mpi_data_set_rank_comm(handle, rank, MPI_COMM_WORLD) /** Symbol kept for backward compatibility. Call function starpu_mpi_data_set_rank() */ #define starpu_data_set_rank starpu_mpi_data_set_rank /** Return the rank of the given data. */ int starpu_mpi_data_get_rank(starpu_data_handle_t handle); /** Symbol kept for backward compatibility. Call function starpu_mpi_data_get_rank() */ #define starpu_data_get_rank starpu_mpi_data_get_rank /** Return the tag of the given data. */ starpu_mpi_tag_t starpu_mpi_data_get_tag(starpu_data_handle_t handle); /** Symbol kept for backward compatibility. Call function starpu_mpi_data_get_tag() */ #define starpu_data_get_tag starpu_mpi_data_get_tag /** 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). */ int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...); /** Call starpu_mpi_task_insert(). Symbol kept for backward compatibility. */ int starpu_mpi_insert_task(MPI_Comm comm, struct starpu_codelet *codelet, ...); /** Create a task corresponding to \p codelet with the following given arguments. The argument list must be zero-terminated. The function performs the first two steps of the function starpu_mpi_task_insert(), i.e. submitting the MPI communications needed before the execution of the task, and the creation of the task on one node. 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. */ struct starpu_task *starpu_mpi_task_build(MPI_Comm comm, struct starpu_codelet *codelet, ...); /** MUST be called after a call to starpu_mpi_task_build(), with the SAME list of arguments. Perform the fourth -- last -- step of the algorithm described in starpu_mpi_task_insert(). */ int starpu_mpi_task_post_build(MPI_Comm comm, struct starpu_codelet *codelet, ...); /** 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. */ void starpu_mpi_get_data_on_node(MPI_Comm comm, starpu_data_handle_t data_handle, int node); /** 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. */ void starpu_mpi_get_data_on_node_detached(MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg); /** Transfer data \p data_handle to all MPI nodes, sending it from its owner if needed. All nodes have to call the function. */ void starpu_mpi_get_data_on_all_nodes_detached(MPI_Comm comm, starpu_data_handle_t data_handle); /** Submit migration of the data onto the \p new_rank MPI node. This means both submitting the transfer of the data to node \p new_rank if it hasn't been submitted already, and setting the home node of the data to the new node. Further data transfers submitted 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 at the same point of tasks submissions. This also flushes the cache for this data to avoid incoherencies. */ void starpu_mpi_data_migrate(MPI_Comm comm, starpu_data_handle_t handle, int new_rank); /** @} */ /** @name Node Selection Policy \anchor MPINodeSelectionPolicy @{ */ /** Define the current policy */ #define STARPU_MPI_NODE_SELECTION_CURRENT_POLICY -1 /** Define the policy in which the selected node is the one having the most data in ::STARPU_R mode */ #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); /** Register a new policy which can then be used when there is several nodes owning data in ::STARPU_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 */ int starpu_mpi_node_selection_register_policy(starpu_mpi_select_node_policy_func_t policy_func); /** Unregister a previously registered policy. */ int starpu_mpi_node_selection_unregister_policy(int policy); /** Return the current policy used to select the node which will execute the codelet */ int starpu_mpi_node_selection_get_current_policy(); /** 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 ::STARPU_R mode so as to minimize the amount of data to be transfered. */ int starpu_mpi_node_selection_set_current_policy(int policy); /** @} */ /** @name Collective Operations \anchor MPICollectiveOperations @{ */ /** Perform a reduction on the given data \p handle. All nodes send the data to its owner node which will perform a reduction. */ void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle); /** Similar to starpu_mpi_redux_data, but take a priority \p prio. */ void starpu_mpi_redux_data_prio(MPI_Comm comm, starpu_data_handle_t data_handle, int prio); /** 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. */ 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); /** 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. */ 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_pre_submit_hook_register(void (*f)(struct starpu_task *)); int starpu_mpi_pre_submit_hook_unregister(); /** @} */ #ifdef __cplusplus } #endif #endif // STARPU_USE_MPI #endif // __STARPU_MPI_H__ starpu-1.3.9+dfsg/mpi/include/starpu_mpi_lb.h000066400000000000000000000024171413463044200212070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_LOAD_BALANCER_H__ #define __STARPU_MPI_LOAD_BALANCER_H__ #include #ifdef __cplusplus extern "C" { #endif struct starpu_mpi_lb_conf { void (*get_neighbors)(int **neighbor_ids, int *nneighbors); void (*get_data_unit_to_migrate)(starpu_data_handle_t **handle_unit, int *nhandles, int dst_node); }; /* Inits the load balancer's environment with the load policy provided by the * user */ void starpu_mpi_lb_init(const char *lb_policy_name, struct starpu_mpi_lb_conf *); void starpu_mpi_lb_shutdown(); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_LOAD_BALANCER_H__ starpu-1.3.9+dfsg/mpi/libstarpumpi.pc.in000066400000000000000000000021211413463044200202070ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/src/000077500000000000000000000000001413463044200153365ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/src/Makefile.am000066400000000000000000000102071413463044200173720ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-notests.mk 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) $(NMAD_CFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(FXT_LIBS) $(MAGMA_LIBS) $(NMAD_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) $(NMAD_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_task_insert.h \ starpu_mpi_init.h \ mpi/starpu_mpi_early_data.h \ mpi/starpu_mpi_early_request.h \ mpi/starpu_mpi_sync_data.h \ mpi/starpu_mpi_comm.h \ mpi/starpu_mpi_tag.h \ mpi/starpu_mpi_driver.h \ mpi/starpu_mpi_mpi_backend.h \ nmad/starpu_mpi_nmad_backend.h \ load_balancer/policy/data_movements_interface.h \ load_balancer/policy/load_data_interface.h \ load_balancer/policy/load_balancer_policy.h libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ starpu_mpi.c \ starpu_mpi_req.c \ starpu_mpi_coop_sends.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_fortran.c \ starpu_mpi_task_insert_fortran.c \ starpu_mpi_init.c \ nmad/starpu_mpi_nmad.c \ nmad/starpu_mpi_nmad_backend.c \ mpi/starpu_mpi_mpi.c \ mpi/starpu_mpi_mpi_backend.c \ mpi/starpu_mpi_early_data.c \ mpi/starpu_mpi_early_request.c \ mpi/starpu_mpi_sync_data.c \ mpi/starpu_mpi_comm.c \ mpi/starpu_mpi_tag.c \ load_balancer/policy/data_movements_interface.c \ load_balancer/policy/load_data_interface.c \ load_balancer/policy/load_heat_propagation.c \ load_balancer/load_balancer.c starpu-1.3.9+dfsg/mpi/src/Makefile.in000066400000000000000000001516651413463044200174210ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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_req.lo starpu_mpi_coop_sends.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_fortran.lo starpu_mpi_task_insert_fortran.lo \ starpu_mpi_init.lo starpu_mpi_nmad.lo \ starpu_mpi_nmad_backend.lo starpu_mpi_mpi.lo \ starpu_mpi_mpi_backend.lo starpu_mpi_early_data.lo \ starpu_mpi_early_request.lo starpu_mpi_sync_data.lo \ starpu_mpi_comm.lo starpu_mpi_tag.lo \ data_movements_interface.lo load_data_interface.lo \ load_heat_propagation.lo load_balancer.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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/data_movements_interface.Plo \ ./$(DEPDIR)/load_balancer.Plo \ ./$(DEPDIR)/load_data_interface.Plo \ ./$(DEPDIR)/load_heat_propagation.Plo \ ./$(DEPDIR)/starpu_mpi.Plo ./$(DEPDIR)/starpu_mpi_cache.Plo \ ./$(DEPDIR)/starpu_mpi_cache_stats.Plo \ ./$(DEPDIR)/starpu_mpi_collective.Plo \ ./$(DEPDIR)/starpu_mpi_comm.Plo \ ./$(DEPDIR)/starpu_mpi_coop_sends.Plo \ ./$(DEPDIR)/starpu_mpi_datatype.Plo \ ./$(DEPDIR)/starpu_mpi_early_data.Plo \ ./$(DEPDIR)/starpu_mpi_early_request.Plo \ ./$(DEPDIR)/starpu_mpi_fortran.Plo \ ./$(DEPDIR)/starpu_mpi_helper.Plo \ ./$(DEPDIR)/starpu_mpi_init.Plo ./$(DEPDIR)/starpu_mpi_mpi.Plo \ ./$(DEPDIR)/starpu_mpi_mpi_backend.Plo \ ./$(DEPDIR)/starpu_mpi_nmad.Plo \ ./$(DEPDIR)/starpu_mpi_nmad_backend.Plo \ ./$(DEPDIR)/starpu_mpi_private.Plo \ ./$(DEPDIR)/starpu_mpi_req.Plo \ ./$(DEPDIR)/starpu_mpi_select_node.Plo \ ./$(DEPDIR)/starpu_mpi_stats.Plo \ ./$(DEPDIR)/starpu_mpi_sync_data.Plo \ ./$(DEPDIR)/starpu_mpi_tag.Plo \ ./$(DEPDIR)/starpu_mpi_task_insert.Plo \ ./$(DEPDIR)/starpu_mpi_task_insert_fortran.Plo 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 \ $(top_srcdir)/starpu-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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) $(NMAD_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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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) $(NMAD_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) $(NMAD_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_task_insert.h \ starpu_mpi_init.h \ mpi/starpu_mpi_early_data.h \ mpi/starpu_mpi_early_request.h \ mpi/starpu_mpi_sync_data.h \ mpi/starpu_mpi_comm.h \ mpi/starpu_mpi_tag.h \ mpi/starpu_mpi_driver.h \ mpi/starpu_mpi_mpi_backend.h \ nmad/starpu_mpi_nmad_backend.h \ load_balancer/policy/data_movements_interface.h \ load_balancer/policy/load_data_interface.h \ load_balancer/policy/load_balancer_policy.h libstarpumpi_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ starpu_mpi.c \ starpu_mpi_req.c \ starpu_mpi_coop_sends.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_fortran.c \ starpu_mpi_task_insert_fortran.c \ starpu_mpi_init.c \ nmad/starpu_mpi_nmad.c \ nmad/starpu_mpi_nmad_backend.c \ mpi/starpu_mpi_mpi.c \ mpi/starpu_mpi_mpi_backend.c \ mpi/starpu_mpi_early_data.c \ mpi/starpu_mpi_early_request.c \ mpi/starpu_mpi_sync_data.c \ mpi/starpu_mpi_comm.c \ mpi/starpu_mpi_tag.c \ load_balancer/policy/data_movements_interface.c \ load_balancer/policy/load_data_interface.c \ load_balancer/policy/load_heat_propagation.c \ load_balancer/load_balancer.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-notests.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/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.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}; \ } 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)/data_movements_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_balancer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_data_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_heat_propagation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_cache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_cache_stats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_collective.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_comm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_coop_sends.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_datatype.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_early_data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_early_request.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_fortran.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_helper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_mpi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_mpi_backend.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_nmad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_nmad_backend.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_private.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_req.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_select_node.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_stats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_sync_data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_tag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_task_insert.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_mpi_task_insert_fortran.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 $@ $< starpu_mpi_nmad.lo: nmad/starpu_mpi_nmad.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 starpu_mpi_nmad.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_nmad.Tpo -c -o starpu_mpi_nmad.lo `test -f 'nmad/starpu_mpi_nmad.c' || echo '$(srcdir)/'`nmad/starpu_mpi_nmad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_nmad.Tpo $(DEPDIR)/starpu_mpi_nmad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nmad/starpu_mpi_nmad.c' object='starpu_mpi_nmad.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 starpu_mpi_nmad.lo `test -f 'nmad/starpu_mpi_nmad.c' || echo '$(srcdir)/'`nmad/starpu_mpi_nmad.c starpu_mpi_nmad_backend.lo: nmad/starpu_mpi_nmad_backend.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 starpu_mpi_nmad_backend.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_nmad_backend.Tpo -c -o starpu_mpi_nmad_backend.lo `test -f 'nmad/starpu_mpi_nmad_backend.c' || echo '$(srcdir)/'`nmad/starpu_mpi_nmad_backend.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_nmad_backend.Tpo $(DEPDIR)/starpu_mpi_nmad_backend.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nmad/starpu_mpi_nmad_backend.c' object='starpu_mpi_nmad_backend.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 starpu_mpi_nmad_backend.lo `test -f 'nmad/starpu_mpi_nmad_backend.c' || echo '$(srcdir)/'`nmad/starpu_mpi_nmad_backend.c starpu_mpi_mpi.lo: mpi/starpu_mpi_mpi.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 starpu_mpi_mpi.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_mpi.Tpo -c -o starpu_mpi_mpi.lo `test -f 'mpi/starpu_mpi_mpi.c' || echo '$(srcdir)/'`mpi/starpu_mpi_mpi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_mpi.Tpo $(DEPDIR)/starpu_mpi_mpi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_mpi.c' object='starpu_mpi_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) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_mpi_mpi.lo `test -f 'mpi/starpu_mpi_mpi.c' || echo '$(srcdir)/'`mpi/starpu_mpi_mpi.c starpu_mpi_mpi_backend.lo: mpi/starpu_mpi_mpi_backend.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 starpu_mpi_mpi_backend.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_mpi_backend.Tpo -c -o starpu_mpi_mpi_backend.lo `test -f 'mpi/starpu_mpi_mpi_backend.c' || echo '$(srcdir)/'`mpi/starpu_mpi_mpi_backend.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_mpi_backend.Tpo $(DEPDIR)/starpu_mpi_mpi_backend.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_mpi_backend.c' object='starpu_mpi_mpi_backend.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 starpu_mpi_mpi_backend.lo `test -f 'mpi/starpu_mpi_mpi_backend.c' || echo '$(srcdir)/'`mpi/starpu_mpi_mpi_backend.c starpu_mpi_early_data.lo: mpi/starpu_mpi_early_data.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 starpu_mpi_early_data.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_early_data.Tpo -c -o starpu_mpi_early_data.lo `test -f 'mpi/starpu_mpi_early_data.c' || echo '$(srcdir)/'`mpi/starpu_mpi_early_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_early_data.Tpo $(DEPDIR)/starpu_mpi_early_data.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_early_data.c' object='starpu_mpi_early_data.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 starpu_mpi_early_data.lo `test -f 'mpi/starpu_mpi_early_data.c' || echo '$(srcdir)/'`mpi/starpu_mpi_early_data.c starpu_mpi_early_request.lo: mpi/starpu_mpi_early_request.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 starpu_mpi_early_request.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_early_request.Tpo -c -o starpu_mpi_early_request.lo `test -f 'mpi/starpu_mpi_early_request.c' || echo '$(srcdir)/'`mpi/starpu_mpi_early_request.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_early_request.Tpo $(DEPDIR)/starpu_mpi_early_request.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_early_request.c' object='starpu_mpi_early_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) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_mpi_early_request.lo `test -f 'mpi/starpu_mpi_early_request.c' || echo '$(srcdir)/'`mpi/starpu_mpi_early_request.c starpu_mpi_sync_data.lo: mpi/starpu_mpi_sync_data.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 starpu_mpi_sync_data.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_sync_data.Tpo -c -o starpu_mpi_sync_data.lo `test -f 'mpi/starpu_mpi_sync_data.c' || echo '$(srcdir)/'`mpi/starpu_mpi_sync_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_sync_data.Tpo $(DEPDIR)/starpu_mpi_sync_data.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_sync_data.c' object='starpu_mpi_sync_data.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 starpu_mpi_sync_data.lo `test -f 'mpi/starpu_mpi_sync_data.c' || echo '$(srcdir)/'`mpi/starpu_mpi_sync_data.c starpu_mpi_comm.lo: mpi/starpu_mpi_comm.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 starpu_mpi_comm.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_comm.Tpo -c -o starpu_mpi_comm.lo `test -f 'mpi/starpu_mpi_comm.c' || echo '$(srcdir)/'`mpi/starpu_mpi_comm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_comm.Tpo $(DEPDIR)/starpu_mpi_comm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_comm.c' object='starpu_mpi_comm.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 starpu_mpi_comm.lo `test -f 'mpi/starpu_mpi_comm.c' || echo '$(srcdir)/'`mpi/starpu_mpi_comm.c starpu_mpi_tag.lo: mpi/starpu_mpi_tag.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 starpu_mpi_tag.lo -MD -MP -MF $(DEPDIR)/starpu_mpi_tag.Tpo -c -o starpu_mpi_tag.lo `test -f 'mpi/starpu_mpi_tag.c' || echo '$(srcdir)/'`mpi/starpu_mpi_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_mpi_tag.Tpo $(DEPDIR)/starpu_mpi_tag.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi/starpu_mpi_tag.c' object='starpu_mpi_tag.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 starpu_mpi_tag.lo `test -f 'mpi/starpu_mpi_tag.c' || echo '$(srcdir)/'`mpi/starpu_mpi_tag.c data_movements_interface.lo: load_balancer/policy/data_movements_interface.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 data_movements_interface.lo -MD -MP -MF $(DEPDIR)/data_movements_interface.Tpo -c -o data_movements_interface.lo `test -f 'load_balancer/policy/data_movements_interface.c' || echo '$(srcdir)/'`load_balancer/policy/data_movements_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_movements_interface.Tpo $(DEPDIR)/data_movements_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='load_balancer/policy/data_movements_interface.c' object='data_movements_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) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_movements_interface.lo `test -f 'load_balancer/policy/data_movements_interface.c' || echo '$(srcdir)/'`load_balancer/policy/data_movements_interface.c load_data_interface.lo: load_balancer/policy/load_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) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT load_data_interface.lo -MD -MP -MF $(DEPDIR)/load_data_interface.Tpo -c -o load_data_interface.lo `test -f 'load_balancer/policy/load_data_interface.c' || echo '$(srcdir)/'`load_balancer/policy/load_data_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/load_data_interface.Tpo $(DEPDIR)/load_data_interface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='load_balancer/policy/load_data_interface.c' object='load_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) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o load_data_interface.lo `test -f 'load_balancer/policy/load_data_interface.c' || echo '$(srcdir)/'`load_balancer/policy/load_data_interface.c load_heat_propagation.lo: load_balancer/policy/load_heat_propagation.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 load_heat_propagation.lo -MD -MP -MF $(DEPDIR)/load_heat_propagation.Tpo -c -o load_heat_propagation.lo `test -f 'load_balancer/policy/load_heat_propagation.c' || echo '$(srcdir)/'`load_balancer/policy/load_heat_propagation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/load_heat_propagation.Tpo $(DEPDIR)/load_heat_propagation.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='load_balancer/policy/load_heat_propagation.c' object='load_heat_propagation.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 load_heat_propagation.lo `test -f 'load_balancer/policy/load_heat_propagation.c' || echo '$(srcdir)/'`load_balancer/policy/load_heat_propagation.c load_balancer.lo: load_balancer/load_balancer.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 load_balancer.lo -MD -MP -MF $(DEPDIR)/load_balancer.Tpo -c -o load_balancer.lo `test -f 'load_balancer/load_balancer.c' || echo '$(srcdir)/'`load_balancer/load_balancer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/load_balancer.Tpo $(DEPDIR)/load_balancer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='load_balancer/load_balancer.c' object='load_balancer.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 load_balancer.lo `test -f 'load_balancer/load_balancer.c' || echo '$(srcdir)/'`load_balancer/load_balancer.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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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 -f ./$(DEPDIR)/data_movements_interface.Plo -rm -f ./$(DEPDIR)/load_balancer.Plo -rm -f ./$(DEPDIR)/load_data_interface.Plo -rm -f ./$(DEPDIR)/load_heat_propagation.Plo -rm -f ./$(DEPDIR)/starpu_mpi.Plo -rm -f ./$(DEPDIR)/starpu_mpi_cache.Plo -rm -f ./$(DEPDIR)/starpu_mpi_cache_stats.Plo -rm -f ./$(DEPDIR)/starpu_mpi_collective.Plo -rm -f ./$(DEPDIR)/starpu_mpi_comm.Plo -rm -f ./$(DEPDIR)/starpu_mpi_coop_sends.Plo -rm -f ./$(DEPDIR)/starpu_mpi_datatype.Plo -rm -f ./$(DEPDIR)/starpu_mpi_early_data.Plo -rm -f ./$(DEPDIR)/starpu_mpi_early_request.Plo -rm -f ./$(DEPDIR)/starpu_mpi_fortran.Plo -rm -f ./$(DEPDIR)/starpu_mpi_helper.Plo -rm -f ./$(DEPDIR)/starpu_mpi_init.Plo -rm -f ./$(DEPDIR)/starpu_mpi_mpi.Plo -rm -f ./$(DEPDIR)/starpu_mpi_mpi_backend.Plo -rm -f ./$(DEPDIR)/starpu_mpi_nmad.Plo -rm -f ./$(DEPDIR)/starpu_mpi_nmad_backend.Plo -rm -f ./$(DEPDIR)/starpu_mpi_private.Plo -rm -f ./$(DEPDIR)/starpu_mpi_req.Plo -rm -f ./$(DEPDIR)/starpu_mpi_select_node.Plo -rm -f ./$(DEPDIR)/starpu_mpi_stats.Plo -rm -f ./$(DEPDIR)/starpu_mpi_sync_data.Plo -rm -f ./$(DEPDIR)/starpu_mpi_tag.Plo -rm -f ./$(DEPDIR)/starpu_mpi_task_insert.Plo -rm -f ./$(DEPDIR)/starpu_mpi_task_insert_fortran.Plo -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 -f ./$(DEPDIR)/data_movements_interface.Plo -rm -f ./$(DEPDIR)/load_balancer.Plo -rm -f ./$(DEPDIR)/load_data_interface.Plo -rm -f ./$(DEPDIR)/load_heat_propagation.Plo -rm -f ./$(DEPDIR)/starpu_mpi.Plo -rm -f ./$(DEPDIR)/starpu_mpi_cache.Plo -rm -f ./$(DEPDIR)/starpu_mpi_cache_stats.Plo -rm -f ./$(DEPDIR)/starpu_mpi_collective.Plo -rm -f ./$(DEPDIR)/starpu_mpi_comm.Plo -rm -f ./$(DEPDIR)/starpu_mpi_coop_sends.Plo -rm -f ./$(DEPDIR)/starpu_mpi_datatype.Plo -rm -f ./$(DEPDIR)/starpu_mpi_early_data.Plo -rm -f ./$(DEPDIR)/starpu_mpi_early_request.Plo -rm -f ./$(DEPDIR)/starpu_mpi_fortran.Plo -rm -f ./$(DEPDIR)/starpu_mpi_helper.Plo -rm -f ./$(DEPDIR)/starpu_mpi_init.Plo -rm -f ./$(DEPDIR)/starpu_mpi_mpi.Plo -rm -f ./$(DEPDIR)/starpu_mpi_mpi_backend.Plo -rm -f ./$(DEPDIR)/starpu_mpi_nmad.Plo -rm -f ./$(DEPDIR)/starpu_mpi_nmad_backend.Plo -rm -f ./$(DEPDIR)/starpu_mpi_private.Plo -rm -f ./$(DEPDIR)/starpu_mpi_req.Plo -rm -f ./$(DEPDIR)/starpu_mpi_select_node.Plo -rm -f ./$(DEPDIR)/starpu_mpi_stats.Plo -rm -f ./$(DEPDIR)/starpu_mpi_sync_data.Plo -rm -f ./$(DEPDIR)/starpu_mpi_tag.Plo -rm -f ./$(DEPDIR)/starpu_mpi_task_insert.Plo -rm -f ./$(DEPDIR)/starpu_mpi_task_insert_fortran.Plo -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 install-exec-am \ install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles 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 --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -cat /dev/null @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) # 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.3.9+dfsg/mpi/src/load_balancer/000077500000000000000000000000001413463044200201045ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/src/load_balancer/load_balancer.c000066400000000000000000000113021413463044200230130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "policy/load_balancer_policy.h" #if defined(STARPU_USE_MPI_MPI) static struct load_balancer_policy *defined_policy = NULL; typedef void (*_post_exec_hook_func_t)(struct starpu_task *task, unsigned sched_ctx_id); static _post_exec_hook_func_t saved_post_exec_hook[STARPU_NMAX_SCHED_CTXS]; static void post_exec_hook_wrapper(struct starpu_task *task, unsigned sched_ctx_id) { //fprintf(stderr,"I am called ! \n"); if (defined_policy && defined_policy->finished_task_entry_point) defined_policy->finished_task_entry_point(); if (saved_post_exec_hook[sched_ctx_id]) saved_post_exec_hook[sched_ctx_id](task, sched_ctx_id); } static struct load_balancer_policy *predefined_policies[] = { &load_heat_propagation_policy, NULL }; void starpu_mpi_lb_init(const char *lb_policy_name, struct starpu_mpi_lb_conf *itf) { int ret; const char *policy_name = starpu_getenv("STARPU_MPI_LB"); if (!policy_name) policy_name = lb_policy_name; if (!policy_name || (strcmp(policy_name, "help") == 0)) { _STARPU_MSG("Warning : load balancing is disabled for this run.\n"); _STARPU_MSG("Use the STARPU_MPI_LB = environment variable to use a load balancer.\n"); _STARPU_MSG("Available load balancers :\n"); struct load_balancer_policy **policy; for(policy=predefined_policies ; *policy!=NULL ; policy++) { struct load_balancer_policy *p = *policy; fprintf(stderr," - %s\n", p->policy_name); } return; } if (policy_name) { struct load_balancer_policy **policy; for(policy=predefined_policies ; *policy!=NULL ; policy++) { struct load_balancer_policy *p = *policy; if (p->policy_name) { if (strcmp(policy_name, p->policy_name) == 0) { /* we found a policy with the requested name */ defined_policy = p; break; } } } } if (!defined_policy) { _STARPU_MSG("Error : no load balancer with the name %s. Load balancing will be disabled for this run.\n", policy_name); return; } ret = defined_policy->init(itf); if (ret != 0) { _STARPU_MSG("Error (%d) in %s->init: invalid starpu_mpi_lb_conf. Load balancing will be disabled for this run.\n", ret, defined_policy->policy_name); return; } /* starpu_register_hook(submitted_task, defined_policy->submitted_task_entry_point); */ if (defined_policy->submitted_task_entry_point) starpu_mpi_pre_submit_hook_register(defined_policy->submitted_task_entry_point); /* starpu_register_hook(finished_task, defined_policy->finished_task_entry_point); */ if (defined_policy->finished_task_entry_point) { int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct starpu_sched_policy *sched_policy = starpu_sched_ctx_get_sched_policy(i); if (sched_policy) { _STARPU_DEBUG("Setting post_exec_hook for scheduling context %d %s (%d)\n", i, sched_policy->policy_name, STARPU_NMAX_SCHED_CTXS); saved_post_exec_hook[i] = sched_policy->post_exec_hook; sched_policy->post_exec_hook = post_exec_hook_wrapper; } else saved_post_exec_hook[i] = NULL; } } return; } void starpu_mpi_lb_shutdown() { if (!defined_policy) return; int ret = defined_policy->deinit(); if (ret != 0) { _STARPU_MSG("Error (%d) in %s->deinit\n", ret, defined_policy->policy_name); return; } /* starpu_unregister_hook(submitted_task, defined_policy->submitted_task_entry_point); */ if (defined_policy->submitted_task_entry_point) starpu_mpi_pre_submit_hook_unregister(); /* starpu_unregister_hook(finished_task, defined_policy->finished_task_entry_point); */ if (defined_policy->finished_task_entry_point) { int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { if (saved_post_exec_hook[i]) { struct starpu_sched_policy *sched_policy = starpu_sched_ctx_get_sched_policy(i); sched_policy->post_exec_hook = saved_post_exec_hook[i]; saved_post_exec_hook[i] = NULL; } } } defined_policy = NULL; } #endif /* STARPU_USE_MPI_MPI */ starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/000077500000000000000000000000001413463044200214035ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/data_movements_interface.c000066400000000000000000000220021413463044200265710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "data_movements_interface.h" #if defined(STARPU_USE_MPI_MPI) starpu_mpi_tag_t **data_movements_get_ref_tags_table(starpu_data_handle_t handle) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); if (dm_interface->tags) return &dm_interface->tags; else return NULL; } int **data_movements_get_ref_ranks_table(starpu_data_handle_t handle) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); if (dm_interface->ranks) return &dm_interface->ranks; else return NULL; } starpu_mpi_tag_t *data_movements_get_tags_table(starpu_data_handle_t handle) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return dm_interface->tags; } int *data_movements_get_ranks_table(starpu_data_handle_t handle) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return dm_interface->ranks; } int data_movements_get_size_tables(starpu_data_handle_t handle) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return dm_interface->size; } int data_movements_reallocate_tables(starpu_data_handle_t handle, int size) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); if (dm_interface->size) { STARPU_ASSERT(dm_interface->tags); free(dm_interface->tags); dm_interface->tags = NULL; STARPU_ASSERT(dm_interface->ranks); free(dm_interface->ranks); dm_interface->ranks = NULL; } else { STARPU_ASSERT(!dm_interface->tags); STARPU_ASSERT(!dm_interface->ranks); } dm_interface->size = size; if (dm_interface->size) { _STARPU_MPI_MALLOC(dm_interface->tags, size*sizeof(*dm_interface->tags)); _STARPU_MPI_MALLOC(dm_interface->ranks, size*sizeof(*dm_interface->ranks)); } return 0 ; } static void data_movements_register_data_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct data_movements_interface *local_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, node); local_interface->size = dm_interface->size; if (node == home_node) { local_interface->tags = dm_interface->tags; local_interface->ranks = dm_interface->ranks; } else { local_interface->tags = NULL; local_interface->ranks = NULL; } } } static starpu_ssize_t data_movements_allocate_data_on_node(void *data_interface, unsigned node) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) data_interface; starpu_mpi_tag_t *addr_tags; int *addr_ranks; starpu_ssize_t requested_memory_tags = dm_interface->size * sizeof(starpu_mpi_tag_t); starpu_ssize_t requested_memory_ranks = dm_interface->size * sizeof(int); addr_tags = (starpu_mpi_tag_t*) starpu_malloc_on_node(node, requested_memory_tags); if (!addr_tags) goto fail_tags; addr_ranks = (int*) starpu_malloc_on_node(node, requested_memory_ranks); if (!addr_ranks) goto fail_ranks; /* update the data properly in consequence */ dm_interface->tags = addr_tags; dm_interface->ranks = addr_ranks; return requested_memory_tags+requested_memory_ranks; fail_ranks: starpu_free_on_node(node, (uintptr_t) addr_tags, requested_memory_tags); fail_tags: return -ENOMEM; } static void data_movements_free_data_on_node(void *data_interface, unsigned node) { struct data_movements_interface *dm_interface = (struct data_movements_interface *) data_interface; starpu_ssize_t requested_memory_tags = dm_interface->size * sizeof(starpu_mpi_tag_t); starpu_ssize_t requested_memory_ranks = dm_interface->size * sizeof(int); starpu_free_on_node(node, (uintptr_t) dm_interface->tags, requested_memory_tags); starpu_free_on_node(node, (uintptr_t) dm_interface->ranks, requested_memory_ranks); } static size_t data_movements_get_size(starpu_data_handle_t handle) { size_t size; struct data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); size = (dm_interface->size * sizeof(starpu_mpi_tag_t)) + (dm_interface->size * sizeof(int)) + sizeof(int); return size; } static uint32_t data_movements_footprint(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(data_movements_get_size(handle), 0); } static int data_movements_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 data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, node); *count = data_movements_get_size(handle); if (ptr != NULL) { char *data; starpu_malloc_flags((void**) &data, *count, 0); assert(data); *ptr = data; memcpy(data, &dm_interface->size, sizeof(int)); if (dm_interface->size) { memcpy(data+sizeof(int), dm_interface->tags, (dm_interface->size*sizeof(starpu_mpi_tag_t))); memcpy(data+sizeof(int)+(dm_interface->size*sizeof(starpu_mpi_tag_t)), dm_interface->ranks, dm_interface->size*sizeof(int)); } } return 0; } static int data_movements_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 data_movements_interface *dm_interface = (struct data_movements_interface *) starpu_data_get_interface_on_node(handle, node); int size = 0; memcpy(&size, data, sizeof(int)); STARPU_ASSERT(count == (2 * size * sizeof(int)) + sizeof(int)); data_movements_reallocate_tables(handle, size); if (dm_interface->size) { memcpy(dm_interface->tags, data+sizeof(int), dm_interface->size*sizeof(starpu_mpi_tag_t)); memcpy(dm_interface->ranks, data+sizeof(int)+(dm_interface->size*sizeof(starpu_mpi_tag_t)), dm_interface->size*sizeof(int)); } return 0; } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct data_movements_interface *src_data_movements = src_interface; struct data_movements_interface *dst_data_movements = dst_interface; int ret = 0; if (starpu_interface_copy((uintptr_t) src_data_movements->tags, 0, src_node, (uintptr_t) dst_data_movements->tags, 0, dst_node, src_data_movements->size*sizeof(starpu_mpi_tag_t), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t) src_data_movements->ranks, 0, src_node, (uintptr_t) dst_data_movements->ranks, 0, dst_node, src_data_movements->size*sizeof(int), async_data)) ret = -EAGAIN; return ret; } static const struct starpu_data_copy_methods data_movements_copy_methods = { .any_to_any = copy_any_to_any }; static struct starpu_data_interface_ops interface_data_movements_ops = { .register_data_handle = data_movements_register_data_handle, .allocate_data_on_node = data_movements_allocate_data_on_node, .free_data_on_node = data_movements_free_data_on_node, .copy_methods = &data_movements_copy_methods, .get_size = data_movements_get_size, .footprint = data_movements_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct data_movements_interface), .to_pointer = NULL, .pack_data = data_movements_pack_data, .unpack_data = data_movements_unpack_data, .describe = NULL }; void data_movements_data_register(starpu_data_handle_t *handleptr, unsigned home_node, int *ranks, starpu_mpi_tag_t *tags, int size) { struct data_movements_interface data_movements = { .tags = tags, .ranks = ranks, .size = size }; if (interface_data_movements_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_data_movements_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, &data_movements, &interface_data_movements_ops); } #endif starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/data_movements_interface.h000066400000000000000000000036611413463044200266100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /** @file */ #ifndef __DATA_MOVEMENTS_INTERFACE_H #define __DATA_MOVEMENTS_INTERFACE_H /** interface for data_movements */ struct data_movements_interface { /** Data tags table */ starpu_mpi_tag_t *tags; /** Ranks table (where to move the corresponding data) */ int *ranks; /** Size of the tables */ int size; }; void data_movements_data_register(starpu_data_handle_t *handle, unsigned home_node, int *ranks, starpu_mpi_tag_t *tags, int size); starpu_mpi_tag_t **data_movements_get_ref_tags_table(starpu_data_handle_t handle); int **data_movements_get_ref_ranks_table(starpu_data_handle_t handle); int data_movements_reallocate_tables(starpu_data_handle_t handle, int size); starpu_mpi_tag_t *data_movements_get_tags_table(starpu_data_handle_t handle); int *data_movements_get_ranks_table(starpu_data_handle_t handle); int data_movements_get_size_tables(starpu_data_handle_t handle); #define DATA_MOVEMENTS_GET_SIZE_TABLES(interface) (((struct data_movements_interface *)(interface))->size) #define DATA_MOVEMENTS_GET_TAGS_TABLE(interface) (((struct data_movements_interface *)(interface))->tags) #define DATA_MOVEMENTS_GET_RANKS_TABLE(interface) (((struct data_movements_interface *)(interface))->ranks) #endif /* __DATA_MOVEMENTS_INTERFACE_H */ starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/load_balancer_policy.h000066400000000000000000000032211413463044200256770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __LOAD_BALANCER_POLICY_H__ #define __LOAD_BALANCER_POLICY_H__ #include /** @file */ #ifdef __cplusplus extern "C" { #endif /** A load balancer consists in a collection of operations on a data * representing the load of the application (in terms of computation, memory, * whatever). StarPU allows several entry points for the user. The load * balancer allows the user to give its load balancing methods to be used on * these entry points of the runtime system. */ struct load_balancer_policy { int (*init)(struct starpu_mpi_lb_conf *); int (*deinit)(); void (*submitted_task_entry_point)(); void (*finished_task_entry_point)(); /** Name of the load balancing policy. The selection of the load balancer is * performed through the use of the STARPU_MPI_LB=name environment * variable. */ const char *policy_name; }; extern struct load_balancer_policy load_heat_propagation_policy; #ifdef __cplusplus } #endif #endif // __LOAD_BALANCER_POLICY_H__ starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/load_data_interface.c000066400000000000000000000203201413463044200254740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "load_data_interface.h" #if defined(STARPU_USE_MPI_MPI) int load_data_get_sleep_threshold(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return ld_interface->sleep_task_threshold; } int load_data_get_wakeup_threshold(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return ld_interface->wakeup_task_threshold; } int load_data_get_current_phase(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return ld_interface->phase; } int load_data_get_nsubmitted_tasks(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return ld_interface->nsubmitted_tasks; } int load_data_get_nfinished_tasks(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return ld_interface->nfinished_tasks; } int load_data_inc_nsubmitted_tasks(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); (ld_interface->nsubmitted_tasks)++; return 0; } int load_data_inc_nfinished_tasks(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); (ld_interface->nfinished_tasks)++; return 0; } int load_data_next_phase(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); ld_interface->phase++; return 0; } int load_data_update_elapsed_time(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); ld_interface->elapsed_time = starpu_timing_now() - ld_interface->start; return 0; } double load_data_get_elapsed_time(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return ld_interface->elapsed_time; } int load_data_update_wakeup_cond(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); int previous_threshold = ld_interface->wakeup_task_threshold; ld_interface->wakeup_task_threshold += (ld_interface->nsubmitted_tasks - previous_threshold) * ld_interface->wakeup_ratio; return 0; } int load_data_wakeup_cond(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return (ld_interface->wakeup_task_threshold > 0) && (ld_interface->nfinished_tasks == ld_interface->wakeup_task_threshold); } static void load_data_register_data_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { (void) home_node; struct load_data_interface *ld_interface = (struct load_data_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct load_data_interface *local_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, node); local_interface->start = ld_interface->start; local_interface->elapsed_time = ld_interface->elapsed_time; local_interface->phase = ld_interface->phase; local_interface->nsubmitted_tasks = ld_interface->nsubmitted_tasks; local_interface->nfinished_tasks = ld_interface->nsubmitted_tasks; local_interface->wakeup_task_threshold = ld_interface->wakeup_task_threshold; local_interface->wakeup_ratio = ld_interface->wakeup_ratio; local_interface->sleep_task_threshold = ld_interface->sleep_task_threshold; } } static starpu_ssize_t load_data_allocate_data_on_node(void *data_interface, unsigned node) { (void) data_interface; (void) node; return 0; } static void load_data_free_data_on_node(void *data_interface, unsigned node) { (void) data_interface; (void) node; } static size_t load_data_get_size(starpu_data_handle_t handle) { (void) handle; return sizeof(struct load_data_interface); } static uint32_t load_data_footprint(starpu_data_handle_t handle) { struct load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return starpu_hash_crc32c_be(ld_interface->start, starpu_hash_crc32c_be(ld_interface->elapsed_time, starpu_hash_crc32c_be(ld_interface->nsubmitted_tasks, starpu_hash_crc32c_be(ld_interface->sleep_task_threshold, ld_interface->wakeup_task_threshold)))); } static int load_data_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 load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, node); *count = load_data_get_size(handle); if (ptr != NULL) { char *data; starpu_malloc_flags((void**) &data, *count, 0); *ptr = data; memcpy(data, ld_interface, *count); } return 0; } static int load_data_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 load_data_interface *ld_interface = (struct load_data_interface *) starpu_data_get_interface_on_node(handle, node); STARPU_ASSERT(count == sizeof(struct load_data_interface)); memcpy(ld_interface, data, count); return 0; } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { (void) src_interface; (void) dst_interface; (void) src_node; (void) dst_node; (void) async_data; return 0; } static const struct starpu_data_copy_methods load_data_copy_methods = { .any_to_any = copy_any_to_any }; static struct starpu_data_interface_ops interface_load_data_ops = { .register_data_handle = load_data_register_data_handle, .allocate_data_on_node = load_data_allocate_data_on_node, .free_data_on_node = load_data_free_data_on_node, .copy_methods = &load_data_copy_methods, .get_size = load_data_get_size, .footprint = load_data_footprint, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct load_data_interface), .to_pointer = NULL, .pack_data = load_data_pack_data, .unpack_data = load_data_unpack_data, .describe = NULL }; void load_data_data_register(starpu_data_handle_t *handleptr, unsigned home_node, int sleep_task_threshold, double wakeup_ratio) { struct load_data_interface load_data = { .start = starpu_timing_now(), .elapsed_time = 0, .phase = 0, .nsubmitted_tasks = 0, .nfinished_tasks = 0, .sleep_task_threshold = sleep_task_threshold, .wakeup_task_threshold = 0, .wakeup_ratio = wakeup_ratio }; if (interface_load_data_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { interface_load_data_ops.interfaceid = starpu_data_interface_get_next_id(); } starpu_data_register(handleptr, home_node, &load_data, &interface_load_data_ops); } #endif starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/load_data_interface.h000066400000000000000000000054311413463044200255070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /** @file */ #ifndef __LOAD_DATA_INTERFACE_H #define __LOAD_DATA_INTERFACE_H /** interface for load_data */ struct load_data_interface { /** Starting time of the execution */ double start; /** Elapsed time until the start time and the time when event "launch a load * balancing phase" is triggered */ double elapsed_time; /** Current submission phase, i.e how many balanced steps have already * happened so far. */ int phase; /** Number of currently submitted tasks */ int nsubmitted_tasks; /** Number of currently finished tasks */ int nfinished_tasks; /** Task threshold to sleep the submission thread */ int sleep_task_threshold; /** Task threshold to wake-up the submission thread */ int wakeup_task_threshold; /** Ratio of submitted tasks to wait for completion before waking up the * submission thread */ double wakeup_ratio; }; void load_data_data_register(starpu_data_handle_t *handle, unsigned home_node, int sleep_task_threshold, double wakeup_ratio); int load_data_get_sleep_threshold(starpu_data_handle_t handle); int load_data_get_wakeup_threshold(starpu_data_handle_t handle); int load_data_get_current_phase(starpu_data_handle_t handle); int load_data_get_nsubmitted_tasks(starpu_data_handle_t handle); int load_data_get_nfinished_tasks(starpu_data_handle_t handle); int load_data_inc_nsubmitted_tasks(starpu_data_handle_t handle); int load_data_inc_nfinished_tasks(starpu_data_handle_t handle); int load_data_next_phase(starpu_data_handle_t handle); int load_data_update_elapsed_time(starpu_data_handle_t handle); double load_data_get_elapsed_time(starpu_data_handle_t handle); int load_data_update_wakeup_cond(starpu_data_handle_t handle); int load_data_wakeup_cond(starpu_data_handle_t handle); #define LOAD_DATA_GET_NSUBMITTED_TASKS(interface) (((struct load_data_interface *)(interface))->nsubmitted_tasks) #define LOAD_DATA_GET_SLEEP_THRESHOLD(interface) (((struct load_data_interface *)(interface))->sleep_task_threshold) #define LOAD_DATA_GET_WAKEUP_THRESHOLD(interface) (((struct load_data_interface *)(interface))->wakeup_task_threshold) #endif /* __LOAD_DATA_INTERFACE_H */ starpu-1.3.9+dfsg/mpi/src/load_balancer/policy/load_heat_propagation.c000066400000000000000000000534541413463044200261050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "load_balancer_policy.h" #include "data_movements_interface.h" #include "load_data_interface.h" #include #if defined(STARPU_USE_MPI_MPI) static starpu_mpi_tag_t TAG_LOAD(int n) { return ((starpu_mpi_tag_t) n+1) << 24; } static starpu_mpi_tag_t TAG_MOV(int n) { return ((starpu_mpi_tag_t) n+1) << 20; } /* Hash table of local pieces of data that has been moved out of the local MPI * node by the load balancer. All of these pieces of data must be migrated back * to the local node at the end of the execution. */ struct moved_data_entry { UT_hash_handle hh; starpu_data_handle_t handle; }; static struct moved_data_entry *mdh = NULL; static starpu_pthread_mutex_t load_data_mutex; static starpu_pthread_cond_t load_data_cond; /* MPI infos */ static int my_rank; static int world_size; /* Number of neighbours of the local MPI node and their IDs. These are given by * the get_neighbors() method, and thus can be easily changed. */ static int *neighbor_ids = NULL; static int nneighbors = 0; /* Local load data */ static starpu_data_handle_t *load_data_handle = NULL; static starpu_data_handle_t *load_data_handle_cpy = NULL; /* Load data of neighbours */ static starpu_data_handle_t *neighbor_load_data_handles = NULL; /* Table which contains a data_movements_handle for each MPI node of * MPI_COMM_WORLD. Since all the MPI nodes must be advised of any data * movement, this table will be used to perform communications of data * movements handles following an all-to-all model. */ static starpu_data_handle_t *data_movements_handles = NULL; /* Load balancer interface which contains the application-specific methods for * the load balancer to use. */ static struct starpu_mpi_lb_conf *user_itf = NULL; static double time_threshold = 20000; /****************************************************************************** * Balancing * *****************************************************************************/ /* Decides which data has to move where, and fills the * data_movements_handles[my_rank] data handle from that. * In data : * - local load_data_handle * - nneighbors * - neighbor_ids[nneighbors] * - neighbor_load_data_handles[nneighbors] * Out data : * - data_movements_handles[my_rank] */ static void balance(starpu_data_handle_t load_data_cpy) { int less_loaded = -1; int n; double ref_elapsed_time; double my_elapsed_time = load_data_get_elapsed_time(load_data_cpy); /* Search for the less loaded neighbor */ ref_elapsed_time = my_elapsed_time; for (n = 0; n < nneighbors; n++) { double elapsed_time = load_data_get_elapsed_time(neighbor_load_data_handles[n]); if (ref_elapsed_time > elapsed_time) { //fprintf(stderr,"Node%d: ref local time %lf vs neighbour%d time %lf\n", my_rank, ref_elapsed_time, neighbor_ids[n], elapsed_time); less_loaded = neighbor_ids[n]; ref_elapsed_time = elapsed_time; } } /* We found it */ if (less_loaded >= 0) { _STARPU_DEBUG("Less loaded found on node %d : %d\n", my_rank, less_loaded); double diff_time = my_elapsed_time - ref_elapsed_time; /* If the difference is higher than a time threshold, we move * one data to the less loaded neighbour. */ /* TODO: How to decide the time threshold ? */ if ((time_threshold > 0) && (diff_time >= time_threshold)) { starpu_data_handle_t *handles = NULL; int nhandles = 0; user_itf->get_data_unit_to_migrate(&handles, &nhandles, less_loaded); data_movements_reallocate_tables(data_movements_handles[my_rank], nhandles); if (nhandles) { starpu_mpi_tag_t *tags = data_movements_get_tags_table(data_movements_handles[my_rank]); int *ranks = data_movements_get_ranks_table(data_movements_handles[my_rank]); for (n = 0; n < nhandles; n++) { tags[n] = starpu_mpi_data_get_tag(handles[n]); ranks[n] = less_loaded; } free(handles); } } else data_movements_reallocate_tables(data_movements_handles[my_rank], 0); } else data_movements_reallocate_tables(data_movements_handles[my_rank], 0); } static void exchange_load_data_infos(starpu_data_handle_t load_data_cpy) { int i; /* Allocate all requests and status for point-to-point communications */ starpu_mpi_req load_send_req[nneighbors]; starpu_mpi_req load_recv_req[nneighbors]; MPI_Status load_send_status[nneighbors]; MPI_Status load_recv_status[nneighbors]; int flag; /* Send the local load data to neighbour nodes, and receive the remote load * data from neighbour nodes */ for (i = 0; i < nneighbors; i++) { //_STARPU_DEBUG("[node %d] sending and receiving with %i-th neighbor %i\n", my_rank, i, neighbor_ids[i]); starpu_mpi_isend(load_data_cpy, &load_send_req[i], neighbor_ids[i], TAG_LOAD(my_rank), MPI_COMM_WORLD); starpu_mpi_irecv(neighbor_load_data_handles[i], &load_recv_req[i], neighbor_ids[i], TAG_LOAD(neighbor_ids[i]), MPI_COMM_WORLD); } /* Wait for completion of all send requests */ for (i = 0; i < nneighbors; i++) { flag = 0; while (!flag) starpu_mpi_test(&load_send_req[i], &flag, &load_send_status[i]); } /* Wait for completion of all receive requests */ for (i = 0; i < nneighbors; i++) { flag = 0; while (!flag) starpu_mpi_test(&load_recv_req[i], &flag, &load_recv_status[i]); } } static void exchange_data_movements_infos() { int i; /* Allocate all requests and status for point-to-point communications */ starpu_mpi_req data_movements_send_req[world_size]; starpu_mpi_req data_movements_recv_req[world_size]; MPI_Status data_movements_send_status[world_size]; MPI_Status data_movements_recv_status[world_size]; int flag; /* Send the new ranks of local data to all other nodes, and receive the new * ranks of all remote data from all other nodes */ for (i = 0; i < world_size; i++) { if (i != my_rank) { //_STARPU_DEBUG("[node %d] Send and receive data movement with %d\n", my_rank, i); starpu_mpi_isend(data_movements_handles[my_rank], &data_movements_send_req[i], i, TAG_MOV(my_rank), MPI_COMM_WORLD); starpu_mpi_irecv(data_movements_handles[i], &data_movements_recv_req[i], i, TAG_MOV(i), MPI_COMM_WORLD); } } /* Wait for completion of all send requests */ for (i = 0; i < world_size; i++) { if (i != my_rank) { //fprintf(stderr,"Wait for sending data movement of %d to %d\n", my_rank, i); flag = 0; while (!flag) starpu_mpi_test(&data_movements_send_req[i], &flag, &data_movements_send_status[i]); } } /* Wait for completion of all receive requests */ for (i = 0; i < world_size; i++) { if (i != my_rank) { //fprintf(stderr,"Wait for recieving data movement from %d on %d\n", i, my_rank); flag = 0; while (!flag) starpu_mpi_test(&data_movements_recv_req[i], &flag, &data_movements_recv_status[i]); } } } static void update_data_ranks() { int i,j; /* Update the new ranks for all concerned data */ for (i = 0; i < world_size; i++) { int ndata_to_update = data_movements_get_size_tables(data_movements_handles[i]); if (ndata_to_update) { //fprintf(stderr,"Update %d data from table %d on node %d\n", ndata_to_update, i, my_rank); for (j = 0; j < ndata_to_update; j++) { starpu_data_handle_t handle = _starpu_mpi_tag_get_data_handle_from_tag((data_movements_get_tags_table(data_movements_handles[i]))[j]); STARPU_ASSERT(handle); int dst_rank = (data_movements_get_ranks_table(data_movements_handles[i]))[j]; /* Save the fact that the data has been moved out of this node */ if (i == my_rank) { struct moved_data_entry *md; _STARPU_MPI_MALLOC(md, sizeof(struct moved_data_entry)); md->handle = handle; HASH_ADD_PTR(mdh, handle, md); } else if (dst_rank == my_rank) { /* The data has been moved out, and now is moved back, so * update the state of the moved_data hash table to reflect * this change */ struct moved_data_entry *md = NULL; HASH_FIND_PTR(mdh, &handle, md); if (md) { HASH_DEL(mdh, md); free(md); } } //if (i == my_rank) //{ // if (dst_rank != my_rank) // fprintf(stderr,"Move data %p (tag %d) from node %d to node %d\n", handle, (data_movements_get_tags_table(data_movements_handles[i]))[j], my_rank, dst_rank); // else // fprintf(stderr,"Bring back data %p (tag %d) from node %d on node %d\n", handle, (data_movements_get_tags_table(data_movements_handles[i]))[j], starpu_mpi_data_get_rank(handle), my_rank); //} _STARPU_DEBUG("Call of starpu_mpi_get_data_on_node(%"PRIi64",%d) on node %d\n", starpu_mpi_data_get_tag(handle), dst_rank, my_rank); /* Migrate the data handle */ starpu_mpi_get_data_on_node_detached(MPI_COMM_WORLD, handle, dst_rank, NULL, NULL); _STARPU_DEBUG("New rank (%d) of data %"PRIi64" upgraded on node %d\n", dst_rank, starpu_mpi_data_get_tag(handle), my_rank); starpu_mpi_data_set_rank_comm(handle, dst_rank, MPI_COMM_WORLD); } } } } static void clean_balance() { int i; starpu_mpi_cache_flush(MPI_COMM_WORLD, *load_data_handle_cpy); for (i = 0; i < nneighbors; i++) starpu_mpi_cache_flush(MPI_COMM_WORLD, neighbor_load_data_handles[i]); for (i = 0; i < world_size; i++) starpu_mpi_cache_flush(MPI_COMM_WORLD, data_movements_handles[i]); } /* Core function of the load balancer. Computes from the load_data_cpy handle a * load balancing of the work to come (if needed), perform the necessary data * communications and negociate with the other nodes the rebalancing. */ static void heat_balance(starpu_data_handle_t load_data_cpy) { /* Exchange load data handles with neighboring nodes */ exchange_load_data_infos(load_data_cpy); /* Determine if this node should sent data to other nodes : * which ones, how much data */ balance(load_data_cpy); /* Exchange data movements with neighboring nodes */ exchange_data_movements_infos(); /* Perform data movements */ update_data_ranks(); /* Clean the data handles to properly launch the next balance phase */ clean_balance(); } /****************************************************************************** * Heat Load Balancer Entry Points * *****************************************************************************/ static void submitted_task_heat(struct starpu_task *task) { load_data_inc_nsubmitted_tasks(*load_data_handle); //if (load_data_get_nsubmitted_tasks(*load_data_handle) > task->tag_id) //{ // fprintf(stderr,"Error : nsubmitted_tasks (%d) > tag_id (%lld) ! \n", load_data_get_nsubmitted_tasks(*load_data_handle), (long long int)task->tag_id); // STARPU_ASSERT(0); //} int phase = load_data_get_current_phase(*load_data_handle); /* Numbering of tasks in StarPU-MPI should be given by the application with * the STARPU_TAG_ONLY insert task option for now. */ /* TODO: Properly implement a solution for numbering tasks in StarPU-MPI */ if (((int)task->tag_id / load_data_get_sleep_threshold(*load_data_handle)) > phase) { STARPU_PTHREAD_MUTEX_LOCK(&load_data_mutex); load_data_update_wakeup_cond(*load_data_handle); //fprintf(stderr,"Node %d sleep on tag %lld\n", my_rank, (long long int)task->tag_id); //if (load_data_get_nsubmitted_tasks(*load_data_handle) < load_data_get_wakeup_threshold(*load_data_handle)) //{ // fprintf(stderr,"Error : nsubmitted_tasks (%d) lower than wakeup_threshold (%d) !\n", load_data_get_nsubmitted_tasks(*load_data_handle), load_data_get_wakeup_threshold(*load_data_handle)); // STARPU_ASSERT(0); //} if (load_data_get_wakeup_threshold(*load_data_handle) > load_data_get_nfinished_tasks(*load_data_handle)) STARPU_PTHREAD_COND_WAIT(&load_data_cond, &load_data_mutex); load_data_next_phase(*load_data_handle); /* Register a copy of the load data at this moment, to allow to compute * the heat balance while not locking the load data during the whole * balance step, which could cause all the workers to wait on the lock * to update the data. */ struct starpu_data_interface_ops *itf_load_data = starpu_data_get_interface_ops(*load_data_handle); void* itf_src = starpu_data_get_interface_on_node(*load_data_handle, STARPU_MAIN_RAM); void* itf_dst = starpu_data_get_interface_on_node(*load_data_handle_cpy, STARPU_MAIN_RAM); memcpy(itf_dst, itf_src, itf_load_data->interface_size); _STARPU_DEBUG("[node %d] Balance phase %d\n", my_rank, load_data_get_current_phase(*load_data_handle)); STARPU_PTHREAD_MUTEX_UNLOCK(&load_data_mutex); heat_balance(*load_data_handle_cpy); } } static void finished_task_heat() { //fprintf(stderr,"Try to decrement nsubmitted_tasks..."); STARPU_PTHREAD_MUTEX_LOCK(&load_data_mutex); load_data_inc_nfinished_tasks(*load_data_handle); //fprintf(stderr,"Decrement nsubmitted_tasks, now %d\n", load_data_get_nsubmitted_tasks(*load_data_handle)); if (load_data_wakeup_cond(*load_data_handle)) { //fprintf(stderr,"Wakeup ! nfinished_tasks = %d, wakeup_threshold = %d\n", load_data_get_nfinished_tasks(*load_data_handle), load_data_get_wakeup_threshold(*load_data_handle)); load_data_update_elapsed_time(*load_data_handle); STARPU_PTHREAD_COND_SIGNAL(&load_data_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&load_data_mutex); } else STARPU_PTHREAD_MUTEX_UNLOCK(&load_data_mutex); } /****************************************************************************** * Initialization / Deinitialization * *****************************************************************************/ static int init_heat(struct starpu_mpi_lb_conf *itf) { int i; int sleep_task_threshold; double wakeup_ratio; starpu_mpi_comm_size(MPI_COMM_WORLD, &world_size); starpu_mpi_comm_rank(MPI_COMM_WORLD, &my_rank); /* Immediately return if the starpu_mpi_lb_conf is invalid. */ if (!(itf && itf->get_neighbors && itf->get_data_unit_to_migrate)) { _STARPU_MSG("Error: struct starpu_mpi_lb_conf %p invalid\n", itf); return 1; } _STARPU_MPI_MALLOC(user_itf, sizeof(struct starpu_mpi_lb_conf)); memcpy(user_itf, itf, sizeof(struct starpu_mpi_lb_conf)); /* Get the neighbors of the local MPI node */ user_itf->get_neighbors(&neighbor_ids, &nneighbors); if (nneighbors == 0) { _STARPU_MSG("Error: Function get_neighbors returning 0 neighbor\n"); free(user_itf); user_itf = NULL; return 2; } /* The sleep threshold is deducted from the numbering of tasks by the * application. For example, with this threshold, the submission thread * will stop when a task for which the numbering is 2000 or above will be * submitted to StarPU-MPI. However, much less tasks can be really * submitted to the local MPI node: the sleeping of the submission threads * checks the numbering of the tasks, not how many tasks have been * submitted to the local MPI node, which are two different things. */ char *sleep_env = starpu_getenv("LB_HEAT_SLEEP_THRESHOLD"); if (sleep_env) sleep_task_threshold = atoi(sleep_env); else sleep_task_threshold = 2000; char *wakeup_env = starpu_getenv("LB_HEAT_WAKEUP_RATIO"); if (wakeup_env) wakeup_ratio = atof(wakeup_env); else wakeup_ratio = 0.5; char *time_env = starpu_getenv("LB_HEAT_TIME_THRESHOLD"); if (time_env) time_threshold = atoi(time_env); else time_threshold = 2000; STARPU_PTHREAD_MUTEX_INIT(&load_data_mutex, NULL); STARPU_PTHREAD_COND_INIT(&load_data_cond, NULL); /* Allocate, initialize and register all the data handles that will be * needed for the load balancer, to not reallocate them at each balance * step. */ /* Local load data */ _STARPU_MPI_CALLOC(load_data_handle, 1, sizeof(starpu_data_handle_t)); load_data_data_register(load_data_handle, STARPU_MAIN_RAM, sleep_task_threshold, wakeup_ratio); /* Copy of the local load data to enable parallel update of the load data * with communications to neighbor nodes */ _STARPU_MPI_CALLOC(load_data_handle_cpy, 1, sizeof(starpu_data_handle_t)); void *local_interface = starpu_data_get_interface_on_node(*load_data_handle, STARPU_MAIN_RAM); struct starpu_data_interface_ops *itf_load_data = starpu_data_get_interface_ops(*load_data_handle); starpu_data_register(load_data_handle_cpy, STARPU_MAIN_RAM, local_interface, itf_load_data); starpu_mpi_data_register(*load_data_handle_cpy, TAG_LOAD(my_rank), my_rank); /* Remote load data */ _STARPU_MPI_CALLOC(neighbor_load_data_handles, nneighbors, sizeof(starpu_data_handle_t)); for (i = 0; i < nneighbors; i++) { load_data_data_register(&neighbor_load_data_handles[i], STARPU_MAIN_RAM, sleep_task_threshold, wakeup_ratio); starpu_mpi_data_register(neighbor_load_data_handles[i], TAG_LOAD(neighbor_ids[i]), neighbor_ids[i]); } /* Data movements handles */ _STARPU_MPI_MALLOC(data_movements_handles, world_size*sizeof(starpu_data_handle_t)); for (i = 0; i < world_size; i++) { data_movements_data_register(&data_movements_handles[i], STARPU_MAIN_RAM, NULL, NULL, 0); starpu_mpi_data_register(data_movements_handles[i], TAG_MOV(i), i); } /* Hash table of moved data that will be brought back on the node at * termination time */ mdh = NULL; return 0; } /* Move back all the data that has been migrated out of this node at * denitialization time of the load balancer, to ensure the consistency with * the ranks of data originally registered by the application. */ static void move_back_data() { int i,j; /* Update the new ranks for all concerned data */ for (i = 0; i < world_size; i++) { /* In this case, each data_movements_handles contains the handles to move back on the specific node */ int ndata_to_update = data_movements_get_size_tables(data_movements_handles[i]); if (ndata_to_update) { _STARPU_DEBUG("Move back %d data from table %d on node %d\n", ndata_to_update, i, my_rank); for (j = 0; j < ndata_to_update; j++) { starpu_data_handle_t handle = _starpu_mpi_tag_get_data_handle_from_tag((data_movements_get_tags_table(data_movements_handles[i]))[j]); STARPU_ASSERT(handle); int dst_rank = (data_movements_get_ranks_table(data_movements_handles[i]))[j]; STARPU_ASSERT(i == dst_rank); if (i == my_rank) { /* The data is moved back, so update the state of the * moved_data hash table to reflect this change */ struct moved_data_entry *md = NULL; HASH_FIND_PTR(mdh, &handle, md); if (md) { HASH_DEL(mdh, md); free(md); } } //fprintf(stderr,"Call of starpu_mpi_get_data_on_node(%d,%d) on node %d\n", starpu_mpi_data_get_tag(handle), dst_rank, my_rank); /* Migrate the data handle */ starpu_mpi_get_data_on_node_detached(MPI_COMM_WORLD, handle, dst_rank, NULL, NULL); //fprintf(stderr,"New rank (%d) of data %d upgraded on node %d\n", dst_rank, starpu_mpi_data_get_tag(handle), my_rank); starpu_mpi_data_set_rank_comm(handle, dst_rank, MPI_COMM_WORLD); } } } } static int deinit_heat() { int i; if ((!user_itf) || (nneighbors == 0)) return 1; _STARPU_DEBUG("Shutting down heat lb policy\n"); unsigned int ndata_to_move_back = HASH_COUNT(mdh); if (ndata_to_move_back) { _STARPU_DEBUG("Move back %u data on node %d ..\n", ndata_to_move_back, my_rank); data_movements_reallocate_tables(data_movements_handles[my_rank], ndata_to_move_back); starpu_mpi_tag_t *tags = data_movements_get_tags_table(data_movements_handles[my_rank]); int *ranks = data_movements_get_ranks_table(data_movements_handles[my_rank]); int n = 0; struct moved_data_entry *md=NULL, *tmp=NULL; HASH_ITER(hh, mdh, md, tmp) { tags[n] = starpu_mpi_data_get_tag(md->handle); ranks[n] = my_rank; n++; } } else data_movements_reallocate_tables(data_movements_handles[my_rank], 0); exchange_data_movements_infos(); move_back_data(); /* This assert ensures that all nodes have properly gotten back all the * data that has been moven out of the node. */ STARPU_ASSERT(HASH_COUNT(mdh) == 0); free(mdh); mdh = NULL; starpu_data_unregister(*load_data_handle); free(load_data_handle); load_data_handle = NULL; starpu_mpi_cache_flush(MPI_COMM_WORLD, *load_data_handle_cpy); starpu_data_unregister(*load_data_handle_cpy); free(load_data_handle_cpy); load_data_handle_cpy = NULL; for (i = 0; i < nneighbors; i++) { starpu_mpi_cache_flush(MPI_COMM_WORLD, neighbor_load_data_handles[i]); starpu_data_unregister(neighbor_load_data_handles[i]); } free(neighbor_load_data_handles); neighbor_load_data_handles = NULL; nneighbors = 0; free(neighbor_ids); neighbor_ids = NULL; for (i = 0; i < world_size; i++) { starpu_mpi_cache_flush(MPI_COMM_WORLD, data_movements_handles[i]); data_movements_reallocate_tables(data_movements_handles[i], 0); starpu_data_unregister(data_movements_handles[i]); } free(data_movements_handles); data_movements_handles = NULL; STARPU_PTHREAD_MUTEX_DESTROY(&load_data_mutex); STARPU_PTHREAD_COND_DESTROY(&load_data_cond); free(user_itf); user_itf = NULL; return 0; } /****************************************************************************** * Policy * *****************************************************************************/ struct load_balancer_policy load_heat_propagation_policy = { .init = init_heat, .deinit = deinit_heat, .submitted_task_entry_point = submitted_task_heat, .finished_task_entry_point = finished_task_heat, .policy_name = "heat" }; #endif starpu-1.3.9+dfsg/mpi/src/mpi/000077500000000000000000000000001413463044200161235ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_comm.c000066400000000000000000000156371413463044200215010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017 Guillaume Beauchamp * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_MPI_MPI struct _starpu_mpi_comm { MPI_Comm comm; struct _starpu_mpi_envelope *envelope; MPI_Request request; int posted; #ifdef STARPU_SIMGRID MPI_Status status; starpu_pthread_queue_t queue; unsigned done; #endif }; struct _starpu_mpi_comm_hashtable { UT_hash_handle hh; MPI_Comm comm; }; /* Protect between comm addition from submitting tasks and MPI thread */ static starpu_pthread_rwlock_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_RWLOCK_INIT(&_starpu_mpi_comms_mutex, NULL); _starpu_mpi_comm_register(comm); } void _starpu_mpi_comm_shutdown() { 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); #ifdef STARPU_SIMGRID starpu_pthread_queue_unregister(&_starpu_mpi_thread_wait, &_comm->queue); starpu_pthread_queue_destroy(&_comm->queue); #endif free(_comm); } free(_starpu_mpi_comms); struct _starpu_mpi_comm_hashtable *entry=NULL, *tmp=NULL; HASH_ITER(hh, _starpu_mpi_comms_cache, entry, tmp) { HASH_DEL(_starpu_mpi_comms_cache, entry); free(entry); } STARPU_PTHREAD_RWLOCK_DESTROY(&_starpu_mpi_comms_mutex); } void _starpu_mpi_comm_register(MPI_Comm comm) { struct _starpu_mpi_comm_hashtable *found; STARPU_PTHREAD_RWLOCK_RDLOCK(&_starpu_mpi_comms_mutex); HASH_FIND(hh, _starpu_mpi_comms_cache, &comm, sizeof(MPI_Comm), found); STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_mpi_comms_mutex); if (found) { _STARPU_MPI_DEBUG(10, "comm %ld (%ld) already registered\n", (long int)comm, (long int)MPI_COMM_WORLD); return; } STARPU_PTHREAD_RWLOCK_WRLOCK(&_starpu_mpi_comms_mutex); HASH_FIND(hh, _starpu_mpi_comms_cache, &comm, sizeof(MPI_Comm), found); if (found) { _STARPU_MPI_DEBUG(10, "comm %ld (%ld) already registered in between\n", (long int)comm, (long int)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 %ld (%ld) number %d\n", (long int)comm, (long int)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); #ifdef STARPU_SIMGRID starpu_pthread_queue_init(&_comm->queue); starpu_pthread_queue_register(&_starpu_mpi_thread_wait, &_comm->queue); _comm->done = 0; #endif } STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_mpi_comms_mutex); } void _starpu_mpi_comm_post_recv() { int i; STARPU_PTHREAD_RWLOCK_RDLOCK(&_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 %ld\n", i, (long int)_comm->comm); _STARPU_MPI_COMM_FROM_DEBUG(_comm->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, MPI_ANY_SOURCE, _STARPU_MPI_TAG_ENVELOPE, (int64_t)_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); #ifdef STARPU_SIMGRID _starpu_mpi_simgrid_wait_req(&_comm->request, &_comm->status, &_comm->queue, &_comm->done); #endif _comm->posted = 1; } } STARPU_PTHREAD_RWLOCK_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_RWLOCK_RDLOCK(&_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 res = _starpu_mpi_simgrid_mpi_test(&_comm->done, &flag); memcpy(status, &_comm->status, sizeof(*status)); #else res = MPI_Test(&_comm->request, &flag, status); #endif 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_RWLOCK_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_RWLOCK_UNLOCK(&_starpu_mpi_comms_mutex); return 0; } } STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_mpi_comms_mutex); return 0; } void _starpu_mpi_comm_cancel_recv() { int i; STARPU_PTHREAD_RWLOCK_RDLOCK(&_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_Cancel(&_comm->request); #ifndef STARPU_SIMGRID { MPI_Status status; MPI_Wait(&_comm->request, &status); } #endif _comm->posted = 0; } } STARPU_PTHREAD_RWLOCK_UNLOCK(&_starpu_mpi_comms_mutex); } #endif /* STARPU_USE_MPI_MPI */ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_comm.h000066400000000000000000000024541413463044200214770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 STARPU_USE_MPI_MPI #include /** @file */ #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_comm_init(MPI_Comm comm); void _starpu_mpi_comm_shutdown(); 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_USE_MPI_MPI #endif // __STARPU_MPI_COMM_H__ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_driver.h000066400000000000000000000020201413463044200220240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_DRIVER_H__ #define __STARPU_MPI_DRIVER_H__ #include /** @file */ #ifdef STARPU_USE_MPI_MPI #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_driver_init(struct starpu_conf *conf); void _starpu_mpi_driver_shutdown(); #ifdef __cplusplus } #endif #endif // STARPU_USE_MPI_MPI #endif // __STARPU_MPI_DRIVER_H__ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_early_data.c000066400000000000000000000205231413463044200226410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_MPI_MPI /** the hashlist is on 2 levels, the first top level is indexed on (node, rank), the second lower level is indexed on the data tag */ struct _starpu_mpi_early_data_handle_hashlist { struct _starpu_mpi_early_data_handle_tag_hashlist *datahash; UT_hash_handle hh; struct _starpu_mpi_node node; }; /** 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=NULL, *tmp=NULL; HASH_ITER(hh, _starpu_mpi_early_data_handle_hashmap, current, tmp) { struct _starpu_mpi_early_data_handle_tag_hashlist *tag_current=NULL, *tag_tmp=NULL; HASH_ITER(hh, current->datahash, tag_current, tag_tmp) { _STARPU_MSG("Unexpected message with comm %ld source %d tag %ld\n", (long int)current->node.comm, current->node.rank, tag_current->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_shutdown(void) { struct _starpu_mpi_early_data_handle_hashlist *current=NULL, *tmp=NULL; HASH_ITER(hh, _starpu_mpi_early_data_handle_hashmap, current, tmp) { _STARPU_MPI_DEBUG(600, "Hash early_data with comm %ld source %d\n", (long int) current->node.comm, current->node.rank); struct _starpu_mpi_early_data_handle_tag_hashlist *tag_entry=NULL, *tag_tmp=NULL; HASH_ITER(hh, current->datahash, tag_entry, tag_tmp) { _STARPU_MPI_DEBUG(600, "Hash 2nd level with tag %ld\n", tag_entry->data_tag); STARPU_ASSERT(_starpu_mpi_early_data_handle_list_empty(&tag_entry->list)); HASH_DEL(current->datahash, tag_entry); free(tag_entry); } 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->node_tag.node.comm = comm; early_data_handle->node_tag.node.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 %ld source %d tag %ld\n", (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag); HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &node_tag->node, sizeof(struct _starpu_mpi_node), hashlist); if (hashlist == NULL) { _STARPU_MPI_DEBUG(600, "No entry for (comm %ld, source %d)\n", (long int)node_tag->node.comm, node_tag->node.rank); early_data_handle = NULL; } else { struct _starpu_mpi_early_data_handle_tag_hashlist *tag_hashlist; HASH_FIND(hh, hashlist->datahash, &node_tag->data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist); if (tag_hashlist == NULL) { _STARPU_MPI_DEBUG(600, "No entry for tag %ld\n", node_tag->data_tag); early_data_handle = NULL; } else if (_starpu_mpi_early_data_handle_list_empty(&tag_hashlist->list)) { _STARPU_MPI_DEBUG(600, "List empty for tag %ld\n", node_tag->data_tag); early_data_handle = NULL; } else { _starpu_mpi_early_data_handle_hashmap_count --; early_data_handle = _starpu_mpi_early_data_handle_list_pop_front(&tag_hashlist->list); } } _STARPU_MPI_DEBUG(60, "Found early_data_handle %p with comm %ld source %d tag %ld\n", early_data_handle, (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex); return early_data_handle; } struct _starpu_mpi_early_data_handle_tag_hashlist *_starpu_mpi_early_data_extract(struct _starpu_mpi_node_tag *node_tag) { struct _starpu_mpi_early_data_handle_hashlist *hashlist; struct _starpu_mpi_early_data_handle_tag_hashlist *tag_hashlist = NULL; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_data_handle_mutex); _STARPU_MPI_DEBUG(60, "Looking for hashlist for (comm %ld, source %d)\n", (long int)node_tag->node.comm, node_tag->node.rank); HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &node_tag->node, sizeof(struct _starpu_mpi_node), hashlist); if (hashlist) { _STARPU_MPI_DEBUG(60, "Looking for hashlist for (tag %ld)\n", node_tag->data_tag); HASH_FIND(hh, hashlist->datahash, &node_tag->data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist); if (tag_hashlist) { _starpu_mpi_early_data_handle_hashmap_count -= _starpu_mpi_early_data_handle_list_size(&tag_hashlist->list); HASH_DEL(hashlist->datahash, tag_hashlist); } } _STARPU_MPI_DEBUG(60, "Found hashlist %p for (comm %ld, source %d) and (tag %ld)\n", tag_hashlist, (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex); return tag_hashlist; } 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, "Adding early_data_handle %p with comm %ld source %d tag %ld (%p)\n", early_data_handle, (long int)early_data_handle->node_tag.node.comm, early_data_handle->node_tag.node.rank, early_data_handle->node_tag.data_tag, &early_data_handle->node_tag.node); struct _starpu_mpi_early_data_handle_hashlist *hashlist; HASH_FIND(hh, _starpu_mpi_early_data_handle_hashmap, &early_data_handle->node_tag.node, sizeof(struct _starpu_mpi_node), hashlist); if (hashlist == NULL) { _STARPU_MPI_MALLOC(hashlist, sizeof(struct _starpu_mpi_early_data_handle_hashlist)); hashlist->node = early_data_handle->node_tag.node; hashlist->datahash = NULL; HASH_ADD(hh, _starpu_mpi_early_data_handle_hashmap, node, sizeof(hashlist->node), hashlist); } struct _starpu_mpi_early_data_handle_tag_hashlist *tag_hashlist; HASH_FIND(hh, hashlist->datahash, &early_data_handle->node_tag.data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist); if (tag_hashlist == NULL) { _STARPU_MPI_MALLOC(tag_hashlist, sizeof(struct _starpu_mpi_early_data_handle_tag_hashlist)); tag_hashlist->data_tag = early_data_handle->node_tag.data_tag; HASH_ADD(hh, hashlist->datahash, data_tag, sizeof(tag_hashlist->data_tag), tag_hashlist); _starpu_mpi_early_data_handle_list_init(&tag_hashlist->list); } _starpu_mpi_early_data_handle_list_push_back(&tag_hashlist->list, early_data_handle); _starpu_mpi_early_data_handle_hashmap_count ++; STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_data_handle_mutex); } #endif // STARPU_USE_MPI_MPI starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_early_data.h000066400000000000000000000041711413463044200226470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include /** @file */ #ifdef STARPU_USE_MPI_MPI #ifdef __cplusplus extern "C" { #endif LIST_TYPE(_starpu_mpi_early_data_handle, starpu_data_handle_t handle; struct _starpu_mpi_req *req; void *buffer; size_t size; struct _starpu_mpi_node_tag node_tag; starpu_pthread_mutex_t req_mutex; starpu_pthread_cond_t req_cond; ); struct _starpu_mpi_early_data_handle_tag_hashlist { struct _starpu_mpi_early_data_handle_list list; UT_hash_handle hh; starpu_mpi_tag_t data_tag; }; struct _starpu_mpi_envelope; void _starpu_mpi_early_data_init(void); void _starpu_mpi_early_data_check_termination(void); void _starpu_mpi_early_data_shutdown(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); struct _starpu_mpi_early_data_handle_tag_hashlist *_starpu_mpi_early_data_extract(struct _starpu_mpi_node_tag *node_tag); #ifdef __cplusplus } #endif #endif /* STARPU_USE_MPI_MPI */ #endif /* __STARPU_MPI_EARLY_DATA_H__ */ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_early_request.c000066400000000000000000000147421413463044200234260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_MPI_MPI /** stores application requests for which data have not been received yet */ /** the hashlist is on 2 levels, the first top level is indexed on (node, rank), the second lower level is indexed on the data tag */ struct _starpu_mpi_early_request_hashlist { struct _starpu_mpi_early_request_tag_hashlist *datahash; UT_hash_handle hh; struct _starpu_mpi_node node; }; 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_shutdown() { struct _starpu_mpi_early_request_hashlist *entry=NULL, *tmp=NULL; HASH_ITER(hh, _starpu_mpi_early_request_hash, entry, tmp) { struct _starpu_mpi_early_request_tag_hashlist *tag_entry=NULL, *tag_tmp=NULL; HASH_ITER(hh, entry->datahash, tag_entry, tag_tmp) { STARPU_ASSERT(_starpu_mpi_req_list_empty(&tag_entry->list)); HASH_DEL(entry->datahash, tag_entry); free(tag_entry); } 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(starpu_mpi_tag_t 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; memset(&node_tag, 0, sizeof(struct _starpu_mpi_node_tag)); node_tag.node.comm = comm; node_tag.node.rank = source; node_tag.data_tag = data_tag; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_request_mutex); _STARPU_MPI_DEBUG(100, "Looking for early_request with comm %ld source %d tag %ld\n", (long int)node_tag.node.comm, node_tag.node.rank, node_tag.data_tag); HASH_FIND(hh, _starpu_mpi_early_request_hash, &node_tag.node, sizeof(struct _starpu_mpi_node), hashlist); if (hashlist == NULL) { found = NULL; } else { struct _starpu_mpi_early_request_tag_hashlist *tag_hashlist; HASH_FIND(hh, hashlist->datahash, &node_tag.data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist); if (tag_hashlist == NULL) { found = NULL; } else if (_starpu_mpi_req_list_empty(&tag_hashlist->list)) { found = NULL; } else { found = _starpu_mpi_req_list_pop_front(&tag_hashlist->list); _starpu_mpi_early_request_hash_count --; } } _STARPU_MPI_DEBUG(100, "Found early_request %p with comm %ld source %d tag %ld\n", found, (long int)node_tag.node.comm, node_tag.node.rank, node_tag.data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_request_mutex); return found; } struct _starpu_mpi_early_request_tag_hashlist *_starpu_mpi_early_request_extract(starpu_mpi_tag_t data_tag, int source, MPI_Comm comm) { struct _starpu_mpi_node_tag node_tag; struct _starpu_mpi_early_request_hashlist *hashlist; struct _starpu_mpi_early_request_tag_hashlist *tag_hashlist = NULL; memset(&node_tag, 0, sizeof(struct _starpu_mpi_node_tag)); node_tag.node.comm = comm; node_tag.node.rank = source; node_tag.data_tag = data_tag; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_mpi_early_request_mutex); _STARPU_MPI_DEBUG(100, "Looking for early_request with comm %ld source %d tag %ld\n", (long int)node_tag.node.comm, node_tag.node.rank, node_tag.data_tag); HASH_FIND(hh, _starpu_mpi_early_request_hash, &node_tag.node, sizeof(struct _starpu_mpi_node), hashlist); if (hashlist) { HASH_FIND(hh, hashlist->datahash, &node_tag.data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist); if (tag_hashlist) { _starpu_mpi_early_request_hash_count -= _starpu_mpi_req_list_size(&tag_hashlist->list); HASH_DEL(hashlist->datahash, tag_hashlist); } } _STARPU_MPI_DEBUG(100, "Found hashlist %p with comm %ld source %d tag %ld\n", hashlist, (long int)node_tag.node.comm, node_tag.node.rank, node_tag.data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_request_mutex); return tag_hashlist; } 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 %ld source %d tag %ld in the application request hashmap\n", req, (long int)req->node_tag.node.comm, req->node_tag.node.rank, req->node_tag.data_tag); struct _starpu_mpi_early_request_hashlist *hashlist; HASH_FIND(hh, _starpu_mpi_early_request_hash, &req->node_tag.node, sizeof(struct _starpu_mpi_node), hashlist); if (hashlist == NULL) { _STARPU_MPI_MALLOC(hashlist, sizeof(struct _starpu_mpi_early_request_hashlist)); hashlist->node = req->node_tag.node; hashlist->datahash = NULL; HASH_ADD(hh, _starpu_mpi_early_request_hash, node, sizeof(hashlist->node), hashlist); } struct _starpu_mpi_early_request_tag_hashlist *tag_hashlist; HASH_FIND(hh, hashlist->datahash, &req->node_tag.data_tag, sizeof(starpu_mpi_tag_t), tag_hashlist); if (tag_hashlist == NULL) { _STARPU_MPI_MALLOC(tag_hashlist, sizeof(struct _starpu_mpi_early_request_tag_hashlist)); tag_hashlist->data_tag = req->node_tag.data_tag; HASH_ADD(hh, hashlist->datahash, data_tag, sizeof(tag_hashlist->data_tag), tag_hashlist); _starpu_mpi_req_list_init(&tag_hashlist->list); } _starpu_mpi_req_list_push_back(&tag_hashlist->list, req); _starpu_mpi_early_request_hash_count ++; STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_early_request_mutex); } #endif // STARPU_USE_MPI_MPI starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_early_request.h000066400000000000000000000032541413463044200234270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef STARPU_USE_MPI_MPI #ifdef __cplusplus extern "C" { #endif struct _starpu_mpi_early_request_tag_hashlist { struct _starpu_mpi_req_list list; UT_hash_handle hh; starpu_mpi_tag_t data_tag; }; void _starpu_mpi_early_request_init(void); void _starpu_mpi_early_request_shutdown(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(starpu_mpi_tag_t data_tag, int source, MPI_Comm comm); struct _starpu_mpi_early_request_tag_hashlist *_starpu_mpi_early_request_extract(starpu_mpi_tag_t data_tag, int source, MPI_Comm comm); #ifdef __cplusplus } #endif #endif /* STARPU_USE_MPI_MPI */ #endif /* __STARPU_MPI_EARLY_REQUEST_H__ */ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_mpi.c000066400000000000000000002010121413463044200213130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017 Guillaume Beauchamp * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #include #include #include #ifdef STARPU_USE_MPI_MPI /* Number of ready requests to process before polling for completed requests */ static unsigned nready_process; /* Number of send requests to submit to MPI at the same time */ static unsigned ndetached_send; static void _starpu_mpi_add_sync_point_in_fxt(void); 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_MPI_VERBOSE static char *_starpu_mpi_request_type(enum _starpu_mpi_request_type request_type); #endif 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_recv_requests; static struct _starpu_mpi_req_prio_list ready_send_requests; /* The list of detached requests that have already been submitted to MPI */ static struct _starpu_mpi_req_list detached_requests; static unsigned detached_send_nrequests; static starpu_pthread_mutex_t detached_requests_mutex; /* Condition to wake up progression thread */ static starpu_pthread_cond_t progress_cond; /* Condition to wake up waiting for all current MPI requests to finish */ static starpu_pthread_cond_t barrier_cond; static starpu_pthread_mutex_t progress_mutex; #ifndef STARPU_SIMGRID static starpu_pthread_t progress_thread; #endif static int running = 0; /* Provides synchronization between an early request, a sync request, and an early data handle: * we keep it held while checking and posting one to prevent the other. * This is to be taken always before the progress_mutex. */ static starpu_pthread_mutex_t early_data_mutex; /* Driver taken by StarPU-MPI to process tasks when there is no requests to * handle instead of polling endlessly */ static struct starpu_driver *mpi_driver = NULL; static int mpi_driver_call_freq = 0; static int mpi_driver_task_freq = 0; #ifdef STARPU_SIMGRID static int wait_counter; static starpu_pthread_cond_t wait_counter_cond; static starpu_pthread_mutex_t wait_counter_mutex; starpu_pthread_wait_t _starpu_mpi_thread_wait; starpu_pthread_queue_t _starpu_mpi_thread_dontsleep; #endif /* 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, ready_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); ready_requests += value; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex_ready_requests); } extern struct _starpu_mpi_req *_starpu_mpi_irecv_common(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t 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); #ifdef STARPU_SIMGRID #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 && !defined(smpi_process_set_user_data) extern void smpi_process_set_user_data(void *); #endif #endif #ifdef STARPU_USE_FXT static int trace_loop = 0; #endif /********************************************************/ /* */ /* 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; size_t size; }; void _starpu_mpi_submit_ready_request_inc(struct _starpu_mpi_req *req) { _STARPU_MPI_INC_POSTED_REQUESTS(1); _starpu_mpi_submit_ready_request(req); } void _starpu_mpi_coop_sends_build_tree(struct _starpu_mpi_coop_sends *coop_sends) { (void)coop_sends; /* TODO: turn them into redirects & forwards */ } void _starpu_mpi_submit_coop_sends(struct _starpu_mpi_coop_sends *coop_sends, int submit_control, int submit_data) { (void)submit_control; unsigned i, n = coop_sends->n; /* Note: coop_sends might disappear very very soon after last request is submitted */ for (i = 0; i < n; i++) { if (coop_sends->reqs_array[i]->request_type == SEND_REQ && submit_data) { _STARPU_MPI_DEBUG(0, "cooperative sends %p sending to %d\n", coop_sends, coop_sends->reqs_array[i]->node_tag.node.rank); _starpu_mpi_submit_ready_request(coop_sends->reqs_array[i]); } /* TODO: handle redirect requests */ } } 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 %"PRIi64" and type %s %d\n", req, req->node_tag.node.rank, req->node_tag.data_tag, _starpu_mpi_request_type(req->request_type), req->backend->is_internal_req); 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->backend->is_internal_req) { _starpu_mpi_datatype_allocate(req->data_handle, req); if (req->registered_datatype == 1) { req->count = 1; req->ptr = starpu_data_handle_to_pointer(req->data_handle, STARPU_MAIN_RAM); } else { STARPU_ASSERT(req->count); req->ptr = (void *)starpu_malloc_on_node_flags(STARPU_MAIN_RAM, req->count, 0); } STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); _STARPU_MPI_DEBUG(3, "Pushing internal starpu_mpi_irecv request %p type %s tag %"PRIi64" 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _starpu_mpi_req_list_push_front(&ready_recv_requests, req); _STARPU_MPI_INC_READY_REQUESTS(+1); /* inform the starpu mpi thread that the request has been pushed in the ready_requests list */ req->posted = 1; STARPU_PTHREAD_COND_BROADCAST(&req->backend->posted_cond); } else { STARPU_PTHREAD_MUTEX_LOCK(&early_data_mutex); /* 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); if (early_data_handle) { /* Got the early_data_handle */ STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_mutex); /* Case: a receive request for a data with the given tag and source has already been * posted to MPI 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.*/ _STARPU_MPI_DEBUG(3, "The RECV request %p with tag %"PRIi64" 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->backend->internal_req = early_data_handle->req; req->backend->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->size = early_data_handle->size; cb_args->req = req; _STARPU_MPI_DEBUG(3, "Calling data_acquire_cb on starpu_mpi_copy_cb..\n"); starpu_data_acquire_on_node_cb(early_data_handle->handle,STARPU_MAIN_RAM,STARPU_R,_starpu_mpi_early_data_cb,(void*) cb_args); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); } else { struct _starpu_mpi_req *sync_req = _starpu_mpi_sync_data_find(req->node_tag.data_tag, req->node_tag.node.rank, req->node_tag.node.comm); _STARPU_MPI_DEBUG(3, "----------> Looking for sync data for tag %"PRIi64" and src %d = %p\n", req->node_tag.data_tag, req->node_tag.node.rank, sync_req); if (sync_req) { /* Got the sync req */ STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_mutex); /* Case: we already received the send envelope, we can proceed with the receive */ req->sync = 1; _starpu_mpi_datatype_allocate(req->data_handle, req); if (req->registered_datatype == 1) { req->count = 1; req->ptr = starpu_data_handle_to_pointer(req->data_handle, STARPU_MAIN_RAM); } else { req->count = sync_req->count; STARPU_ASSERT(req->count); req->ptr = (void *)starpu_malloc_on_node_flags(STARPU_MAIN_RAM, req->count, 0); } STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); _starpu_mpi_req_list_push_front(&ready_recv_requests, req); _STARPU_MPI_INC_READY_REQUESTS(+1); /* Throw away the dumb request that was only used to know that we got the envelope */ _starpu_mpi_request_destroy(sync_req); } else { /* Case: no matching data has been received. Store the receive request as an early_request. */ _STARPU_MPI_DEBUG(3, "Adding the pending receive request %p (srcdst %d tag %"PRIi64") into the request hashmap\n", req, req->node_tag.node.rank, req->node_tag.data_tag); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); _starpu_mpi_early_request_enqueue(req); /* We have queued our early request, we can let the progression thread look at it */ STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_mutex); } } } } else { STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); if (req->request_type == SEND_REQ) _starpu_mpi_req_prio_list_push_front(&ready_send_requests, req); else _starpu_mpi_req_list_push_front(&ready_recv_requests, req); _STARPU_MPI_INC_READY_REQUESTS(+1); _STARPU_MPI_DEBUG(3, "Pushing new request %p type %s tag %"PRIi64" 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); } newer_requests = 1; STARPU_PTHREAD_COND_BROADCAST(&progress_cond); #ifdef STARPU_SIMGRID starpu_pthread_queue_signal(&_starpu_mpi_thread_dontsleep); #endif STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); _STARPU_MPI_LOG_OUT(); } void _starpu_mpi_req_willpost(struct _starpu_mpi_req *req STARPU_ATTRIBUTE_UNUSED) { _STARPU_MPI_INC_POSTED_REQUESTS(1); } #ifdef STARPU_SIMGRID int _starpu_mpi_simgrid_mpi_test(unsigned *done, int *flag) { *flag = 0; if (*done) { starpu_pthread_queue_signal(&_starpu_mpi_thread_dontsleep); *flag = 1; } return MPI_SUCCESS; } static void _starpu_mpi_simgrid_wait_req_func(void* arg) { struct _starpu_simgrid_mpi_req *sim_req = arg; int ret; STARPU_PTHREAD_MUTEX_LOCK(&wait_counter_mutex); wait_counter++; STARPU_PTHREAD_MUTEX_UNLOCK(&wait_counter_mutex); ret = MPI_Wait(sim_req->request, sim_req->status); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Wait returning %s", _starpu_mpi_get_mpi_error_code(ret)); *(sim_req->done) = 1; starpu_pthread_queue_broadcast(sim_req->queue); free(sim_req); STARPU_PTHREAD_MUTEX_LOCK(&wait_counter_mutex); if (--wait_counter == 0) STARPU_PTHREAD_COND_SIGNAL(&wait_counter_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&wait_counter_mutex); } void _starpu_mpi_simgrid_wait_req(MPI_Request *request, MPI_Status *status, starpu_pthread_queue_t *queue, unsigned *done) { struct _starpu_simgrid_mpi_req *sim_req; _STARPU_MPI_CALLOC(sim_req, 1, sizeof(struct _starpu_simgrid_mpi_req)); sim_req->request = request; sim_req->status = status; sim_req->queue = queue; sim_req->done = done; *done = 0; _starpu_simgrid_xbt_thread_create("wait for mpi transfer", _starpu_mpi_simgrid_wait_req_func, sim_req); } #endif /********************************************************/ /* */ /* 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 %"PRIi64" dst %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.node.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.node.comm, req->node_tag.node.rank, req->datatype, req->count); _STARPU_MPI_TRACE_ISEND_SUBMIT_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag, 0); if (req->sync == 0) { _STARPU_MPI_COMM_TO_DEBUG(req, req->count, req->datatype, req->node_tag.node.rank, _STARPU_MPI_TAG_DATA, req->node_tag.data_tag, req->node_tag.node.comm); req->ret = MPI_Isend(req->ptr, req->count, req->datatype, req->node_tag.node.rank, _STARPU_MPI_TAG_DATA, req->node_tag.node.comm, &req->backend->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.node.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.data_tag, req->node_tag.node.comm); req->ret = MPI_Issend(req->ptr, req->count, req->datatype, req->node_tag.node.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.node.comm, &req->backend->data_request); STARPU_MPI_ASSERT_MSG(req->ret == MPI_SUCCESS, "MPI_Issend returning %s", _starpu_mpi_get_mpi_error_code(req->ret)); } #ifdef STARPU_SIMGRID _starpu_mpi_simgrid_wait_req(&req->backend->data_request, &req->status_store, &req->queue, &req->done); #endif _STARPU_MPI_TRACE_ISEND_SUBMIT_END(req->node_tag.node.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->backend->req_mutex); req->submitted = 1; STARPU_PTHREAD_COND_BROADCAST(&req->backend->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); _starpu_mpi_handle_detached_request(req); _STARPU_MPI_LOG_OUT(); } void _starpu_mpi_isend_size_func(struct _starpu_mpi_req *req) { _starpu_mpi_datatype_allocate(req->data_handle, req); _STARPU_MPI_CALLOC(req->backend->envelope, 1,sizeof(struct _starpu_mpi_envelope)); req->backend->envelope->mode = _STARPU_MPI_ENVELOPE_DATA; req->backend->envelope->data_tag = req->node_tag.data_tag; req->backend->envelope->sync = req->sync; if (req->registered_datatype == 1) { int size, ret; req->count = 1; req->ptr = starpu_data_handle_to_pointer(req->data_handle, STARPU_MAIN_RAM); MPI_Type_size(req->datatype, &size); req->backend->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.node.rank); _STARPU_MPI_COMM_TO_DEBUG(req->backend->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->backend->envelope->data_tag, req->node_tag.node.comm); ret = MPI_Isend(req->backend->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.node.comm, &req->backend->size_req); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "when sending envelope, MPI_Isend returning %s", _starpu_mpi_get_mpi_error_code(ret)); } else { int ret; // Do not pack the data, just try to find out the size starpu_data_pack(req->data_handle, NULL, &(req->backend->envelope->size)); if (req->backend->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->backend->envelope->size, sizeof(req->count), "MPI_BYTE", req->node_tag.node.rank); req->count = req->backend->envelope->size; _STARPU_MPI_COMM_TO_DEBUG(req->backend->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->backend->envelope->data_tag, req->node_tag.node.comm); ret = MPI_Isend(req->backend->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.node.comm, &req->backend->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->backend->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->backend->envelope->size, sizeof(req->count), "MPI_BYTE", req->node_tag.node.rank); _STARPU_MPI_COMM_TO_DEBUG(req->backend->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->backend->envelope->data_tag, req->node_tag.node.comm); ret = MPI_Isend(req->backend->envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.node.comm, &req->backend->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->backend->envelope->size, "Calls to pack_data returned different sizes %ld != %ld", req->count, req->backend->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); } } /********************************************************/ /* */ /* receive functionalities */ /* */ /********************************************************/ void _starpu_mpi_irecv_size_func(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(0, "post MPI irecv request %p type %s tag %"PRIi64" 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _STARPU_MPI_TRACE_IRECV_SUBMIT_BEGIN(req->node_tag.node.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.node.rank); _STARPU_MPI_COMM_TO_DEBUG(_envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, _envelope->data_tag, req->node_tag.node.comm); req->ret = MPI_Send(_envelope, sizeof(struct _starpu_mpi_envelope), MPI_BYTE, req->node_tag.node.rank, _STARPU_MPI_TAG_ENVELOPE, req->node_tag.node.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.node.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.data_tag, req->node_tag.node.comm); req->ret = MPI_Irecv(req->ptr, req->count, req->datatype, req->node_tag.node.rank, _STARPU_MPI_TAG_SYNC_DATA, req->node_tag.node.comm, &req->backend->data_request); } else { _STARPU_MPI_COMM_FROM_DEBUG(req, req->count, req->datatype, req->node_tag.node.rank, _STARPU_MPI_TAG_DATA, req->node_tag.data_tag, req->node_tag.node.comm); req->ret = MPI_Irecv(req->ptr, req->count, req->datatype, req->node_tag.node.rank, _STARPU_MPI_TAG_DATA, req->node_tag.node.comm, &req->backend->data_request); } #ifdef STARPU_SIMGRID _starpu_mpi_simgrid_wait_req(&req->backend->data_request, &req->status_store, &req->queue, &req->done); #endif 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.node.rank, req->node_tag.data_tag); /* somebody is perhaps waiting for the MPI request to be posted */ STARPU_PTHREAD_MUTEX_LOCK(&req->backend->req_mutex); req->submitted = 1; STARPU_PTHREAD_COND_BROADCAST(&req->backend->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); _starpu_mpi_handle_detached_request(req); _STARPU_MPI_LOG_OUT(); } /********************************************************/ /* */ /* Wait functionalities */ /* */ /********************************************************/ #ifndef STARPU_SIMGRID 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->backend->other_request; _STARPU_MPI_TRACE_UWAIT_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag); if (req->backend->data_request != MPI_REQUEST_NULL) { req->ret = MPI_Wait(&req->backend->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.node.rank, req->node_tag.data_tag); _starpu_mpi_handle_request_termination(req); _STARPU_MPI_LOG_OUT(); } #endif int _starpu_mpi_wait(starpu_mpi_req *public_req, MPI_Status *status) { int ret; struct _starpu_mpi_req *req = *public_req; _STARPU_MPI_LOG_IN(); #ifdef STARPU_SIMGRID _STARPU_MPI_TRACE_UWAIT_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag); starpu_pthread_wait_t wait; starpu_pthread_wait_init(&wait); starpu_pthread_queue_register(&wait, &req->queue); while (1) { starpu_pthread_wait_reset(&wait); if (req->done) break; starpu_pthread_wait_wait(&wait); } starpu_pthread_queue_unregister(&wait, &req->queue); starpu_pthread_wait_destroy(&wait); _STARPU_MPI_TRACE_UWAIT_END(req->node_tag.node.rank, req->node_tag.data_tag); if (status) *status = req->status_store; _starpu_mpi_handle_request_termination(req); #else struct _starpu_mpi_req *waiting_req; /* We cannot try to complete a MPI request that was not actually posted * to MPI yet. */ STARPU_PTHREAD_MUTEX_LOCK(&(req->backend->req_mutex)); while (!(req->submitted)) STARPU_PTHREAD_COND_WAIT(&(req->backend->req_cond), &(req->backend->req_mutex)); STARPU_PTHREAD_MUTEX_UNLOCK(&(req->backend->req_mutex)); /* Initialize the request structure */ _starpu_mpi_request_init(&waiting_req); waiting_req->prio = INT_MAX; waiting_req->status = status; waiting_req->backend->other_request = req; waiting_req->func = _starpu_mpi_wait_func; waiting_req->request_type = WAIT_REQ; _starpu_mpi_submit_ready_request_inc(waiting_req); /* We wait for the MPI request to finish */ STARPU_PTHREAD_MUTEX_LOCK(&req->backend->req_mutex); while (!req->completed) STARPU_PTHREAD_COND_WAIT(&req->backend->req_cond, &req->backend->req_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); /* The internal request structure was automatically allocated */ _starpu_mpi_request_destroy(waiting_req); #endif *public_req = NULL; if (req->backend->internal_req) { _starpu_mpi_request_destroy(req->backend->internal_req); } ret = req->ret; _starpu_mpi_request_destroy(req); _STARPU_MPI_LOG_OUT(); return ret; } /********************************************************/ /* */ /* Test functionalities */ /* */ /********************************************************/ #ifndef STARPU_SIMGRID 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->backend->other_request; _STARPU_MPI_DEBUG(0, "Test request %p type %s tag %"PRIi64" 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _STARPU_MPI_TRACE_UTESTING_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag); req->ret = MPI_Test(&req->backend->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.node.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->backend->req_mutex); testing_req->completed = 1; STARPU_PTHREAD_COND_SIGNAL(&testing_req->backend->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&testing_req->backend->req_mutex); _STARPU_MPI_LOG_OUT(); } #endif 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_VALGRIND_YIELD(); #ifdef STARPU_SIMGRID ret = req->ret = _starpu_mpi_simgrid_mpi_test(&req->done, flag); if (*flag) { if (status) *status = req->status_store; _starpu_mpi_handle_request_termination(req); } #else STARPU_PTHREAD_MUTEX_LOCK(&req->backend->req_mutex); unsigned submitted = req->submitted; STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); if (submitted) { struct _starpu_mpi_req *testing_req; /* Initialize the request structure */ _starpu_mpi_request_init(&testing_req); testing_req->prio = INT_MAX; testing_req->flag = flag; testing_req->status = status; testing_req->backend->other_request = req; testing_req->func = _starpu_mpi_test_func; testing_req->completed = 0; testing_req->request_type = TEST_REQ; _starpu_mpi_submit_ready_request_inc(testing_req); /* We wait for the test request to finish */ STARPU_PTHREAD_MUTEX_LOCK(&(testing_req->backend->req_mutex)); while (!(testing_req->completed)) STARPU_PTHREAD_COND_WAIT(&(testing_req->backend->req_cond), &(testing_req->backend->req_mutex)); STARPU_PTHREAD_MUTEX_UNLOCK(&(testing_req->backend->req_mutex)); ret = testing_req->ret; _starpu_mpi_request_destroy(testing_req); } else { *flag = 0; } #endif if (*flag) { /* The request was completed so we free the internal * request structure which was automatically allocated * */ *public_req = NULL; if (req->backend->internal_req) { _starpu_mpi_request_destroy(req->backend->internal_req); } _starpu_mpi_request_destroy(req); } _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.node.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+ready_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(&progress_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 || ready_requests) /* Wait for all current MPI requests to finish */ STARPU_PTHREAD_COND_WAIT(&barrier_cond, &progress_mutex); /* No current request, clear flag */ newer_requests = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); /* Now wait for all tasks */ starpu_task_wait_for_all(); STARPU_PTHREAD_MUTEX_LOCK(&progress_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 || ready_requests || newer_requests); barrier_running = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); /* Initialize the request structure */ _starpu_mpi_request_init(&barrier_req); barrier_req->prio = INT_MAX; barrier_req->func = _starpu_mpi_barrier_func; barrier_req->request_type = BARRIER_REQ; barrier_req->node_tag.node.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->backend->req_mutex); while (!barrier_req->completed) STARPU_PTHREAD_COND_WAIT(&barrier_req->backend->req_cond, &barrier_req->backend->req_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier_req->backend->req_mutex); _starpu_mpi_request_destroy(barrier_req); _STARPU_MPI_LOG_OUT(); return ret; } /********************************************************/ /* */ /* Progression */ /* */ /********************************************************/ #ifdef STARPU_MPI_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 %"PRIi64" 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype, req->backend->internal_req); if (req->backend->internal_req) { free(req->backend->early_data_handle); req->backend->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->backend->size_req, MPI_STATUS_IGNORE); STARPU_MPI_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Wait returning %s", _starpu_mpi_get_mpi_error_code(ret)); starpu_free_on_node_flags(STARPU_MAIN_RAM, (uintptr_t)req->ptr, req->count, 0); 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_datatype_free(req->data_handle, &req->datatype); } } _STARPU_MPI_TRACE_TERMINATED(req, req->node_tag.node.rank, req->node_tag.data_tag); } _starpu_mpi_release_req_data(req); if (req->backend->envelope) { free(req->backend->envelope); req->backend->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->backend->req_mutex); req->completed = 1; STARPU_PTHREAD_COND_BROADCAST(&req->backend->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); _STARPU_MPI_LOG_OUT(); } /* This is called when the data is now received in the early data handle, we can * now copy it over to the real handle. */ 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); MPI_Datatype datatype = _starpu_mpi_datatype_get_user_defined_datatype(args->data_handle); if (datatype) { int position=0; void *ptr = starpu_data_get_local_ptr(args->data_handle); MPI_Unpack(args->buffer, itf_src->get_size(args->early_handle), &position, ptr, 1, datatype, args->req->node_tag.node.comm); starpu_free_on_node_flags(STARPU_MAIN_RAM, (uintptr_t) args->buffer, args->size, 0); args->buffer = NULL; _starpu_mpi_datatype_free(args->data_handle, &datatype); } else { 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)); 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_on_node(args->early_handle, STARPU_MAIN_RAM); _STARPU_MPI_DEBUG(3, "Done, handling unregister of early_handle..\n"); /* XXX: note that we have already freed the registered buffer above. In * principle that's unsafe. As of now it is fine because StarPU has no reason to access it. */ 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->backend->internal_req->backend->req_mutex); if (args->req->backend->internal_req->backend->to_destroy) { /* The request completed first, can now destroy it */ STARPU_PTHREAD_MUTEX_UNLOCK(&args->req->backend->internal_req->backend->req_mutex); _starpu_mpi_request_destroy(args->req->backend->internal_req); } else { /* The request didn't complete yet, tell it to destroy it when it completes */ args->req->backend->internal_req->backend->to_destroy = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&args->req->backend->internal_req->backend->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->backend->data_request = args->req->backend->internal_req->backend->data_request; STARPU_PTHREAD_MUTEX_LOCK(&args->req->backend->req_mutex); args->req->submitted = 1; STARPU_PTHREAD_COND_BROADCAST(&args->req->backend->req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&args->req->backend->req_mutex); #ifdef STARPU_SIMGRID args->req->done = 1; #endif } } free(args); args = NULL; } static void _starpu_mpi_test_detached_requests(void) { //_STARPU_MPI_LOG_IN(); int flag; 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_TRACE_TEST_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag); //_STARPU_MPI_DEBUG(3, "Test detached request %p - mpitag %"PRIi64" - TYPE %s %d\n", &req->backend->data_request, req->node_tag.data_tag, _starpu_mpi_request_type(req->request_type), req->node_tag.node.rank); #ifdef STARPU_SIMGRID req->ret = _starpu_mpi_simgrid_mpi_test(&req->done, &flag); #else STARPU_MPI_ASSERT_MSG(req->backend->data_request != MPI_REQUEST_NULL, "Cannot test completion of the request MPI_REQUEST_NULL"); req->ret = MPI_Test(&req->backend->data_request, &flag, MPI_STATUS_IGNORE); #endif 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.node.rank, req->node_tag.data_tag); if (!flag) { req = _starpu_mpi_req_list_next(req); } else { _STARPU_MPI_TRACE_POLLING_END(); struct _starpu_mpi_req *next_req; next_req = _starpu_mpi_req_list_next(req); _STARPU_MPI_TRACE_COMPLETE_BEGIN(req->request_type, req->node_tag.node.rank, req->node_tag.data_tag); STARPU_PTHREAD_MUTEX_LOCK(&detached_requests_mutex); if (req->request_type == SEND_REQ) detached_send_nrequests--; _starpu_mpi_req_list_erase(&detached_requests, req); STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); _starpu_mpi_handle_request_termination(req); _STARPU_MPI_TRACE_COMPLETE_END(req->request_type, req->node_tag.node.rank, req->node_tag.data_tag); STARPU_PTHREAD_MUTEX_LOCK(&req->backend->req_mutex); /* We don't want to free internal non-detached requests, we need to get their MPI request before destroying them */ if (req->backend->is_internal_req && !req->backend->to_destroy) { /* We have completed the request, let the application request destroy it */ req->backend->to_destroy = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&req->backend->req_mutex); _starpu_mpi_request_destroy(req); } req = next_req; _STARPU_MPI_TRACE_POLLING_BEGIN(); } 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); if (req->request_type == SEND_REQ) detached_send_nrequests++; _starpu_mpi_req_list_push_back(&detached_requests, req); STARPU_PTHREAD_MUTEX_UNLOCK(&detached_requests_mutex); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); STARPU_PTHREAD_COND_SIGNAL(&progress_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_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 %"PRIi64" 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.node.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_receive_early_data(struct _starpu_mpi_envelope *envelope, MPI_Status status, MPI_Comm comm) { _STARPU_MPI_DEBUG(20, "Request with tag %"PRIi64" and source %d not found, creating a early_data_handle to receive incoming data..\n", envelope->data_tag, status.MPI_SOURCE); _STARPU_MPI_DEBUG(20, "Request sync %d\n", 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; data_handle = _starpu_mpi_tag_get_data_handle_from_tag(envelope->data_tag); 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)envelope->size); early_data_handle->buffer = (void *)starpu_malloc_on_node_flags(STARPU_MAIN_RAM, envelope->size, 0); early_data_handle->size = envelope->size; starpu_variable_data_register(&early_data_handle->handle, STARPU_MAIN_RAM, (uintptr_t) early_data_handle->buffer, envelope->size); //_starpu_mpi_early_data_add(early_data_handle); } _STARPU_MPI_DEBUG(20, "Posting internal detached irecv on early_data_handle with tag %"PRIi64" from comm %ld src %d ..\n", early_data_handle->node_tag.data_tag, (long int)comm, status.MPI_SOURCE); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_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); /* The early data handle is ready, we can let _starpu_mpi_submit_ready_request * proceed with acquiring it */ STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_mutex); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); // We wait until the request is pushed in the // ready_request list while (!(early_data_handle->req->posted)) STARPU_PTHREAD_COND_WAIT(&(early_data_handle->req->backend->posted_cond), &progress_mutex); // Handle the request immediatly to make sure the mpi_irecv is // posted before receiving an other envelope _starpu_mpi_req_list_erase(&ready_recv_requests, early_data_handle->req); _STARPU_MPI_INC_READY_REQUESTS(-1); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); _starpu_mpi_handle_ready_request(early_data_handle->req); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); } static void *_starpu_mpi_progress_thread_func(void *arg) { struct _starpu_mpi_argc_argv *argc_argv = (struct _starpu_mpi_argc_argv *) arg; starpu_pthread_setname("MPI"); _starpu_mpi_env_init(); #ifndef STARPU_SIMGRID if (_starpu_mpi_thread_cpuid < 0) { _starpu_mpi_thread_cpuid = starpu_get_next_bindid(STARPU_THREAD_ACTIVE, NULL, 0); } if (!_starpu_mpi_nobind && starpu_bind_thread_on(_starpu_mpi_thread_cpuid, STARPU_THREAD_ACTIVE, "MPI") < 0) { _STARPU_DISP("No core was available for the MPI thread. You should use STARPU_RESERVE_NCPU to leave one core available for MPI, or specify one core less in STARPU_NCPU\n"); } _starpu_mpi_do_initialize(argc_argv); if (!_starpu_mpi_nobind && _starpu_mpi_thread_cpuid >= 0) /* In case MPI changed the binding */ starpu_bind_thread_on(_starpu_mpi_thread_cpuid, STARPU_THREAD_ACTIVE, "MPI"); #else /* 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]); void **tsd; _STARPU_CALLOC(tsd, MAX_TSD + 1, sizeof(void*)); #ifdef HAVE_SG_ACTOR_DATA _starpu_simgrid_actor_create("main", smpi_simulated_main_, _starpu_simgrid_get_host_by_name("MAIN"), *(argc_argv->argc), argv_cpy); /* And set TSD for us */ sg_actor_data_set(sg_actor_self(), tsd); #else 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 */ if (!smpi_process_set_user_data) { _STARPU_ERROR("Your version of simgrid does not provide smpi_process_set_user_data, we can not continue without it\n"); } smpi_process_set_user_data(tsd); #endif /* And wait for StarPU to get initialized, to come back to the same * situation as native execution where that's always the case. */ starpu_wait_initialized(); #endif _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(); if (mpi_driver) starpu_driver_init(mpi_driver); #ifdef STARPU_SIMGRID starpu_pthread_wait_init(&_starpu_mpi_thread_wait); starpu_pthread_queue_init(&_starpu_mpi_thread_dontsleep); starpu_pthread_queue_register(&_starpu_mpi_thread_wait, &_starpu_mpi_thread_dontsleep); #endif #ifdef STARPU_USE_FXT if (_starpu_fxt_wait_initialisation()) { /* We need to record our ID in the trace before the main thread makes any MPI call */ _STARPU_MPI_TRACE_START(argc_argv->rank, argc_argv->world_size); starpu_profiling_set_id(argc_argv->rank); _starpu_mpi_add_sync_point_in_fxt(); } #endif //STARPU_USE_FXT /* notify the main thread that the progression thread is ready */ STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); running = 1; STARPU_PTHREAD_COND_SIGNAL(&progress_cond); int envelope_request_submitted = 0; int mpi_driver_loop_counter = 0; int mpi_driver_task_counter = 0; _STARPU_MPI_TRACE_POLLING_BEGIN(); while (running || posted_requests || !(_starpu_mpi_req_list_empty(&ready_recv_requests)) || !(_starpu_mpi_req_prio_list_empty(&ready_send_requests)) || !(_starpu_mpi_req_list_empty(&detached_requests)))// || !(_starpu_mpi_early_request_count()) || !(_starpu_mpi_sync_data_count())) { #ifdef STARPU_SIMGRID starpu_pthread_wait_reset(&_starpu_mpi_thread_wait); #endif /* shall we block ? */ unsigned block = _starpu_mpi_req_list_empty(&ready_recv_requests) && _starpu_mpi_req_prio_list_empty(&ready_send_requests) && _starpu_mpi_early_request_count() == 0 && _starpu_mpi_sync_data_count() == 0 && _starpu_mpi_req_list_empty(&detached_requests); 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(&barrier_cond); STARPU_PTHREAD_COND_WAIT(&progress_cond, &progress_mutex); _STARPU_MPI_TRACE_SLEEP_END(); } /* get one recv request */ unsigned n = 0; while (!_starpu_mpi_req_list_empty(&ready_recv_requests)) { _STARPU_MPI_TRACE_POLLING_END(); struct _starpu_mpi_req *req; if (n++ == nready_process) /* Already spent some time on submitting ready recv requests, poll before processing more ready recv requests */ break; req = _starpu_mpi_req_list_pop_back(&ready_recv_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(&progress_mutex); _starpu_mpi_handle_ready_request(req); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); } /* get one send request */ n = 0; while (!_starpu_mpi_req_prio_list_empty(&ready_send_requests) && detached_send_nrequests < ndetached_send) { struct _starpu_mpi_req *req; if (n++ == nready_process) /* Already spent some time on submitting ready send requests, poll before processing more ready send requests */ break; req = _starpu_mpi_req_prio_list_pop_back_highest(&ready_send_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(&progress_mutex); _starpu_mpi_handle_ready_request(req); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); } _STARPU_MPI_TRACE_POLLING_BEGIN(); /* 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(&progress_mutex); _starpu_mpi_test_detached_requests(); STARPU_PTHREAD_MUTEX_LOCK(&progress_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_TRACE_POLLING_END(); _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 %"PRIi64" 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 %"PRIi64" != req %"PRIi64")\n", envelope->data_tag, _sync_req->node_tag.data_tag); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); _starpu_mpi_isend_data_func(_sync_req); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); } else { _STARPU_MPI_DEBUG(3, "Searching for application request with tag %"PRIi64" and source %d (size %ld)\n", envelope->data_tag, envelope_status.MPI_SOURCE, envelope->size); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); STARPU_PTHREAD_MUTEX_LOCK(&early_data_mutex); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); 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 %"PRIi64"\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.node.rank = envelope_status.MPI_SOURCE; new_req->node_tag.data_tag = envelope->data_tag; new_req->node_tag.node.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_size_func; new_req->sequential_consistency = 1; new_req->backend->is_internal_req = 0; // ???? new_req->count = envelope->size; _starpu_mpi_sync_data_add(new_req); /* We have queued our sync request, we can let _starpu_mpi_submit_ready_request find it */ STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_mutex); } else { /* This will release early_data_mutex when appropriate */ _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 { /* Got the early request */ STARPU_PTHREAD_MUTEX_UNLOCK(&early_data_mutex); _STARPU_MPI_DEBUG(2000, "A matching application request has been found for the incoming data with tag %"PRIi64"\n", envelope->data_tag); _STARPU_MPI_DEBUG(2000, "Request sync %d\n", envelope->sync); early_request->sync = envelope->sync; _starpu_mpi_datatype_allocate(early_request->data_handle, early_request); if (early_request->registered_datatype == 1) { early_request->count = 1; early_request->ptr = starpu_data_handle_to_pointer(early_request->data_handle, STARPU_MAIN_RAM); } else { early_request->count = envelope->size; early_request->ptr = (void *)starpu_malloc_on_node_flags(STARPU_MAIN_RAM, early_request->count, 0); 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(&progress_mutex); _starpu_mpi_handle_ready_request(early_request); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); } } envelope_request_submitted = 0; _STARPU_MPI_TRACE_POLLING_BEGIN(); } else { /* A call is made to driver_run_once only when * the progression thread have gone through the * communication progression loop * mpi_driver_call_freq times. It is * interesting to tune the * STARPU_MPI_DRIVER_CALL_FREQUENCY * depending on whether the user wants * reactivity or computing power from the MPI * progression thread. */ if ( mpi_driver && ( ++mpi_driver_loop_counter == mpi_driver_call_freq )) { mpi_driver_loop_counter = 0; mpi_driver_task_counter = 0; while (mpi_driver_task_counter++ < mpi_driver_task_freq) { _STARPU_MPI_TRACE_DRIVER_RUN_BEGIN(); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); _STARPU_MPI_DEBUG(4, "running once mpi driver\n"); starpu_driver_run_once(mpi_driver); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); _STARPU_MPI_TRACE_DRIVER_RUN_END(); } } //_STARPU_MPI_DEBUG(4, "Nothing received, continue ..\n"); } } #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); starpu_pthread_wait_wait(&_starpu_mpi_thread_wait); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); #endif STARPU_VALGRIND_YIELD(); } _STARPU_MPI_TRACE_POLLING_END(); if (envelope_request_submitted) { _starpu_mpi_comm_cancel_recv(); envelope_request_submitted = 0; } #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&wait_counter_mutex); while (wait_counter != 0) STARPU_PTHREAD_COND_WAIT(&wait_counter_cond, &wait_counter_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&wait_counter_mutex); STARPU_PTHREAD_MUTEX_DESTROY(&wait_counter_mutex); STARPU_PTHREAD_COND_DESTROY(&wait_counter_cond); starpu_pthread_queue_unregister(&_starpu_mpi_thread_wait, &_starpu_mpi_thread_dontsleep); starpu_pthread_queue_destroy(&_starpu_mpi_thread_dontsleep); starpu_pthread_wait_destroy(&_starpu_mpi_thread_wait); #endif STARPU_MPI_ASSERT_MSG(_starpu_mpi_req_list_empty(&detached_requests), "List of detached requests not empty"); STARPU_MPI_ASSERT_MSG(detached_send_nrequests == 0, "Number of detached send requests not 0"); STARPU_MPI_ASSERT_MSG(_starpu_mpi_req_list_empty(&ready_recv_requests), "List of ready requests not empty"); STARPU_MPI_ASSERT_MSG(_starpu_mpi_req_prio_list_empty(&ready_send_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(&progress_mutex); _starpu_mpi_sync_data_shutdown(); _starpu_mpi_early_data_shutdown(); _starpu_mpi_early_request_shutdown(); _starpu_mpi_datatype_shutdown(); free(argc_argv); return NULL; } 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 } int _starpu_mpi_progress_init(struct _starpu_mpi_argc_argv *argc_argv) { STARPU_PTHREAD_MUTEX_INIT(&progress_mutex, NULL); STARPU_PTHREAD_MUTEX_INIT(&early_data_mutex, NULL); STARPU_PTHREAD_COND_INIT(&progress_cond, NULL); STARPU_PTHREAD_COND_INIT(&barrier_cond, NULL); _starpu_mpi_req_list_init(&ready_recv_requests); _starpu_mpi_req_prio_list_init(&ready_send_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); nready_process = starpu_get_env_number_default("STARPU_MPI_NREADY_PROCESS", 10); ndetached_send = starpu_get_env_number_default("STARPU_MPI_NDETACHED_SEND", 10); #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_INIT(&wait_counter_mutex, NULL); STARPU_PTHREAD_COND_INIT(&wait_counter_cond, NULL); #endif #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(&progress_mutex); while (!running) STARPU_PTHREAD_COND_WAIT(&progress_cond, &progress_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); return 0; #endif } #ifdef STARPU_SIMGRID void _starpu_mpi_wait_for_initialization() { /* Wait for MPI initialization to finish */ STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); while (!running) STARPU_PTHREAD_COND_WAIT(&progress_cond, &progress_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); } #endif void _starpu_mpi_progress_shutdown(void **value) { STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); running = 0; STARPU_PTHREAD_COND_BROADCAST(&progress_cond); #ifdef STARPU_SIMGRID starpu_pthread_queue_signal(&_starpu_mpi_thread_dontsleep); #endif STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); #ifdef STARPU_SIMGRID /* FIXME: should rather properly wait for _starpu_mpi_progress_thread_func to finish */ (void) value; starpu_sleep(1); #else STARPU_PTHREAD_JOIN(progress_thread, value); #endif STARPU_PTHREAD_MUTEX_DESTROY(&mutex_posted_requests); STARPU_PTHREAD_MUTEX_DESTROY(&mutex_ready_requests); STARPU_PTHREAD_MUTEX_DESTROY(&progress_mutex); STARPU_PTHREAD_MUTEX_DESTROY(&early_data_mutex); STARPU_PTHREAD_COND_DESTROY(&barrier_cond); } static int64_t _starpu_mpi_tag_max = INT64_MAX; 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; *(int64_t **)attribute_val = &_starpu_mpi_tag_max; } else { *flag = 0; } return 0; } void _starpu_mpi_driver_init(struct starpu_conf *conf) { /* We only initialize the driver if the environment variable * STARPU_MPI_DRIVER_CALL_FREQUENCY is defined by the user. If this environment * variable is not defined or defined at a value lower than or equal to zero, * StarPU-MPI will not use a driver. */ int driver_env = starpu_get_env_number_default("STARPU_MPI_DRIVER_CALL_FREQUENCY", 0); if (driver_env > 0) { #ifdef STARPU_SIMGRID _STARPU_DISP("Warning: MPI driver is not supported with simgrid, this will be disabled"); return; #endif mpi_driver_call_freq = driver_env; _STARPU_MALLOC(mpi_driver, sizeof(struct starpu_driver)); mpi_driver->type = STARPU_CPU_WORKER; mpi_driver->id.cpu_id = 0; conf->not_launched_drivers = mpi_driver; conf->n_not_launched_drivers = 1; int tasks_freq_env = starpu_get_env_number_default("STARPU_MPI_DRIVER_TASK_FREQUENCY", 0); if (tasks_freq_env > 0) mpi_driver_task_freq = tasks_freq_env; } } void _starpu_mpi_driver_shutdown() { if (mpi_driver) { starpu_driver_deinit(mpi_driver); free(mpi_driver); mpi_driver = NULL; } } #endif /* STARPU_USE_MPI_MPI */ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_mpi_backend.c000066400000000000000000000072631413463044200227760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_MPI_MPI #include #include #include #include #include #include void _starpu_mpi_mpi_backend_init(struct starpu_conf *conf) { _starpu_mpi_driver_init(conf); } void _starpu_mpi_mpi_backend_shutdown(void) { _starpu_mpi_tag_shutdown(); _starpu_mpi_comm_shutdown(); _starpu_mpi_driver_shutdown(); } int _starpu_mpi_mpi_backend_reserve_core(void) { return (starpu_get_env_number_default("STARPU_MPI_DRIVER_CALL_FREQUENCY", 0) <= 0); } void _starpu_mpi_mpi_backend_request_init(struct _starpu_mpi_req *req) { _STARPU_MPI_CALLOC(req->backend, 1, sizeof(struct _starpu_mpi_req_backend)); req->backend->data_request = 0; STARPU_PTHREAD_MUTEX_INIT(&req->backend->req_mutex, NULL); STARPU_PTHREAD_COND_INIT(&req->backend->req_cond, NULL); STARPU_PTHREAD_COND_INIT(&req->backend->posted_cond, NULL); req->backend->other_request = NULL; req->backend->size_req = 0; req->backend->internal_req = NULL; req->backend->is_internal_req = 0; req->backend->to_destroy = 1; req->backend->early_data_handle = NULL; req->backend->envelope = NULL; } void _starpu_mpi_mpi_backend_request_fill(struct _starpu_mpi_req *req, MPI_Comm comm, int is_internal_req) { _starpu_mpi_comm_register(comm); req->backend->is_internal_req = is_internal_req; /* For internal requests, we wait for both the request completion and the matching application request completion */ req->backend->to_destroy = !is_internal_req; } void _starpu_mpi_mpi_backend_request_destroy(struct _starpu_mpi_req *req) { STARPU_PTHREAD_MUTEX_DESTROY(&req->backend->req_mutex); STARPU_PTHREAD_COND_DESTROY(&req->backend->req_cond); STARPU_PTHREAD_COND_DESTROY(&req->backend->posted_cond); free(req->backend); } void _starpu_mpi_mpi_backend_data_clear(starpu_data_handle_t data_handle) { _starpu_mpi_tag_data_release(data_handle); } void _starpu_mpi_mpi_backend_data_register(starpu_data_handle_t data_handle, starpu_mpi_tag_t data_tag) { _starpu_mpi_tag_data_register(data_handle, data_tag); } void _starpu_mpi_mpi_backend_comm_register(MPI_Comm comm) { _starpu_mpi_comm_register(comm); } struct _starpu_mpi_backend _mpi_backend = { ._starpu_mpi_backend_init = _starpu_mpi_mpi_backend_init, ._starpu_mpi_backend_shutdown = _starpu_mpi_mpi_backend_shutdown, ._starpu_mpi_backend_reserve_core = _starpu_mpi_mpi_backend_reserve_core, ._starpu_mpi_backend_request_init = _starpu_mpi_mpi_backend_request_init, ._starpu_mpi_backend_request_fill = _starpu_mpi_mpi_backend_request_fill, ._starpu_mpi_backend_request_destroy = _starpu_mpi_mpi_backend_request_destroy, ._starpu_mpi_backend_data_clear = _starpu_mpi_mpi_backend_data_clear, ._starpu_mpi_backend_data_register = _starpu_mpi_mpi_backend_data_register, ._starpu_mpi_backend_comm_register = _starpu_mpi_mpi_backend_comm_register }; #endif /* STARPU_USE_MPI_MPI*/ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_mpi_backend.h000066400000000000000000000036771413463044200230100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_MPI_BACKEND_H__ #define __STARPU_MPI_MPI_BACKEND_H__ #include #include /** @file */ #ifdef __cplusplus extern "C" { #endif #ifdef STARPU_USE_MPI_MPI 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_envelope_mode { _STARPU_MPI_ENVELOPE_DATA=0, _STARPU_MPI_ENVELOPE_SYNC_READY=1 }; struct _starpu_mpi_envelope { enum _starpu_envelope_mode mode; starpu_ssize_t size; starpu_mpi_tag_t data_tag; unsigned sync; }; struct _starpu_mpi_req_backend { MPI_Request data_request; starpu_pthread_mutex_t req_mutex; starpu_pthread_cond_t req_cond; starpu_pthread_cond_t posted_cond; /** 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; 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; UT_hash_handle hh; }; #endif // STARPU_USE_MPI_MPI #ifdef __cplusplus } #endif #endif // __STARPU_MPI_MPI_BACKEND_H__ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_sync_data.c000066400000000000000000000127631413463044200225100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_MPI_MPI 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_shutdown(void) { struct _starpu_mpi_sync_data_handle_hashlist *current=NULL, *tmp=NULL; 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 %ld source %d and tag %ld does not exist\n", (long int)node_tag->node.comm, node_tag->node.rank, node_tag->data_tag); } else if (_starpu_mpi_req_list_empty(&hashlist->list)) { _STARPU_MPI_DEBUG(60, "Hashlist for comm %ld source %d and tag %ld is empty\n", (long int)node_tag->node.comm, node_tag->node.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 %ld source %d and tag %ld: %p\n", (long int)node_tag->node.comm, node_tag->node.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(starpu_mpi_tag_t 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.node.comm = comm; node_tag.node.rank = source; node_tag.data_tag = data_tag; _STARPU_MPI_DEBUG(60, "Looking for sync_data_handle with comm %ld source %d tag %ld in the hashmap\n", (long int)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 %ld source %d tag %ld in the hashmap\n", req, (long int)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 %ld source %d tag %ld in the hashmap\n", sync_req, (long int)sync_req->node_tag.node.comm, sync_req->node_tag.node.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 } #endif // STARPU_USE_MPI_MPI starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_sync_data.h000066400000000000000000000025551413463044200225130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef STARPU_USE_MPI_MPI #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_shutdown(void); struct _starpu_mpi_req *_starpu_mpi_sync_data_find(starpu_mpi_tag_t 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_USE_MPI_MPI */ #endif /* __STARPU_MPI_SYNC_DATA_H__ */ starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_tag.c000066400000000000000000000075151413463044200213150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_MPI_MPI /* Entry in the `registered_tag_handles' hash table. */ struct handle_tag_entry { UT_hash_handle hh; starpu_mpi_tag_t data_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_shutdown(void) { struct handle_tag_entry *tag_entry=NULL, *tag_tmp=NULL; _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_tag_get_data_handle_from_tag(starpu_mpi_tag_t data_tag) { struct handle_tag_entry *ret; _starpu_spin_lock(®istered_tag_handles_lock); HASH_FIND(hh, registered_tag_handles, &data_tag, sizeof(ret->data_tag), ret); _starpu_spin_unlock(®istered_tag_handles_lock); if (ret) { return ret->handle; } else { return NULL; } } void _starpu_mpi_tag_data_register(starpu_data_handle_t handle, starpu_mpi_tag_t data_tag) { if (data_tag == -1) { /* No tag for this data, probably a temporary data not to be communicated */ return; } struct handle_tag_entry *entry; _STARPU_MPI_MALLOC(entry, sizeof(*entry)); STARPU_ASSERT_MSG(!(_starpu_mpi_tag_get_data_handle_from_tag(data_tag)), "There is already a data handle %p registered with the tag %ld\n", _starpu_mpi_tag_get_data_handle_from_tag(data_tag), data_tag); _STARPU_MPI_DEBUG(42, "Adding handle %p with tag %"PRIi64" in hashtable\n", handle, data_tag); entry->handle = handle; entry->data_tag = data_tag; _starpu_spin_lock(®istered_tag_handles_lock); #ifndef STARPU_NO_ASSERT struct handle_tag_entry *old; HASH_FIND(hh, registered_tag_handles, &data_tag, sizeof(entry->data_tag), old); STARPU_ASSERT_MSG(!old, "tag %"PRIi64" being registered for data %p, but is already used by data %p!\n", data_tag, handle, old?old->handle:NULL); #endif HASH_ADD(hh, registered_tag_handles, data_tag, sizeof(entry->data_tag), entry); _starpu_spin_unlock(®istered_tag_handles_lock); } int _starpu_mpi_tag_data_release(starpu_data_handle_t handle) { starpu_mpi_tag_t data_tag = starpu_mpi_data_get_tag(handle); _STARPU_MPI_DEBUG(42, "Removing handle %p with tag %"PRIi64" from hashtable\n", handle, data_tag); if (data_tag != -1) { struct handle_tag_entry *tag_entry; _starpu_spin_lock(®istered_tag_handles_lock); HASH_FIND(hh, registered_tag_handles, &(((struct _starpu_mpi_data *)(handle->mpi_data))->node_tag.data_tag), sizeof(tag_entry->data_tag), tag_entry); STARPU_ASSERT_MSG((tag_entry != NULL),"Data handle %p with tag %"PRIi64" isn't in the hashmap !", handle, data_tag); HASH_DEL(registered_tag_handles, tag_entry); _starpu_spin_unlock(®istered_tag_handles_lock); free(tag_entry); } return 0; } #endif // STARPU_USE_MPI_MPI starpu-1.3.9+dfsg/mpi/src/mpi/starpu_mpi_tag.h000066400000000000000000000024141413463044200213130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef STARPU_USE_MPI_MPI #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_tag_init(void); void _starpu_mpi_tag_shutdown(void); void _starpu_mpi_tag_data_register(starpu_data_handle_t handle, starpu_mpi_tag_t data_tag); int _starpu_mpi_tag_data_release(starpu_data_handle_t handle); starpu_data_handle_t _starpu_mpi_tag_get_data_handle_from_tag(starpu_mpi_tag_t data_tag); #ifdef __cplusplus } #endif #endif // STARPU_USE_MPI_MPI #endif // __STARPU_MPI_TAG_H__ starpu-1.3.9+dfsg/mpi/src/nmad/000077500000000000000000000000001413463044200162555ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/src/nmad/starpu_mpi_nmad.c000066400000000000000000000660341413463044200216140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017 Guillaume Beauchamp * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #ifdef STARPU_USE_MPI_NMAD #include #include #include "starpu_mpi_nmad_backend.h" static void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req *req,nm_sr_event_t event); #ifdef STARPU_VERBOSE char *_starpu_mpi_request_type(enum _starpu_mpi_request_type request_type); #endif static void _starpu_mpi_handle_pending_request(struct _starpu_mpi_req *req); static void _starpu_mpi_add_sync_point_in_fxt(void); /* Condition to wake up waiting for all current MPI requests to finish */ static starpu_pthread_t progress_thread; static starpu_pthread_cond_t progress_cond; static starpu_pthread_mutex_t progress_mutex; static volatile int running = 0; extern 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); /* Count requests posted by the application and not yet submitted to MPI, i.e pushed into the new_requests list */ static volatile int pending_request = 0; #define REQ_FINALIZED 0x1 PUK_LFSTACK_TYPE(callback, struct _starpu_mpi_req *req;); static callback_lfstack_t callback_stack; static starpu_sem_t callback_sem; /********************************************************/ /* */ /* Send/Receive functionalities */ /* */ /********************************************************/ void _starpu_mpi_req_willpost(struct _starpu_mpi_req *req STARPU_ATTRIBUTE_UNUSED) { STARPU_ATOMIC_ADD( &pending_request, 1); } /********************************************************/ /* */ /* Send functionalities */ /* */ /********************************************************/ static void _starpu_mpi_isend_data_func(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(30, "post NM isend request %p type %s tag %ld 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.node.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.node.comm, req->node_tag.node.rank, req->datatype, req->count); _STARPU_MPI_TRACE_ISEND_SUBMIT_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag, 0); struct nm_data_s data; nm_mpi_nmad_data_get(&data, (void*)req->ptr, req->datatype, req->count); nm_sr_send_init(req->backend->session, &(req->backend->data_request)); nm_sr_send_pack_data(req->backend->session, &(req->backend->data_request), &data); nm_sr_send_set_priority(req->backend->session, &req->backend->data_request, req->prio); if (req->sync == 0) { req->ret = nm_sr_send_isend(req->backend->session, &(req->backend->data_request), req->backend->gate, req->node_tag.data_tag); STARPU_ASSERT_MSG(req->ret == NM_ESUCCESS, "MPI_Isend returning %d", req->ret); } else { req->ret = nm_sr_send_issend(req->backend->session, &(req->backend->data_request), req->backend->gate, req->node_tag.data_tag); STARPU_ASSERT_MSG(req->ret == NM_ESUCCESS, "MPI_Issend returning %d", req->ret); } _STARPU_MPI_TRACE_ISEND_SUBMIT_END(req->node_tag.node.rank, req->node_tag.data_tag, starpu_data_get_size(req->data_handle), req->pre_sync_jobid); _starpu_mpi_handle_pending_request(req); _STARPU_MPI_LOG_OUT(); } void _starpu_mpi_isend_size_func(struct _starpu_mpi_req *req) { _starpu_mpi_datatype_allocate(req->data_handle, req); if (req->registered_datatype == 1) { req->backend->waited = 1; req->count = 1; req->ptr = starpu_data_handle_to_pointer(req->data_handle, STARPU_MAIN_RAM); } else { starpu_ssize_t psize = -1; int ret; req->backend->waited =2; // Do not pack the data, just try to find out the size starpu_data_pack(req->data_handle, NULL, &psize); if (psize != -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", psize, sizeof(req->count), "MPI_BYTE", req->node_tag.node.rank); req->count = psize; //ret = nm_sr_isend(nm_mpi_communicator_get_session(p_req->p_comm),nm_mpi_communicator_get_gate(p_comm,req->srcdst), req->mpi_tag,&req->count, sizeof(req->count), &req->backend->size_req); ret = nm_sr_isend(req->backend->session,req->backend->gate, req->node_tag.data_tag,&req->count, sizeof(req->count), &req->backend->size_req); // ret = MPI_Isend(&req->count, sizeof(req->count), MPI_BYTE, req->srcdst, req->mpi_tag, req->comm, &req->backend->size_req); STARPU_ASSERT_MSG(ret == NM_ESUCCESS, "when sending size, nm_sr_isend returning %d", ret); } // Pack the data starpu_data_pack(req->data_handle, &req->ptr, &req->count); if (psize == -1) { // We know the size now, let's send it _STARPU_MPI_DEBUG(1, "Sending size %ld (%ld %s) with tag %ld to node %d (second call to pack)\n", req->count, sizeof(req->count), "MPI_BYTE", req->node_tag.data_tag, req->node_tag.node.rank); ret = nm_sr_isend(req->backend->session,req->backend->gate, req->node_tag.data_tag,&req->count, sizeof(req->count), &req->backend->size_req); STARPU_ASSERT_MSG(ret == NM_ESUCCESS, "when sending size, nm_sr_isend returning %d", ret); } else { // We check the size returned with the 2 calls to pack is the same STARPU_ASSERT_MSG(req->count == psize, "Calls to pack_data returned different sizes %ld != %ld", req->count, psize); } // We can send the data now } _starpu_mpi_isend_data_func(req); } /********************************************************/ /* */ /* Receive functionalities */ /* */ /********************************************************/ static void _starpu_mpi_irecv_data_func(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(20, "post NM irecv request %p type %s tag %ld 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); _STARPU_MPI_TRACE_IRECV_SUBMIT_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag); //req->ret = MPI_Irecv(req->ptr, req->count, req->datatype, req->srcdst, req->mpi_tag, req->comm, &req->request); struct nm_data_s data; nm_mpi_nmad_data_get(&data, (void*)req->ptr, req->datatype, req->count); nm_sr_recv_init(req->backend->session, &(req->backend->data_request)); nm_sr_recv_unpack_data(req->backend->session, &(req->backend->data_request), &data); nm_sr_recv_irecv(req->backend->session, &(req->backend->data_request), req->backend->gate, req->node_tag.data_tag, NM_TAG_MASK_FULL); _STARPU_MPI_TRACE_IRECV_SUBMIT_END(req->node_tag.node.rank, req->node_tag.data_tag); _starpu_mpi_handle_pending_request(req); _STARPU_MPI_LOG_OUT(); } struct _starpu_mpi_irecv_size_callback { starpu_data_handle_t handle; struct _starpu_mpi_req *req; }; static void _starpu_mpi_irecv_size_callback(void *arg) { struct _starpu_mpi_irecv_size_callback *callback = (struct _starpu_mpi_irecv_size_callback *)arg; starpu_data_unregister(callback->handle); callback->req->ptr = (void *)starpu_malloc_on_node_flags(STARPU_MAIN_RAM, callback->req->count, 0); STARPU_ASSERT_MSG(callback->req->ptr, "cannot allocate message of size %ld", callback->req->count); _starpu_mpi_irecv_data_func(callback->req); free(callback); } void _starpu_mpi_irecv_size_func(struct _starpu_mpi_req *req) { _STARPU_MPI_LOG_IN(); _starpu_mpi_datatype_allocate(req->data_handle, req); if (req->registered_datatype == 1) { req->count = 1; req->ptr = starpu_data_handle_to_pointer(req->data_handle, STARPU_MAIN_RAM); _starpu_mpi_irecv_data_func(req); } else { struct _starpu_mpi_irecv_size_callback *callback = malloc(sizeof(struct _starpu_mpi_irecv_size_callback)); callback->req = req; starpu_variable_data_register(&callback->handle, 0, (uintptr_t)&(callback->req->count), sizeof(callback->req->count)); _STARPU_MPI_DEBUG(4, "Receiving size with tag %ld from node %d\n", req->node_tag.data_tag, req->node_tag.node.rank); _starpu_mpi_irecv_common(callback->handle, req->node_tag.node.rank, req->node_tag.data_tag, req->node_tag.node.comm, 1, 0, _starpu_mpi_irecv_size_callback, callback,1,0,0); } } /********************************************************/ /* */ /* Wait functionalities */ /* */ /********************************************************/ #define _starpu_mpi_req_status(PUBLIC_REQ,STATUS) do { \ STATUS->MPI_SOURCE=PUBLIC_REQ->node_tag.node.rank; /**< field name mandatory by spec */ \ STATUS->MPI_TAG=PUBLIC_REQ->node_tag.data_tag; /**< field name mandatory by spec */ \ STATUS->MPI_ERROR=PUBLIC_REQ->ret; /**< field name mandatory by spec */ \ STATUS->size=PUBLIC_REQ->count; /**< size of data received */ \ STATUS->cancelled=0; /**< whether request was cancelled */ \ } while(0) int _starpu_mpi_wait(starpu_mpi_req *public_req, MPI_Status *status) { _STARPU_MPI_LOG_IN(); STARPU_MPI_ASSERT_MSG(public_req, "starpu_mpi_wait needs a valid starpu_mpi_req"); struct _starpu_mpi_req *req = *public_req; STARPU_MPI_ASSERT_MSG(!req->detached, "MPI_Wait cannot be called on a detached request"); /* we must do a test_locked to avoid race condition : * without req_cond could still be used and couldn't be freed)*/ while (!req->completed || ! piom_cond_test_locked(&(req->backend->req_cond),REQ_FINALIZED)) { piom_cond_wait(&(req->backend->req_cond),REQ_FINALIZED); } if (status!=MPI_STATUS_IGNORE) _starpu_mpi_req_status(req,status); _starpu_mpi_request_destroy(req); *public_req = NULL; _STARPU_MPI_LOG_OUT(); return MPI_SUCCESS; } /********************************************************/ /* */ /* Test functionalities */ /* */ /********************************************************/ int _starpu_mpi_test(starpu_mpi_req *public_req, int *flag, MPI_Status *status) { _STARPU_MPI_LOG_IN(); 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_MPI_DEBUG(2, "Test request %p type %s tag %ld 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); STARPU_VALGRIND_YIELD(); _STARPU_MPI_TRACE_UTESTING_BEGIN(req->node_tag.node.rank, req->node_tag.data_tag); /* we must do a test_locked to avoid race condition : * without req_cond could still be used and couldn't be freed)*/ *flag = req->completed && piom_cond_test_locked(&(req->backend->req_cond),REQ_FINALIZED); if (*flag && status!=MPI_STATUS_IGNORE) _starpu_mpi_req_status(req,status); _STARPU_MPI_TRACE_UTESTING_END(req->node_tag.node.rank, req->node_tag.data_tag); if(*flag) { _starpu_mpi_request_destroy(req); *public_req = NULL; } _STARPU_MPI_LOG_OUT(); return MPI_SUCCESS; } /********************************************************/ /* */ /* Barrier functionalities */ /* */ /********************************************************/ int _starpu_mpi_barrier(MPI_Comm comm) { _STARPU_MPI_LOG_IN(); int ret; // STARPU_ASSERT_MSG(!barrier_running, "Concurrent starpu_mpi_barrier is not implemented, even on different communicators"); ret = MPI_Barrier(comm); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Barrier returning %d", ret); _STARPU_MPI_LOG_OUT(); return ret; } /********************************************************/ /* */ /* Progression */ /* */ /********************************************************/ #ifdef STARPU_VERBOSE 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"; default: return "unknown request type"; } } #endif static void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req *req,nm_sr_event_t event) { _STARPU_MPI_LOG_IN(); _STARPU_MPI_DEBUG(2, "complete MPI request %p type %s tag %ld 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.node.rank, req->data_handle, req->ptr, req->datatype_name, (int)req->count, req->registered_datatype); if (req->request_type == RECV_REQ || req->request_type == SEND_REQ) { if (req->registered_datatype == 0) { if(req->backend->waited == 1) nm_mpi_nmad_data_release(req->datatype); if (req->request_type == SEND_REQ) { req->backend->waited--; // We need to make sure the communication for sending the size // has completed, as MPI can re-order messages, let's count // recerived message. // FIXME concurent access. STARPU_ASSERT_MSG(event == NM_SR_EVENT_FINALIZED, "Callback with event %d", event); if(req->backend->waited>0) return; } if (req->request_type == RECV_REQ) // req->ptr is freed by starpu_data_unpack starpu_data_unpack(req->data_handle, req->ptr, req->count); else starpu_free_on_node_flags(STARPU_MAIN_RAM, (uintptr_t) req->ptr, req->count, 0); } else { nm_mpi_nmad_data_release(req->datatype); _starpu_mpi_datatype_free(req->data_handle, &req->datatype); } } _STARPU_MPI_TRACE_TERMINATED(req, req->node_tag.node.rank, req->node_tag.data_tag); _starpu_mpi_release_req_data(req); /* Execute the specified callback, if any */ if (req->callback) { struct callback_lfstack_cell_s* c = padico_malloc(sizeof(struct callback_lfstack_cell_s)); c->req = req; /* The main thread can exit without waiting * the end of the detached request. Callback thread * must then be kept alive if they have a callback.*/ callback_lfstack_push(&callback_stack, c); starpu_sem_post(&callback_sem); } else { if(req->detached) { _starpu_mpi_request_destroy(req); // a detached request wont be wait/test (and freed inside). } else { /* tell anyone potentially waiting on the request that it is * terminated now (should be done after the callback)*/ req->completed = 1; piom_cond_signal(&req->backend->req_cond, REQ_FINALIZED); } int pending_remaining = STARPU_ATOMIC_ADD(&pending_request, -1); if (!running && !pending_remaining) starpu_sem_post(&callback_sem); } _STARPU_MPI_LOG_OUT(); } void _starpu_mpi_handle_request_termination_callback(nm_sr_event_t event, const nm_sr_event_info_t*event_info, void*ref) { _starpu_mpi_handle_request_termination(ref,event); } static void _starpu_mpi_handle_pending_request(struct _starpu_mpi_req *req) { if(req->request_type == SEND_REQ && req->backend->waited>1) { nm_sr_request_set_ref(&(req->backend->size_req), req); nm_sr_request_monitor(req->backend->session, &(req->backend->size_req), NM_SR_EVENT_FINALIZED,_starpu_mpi_handle_request_termination_callback); } /* the if must be before, because the first callback can directly free * a detached request (the second callback free if req->backend->waited>1). */ nm_sr_request_set_ref(&(req->backend->data_request), req); nm_sr_request_monitor(req->backend->session, &(req->backend->data_request), NM_SR_EVENT_FINALIZED,_starpu_mpi_handle_request_termination_callback); } void _starpu_mpi_coop_sends_build_tree(struct _starpu_mpi_coop_sends *coop_sends) { /* TODO: turn them into redirects & forwards */ } void _starpu_mpi_submit_coop_sends(struct _starpu_mpi_coop_sends *coop_sends, int submit_control, int submit_data) { unsigned i, n = coop_sends->n; /* Note: coop_sends might disappear very very soon after last request is submitted */ for (i = 0; i < n; i++) { if (coop_sends->reqs_array[i]->request_type == SEND_REQ && submit_data) { _STARPU_MPI_DEBUG(0, "cooperative sends %p sending to %d\n", coop_sends, coop_sends->reqs_array[i]->node_tag.node.rank); _starpu_mpi_submit_ready_request(coop_sends->reqs_array[i]); } /* TODO: handle redirect requests */ } } void _starpu_mpi_submit_ready_request(void *arg) { _STARPU_MPI_LOG_IN(); struct _starpu_mpi_req *req = arg; STARPU_ASSERT_MSG(req, "Invalid request"); /* submit the request to MPI directly from submitter */ _STARPU_MPI_DEBUG(2, "Handling new request %p type %s tag %ld 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.node.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_progress_thread_func(void *arg) { struct _starpu_mpi_argc_argv *argc_argv = (struct _starpu_mpi_argc_argv *) arg; #ifndef STARPU_SIMGRID if (!_starpu_mpi_nobind && starpu_bind_thread_on(_starpu_mpi_thread_cpuid, 0, "MPI") < 0) { _STARPU_DISP("No core was available for the MPI thread. You should use STARPU_RESERVE_NCPU to leave one core available for MPI, or specify one core less in STARPU_NCPU\n"); } #endif #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]); #ifdef HAVE_SG_ACTOR_DATA _starpu_simgrid_actor_create("main", smpi_simulated_main_, _starpu_simgrid_get_host_by_name("MAIN"), *(argc_argv->argc), argv_cpy); #else 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) { _STARPU_ERROR("Your version of simgrid does not provide smpi_process_set_user_data, we can not continue without it\n"); } smpi_process_set_user_data(tsd); #endif #endif _starpu_mpi_comm_amounts_init(argc_argv->comm); _starpu_mpi_cache_init(argc_argv->comm); _starpu_mpi_select_node_init(); _starpu_mpi_datatype_init(); #ifdef STARPU_USE_FXT if (_starpu_fxt_wait_initialisation()) { /* We need to record our ID in the trace before the main thread makes any MPI call */ _STARPU_MPI_TRACE_START(argc_argv->rank, argc_argv->world_size); starpu_profiling_set_id(argc_argv->rank); _starpu_mpi_add_sync_point_in_fxt(); } #endif //STARPU_USE_FXT /* notify the main thread that the progression thread is ready */ STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); running = 1; STARPU_PTHREAD_COND_SIGNAL(&progress_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); while (1) { struct callback_lfstack_cell_s* c = callback_lfstack_pop(&callback_stack); int err=0; if(running || pending_request>0) { /* shall we block ? */ err = starpu_sem_wait(&callback_sem); //running pending_request can change while waiting } if(c==NULL) { c = callback_lfstack_pop(&callback_stack); if (c == NULL) { if(running && pending_request>0) { STARPU_ASSERT_MSG(c!=NULL, "Callback thread awakened without callback ready with error %d.",err); } else { if (pending_request==0) break; } continue; } } c->req->callback(c->req->callback_arg); if (c->req->detached) { _starpu_mpi_request_destroy(c->req); } else { c->req->completed=1; piom_cond_signal(&(c->req->backend->req_cond), REQ_FINALIZED); } STARPU_ATOMIC_ADD( &pending_request, -1); /* we signal that the request is completed.*/ free(c); } STARPU_ASSERT_MSG(callback_lfstack_pop(&callback_stack)==NULL, "List of callback not empty."); STARPU_ASSERT_MSG(pending_request==0, "Request still pending."); if (argc_argv->initialize_mpi) { _STARPU_MPI_DEBUG(3, "Calling MPI_Finalize()\n"); MPI_Finalize(); } starpu_sem_destroy(&callback_sem); 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 } int _starpu_mpi_progress_init(struct _starpu_mpi_argc_argv *argc_argv) { STARPU_PTHREAD_MUTEX_INIT(&progress_mutex, NULL); STARPU_PTHREAD_COND_INIT(&progress_cond, NULL); starpu_sem_init(&callback_sem, 0, 0); running = 0; _starpu_mpi_env_init(); /* This function calls MPI_Init_thread if needed, and it initializes internal NMAD/Pioman variables, * required for piom_ltask_set_bound_thread_indexes() */ _starpu_mpi_do_initialize(argc_argv); callback_lfstack_init(&callback_stack); if (!_starpu_mpi_nobind && _starpu_mpi_thread_cpuid < 0) { _starpu_mpi_thread_cpuid = starpu_get_next_bindid(STARPU_THREAD_ACTIVE, NULL, 0); } /* Tell pioman to use a bound thread for communication progression: * share the same core as StarPU's MPI thread, the MPI thread has very low activity with NMAD backend */ #ifdef HAVE_PIOM_LTASK_SET_BOUND_THREAD_OS_INDEXES /* We prefer to give the OS index of the core, because StarPU can have * a different vision of the topology, especially if STARPU_WORKERS_GETBIND * is enabled */ int indexes[1] = { starpu_get_pu_os_index((unsigned) _starpu_mpi_thread_cpuid) }; if (!_starpu_mpi_nobind) piom_ltask_set_bound_thread_os_indexes(HWLOC_OBJ_PU, indexes, 1); #else int indexes[1] = { _starpu_mpi_thread_cpuid }; if (!_starpu_mpi_nobind) piom_ltask_set_bound_thread_indexes(HWLOC_OBJ_PU, indexes, 1); #endif /* Register some hooks for communication progress if needed */ int polling_point_prog, polling_point_idle; char *s_prog_hooks = starpu_getenv("STARPU_MPI_NMAD_PROG_HOOKS"); char *s_idle_hooks = starpu_getenv("STARPU_MPI_NMAD_IDLE_HOOKS"); if(!s_prog_hooks) { polling_point_prog = 0; } else { polling_point_prog = (strcmp(s_prog_hooks, "FORCED") == 0) ? PIOM_POLL_POINT_FORCED : (strcmp(s_prog_hooks, "SINGLE") == 0) ? PIOM_POLL_POINT_SINGLE : (strcmp(s_prog_hooks, "HOOK") == 0) ? PIOM_POLL_POINT_HOOK : 0; } if(!s_idle_hooks) { polling_point_idle = 0; } else { polling_point_idle = (strcmp(s_idle_hooks, "FORCED") == 0) ? PIOM_POLL_POINT_FORCED : (strcmp(s_idle_hooks, "SINGLE") == 0) ? PIOM_POLL_POINT_SINGLE : (strcmp(s_idle_hooks, "HOOK") == 0) ? PIOM_POLL_POINT_HOOK : 0; } if(polling_point_prog) { starpu_progression_hook_register((unsigned (*)(void *))&piom_ltask_schedule, (void *)&polling_point_prog); } if(polling_point_idle) { starpu_idle_hook_register((unsigned (*)(void *))&piom_ltask_schedule, (void *)&polling_point_idle); } /* Launch thread used for nmad callbacks */ STARPU_PTHREAD_CREATE(&progress_thread, NULL, _starpu_mpi_progress_thread_func, argc_argv); STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); while (!running) STARPU_PTHREAD_COND_WAIT(&progress_cond, &progress_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); return 0; } void _starpu_mpi_progress_shutdown(void **value) { /* kill the progression thread */ STARPU_PTHREAD_MUTEX_LOCK(&progress_mutex); running = 0; STARPU_PTHREAD_COND_BROADCAST(&progress_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&progress_mutex); starpu_sem_post(&callback_sem); STARPU_PTHREAD_JOIN(progress_thread, value); callback_lfstack_destroy(&callback_stack); STARPU_PTHREAD_MUTEX_DESTROY(&progress_mutex); STARPU_PTHREAD_COND_DESTROY(&progress_cond); } static int64_t _starpu_mpi_tag_max = INT64_MAX; int starpu_mpi_comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) { (void) comm; if (keyval == STARPU_MPI_TAG_UB) { if ((uint64_t) _starpu_mpi_tag_max > NM_TAG_MAX) _starpu_mpi_tag_max = NM_TAG_MAX; /* manage case where nmad max tag causes overflow if represented as starpu tag */ *(int64_t **)attribute_val = &_starpu_mpi_tag_max; *flag = 1; } else { *flag = 0; } return 0; } #endif /* STARPU_USE_MPI_NMAD*/ starpu-1.3.9+dfsg/mpi/src/nmad/starpu_mpi_nmad_backend.c000066400000000000000000000061461413463044200232610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_mpi_nmad_backend.h" #include #ifdef STARPU_USE_MPI_NMAD static void starpu_mpi_nmad_backend_constructor(void) __attribute__((constructor)); static void starpu_mpi_nmad_backend_constructor(void) { /* strat_prio is preferred for StarPU instead of default strat_aggreg */ setenv("NMAD_STRATEGY", "prio", 0 /* do not overwrite user-supplied value, if set */); /* prefer rcache on ibverbs */ setenv("NMAD_IBVERBS_RCACHE", "1", 0); /* use pioman dedicated thread */ setenv("PIOM_DEDICATED", "1", 0); /* pioman waits for starpu to place its dedicated thread */ setenv("PIOM_DEDICATED_WAIT", "1", 0); } void _starpu_mpi_nmad_backend_init(struct starpu_conf *conf) { (void)conf; } void _starpu_mpi_nmad_backend_shutdown(void) { } int _starpu_mpi_nmad_backend_reserve_core(void) { return 1; } void _starpu_mpi_nmad_backend_request_init(struct _starpu_mpi_req *req) { _STARPU_MPI_CALLOC(req->backend, 1, sizeof(struct _starpu_mpi_req_backend)); piom_cond_init(&req->backend->req_cond, 0); } void _starpu_mpi_nmad_backend_request_fill(struct _starpu_mpi_req *req, MPI_Comm comm, int is_internal_req) { nm_mpi_nmad_dest(&req->backend->session, &req->backend->gate, comm, req->node_tag.node.rank); } void _starpu_mpi_nmad_backend_request_destroy(struct _starpu_mpi_req *req) { piom_cond_destroy(&(req->backend->req_cond)); free(req->backend); } void _starpu_mpi_nmad_backend_data_clear(starpu_data_handle_t data_handle) { (void)data_handle; } void _starpu_mpi_nmad_backend_data_register(starpu_data_handle_t data_handle, starpu_mpi_tag_t data_tag) { (void)data_handle; (void)data_tag; } void _starpu_mpi_nmad_backend_comm_register(MPI_Comm comm) { (void)comm; } struct _starpu_mpi_backend _mpi_backend = { ._starpu_mpi_backend_init = _starpu_mpi_nmad_backend_init, ._starpu_mpi_backend_shutdown = _starpu_mpi_nmad_backend_shutdown, ._starpu_mpi_backend_reserve_core = _starpu_mpi_nmad_backend_reserve_core, ._starpu_mpi_backend_request_init = _starpu_mpi_nmad_backend_request_init, ._starpu_mpi_backend_request_fill = _starpu_mpi_nmad_backend_request_fill, ._starpu_mpi_backend_request_destroy = _starpu_mpi_nmad_backend_request_destroy, ._starpu_mpi_backend_data_clear = _starpu_mpi_nmad_backend_data_clear, ._starpu_mpi_backend_data_register = _starpu_mpi_nmad_backend_data_register, ._starpu_mpi_backend_comm_register = _starpu_mpi_nmad_backend_comm_register }; #endif /* STARPU_USE_MPI_NMAD*/ starpu-1.3.9+dfsg/mpi/src/nmad/starpu_mpi_nmad_backend.h000066400000000000000000000023311413463044200232560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_NMAD_BACKEND_H__ #define __STARPU_MPI_NMAD_BACKEND_H__ #include /** @file */ #ifdef __cplusplus extern "C" { #endif #ifdef STARPU_USE_MPI_NMAD #include #include #include struct _starpu_mpi_req_backend { nm_gate_t gate; nm_session_t session; nm_sr_request_t data_request; int waited; piom_cond_t req_cond; nm_sr_request_t size_req; }; #endif // STARPU_USE_MPI_NMAD #ifdef __cplusplus } #endif #endif // __STARPU_MPI_NMAD_BACKEND_H__ starpu-1.3.9+dfsg/mpi/src/starpu_mpi.c000066400000000000000000000354231413463044200176740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2019 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 static void _starpu_mpi_isend_irecv_common(struct _starpu_mpi_req *req, enum starpu_data_access_mode mode, int sequential_consistency) { /* 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(req->data_handle, STARPU_MAIN_RAM, mode, _starpu_mpi_submit_ready_request, (void *)req, sequential_consistency, 1, &req->pre_sync_jobid, &req->post_sync_jobid); } static struct _starpu_mpi_req *_starpu_mpi_isend_common(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, unsigned detached, unsigned sync, int prio, void (*callback)(void *), void *arg, int sequential_consistency) { if (_starpu_mpi_fake_world_size != -1) { /* Don't actually do the communication */ return NULL; } #ifdef STARPU_MPI_PEDANTIC_ISEND enum starpu_data_access_mode mode = STARPU_RW; #else enum starpu_data_access_mode mode = STARPU_R; #endif struct _starpu_mpi_req *req = _starpu_mpi_request_fill(data_handle, dest, data_tag, comm, detached, sync, prio, callback, arg, SEND_REQ, _starpu_mpi_isend_size_func, sequential_consistency, 0, 0); _starpu_mpi_req_willpost(req); if (_starpu_mpi_use_coop_sends && detached == 1 && sync == 0 && callback == NULL) { /* It's a send & forget send, we can perhaps optimize its distribution over several nodes */ _starpu_mpi_coop_send(data_handle, req, mode, sequential_consistency); return req; } /* Post normally */ _starpu_mpi_isend_irecv_common(req, mode, sequential_consistency); return req; } int starpu_mpi_isend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int dest, starpu_mpi_tag_t data_tag, int prio, 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, prio, 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(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm) { return starpu_mpi_isend_prio(data_handle, public_req, dest, data_tag, 0, comm); } int starpu_mpi_isend_detached_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, void (*callback)(void *), void *arg) { _STARPU_MPI_LOG_IN(); _starpu_mpi_isend_common(data_handle, dest, data_tag, comm, 1, 0, prio, callback, arg, 1); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg) { return starpu_mpi_isend_detached_prio(data_handle, dest, data_tag, 0, comm, callback, arg); } int starpu_mpi_send_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm) { starpu_mpi_req req; MPI_Status status; _STARPU_MPI_LOG_IN(); starpu_mpi_isend_prio(data_handle, &req, dest, data_tag, prio, comm); memset(&status, 0, sizeof(MPI_Status)); starpu_mpi_wait(&req, &status); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm) { return starpu_mpi_send_prio(data_handle, dest, data_tag, 0, comm); } int starpu_mpi_issend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int dest, starpu_mpi_tag_t data_tag, int prio, 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, prio, 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(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm) { return starpu_mpi_issend_prio(data_handle, public_req, dest, data_tag, 0, comm); } int starpu_mpi_issend_detached_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, MPI_Comm comm, void (*callback)(void *), void *arg) { _STARPU_MPI_LOG_IN(); _starpu_mpi_isend_common(data_handle, dest, data_tag, comm, 1, 1, prio, callback, arg, 1); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg) { return starpu_mpi_issend_detached_prio(data_handle, dest, data_tag, 0, comm, callback, arg); } struct _starpu_mpi_req *_starpu_mpi_irecv_common(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t 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) { if (_starpu_mpi_fake_world_size != -1) { /* Don't actually do the communication */ return NULL; } struct _starpu_mpi_req *req = _starpu_mpi_request_fill(data_handle, source, data_tag, comm, detached, sync, 0, callback, arg, RECV_REQ, _starpu_mpi_irecv_size_func, sequential_consistency, is_internal_req, count); _starpu_mpi_req_willpost(req); _starpu_mpi_isend_irecv_common(req, STARPU_W, sequential_consistency); return req; } int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *public_req, int source, starpu_mpi_tag_t data_tag, MPI_Comm comm) { _STARPU_MPI_LOG_IN(); STARPU_MPI_ASSERT_MSG(public_req, "starpu_mpi_irecv needs a valid starpu_mpi_req"); 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, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg) { _STARPU_MPI_LOG_IN(); _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, starpu_mpi_tag_t data_tag, MPI_Comm comm, void (*callback)(void *), void *arg, int sequential_consistency) { _STARPU_MPI_LOG_IN(); _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, starpu_mpi_tag_t data_tag, MPI_Comm comm, MPI_Status *status) { STARPU_ASSERT_MSG(status != NULL || status == MPI_STATUS_IGNORE, "MPI_Status value cannot be NULL or different from MPI_STATUS_IGNORE"); starpu_mpi_req req; _STARPU_MPI_LOG_IN(); starpu_mpi_irecv(data_handle, &req, source, data_tag, comm); starpu_mpi_wait(&req, status); _STARPU_MPI_LOG_OUT(); return 0; } int starpu_mpi_wait(starpu_mpi_req *public_req, MPI_Status *status) { STARPU_ASSERT_MSG(status != NULL || status == MPI_STATUS_IGNORE, "MPI_Status value cannot be NULL or different from MPI_STATUS_IGNORE"); return _starpu_mpi_wait(public_req, status); } int starpu_mpi_test(starpu_mpi_req *public_req, int *flag, MPI_Status *status) { return _starpu_mpi_test(public_req, flag, status); } int starpu_mpi_barrier(MPI_Comm comm) { return _starpu_mpi_barrier(comm); } void _starpu_mpi_data_clear(starpu_data_handle_t data_handle) { _mpi_backend._starpu_mpi_backend_data_clear(data_handle); _starpu_mpi_cache_data_clear(data_handle); free(data_handle->mpi_data); data_handle->mpi_data = NULL; } struct _starpu_mpi_data *_starpu_mpi_data_get(starpu_data_handle_t data_handle) { struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (mpi_data) { STARPU_ASSERT(mpi_data->magic == 42); } else { _STARPU_CALLOC(mpi_data, 1, sizeof(struct _starpu_mpi_data)); mpi_data->magic = 42; mpi_data->node_tag.data_tag = -1; mpi_data->node_tag.node.rank = -1; mpi_data->node_tag.node.comm = MPI_COMM_WORLD; _starpu_spin_init(&mpi_data->coop_lock); data_handle->mpi_data = mpi_data; _starpu_mpi_cache_data_init(data_handle); _starpu_data_set_unregister_hook(data_handle, _starpu_mpi_data_clear); } return mpi_data; } void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle, starpu_mpi_tag_t data_tag, int rank, MPI_Comm comm) { struct _starpu_mpi_data *mpi_data = _starpu_mpi_data_get(data_handle); if (data_tag != -1) { _mpi_backend._starpu_mpi_backend_data_register(data_handle, data_tag); mpi_data->node_tag.data_tag = data_tag; _STARPU_MPI_TRACE_DATA_SET_TAG(data_handle, data_tag); } if (rank != -1) { _STARPU_MPI_TRACE_DATA_SET_RANK(data_handle, rank); mpi_data->node_tag.node.rank = rank; mpi_data->node_tag.node.comm = 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, starpu_mpi_tag_t data_tag) { starpu_mpi_data_register_comm(handle, data_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_data *)(data->mpi_data))->node_tag.node.rank; } starpu_mpi_tag_t 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_data *)(data->mpi_data))->node_tag.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; starpu_mpi_tag_t data_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_comm()\n"); } starpu_mpi_comm_rank(comm, &me); if (node == rank) return; data_tag = starpu_mpi_data_get_tag(data_handle); if (data_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_comm()\n"); } if (me == node) { _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); int already_received = starpu_mpi_cached_receive_set(data_handle); if (already_received == 0) { _STARPU_MPI_DEBUG(1, "Receiving data %p from %d\n", data_handle, rank); starpu_mpi_irecv_detached(data_handle, rank, data_tag, comm, callback, arg); } } else if (me == rank) { _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); int already_sent = starpu_mpi_cached_send_set(data_handle, node); if (already_sent == 0) { _STARPU_MPI_DEBUG(1, "Sending data %p to %d\n", data_handle, node); starpu_mpi_isend_detached(data_handle, node, data_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; starpu_mpi_tag_t data_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; data_tag = starpu_mpi_data_get_tag(data_handle); if (data_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); int already_received = starpu_mpi_cached_receive_set(data_handle); if (already_received == 0) { _STARPU_MPI_DEBUG(1, "Receiving data %p from %d\n", data_handle, rank); starpu_mpi_recv(data_handle, rank, data_tag, comm, &status); } } else if (me == rank) { _STARPU_MPI_DEBUG(1, "Migrating data %p from %d to %d\n", data_handle, rank, node); int already_sent = starpu_mpi_cached_send_set(data_handle, node); if (already_sent == 0) { _STARPU_MPI_DEBUG(1, "Sending data %p to %d\n", data_handle, node); starpu_mpi_send(data_handle, node, data_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); 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_wait_for_all(MPI_Comm comm) { starpu_task_wait_for_all(); starpu_mpi_barrier(comm); return 0; } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_cache.c000066400000000000000000000247561413463044200210260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* Whether we are allowed to keep copies of remote data. */ struct _starpu_data_entry { UT_hash_handle hh; starpu_data_handle_t data_handle; }; static starpu_pthread_mutex_t _cache_mutex; static struct _starpu_data_entry *_cache_data = NULL; int _starpu_cache_enabled=1; static MPI_Comm _starpu_cache_comm; static int _starpu_cache_comm_size; static void _starpu_mpi_cache_flush_nolock(starpu_data_handle_t data_handle); 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_shutdown(); } _starpu_cache_enabled = 0; } return 0; } void _starpu_mpi_cache_init(MPI_Comm comm) { _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_cache_stats_init(); STARPU_PTHREAD_MUTEX_INIT(&_cache_mutex, NULL); } void _starpu_mpi_cache_shutdown() { if (_starpu_cache_enabled == 0) return; struct _starpu_data_entry *entry=NULL, *tmp=NULL; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); HASH_ITER(hh, _cache_data, entry, tmp) { HASH_DEL(_cache_data, entry); free(entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); STARPU_PTHREAD_MUTEX_DESTROY(&_cache_mutex); _starpu_mpi_cache_stats_shutdown(); } void _starpu_mpi_cache_data_clear(starpu_data_handle_t data_handle) { struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 1) { struct _starpu_data_entry *entry; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); _starpu_mpi_cache_flush_nolock(data_handle); HASH_FIND_PTR(_cache_data, &data_handle, entry); if (entry != NULL) { HASH_DEL(_cache_data, entry); free(entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } free(mpi_data->cache_sent); } void _starpu_mpi_cache_data_init(starpu_data_handle_t data_handle) { int i; struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 0) return; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); mpi_data->cache_received = 0; _STARPU_MALLOC(mpi_data->cache_sent, _starpu_cache_comm_size*sizeof(mpi_data->cache_sent[0])); for(i=0 ; i<_starpu_cache_comm_size ; i++) { mpi_data->cache_sent[i] = 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } static void _starpu_mpi_cache_data_add_nolock(starpu_data_handle_t data_handle) { struct _starpu_data_entry *entry; if (_starpu_cache_enabled == 0) return; HASH_FIND_PTR(_cache_data, &data_handle, entry); if (entry == NULL) { _STARPU_MPI_MALLOC(entry, sizeof(*entry)); entry->data_handle = data_handle; HASH_ADD_PTR(_cache_data, data_handle, entry); } } static void _starpu_mpi_cache_data_remove_nolock(starpu_data_handle_t data_handle) { struct _starpu_data_entry *entry; if (_starpu_cache_enabled == 0) return; HASH_FIND_PTR(_cache_data, &data_handle, entry); if (entry) { HASH_DEL(_cache_data, entry); free(entry); } } /************************************** * Received cache **************************************/ void starpu_mpi_cached_receive_clear(starpu_data_handle_t data_handle) { int mpi_rank = starpu_mpi_data_get_rank(data_handle); struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 0) return; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); STARPU_ASSERT(mpi_data->magic == 42); STARPU_MPI_ASSERT_MSG(mpi_rank < _starpu_cache_comm_size, "Node %d invalid. Max node is %d\n", mpi_rank, _starpu_cache_comm_size); if (mpi_data->cache_received == 1) { #ifdef STARPU_DEVEL # warning TODO: Somebody else will write to the data, so discard our cached copy if any. starpu_mpi could just remember itself. #endif _STARPU_MPI_DEBUG(2, "Clearing receive cache for data %p\n", data_handle); mpi_data->cache_received = 0; starpu_data_invalidate_submit(data_handle); _starpu_mpi_cache_data_remove_nolock(data_handle); _starpu_mpi_cache_stats_dec(mpi_rank, data_handle); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } int starpu_mpi_cached_receive_set(starpu_data_handle_t data_handle) { int mpi_rank = starpu_mpi_data_get_rank(data_handle); struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 0) return 0; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); STARPU_ASSERT(mpi_data->magic == 42); STARPU_MPI_ASSERT_MSG(mpi_rank < _starpu_cache_comm_size, "Node %d invalid. Max node is %d\n", mpi_rank, _starpu_cache_comm_size); int already_received = mpi_data->cache_received; if (already_received == 0) { _STARPU_MPI_DEBUG(2, "Noting that data %p has already been received by %d\n", data_handle, mpi_rank); mpi_data->cache_received = 1; _starpu_mpi_cache_data_add_nolock(data_handle); _starpu_mpi_cache_stats_inc(mpi_rank, data_handle); } else { _STARPU_MPI_DEBUG(2, "Do not receive data %p from node %d as it is already available\n", data_handle, mpi_rank); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); return already_received; } int starpu_mpi_cached_receive(starpu_data_handle_t data_handle) { int already_received; struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 0) return 0; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); STARPU_ASSERT(mpi_data->magic == 42); already_received = mpi_data->cache_received; STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); return already_received; } /************************************** * Send cache **************************************/ void starpu_mpi_cached_send_clear(starpu_data_handle_t data_handle) { int n, size; struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 0) return; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); starpu_mpi_comm_size(mpi_data->node_tag.node.comm, &size); for(n=0 ; ncache_sent[n] == 1) { _STARPU_MPI_DEBUG(2, "Clearing send cache for data %p\n", data_handle); mpi_data->cache_sent[n] = 0; _starpu_mpi_cache_data_remove_nolock(data_handle); } } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } int starpu_mpi_cached_send_set(starpu_data_handle_t data_handle, int dest) { struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; if (_starpu_cache_enabled == 0) return 0; 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_mutex); int already_sent = mpi_data->cache_sent[dest]; if (mpi_data->cache_sent[dest] == 0) { mpi_data->cache_sent[dest] = 1; _starpu_mpi_cache_data_add_nolock(data_handle); _STARPU_MPI_DEBUG(2, "Noting that data %p has already been sent to %d\n", data_handle, dest); } else { _STARPU_MPI_DEBUG(2, "Do not send data %p to node %d as it has already been sent\n", data_handle, dest); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); return already_sent; } int starpu_mpi_cached_send(starpu_data_handle_t data_handle, int dest) { struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; int already_sent; if (_starpu_cache_enabled == 0) return 0; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); STARPU_MPI_ASSERT_MSG(dest < _starpu_cache_comm_size, "Node %d invalid. Max node is %d\n", dest, _starpu_cache_comm_size); already_sent = mpi_data->cache_sent[dest]; STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); return already_sent; } static void _starpu_mpi_cache_flush_nolock(starpu_data_handle_t data_handle) { struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; int i, nb_nodes; if (_starpu_cache_enabled == 0) return; starpu_mpi_comm_size(mpi_data->node_tag.node.comm, &nb_nodes); for(i=0 ; icache_sent[i] == 1) { _STARPU_MPI_DEBUG(2, "Clearing send cache for data %p\n", data_handle); mpi_data->cache_sent[i] = 0; _starpu_mpi_cache_stats_dec(i, data_handle); } } if (mpi_data->cache_received == 1) { int mpi_rank = starpu_mpi_data_get_rank(data_handle); _STARPU_MPI_DEBUG(2, "Clearing received cache for data %p\n", data_handle); mpi_data->cache_received = 0; _starpu_mpi_cache_stats_dec(mpi_rank, data_handle); } } void _starpu_mpi_cache_flush(starpu_data_handle_t data_handle) { if (_starpu_cache_enabled == 0) return; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); _starpu_mpi_cache_flush_nolock(data_handle); STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } static void _starpu_mpi_cache_flush_and_invalidate_nolock(MPI_Comm comm, starpu_data_handle_t data_handle) { int my_rank, mpi_rank; _starpu_mpi_cache_flush_nolock(data_handle); starpu_mpi_comm_rank(comm, &my_rank); mpi_rank = starpu_mpi_data_get_rank(data_handle); if (mpi_rank != my_rank && mpi_rank != -1) starpu_data_invalidate_submit(data_handle); } void starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle) { _starpu_mpi_data_flush(data_handle); if (_starpu_cache_enabled == 0) return; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); _starpu_mpi_cache_flush_and_invalidate_nolock(comm, data_handle); _starpu_mpi_cache_data_remove_nolock(data_handle); STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } void starpu_mpi_cache_flush_all_data(MPI_Comm comm) { struct _starpu_data_entry *entry=NULL, *tmp=NULL; if (_starpu_cache_enabled == 0) return; STARPU_PTHREAD_MUTEX_LOCK(&_cache_mutex); HASH_ITER(hh, _cache_data, entry, tmp) { _starpu_mpi_cache_flush_and_invalidate_nolock(comm, entry->data_handle); HASH_DEL(_cache_data, entry); free(entry); } STARPU_PTHREAD_MUTEX_UNLOCK(&_cache_mutex); } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_cache.h000066400000000000000000000023311413463044200210140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef __cplusplus extern "C" { #endif extern int _starpu_cache_enabled; void _starpu_mpi_cache_init(MPI_Comm comm); void _starpu_mpi_cache_shutdown(); void _starpu_mpi_cache_data_init(starpu_data_handle_t data_handle); void _starpu_mpi_cache_data_clear(starpu_data_handle_t data_handle); void _starpu_mpi_cache_flush(starpu_data_handle_t data_handle); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_CACHE_H__ starpu-1.3.9+dfsg/mpi/src/starpu_mpi_cache_stats.c000066400000000000000000000031161413463044200222270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 int stats_enabled=0; void _starpu_mpi_cache_stats_init() { 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"); } void _starpu_mpi_cache_stats_shutdown() { if (stats_enabled == 0) return; } 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 %u\n", (long)size, dst); } else // count == -1 { _STARPU_MPI_MSG("[communication cache] - %10ld from %u\n", (long)size, dst); } } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_cache_stats.h000066400000000000000000000024661413463044200222430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_cache_stats_init(); void _starpu_mpi_cache_stats_shutdown(); 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.3.9+dfsg/mpi/src/starpu_mpi_collective.c000066400000000000000000000111631413463044200221000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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]); starpu_mpi_tag_t 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]); starpu_mpi_tag_t 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]); starpu_mpi_tag_t 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.3.9+dfsg/mpi/src/starpu_mpi_coop_sends.c000066400000000000000000000220161413463044200221020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* * One node sends the same data to several nodes. Gather them into a * "coop_sends", which then has a global view of all the required sends, and can * establish a diffusion tree by telling receiving nodes to retransmit what they * received (forwards) to others, and to others that they will receive from the * former (redirects). */ /* This is called after a request is finished processing, to release the data */ void _starpu_mpi_release_req_data(struct _starpu_mpi_req *req) { if (!req->data_handle) return; if (_starpu_mpi_req_multilist_queued_coop_sends(req)) { struct _starpu_mpi_coop_sends *coop_sends = req->coop_sends_head; struct _starpu_mpi_data *mpi_data = coop_sends->mpi_data; int last; _starpu_spin_lock(&mpi_data->coop_lock); /* Part of a cooperative send, dequeue ourself from others */ _starpu_mpi_req_multilist_erase_coop_sends(&coop_sends->reqs, req); last = _starpu_mpi_req_multilist_empty_coop_sends(&coop_sends->reqs); _starpu_spin_unlock(&mpi_data->coop_lock); if (last) { /* We were last, release data */ free(coop_sends->reqs_array); free(coop_sends); starpu_data_release_on_node(req->data_handle, STARPU_MAIN_RAM); } } else { /* Trivial request */ starpu_data_release_on_node(req->data_handle, STARPU_MAIN_RAM); } } /* Comparison function for getting qsort to put requests with high priority first */ static int _starpu_mpi_reqs_prio_compare(const void *a, const void *b) { const struct _starpu_mpi_req * const *ra = a; const struct _starpu_mpi_req * const *rb = b; if ((*rb)->prio < (*ra)->prio) return -1; else if ((*rb)->prio == (*ra)->prio) return 0; else return 1; } /* Sort the requests by priority and build a diffusion tree. Actually does something only once per coop_sends bag. */ static void _starpu_mpi_coop_sends_optimize(struct _starpu_mpi_coop_sends *coop_sends) { if (coop_sends->n == 1) /* Trivial case, don't optimize */ return; _starpu_spin_lock(&coop_sends->lock); if (!coop_sends->reqs_array) { unsigned n = coop_sends->n, i; struct _starpu_mpi_req *cur; struct _starpu_mpi_req **reqs; _STARPU_MPI_DEBUG(0, "handling cooperative sends %p for %u neighbours\n", coop_sends, n); /* Store them in an array */ _STARPU_CALLOC(reqs, n, sizeof(*reqs)); for (cur = _starpu_mpi_req_multilist_begin_coop_sends(&coop_sends->reqs), i = 0; cur != _starpu_mpi_req_multilist_end_coop_sends(&coop_sends->reqs); cur = _starpu_mpi_req_multilist_next_coop_sends(cur), i++) reqs[i] = cur; coop_sends->reqs_array = reqs; /* Sort them */ qsort(reqs, n, sizeof(*reqs), _starpu_mpi_reqs_prio_compare); /* And build the diffusion tree */ _starpu_mpi_coop_sends_build_tree(coop_sends); } _starpu_spin_unlock(&coop_sends->lock); } /* This is called on completion of acquisition of data for a cooperative send */ static void _starpu_mpi_coop_sends_data_ready(void *arg) { _STARPU_MPI_LOG_IN(); struct _starpu_mpi_coop_sends *coop_sends = arg; struct _starpu_mpi_data *mpi_data = coop_sends->mpi_data; /* Take the cooperative send bag out from more submissions */ if (mpi_data->coop_sends == coop_sends) { _starpu_spin_lock(&mpi_data->coop_lock); if (mpi_data->coop_sends == coop_sends) mpi_data->coop_sends = NULL; _starpu_spin_unlock(&mpi_data->coop_lock); } /* Build diffusion tree */ _starpu_mpi_coop_sends_optimize(coop_sends); if (coop_sends->n == 1) { /* Trivial case, just submit it */ _starpu_mpi_submit_ready_request(_starpu_mpi_req_multilist_begin_coop_sends(&coop_sends->reqs)); } else { /* And submit them */ if (STARPU_TEST_AND_SET(&coop_sends->redirects_sent, 1) == 0) _starpu_mpi_submit_coop_sends(coop_sends, 1, 1); else _starpu_mpi_submit_coop_sends(coop_sends, 0, 1); } _STARPU_MPI_LOG_OUT(); } /* This is called when we want to stop including new members in a cooperative send, * either because we know there won't be any other members due to the algorithm * or because the value has changed. */ static void _starpu_mpi_coop_send_flush(struct _starpu_mpi_coop_sends *coop_sends) { if (!coop_sends) return; /* Build diffusion tree */ _starpu_mpi_coop_sends_optimize(coop_sends); if (coop_sends->n == 1) /* Trivial case, we will just send the data */ return; /* And submit them */ if (STARPU_TEST_AND_SET(&coop_sends->redirects_sent, 1) == 0) _starpu_mpi_submit_coop_sends(coop_sends, 1, 0); } /* This is called when a write to the data was just submitted, which means we * can't make future sends cooperate with past sends since it's not the same value */ void _starpu_mpi_data_flush(starpu_data_handle_t data_handle) { struct _starpu_mpi_data *mpi_data = data_handle->mpi_data; struct _starpu_mpi_coop_sends *coop_sends; if (!mpi_data) return; _starpu_spin_lock(&mpi_data->coop_lock); coop_sends = mpi_data->coop_sends; if (coop_sends) mpi_data->coop_sends = NULL; _starpu_spin_unlock(&mpi_data->coop_lock); if (coop_sends) { _STARPU_MPI_DEBUG(0, "%p: data written to, flush cooperative sends %p\n", data_handle, coop_sends); _starpu_mpi_coop_send_flush(coop_sends); } } /* Test whether a request is compatible with a cooperative send */ static int _starpu_mpi_coop_send_compatible(struct _starpu_mpi_req *req, struct _starpu_mpi_coop_sends *coop_sends) { struct _starpu_mpi_req *prevreq; prevreq = _starpu_mpi_req_multilist_begin_coop_sends(&coop_sends->reqs); return /* we can cope with tag being different */ prevreq->node_tag.node.comm == req->node_tag.node.comm && prevreq->sequential_consistency == req->sequential_consistency; } void _starpu_mpi_coop_send(starpu_data_handle_t data_handle, struct _starpu_mpi_req *req, enum starpu_data_access_mode mode, int sequential_consistency) { struct _starpu_mpi_data *mpi_data = _starpu_mpi_data_get(data_handle); struct _starpu_mpi_coop_sends *coop_sends = NULL, *tofree = NULL; int done = 0, queue, first = 1; /* Try to add ourself to something existing, otherwise create one. */ while (!done) { _starpu_spin_lock(&mpi_data->coop_lock); if (mpi_data->coop_sends) { /* Already something, check we are coherent with it */ queue = _starpu_mpi_coop_send_compatible(req, mpi_data->coop_sends); if (queue) { /* Yes, queue ourself there */ if (coop_sends) { /* Remove ourself from what we created for ourself first */ _starpu_mpi_req_multilist_erase_coop_sends(&coop_sends->reqs, req); tofree = coop_sends; } coop_sends = mpi_data->coop_sends; _STARPU_MPI_DEBUG(0, "%p: add to cooperative sends %p, dest %d\n", data_handle, coop_sends, req->node_tag.node.rank); _starpu_mpi_req_multilist_push_back_coop_sends(&coop_sends->reqs, req); coop_sends->n++; req->coop_sends_head = coop_sends; first = 0; done = 1; } else { /* Nope, incompatible, put ours instead */ _STARPU_MPI_DEBUG(0, "%p: new cooperative sends %p, dest %d\n", data_handle, coop_sends, req->node_tag.node.rank); mpi_data->coop_sends = coop_sends; first = 1; _starpu_spin_unlock(&mpi_data->coop_lock); /* and flush it */ _starpu_mpi_coop_send_flush(coop_sends); break; } } else if (coop_sends) { /* Nobody else and we have allocated one, we're first! */ _STARPU_MPI_DEBUG(0, "%p: new cooperative sends %p, dest %d\n", data_handle, coop_sends, req->node_tag.node.rank); mpi_data->coop_sends = coop_sends; first = 1; done = 1; } _starpu_spin_unlock(&mpi_data->coop_lock); if (!done && !coop_sends) { /* Didn't find something to join, create one out of critical section */ _STARPU_MPI_CALLOC(coop_sends, 1, sizeof(*coop_sends)); coop_sends->redirects_sent = 0; coop_sends->n = 1; _starpu_mpi_req_multilist_head_init_coop_sends(&coop_sends->reqs); _starpu_mpi_req_multilist_push_back_coop_sends(&coop_sends->reqs, req); _starpu_spin_init(&coop_sends->lock); req->coop_sends_head = coop_sends; coop_sends->mpi_data = mpi_data; } /* We at worse do two iteration */ STARPU_ASSERT(done || coop_sends); } /* In case we created one for nothing after all */ free(tofree); if (first) { /* We were first, we are responsible for acquiring the data for everybody */ starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(req->data_handle, STARPU_MAIN_RAM, mode, _starpu_mpi_coop_sends_data_ready, coop_sends, sequential_consistency, 0, &req->pre_sync_jobid, NULL); } } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_datatype.c000066400000000000000000000303601413463044200215620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; }; /* We want to allow applications calling starpu_mpi_interface_datatype_register/unregister as constructor/destructor */ static starpu_pthread_mutex_t _starpu_mpi_datatype_funcs_table_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static struct _starpu_mpi_datatype_funcs *_starpu_mpi_datatype_funcs_table = NULL; void _starpu_mpi_datatype_init(void) { } void _starpu_mpi_datatype_shutdown(void) { } /* * Matrix */ static int handle_to_datatype_matrix(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { struct starpu_matrix_interface *matrix_interface = starpu_data_get_interface_on_node(data_handle, STARPU_MAIN_RAM); int ret; unsigned nx = STARPU_MATRIX_GET_NX(matrix_interface); unsigned ny = STARPU_MATRIX_GET_NY(matrix_interface); unsigned ld = STARPU_MATRIX_GET_LD(matrix_interface); size_t elemsize = STARPU_MATRIX_GET_ELEMSIZE(matrix_interface); 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"); return 0; } /* * Block */ static int handle_to_datatype_block(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { struct starpu_block_interface *block_interface = starpu_data_get_interface_on_node(data_handle, STARPU_MAIN_RAM); int ret; unsigned nx = STARPU_BLOCK_GET_NX(block_interface); unsigned ny = STARPU_BLOCK_GET_NY(block_interface); unsigned nz = STARPU_BLOCK_GET_NZ(block_interface); unsigned ldy = STARPU_BLOCK_GET_LDY(block_interface); unsigned ldz = STARPU_BLOCK_GET_LDZ(block_interface); size_t elemsize = STARPU_BLOCK_GET_ELEMSIZE(block_interface); 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_create_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"); return 0; } /* * Vector */ static int handle_to_datatype_vector(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { struct starpu_vector_interface *vector_interface = starpu_data_get_interface_on_node(data_handle, STARPU_MAIN_RAM); int ret; unsigned nx = STARPU_VECTOR_GET_NX(vector_interface); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(vector_interface); 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"); return 0; } /* * Variable */ static int handle_to_datatype_variable(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { struct starpu_variable_interface *variable_interface = starpu_data_get_interface_on_node(data_handle, STARPU_MAIN_RAM); int ret; size_t elemsize = STARPU_VARIABLE_GET_ELEMSIZE(variable_interface); 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"); return 0; } /* * Void */ static int handle_to_datatype_void(starpu_data_handle_t data_handle, MPI_Datatype *datatype) { int ret; (void)data_handle; 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"); return 0; } /* * 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, }; MPI_Datatype _starpu_mpi_datatype_get_user_defined_datatype(starpu_data_handle_t data_handle) { enum starpu_data_interface_id id = starpu_data_get_interface_id(data_handle); if (id < STARPU_MAX_INTERFACE_ID) return 0; 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 && table->allocate_datatype_func) { MPI_Datatype datatype; int ret = table->allocate_datatype_func(data_handle, &datatype); if (ret == 0) return datatype; else return 0; } return 0; } void _starpu_mpi_datatype_allocate(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); int ret = table->allocate_datatype_func(data_handle, &req->datatype); if (ret == 0) req->registered_datatype = 1; else { /* Couldn't register, probably complex data which needs packing. */ req->datatype = MPI_BYTE; req->registered_datatype = 0; } } 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; MPI_Type_get_envelope(*datatype, &num_ints, &num_adds, &num_datatypes, &combiner); if (combiner != MPI_COMBINER_NAMED) { int *array_of_ints; MPI_Aint *array_of_adds; MPI_Datatype *array_of_datatypes; int i; _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); if (*datatype != MPI_BYTE) table->free_datatype_func(datatype); } } /* else the datatype is not predefined by StarPU */ } int starpu_mpi_interface_datatype_register(enum starpu_data_interface_id id, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func) { 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_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex); return 0; } 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); int ret; ret = starpu_mpi_interface_datatype_register(id, allocate_datatype_func, free_datatype_func); STARPU_ASSERT_MSG(handle->ops->handle_to_pointer || handle->ops->to_pointer, "The data interface must define the operation 'to_pointer'\n"); return ret; } int starpu_mpi_interface_datatype_unregister(enum starpu_data_interface_id id) { 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; } int starpu_mpi_datatype_unregister(starpu_data_handle_t handle) { enum starpu_data_interface_id id = starpu_data_get_interface_id(handle); return starpu_mpi_interface_datatype_unregister(id); } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_datatype.h000066400000000000000000000024241413463044200215670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_datatype_init(void); void _starpu_mpi_datatype_shutdown(void); void _starpu_mpi_datatype_allocate(starpu_data_handle_t data_handle, struct _starpu_mpi_req *req); void _starpu_mpi_datatype_free(starpu_data_handle_t data_handle, MPI_Datatype *datatype); MPI_Datatype _starpu_mpi_datatype_get_user_defined_datatype(starpu_data_handle_t data_handle); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_DATATYPE_H__ starpu-1.3.9+dfsg/mpi/src/starpu_mpi_fortran.c000066400000000000000000000253141413463044200214250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { void *ptr; _STARPU_MPI_CALLOC(ptr, 1, sizeof(starpu_mpi_req)); return ptr; } void fstarpu_mpi_req_free(starpu_mpi_req *req) { free(req); } MPI_Status *fstarpu_mpi_status_alloc(void) { void *ptr; _STARPU_MPI_CALLOC(ptr, 1, sizeof(MPI_Status)); return ptr; } 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, starpu_mpi_tag_t data_tag, MPI_Fint comm, void (*callback)(void *), void *arg, int seq_const) { return starpu_mpi_irecv_detached_sequential_consistency(data_handle, src, data_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); } void fstarpu_mpi_redux_data_prio(MPI_Fint comm, starpu_data_handle_t data_handle, int prio) { starpu_mpi_redux_data_prio(MPI_Comm_f2c(comm), data_handle, prio); } /* 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, starpu_mpi_tag_t data_tag, MPI_Fint comm, starpu_tag_t *starpu_tag) { return starpu_mpi_isend_detached_unlock_tag(data_handle, dst, data_tag, MPI_Comm_f2c(comm), *starpu_tag); } int fstarpu_mpi_isend_detached_unlock_tag_prio(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, int prio, MPI_Fint comm, starpu_tag_t *starpu_tag) { return starpu_mpi_isend_detached_unlock_tag_prio(data_handle, dst, data_tag, prio, MPI_Comm_f2c(comm), *starpu_tag); } int fstarpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int src, starpu_mpi_tag_t data_tag, MPI_Fint comm, starpu_tag_t *starpu_tag) { return starpu_mpi_irecv_detached_unlock_tag(data_handle, src, data_tag, MPI_Comm_f2c(comm), *starpu_tag); } /* isend/irecv array detached unlock tag */ int fstarpu_mpi_isend_array_detached_unlock_tag_prio(int array_size, starpu_data_handle_t *data_handles, int *dsts, starpu_mpi_tag_t *data_tags, int *prio, 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_prio((unsigned)array_size, data_handles, dsts, data_tags, prio, comms, *starpu_tag); return ret; } int fstarpu_mpi_isend_array_detached_unlock_tag(int array_size, starpu_data_handle_t *data_handles, int *dsts, starpu_mpi_tag_t *data_tags, MPI_Fint *_comms, starpu_tag_t *starpu_tag) { return fstarpu_mpi_isend_array_detached_unlock_tag_prio(array_size, data_handles, dsts, data_tags, NULL, _comms, starpu_tag); } int fstarpu_mpi_irecv_array_detached_unlock_tag(int array_size, starpu_data_handle_t *data_handles, int *srcs, starpu_mpi_tag_t *data_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, data_tags, comms, *starpu_tag); return ret; } /* isend/irecv */ int fstarpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dst, starpu_mpi_tag_t data_tag, MPI_Fint comm) { return starpu_mpi_isend(data_handle, req, dst, data_tag, MPI_Comm_f2c(comm)); } int fstarpu_mpi_isend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dst, starpu_mpi_tag_t data_tag, int prio, MPI_Fint comm) { return starpu_mpi_isend_prio(data_handle, req, dst, data_tag, prio, MPI_Comm_f2c(comm)); } int fstarpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int src, starpu_mpi_tag_t data_tag, MPI_Fint comm) { return starpu_mpi_irecv(data_handle, req, src, data_tag, MPI_Comm_f2c(comm)); } /* send/recv */ int fstarpu_mpi_send(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, MPI_Fint comm) { return starpu_mpi_send(data_handle, dst, data_tag, MPI_Comm_f2c(comm)); } int fstarpu_mpi_send_prio(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, int prio, MPI_Fint comm) { return starpu_mpi_send_prio(data_handle, dst, data_tag, prio, MPI_Comm_f2c(comm)); } int fstarpu_mpi_recv(starpu_data_handle_t data_handle, int src, starpu_mpi_tag_t data_tag, MPI_Fint comm, MPI_Status *status) { return starpu_mpi_recv(data_handle, src, data_tag, MPI_Comm_f2c(comm), status); } /* isend/irecv detached */ int fstarpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_isend_detached(data_handle, dst, data_tag, MPI_Comm_f2c(comm), callback, arg); } int fstarpu_mpi_isend_detached_prio(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, int prio, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_isend_detached_prio(data_handle, dst, data_tag, prio, MPI_Comm_f2c(comm), callback, arg); } int fstarpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int src, starpu_mpi_tag_t data_tag, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_irecv_detached(data_handle, src, data_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, starpu_mpi_tag_t data_tag, MPI_Fint comm) { return starpu_mpi_issend(data_handle, req, dst, data_tag, MPI_Comm_f2c(comm)); } int fstarpu_mpi_issend_prio(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dst, starpu_mpi_tag_t data_tag, int prio, MPI_Fint comm) { return starpu_mpi_issend_prio(data_handle, req, dst, data_tag, prio, MPI_Comm_f2c(comm)); } int fstarpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_issend_detached(data_handle, dst, data_tag, MPI_Comm_f2c(comm), callback, arg); } int fstarpu_mpi_issend_detached_prio(starpu_data_handle_t data_handle, int dst, starpu_mpi_tag_t data_tag, int prio, MPI_Fint comm, void (*callback)(void *), void *arg) { return starpu_mpi_issend_detached_prio(data_handle, dst, data_tag, prio, 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, starpu_mpi_tag_t data_tag, int rank, MPI_Fint comm) { return starpu_mpi_data_register_comm(handle, data_tag, rank, MPI_Comm_f2c(comm)); } void fstarpu_mpi_data_register(starpu_data_handle_t handle, starpu_mpi_tag_t data_tag, int rank) { return starpu_mpi_data_register_comm(handle, data_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.3.9+dfsg/mpi/src/starpu_mpi_fxt.h000066400000000000000000000235421413463044200205610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2019 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #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_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 #define _STARPU_MPI_FUT_IRECV_COMPLETE_BEGIN 0x520a #define _STARPU_MPI_FUT_IRECV_COMPLETE_END 0x520b #define _STARPU_MPI_FUT_SLEEP_BEGIN 0x520c #define _STARPU_MPI_FUT_SLEEP_END 0x520d #define _STARPU_MPI_FUT_DTESTING_BEGIN 0x520e #define _STARPU_MPI_FUT_DTESTING_END 0x520f #define _STARPU_MPI_FUT_UTESTING_BEGIN 0x5210 #define _STARPU_MPI_FUT_UTESTING_END 0x5211 #define _STARPU_MPI_FUT_UWAIT_BEGIN 0x5212 #define _STARPU_MPI_FUT_UWAIT_END 0x5213 #define _STARPU_MPI_FUT_POLLING_BEGIN 0x5214 #define _STARPU_MPI_FUT_POLLING_END 0x5215 #define _STARPU_MPI_FUT_DRIVER_RUN_BEGIN 0x5216 #define _STARPU_MPI_FUT_DRIVER_RUN_END 0x5217 #define _STARPU_MPI_FUT_DATA_SET_TAG 0x5218 #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) do {\ if (_starpu_fxt_started) \ FUT_DO_ALWAYS_PROBE4(_STARPU_MPI_FUT_BARRIER, (rank), (worldsize), (key), _starpu_gettid()); \ } while (0) #define _STARPU_MPI_TRACE_ISEND_SUBMIT_BEGIN(dest, data_tag, size) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_ISEND_SUBMIT_BEGIN, (dest), (data_tag), (size), _starpu_gettid()); #define _STARPU_MPI_TRACE_ISEND_SUBMIT_END(dest, data_tag, size, jobid) \ FUT_DO_PROBE5(_STARPU_MPI_FUT_ISEND_SUBMIT_END, (dest), (data_tag), (size), (jobid), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_SUBMIT_BEGIN(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_SUBMIT_BEGIN, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_SUBMIT_END(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_SUBMIT_END, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_ISEND_COMPLETE_BEGIN(dest, data_tag, size) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_ISEND_COMPLETE_BEGIN, (dest), (data_tag), (size), _starpu_gettid()); #define _STARPU_MPI_TRACE_COMPLETE_BEGIN(type, rank, data_tag) \ if (type == RECV_REQ) { _STARPU_MPI_TRACE_IRECV_COMPLETE_BEGIN((rank), (data_tag)); } else if (type == SEND_REQ) { _STARPU_MPI_TRACE_ISEND_COMPLETE_BEGIN((rank), (data_tag), 0); } #define _STARPU_MPI_TRACE_ISEND_COMPLETE_END(dest, data_tag, size) \ FUT_DO_PROBE4(_STARPU_MPI_FUT_ISEND_COMPLETE_END, (dest), (data_tag), (size), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_COMPLETE_BEGIN(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_COMPLETE_BEGIN, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_IRECV_COMPLETE_END(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_IRECV_COMPLETE_END, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_COMPLETE_END(type, rank, data_tag) \ if (type == RECV_REQ) { _STARPU_MPI_TRACE_IRECV_COMPLETE_END((rank), (data_tag)); } else if (type == SEND_REQ) { _STARPU_MPI_TRACE_ISEND_COMPLETE_END((rank), (data_tag), 0); } #define _STARPU_MPI_TRACE_TERMINATED(req, rank, data_tag) \ if ((req)->request_type == RECV_REQ) FUT_DO_PROBE4(_STARPU_MPI_FUT_IRECV_TERMINATED, (rank), (data_tag), (req)->post_sync_jobid, _starpu_gettid()); else \ if ((req)->request_type == SEND_REQ) FUT_DO_PROBE3(_STARPU_MPI_FUT_ISEND_TERMINATED, (rank), (data_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, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UTESTING_BEGIN, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_UTESTING_END(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UTESTING_END, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_UWAIT_BEGIN(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UWAIT_BEGIN, (src), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_UWAIT_END(src, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_UWAIT_END, (src), (data_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()); #define _STARPU_MPI_TRACE_DATA_SET_TAG(handle, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_DATA_SET_TAG, (handle), (data_tag), _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, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_TEST_BEGIN, (peer), (data_tag), _starpu_gettid()); #define _STARPU_MPI_TRACE_TEST_END(peer, data_tag) \ FUT_DO_PROBE3(_STARPU_MPI_FUT_TEST_END, (peer), (data_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, data_tag) do {} while(0) #define _STARPU_MPI_TRACE_TEST_END(peer, data_tag) do {} while(0) #endif #define _STARPU_MPI_TRACE_POLLING_BEGIN() \ if(!trace_loop) { \ trace_loop = 1; \ FUT_DO_PROBE1(_STARPU_MPI_FUT_POLLING_BEGIN, _starpu_gettid()); \ } #define _STARPU_MPI_TRACE_POLLING_END() \ if(trace_loop) { \ trace_loop = 0; \ FUT_DO_PROBE1(_STARPU_MPI_FUT_POLLING_END, _starpu_gettid()); \ } #define _STARPU_MPI_TRACE_DRIVER_RUN_BEGIN() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_DRIVER_RUN_BEGIN, _starpu_gettid()); #define _STARPU_MPI_TRACE_DRIVER_RUN_END() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_DRIVER_RUN_END, _starpu_gettid()); #define _STARPU_MPI_TRACE_DRIVER_RUN_BEGIN() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_DRIVER_RUN_BEGIN, _starpu_gettid()); #define _STARPU_MPI_TRACE_DRIVER_RUN_END() \ FUT_DO_PROBE1(_STARPU_MPI_FUT_DRIVER_RUN_END, _starpu_gettid()); #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_COMPLETE_BEGIN(a, b, c) do {} while(0); #define _STARPU_MPI_TRACE_COMPLETE_END(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_DATA_SET_TAG(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, data_tag) do {} while(0) #define _STARPU_MPI_TRACE_TEST_END(peer, data_tag) do {} while(0) #define _STARPU_MPI_TRACE_POLLING_BEGIN() do {} while(0); #define _STARPU_MPI_TRACE_POLLING_END() do {} while(0); #define _STARPU_MPI_TRACE_DRIVER_RUN_BEGIN() do {} while(0); #define _STARPU_MPI_TRACE_DRIVER_RUN_END() do {} while(0); #endif #ifdef __cplusplus } #endif #endif // __STARPU_MPI_FXT_H__ starpu-1.3.9+dfsg/mpi/src/starpu_mpi_helper.c000066400000000000000000000070271413463044200212320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_prio(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, int prio, 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_prio(data_handle, dest, data_tag, prio, comm, starpu_mpi_unlock_tag_callback, tagptr); } int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, starpu_mpi_tag_t data_tag, MPI_Comm comm, starpu_tag_t tag) { return starpu_mpi_isend_detached_unlock_tag_prio(data_handle, dest, data_tag, 0, comm, tag); } int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, starpu_mpi_tag_t 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_prio(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, starpu_mpi_tag_t *data_tag, int *prio, 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++) { int p = 0; if (prio) p = prio[elem]; starpu_mpi_isend_detached_prio(data_handle[elem], dest[elem], data_tag[elem], p, comm[elem], starpu_mpi_array_unlock_callback, arg); } return 0; } int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, starpu_mpi_tag_t *data_tag, MPI_Comm *comm, starpu_tag_t tag) { return starpu_mpi_isend_array_detached_unlock_tag_prio(array_size, data_handle, dest, data_tag, NULL, comm, tag); } int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, starpu_mpi_tag_t *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.3.9+dfsg/mpi/src/starpu_mpi_init.c000066400000000000000000000201601413463044200207070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #ifdef STARPU_SIMGRID static int _mpi_world_size; static int _mpi_world_rank; #endif static int _mpi_initialized_starpu; static void _starpu_mpi_print_thread_level_support(int thread_level, char *msg) { switch (thread_level) { case MPI_THREAD_SERIALIZED: { _STARPU_DISP("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; } case MPI_THREAD_MULTIPLE: /* no problem */ break; } } void _starpu_mpi_do_initialize(struct _starpu_mpi_argc_argv *argc_argv) { if (argc_argv->initialize_mpi) { STARPU_ASSERT_MSG(argc_argv->comm == MPI_COMM_WORLD, "It does not make sense to ask StarPU-MPI to initialize MPI while a non-world communicator was given"); 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"); } MPI_Comm_rank(argc_argv->comm, &argc_argv->rank); MPI_Comm_size(argc_argv->comm, &argc_argv->world_size); MPI_Comm_set_errhandler(argc_argv->comm, MPI_ERRORS_RETURN); #ifdef STARPU_SIMGRID _mpi_world_size = argc_argv->world_size; _mpi_world_rank = argc_argv->rank; #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; _starpu_implicit_data_deps_write_hook(_starpu_mpi_data_flush); #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 int ret = _starpu_mpi_progress_init(argc_argv); if (starpu_get_env_number_default("STARPU_DISPLAY_BINDINGS", 0)) { int rank, size, i; char hostname[65]; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); gethostname(hostname, sizeof(hostname)); /* We make a barrier between each node calling hwloc-ps, to avoid mixing * outputs in stdout. */ for (i = 0; i < size; i++) { starpu_mpi_barrier(MPI_COMM_WORLD); if (rank == i) { fprintf(stdout, "== Binding for rank %d on node %s ==\n", rank, hostname); starpu_display_bindings(); fflush(stdout); } } starpu_mpi_barrier(MPI_COMM_WORLD); if (rank == 0) { fprintf(stdout, "== End of bindings ==\n"); fflush(stdout); } } return ret; } #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, char ***argv, int initialize_mpi, MPI_Comm comm) { #ifdef STARPU_SIMGRID (void)argc; (void)argv; (void)initialize_mpi; (void)comm; _starpu_mpi_wait_for_initialization(); 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_init_conf(int *argc, char ***argv, int initialize_mpi, MPI_Comm comm, struct starpu_conf *conf) { struct starpu_conf localconf; if (!conf) { starpu_conf_init(&localconf); conf = &localconf; } _mpi_backend._starpu_mpi_backend_init(conf); /* Reserve a core only if required by the backend and if STARPU_NCPU isn't provided */ if (_mpi_backend._starpu_mpi_backend_reserve_core() && conf->ncpus == -1) { /* Reserve a core for our progression thread */ if (conf->reserve_ncpus == -1) conf->reserve_ncpus = 1; else conf->reserve_ncpus++; } conf->will_use_mpi = 1; int ret = starpu_init(conf); if (ret < 0) return ret; _mpi_initialized_starpu = 1; return starpu_mpi_init_comm(argc, argv, initialize_mpi, comm); } int starpu_mpi_shutdown(void) { void *value; int rank, world_size; /* Make sure we do not have MPI communications pending in the task graph * before shutting down MPI */ starpu_mpi_wait_for_all(MPI_COMM_WORLD); /* 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_mpi_progress_shutdown(&value); #ifdef STARPU_USE_FXT if (starpu_fxt_is_enabled()) { _STARPU_MPI_TRACE_STOP(rank, world_size); } #endif // STARPU_USE_FXT _starpu_mpi_comm_amounts_display(stderr, rank); _starpu_mpi_comm_amounts_shutdown(); _starpu_mpi_cache_shutdown(world_size); _mpi_backend._starpu_mpi_backend_shutdown(); if (_mpi_initialized_starpu) starpu_shutdown(); return 0; } 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; } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_init.h000066400000000000000000000017271413463044200207240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_INIT_H__ #define __STARPU_MPI_INIT_H__ #include #include /** @file */ #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_do_initialize(struct _starpu_mpi_argc_argv *argc_argv); #ifdef __cplusplus } #endif #endif // __STARPU_MPI_INIT_H__ starpu-1.3.9+dfsg/mpi/src/starpu_mpi_private.c000066400000000000000000000054021413463044200214200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_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; int _starpu_mpi_nobind = -1; int _starpu_mpi_thread_cpuid = -1; int _starpu_mpi_use_prio = 1; int _starpu_mpi_fake_world_size = -1; int _starpu_mpi_fake_world_rank = -1; int _starpu_mpi_use_coop_sends = 1; 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; } void _starpu_mpi_env_init(void) { _starpu_mpi_comm_debug = starpu_getenv("STARPU_MPI_COMM") != NULL; _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"); _starpu_mpi_nobind = starpu_get_env_number_default("STARPU_MPI_NOBIND", 0); _starpu_mpi_thread_cpuid = starpu_get_env_number_default("STARPU_MPI_THREAD_CPUID", -1); _starpu_mpi_use_prio = starpu_get_env_number_default("STARPU_MPI_PRIORITIES", 1); _starpu_mpi_use_coop_sends = starpu_get_env_number_default("STARPU_MPI_COOP_SENDS", 1); _starpu_debug_level_min = starpu_get_env_number_default("STARPU_MPI_DEBUG_LEVEL_MIN", 0); _starpu_debug_level_max = starpu_get_env_number_default("STARPU_MPI_DEBUG_LEVEL_MAX", 0); int mpi_thread_coreid = starpu_get_env_number_default("STARPU_MPI_THREAD_COREID", -1); if (_starpu_mpi_thread_cpuid >= 0 && mpi_thread_coreid >= 0) { _STARPU_DISP("Warning: STARPU_MPI_THREAD_CPUID and STARPU_MPI_THREAD_COREID cannot be set at the same time. STARPU_MAIN_THREAD_CPUID will be used.\n"); } if (_starpu_mpi_thread_cpuid == -1 && mpi_thread_coreid >= 0) { _starpu_mpi_thread_cpuid = mpi_thread_coreid * _starpu_get_nhyperthreads(); } } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_private.h000066400000000000000000000317571413463044200214410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include #include #include #include #include /** @file */ #ifdef __cplusplus extern "C" { #endif #ifdef STARPU_SIMGRID extern starpu_pthread_wait_t _starpu_mpi_thread_wait; extern starpu_pthread_queue_t _starpu_mpi_thread_dontsleep; struct _starpu_simgrid_mpi_req { MPI_Request *request; MPI_Status *status; starpu_pthread_queue_t *queue; unsigned *done; }; int _starpu_mpi_simgrid_mpi_test(unsigned *done, int *flag); void _starpu_mpi_simgrid_wait_req(MPI_Request *request, MPI_Status *status, starpu_pthread_queue_t *queue, unsigned *done); #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; extern int _starpu_mpi_use_prio; extern int _starpu_mpi_nobind; extern int _starpu_mpi_thread_cpuid; extern int _starpu_mpi_use_coop_sends; void _starpu_mpi_env_init(void); #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:%ld:%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 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, }; struct _starpu_mpi_node { MPI_Comm comm; int rank; }; struct _starpu_mpi_node_tag { struct _starpu_mpi_node node; starpu_mpi_tag_t data_tag; }; MULTILIST_CREATE_TYPE(_starpu_mpi_req, coop_sends) /* One bag of cooperative sends */ struct _starpu_mpi_coop_sends { /* List of send requests */ struct _starpu_mpi_req_multilist_coop_sends reqs; struct _starpu_mpi_data *mpi_data; /* Array of send requests, after sorting out */ struct _starpu_spinlock lock; struct _starpu_mpi_req **reqs_array; unsigned n; unsigned redirects_sent; }; /* Initialized in starpu_mpi_data_register_comm */ struct _starpu_mpi_data { int magic; struct _starpu_mpi_node_tag node_tag; char *cache_sent; int cache_received; /* Rendez-vous data for opportunistic cooperative sends */ struct _starpu_spinlock coop_lock; /* Needed to synchronize between submit thread and workers */ struct _starpu_mpi_coop_sends *coop_sends; /* Current cooperative send bag */ }; struct _starpu_mpi_data *_starpu_mpi_data_get(starpu_data_handle_t data_handle); struct _starpu_mpi_req_backend; struct _starpu_mpi_req; LIST_TYPE(_starpu_mpi_req, /* description of the data at StarPU level */ starpu_data_handle_t data_handle; int prio; /* description of the data to be sent/received */ MPI_Datatype datatype; char *datatype_name; void *ptr; starpu_ssize_t count; int registered_datatype; struct _starpu_mpi_req_backend *backend; /* who are we talking to ? */ struct _starpu_mpi_node_tag node_tag; void (*func)(struct _starpu_mpi_req *); MPI_Status *status; struct _starpu_mpi_req_multilist_coop_sends coop_sends; struct _starpu_mpi_coop_sends *coop_sends_head; int *flag; unsigned sync; int ret; /** 0 send, 1 recv */ enum _starpu_mpi_request_type request_type; unsigned submitted; unsigned completed; unsigned posted; /* 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 */ int sequential_consistency; long pre_sync_jobid; long post_sync_jobid; #ifdef STARPU_SIMGRID MPI_Status status_store; starpu_pthread_queue_t queue; unsigned done; #endif ); PRIO_LIST_TYPE(_starpu_mpi_req, prio) MULTILIST_CREATE_INLINES(struct _starpu_mpi_req, _starpu_mpi_req, coop_sends) /* To be called before actually queueing a request, so the communication layer knows it has something to look at */ void _starpu_mpi_req_willpost(struct _starpu_mpi_req *req); /* To be called to actually submit the request */ void _starpu_mpi_submit_ready_request(void *arg); /* To be called when request is completed */ void _starpu_mpi_release_req_data(struct _starpu_mpi_req *req); /* Build a communication tree. Called before _starpu_mpi_coop_send is ever called. coop_sends->lock is held. */ void _starpu_mpi_coop_sends_build_tree(struct _starpu_mpi_coop_sends *coop_sends); /* Try to merge with send request with other send requests */ void _starpu_mpi_coop_send(starpu_data_handle_t data_handle, struct _starpu_mpi_req *req, enum starpu_data_access_mode mode, int sequential_consistency); /* Actually submit the coop_sends bag to MPI. * At least one of submit_control or submit_data is true. * _starpu_mpi_submit_coop_sends may be called either * - just once with both parameters being true, * - or once with submit_control being true (data is not available yet, but we * can send control messages), and a second time with submit_data being true. Or * the converse, possibly on different threads, etc. */ void _starpu_mpi_submit_coop_sends(struct _starpu_mpi_coop_sends *coop_sends, int submit_control, int submit_data); void _starpu_mpi_submit_ready_request_inc(struct _starpu_mpi_req *req); void _starpu_mpi_request_init(struct _starpu_mpi_req **req); struct _starpu_mpi_req * _starpu_mpi_request_fill(starpu_data_handle_t data_handle, int srcdst, starpu_mpi_tag_t data_tag, MPI_Comm comm, unsigned detached, unsigned sync, int prio, void (*callback)(void *), void *arg, enum _starpu_mpi_request_type request_type, void (*func)(struct _starpu_mpi_req *), int sequential_consistency, int is_internal_req, starpu_ssize_t count); void _starpu_mpi_request_destroy(struct _starpu_mpi_req *req); void _starpu_mpi_isend_size_func(struct _starpu_mpi_req *req); void _starpu_mpi_irecv_size_func(struct _starpu_mpi_req *req); int _starpu_mpi_wait(starpu_mpi_req *public_req, MPI_Status *status); int _starpu_mpi_test(starpu_mpi_req *public_req, int *flag, MPI_Status *status); int _starpu_mpi_barrier(MPI_Comm comm); struct _starpu_mpi_argc_argv { int initialize_mpi; int *argc; char ***argv; MPI_Comm comm; /** Fortran argc */ int fargc; /** Fortran argv */ char **fargv; int rank; int world_size; }; void _starpu_mpi_progress_shutdown(void **value); int _starpu_mpi_progress_init(struct _starpu_mpi_argc_argv *argc_argv); #ifdef STARPU_SIMGRID void _starpu_mpi_wait_for_initialization(); #endif void _starpu_mpi_data_flush(starpu_data_handle_t data_handle); /* * Specific functions to backend implementation */ struct _starpu_mpi_backend { void (*_starpu_mpi_backend_init)(struct starpu_conf *conf); void (*_starpu_mpi_backend_shutdown)(void); int (*_starpu_mpi_backend_reserve_core)(void); void (*_starpu_mpi_backend_request_init)(struct _starpu_mpi_req *req); void (*_starpu_mpi_backend_request_fill)(struct _starpu_mpi_req *req, MPI_Comm comm, int is_internal_req); void (*_starpu_mpi_backend_request_destroy)(struct _starpu_mpi_req *req); void (*_starpu_mpi_backend_data_clear)(starpu_data_handle_t data_handle); void (*_starpu_mpi_backend_data_register)(starpu_data_handle_t data_handle, starpu_mpi_tag_t data_tag); void (*_starpu_mpi_backend_comm_register)(MPI_Comm comm); }; extern struct _starpu_mpi_backend _mpi_backend; #ifdef __cplusplus } #endif #endif // __STARPU_MPI_PRIVATE_H__ starpu-1.3.9+dfsg/mpi/src/starpu_mpi_req.c000066400000000000000000000063721413463044200205440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017 Guillaume Beauchamp * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_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)->prio = 0; (*req)->datatype = 0; (*req)->datatype_name = NULL; (*req)->ptr = NULL; (*req)->count = -1; (*req)->registered_datatype = -1; (*req)->node_tag.node.rank = -1; (*req)->node_tag.data_tag = -1; (*req)->node_tag.node.comm = 0; (*req)->func = NULL; (*req)->status = NULL; (*req)->flag = NULL; _starpu_mpi_req_multilist_init_coop_sends(*req); (*req)->ret = -1; (*req)->request_type = UNKNOWN_REQ; (*req)->submitted = 0; (*req)->completed = 0; (*req)->posted = 0; (*req)->sync = 0; (*req)->detached = -1; (*req)->callback = NULL; (*req)->callback_arg = NULL; (*req)->sequential_consistency = 1; (*req)->pre_sync_jobid = -1; (*req)->post_sync_jobid = -1; #ifdef STARPU_SIMGRID starpu_pthread_queue_init(&((*req)->queue)); starpu_pthread_queue_register(&_starpu_mpi_thread_wait, &((*req)->queue)); (*req)->done = 0; #endif _mpi_backend._starpu_mpi_backend_request_init(*req); } struct _starpu_mpi_req *_starpu_mpi_request_fill(starpu_data_handle_t data_handle, int srcdst, starpu_mpi_tag_t data_tag, MPI_Comm comm, unsigned detached, unsigned sync, int prio, void (*callback)(void *), void *arg, enum _starpu_mpi_request_type request_type, void (*func)(struct _starpu_mpi_req *), int sequential_consistency, int is_internal_req, starpu_ssize_t count) { struct _starpu_mpi_req *req; /* Initialize the request structure */ _starpu_mpi_request_init(&req); req->request_type = request_type; /* prio_list is sorted by increasing values */ if (_starpu_mpi_use_prio) req->prio = prio; req->data_handle = data_handle; req->node_tag.node.rank = srcdst; req->node_tag.data_tag = data_tag; req->node_tag.node.comm = comm; req->detached = detached; req->sync = sync; req->callback = callback; req->callback_arg = arg; req->func = func; req->sequential_consistency = sequential_consistency; req->count = count; _mpi_backend._starpu_mpi_backend_request_fill(req, comm, is_internal_req); return req; } void _starpu_mpi_request_destroy(struct _starpu_mpi_req *req) { _mpi_backend._starpu_mpi_backend_request_destroy(req); free(req->datatype_name); req->datatype_name = NULL; #ifdef STARPU_SIMGRID starpu_pthread_queue_unregister(&_starpu_mpi_thread_wait, &req->queue); starpu_pthread_queue_destroy(&req->queue); #endif free(req); } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_select_node.c000066400000000000000000000072571413463044200222440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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_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_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, nb_nodes, sizeof(size_t)); for(i= 0 ; iops->get_size(data); if (mode & STARPU_R) size_on_nodes[rank] += size; if (mode & STARPU_W) /* Would have to transfer it back */ size_on_nodes[rank] += size; } 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.3.9+dfsg/mpi/src/starpu_mpi_select_node.h000066400000000000000000000021141413463044200222340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #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.3.9+dfsg/mpi/src/starpu_mpi_stats.c000066400000000000000000000054651413463044200211150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* 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; static double time_init; 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)); time_init = starpu_timing_now(); } void _starpu_mpi_comm_amounts_shutdown() { 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; double time = starpu_timing_now() - time_init; 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\t %f B/s\t %f MB/s\n", node, (float)sum, (float)sum/1024/1024, (float)sum/(float)time, (float)sum/1204/1024/(float)time); for (dst = 0; dst < world_size; dst++) { if (comm_amount[dst]) fprintf(stream, "[starpu_comm_stats][%d:%d]\t%f B\t%f MB\t %f B/s\t %f MB/s\n", node, dst, (float)comm_amount[dst], ((float)comm_amount[dst])/(1024*1024), (float)comm_amount[dst]/(float)time, ((float)comm_amount[dst])/(1024*1024)/(float)time); } } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_stats.h000066400000000000000000000022331413463044200211100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #ifdef __cplusplus extern "C" { #endif void _starpu_mpi_comm_amounts_init(MPI_Comm comm); void _starpu_mpi_comm_amounts_shutdown(); 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.3.9+dfsg/mpi/src/starpu_mpi_task_insert.c000066400000000000000000000653661413463044200223130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "starpu_mpi_task_insert.h" #define _SEND_DATA(data, mode, dest, data_tag, prio, comm, callback, arg) \ do { \ if (mode & STARPU_SSEND) \ starpu_mpi_issend_detached_prio(data, dest, data_tag, prio, comm, callback, arg); \ else \ starpu_mpi_isend_detached_prio(data, dest, data_tag, prio, comm, callback, arg); \ } while (0) static void (*pre_submit_hook)(struct starpu_task *task) = NULL; int starpu_mpi_pre_submit_hook_register(void (*f)(struct starpu_task *)) { if (pre_submit_hook) _STARPU_MSG("Warning: a pre_submit_hook has already been registered. Please check if you really want to erase the previously registered hook.\n"); pre_submit_hook = f; return 0; } int starpu_mpi_pre_submit_hook_unregister() { pre_submit_hook = NULL; return 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, int prio, MPI_Comm comm) { if (data && xrank == STARPU_MPI_PER_NODE) { STARPU_ASSERT_MSG(starpu_mpi_data_get_rank(data) == STARPU_MPI_PER_NODE, "If task is replicated, it has to access only per-node data"); } if (data && mode & STARPU_R) { int mpi_rank = starpu_mpi_data_get_rank(data); starpu_mpi_tag_t 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 */ int already_received = starpu_mpi_cached_receive_set(data); if (already_received == 0) { 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. */ int already_sent = starpu_mpi_cached_send_set(data, xrank); if (already_sent == 0) { 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, prio, 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, int prio, MPI_Comm comm) { if (mode & STARPU_W) { int mpi_rank = starpu_mpi_data_get_rank(data); starpu_mpi_tag_t 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, prio, 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) { 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_cached_send_clear(data); starpu_mpi_cached_receive_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, int *prio_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 prio = 0; 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_copy, void *); (void)va_arg(varg_list_copy, size_t); } else if (arg_type==STARPU_CL_ARGS_NFREE) { (void)va_arg(varg_list_copy, void *); (void)va_arg(varg_list_copy, size_t); } else if (arg_type==STARPU_TASK_DEPS_ARRAY) { (void)va_arg(varg_list_copy, unsigned); (void)va_arg(varg_list_copy, struct starpu_task **); } else if (arg_type==STARPU_TASK_END_DEPS_ARRAY) { (void)va_arg(varg_list_copy, unsigned); (void)va_arg(varg_list_copy, struct starpu_task **); } 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_WITH_ARG_NFREE) { (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_CALLBACK_ARG_NFREE) { (void)va_arg(varg_list_copy, void *); } else if (arg_type==STARPU_PRIORITY) { prio = 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_ARG_NFREE) { (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_PROLOGUE_CALLBACK_POP_ARG_NFREE) { (void)va_arg(varg_list_copy, void *); } else if (arg_type==STARPU_EXECUTE_WHERE) { // the flag is decoded and set later when // calling function _starpu_task_insert_create() (void)va_arg(varg_list_copy, unsigned long long); } 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 if (arg_type==STARPU_TASK_COLOR) { (void)va_arg(varg_list_copy, int); } else if (arg_type==STARPU_TASK_SYNCHRONOUS) { (void)va_arg(varg_list_copy, int); } else if (arg_type==STARPU_HANDLES_SEQUENTIAL_CONSISTENCY) { (void)va_arg(varg_list_copy, char *); } else if (arg_type==STARPU_TASK_END_DEP) { (void)va_arg(varg_list_copy, int); } else if (arg_type==STARPU_TASK_WORKERIDS) { (void)va_arg(varg_list_copy, unsigned); (void)va_arg(varg_list_copy, uint32_t*); } else if (arg_type==STARPU_SEQUENTIAL_CONSISTENCY) { (void)va_arg(varg_list_copy, unsigned); } else if (arg_type==STARPU_TASK_PROFILING_INFO) { (void)va_arg(varg_list_copy, struct starpu_profiling_task_info *); } else if (arg_type==STARPU_TASK_NO_SUBMITORDER) { (void)va_arg(varg_list_copy, unsigned); } else if (arg_type==STARPU_TASK_SCHED_DATA) { (void)va_arg(varg_list_copy, void *); } 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; *prio_p = prio; _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, int *prio_p, va_list varg_list) { int me, do_execute, xrank, nb_nodes; int ret; int i; struct starpu_data_descr *descrs; int nb_data; int prio; _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, &prio, 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; (*task)->callback_arg_free = 1; (*task)->prologue_callback_arg_free = 1; (*task)->prologue_callback_pop_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 prio) { 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); } } int val = _starpu_mpi_task_postbuild_v(comm, xrank, do_execute, descrs, nb_data, prio); if (ret == 0 && pre_submit_hook) pre_submit_hook(task); return val; } 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, 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; int prio; 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, &prio, varg_list); va_end(varg_list); if (ret < 0) return ret; return _starpu_mpi_task_postbuild_v(comm, xrank, do_execute, descrs, nb_data, prio); } struct _starpu_mpi_redux_data_args { starpu_data_handle_t data_handle; starpu_data_handle_t new_handle; starpu_mpi_tag_t data_tag; int node; MPI_Comm comm; struct starpu_task *taskB; }; void _starpu_mpi_redux_data_dummy_func(void *buffers[], void *cl_arg) { (void)buffers; (void)cl_arg; } /* Dummy cost function for simgrid */ static double cost_function(struct starpu_task *task, unsigned nimpl) { (void)task; (void)nimpl; 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->data_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_prio(MPI_Comm comm, starpu_data_handle_t data_handle, int prio) { int me, rank, nb_nodes; starpu_mpi_tag_t data_tag; rank = starpu_mpi_data_get_rank(data_handle); data_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 (data_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; // taskC 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); for(i=0 ; idata_handle = data_handle; args->data_tag = data_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); starpu_task_declare_deps_array(taskC, 1, &args->taskB); // Submit taskA starpu_task_insert(&_starpu_mpi_redux_data_read_cl, STARPU_R, data_handle, STARPU_CALLBACK_WITH_ARG_NFREE, _starpu_mpi_redux_data_recv_callback, args, 0); } } 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_prio(data_handle, rank, data_tag, prio, 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(); } void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle) { return starpu_mpi_redux_data_prio(comm, data_handle, 0); } starpu-1.3.9+dfsg/mpi/src/starpu_mpi_task_insert.h000066400000000000000000000025121413463044200223000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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, int prio, 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, int prio); #ifdef __cplusplus } #endif #endif /* __STARPU_MPI_TASK_INSERT_H__ */ starpu-1.3.9+dfsg/mpi/src/starpu_mpi_task_insert_fortran.c000066400000000000000000000333611413463044200240340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, int *prio_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 prio = 0; 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_CL_ARGS_NFREE) { arg_i++; /* void* */ arg_i++; /* size_t */ } else if (arg_type==STARPU_TASK_DEPS_ARRAY) { arg_i++; /* unsigned */ arg_i++; /* struct starpu_task ** */ } else if (arg_type==STARPU_TASK_END_DEPS_ARRAY) { arg_i++; /* unsigned */ arg_i++; /* struct starpu_task ** */ } 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_WITH_ARG_NFREE) { arg_i++; /* _starpu_callback_func_t */ arg_i++; /* void* */ } else if (arg_type==STARPU_CALLBACK_ARG) { arg_i++; /* void* */ } else if (arg_type==STARPU_CALLBACK_ARG_NFREE) { arg_i++; /* void* */ } else if (arg_type==STARPU_PRIORITY) { arg_i++; prio = *(int *)arglist[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_ARG_NFREE) { 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_PROLOGUE_CALLBACK_POP_ARG_NFREE) { arg_i++; /* void* */ } else if (arg_type==STARPU_EXECUTE_WHERE) { arg_i++; /* int* */ } 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 if (arg_type==STARPU_TASK_COLOR) { arg_i++; /* int* */ } else if (arg_type==STARPU_TASK_SYNCHRONOUS) { arg_i++; /* int* */ } else if (arg_type==STARPU_HANDLES_SEQUENTIAL_CONSISTENCY) { arg_i++; /* char* */ } else if (arg_type==STARPU_TASK_END_DEP) { arg_i++; /* int */ } else if (arg_type==STARPU_TASK_WORKERIDS) { arg_i++; /* unsigned */ arg_i++; /* uint32_t* */ } else if (arg_type==STARPU_SEQUENTIAL_CONSISTENCY) { arg_i++; /* unsigned */ } else if (arg_type==STARPU_TASK_PROFILING_INFO) { arg_i++; /* struct starpu_profiling_task_info * */ } else if (arg_type==STARPU_TASK_NO_SUBMITORDER) { arg_i++; /* unsigned */ } else if (arg_type==STARPU_TASK_SCHED_DATA) { arg_i++; /* void * */ } 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; *prio_p = prio; _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, int *prio_p, void **arglist) { int me, do_execute, xrank, nb_nodes; int ret; int i; struct starpu_data_descr *descrs; int nb_data; int prio; _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, &prio, 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; (*task)->callback_arg_free = 1; (*task)->prologue_callback_arg_free = 1; (*task)->prologue_callback_pop_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; int prio; ret = _fstarpu_mpi_task_build_v(comm, codelet, &task, &xrank, &descrs, &nb_data, &prio, 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, prio); } void fstarpu_mpi_task_insert(void **arglist) { MPI_Fint comm = *((MPI_Fint *)arglist[0]); struct starpu_codelet *codelet = arglist[1]; if (codelet == NULL) { STARPU_ABORT_MSG("task without codelet"); } int ret; ret = _fstarpu_mpi_task_insert_v(MPI_Comm_f2c(comm), codelet, arglist+2); STARPU_ASSERT(ret >= 0); } /* fstarpu_mpi_insert_task: aliased to fstarpu_mpi_task_insert in fstarpu_mpi_mod.f90 */ struct starpu_task *fstarpu_mpi_task_build(void **arglist) { MPI_Fint comm = *((MPI_Fint *)arglist[0]); struct starpu_codelet *codelet = arglist[1]; 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, NULL, arglist+2); STARPU_ASSERT(ret >= 0); return (ret > 0) ? NULL : task; } void fstarpu_mpi_task_post_build(void **arglist) { MPI_Fint comm = *((MPI_Fint *)arglist[0]); struct starpu_codelet *codelet = arglist[1]; if (codelet == NULL) { STARPU_ABORT_MSG("task without codelet"); } int xrank, do_execute; int ret, me, nb_nodes; struct starpu_data_descr *descrs; int nb_data; int prio; starpu_mpi_comm_rank(MPI_Comm_f2c(comm), &me); starpu_mpi_comm_size(MPI_Comm_f2c(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, &prio, arglist+2); STARPU_ASSERT(ret >= 0); ret = _starpu_mpi_task_postbuild_v(MPI_Comm_f2c(comm), xrank, do_execute, descrs, nb_data, prio); STARPU_ASSERT(ret >= 0); } #endif /* HAVE_MPI_COMM_F2C */ starpu-1.3.9+dfsg/mpi/starpumpi-1.0.pc.in000066400000000000000000000020661413463044200200240ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/starpumpi-1.1.pc.in000066400000000000000000000020661413463044200200250ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/starpumpi-1.2.pc.in000066400000000000000000000020661413463044200200260ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/mpi/starpumpi-1.3.pc.in000066400000000000000000000020661413463044200200270ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3 Requires.private: starpu-1.3.9+dfsg/mpi/tests/000077500000000000000000000000001413463044200157115ustar00rootroot00000000000000starpu-1.3.9+dfsg/mpi/tests/Makefile.am000066400000000000000000000151561413463044200177550ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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) noinst_PROGRAMS = if STARPU_HAVE_WINDOWS LOADER_BIN = else loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ if !STARPU_SIMGRID LOADER = loader LOADER_BIN = $(abs_top_builddir)/mpi/tests/$(LOADER) noinst_PROGRAMS += loader endif loader_SOURCES = ../../tests/loader.c endif if STARPU_SIMGRID MPI = $(abs_top_builddir)/tools/starpu_smpirun -np 4 -platform $(abs_top_srcdir)/tools/perfmodels/cluster.xml -hostfile $(abs_top_srcdir)/tools/perfmodels/hostfile else # 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 endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=3 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(MPI) $(LOADER_BIN) else TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=3 top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(MPI) $(LOADER_BIN) endif if STARPU_MPI_CHECK TESTS = $(starpu_mpi_TESTS) 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 if STARPU_COVERITY include $(top_srcdir)/starpu-mynvcc.mk else NVCCFLAGS += --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) .cu.cubin: $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) .cu.o: $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) 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@ ../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 # ######################## starpu_mpi_TESTS = starpu_mpi_TESTS += \ broadcast \ callback \ driver \ early_request \ gather \ gather2 \ insert_task \ insert_task_block \ insert_task_count \ insert_task_dyn_handles \ insert_task_node_choice \ insert_task_owner \ insert_task_owner2 \ insert_task_owner_data \ insert_task_tags \ matrix \ matrix2 \ mpi_detached_tag \ mpi_earlyrecv \ mpi_irecv \ mpi_irecv_detached \ mpi_isend \ mpi_isend_detached \ mpi_reduction \ mpi_redux \ mpi_scatter_gather \ mpi_test \ multiple_send \ pingpong \ policy_register \ policy_register_many \ policy_selection \ policy_selection2 \ ring \ ring_async \ ring_async_implicit \ ring_sync \ ring_sync_detached \ temporary \ user_defined_datatype \ early_stuff if !STARPU_SIMGRID # missing support in simgrid starpu_mpi_TESTS += \ attr \ display_bindings \ mpi_earlyrecv2 \ mpi_earlyrecv2_sync \ block_interface \ block_interface_pinned \ insert_task_compute \ insert_task_sent_cache \ insert_task_recv_cache \ insert_task_seq \ tags_checking \ sync if STARPU_USE_MPI_MPI starpu_mpi_TESTS += \ load_balancer endif # Expected to fail starpu_mpi_TESTS += \ policy_register_toomany \ policy_unregister \ starpu_redefine endif 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 \ early_stuff \ block_interface \ block_interface_pinned \ attr \ broadcast \ 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 \ insert_task_seq \ insert_task_tags \ 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 \ load_balancer \ driver \ display_bindings 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 starpu-1.3.9+dfsg/mpi/tests/Makefile.in000066400000000000000000003354401413463044200177670ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(am__EXEEXT_1) datatypes$(EXEEXT) pingpong$(EXEEXT) \ mpi_test$(EXEEXT) mpi_isend$(EXEEXT) mpi_earlyrecv$(EXEEXT) \ mpi_earlyrecv2$(EXEEXT) mpi_earlyrecv2_sync$(EXEEXT) \ mpi_irecv$(EXEEXT) mpi_isend_detached$(EXEEXT) \ mpi_irecv_detached$(EXEEXT) mpi_detached_tag$(EXEEXT) \ mpi_redux$(EXEEXT) ring$(EXEEXT) ring_sync$(EXEEXT) \ ring_sync_detached$(EXEEXT) ring_async$(EXEEXT) \ ring_async_implicit$(EXEEXT) temporary$(EXEEXT) \ early_stuff$(EXEEXT) block_interface$(EXEEXT) \ block_interface_pinned$(EXEEXT) attr$(EXEEXT) \ broadcast$(EXEEXT) callback$(EXEEXT) matrix$(EXEEXT) \ matrix2$(EXEEXT) insert_task$(EXEEXT) \ insert_task_compute$(EXEEXT) insert_task_sent_cache$(EXEEXT) \ insert_task_recv_cache$(EXEEXT) insert_task_block$(EXEEXT) \ insert_task_owner$(EXEEXT) insert_task_owner2$(EXEEXT) \ insert_task_owner_data$(EXEEXT) \ insert_task_node_choice$(EXEEXT) insert_task_count$(EXEEXT) \ insert_task_dyn_handles$(EXEEXT) insert_task_seq$(EXEEXT) \ insert_task_tags$(EXEEXT) multiple_send$(EXEEXT) \ mpi_scatter_gather$(EXEEXT) mpi_reduction$(EXEEXT) \ user_defined_datatype$(EXEEXT) tags_checking$(EXEEXT) \ sync$(EXEEXT) gather$(EXEEXT) gather2$(EXEEXT) \ policy_register$(EXEEXT) policy_register_many$(EXEEXT) \ policy_register_toomany$(EXEEXT) policy_unregister$(EXEEXT) \ policy_selection$(EXEEXT) policy_selection2$(EXEEXT) \ early_request$(EXEEXT) starpu_redefine$(EXEEXT) \ load_balancer$(EXEEXT) driver$(EXEEXT) \ display_bindings$(EXEEXT) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_FALSE@am__append_1 = loader @STARPU_MPI_CHECK_TRUE@TESTS = $(am__EXEEXT_5) check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_5) examplebin_PROGRAMS = @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_2 = --compiler-options -fno-strict-aliasing -I$(top_srcdir)/include/ -I$(top_builddir)/include/ $(HWLOC_CFLAGS) # missing support in simgrid @STARPU_SIMGRID_FALSE@am__append_3 = \ @STARPU_SIMGRID_FALSE@ attr \ @STARPU_SIMGRID_FALSE@ display_bindings \ @STARPU_SIMGRID_FALSE@ mpi_earlyrecv2 \ @STARPU_SIMGRID_FALSE@ mpi_earlyrecv2_sync \ @STARPU_SIMGRID_FALSE@ block_interface \ @STARPU_SIMGRID_FALSE@ block_interface_pinned \ @STARPU_SIMGRID_FALSE@ insert_task_compute \ @STARPU_SIMGRID_FALSE@ insert_task_sent_cache \ @STARPU_SIMGRID_FALSE@ insert_task_recv_cache \ @STARPU_SIMGRID_FALSE@ insert_task_seq \ @STARPU_SIMGRID_FALSE@ tags_checking \ @STARPU_SIMGRID_FALSE@ sync @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MPI_TRUE@am__append_4 = \ @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MPI_TRUE@ load_balancer # Expected to fail @STARPU_SIMGRID_FALSE@am__append_5 = \ @STARPU_SIMGRID_FALSE@ policy_register_toomany \ @STARPU_SIMGRID_FALSE@ policy_unregister \ @STARPU_SIMGRID_FALSE@ starpu_redefine XFAIL_TESTS = policy_register_toomany$(EXEEXT) \ policy_unregister$(EXEEXT) starpu_redefine$(EXEEXT) @STARPU_USE_CUDA_TRUE@am__append_6 = ring_kernel.cu @STARPU_USE_CUDA_TRUE@am__append_7 = ring_kernel.cu @STARPU_USE_CUDA_TRUE@am__append_8 = ring_kernel.cu @STARPU_USE_CUDA_TRUE@am__append_9 = ring_kernel.cu @STARPU_USE_CUDA_TRUE@am__append_10 = ring_kernel.cu @STARPU_USE_CUDA_TRUE@am__append_11 = ring_kernel.cu subdir = mpi/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_2 = attr$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ display_bindings$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ mpi_earlyrecv2$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ mpi_earlyrecv2_sync$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ block_interface$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ block_interface_pinned$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ insert_task_compute$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ insert_task_sent_cache$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ insert_task_recv_cache$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ insert_task_seq$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ tags_checking$(EXEEXT) sync$(EXEEXT) @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MPI_TRUE@am__EXEEXT_3 = load_balancer$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_4 = policy_register_toomany$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ policy_unregister$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ starpu_redefine$(EXEEXT) am__EXEEXT_5 = broadcast$(EXEEXT) callback$(EXEEXT) driver$(EXEEXT) \ early_request$(EXEEXT) gather$(EXEEXT) gather2$(EXEEXT) \ insert_task$(EXEEXT) insert_task_block$(EXEEXT) \ insert_task_count$(EXEEXT) insert_task_dyn_handles$(EXEEXT) \ insert_task_node_choice$(EXEEXT) insert_task_owner$(EXEEXT) \ insert_task_owner2$(EXEEXT) insert_task_owner_data$(EXEEXT) \ insert_task_tags$(EXEEXT) matrix$(EXEEXT) matrix2$(EXEEXT) \ mpi_detached_tag$(EXEEXT) mpi_earlyrecv$(EXEEXT) \ mpi_irecv$(EXEEXT) mpi_irecv_detached$(EXEEXT) \ mpi_isend$(EXEEXT) mpi_isend_detached$(EXEEXT) \ mpi_reduction$(EXEEXT) mpi_redux$(EXEEXT) \ mpi_scatter_gather$(EXEEXT) mpi_test$(EXEEXT) \ multiple_send$(EXEEXT) pingpong$(EXEEXT) \ policy_register$(EXEEXT) policy_register_many$(EXEEXT) \ policy_selection$(EXEEXT) policy_selection2$(EXEEXT) \ ring$(EXEEXT) ring_async$(EXEEXT) ring_async_implicit$(EXEEXT) \ ring_sync$(EXEEXT) ring_sync_detached$(EXEEXT) \ temporary$(EXEEXT) user_defined_datatype$(EXEEXT) \ early_stuff$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) \ $(am__EXEEXT_4) 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) broadcast_SOURCES = broadcast.c broadcast_OBJECTS = broadcast.$(OBJEXT) broadcast_LDADD = $(LDADD) callback_SOURCES = callback.c callback_OBJECTS = callback.$(OBJEXT) callback_LDADD = $(LDADD) datatypes_SOURCES = datatypes.c datatypes_OBJECTS = datatypes.$(OBJEXT) datatypes_LDADD = $(LDADD) display_bindings_SOURCES = display_bindings.c display_bindings_OBJECTS = display_bindings.$(OBJEXT) display_bindings_LDADD = $(LDADD) driver_SOURCES = driver.c driver_OBJECTS = driver.$(OBJEXT) driver_LDADD = $(LDADD) early_request_SOURCES = early_request.c early_request_OBJECTS = early_request.$(OBJEXT) early_request_LDADD = $(LDADD) early_stuff_SOURCES = early_stuff.c early_stuff_OBJECTS = early_stuff.$(OBJEXT) early_stuff_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 @STARPU_USE_CUDA_TRUE@am__objects_1 = ring_kernel.$(OBJEXT) am_insert_task_count_OBJECTS = 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) insert_task_seq_SOURCES = insert_task_seq.c insert_task_seq_OBJECTS = insert_task_seq.$(OBJEXT) insert_task_seq_LDADD = $(LDADD) insert_task_tags_SOURCES = insert_task_tags.c insert_task_tags_OBJECTS = insert_task_tags.$(OBJEXT) insert_task_tags_LDADD = $(LDADD) load_balancer_SOURCES = load_balancer.c load_balancer_OBJECTS = load_balancer.$(OBJEXT) load_balancer_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_OBJECTS = mpi_earlyrecv2.$(OBJEXT) \ complex_interface.$(OBJEXT) mpi_earlyrecv2_OBJECTS = $(am_mpi_earlyrecv2_OBJECTS) mpi_earlyrecv2_LDADD = $(LDADD) am_mpi_earlyrecv2_sync_OBJECTS = mpi_earlyrecv2_sync.$(OBJEXT) \ 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_OBJECTS = mpi_reduction.$(OBJEXT) \ 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 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 am_ring_async_OBJECTS = ring_async.$(OBJEXT) $(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 am_ring_async_implicit_OBJECTS = ring_async_implicit.$(OBJEXT) \ $(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 am_ring_sync_OBJECTS = ring_sync.$(OBJEXT) $(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 am_ring_sync_detached_OBJECTS = ring_sync_detached.$(OBJEXT) \ $(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_OBJECTS = user_defined_datatype.$(OBJEXT) \ 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/attr.Po \ ./$(DEPDIR)/block_interface.Po \ ./$(DEPDIR)/block_interface_pinned.Po ./$(DEPDIR)/broadcast.Po \ ./$(DEPDIR)/callback.Po ./$(DEPDIR)/complex_interface.Po \ ./$(DEPDIR)/datatypes.Po ./$(DEPDIR)/display_bindings.Po \ ./$(DEPDIR)/driver.Po ./$(DEPDIR)/early_request.Po \ ./$(DEPDIR)/early_stuff.Po ./$(DEPDIR)/gather.Po \ ./$(DEPDIR)/gather2.Po ./$(DEPDIR)/insert_task.Po \ ./$(DEPDIR)/insert_task_block.Po \ ./$(DEPDIR)/insert_task_compute.Po \ ./$(DEPDIR)/insert_task_count.Po \ ./$(DEPDIR)/insert_task_dyn_handles.Po \ ./$(DEPDIR)/insert_task_node_choice.Po \ ./$(DEPDIR)/insert_task_owner.Po \ ./$(DEPDIR)/insert_task_owner2.Po \ ./$(DEPDIR)/insert_task_owner_data.Po \ ./$(DEPDIR)/insert_task_recv_cache.Po \ ./$(DEPDIR)/insert_task_sent_cache.Po \ ./$(DEPDIR)/insert_task_seq.Po ./$(DEPDIR)/insert_task_tags.Po \ ./$(DEPDIR)/load_balancer.Po ./$(DEPDIR)/loader-loader.Po \ ./$(DEPDIR)/matrix.Po ./$(DEPDIR)/matrix2.Po \ ./$(DEPDIR)/mpi_detached_tag.Po ./$(DEPDIR)/mpi_earlyrecv.Po \ ./$(DEPDIR)/mpi_earlyrecv2.Po \ ./$(DEPDIR)/mpi_earlyrecv2_sync.Po ./$(DEPDIR)/mpi_irecv.Po \ ./$(DEPDIR)/mpi_irecv_detached.Po ./$(DEPDIR)/mpi_isend.Po \ ./$(DEPDIR)/mpi_isend_detached.Po ./$(DEPDIR)/mpi_reduction.Po \ ./$(DEPDIR)/mpi_reduction_kernels.Po ./$(DEPDIR)/mpi_redux.Po \ ./$(DEPDIR)/mpi_scatter_gather.Po ./$(DEPDIR)/mpi_test.Po \ ./$(DEPDIR)/multiple_send.Po ./$(DEPDIR)/pingpong.Po \ ./$(DEPDIR)/policy_register.Po \ ./$(DEPDIR)/policy_register_many.Po \ ./$(DEPDIR)/policy_register_toomany.Po \ ./$(DEPDIR)/policy_selection.Po \ ./$(DEPDIR)/policy_selection2.Po \ ./$(DEPDIR)/policy_unregister.Po ./$(DEPDIR)/ring.Po \ ./$(DEPDIR)/ring_async.Po ./$(DEPDIR)/ring_async_implicit.Po \ ./$(DEPDIR)/ring_sync.Po ./$(DEPDIR)/ring_sync_detached.Po \ ./$(DEPDIR)/starpu_redefine.Po ./$(DEPDIR)/sync.Po \ ./$(DEPDIR)/tags_checking.Po ./$(DEPDIR)/temporary.Po \ ./$(DEPDIR)/user_defined_datatype.Po 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 \ broadcast.c callback.c datatypes.c display_bindings.c driver.c \ early_request.c early_stuff.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 \ insert_task_seq.c insert_task_tags.c load_balancer.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 \ broadcast.c callback.c datatypes.c display_bindings.c driver.c \ early_request.c early_stuff.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 insert_task_seq.c insert_task_tags.c \ load_balancer.c $(am__loader_SOURCES_DIST) 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 \ $(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 \ $(user_defined_datatype_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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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-mynvcc.mk $(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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_LIBS@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) 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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_2) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 CCLD = $(MPICC) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_SIMGRID_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@@STARPU_SIMGRID_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@loader_SOURCES = ../../tests/loader.c @STARPU_QUICK_CHECK_FALSE@@STARPU_SIMGRID_FALSE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 # we always test on 4 processes, the execution time is not that bigger @STARPU_QUICK_CHECK_TRUE@@STARPU_SIMGRID_FALSE@MPI = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_SIMGRID_TRUE@MPI = $(abs_top_builddir)/tools/starpu_smpirun -np 4 -platform $(abs_top_srcdir)/tools/perfmodels/cluster.xml -hostfile $(abs_top_srcdir)/tools/perfmodels/hostfile @STARPU_HAVE_AM111_FALSE@TESTS_ENVIRONMENT = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=3 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=3 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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_0 = @echo " myNVCC " $@; @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_1 = @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc = $(V_mynvcc_$(V)) 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 # ######################## starpu_mpi_TESTS = broadcast callback driver early_request gather \ gather2 insert_task insert_task_block insert_task_count \ insert_task_dyn_handles insert_task_node_choice \ insert_task_owner insert_task_owner2 insert_task_owner_data \ insert_task_tags matrix matrix2 mpi_detached_tag mpi_earlyrecv \ mpi_irecv mpi_irecv_detached mpi_isend mpi_isend_detached \ mpi_reduction mpi_redux mpi_scatter_gather mpi_test \ multiple_send pingpong policy_register policy_register_many \ policy_selection policy_selection2 ring ring_async \ ring_async_implicit ring_sync ring_sync_detached temporary \ user_defined_datatype early_stuff $(am__append_3) \ $(am__append_4) $(am__append_5) ring_SOURCES = ring.c $(am__append_6) ring_sync_SOURCES = ring_sync.c $(am__append_7) ring_sync_detached_SOURCES = ring_sync_detached.c $(am__append_8) ring_async_SOURCES = ring_async.c $(am__append_9) ring_async_implicit_SOURCES = ring_async_implicit.c $(am__append_10) insert_task_count_SOURCES = insert_task_count.c $(am__append_11) mpi_reduction_SOURCES = mpi_reduction.c mpi_reduction_kernels.c user_defined_datatype_SOURCES = user_defined_datatype.c \ ../../examples/interface/complex_interface.c mpi_earlyrecv2_SOURCES = mpi_earlyrecv2.c \ ../../examples/interface/complex_interface.c mpi_earlyrecv2_sync_SOURCES = mpi_earlyrecv2_sync.c \ ../../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 $(top_srcdir)/starpu-mynvcc.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu.mk $(top_srcdir)/starpu-mynvcc.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) broadcast$(EXEEXT): $(broadcast_OBJECTS) $(broadcast_DEPENDENCIES) $(EXTRA_broadcast_DEPENDENCIES) @rm -f broadcast$(EXEEXT) $(AM_V_CCLD)$(LINK) $(broadcast_OBJECTS) $(broadcast_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) display_bindings$(EXEEXT): $(display_bindings_OBJECTS) $(display_bindings_DEPENDENCIES) $(EXTRA_display_bindings_DEPENDENCIES) @rm -f display_bindings$(EXEEXT) $(AM_V_CCLD)$(LINK) $(display_bindings_OBJECTS) $(display_bindings_LDADD) $(LIBS) driver$(EXEEXT): $(driver_OBJECTS) $(driver_DEPENDENCIES) $(EXTRA_driver_DEPENDENCIES) @rm -f driver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(driver_OBJECTS) $(driver_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) early_stuff$(EXEEXT): $(early_stuff_OBJECTS) $(early_stuff_DEPENDENCIES) $(EXTRA_early_stuff_DEPENDENCIES) @rm -f early_stuff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(early_stuff_OBJECTS) $(early_stuff_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) insert_task_seq$(EXEEXT): $(insert_task_seq_OBJECTS) $(insert_task_seq_DEPENDENCIES) $(EXTRA_insert_task_seq_DEPENDENCIES) @rm -f insert_task_seq$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_seq_OBJECTS) $(insert_task_seq_LDADD) $(LIBS) insert_task_tags$(EXEEXT): $(insert_task_tags_OBJECTS) $(insert_task_tags_DEPENDENCIES) $(EXTRA_insert_task_tags_DEPENDENCIES) @rm -f insert_task_tags$(EXEEXT) $(AM_V_CCLD)$(LINK) $(insert_task_tags_OBJECTS) $(insert_task_tags_LDADD) $(LIBS) load_balancer$(EXEEXT): $(load_balancer_OBJECTS) $(load_balancer_DEPENDENCIES) $(EXTRA_load_balancer_DEPENDENCIES) @rm -f load_balancer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(load_balancer_OBJECTS) $(load_balancer_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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface_pinned.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/broadcast.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datatypes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_bindings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/early_request.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/early_stuff.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gather.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gather2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_block.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_compute.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_count.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_dyn_handles.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_node_choice.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_owner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_owner2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_owner_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_recv_cache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_sent_cache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_seq.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_tags.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_balancer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_detached_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_earlyrecv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_earlyrecv2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_earlyrecv2_sync.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_irecv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_irecv_detached.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_isend.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_isend_detached.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_reduction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_reduction_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_redux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_scatter_gather.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiple_send.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pingpong.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_register.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_register_many.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_register_toomany.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_selection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_selection2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_unregister.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_async.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_async_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_sync.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring_sync_detached.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_redefine.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tags_checking.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/temporary.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_defined_datatype.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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 $$? broadcast.log: broadcast$(EXEEXT) @p='broadcast$(EXEEXT)'; \ b='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) 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) driver.log: driver$(EXEEXT) @p='driver$(EXEEXT)'; \ b='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) 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) 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) 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_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_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) 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_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_tags.log: insert_task_tags$(EXEEXT) @p='insert_task_tags$(EXEEXT)'; \ b='insert_task_tags'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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_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_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_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_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_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_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) 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) 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_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) 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) 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) 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_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) 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_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) 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) 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) 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) early_stuff.log: early_stuff$(EXEEXT) @p='early_stuff$(EXEEXT)'; \ b='early_stuff'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) display_bindings.log: display_bindings$(EXEEXT) @p='display_bindings$(EXEEXT)'; \ b='display_bindings'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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) 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_seq.log: insert_task_seq$(EXEEXT) @p='insert_task_seq$(EXEEXT)'; \ b='insert_task_seq'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) load_balancer.log: load_balancer$(EXEEXT) @p='load_balancer$(EXEEXT)'; \ b='load_balancer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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 -f ./$(DEPDIR)/attr.Po -rm -f ./$(DEPDIR)/block_interface.Po -rm -f ./$(DEPDIR)/block_interface_pinned.Po -rm -f ./$(DEPDIR)/broadcast.Po -rm -f ./$(DEPDIR)/callback.Po -rm -f ./$(DEPDIR)/complex_interface.Po -rm -f ./$(DEPDIR)/datatypes.Po -rm -f ./$(DEPDIR)/display_bindings.Po -rm -f ./$(DEPDIR)/driver.Po -rm -f ./$(DEPDIR)/early_request.Po -rm -f ./$(DEPDIR)/early_stuff.Po -rm -f ./$(DEPDIR)/gather.Po -rm -f ./$(DEPDIR)/gather2.Po -rm -f ./$(DEPDIR)/insert_task.Po -rm -f ./$(DEPDIR)/insert_task_block.Po -rm -f ./$(DEPDIR)/insert_task_compute.Po -rm -f ./$(DEPDIR)/insert_task_count.Po -rm -f ./$(DEPDIR)/insert_task_dyn_handles.Po -rm -f ./$(DEPDIR)/insert_task_node_choice.Po -rm -f ./$(DEPDIR)/insert_task_owner.Po -rm -f ./$(DEPDIR)/insert_task_owner2.Po -rm -f ./$(DEPDIR)/insert_task_owner_data.Po -rm -f ./$(DEPDIR)/insert_task_recv_cache.Po -rm -f ./$(DEPDIR)/insert_task_sent_cache.Po -rm -f ./$(DEPDIR)/insert_task_seq.Po -rm -f ./$(DEPDIR)/insert_task_tags.Po -rm -f ./$(DEPDIR)/load_balancer.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/matrix.Po -rm -f ./$(DEPDIR)/matrix2.Po -rm -f ./$(DEPDIR)/mpi_detached_tag.Po -rm -f ./$(DEPDIR)/mpi_earlyrecv.Po -rm -f ./$(DEPDIR)/mpi_earlyrecv2.Po -rm -f ./$(DEPDIR)/mpi_earlyrecv2_sync.Po -rm -f ./$(DEPDIR)/mpi_irecv.Po -rm -f ./$(DEPDIR)/mpi_irecv_detached.Po -rm -f ./$(DEPDIR)/mpi_isend.Po -rm -f ./$(DEPDIR)/mpi_isend_detached.Po -rm -f ./$(DEPDIR)/mpi_reduction.Po -rm -f ./$(DEPDIR)/mpi_reduction_kernels.Po -rm -f ./$(DEPDIR)/mpi_redux.Po -rm -f ./$(DEPDIR)/mpi_scatter_gather.Po -rm -f ./$(DEPDIR)/mpi_test.Po -rm -f ./$(DEPDIR)/multiple_send.Po -rm -f ./$(DEPDIR)/pingpong.Po -rm -f ./$(DEPDIR)/policy_register.Po -rm -f ./$(DEPDIR)/policy_register_many.Po -rm -f ./$(DEPDIR)/policy_register_toomany.Po -rm -f ./$(DEPDIR)/policy_selection.Po -rm -f ./$(DEPDIR)/policy_selection2.Po -rm -f ./$(DEPDIR)/policy_unregister.Po -rm -f ./$(DEPDIR)/ring.Po -rm -f ./$(DEPDIR)/ring_async.Po -rm -f ./$(DEPDIR)/ring_async_implicit.Po -rm -f ./$(DEPDIR)/ring_sync.Po -rm -f ./$(DEPDIR)/ring_sync_detached.Po -rm -f ./$(DEPDIR)/starpu_redefine.Po -rm -f ./$(DEPDIR)/sync.Po -rm -f ./$(DEPDIR)/tags_checking.Po -rm -f ./$(DEPDIR)/temporary.Po -rm -f ./$(DEPDIR)/user_defined_datatype.Po -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 -f ./$(DEPDIR)/attr.Po -rm -f ./$(DEPDIR)/block_interface.Po -rm -f ./$(DEPDIR)/block_interface_pinned.Po -rm -f ./$(DEPDIR)/broadcast.Po -rm -f ./$(DEPDIR)/callback.Po -rm -f ./$(DEPDIR)/complex_interface.Po -rm -f ./$(DEPDIR)/datatypes.Po -rm -f ./$(DEPDIR)/display_bindings.Po -rm -f ./$(DEPDIR)/driver.Po -rm -f ./$(DEPDIR)/early_request.Po -rm -f ./$(DEPDIR)/early_stuff.Po -rm -f ./$(DEPDIR)/gather.Po -rm -f ./$(DEPDIR)/gather2.Po -rm -f ./$(DEPDIR)/insert_task.Po -rm -f ./$(DEPDIR)/insert_task_block.Po -rm -f ./$(DEPDIR)/insert_task_compute.Po -rm -f ./$(DEPDIR)/insert_task_count.Po -rm -f ./$(DEPDIR)/insert_task_dyn_handles.Po -rm -f ./$(DEPDIR)/insert_task_node_choice.Po -rm -f ./$(DEPDIR)/insert_task_owner.Po -rm -f ./$(DEPDIR)/insert_task_owner2.Po -rm -f ./$(DEPDIR)/insert_task_owner_data.Po -rm -f ./$(DEPDIR)/insert_task_recv_cache.Po -rm -f ./$(DEPDIR)/insert_task_sent_cache.Po -rm -f ./$(DEPDIR)/insert_task_seq.Po -rm -f ./$(DEPDIR)/insert_task_tags.Po -rm -f ./$(DEPDIR)/load_balancer.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/matrix.Po -rm -f ./$(DEPDIR)/matrix2.Po -rm -f ./$(DEPDIR)/mpi_detached_tag.Po -rm -f ./$(DEPDIR)/mpi_earlyrecv.Po -rm -f ./$(DEPDIR)/mpi_earlyrecv2.Po -rm -f ./$(DEPDIR)/mpi_earlyrecv2_sync.Po -rm -f ./$(DEPDIR)/mpi_irecv.Po -rm -f ./$(DEPDIR)/mpi_irecv_detached.Po -rm -f ./$(DEPDIR)/mpi_isend.Po -rm -f ./$(DEPDIR)/mpi_isend_detached.Po -rm -f ./$(DEPDIR)/mpi_reduction.Po -rm -f ./$(DEPDIR)/mpi_reduction_kernels.Po -rm -f ./$(DEPDIR)/mpi_redux.Po -rm -f ./$(DEPDIR)/mpi_scatter_gather.Po -rm -f ./$(DEPDIR)/mpi_test.Po -rm -f ./$(DEPDIR)/multiple_send.Po -rm -f ./$(DEPDIR)/pingpong.Po -rm -f ./$(DEPDIR)/policy_register.Po -rm -f ./$(DEPDIR)/policy_register_many.Po -rm -f ./$(DEPDIR)/policy_register_toomany.Po -rm -f ./$(DEPDIR)/policy_selection.Po -rm -f ./$(DEPDIR)/policy_selection2.Po -rm -f ./$(DEPDIR)/policy_unregister.Po -rm -f ./$(DEPDIR)/ring.Po -rm -f ./$(DEPDIR)/ring_async.Po -rm -f ./$(DEPDIR)/ring_async_implicit.Po -rm -f ./$(DEPDIR)/ring_sync.Po -rm -f ./$(DEPDIR)/ring_sync_detached.Po -rm -f ./$(DEPDIR)/starpu_redefine.Po -rm -f ./$(DEPDIR)/sync.Po -rm -f ./$(DEPDIR)/tags_checking.Po -rm -f ./$(DEPDIR)/temporary.Po -rm -f ./$(DEPDIR)/user_defined_datatype.Po -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-exec \ install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ @$(MKDIR_P) `dirname $@` @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(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.3.9+dfsg/mpi/tests/attr.c000066400000000000000000000024711413463044200170330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) { int flag; int64_t *value; int64_t rvalue; 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"); rvalue = *value; FPRINTF(stderr, "Value: %"PRIi64"\n", *value); FPRINTF(stderr, "Value: %"PRIi64"\n", rvalue); return 0; } starpu-1.3.9+dfsg/mpi/tests/block_interface.c000066400000000000000000000076241413463044200212000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #else # define NITER 2048 #endif #define BIGSIZE 128 #define SIZE 64 int main(int argc, char **argv) { int ret, rank, size; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/block_interface_pinned.c000066400000000000000000000077171413463044200225400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #else # define NITER 2048 #endif #define BIGSIZE 128 #define SIZE 64 int main(int argc, char **argv) { int ret, rank, size; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/broadcast.c000066400000000000000000000051241413463044200200210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 wait_CPU(void *descr[], void *args) { int *var = (int*) STARPU_VARIABLE_GET_PTR(descr[0]); int val; starpu_codelet_unpack_args(args, &val); *var = val; starpu_sleep(1); } static struct starpu_codelet cl = { .cpu_funcs = { wait_CPU }, .cpu_funcs_name = { "wait_CPU" }, .nbuffers = 1, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .modes = { STARPU_W }, }; int main(int argc, char **argv) { int ret, rank, size; starpu_data_handle_t handle; int var=-1; int mpi_init; MPI_Status status; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); starpu_variable_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t)&var, sizeof(var)); if (rank == 0) { int val, n; val = 42; starpu_task_insert(&cl, STARPU_W, handle, STARPU_VALUE, &val, sizeof(val), 0); for(n = 1 ; n < size ; n++) { FPRINTF_MPI(stderr, "sending data to %d\n", n); starpu_mpi_isend_detached(handle, n, 0, MPI_COMM_WORLD, NULL, NULL); } val = 43; starpu_task_insert(&cl, STARPU_W, handle, STARPU_VALUE, &val, sizeof(val), 0); for(n = 1 ; n < size ; n++) { FPRINTF_MPI(stderr, "sending data to %d\n", n); starpu_mpi_isend_detached(handle, n, 0, MPI_COMM_WORLD, NULL, NULL); } } else { starpu_mpi_recv(handle, 0, 0, MPI_COMM_WORLD, &status); starpu_data_acquire(handle, STARPU_R); STARPU_ASSERT(var == 42); starpu_data_release(handle); starpu_mpi_recv(handle, 0, 0, MPI_COMM_WORLD, &status); starpu_data_acquire(handle, STARPU_R); STARPU_ASSERT(var == 43); starpu_data_release(handle); FPRINTF_MPI(stderr, "received data\n"); } starpu_data_unregister(handle); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/callback.c000066400000000000000000000060621413463044200176150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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(void *descr[], void *_args) { (void)descr; (void)_args; FPRINTF_MPI(stderr, "i am here\n"); } struct starpu_codelet my_codelet = { .cpu_funcs = {my_func}, .cuda_funcs = {my_func}, .opencl_funcs = {my_func}, .model = &starpu_perfmodel_nop, }; 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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_NFREE, 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_NFREE, &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_NFREE, &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_NFREE, &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(); return EXIT_SUCCESS; } starpu-1.3.9+dfsg/mpi/tests/datatypes.c000066400000000000000000000436411413463044200200630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (void)error; (void)handle_s; (void)handle_r; 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)); starpu_data_acquire(handle_s, STARPU_R); v_s = (float *)starpu_variable_get_local_ptr(handle_s); starpu_data_release(handle_s); starpu_data_acquire(handle_r, STARPU_R); v_r = (float *)starpu_variable_get_local_ptr(handle_r); starpu_data_release(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 #include "helper.h" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else int main(int argc, char **argv) { int ret; setenv("STARPU_DISPLAY_BINDINGS", "1", 1); MPI_INIT_THREAD_real(&argc, &argv, MPI_THREAD_SERIALIZED); ret = starpu_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_shutdown(); MPI_Finalize(); return EXIT_SUCCESS; } #endif starpu-1.3.9+dfsg/mpi/tests/driver.c000066400000000000000000000102571413463044200173550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else 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}; int mpi_init; setenv("STARPU_MPI_DRIVER_CALL_FREQUENCY", "1", 1); setenv("STARPU_MPI_DRIVER_TASK_FREQUENCY", "10", 1); MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { FPRINTF_MPI(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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; #ifdef STARPU_SIMGRID starpu_sleep(0.001); #endif } 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(); if (!mpi_init) MPI_Finalize(); return 0; } #endif starpu-1.3.9+dfsg/mpi/tests/early_request.c000066400000000000000000000152621413463044200207470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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) { (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_rw, STARPU_RW,el->ensure_submitted_order_send, STARPU_RW,tmp_send, 0); starpu_mpi_isend_detached(tmp_send,el->foreign_domain,el->tag, MPI_COMM_WORLD, NULL, NULL); starpu_insert_task(&submitted_order_rw, STARPU_RW,el->ensure_submitted_order_send, STARPU_RW,tmp_send, 0); //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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &mpi_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &mpi_size); if (starpu_cpu_worker_get_count() == 0) { if (mpi_rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return STARPU_TEST_SKIPPED; } /*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 #include "helper.h" #ifndef STARPU_USE_MPI_MPI int main(int argc, char **argv) { int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); if (!mpi_init) MPI_Finalize(); return 0; } #else #include #include #include void early_data() { struct _starpu_mpi_early_data_handle *edh[2]; struct _starpu_mpi_envelope envelope[2]; struct _starpu_mpi_node_tag node_tag[2]; struct _starpu_mpi_early_data_handle *early; struct _starpu_mpi_early_data_handle_tag_hashlist *hash; memset(&node_tag[0], 0, sizeof(struct _starpu_mpi_node_tag)); node_tag[0].node.rank = 1; node_tag[0].node.comm = MPI_COMM_WORLD; node_tag[0].data_tag = 42; memset(&node_tag[1], 0, sizeof(struct _starpu_mpi_node_tag)); node_tag[1].node.rank = 2; node_tag[1].node.comm = MPI_COMM_WORLD; node_tag[1].data_tag = 84; envelope[0].data_tag = node_tag[0].data_tag; edh[0] = _starpu_mpi_early_data_create(&envelope[0], node_tag[0].node.rank, node_tag[0].node.comm); envelope[1].data_tag = node_tag[1].data_tag; edh[1] = _starpu_mpi_early_data_create(&envelope[1], node_tag[1].node.rank, node_tag[1].node.comm); _starpu_mpi_early_data_add(edh[0]); _starpu_mpi_early_data_add(edh[1]); hash = _starpu_mpi_early_data_extract(&node_tag[1]); STARPU_ASSERT(_starpu_mpi_early_data_handle_list_size(&hash->list) == 1); early = _starpu_mpi_early_data_handle_list_pop_front(&hash->list); STARPU_ASSERT(early->node_tag.node.comm == node_tag[1].node.comm && early->node_tag.node.rank == node_tag[1].node.rank && early->node_tag.data_tag == node_tag[1].data_tag); STARPU_ASSERT(_starpu_mpi_early_data_handle_list_size(&hash->list) == 0); early = _starpu_mpi_early_data_find(&node_tag[0]); STARPU_ASSERT(early->node_tag.node.comm == node_tag[0].node.comm && early->node_tag.node.rank == node_tag[0].node.rank && early->node_tag.data_tag == node_tag[0].data_tag); } void early_request() { struct _starpu_mpi_req req[2]; struct _starpu_mpi_req *early; struct _starpu_mpi_early_request_tag_hashlist *hash; memset(&req[0].node_tag, 0, sizeof(struct _starpu_mpi_node_tag)); req[0].node_tag.node.rank = 1; req[0].node_tag.node.comm = MPI_COMM_WORLD; req[0].node_tag.data_tag = 42; memset(&req[1].node_tag, 0, sizeof(struct _starpu_mpi_node_tag)); req[1].node_tag.node.rank = 2; req[1].node_tag.node.comm = MPI_COMM_WORLD; req[1].node_tag.data_tag = 84; _starpu_mpi_early_request_enqueue(&req[1]); _starpu_mpi_early_request_enqueue(&req[0]); early = _starpu_mpi_early_request_dequeue(req[0].node_tag.data_tag, req[0].node_tag.node.rank, req[0].node_tag.node.comm); STARPU_ASSERT(early->node_tag.data_tag == req[0].node_tag.data_tag && early->node_tag.node.rank == req[0].node_tag.node.rank && early->node_tag.node.comm == req[0].node_tag.node.comm); hash = _starpu_mpi_early_request_extract(req[1].node_tag.data_tag, req[1].node_tag.node.rank, req[1].node_tag.node.comm); STARPU_ASSERT(_starpu_mpi_req_list_size(&hash->list) == 1); early = _starpu_mpi_req_list_pop_front(&hash->list); STARPU_ASSERT(_starpu_mpi_req_list_size(&hash->list) == 0); STARPU_ASSERT(early->node_tag.data_tag == req[1].node_tag.data_tag && early->node_tag.node.rank == req[1].node_tag.node.rank && early->node_tag.node.comm == req[1].node_tag.node.comm); } int main(int argc, char **argv) { int ret, rank, size, i; starpu_data_handle_t tab_handle[4]; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); early_data(); early_request(); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return 0; } #endif starpu-1.3.9+dfsg/mpi/tests/gather.c000066400000000000000000000042061413463044200173310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; starpu_data_handle_t handle; int var; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size<3) { FPRINTF(stderr, "We need more than 2 processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/gather2.c000066400000000000000000000060271413463044200174160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size<3) { FPRINTF(stderr, "We need more than 2 processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/helper.h000066400000000000000000000037331413463044200173470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "../../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_real(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) #ifdef STARPU_SIMGRID #define MPI_INIT_THREAD(argc, argv, required, init) do { *(init) = 1 ; } while(0) #else #define MPI_INIT_THREAD(argc, argv, required, init) do { \ *(init) = 0; \ MPI_INIT_THREAD_real(argc, argv, required); } while(0) #endif starpu-1.3.9+dfsg/mpi/tests/insert_task.c000066400000000000000000000073471413463044200204160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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)_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; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &starpu_perfmodel_nop, }; #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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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 this 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(); #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.3.9+dfsg/mpi/tests/insert_task_block.c000066400000000000000000000073741413463044200215700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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)_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); } } } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 1, #ifdef STARPU_SIMGRID .model = &starpu_perfmodel_nop, #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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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 this 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(); #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.3.9+dfsg/mpi/tests/insert_task_compute.c000066400000000000000000000137741413463044200221530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &starpu_perfmodel_nop, }; 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]; int barrier_ret; ret = starpu_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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: barrier_ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT(barrier_ret == MPI_SUCCESS); starpu_mpi_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_real(&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.3.9+dfsg/mpi/tests/insert_task_count.c000066400000000000000000000062401413463044200216150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args); #endif void increment_cpu(void *descr[], void *_args) { (void)_args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } 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 = &starpu_perfmodel_nop, }; int main(int argc, char **argv) { int ret, rank, size; int token = 0; starpu_data_handle_t token_handle; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2 || (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0)) { if (rank == 0) { if (size < 2) FPRINTF(stderr, "We need at least 2 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); if (!mpi_init) 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(); FPRINTF_MPI(stderr, "Final value for token %d\n", token); if (!mpi_init) 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.3.9+dfsg/mpi/tests/insert_task_dyn_handles.c000066400000000000000000000106141413463044200227550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (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; } } struct starpu_codelet codelet = { .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, .nbuffers = STARPU_VARIABLE_NBUFFERS, #ifdef STARPU_SIMGRID .model = &starpu_perfmodel_nop, #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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); if (starpu_cpu_worker_get_count() == 0) { if (rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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[], void *_args) { int node; int rank; (void)descr; 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); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .model = &starpu_perfmodel_nop, .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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); return 0; } starpu-1.3.9+dfsg/mpi/tests/insert_task_owner.c000066400000000000000000000126251413463044200216230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { int node; int rank; (void)descr; 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); } struct starpu_codelet mycodelet_r_w = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_rw_r = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_rw_rw = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_w_r = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_W, STARPU_R}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_r_r = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R}, .model = &starpu_perfmodel_nop, }; 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (starpu_cpu_worker_get_count() == 0) { if (rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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(); return 0; } starpu-1.3.9+dfsg/mpi/tests/insert_task_owner2.c000066400000000000000000000100301413463044200216710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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)_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); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 4, .modes = {STARPU_R, STARPU_RW, STARPU_W, STARPU_RW}, .model = &starpu_perfmodel_nop, }; 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (starpu_cpu_worker_get_count() == 0) { if (rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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_RW, 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(); return (rank == 0) ? ret : 0; } starpu-1.3.9+dfsg/mpi/tests/insert_task_owner_data.c000066400000000000000000000062071413463044200226130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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)_args; int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *x1 = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *x0 += 1; *x1 *= *x1; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .model = &starpu_perfmodel_nop, }; 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (starpu_cpu_worker_get_count() == 0) { if (rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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(); return ret; } starpu-1.3.9+dfsg/mpi/tests/insert_task_recv_cache.c000066400000000000000000000100531413463044200225440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else void func_cpu(void *descr[], void *_args) { (void)descr; (void)_args; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &starpu_perfmodel_nop, }; #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_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); for(i = 0; i < 2; i++) { int j; v[i] = calloc(N, sizeof(unsigned)); for(j=0 ; j #include #include #include "helper.h" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else void func_cpu(void *descr[], void *_args) { (void)descr; (void)_args; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &starpu_perfmodel_nop, }; #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_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); for(i = 0; i < 2; i++) { int j; v[i] = malloc(N * sizeof(unsigned)); for(j=0 ; j #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(void *descr[], void *_args) { (void) descr; (void) _args; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet2 = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &starpu_perfmodel_nop, }; #define X 4 /* Returns the MPI node number where data is */ int my_distrib(int x, int nb_nodes) { return x % nb_nodes; } void dotest(int rank, int size, char *enabled) { int x, i; int ret; unsigned values[X]; starpu_data_handle_t data_handles[X]; setenv("STARPU_MPI_CACHE", enabled, 1); FPRINTF(stderr, "Testing with cache '%s'\n", enabled); ret = starpu_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); for(x = 0; x < X; x++) { values[x] = (rank+1)*10; } for(x = 0; x < X; x++) { int mpi_rank = my_distrib(x, size); if (mpi_rank == rank) { starpu_variable_data_register(&data_handles[x], STARPU_MAIN_RAM, (uintptr_t)&(values[x]), sizeof(unsigned)); } else { /* I don't own this index, but will need it for my computations */ starpu_variable_data_register(&data_handles[x], -1, (uintptr_t)NULL, sizeof(unsigned)); } if (data_handles[x]) { starpu_mpi_data_register(data_handles[x], x, mpi_rank); } } for(i = 0 ; i #include #include "helper.h" void func_cpu(void *descr[], void *_args) { (void) _args; (void) descr; FPRINTF_MPI(stderr, "Hello\n"); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 1, .modes = {STARPU_RW}, .model = &starpu_perfmodel_nop, .name = "insert_task_tags" }; int main(int argc, char **argv) { int ret, rank, err; int x=32; starpu_data_handle_t handle0; starpu_data_handle_t handle1; int64_t *value; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); if (rank != 0 && rank != 1) goto end; starpu_variable_data_register(&handle0, STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&handle1, STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); starpu_mpi_comm_get_attr(MPI_COMM_WORLD, STARPU_MPI_TAG_UB, &value, &err); assert(err == 1); starpu_mpi_data_register(handle0, (*value)-1, 1); starpu_mpi_data_register(handle1, (*value)-2, 1); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_EXECUTE_ON_NODE, 0, STARPU_RW, handle0, 0); assert(err == 0); err = starpu_mpi_task_insert(MPI_COMM_WORLD, &mycodelet, STARPU_EXECUTE_ON_NODE, 1, STARPU_RW, handle1, 0); assert(err == 0); FPRINTF_MPI(stderr, "Waiting ...\n"); starpu_task_wait_for_all(); starpu_data_unregister(handle0); starpu_data_unregister(handle1); end: starpu_mpi_shutdown(); return 0; } starpu-1.3.9+dfsg/mpi/tests/load_balancer.c000066400000000000000000000037041413463044200206270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) || !defined(STARPU_USE_MPI_MPI) #warning unsetenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else void get_neighbors(int **neighbor_ids, int *nneighbors) { int rank, size; starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); *nneighbors = 1; *neighbor_ids = malloc(sizeof(int)); *neighbor_ids[0] = rank==size-1?0:rank+1; } void get_data_unit_to_migrate(starpu_data_handle_t **handle_unit, int *nhandles, int dst_node) { (void)handle_unit; (void)dst_node; *nhandles = 0; } int main(int argc, char **argv) { int ret; struct starpu_mpi_lb_conf itf; int mpi_init; itf.get_neighbors = get_neighbors; itf.get_data_unit_to_migrate = get_data_unit_to_migrate; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); unsetenv("STARPU_MPI_LB"); starpu_mpi_lb_init(NULL, NULL); starpu_mpi_lb_shutdown(); starpu_mpi_lb_init("heat", &itf); starpu_mpi_lb_shutdown(); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return 0; } #endif starpu-1.3.9+dfsg/mpi/tests/matrix.c000066400000000000000000000074631413463044200173730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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)_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; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &starpu_perfmodel_nop, }; #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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); if (starpu_cpu_worker_get_count() == 0) { if (rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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(); 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.3.9+dfsg/mpi/tests/matrix2.c000066400000000000000000000074301413463044200174470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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)_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; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &starpu_perfmodel_nop, }; #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]; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(NULL, NULL, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); 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(); if (!mpi_init) 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(); 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 if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/mpi_detached_tag.c000066400000000000000000000042031413463044200213150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/mpi_earlyrecv.c000066400000000000000000000076511413463044200207270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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}; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { FPRINTF_MPI(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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; #ifdef STARPU_SIMGRID starpu_sleep(0.001); #endif } 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(); if (!mpi_init) MPI_Finalize(); return ret; } starpu-1.3.9+dfsg/mpi/tests/mpi_earlyrecv2.c000066400000000000000000000150601413463044200210020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/mpi_irecv_detached.c000066400000000000000000000050631413463044200216570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/mpi_isend.c000066400000000000000000000041141413463044200200240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/mpi_isend_detached.c000066400000000000000000000053571413463044200216570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/mpi_reduction.c000066400000000000000000000115461413463044200207250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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); static struct starpu_codelet init_codelet = { .cpu_funcs = {init_cpu_func}, .nbuffers = 1, .modes = {STARPU_W}, #ifdef STARPU_SIMGRID .model = &starpu_perfmodel_nop, #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 = &starpu_perfmodel_nop, #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 = &starpu_perfmodel_nop, #endif .name = "dot_codelet" }; static struct starpu_codelet display_codelet = { .cpu_funcs = {display_cpu_func}, .nbuffers = 1, .modes = {STARPU_R}, #ifdef STARPU_SIMGRID .model = &starpu_perfmodel_nop, #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 ret; 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; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &my_rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (starpu_cpu_worker_get_count() == 0) { if (my_rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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) { (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) { (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) { (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) { (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.3.9+dfsg/mpi/tests/mpi_redux.c000066400000000000000000000062611413463044200200560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); sum = ((size-1) * (size) / 2); 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; } } static struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet}, .nbuffers = 1, .modes = {STARPU_RW}, #ifdef STARPU_SIMGRID .model = &starpu_perfmodel_nop, #endif }; void scallback(void *arg) { char *msg = arg; FPRINTF_MPI(stderr, "Sending completed for <%s>\n", msg); } void rcallback(void *arg) { 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &nodes); if (starpu_cpu_worker_get_count() == 0) { if (rank == 0) FPRINTF(stderr, "We need at least 1 CPU worker.\n"); starpu_mpi_shutdown(); return STARPU_TEST_SKIPPED; } 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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); #ifdef STARPU_SIMGRID starpu_sleep(0.001); #endif } while (!finished); } starpu_data_unregister(tab_handle); free(tab); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/multiple_send.c000066400000000000000000000053561413463044200207320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); 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--; } } } #ifdef STARPU_SIMGRID starpu_sleep(0.001); #endif } } 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(); return 0; } starpu-1.3.9+dfsg/mpi/tests/pingpong.c000066400000000000000000000041531413463044200177010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size%2 != 0) { if (rank == 0) FPRINTF(stderr, "We need a even number of processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/policy_register.c000066400000000000000000000072651413463044200212720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_W, STARPU_W}, .model = &starpu_perfmodel_nop, }; 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]; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); if (!mpi_init) 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/policy_register_many.c000066400000000000000000000032061413463044200223050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); return 0; } starpu-1.3.9+dfsg/mpi/tests/policy_register_toomany.c000066400000000000000000000026611413463044200230330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); return 0; } starpu-1.3.9+dfsg/mpi/tests/policy_selection.c000066400000000000000000000107111413463044200214210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; } struct starpu_codelet mycodelet_2 = { .cpu_funcs = {func_cpu}, .nbuffers = 2, .modes = {STARPU_W, STARPU_W}, .model = &starpu_perfmodel_nop, }; struct starpu_codelet mycodelet_3 = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_W, STARPU_W}, .model = &starpu_perfmodel_nop, }; int main(int argc, char **argv) { int ret; int rank, size; int policy = 12; struct starpu_task *task; starpu_data_handle_t handles[3]; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); (void)mpi_init; ret = starpu_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 3) { if (rank == 0) FPRINTF(stderr, "We need at least 3 processes.\n"); starpu_mpi_shutdown(); if (!mpi_init) 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 == 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 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/policy_selection2.c000066400000000000000000000076201413463044200215100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 3, .modes = {STARPU_R, STARPU_W, STARPU_W}, .model = &starpu_perfmodel_nop, }; int main(int argc, char **argv) { int ret; int i; int rank, size; int data[3]; starpu_data_handle_t handles[3]; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); (void)mpi_init; ret = starpu_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); 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(); if (!mpi_init) 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]); #ifndef STARPU_SIMGRID if (rank == 0) { 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]); } #endif 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]); #ifndef STARPU_SIMGRID 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]); } #endif for(i=0 ; i<3 ; i++) starpu_data_unregister(handles[i]); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/policy_unregister.c000066400000000000000000000021231413463044200216210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_node_selection_unregister_policy(STARPU_MPI_NODE_SELECTION_MOST_R_DATA); starpu_mpi_shutdown(); return 0; } starpu-1.3.9+dfsg/mpi/tests/ring.c000066400000000000000000000070241413463044200170170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args); #endif void increment_cpu(void *descr[], void *_args) { (void)_args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } 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 = &starpu_perfmodel_nop, }; void increment_token(starpu_data_handle_t token_handle) { 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; int mpi_init; int token = 42; starpu_data_handle_t token_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2 || (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0)) { if (rank == 0) { if (size < 2) FPRINTF(stderr, "We need at least 2 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); if (!mpi_init) 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++) { starpu_mpi_tag_t tag = ((starpu_mpi_tag_t) 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 { 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(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(); if (!mpi_init) MPI_Finalize(); #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.3.9+dfsg/mpi/tests/ring_async.c000066400000000000000000000072431413463044200202170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args); #endif void increment_cpu(void *descr[], void *_args) { (void)_args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } 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 = &starpu_perfmodel_nop, }; void increment_token(starpu_data_handle_t token_handle) { 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; int mpi_init; int token = 42; starpu_data_handle_t token_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2 || (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0)) { if (rank == 0) { if (size < 2) FPRINTF(stderr, "We need at least 2 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); if (!mpi_init) 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++) { starpu_mpi_tag_t tag = ((starpu_mpi_tag_t) 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 { 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(token_handle); 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(); if (!mpi_init) MPI_Finalize(); #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.3.9+dfsg/mpi/tests/ring_async_implicit.c000066400000000000000000000066061413463044200221130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args); #endif void increment_cpu(void *descr[], void *_args) { (void)_args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } 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 = &starpu_perfmodel_nop, }; void increment_token(starpu_data_handle_t token_handle) { 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; int token = 42; starpu_data_handle_t token_handle; ret = starpu_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2 || (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0)) { if (rank == 0) { if (size < 2) FPRINTF(stderr, "We need at least 2 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); 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++) { starpu_mpi_tag_t tag = ((starpu_mpi_tag_t) 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(token_handle); 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(); #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.3.9+dfsg/mpi/tests/ring_kernel.cu000066400000000000000000000021741413463044200205450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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(int *token) { (*token)++; } extern "C" void increment_cuda(void *descr[], void *_args) { (void) _args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); cuda_incrementer<<<1,1, 0, starpu_cuda_get_local_stream()>>>(tokenptr); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/mpi/tests/ring_sync.c000066400000000000000000000071361413463044200200570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args); #endif void increment_cpu(void *descr[], void *_args) { (void)_args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } 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 = &starpu_perfmodel_nop, }; void increment_token(starpu_data_handle_t token_handle) { 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; int mpi_init; int token = 42; starpu_data_handle_t token_handle; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2 || (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0)) { if (rank == 0) { if (size < 2) FPRINTF(stderr, "We need at least 2 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); if (!mpi_init) 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++) { starpu_mpi_tag_t tag = ((starpu_mpi_tag_t) 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 { 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(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(); if (!mpi_init) MPI_Finalize(); #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.3.9+dfsg/mpi/tests/ring_sync_detached.c000066400000000000000000000101001413463044200216610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args); #endif void increment_cpu(void *descr[], void *_args) { (void)_args; int *tokenptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); (*tokenptr)++; } 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 = &starpu_perfmodel_nop, }; 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; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(&argc, &argv, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); starpu_mpi_comm_rank(MPI_COMM_WORLD, &rank); starpu_mpi_comm_size(MPI_COMM_WORLD, &size); if (size < 2 || (starpu_cpu_worker_get_count() + starpu_cuda_worker_get_count() == 0)) { if (rank == 0) { if (size < 2) FPRINTF(stderr, "We need at least 2 processes.\n"); else FPRINTF(stderr, "We need at least 1 CPU or CUDA worker.\n"); } starpu_mpi_shutdown(); if (!mpi_init) 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++) { starpu_mpi_tag_t tag = ((starpu_mpi_tag_t) loop)*size + rank; if (loop == 0 && rank == 0) { starpu_data_acquire(token_handle, STARPU_W); token = 0; FPRINTF_MPI(stderr, "Start with token value %d\n", token); starpu_data_release(token_handle); } 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(); FPRINTF_MPI(stderr, "Final value for token %d\n", token); if (!mpi_init) MPI_Finalize(); #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.3.9+dfsg/mpi/tests/starpu_redefine.c000066400000000000000000000025021413463044200212330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; int mpi_init; if (RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; disable_coredump(); MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); ret = starpu_mpi_init_conf(NULL, NULL, mpi_init, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/sync.c000066400000000000000000000063071413463044200170370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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]; int mpi_init; MPI_INIT_THREAD(&argc, &argv, MPI_THREAD_SERIALIZED, &mpi_init); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (size % 2) { FPRINTF(stderr, "We need a even number of processes.\n"); if (!mpi_init) 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_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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); starpu_data_acquire(data[0], STARPU_R); 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_data_release(data[0]); 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); starpu_data_acquire(data[0], STARPU_R); 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_release(data[0]); } starpu_data_unregister(data[0]); starpu_data_unregister(data[1]); starpu_mpi_shutdown(); if (!mpi_init) MPI_Finalize(); return 0; } starpu-1.3.9+dfsg/mpi/tests/tags_checking.c000066400000000000000000000072741413463044200206600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_mpi_init_conf(NULL, NULL, 0, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); return ret; } int main(int argc, char **argv) { int size; int rank; int ret=0; int sdetached, rdetached; MPI_INIT_THREAD_real(&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.3.9+dfsg/mpi/tests/temporary.c000066400000000000000000000112341413463044200201000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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[], void *_args) { (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); } static struct starpu_codelet codelet_add = { .cpu_funcs = {func_add}, .nbuffers = 3, .modes = {STARPU_W, STARPU_R, STARPU_R}, .model = &starpu_perfmodel_nop, .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_mpi_init_conf(&argc, &argv, 1, MPI_COMM_WORLD, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_mpi_init_conf"); 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(); return STARPU_TEST_SKIPPED; } 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); if (rank == 0) STARPU_ASSERT_MSG(val0 == 24, "[rank 0] %d should be %d\n", val0, 24); if (rank == 1) STARPU_ASSERT_MSG(val1 == 24, "[rank 1] %d should be %d\n", val1, 24); skip: starpu_mpi_shutdown(); return 0; } starpu-1.3.9+dfsg/mpi/tests/user_defined_datatype.c000066400000000000000000000116231413463044200224070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, starpu_mpi_tag_t); void test_handle_irecv_isend_detached(starpu_data_handle_t *handles, int nb_handles, int rank, starpu_mpi_tag_t tag) { int i; (void)rank; 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) { (void)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_to_pointer(void *data_interface, unsigned node) { (void) node; struct starpu_value_interface *value_interface = data_interface; 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 = (void*) starpu_malloc_on_node_flags(node, *count, 0); 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) { (void)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); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); 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; 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), .to_pointer = value_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.3.9+dfsg/sc_hypervisor/000077500000000000000000000000001413463044200166615ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/Makefile.am000066400000000000000000000017561413463044200207260ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-subdirtests.mk 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 starpu-1.3.9+dfsg/sc_hypervisor/Makefile.in000066400000000000000000000675601413463044200207440ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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 distdir-am 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)/starpu-subdirtests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 $(top_srcdir)/starpu-subdirtests.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/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-subdirtests.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): 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET showfailed: @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET showsuite: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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.3.9+dfsg/sc_hypervisor/examples/000077500000000000000000000000001413463044200204775ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/examples/Makefile.am000066400000000000000000000040551413463044200225370ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 !STARPU_NO_BLAS_LIB noinst_PROGRAMS += \ cholesky/cholesky_implicit noinst_HEADERS = \ cholesky/cholesky.h \ sched_ctx_utils/sched_ctx_utils.h endif if !STARPU_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.3.9+dfsg/sc_hypervisor/examples/Makefile.in000066400000000000000000001506311413463044200225520ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) @STARPU_NO_BLAS_LIB_FALSE@am__append_1 = \ @STARPU_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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_NO_BLAS_LIB_FALSE@am__EXEEXT_1 = \ @STARPU_NO_BLAS_LIB_FALSE@ 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 @STARPU_NO_BLAS_LIB_FALSE@am_cholesky_cholesky_implicit_OBJECTS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_implicit.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils.$(OBJEXT) \ @STARPU_NO_BLAS_LIB_FALSE@ blas.$(OBJEXT) cholesky_cholesky_implicit_OBJECTS = \ $(am_cholesky_cholesky_implicit_OBJECTS) am__DEPENDENCIES_1 = @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_DEPENDENCIES = $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ @STARPU_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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/app_driven_test.Po \ ./$(DEPDIR)/blas.Po ./$(DEPDIR)/cholesky_implicit.Po \ ./$(DEPDIR)/cholesky_kernels.Po ./$(DEPDIR)/cholesky_models.Po \ ./$(DEPDIR)/lp_resize_test.Po ./$(DEPDIR)/lp_test.Po \ ./$(DEPDIR)/resize_hierarchical_ctxs.Po \ ./$(DEPDIR)/sched_ctx_utils.Po 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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) 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) @STARPU_NO_BLAS_LIB_FALSE@noinst_HEADERS = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky.h \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.h @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_SOURCES = \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @STARPU_NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @STARPU_NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.c \ @STARPU_NO_BLAS_LIB_FALSE@ ../../examples/common/blas.c @STARPU_NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_LDADD = \ @STARPU_NO_BLAS_LIB_FALSE@ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ @STARPU_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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_models.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_resize_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resize_hierarchical_ctxs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_utils.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/app_driven_test.Po -rm -f ./$(DEPDIR)/blas.Po -rm -f ./$(DEPDIR)/cholesky_implicit.Po -rm -f ./$(DEPDIR)/cholesky_kernels.Po -rm -f ./$(DEPDIR)/cholesky_models.Po -rm -f ./$(DEPDIR)/lp_resize_test.Po -rm -f ./$(DEPDIR)/lp_test.Po -rm -f ./$(DEPDIR)/resize_hierarchical_ctxs.Po -rm -f ./$(DEPDIR)/sched_ctx_utils.Po -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 -f ./$(DEPDIR)/app_driven_test.Po -rm -f ./$(DEPDIR)/blas.Po -rm -f ./$(DEPDIR)/cholesky_implicit.Po -rm -f ./$(DEPDIR)/cholesky_kernels.Po -rm -f ./$(DEPDIR)/cholesky_models.Po -rm -f ./$(DEPDIR)/lp_resize_test.Po -rm -f ./$(DEPDIR)/lp_test.Po -rm -f ./$(DEPDIR)/resize_hierarchical_ctxs.Po -rm -f ./$(DEPDIR)/sched_ctx_utils.Po -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 am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK # 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.3.9+dfsg/sc_hypervisor/examples/app_driven_test/000077500000000000000000000000001413463044200236655ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/examples/app_driven_test/app_driven_test.c000066400000000000000000000132671413463044200272300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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]; starpu_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++) { STARPU_PTHREAD_MUTEX_LOCK(&mut[params->sched_ctx - 1]); val[params->sched_ctx - 1]++; STARPU_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 num_workers = starpu_worker_get_count(); int nres1 = num_workers; int nres2 = num_workers; 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] = 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; STARPU_PTHREAD_MUTEX_INIT(&mut[0], NULL); STARPU_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.3.9+dfsg/sc_hypervisor/examples/cholesky/000077500000000000000000000000001413463044200223205ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/examples/cholesky/cholesky.h000066400000000000000000000115371413463044200243210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 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.3.9+dfsg/sc_hypervisor/examples/cholesky/cholesky_implicit.c000066400000000000000000000225421413463044200262040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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) { 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) { int ret; /* 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); ret = starpu_init(NULL); if (ret == -ENODEV) return 77; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #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(); 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.3.9+dfsg/sc_hypervisor/examples/cholesky/cholesky_kernels.c000066400000000000000000000137421413463044200260370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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, 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, 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, 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 = cudaDeviceSynchronize(); 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.3.9+dfsg/sc_hypervisor/examples/cholesky/cholesky_models.c000066400000000000000000000102151413463044200256470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/sc_hypervisor/examples/hierarchical_ctxs/000077500000000000000000000000001413463044200241565ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/examples/hierarchical_ctxs/resize_hierarchical_ctxs.c000066400000000000000000000132711413463044200313660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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]; starpu_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++) { STARPU_PTHREAD_MUTEX_LOCK(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; STARPU_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; STARPU_PTHREAD_MUTEX_INIT(&mut[0], NULL); STARPU_PTHREAD_MUTEX_INIT(&mut[1], NULL); STARPU_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.3.9+dfsg/sc_hypervisor/examples/lp_test/000077500000000000000000000000001413463044200221515ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/examples/lp_test/lp_resize_test.c000066400000000000000000000111411413463044200253460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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]; starpu_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++) { STARPU_PTHREAD_MUTEX_LOCK(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; STARPU_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; STARPU_PTHREAD_MUTEX_INIT(&mut[0], NULL); STARPU_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.3.9+dfsg/sc_hypervisor/examples/lp_test/lp_test.c000066400000000000000000000110321413463044200237640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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]; starpu_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++) { STARPU_PTHREAD_MUTEX_LOCK(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; STARPU_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; STARPU_PTHREAD_MUTEX_INIT(&mut[0], NULL); STARPU_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.3.9+dfsg/sc_hypervisor/examples/sched_ctx_utils/000077500000000000000000000000001413463044200236635ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/examples/sched_ctx_utils/sched_ctx_utils.c000066400000000000000000000322721413463044200272210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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() { 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.3.9+dfsg/sc_hypervisor/examples/sched_ctx_utils/sched_ctx_utils.h000066400000000000000000000024111413463044200272160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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.3.9+dfsg/sc_hypervisor/include/000077500000000000000000000000001413463044200203045ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/include/sc_hypervisor.h000066400000000000000000000215611413463044200233610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_SC_Hypervisor Methods to implement a hypervisor resizing policy. */ struct sc_hypervisor_policy { /** Indicate the name of the policy, if there is not a custom policy, the policy corresponding to this name will be used by the hypervisor */ const char* name; /** Indicate whether the policy is custom 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); /** Called whenever the indicated worker executes another idle cycle in sched_ctx */ void (*handle_idle_cycle)(unsigned sched_ctx, int worker); /** Called whenever a task is pushed on the worker’s queue corresponding to the context sched_ctx */ void (*handle_pushed_task)(unsigned sched_ctx, int worker); /** Called whenever a task is poped from the worker’s queue corresponding to the context sched_ctx */ void (*handle_poped_task)(unsigned sched_ctx, int worker,struct starpu_task *task, uint32_t footprint); /** Called whenever a task is executed on the indicated worker and context after a long period of idle time */ void (*handle_idle_end)(unsigned sched_ctx, int worker); /** Called whenever a tag task has just been executed. The table of resize requests is provided as well as the tag */ 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); /** the hypervisor takes a decision when a certain ctx was registerd */ void (*start_ctx)(unsigned sched_ctx); /** the hypervisor initializes values for the workers */ void (*init_worker)(int workerid, unsigned sched_ctx); }; /** @defgroup API_SC_Hypervisor_usage Scheduling Context Hypervisor - Regular 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. The function sc_hypervisor_init() 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. Scheduling Contexts that have to be resized by the hypervisor must be first registered to the hypervisor using the function sc_hypervisor_register_ctx() 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). @{ */ /** synchronise the hypervisor when several workers try to update its information */ extern starpu_pthread_mutex_t act_hypervisor_mutex; /** Start the hypervisor with the given policy */ void* sc_hypervisor_init(struct sc_hypervisor_policy *policy); /** Shutdown the hypervisor. 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. */ void sc_hypervisor_shutdown(void); /** Register the context to the hypervisor, and indicate the number of flops the context will execute (used for Gflops rate based strategy) */ void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops); /** Unregister a context from the hypervisor, and so exclude the context from the resizing process */ void sc_hypervisor_unregister_ctx(unsigned sched_ctx); /** Require resizing the context \p sched_ctx whenever a task tagged with the id \p task_tag finished executing */ void sc_hypervisor_post_resize_request(unsigned sched_ctx, int task_tag); /** Require reconsidering the distribution of ressources over the indicated scheduling contexts, i.e 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); /** Do not allow the hypervisor to resize a context. */ void sc_hypervisor_stop_resize(unsigned sched_ctx); /** Allow the hypervisor to resize a context if necessary. */ void sc_hypervisor_start_resize(unsigned sched_ctx); /** Return the name of the resizing policy used by 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 choose 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); /** Update the min and max workers needed by each context */ void sc_hypervisor_update_resize_interval(unsigned *sched_ctxs, int nsched_ctxs, int max_nworkers); /** Return 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); /** Return 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(); void sc_hypervisor_init_worker(int workerid, unsigned sched_ctx); /** @} */ #ifdef __cplusplus } #endif #endif starpu-1.3.9+dfsg/sc_hypervisor/include/sc_hypervisor_config.h000066400000000000000000000147551413463044200247150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_SC_Hypervisor @{ */ /** 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 */ #define SC_HYPERVISOR_MAX_IDLE -1 #define SC_HYPERVISOR_MIN_WORKING -2 /** 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. */ #define SC_HYPERVISOR_PRIORITY -3 /** 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. */ #define SC_HYPERVISOR_MIN_WORKERS -4 /** 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 */ #define SC_HYPERVISOR_MAX_WORKERS -5 /** 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. */ #define SC_HYPERVISOR_GRANULARITY -6 /** 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. */ #define SC_HYPERVISOR_FIXED_WORKERS -7 /** 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. */ #define SC_HYPERVISOR_MIN_TASKS -8 /** 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. */ #define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE -9 /** 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. */ #define SC_HYPERVISOR_TIME_TO_APPLY -10 /** This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 argument */ #define SC_HYPERVISOR_NULL -11 /** 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 */ #define SC_HYPERVISOR_ISPEED_W_SAMPLE -12 /** 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 */ #define SC_HYPERVISOR_ISPEED_CTX_SAMPLE -13 #define SC_HYPERVISOR_TIME_SAMPLE -14 #define MAX_IDLE_TIME 5000000000 #define MIN_WORKING_TIME 500 /** Methods that implement a hypervisor resizing policy. */ struct sc_hypervisor_policy_config { /** Indicate the minimum number of workers needed by the context */ int min_nworkers; /** Indicate the maximum number of workers needed by the context */ int max_nworkers; /** Indicate the workers granularity of the context */ int granularity; /** Indicate the priority of each worker to stay in the context the smaller the priority the faster it will be moved to another context */ int priority[STARPU_NMAXWORKERS]; /** Indicate the maximum idle time accepted before a resize is triggered above this limit the priority of the worker is reduced */ double max_idle[STARPU_NMAXWORKERS]; /** Indicate that underneath this limit the priority of the worker is reduced */ double min_working[STARPU_NMAXWORKERS]; /** Indicate which workers can be moved and which ones are fixed */ int fixed_workers[STARPU_NMAXWORKERS]; /** Indicate the maximum idle time accepted before a resize is triggered for the workers that just arrived in the new context */ double new_workers_max_idle; /** Indicate the sample used to compute the instant speed per worker */ double ispeed_w_sample[STARPU_NMAXWORKERS]; /** Indicate the sample used to compute the instant speed per ctxs */ double ispeed_ctx_sample; /** Indicate the sample used to compute the instant speed per ctx (in seconds) */ double time_sample; }; /** Specify the configuration for a context */ void sc_hypervisor_set_config(unsigned sched_ctx, void *config); /** Return the configuration of a context */ struct sc_hypervisor_policy_config *sc_hypervisor_get_config(unsigned sched_ctx); /** Specify different parameters for the configuration of a context. The list must be zero-terminated */ void sc_hypervisor_ctl(unsigned sched_ctx, ...); /** @} */ #ifdef __cplusplus } #endif #endif starpu-1.3.9+dfsg/sc_hypervisor/include/sc_hypervisor_lp.h000066400000000000000000000116121413463044200240500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_SC_Hypervisor_LP Scheduling Context Hypervisor - Linear Programming @{ */ #ifdef STARPU_HAVE_GLPK_H #include #endif //STARPU_HAVE_GLPK_H struct sc_hypervisor_policy_task_pool; struct types_of_workers; /** return tmax, and compute in table res the nr of workers needed by each context st the system ends up in the smallest tma */ 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); /** return 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.3.9+dfsg/sc_hypervisor/include/sc_hypervisor_monitoring.h000066400000000000000000000145401413463044200256250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2015 Mathieu Lirzin * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @ingroup API_SC_Hypervisor @{ */ /** Structure to check if the workers moved to another context are actually taken into account in that context. */ struct sc_hypervisor_resize_ack { /** The context receiving the new workers */ 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. If the value corresponding to a worker is 1, this worker got moved in the new context. */ int *acked_workers; }; /** Wrapper of the contexts available in StarPU which contains all information about a context obtained by incrementing the performance counters. it is attached to a sched_ctx storing monitoring information */ struct sc_hypervisor_wrapper { /** the monitored context */ unsigned sched_ctx; /** The corresponding resize configuration */ 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]; /** The idle time counter of each worker of the context */ double current_idle_time[STARPU_NMAXWORKERS]; /** The time the workers were idle from the last resize */ double idle_time[STARPU_NMAXWORKERS]; /** The moment when the workers started being idle */ 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 the context (lazy resizing process) */ int worker_to_be_removed[STARPU_NMAXWORKERS]; /** Number of tasks pushed on each worker in this context */ int pushed_tasks[STARPU_NMAXWORKERS]; /** Number of tasks poped from each worker in this context */ int poped_tasks[STARPU_NMAXWORKERS]; /** The total number of flops to execute by the context */ double total_flops; /** The number of flops executed by each workers of the context */ double total_elapsed_flops[STARPU_NMAXWORKERS]; /** number of flops executed since last resizing */ double elapsed_flops[STARPU_NMAXWORKERS]; /** Quantity of data (in bytes) used to execute tasks on each worker in this context */ size_t elapsed_data[STARPU_NMAXWORKERS]; /** Number of tasks executed on each worker in this context */ 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 context */ double submitted_flops; /** Number of flops that still have to be executed by the workers in this context */ double remaining_flops; /** Start time of the resizing sample of this context */ double start_time; /** First time a task was pushed to this context */ double real_start_time; /** Start time for sample in which the hypervisor is not allowed to react bc too expensive */ double hyp_react_start_time; /** Structure confirming the last resize finished and a new one can be done. Workers do not leave the current context until the receiver context does not ack the receive of these workers */ struct sc_hypervisor_resize_ack resize_ack; /** Mutex needed to synchronize the acknowledgment of the workers into the receiver context */ starpu_pthread_mutex_t mutex; /** Boolean indicating if the hypervisor can use the flops corresponding to the entire execution of the context */ 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 the given context @ingroup API_SC_Hypervisor */ struct sc_hypervisor_wrapper *sc_hypervisor_get_wrapper(unsigned sched_ctx); /** Get the list of registered contexts @ingroup API_SC_Hypervisor */ unsigned *sc_hypervisor_get_sched_ctxs(); /** Get the number of registered contexts @ingroup API_SC_Hypervisor */ 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) @ingroup API_SC_Hypervisor */ 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.3.9+dfsg/sc_hypervisor/include/sc_hypervisor_policy.h000066400000000000000000000146141413463044200247410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @defgroup API_SC_Hypervisor Scheduling Context Hypervisor - Building a new resizing policy @{ */ #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; }; /** Task wrapper linked list @ingroup API_SC_Hypervisor */ struct sc_hypervisor_policy_task_pool { /** Which codelet has been executed */ struct starpu_codelet *cl; /** Task footprint key */ uint32_t footprint; /** Context the task belongs to */ unsigned sched_ctx_id; /** Number of tasks of this kind */ unsigned long n; /** The quantity of data(in bytes) needed by the task to execute */ size_t data_size; /** Other task kinds */ 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 contex */ 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.3.9+dfsg/sc_hypervisor/src/000077500000000000000000000000001413463044200174505ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/src/Makefile.am000066400000000000000000000037451413463044200215150ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-notests.mk 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 \ hypervisor_policies/perf_count_policy.c noinst_HEADERS = sc_hypervisor_intern.h starpu-1.3.9+dfsg/sc_hypervisor/src/Makefile.in000066400000000000000000001427011413463044200215220ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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 \ perf_count_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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/app_driven_policy.Plo \ ./$(DEPDIR)/dichotomy.Plo ./$(DEPDIR)/feft_lp_policy.Plo \ ./$(DEPDIR)/gflops_rate_policy.Plo \ ./$(DEPDIR)/hard_coded_policy.Plo ./$(DEPDIR)/idle_policy.Plo \ ./$(DEPDIR)/ispeed_lp_policy.Plo ./$(DEPDIR)/ispeed_policy.Plo \ ./$(DEPDIR)/lp_programs.Plo ./$(DEPDIR)/lp_tools.Plo \ ./$(DEPDIR)/perf_count_policy.Plo ./$(DEPDIR)/policy_tools.Plo \ ./$(DEPDIR)/sc_config.Plo ./$(DEPDIR)/sc_hypervisor.Plo \ ./$(DEPDIR)/speed.Plo ./$(DEPDIR)/task_pool.Plo \ ./$(DEPDIR)/teft_lp_policy.Plo \ ./$(DEPDIR)/throughput_lp_policy.Plo 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 \ $(top_srcdir)/starpu-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 \ hypervisor_policies/perf_count_policy.c noinst_HEADERS = sc_hypervisor_intern.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-notests.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/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.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}; \ } 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dichotomy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feft_lp_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gflops_rate_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hard_coded_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idle_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ispeed_lp_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ispeed_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_programs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_tools.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf_count_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_tools.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sc_config.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sc_hypervisor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speed.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_pool.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/teft_lp_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throughput_lp_policy.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 perf_count_policy.lo: hypervisor_policies/perf_count_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 perf_count_policy.lo -MD -MP -MF $(DEPDIR)/perf_count_policy.Tpo -c -o perf_count_policy.lo `test -f 'hypervisor_policies/perf_count_policy.c' || echo '$(srcdir)/'`hypervisor_policies/perf_count_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/perf_count_policy.Tpo $(DEPDIR)/perf_count_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/perf_count_policy.c' object='perf_count_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 perf_count_policy.lo `test -f 'hypervisor_policies/perf_count_policy.c' || echo '$(srcdir)/'`hypervisor_policies/perf_count_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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/app_driven_policy.Plo -rm -f ./$(DEPDIR)/dichotomy.Plo -rm -f ./$(DEPDIR)/feft_lp_policy.Plo -rm -f ./$(DEPDIR)/gflops_rate_policy.Plo -rm -f ./$(DEPDIR)/hard_coded_policy.Plo -rm -f ./$(DEPDIR)/idle_policy.Plo -rm -f ./$(DEPDIR)/ispeed_lp_policy.Plo -rm -f ./$(DEPDIR)/ispeed_policy.Plo -rm -f ./$(DEPDIR)/lp_programs.Plo -rm -f ./$(DEPDIR)/lp_tools.Plo -rm -f ./$(DEPDIR)/perf_count_policy.Plo -rm -f ./$(DEPDIR)/policy_tools.Plo -rm -f ./$(DEPDIR)/sc_config.Plo -rm -f ./$(DEPDIR)/sc_hypervisor.Plo -rm -f ./$(DEPDIR)/speed.Plo -rm -f ./$(DEPDIR)/task_pool.Plo -rm -f ./$(DEPDIR)/teft_lp_policy.Plo -rm -f ./$(DEPDIR)/throughput_lp_policy.Plo -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 -f ./$(DEPDIR)/app_driven_policy.Plo -rm -f ./$(DEPDIR)/dichotomy.Plo -rm -f ./$(DEPDIR)/feft_lp_policy.Plo -rm -f ./$(DEPDIR)/gflops_rate_policy.Plo -rm -f ./$(DEPDIR)/hard_coded_policy.Plo -rm -f ./$(DEPDIR)/idle_policy.Plo -rm -f ./$(DEPDIR)/ispeed_lp_policy.Plo -rm -f ./$(DEPDIR)/ispeed_policy.Plo -rm -f ./$(DEPDIR)/lp_programs.Plo -rm -f ./$(DEPDIR)/lp_tools.Plo -rm -f ./$(DEPDIR)/perf_count_policy.Plo -rm -f ./$(DEPDIR)/policy_tools.Plo -rm -f ./$(DEPDIR)/sc_config.Plo -rm -f ./$(DEPDIR)/sc_hypervisor.Plo -rm -f ./$(DEPDIR)/speed.Plo -rm -f ./$(DEPDIR)/task_pool.Plo -rm -f ./$(DEPDIR)/teft_lp_policy.Plo -rm -f ./$(DEPDIR)/throughput_lp_policy.Plo -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 am--depfiles 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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -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.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/000077500000000000000000000000001413463044200235515ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/app_driven_policy.c000066400000000000000000000023351413463044200274260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, .init_worker = NULL, .custom = 0, .name = "app_driven" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/feft_lp_policy.c000066400000000000000000000247041413463044200267220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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); 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 free(tw); 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; 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; 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, .init_worker = NULL, .custom = 0, .name = "feft_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/gflops_rate_policy.c000066400000000000000000000301131413463044200275770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, .init_worker = NULL, .custom = 0, .name = "gflops_rate" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/hard_coded_policy.c000066400000000000000000000077431413463044200273630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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(sched_ctxs, ns, tw->nw, w_in_s, NULL, nworkers, tw); free(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(sched_ctxs, ns, tw->nw, w_in_s, NULL, nworkers, tw); free(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, .init_worker = NULL, .custom = 0, .name = "hard_coded" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/idle_policy.c000066400000000000000000000033031413463044200262100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, .init_worker = NULL, .custom = 0, .name = "idle" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/ispeed_lp_policy.c000066400000000000000000000204741413463044200272470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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, .init_worker = NULL, .custom = 0, .name = "ispeed_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/ispeed_policy.c000066400000000000000000000143511413463044200265510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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, .init_worker = NULL, .custom = 0, .name = "ispeed" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/perf_count_policy.c000066400000000000000000000330551413463044200274460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 #include #include #include #include #include #include #include #include #include struct perf_event_attr pe_instr[STARPU_NMAXWORKERS]; /* struct perf_event_attr pe_cycles[STARPU_NMAXWORKERS]; */ /* struct perf_event_attr pe_cache_misses[STARPU_NMAXWORKERS]; */ /* struct perf_event_attr pe_cache_refs[STARPU_NMAXWORKERS]; */ /* struct perf_event_attr pe_branch_instr[STARPU_NMAXWORKERS]; */ struct perf_event_attr pe_fps[STARPU_NMAXWORKERS]; int fd_instr[STARPU_NMAXWORKERS]; /* int fd_cycles[STARPU_NMAXWORKERS]; */ /* int fd_cache_misses[STARPU_NMAXWORKERS]; */ /* int fd_cache_refs[STARPU_NMAXWORKERS]; */ /* int fd_branch_instr[STARPU_NMAXWORKERS]; */ int fd_fps[STARPU_NMAXWORKERS]; unsigned perf_event_opened[STARPU_NMAXWORKERS]; long long total_instr[STARPU_NMAX_SCHED_CTXS]; /* long long total_cycles[STARPU_NMAX_SCHED_CTXS]; */ /* long long total_time[STARPU_NMAX_SCHED_CTXS]; */ /* long long total_cache_misses[STARPU_NMAX_SCHED_CTXS]; */ /* long long total_cache_refs[STARPU_NMAX_SCHED_CTXS]; */ /* long long total_branch_instr[STARPU_NMAX_SCHED_CTXS]; */ long long total_fps[STARPU_NMAX_SCHED_CTXS]; struct read_format { uint64_t value; /* The value of the event */ uint64_t time_enabled; /* if PERF_FORMAT_TOTAL_TIME_ENABLED */ uint64_t time_running; /* if PERF_FORMAT_TOTAL_TIME_RUNNING */ uint64_t id; /* if PERF_FORMAT_ID */ }; static long perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags) { int ret = syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); return ret; } void print_results_for_worker(int workerid, unsigned sched_ctx, struct starpu_task *task) { ssize_t rread; long long instr, /*cycles, cache_misses, cache_refs, branch_instr,*/ fps; rread = read(fd_instr[workerid], &instr, sizeof(instr)); assert(rread == sizeof(instr)); /* read(fd_cycles[workerid], &cycles, sizeof(long long)); */ /* read(fd_cache_misses[workerid], &cache_misses, sizeof(long long)); */ /* read(fd_cache_refs[workerid], &cache_refs, sizeof(long long)); */ /* read(fd_branch_instr[workerid], &branch_instr, sizeof(long long)); */ rread = read(fd_fps[workerid], &fps, sizeof(long long)); assert(rread == sizeof(long long)); total_instr[sched_ctx] += instr; /* total_cycles[sched_ctx] += cycles; */ /* total_cache_misses[sched_ctx] += cache_misses; */ /* total_cache_refs[sched_ctx] += cache_refs; */ /* total_branch_instr[sched_ctx] += branch_instr; */ total_fps[sched_ctx] += fps; printf("Instrs %lf M instr of worker %lf M\n", (double)total_instr[sched_ctx]/1000000, (double)instr/1000000); printf("Fps %lf M curr fps %lf M \n", (double)total_fps[sched_ctx]/1000000, (double)fps/1000000); printf("Task Flops %lf k %s \n", task->flops/1000, (task->cl && task->cl->model) ? task->cl->model->symbol : "task null"); printf("-------------------------------------------\n"); } void print_results_for_ctx(unsigned sched_ctx, struct starpu_task *task) { long long curr_total_instr = 0; /* long long curr_total_cycles = 0; */ /* long long curr_total_cache_misses = 0; */ /* long long curr_total_cache_refs = 0; */ /* long long curr_total_branch_instr = 0; */ long long curr_total_fps = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); struct starpu_sched_ctx_iterator it; int workerid; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { ssize_t rread; workerid = workers->get_next(workers, &it); // Read event counter value struct read_format instr, /*cycles, cache_misses, cache_refs, branch_instr,*/ fps; rread = read(fd_instr[workerid], &instr, sizeof(struct read_format)); assert(rread==sizeof(struct read_format)); /* read(fd_cycles[workerid], &cycles, sizeof(long long)); */ /* read(fd_cache_misses[workerid], &cache_misses, sizeof(long long)); */ /* read(fd_cache_refs[workerid], &cache_refs, sizeof(long long)); */ /* read(fd_branch_instr[workerid], &branch_instr, sizeof(long long)); */ rread = read(fd_fps[workerid], &fps, sizeof(struct read_format)); assert(rread == sizeof(struct read_format)); curr_total_instr += (instr.time_enabled != 0 && instr.time_running !=0) ? instr.value * instr.time_enabled/instr.time_running : instr.value; printf("w%d instr time enabled %"PRIu64" time running %"PRIu64" \n", workerid, instr.time_enabled, instr.time_running); /* curr_total_cycles += cycles; */ /* curr_total_cache_misses += cache_misses; */ /* curr_total_cache_refs += cache_refs; */ /* curr_total_branch_instr += branch_instr; */ curr_total_fps += (fps.time_enabled != 0 && fps.time_running !=0) ? fps.value * fps.time_enabled/fps.time_running : fps.value; printf("w%d fps time enabled %lu time running %lu \n", workerid, fps.time_enabled, fps.time_running); } total_instr[sched_ctx] += curr_total_instr; /* total_cycles[sched_ctx] += curr_total_cycles; */ /* total_cache_misses[sched_ctx] += curr_total_cache_misses; */ /* total_cache_refs[sched_ctx] += curr_total_cache_refs; */ /* total_branch_instr[sched_ctx] += curr_total_branch_instr; */ total_fps[sched_ctx] += curr_total_fps; printf("%u: Instrs %lf k curr instr %lf k\n", sched_ctx, (double)total_instr[sched_ctx]/1000, (double)curr_total_instr/1000); printf("%u: Fps %lf k curr fps %lf k\n", sched_ctx, (double)total_fps[sched_ctx]/1000, (double)curr_total_fps/1000); printf("%u: Task Flops %lf k %s \n", sched_ctx, task->flops/1000, (task->cl && task->cl->model) ? task->cl->model->symbol : "task null"); printf("-------------------------------------------\n"); } void config_event(struct perf_event_attr *event, unsigned with_time, uint64_t event_type, uint64_t config_type) { memset(event, 0, sizeof(struct perf_event_attr)); event->type = event_type; event->size = sizeof(struct perf_event_attr); event->config = config_type; event->disabled = 1; // Event is initially disabled event->exclude_kernel = 1; // excluding events that happen in the kernel space if(with_time) { /* if the PMU is multiplexing several events we measure the time spent to actually measure this event (time_running) and compare it to the one expected is did, thus we compute the precision of the counter*/ event->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING; } } void open_event(int *file_desc, struct perf_event_attr *event, int group_fd) { *file_desc = perf_event_open(event, 0, -1, group_fd, 0); if (*file_desc == -1) { fprintf(stderr, "Error opening leader %llx\n", event->config); perror("perf_event_open"); exit(0); } } void config_all_events_for_worker(int workerid) { config_event(&pe_instr[workerid], 1, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); /* config_event(&pe_cycles[workerid], 0, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); */ /* config_event(&pe_cache_misses[workerid], 0, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); */ /* config_event(&pe_cache_refs[workerid], 0, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); */ /* config_event(&pe_branch_instr[workerid], 0, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); */ config_event(&pe_fps[workerid], 1, PERF_TYPE_RAW, 0x1010); } void open_all_events_for_worker(int curr_workerid) { open_event(&fd_instr[curr_workerid], &pe_instr[curr_workerid], -1); /* open_event(&fd_cycles[curr_workerid], &pe_cycles[curr_workerid], fd_instr[curr_workerid]); */ /* open_event(&fd_cache_misses[curr_workerid], &pe_cache_misses[curr_workerid], fd_instr[curr_workerid]); */ /* open_event(&fd_cache_refs[curr_workerid], &pe_cache_refs[curr_workerid], fd_instr[curr_workerid]); */ /* open_event(&fd_branch_instr[curr_workerid], &pe_branch_instr[curr_workerid], fd_instr[curr_workerid]); */ open_event(&fd_fps[curr_workerid], &pe_fps[curr_workerid], fd_instr[curr_workerid]); } void close_all_events_for_worker(int curr_workerid) { close(fd_instr[curr_workerid]); /* close(fd_cycles[curr_workerid]); */ /* close(fd_cache_misses[curr_workerid]); */ /* close(fd_cache_refs[curr_workerid]); */ /* close(fd_branch_instr[curr_workerid]); */ close(fd_fps[curr_workerid]); } void start_monitoring_all_events_for_worker(int workerid) { ioctl(fd_instr[workerid], PERF_EVENT_IOC_RESET, 0); ioctl(fd_instr[workerid], PERF_EVENT_IOC_ENABLE, 0); /* ioctl(fd_cycles[workerid], PERF_EVENT_IOC_RESET, 0); */ /* ioctl(fd_cycles[workerid], PERF_EVENT_IOC_ENABLE, 0); */ /* ioctl(fd_cache_misses[workerid], PERF_EVENT_IOC_RESET, 0); */ /* ioctl(fd_cache_misses[workerid], PERF_EVENT_IOC_ENABLE, 0); */ /* ioctl(fd_cache_refs[workerid], PERF_EVENT_IOC_RESET, 0); */ /* ioctl(fd_cache_refs[workerid], PERF_EVENT_IOC_ENABLE, 0); */ /* ioctl(fd_branch_instr[workerid], PERF_EVENT_IOC_RESET, 0); */ /* ioctl(fd_branch_instr[workerid], PERF_EVENT_IOC_ENABLE, 0); */ ioctl(fd_fps[workerid], PERF_EVENT_IOC_RESET, 0); ioctl(fd_fps[workerid], PERF_EVENT_IOC_ENABLE, 0); } void stop_monitoring_all_events_for_worker(int workerid) { ioctl(fd_instr[workerid], PERF_EVENT_IOC_DISABLE, 0); /* ioctl(fd_cycles[workerid], PERF_EVENT_IOC_DISABLE, 0); */ /* ioctl(fd_cache_misses[workerid], PERF_EVENT_IOC_DISABLE, 0); */ /* ioctl(fd_cache_refs[workerid], PERF_EVENT_IOC_DISABLE, 0); */ /* ioctl(fd_branch_instr[workerid], PERF_EVENT_IOC_DISABLE, 0); */ ioctl(fd_fps[workerid], PERF_EVENT_IOC_DISABLE, 0); } void perf_count_handle_idle_end(unsigned sched_ctx, int worker) { unsigned has_starpu_scheduler; unsigned has_awake_workers; has_starpu_scheduler = starpu_sched_ctx_has_starpu_scheduler(sched_ctx, &has_awake_workers); if(!has_starpu_scheduler && !has_awake_workers) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); 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(perf_event_opened[workerid]) start_monitoring_all_events_for_worker(workerid); } } else { if(!perf_event_opened[worker]) { config_all_events_for_worker(worker); open_all_events_for_worker(worker); perf_event_opened[worker] = 1; } start_monitoring_all_events_for_worker(worker); } } void perf_count_handle_poped_task(unsigned sched_ctx, int worker, struct starpu_task *task, __attribute__((unused))uint32_t footprint) { unsigned has_starpu_scheduler; unsigned has_awake_workers; has_starpu_scheduler = starpu_sched_ctx_has_starpu_scheduler(sched_ctx, &has_awake_workers); if(!has_starpu_scheduler && !has_awake_workers) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); 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(perf_event_opened[workerid]) stop_monitoring_all_events_for_worker(workerid); } // printf("worker requesting %d in ctx %d \n", starpu_worker_get_id(), sched_ctx); print_results_for_ctx(sched_ctx, task); } else { if(perf_event_opened[worker]) stop_monitoring_all_events_for_worker(worker); print_results_for_worker(worker, sched_ctx, task); } } void perf_count_init_worker(int workerid, unsigned sched_ctx) { if(!perf_event_opened[workerid]) { open_all_events_for_worker(workerid); perf_event_opened[workerid] = 1; } else { close_all_events_for_worker(workerid); open_all_events_for_worker(workerid); } } void perf_count_start_ctx(unsigned sched_ctx) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); 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); config_all_events_for_worker(workerid); } } void perf_count_end_ctx(unsigned sched_ctx) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); 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); close_all_events_for_worker(workerid); } } struct sc_hypervisor_policy perf_count_policy = { .size_ctxs = NULL, .handle_poped_task = perf_count_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = perf_count_handle_idle_end, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = perf_count_end_ctx, .start_ctx = perf_count_start_ctx, .init_worker = perf_count_init_worker, .custom = 0, .name = "perf_count" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/teft_lp_policy.c000066400000000000000000000242051413463044200267340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); free(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); free(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) { 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) { 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, .init_worker = NULL, .custom = 0, .name = "teft_lp" }; starpu-1.3.9+dfsg/sc_hypervisor/src/hypervisor_policies/throughput_lp_policy.c000066400000000000000000000230101413463044200301740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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, .init_worker = NULL, .custom = 0, .name = "throughput_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.3.9+dfsg/sc_hypervisor/src/policies_utils/000077500000000000000000000000001413463044200224775ustar00rootroot00000000000000starpu-1.3.9+dfsg/sc_hypervisor/src/policies_utils/dichotomy.c000066400000000000000000000075471413463044200246570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/sc_hypervisor/src/policies_utils/lp_programs.c000066400000000000000000000452641413463044200252030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/sc_hypervisor/src/policies_utils/lp_tools.c000066400000000000000000000616051413463044200245060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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("%u: 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 %u: 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 %u 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 %u 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.3.9+dfsg/sc_hypervisor/src/policies_utils/policy_tools.c000066400000000000000000000450701413463044200253700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/sc_hypervisor/src/policies_utils/speed.c000066400000000000000000000264521413463044200237540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; } free(sched_ctxs); 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); free(sched_ctxs_child); } 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); } } free(sched_ctxs); } starpu-1.3.9+dfsg/sc_hypervisor/src/policies_utils/task_pool.c000066400000000000000000000054061413463044200246430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/sc_hypervisor/src/sc_config.c000066400000000000000000000155021413463044200215510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; } } 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]); } va_end(varg_list); } starpu-1.3.9+dfsg/sc_hypervisor/src/sc_hypervisor.c000066400000000000000000001611161413463044200225210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 sc_hypervisor hypervisor; starpu_pthread_mutex_t act_hypervisor_mutex; 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; extern struct sc_hypervisor_policy perf_count_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, &perf_count_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; hypervisor.policy.start_ctx = policy->start_ctx; hypervisor.policy.init_worker = policy->init_worker; } 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) { if(hypervisor.policy.start_ctx) hypervisor.policy.start_ctx(sched_ctx); 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); 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; 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; STARPU_PTHREAD_MUTEX_UNLOCK(&hypervisor.sched_ctx_w[sched_ctx].mutex); if(_sc_hypervisor_use_lazy_resize()) _ack_resize_completed(sched_ctx, worker); 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); *sched_ctxs = NULL; } 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; } void sc_hypervisor_init_worker(int workerid, unsigned sched_ctx) { if(hypervisor.policy.init_worker) hypervisor.policy.init_worker(workerid, sched_ctx); } starpu-1.3.9+dfsg/sc_hypervisor/src/sc_hypervisor_intern.h000066400000000000000000000067321413463044200241070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; }; extern 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.3.9+dfsg/socl/000077500000000000000000000000001413463044200147225ustar00rootroot00000000000000starpu-1.3.9+dfsg/socl/Makefile.am000066400000000000000000000016651413463044200167660ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 SUBDIRS = src examples EXTRA_DIST = README SOCL_vendorsdir = @datarootdir@/starpu/opencl/vendors dist_SOCL_vendors_DATA = @SOCL_VENDORS@ recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET starpu-1.3.9+dfsg/socl/Makefile.in000066400000000000000000000744771413463044200170120ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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 distdir-am 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)/starpu.mk 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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ all: all-recursive .SUFFIXES: $(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/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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): 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || 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.3.9+dfsg/socl/README000066400000000000000000000002451413463044200156030ustar00rootroot00000000000000StarPU's OpenCL interface ========================= This directory contains an OpenCL implementation that can be used as a replacement of the classic StarPU's API. starpu-1.3.9+dfsg/socl/examples/000077500000000000000000000000001413463044200165405ustar00rootroot00000000000000starpu-1.3.9+dfsg/socl/examples/Makefile.am000066400000000000000000000052271413463044200206020ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 noinst_PROGRAMS = check_PROGRAMS = $(SOCL_EXAMPLES) if !STARPU_HAVE_WINDOWS ## test loader program LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ -I$(top_srcdir)/src/ LOADER_BIN = $(abs_top_builddir)/socl/examples/$(LOADER) loader_SOURCES = ../../tests/loader.c noinst_PROGRAMS += loader 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 STARPU_HAVE_X11 #mandelbrot_mandelbrot_CPPFLAGS += $(X_CFLAGS) #mandelbrot_mandelbrot_LDADD = $(X_PRE_LIBS) $(X_LIBS) -lX11 $(X_EXTRA_LIBS) #endif starpu-1.3.9+dfsg/socl/examples/Makefile.in000066400000000000000000001717061413463044200206210ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_1) noinst_PROGRAMS = $(am__EXEEXT_2) check_PROGRAMS = $(am__EXEEXT_1) @STARPU_HAVE_WINDOWS_FALSE@am__append_1 = loader 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = basic/basic$(EXEEXT) testmap/testmap$(EXEEXT) \ clinfo/clinfo$(EXEEXT) matmul/matmul$(EXEEXT) \ mansched/mansched$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_2 = loader$(EXEEXT) PROGRAMS = $(examplebin_PROGRAMS) $(noinst_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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/basic.Po ./$(DEPDIR)/clinfo.Po \ ./$(DEPDIR)/loader-loader.Po ./$(DEPDIR)/mansched.Po \ ./$(DEPDIR)/matmul.Po ./$(DEPDIR)/testmap.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(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/ -I$(top_srcdir)/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mansched.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matmul.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testmap.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/basic.Po -rm -f ./$(DEPDIR)/clinfo.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/mansched.Po -rm -f ./$(DEPDIR)/matmul.Po -rm -f ./$(DEPDIR)/testmap.Po -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 -f ./$(DEPDIR)/basic.Po -rm -f ./$(DEPDIR)/clinfo.Po -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/mansched.Po -rm -f ./$(DEPDIR)/matmul.Po -rm -f ./$(DEPDIR)/testmap.Po -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 am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK #mandelbrot_mandelbrot_CPPFLAGS = $(AM_CPPFLAGS) $(AM_CFLAGS) #if STARPU_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.3.9+dfsg/socl/examples/basic/000077500000000000000000000000001413463044200176215ustar00rootroot00000000000000starpu-1.3.9+dfsg/socl/examples/basic/basic.c000066400000000000000000000167331413463044200210600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 %lf is greater than epsilon %lf \n", error, epsilon); } #endif return result; } int main(int argc, const char** argv) { 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; } } #endif /* STARPU_NON_BLOCKING_DRIVERS */ starpu-1.3.9+dfsg/socl/examples/testmap/000077500000000000000000000000001413463044200202155ustar00rootroot00000000000000starpu-1.3.9+dfsg/socl/examples/testmap/testmap.c000066400000000000000000000171051413463044200220420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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"); 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.3.9+dfsg/socl/src/CL/cl_d3d10.h000066400000000000000000000113651413463044200174570ustar00rootroot00000000000000/********************************************************************************** * 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.3.9+dfsg/socl/src/CL/cl_d3d11.h000066400000000000000000000113571413463044200174610ustar00rootroot00000000000000/********************************************************************************** * 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.3.9+dfsg/socl/src/CL/cl_dx9_media_sharing.h000066400000000000000000000120371413463044200222170ustar00rootroot00000000000000/********************************************************************************** * 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.3.9+dfsg/socl/src/CL/cl_ext.h000066400000000000000000000233341413463044200174430ustar00rootroot00000000000000/******************************************************************************* * 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.3.9+dfsg/socl/src/CL/cl_gl.h000066400000000000000000000164371413463044200172530ustar00rootroot00000000000000/********************************************************************************** * 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.3.9+dfsg/socl/src/CL/cl_gl_ext.h000066400000000000000000000051031413463044200201170ustar00rootroot00000000000000/********************************************************************************** * 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.3.9+dfsg/socl/src/CL/cl_platform.h000066400000000000000000001124241413463044200204660ustar00rootroot00000000000000/********************************************************************************** * 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.3.9+dfsg/socl/src/CL/opencl.h000066400000000000000000000033161413463044200174430ustar00rootroot00000000000000/******************************************************************************* * 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.3.9+dfsg/socl/src/Makefile.am000066400000000000000000000074431413463044200175550ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-notests.mk CLEANFILES = *.gcno *.gcda AM_CFLAGS = $(GLOBAL_AM_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) $(FXT_CFLAGS) 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_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(STARPU_OPENCL_LDFLAGS) $(FXT_LDFLAGS) 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_LIBADD = $(AM_LIBADD) 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.3.9+dfsg/socl/src/Makefile.in000066400000000000000000001540001413463044200175560ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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 = am__DEPENDENCIES_2 = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) libsocl_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(am__DEPENDENCIES_2) 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cl_buildprogram.Plo \ ./$(DEPDIR)/cl_createbuffer.Plo \ ./$(DEPDIR)/cl_createcommandqueue.Plo \ ./$(DEPDIR)/cl_createcontext.Plo \ ./$(DEPDIR)/cl_createcontextfromtype.Plo \ ./$(DEPDIR)/cl_createimage2d.Plo \ ./$(DEPDIR)/cl_createimage3d.Plo \ ./$(DEPDIR)/cl_createkernel.Plo \ ./$(DEPDIR)/cl_createkernelsinprogram.Plo \ ./$(DEPDIR)/cl_createprogramwithbinary.Plo \ ./$(DEPDIR)/cl_createprogramwithsource.Plo \ ./$(DEPDIR)/cl_createsampler.Plo \ ./$(DEPDIR)/cl_enqueuebarrier.Plo \ ./$(DEPDIR)/cl_enqueuebarrierwithwaitlist.Plo \ ./$(DEPDIR)/cl_enqueuecopybuffer.Plo \ ./$(DEPDIR)/cl_enqueuecopybuffertoimage.Plo \ ./$(DEPDIR)/cl_enqueuecopyimage.Plo \ ./$(DEPDIR)/cl_enqueuecopyimagetobuffer.Plo \ ./$(DEPDIR)/cl_enqueuemapbuffer.Plo \ ./$(DEPDIR)/cl_enqueuemapimage.Plo \ ./$(DEPDIR)/cl_enqueuemarker.Plo \ ./$(DEPDIR)/cl_enqueuemarkerwithwaitlist.Plo \ ./$(DEPDIR)/cl_enqueuenativekernel.Plo \ ./$(DEPDIR)/cl_enqueuendrangekernel.Plo \ ./$(DEPDIR)/cl_enqueuereadbuffer.Plo \ ./$(DEPDIR)/cl_enqueuereadimage.Plo \ ./$(DEPDIR)/cl_enqueuetask.Plo \ ./$(DEPDIR)/cl_enqueueunmapmemobject.Plo \ ./$(DEPDIR)/cl_enqueuewaitforevents.Plo \ ./$(DEPDIR)/cl_enqueuewritebuffer.Plo \ ./$(DEPDIR)/cl_enqueuewriteimage.Plo ./$(DEPDIR)/cl_finish.Plo \ ./$(DEPDIR)/cl_flush.Plo \ ./$(DEPDIR)/cl_getcommandqueueinfo.Plo \ ./$(DEPDIR)/cl_getcontextinfo.Plo \ ./$(DEPDIR)/cl_getdeviceids.Plo \ ./$(DEPDIR)/cl_getdeviceinfo.Plo \ ./$(DEPDIR)/cl_geteventinfo.Plo \ ./$(DEPDIR)/cl_geteventprofilinginfo.Plo \ ./$(DEPDIR)/cl_getextensionfunctionaddress.Plo \ ./$(DEPDIR)/cl_getimageinfo.Plo \ ./$(DEPDIR)/cl_getkernelinfo.Plo \ ./$(DEPDIR)/cl_getkernelworkgroupinfo.Plo \ ./$(DEPDIR)/cl_getmemobjectinfo.Plo \ ./$(DEPDIR)/cl_getplatformids.Plo \ ./$(DEPDIR)/cl_getplatforminfo.Plo \ ./$(DEPDIR)/cl_getprogrambuildinfo.Plo \ ./$(DEPDIR)/cl_getprograminfo.Plo \ ./$(DEPDIR)/cl_getsamplerinfo.Plo \ ./$(DEPDIR)/cl_getsupportedimageformats.Plo \ ./$(DEPDIR)/cl_icdgetplatformidskhr.Plo \ ./$(DEPDIR)/cl_releasecommandqueue.Plo \ ./$(DEPDIR)/cl_releasecontext.Plo \ ./$(DEPDIR)/cl_releaseevent.Plo \ ./$(DEPDIR)/cl_releasekernel.Plo \ ./$(DEPDIR)/cl_releasememobject.Plo \ ./$(DEPDIR)/cl_releaseprogram.Plo \ ./$(DEPDIR)/cl_releasesampler.Plo \ ./$(DEPDIR)/cl_retaincommandqueue.Plo \ ./$(DEPDIR)/cl_retaincontext.Plo \ ./$(DEPDIR)/cl_retainevent.Plo ./$(DEPDIR)/cl_retainkernel.Plo \ ./$(DEPDIR)/cl_retainmemobject.Plo \ ./$(DEPDIR)/cl_retainprogram.Plo \ ./$(DEPDIR)/cl_retainsampler.Plo \ ./$(DEPDIR)/cl_setcommandqueueproperty.Plo \ ./$(DEPDIR)/cl_setkernelarg.Plo \ ./$(DEPDIR)/cl_unloadcompiler.Plo \ ./$(DEPDIR)/cl_waitforevents.Plo ./$(DEPDIR)/command.Plo \ ./$(DEPDIR)/command_list.Plo ./$(DEPDIR)/command_queue.Plo \ ./$(DEPDIR)/debug.Plo ./$(DEPDIR)/event.Plo ./$(DEPDIR)/gc.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/mem_objects.Plo \ ./$(DEPDIR)/socl.Plo ./$(DEPDIR)/task.Plo ./$(DEPDIR)/util.Plo 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 distdir-am 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-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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) $(FXT_CFLAGS) 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_LIBADD = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(STARPU_OPENCL_LDFLAGS) $(FXT_LDFLAGS) 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_LIBADD = $(AM_LIBADD) 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-notests.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createbuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createcommandqueue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createcontext.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createcontextfromtype.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createimage2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createimage3d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createkernel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createkernelsinprogram.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createprogramwithbinary.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createprogramwithsource.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_createsampler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuebarrier.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuebarrierwithwaitlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopybuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopybuffertoimage.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopyimage.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuecopyimagetobuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemapbuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemapimage.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemarker.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuemarkerwithwaitlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuenativekernel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuendrangekernel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuereadbuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuereadimage.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuetask.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueueunmapmemobject.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuewaitforevents.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuewritebuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_enqueuewriteimage.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_finish.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_flush.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getcommandqueueinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getcontextinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getdeviceids.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getdeviceinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_geteventinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_geteventprofilinginfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getextensionfunctionaddress.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getimageinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getkernelinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getkernelworkgroupinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getmemobjectinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getplatformids.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getplatforminfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getprogrambuildinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getprograminfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getsamplerinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_getsupportedimageformats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_icdgetplatformidskhr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasecommandqueue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasecontext.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releaseevent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasekernel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasememobject.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releaseprogram.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_releasesampler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retaincommandqueue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retaincontext.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainevent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainkernel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainmemobject.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainprogram.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_retainsampler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_setcommandqueueproperty.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_setkernelarg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_unloadcompiler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cl_waitforevents.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_list.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command_queue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem_objects.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/cl_buildprogram.Plo -rm -f ./$(DEPDIR)/cl_createbuffer.Plo -rm -f ./$(DEPDIR)/cl_createcommandqueue.Plo -rm -f ./$(DEPDIR)/cl_createcontext.Plo -rm -f ./$(DEPDIR)/cl_createcontextfromtype.Plo -rm -f ./$(DEPDIR)/cl_createimage2d.Plo -rm -f ./$(DEPDIR)/cl_createimage3d.Plo -rm -f ./$(DEPDIR)/cl_createkernel.Plo -rm -f ./$(DEPDIR)/cl_createkernelsinprogram.Plo -rm -f ./$(DEPDIR)/cl_createprogramwithbinary.Plo -rm -f ./$(DEPDIR)/cl_createprogramwithsource.Plo -rm -f ./$(DEPDIR)/cl_createsampler.Plo -rm -f ./$(DEPDIR)/cl_enqueuebarrier.Plo -rm -f ./$(DEPDIR)/cl_enqueuebarrierwithwaitlist.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopybuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopybuffertoimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopyimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopyimagetobuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuemapbuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuemapimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuemarker.Plo -rm -f ./$(DEPDIR)/cl_enqueuemarkerwithwaitlist.Plo -rm -f ./$(DEPDIR)/cl_enqueuenativekernel.Plo -rm -f ./$(DEPDIR)/cl_enqueuendrangekernel.Plo -rm -f ./$(DEPDIR)/cl_enqueuereadbuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuereadimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuetask.Plo -rm -f ./$(DEPDIR)/cl_enqueueunmapmemobject.Plo -rm -f ./$(DEPDIR)/cl_enqueuewaitforevents.Plo -rm -f ./$(DEPDIR)/cl_enqueuewritebuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuewriteimage.Plo -rm -f ./$(DEPDIR)/cl_finish.Plo -rm -f ./$(DEPDIR)/cl_flush.Plo -rm -f ./$(DEPDIR)/cl_getcommandqueueinfo.Plo -rm -f ./$(DEPDIR)/cl_getcontextinfo.Plo -rm -f ./$(DEPDIR)/cl_getdeviceids.Plo -rm -f ./$(DEPDIR)/cl_getdeviceinfo.Plo -rm -f ./$(DEPDIR)/cl_geteventinfo.Plo -rm -f ./$(DEPDIR)/cl_geteventprofilinginfo.Plo -rm -f ./$(DEPDIR)/cl_getextensionfunctionaddress.Plo -rm -f ./$(DEPDIR)/cl_getimageinfo.Plo -rm -f ./$(DEPDIR)/cl_getkernelinfo.Plo -rm -f ./$(DEPDIR)/cl_getkernelworkgroupinfo.Plo -rm -f ./$(DEPDIR)/cl_getmemobjectinfo.Plo -rm -f ./$(DEPDIR)/cl_getplatformids.Plo -rm -f ./$(DEPDIR)/cl_getplatforminfo.Plo -rm -f ./$(DEPDIR)/cl_getprogrambuildinfo.Plo -rm -f ./$(DEPDIR)/cl_getprograminfo.Plo -rm -f ./$(DEPDIR)/cl_getsamplerinfo.Plo -rm -f ./$(DEPDIR)/cl_getsupportedimageformats.Plo -rm -f ./$(DEPDIR)/cl_icdgetplatformidskhr.Plo -rm -f ./$(DEPDIR)/cl_releasecommandqueue.Plo -rm -f ./$(DEPDIR)/cl_releasecontext.Plo -rm -f ./$(DEPDIR)/cl_releaseevent.Plo -rm -f ./$(DEPDIR)/cl_releasekernel.Plo -rm -f ./$(DEPDIR)/cl_releasememobject.Plo -rm -f ./$(DEPDIR)/cl_releaseprogram.Plo -rm -f ./$(DEPDIR)/cl_releasesampler.Plo -rm -f ./$(DEPDIR)/cl_retaincommandqueue.Plo -rm -f ./$(DEPDIR)/cl_retaincontext.Plo -rm -f ./$(DEPDIR)/cl_retainevent.Plo -rm -f ./$(DEPDIR)/cl_retainkernel.Plo -rm -f ./$(DEPDIR)/cl_retainmemobject.Plo -rm -f ./$(DEPDIR)/cl_retainprogram.Plo -rm -f ./$(DEPDIR)/cl_retainsampler.Plo -rm -f ./$(DEPDIR)/cl_setcommandqueueproperty.Plo -rm -f ./$(DEPDIR)/cl_setkernelarg.Plo -rm -f ./$(DEPDIR)/cl_unloadcompiler.Plo -rm -f ./$(DEPDIR)/cl_waitforevents.Plo -rm -f ./$(DEPDIR)/command.Plo -rm -f ./$(DEPDIR)/command_list.Plo -rm -f ./$(DEPDIR)/command_queue.Plo -rm -f ./$(DEPDIR)/debug.Plo -rm -f ./$(DEPDIR)/event.Plo -rm -f ./$(DEPDIR)/gc.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/mem_objects.Plo -rm -f ./$(DEPDIR)/socl.Plo -rm -f ./$(DEPDIR)/task.Plo -rm -f ./$(DEPDIR)/util.Plo -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 -f ./$(DEPDIR)/cl_buildprogram.Plo -rm -f ./$(DEPDIR)/cl_createbuffer.Plo -rm -f ./$(DEPDIR)/cl_createcommandqueue.Plo -rm -f ./$(DEPDIR)/cl_createcontext.Plo -rm -f ./$(DEPDIR)/cl_createcontextfromtype.Plo -rm -f ./$(DEPDIR)/cl_createimage2d.Plo -rm -f ./$(DEPDIR)/cl_createimage3d.Plo -rm -f ./$(DEPDIR)/cl_createkernel.Plo -rm -f ./$(DEPDIR)/cl_createkernelsinprogram.Plo -rm -f ./$(DEPDIR)/cl_createprogramwithbinary.Plo -rm -f ./$(DEPDIR)/cl_createprogramwithsource.Plo -rm -f ./$(DEPDIR)/cl_createsampler.Plo -rm -f ./$(DEPDIR)/cl_enqueuebarrier.Plo -rm -f ./$(DEPDIR)/cl_enqueuebarrierwithwaitlist.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopybuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopybuffertoimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopyimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuecopyimagetobuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuemapbuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuemapimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuemarker.Plo -rm -f ./$(DEPDIR)/cl_enqueuemarkerwithwaitlist.Plo -rm -f ./$(DEPDIR)/cl_enqueuenativekernel.Plo -rm -f ./$(DEPDIR)/cl_enqueuendrangekernel.Plo -rm -f ./$(DEPDIR)/cl_enqueuereadbuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuereadimage.Plo -rm -f ./$(DEPDIR)/cl_enqueuetask.Plo -rm -f ./$(DEPDIR)/cl_enqueueunmapmemobject.Plo -rm -f ./$(DEPDIR)/cl_enqueuewaitforevents.Plo -rm -f ./$(DEPDIR)/cl_enqueuewritebuffer.Plo -rm -f ./$(DEPDIR)/cl_enqueuewriteimage.Plo -rm -f ./$(DEPDIR)/cl_finish.Plo -rm -f ./$(DEPDIR)/cl_flush.Plo -rm -f ./$(DEPDIR)/cl_getcommandqueueinfo.Plo -rm -f ./$(DEPDIR)/cl_getcontextinfo.Plo -rm -f ./$(DEPDIR)/cl_getdeviceids.Plo -rm -f ./$(DEPDIR)/cl_getdeviceinfo.Plo -rm -f ./$(DEPDIR)/cl_geteventinfo.Plo -rm -f ./$(DEPDIR)/cl_geteventprofilinginfo.Plo -rm -f ./$(DEPDIR)/cl_getextensionfunctionaddress.Plo -rm -f ./$(DEPDIR)/cl_getimageinfo.Plo -rm -f ./$(DEPDIR)/cl_getkernelinfo.Plo -rm -f ./$(DEPDIR)/cl_getkernelworkgroupinfo.Plo -rm -f ./$(DEPDIR)/cl_getmemobjectinfo.Plo -rm -f ./$(DEPDIR)/cl_getplatformids.Plo -rm -f ./$(DEPDIR)/cl_getplatforminfo.Plo -rm -f ./$(DEPDIR)/cl_getprogrambuildinfo.Plo -rm -f ./$(DEPDIR)/cl_getprograminfo.Plo -rm -f ./$(DEPDIR)/cl_getsamplerinfo.Plo -rm -f ./$(DEPDIR)/cl_getsupportedimageformats.Plo -rm -f ./$(DEPDIR)/cl_icdgetplatformidskhr.Plo -rm -f ./$(DEPDIR)/cl_releasecommandqueue.Plo -rm -f ./$(DEPDIR)/cl_releasecontext.Plo -rm -f ./$(DEPDIR)/cl_releaseevent.Plo -rm -f ./$(DEPDIR)/cl_releasekernel.Plo -rm -f ./$(DEPDIR)/cl_releasememobject.Plo -rm -f ./$(DEPDIR)/cl_releaseprogram.Plo -rm -f ./$(DEPDIR)/cl_releasesampler.Plo -rm -f ./$(DEPDIR)/cl_retaincommandqueue.Plo -rm -f ./$(DEPDIR)/cl_retaincontext.Plo -rm -f ./$(DEPDIR)/cl_retainevent.Plo -rm -f ./$(DEPDIR)/cl_retainkernel.Plo -rm -f ./$(DEPDIR)/cl_retainmemobject.Plo -rm -f ./$(DEPDIR)/cl_retainprogram.Plo -rm -f ./$(DEPDIR)/cl_retainsampler.Plo -rm -f ./$(DEPDIR)/cl_setcommandqueueproperty.Plo -rm -f ./$(DEPDIR)/cl_setkernelarg.Plo -rm -f ./$(DEPDIR)/cl_unloadcompiler.Plo -rm -f ./$(DEPDIR)/cl_waitforevents.Plo -rm -f ./$(DEPDIR)/command.Plo -rm -f ./$(DEPDIR)/command_list.Plo -rm -f ./$(DEPDIR)/command_queue.Plo -rm -f ./$(DEPDIR)/debug.Plo -rm -f ./$(DEPDIR)/event.Plo -rm -f ./$(DEPDIR)/gc.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/mem_objects.Plo -rm -f ./$(DEPDIR)/socl.Plo -rm -f ./$(DEPDIR)/task.Plo -rm -f ./$(DEPDIR)/util.Plo -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 \ am--depfiles 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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -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.3.9+dfsg/socl/src/cl_buildprogram.c000066400000000000000000000072411413463044200210260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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]; snprintf(opts, sizeof(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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_createbuffer.c000066400000000000000000000100751413463044200207730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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_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 = malloc(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.3.9+dfsg/socl/src/cl_createcommandqueue.c000066400000000000000000000044531413463044200222100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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_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.3.9+dfsg/socl/src/cl_createcontext.c000066400000000000000000000073751413463044200212170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_createcontextfromtype.c000066400000000000000000000027351413463044200230000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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_SUFFIX__VERSION_1_0 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) { if (socl_init_starpu() < 0) return NULL; //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.3.9+dfsg/socl/src/cl_createimage2d.c000066400000000000000000000023301413463044200210250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.3.9+dfsg/socl/src/cl_createimage3d.c000066400000000000000000000025001413463044200210250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.3.9+dfsg/socl/src/cl_createkernel.c000066400000000000000000000125341413463044200210040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 %u 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_kernel CL_API_CALL soclCreateKernel(cl_program program, const char * kernel_name, cl_int * errcode_ret) { 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.3.9+dfsg/socl/src/cl_createkernelsinprogram.c000066400000000000000000000017371413463044200231110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { //TODO return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_createprogramwithbinary.c000066400000000000000000000023771413463044200233000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { //TODO if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.3.9+dfsg/socl/src/cl_createprogramwithsource.c000066400000000000000000000077451413463044200233200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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_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; free(p->cl_programs); 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.3.9+dfsg/socl/src/cl_createsampler.c000066400000000000000000000021041413463044200211570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.3.9+dfsg/socl/src/cl_enqueuebarrier.c000066400000000000000000000020701413463044200213500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclEnqueueBarrier(cl_command_queue cq) { 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.3.9+dfsg/socl/src/cl_enqueuebarrierwithwaitlist.c000066400000000000000000000021341413463044200240260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_2 CL_API_ENTRY cl_int CL_API_CALL soclEnqueueBarrierWithWaitList(cl_command_queue cq, cl_uint num_events, const cl_event * events, cl_event * event) { 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.3.9+dfsg/socl/src/cl_enqueuecopybuffer.c000066400000000000000000000066121413463044200220740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_enqueuecopybuffertoimage.c000066400000000000000000000023251413463044200234370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_enqueuecopyimage.c000066400000000000000000000023461413463044200217050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_enqueuecopyimagetobuffer.c000066400000000000000000000023251413463044200234370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_enqueuemapbuffer.c000066400000000000000000000041051413463044200216720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_enqueuemapimage.c000066400000000000000000000025711413463044200215100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { if (errcode_ret != NULL) *errcode_ret = CL_INVALID_OPERATION; return NULL; } starpu-1.3.9+dfsg/socl/src/cl_enqueuemarker.c000066400000000000000000000023211413463044200212020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclEnqueueMarker(cl_command_queue cq, cl_event * event) { 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.3.9+dfsg/socl/src/cl_enqueuemarkerwithwaitlist.c000066400000000000000000000022641413463044200236650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_2 CL_API_ENTRY cl_int CL_API_CALL soclEnqueueMarkerWithWaitList(cl_command_queue cq, cl_uint num_events, const cl_event * events, cl_event * event) { 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.3.9+dfsg/socl/src/cl_enqueuenativekernel.c000066400000000000000000000023501413463044200224120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_enqueuendrangekernel.c000066400000000000000000000152141413463044200225450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_1 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) { 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.3.9+dfsg/socl/src/cl_enqueuereadbuffer.c000066400000000000000000000072321413463044200220340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_enqueuereadimage.c000066400000000000000000000024731413463044200216470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_enqueuetask.c000066400000000000000000000021431413463044200206650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_enqueueunmapmemobject.c000066400000000000000000000027531413463044200227400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_enqueuewaitforevents.c000066400000000000000000000017501413463044200226260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclEnqueueWaitForEvents(cl_command_queue cq, cl_uint num_events, const cl_event * events) { command_marker cmd = command_marker_create(); command_queue_enqueue(cq, cmd, num_events, events); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_enqueuewritebuffer.c000066400000000000000000000106651413463044200222570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_enqueuewriteimage.c000066400000000000000000000025101413463044200220560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_finish.c000066400000000000000000000017701413463044200176200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclFinish(cl_command_queue cq) { 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.3.9+dfsg/socl/src/cl_flush.c000066400000000000000000000015101413463044200174510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclFlush(cl_command_queue UNUSED(command_queue)) { return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_getcommandqueueinfo.c000066400000000000000000000024671413463044200224030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getcontextinfo.c000066400000000000000000000026061413463044200213770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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_context_properties)); default: return CL_INVALID_VALUE; } return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_getdeviceids.c000066400000000000000000000051051413463044200207730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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_SUFFIX__VERSION_1_0 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) { if (socl_init_starpu() < 0) { *num_devices = 0; return CL_SUCCESS; } 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.3.9+dfsg/socl/src/cl_getdeviceinfo.c000066400000000000000000000030631413463044200211500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { //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.3.9+dfsg/socl/src/cl_geteventinfo.c000066400000000000000000000026071413463044200210350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_geteventprofilinginfo.c000066400000000000000000000025641413463044200227510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getextensionfunctionaddress.c000066400000000000000000000027571413463044200241760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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_SUFFIX__VERSION_1_0 CL_API_ENTRY void * CL_API_CALL soclGetExtensionFunctionAddress(const char * func_name) { 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.3.9+dfsg/socl/src/cl_getimageinfo.c000066400000000000000000000020271413463044200207720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_getkernelinfo.c000066400000000000000000000026221413463044200211710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getkernelworkgroupinfo.c000066400000000000000000000024731413463044200231550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getmemobjectinfo.c000066400000000000000000000026321413463044200216570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getplatformids.c000066400000000000000000000024741413463044200213660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclGetPlatformIDs(cl_uint num_entries, cl_platform_id * platforms, cl_uint * num_platforms) { 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.3.9+dfsg/socl/src/cl_getplatforminfo.c000066400000000000000000000032321413463044200215330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getprogrambuildinfo.c000066400000000000000000000026001413463044200223740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getprograminfo.c000066400000000000000000000031131413463044200213540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_getsamplerinfo.c000066400000000000000000000020531413463044200213520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_getsupportedimageformats.c000066400000000000000000000021361413463044200234610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_icdgetplatformidskhr.c000066400000000000000000000023171413463044200225470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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_EXT_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclIcdGetPlatformIDsKHR(cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms) { 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.3.9+dfsg/socl/src/cl_releasecommandqueue.c000066400000000000000000000015341413463044200223620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseCommandQueue(cl_command_queue cq) { gc_entity_release(cq); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_releasecontext.c000066400000000000000000000016171413463044200213650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseContext(cl_context context) { if (context == NULL) return CL_INVALID_CONTEXT; gc_entity_release(context); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_releaseevent.c000066400000000000000000000016031413463044200210150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseEvent(cl_event event) { if (event == NULL) return CL_INVALID_EVENT; gc_entity_release(event); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_releasekernel.c000066400000000000000000000016111413463044200211530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseKernel(cl_kernel kernel) { if (kernel == NULL) return CL_INVALID_KERNEL; gc_entity_release(kernel); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_releasememobject.c000066400000000000000000000015211413463044200216400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseMemObject(cl_mem mem) { gc_entity_release(mem); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_releaseprogram.c000066400000000000000000000016171413463044200213500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseProgram(cl_program program) { if (program == NULL) return CL_INVALID_PROGRAM; gc_entity_release(program); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_releasesampler.c000066400000000000000000000015171413463044200213430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclReleaseSampler(cl_sampler UNUSED(sampler)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_retaincommandqueue.c000066400000000000000000000016211413463044200222210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainCommandQueue(cl_command_queue cq) { if (cq == NULL) return CL_INVALID_COMMAND_QUEUE; gc_entity_retain(cq); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_retaincontext.c000066400000000000000000000016171413463044200212270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainContext(cl_context context) { if (context == NULL) return CL_INVALID_CONTEXT; gc_entity_retain(context); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_retainevent.c000066400000000000000000000016011413463044200206550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainEvent(cl_event event) { if (event == NULL) return CL_INVALID_EVENT; gc_entity_retain(event); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_retainkernel.c000066400000000000000000000016121413463044200210160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainKernel(cl_kernel kernel) { if (kernel == NULL) return CL_INVALID_KERNEL; gc_entity_retain(kernel); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_retainmemobject.c000066400000000000000000000016021413463044200215020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainMemObject(cl_mem mem) { if (mem == NULL) return CL_INVALID_MEM_OBJECT; gc_entity_retain(mem); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_retainprogram.c000066400000000000000000000016151413463044200212100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainProgram(cl_program program) { if (program == NULL) return CL_INVALID_PROGRAM; gc_entity_retain(program); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_retainsampler.c000066400000000000000000000015161413463044200212040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclRetainSampler(cl_sampler UNUSED(sampler)) { return CL_INVALID_OPERATION; } starpu-1.3.9+dfsg/socl/src/cl_setcommandqueueproperty.c000066400000000000000000000034301413463044200233370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 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) { 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.3.9+dfsg/socl/src/cl_setkernelarg.c000066400000000000000000000057771413463044200210410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void * arg_value) { 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 %u: 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.3.9+dfsg/socl/src/cl_unloadcompiler.c000066400000000000000000000014571413463044200213570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclUnloadCompiler(void) { return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/cl_waitforevents.c000066400000000000000000000022641413463044200212370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_SUFFIX__VERSION_1_0 CL_API_ENTRY cl_int CL_API_CALL soclWaitForEvents(cl_uint num_events, const cl_event * event_list) { unsigned int i; #ifdef DEBUG DEBUG_MSG("Waiting for events: "); for (i=0; iid, i == (num_events-1) ? "" : ", "); } DEBUG_MSG_NOHEAD("\n"); #endif for (i=0; iid); DEBUG_MSG("Stop waiting :)\n"); return CL_SUCCESS; } starpu-1.3.9+dfsg/socl/src/command.c000066400000000000000000000232601413463044200172760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/command.h000066400000000000000000000133111413463044200172770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/command_list.c000066400000000000000000000025641413463044200203350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/command_list.h000066400000000000000000000017121413463044200203340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/command_queue.c000066400000000000000000000060121413463044200204760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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.3.9+dfsg/socl/src/command_queue.h000066400000000000000000000022321413463044200205030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/debug.c000066400000000000000000000051771413463044200167550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/debug.h000066400000000000000000000034721413463044200167560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/event.c000066400000000000000000000032631413463044200170020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/event.h000066400000000000000000000017521413463044200170100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/gc.c000066400000000000000000000107631413463044200162550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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.3.9+dfsg/socl/src/gc.h000066400000000000000000000030701413463044200162530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/getinfo.h000066400000000000000000000036021413463044200173160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/init.c000066400000000000000000000070411413463044200166220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 "../src/core/workers.h" #include "socl.h" #include "gc.h" #include "mem_objects.h" int _starpu_init_failed; static enum initialization _socl_init = UNINITIALIZED; static starpu_pthread_mutex_t _socl_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t _socl_cond = STARPU_PTHREAD_COND_INITIALIZER; static pthread_t _socl_thread_init; static struct starpu_conf conf; int socl_init_starpu(void) { STARPU_PTHREAD_MUTEX_LOCK(&_socl_mutex); if (_socl_init == INITIALIZED) { STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); return 0; } if (_socl_init == CHANGING) { /* Avoid recursion when starpu_init calls hwloc initialization which uses its opencl plugin */ if (pthread_equal(_socl_thread_init, pthread_self())) { STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); return -1; } /* Somebody else is initializing already, wait for him */ while (_socl_init != INITIALIZED) STARPU_PTHREAD_COND_WAIT(&_socl_cond, &_socl_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); return 0; } _socl_init = CHANGING; _socl_thread_init = pthread_self(); STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; 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_PTHREAD_MUTEX_LOCK(&_socl_mutex); _socl_init = INITIALIZED; STARPU_PTHREAD_COND_BROADCAST(&_socl_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&_socl_mutex); return 0; } /** * 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( _socl_init ) starpu_task_wait_for_all(); gc_stop(); if( _socl_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( _socl_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.3.9+dfsg/socl/src/init.h000066400000000000000000000017041413463044200166270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 */ int socl_init_starpu(void); void soclShutdown(void); #endif /* SOCL_INIT_H */ starpu-1.3.9+dfsg/socl/src/mem_objects.c000066400000000000000000000042141413463044200201450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/socl/src/mem_objects.h000066400000000000000000000016241413463044200201540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/ocl_icd.h000066400000000000000000001016541413463044200172650ustar00rootroot00000000000000/** 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.3.9+dfsg/socl/src/socl.c000066400000000000000000000117131413463044200166200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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.3.9+dfsg/socl/src/socl.h000066400000000000000000000640551413463044200166340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/task.c000066400000000000000000000101331413463044200166150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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->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.3.9+dfsg/socl/src/task.h000066400000000000000000000037401413463044200166300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/socl/src/util.c000066400000000000000000000032151413463044200166330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 and not the internal src/ header which contains the # static inline definition dist-hook: failed=0 ; \ look=""; \ for i in $$( $(GREP) "static inline" $$(find $(srcdir) -name \*.h) | $(SED) -e 's/.*static inline //g' | $(GREP) -v ENAME\#\# | $(SED) -e 's/[^(]* \(\|\*\)\([^ (]*\)(.*/\2/' | $(GREP) -v _starpu_spin_init) ; do \ if [ -z "$$look" ] ; then \ look="$$i" ; \ else \ look="$$look\|$$i" ; \ fi ; \ done ; \ echo "$$look" ; \ for j in $(shell find . -name \*.o) ; do \ nm $$j | $(GREP) -e "U \($$look\)$$" && { echo $$j ; failed=1 ; } ; \ done ; \ [ $$failed == 0 ] nm -n .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.so | grep -v " [Ua-z] " | grep -ve " _\?_\?_\?f\?starpu" | grep -ve " \(_init\|_fini\|_edata\|__bss_start\|_end\)" | (! grep .) starpu-1.3.9+dfsg/src/Makefile.in000066400000000000000000013741751413463044200166400ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. # 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/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_HAVE_HDF5_TRUE@am__append_4 = core/disk_ops/disk_hdf5.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_LINUX_SYS_TRUE@am__append_9 = core/disk_ops/disk_unistd_o_direct.c @STARPU_HAVE_HWLOC_TRUE@am__append_10 = \ @STARPU_HAVE_HWLOC_TRUE@ sched_policies/scheduler_maker.c \ @STARPU_HAVE_HWLOC_TRUE@ sched_policies/hierarchical_heft.c @STARPU_HAVE_HWLOC_TRUE@@STARPU_HAVE_OPENMP_TRUE@@STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE@am__append_11 = util/starpu_clusters_create.c ######################################### # # # Generic MP compilation # # # ######################################### @STARPU_USE_MP_TRUE@am__append_12 = 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_13 = 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 ######################################### # # # MPI Master/Slave compilation # # # ######################################### @STARPU_USE_MPI_MASTER_SLAVE_TRUE@am__append_14 = drivers/mpi/driver_mpi_common.c \ @STARPU_USE_MPI_MASTER_SLAVE_TRUE@ drivers/mpi/driver_mpi_source.c \ @STARPU_USE_MPI_MASTER_SLAVE_TRUE@ drivers/mpi/driver_mpi_sink.c subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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)" "$(DESTDIR)$(xmldir)" 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/rbtree.c common/graph.c common/inlines.c core/jobs.c \ core/task.c core/task_bundle.c core/tree.c core/drivers.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/idle_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/perfmodel/multiple_regression.c core/sched_policy.c \ core/simgrid.c core/simgrid_cpp.cpp 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/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/heteroprio.c sched_policies/graph_test_policy.c \ drivers/driver_common/driver_common.c \ drivers/disk/driver_disk.c datawizard/node_ops.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 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_prio.c \ sched_policies/component_eager_calibration.c \ sched_policies/component_mct.c sched_policies/component_heft.c \ sched_policies/component_heteroprio.c \ sched_policies/component_best_implementation.c \ sched_policies/component_perfmodel_select.c \ sched_policies/component_composed.c \ sched_policies/component_work_stealing.c \ sched_policies/component_stage.c \ sched_policies/component_userchoice.c \ sched_policies/modular_eager.c \ sched_policies/modular_eager_prio.c \ sched_policies/modular_eager_prefetching.c \ sched_policies/modular_gemm.c sched_policies/modular_prio.c \ sched_policies/modular_prio_prefetching.c \ sched_policies/modular_random.c \ sched_policies/modular_parallel_random.c \ sched_policies/modular_random_prefetching.c \ sched_policies/modular_parallel_heft.c \ sched_policies/modular_heft.c \ sched_policies/modular_heft_prio.c \ sched_policies/modular_heteroprio.c \ sched_policies/modular_heteroprio_heft.c \ sched_policies/modular_heft2.c sched_policies/modular_ws.c \ sched_policies/modular_ez.c core/disk_ops/disk_leveldb.cpp \ core/disk_ops/disk_hdf5.c 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 \ core/disk_ops/disk_unistd_o_direct.c \ sched_policies/scheduler_maker.c \ sched_policies/hierarchical_heft.c \ util/starpu_clusters_create.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 drivers/mpi/driver_mpi_common.c \ drivers/mpi/driver_mpi_source.c drivers/mpi/driver_mpi_sink.c @STARPU_HAVE_LEVELDB_TRUE@am__objects_1 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.lo @STARPU_HAVE_HDF5_TRUE@am__objects_2 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.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_LINUX_SYS_TRUE@am__objects_7 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.lo @STARPU_HAVE_HWLOC_TRUE@am__objects_8 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.lo \ @STARPU_HAVE_HWLOC_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.lo @STARPU_HAVE_HWLOC_TRUE@@STARPU_HAVE_OPENMP_TRUE@@STARPU_HWLOC_HAVE_TOPOLOGY_DUP_TRUE@am__objects_9 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.lo @STARPU_USE_MP_TRUE@am__objects_10 = 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_11 = 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 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@am__objects_12 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.lo \ @STARPU_USE_MPI_MASTER_SLAVE_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.lo \ @STARPU_USE_MPI_MASTER_SLAVE_TRUE@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.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-rbtree.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.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-drivers.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-idle_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-multiple_regression.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.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-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-heteroprio.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-node_ops.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-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_prio.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_heteroprio.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-component_work_stealing.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.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_parallel_random.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.lo \ $(am__objects_1) $(am__objects_2) \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo \ $(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) \ $(am__objects_11) $(am__objects_12) 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo \ ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo 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 DATA = $(xml_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 \ distdir distdir-am 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-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 core/perfmodel/starpu-perfmodel.dtd xml_DATA = $(srcdir)/core/perfmodel/starpu-perfmodel.dtd xmldir = $(pkgdatadir) 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/idle_hook.h \ core/sched_policy.h \ core/sched_ctx.h \ core/sched_ctx_list.h \ core/perfmodel/perfmodel.h \ core/perfmodel/regression.h \ core/perfmodel/multiple_regression.h \ core/jobs.h \ core/task.h \ core/drivers.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/node_ops.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/rbtree.h \ common/rbtree_i.h \ common/prio_list.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/mpi/driver_mpi_common.h \ drivers/mpi/driver_mpi_source.h \ drivers/mpi/driver_mpi_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_clusters_create.h \ util/starpu_task_insert_utils.h \ util/starpu_data_cpy.h \ starpu_parameters.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/rbtree.c \ common/graph.c common/inlines.c core/jobs.c core/task.c \ core/task_bundle.c core/tree.c core/drivers.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/idle_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/perfmodel/multiple_regression.c core/sched_policy.c \ core/simgrid.c core/simgrid_cpp.cpp 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/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/heteroprio.c sched_policies/graph_test_policy.c \ drivers/driver_common/driver_common.c \ drivers/disk/driver_disk.c datawizard/node_ops.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 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_prio.c \ sched_policies/component_eager_calibration.c \ sched_policies/component_mct.c sched_policies/component_heft.c \ sched_policies/component_heteroprio.c \ sched_policies/component_best_implementation.c \ sched_policies/component_perfmodel_select.c \ sched_policies/component_composed.c \ sched_policies/component_work_stealing.c \ sched_policies/component_stage.c \ sched_policies/component_userchoice.c \ sched_policies/modular_eager.c \ sched_policies/modular_eager_prio.c \ sched_policies/modular_eager_prefetching.c \ sched_policies/modular_gemm.c sched_policies/modular_prio.c \ sched_policies/modular_prio_prefetching.c \ sched_policies/modular_random.c \ sched_policies/modular_parallel_random.c \ sched_policies/modular_random_prefetching.c \ sched_policies/modular_parallel_heft.c \ sched_policies/modular_heft.c \ sched_policies/modular_heft_prio.c \ sched_policies/modular_heteroprio.c \ sched_policies/modular_heteroprio_heft.c \ sched_policies/modular_heft2.c sched_policies/modular_ws.c \ sched_policies/modular_ez.c $(am__append_3) $(am__append_4) \ drivers/cpu/driver_cpu.c $(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) \ $(am__append_13) $(am__append_14) all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-notests.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.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}; \ } 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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-rbtree.lo: common/rbtree.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-rbtree.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.lo `test -f 'common/rbtree.c' || echo '$(srcdir)/'`common/rbtree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/rbtree.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.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-rbtree.lo `test -f 'common/rbtree.c' || echo '$(srcdir)/'`common/rbtree.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-inlines.lo: common/inlines.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-inlines.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.lo `test -f 'common/inlines.c' || echo '$(srcdir)/'`common/inlines.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/inlines.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.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-inlines.lo `test -f 'common/inlines.c' || echo '$(srcdir)/'`common/inlines.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-drivers.lo: core/drivers.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-drivers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.lo `test -f 'core/drivers.c' || echo '$(srcdir)/'`core/drivers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/drivers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.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-drivers.lo `test -f 'core/drivers.c' || echo '$(srcdir)/'`core/drivers.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-idle_hook.lo: core/idle_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-idle_hook.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.lo `test -f 'core/idle_hook.c' || echo '$(srcdir)/'`core/idle_hook.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/idle_hook.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_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-idle_hook.lo `test -f 'core/idle_hook.c' || echo '$(srcdir)/'`core/idle_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-multiple_regression.lo: core/perfmodel/multiple_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-multiple_regression.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.lo `test -f 'core/perfmodel/multiple_regression.c' || echo '$(srcdir)/'`core/perfmodel/multiple_regression.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/multiple_regression.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_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-multiple_regression.lo `test -f 'core/perfmodel/multiple_regression.c' || echo '$(srcdir)/'`core/perfmodel/multiple_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-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-heteroprio.lo: sched_policies/heteroprio.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-heteroprio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.lo `test -f 'sched_policies/heteroprio.c' || echo '$(srcdir)/'`sched_policies/heteroprio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/heteroprio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.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-heteroprio.lo `test -f 'sched_policies/heteroprio.c' || echo '$(srcdir)/'`sched_policies/heteroprio.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-node_ops.lo: datawizard/node_ops.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-node_ops.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.lo `test -f 'datawizard/node_ops.c' || echo '$(srcdir)/'`datawizard/node_ops.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/node_ops.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.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-node_ops.lo `test -f 'datawizard/node_ops.c' || echo '$(srcdir)/'`datawizard/node_ops.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-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_prio.lo: sched_policies/component_eager_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_eager_prio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.lo `test -f 'sched_policies/component_eager_prio.c' || echo '$(srcdir)/'`sched_policies/component_eager_prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_eager_prio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_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_eager_prio.lo `test -f 'sched_policies/component_eager_prio.c' || echo '$(srcdir)/'`sched_policies/component_eager_prio.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_heteroprio.lo: sched_policies/component_heteroprio.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_heteroprio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.lo `test -f 'sched_policies/component_heteroprio.c' || echo '$(srcdir)/'`sched_policies/component_heteroprio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_heteroprio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.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_heteroprio.lo `test -f 'sched_policies/component_heteroprio.c' || echo '$(srcdir)/'`sched_policies/component_heteroprio.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-component_work_stealing.lo: sched_policies/component_work_stealing.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_work_stealing.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.lo `test -f 'sched_policies/component_work_stealing.c' || echo '$(srcdir)/'`sched_policies/component_work_stealing.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_work_stealing.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.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_work_stealing.lo `test -f 'sched_policies/component_work_stealing.c' || echo '$(srcdir)/'`sched_policies/component_work_stealing.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.lo: sched_policies/component_stage.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_stage.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.lo `test -f 'sched_policies/component_stage.c' || echo '$(srcdir)/'`sched_policies/component_stage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_stage.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.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_stage.lo `test -f 'sched_policies/component_stage.c' || echo '$(srcdir)/'`sched_policies/component_stage.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.lo: sched_policies/component_userchoice.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_userchoice.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.lo `test -f 'sched_policies/component_userchoice.c' || echo '$(srcdir)/'`sched_policies/component_userchoice.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/component_userchoice.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.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_userchoice.lo `test -f 'sched_policies/component_userchoice.c' || echo '$(srcdir)/'`sched_policies/component_userchoice.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_prio.lo: sched_policies/modular_eager_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_eager_prio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.lo `test -f 'sched_policies/modular_eager_prio.c' || echo '$(srcdir)/'`sched_policies/modular_eager_prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_eager_prio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_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_eager_prio.lo `test -f 'sched_policies/modular_eager_prio.c' || echo '$(srcdir)/'`sched_policies/modular_eager_prio.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_gemm.lo: sched_policies/modular_gemm.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_gemm.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.lo `test -f 'sched_policies/modular_gemm.c' || echo '$(srcdir)/'`sched_policies/modular_gemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_gemm.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.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_gemm.lo `test -f 'sched_policies/modular_gemm.c' || echo '$(srcdir)/'`sched_policies/modular_gemm.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_parallel_random.lo: sched_policies/modular_parallel_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_parallel_random.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.lo `test -f 'sched_policies/modular_parallel_random.c' || echo '$(srcdir)/'`sched_policies/modular_parallel_random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_parallel_random.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_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_parallel_random.lo `test -f 'sched_policies/modular_parallel_random.c' || echo '$(srcdir)/'`sched_policies/modular_parallel_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_parallel_heft.lo: sched_policies/modular_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-modular_parallel_heft.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.lo `test -f 'sched_policies/modular_parallel_heft.c' || echo '$(srcdir)/'`sched_policies/modular_parallel_heft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_parallel_heft.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_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-modular_parallel_heft.lo `test -f 'sched_policies/modular_parallel_heft.c' || echo '$(srcdir)/'`sched_policies/modular_parallel_heft.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_heteroprio.lo: sched_policies/modular_heteroprio.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_heteroprio.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.lo `test -f 'sched_policies/modular_heteroprio.c' || echo '$(srcdir)/'`sched_policies/modular_heteroprio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_heteroprio.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.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_heteroprio.lo `test -f 'sched_policies/modular_heteroprio.c' || echo '$(srcdir)/'`sched_policies/modular_heteroprio.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.lo: sched_policies/modular_heteroprio_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_heteroprio_heft.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.lo `test -f 'sched_policies/modular_heteroprio_heft.c' || echo '$(srcdir)/'`sched_policies/modular_heteroprio_heft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_heteroprio_heft.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_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_heteroprio_heft.lo `test -f 'sched_policies/modular_heteroprio_heft.c' || echo '$(srcdir)/'`sched_policies/modular_heteroprio_heft.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-modular_ws.lo: sched_policies/modular_ws.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_ws.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.lo `test -f 'sched_policies/modular_ws.c' || echo '$(srcdir)/'`sched_policies/modular_ws.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_ws.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.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_ws.lo `test -f 'sched_policies/modular_ws.c' || echo '$(srcdir)/'`sched_policies/modular_ws.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.lo: sched_policies/modular_ez.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_ez.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.lo `test -f 'sched_policies/modular_ez.c' || echo '$(srcdir)/'`sched_policies/modular_ez.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/modular_ez.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.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_ez.lo `test -f 'sched_policies/modular_ez.c' || echo '$(srcdir)/'`sched_policies/modular_ez.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.lo: core/disk_ops/disk_hdf5.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_hdf5.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.lo `test -f 'core/disk_ops/disk_hdf5.c' || echo '$(srcdir)/'`core/disk_ops/disk_hdf5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/disk_ops/disk_hdf5.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.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_hdf5.lo `test -f 'core/disk_ops/disk_hdf5.c' || echo '$(srcdir)/'`core/disk_ops/disk_hdf5.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-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-scheduler_maker.lo: sched_policies/scheduler_maker.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-scheduler_maker.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.lo `test -f 'sched_policies/scheduler_maker.c' || echo '$(srcdir)/'`sched_policies/scheduler_maker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/scheduler_maker.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.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-scheduler_maker.lo `test -f 'sched_policies/scheduler_maker.c' || echo '$(srcdir)/'`sched_policies/scheduler_maker.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.lo: sched_policies/hierarchical_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-hierarchical_heft.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.lo `test -f 'sched_policies/hierarchical_heft.c' || echo '$(srcdir)/'`sched_policies/hierarchical_heft.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/hierarchical_heft.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_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-hierarchical_heft.lo `test -f 'sched_policies/hierarchical_heft.c' || echo '$(srcdir)/'`sched_policies/hierarchical_heft.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.lo: util/starpu_clusters_create.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_clusters_create.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.lo `test -f 'util/starpu_clusters_create.c' || echo '$(srcdir)/'`util/starpu_clusters_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_clusters_create.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.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_clusters_create.lo `test -f 'util/starpu_clusters_create.c' || echo '$(srcdir)/'`util/starpu_clusters_create.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 libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.lo: drivers/mpi/driver_mpi_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_mpi_common.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.lo `test -f 'drivers/mpi/driver_mpi_common.c' || echo '$(srcdir)/'`drivers/mpi/driver_mpi_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mpi/driver_mpi_common.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_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_mpi_common.lo `test -f 'drivers/mpi/driver_mpi_common.c' || echo '$(srcdir)/'`drivers/mpi/driver_mpi_common.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.lo: drivers/mpi/driver_mpi_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_mpi_source.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.lo `test -f 'drivers/mpi/driver_mpi_source.c' || echo '$(srcdir)/'`drivers/mpi/driver_mpi_source.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mpi/driver_mpi_source.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_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_mpi_source.lo `test -f 'drivers/mpi/driver_mpi_source.c' || echo '$(srcdir)/'`drivers/mpi/driver_mpi_source.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.lo: drivers/mpi/driver_mpi_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_mpi_sink.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.lo `test -f 'drivers/mpi/driver_mpi_sink.c' || echo '$(srcdir)/'`drivers/mpi/driver_mpi_sink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drivers/mpi/driver_mpi_sink.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_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_mpi_sink.lo `test -f 'drivers/mpi/driver_mpi_sink.c' || echo '$(srcdir)/'`drivers/mpi/driver_mpi_sink.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-simgrid_cpp.lo: core/simgrid_cpp.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-simgrid_cpp.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.lo `test -f 'core/simgrid_cpp.cpp' || echo '$(srcdir)/'`core/simgrid_cpp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='core/simgrid_cpp.cpp' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.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-simgrid_cpp.lo `test -f 'core/simgrid_cpp.cpp' || echo '$(srcdir)/'`core/simgrid_cpp.cpp 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 install-xmlDATA: $(xml_DATA) @$(NORMAL_INSTALL) @list='$(xml_DATA)'; test -n "$(xmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xmldir)" || 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)$(xmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xmldir)" || exit $$?; \ done uninstall-xmlDATA: @$(NORMAL_UNINSTALL) @list='$(xml_DATA)'; test -n "$(xmldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xmldir)'; $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 @STARPU_HAVE_MS_LIB_FALSE@all-local: @STARPU_HAVE_WINDOWS_FALSE@all-local: all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(xmldir)"; 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 -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo -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-xmlDATA 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 -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-anim.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_best_implementation.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_composed.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_calibration.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_eager_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_fifo.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_heteroprio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_mct.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_perfmodel_select.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_random.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_sched.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_stage.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_userchoice.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_work_stealing.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-component_worker.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_arbiter_concurrency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_hdf5.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_leveldb.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_stdio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_global.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-disk_unistd_o_direct.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_disk.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_sink.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_source.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mic_utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_sink.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_mpi_source.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-drivers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fstarpu.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-graph_test_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-helper_mct.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-heteroprio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hierarchical_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-idle_hook.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-inlines.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prefetching.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_eager_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ez.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_gemm.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft2.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heft_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_heteroprio_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_parallel_random.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_prio_prefetching.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_random_prefetching.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-modular_ws.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-mp_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiple_regression.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-node_ops.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_environment.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-openmp_runtime_support_omp_api.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-prio_deque.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rbtree.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-scheduler_maker.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid_cpp.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sink_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-source_common.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_clusters_create.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cusparse.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_task_insert_utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tree.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_tree.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo -rm -f ./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo -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 uninstall-xmlDATA .MAKE: $(am__recursive_targets) install-am install-exec-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ am--depfiles check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am dist-hook 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 install-xmlDATA \ 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 uninstall-xmlDATA .PRECIOUS: Makefile # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -cat /dev/null @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) ######################################### # If some external references appear (U), it means the corresponding .c file has # only included and not the internal src/ header which contains the # static inline definition dist-hook: failed=0 ; \ look=""; \ for i in $$( $(GREP) "static inline" $$(find $(srcdir) -name \*.h) | $(SED) -e 's/.*static inline //g' | $(GREP) -v ENAME\#\# | $(SED) -e 's/[^(]* \(\|\*\)\([^ (]*\)(.*/\2/' | $(GREP) -v _starpu_spin_init) ; do \ if [ -z "$$look" ] ; then \ look="$$i" ; \ else \ look="$$look\|$$i" ; \ fi ; \ done ; \ echo "$$look" ; \ for j in $(shell find . -name \*.o) ; do \ nm $$j | $(GREP) -e "U \($$look\)$$" && { echo $$j ; failed=1 ; } ; \ done ; \ [ $$failed == 0 ] nm -n .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.so | grep -v " [Ua-z] " | grep -ve " _\?_\?_\?f\?starpu" | grep -ve " \(_init\|_fini\|_edata\|__bss_start\|_end\)" | (! grep .) # 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.3.9+dfsg/src/common/000077500000000000000000000000001413463044200160415ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/common/barrier.c000066400000000000000000000050651413463044200176410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 _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.3.9+dfsg/src/common/barrier.h000066400000000000000000000023141413463044200176400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ 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.3.9+dfsg/src/common/barrier_counter.c000066400000000000000000000126161413463044200214000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/src/common/barrier_counter.h000066400000000000000000000042531413463044200214030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/common/bitmap.c000066400000000000000000000132111413463044200174570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 #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.3.9+dfsg/src/common/config-src-build.h.in000066400000000000000000000000561413463044200217470ustar00rootroot00000000000000#undef STARPU_SRC_DIR #undef STARPU_BUILD_DIR starpu-1.3.9+dfsg/src/common/config.h.in000066400000000000000000000645541413463044200201020ustar00rootroot00000000000000/* 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 if you have the header file. */ #undef HAVE_AYUDAME_H /* Define to 1 if you have the `cblas_sgemv' function. */ #undef HAVE_CBLAS_SGEMV /* 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 `copy_file_range' function. */ #undef HAVE_COPY_FILE_RANGE /* Define to 1 if you have the header file. */ #undef HAVE_CUDA_GL_INTEROP_H /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* 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_setup_flush_callback', and to 0 if you don't. */ #undef HAVE_DECL_FUT_SETUP_FLUSH_CALLBACK /* 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 `nvmlDeviceGetTotalEnergyConsumption', and to 0 if you don't. */ #undef HAVE_DECL_NVMLDEVICEGETTOTALENERGYCONSUMPTION /* 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_DLB_H /* 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_setup_flush_callback' function. */ #undef HAVE_FUT_SETUP_FLUSH_CALLBACK /* Define to 1 if you have the `fut_set_filename' function. */ #undef HAVE_FUT_SET_FILENAME /* Define to 1 if you have the `fxt_close' function. */ #undef HAVE_FXT_CLOSE /* 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 header file. */ #undef HAVE_HDF5_H /* Define to 1 if you have the `hwloc_cpukinds_get_nr' function. */ #undef HAVE_HWLOC_CPUKINDS_GET_NR /* Define to 1 if you have the header file. */ #undef HAVE_HWLOC_GLIBC_SCHED_H /* Define to 1 if you have the `hwloc_topology_dup' function. */ #undef HAVE_HWLOC_TOPOLOGY_DUP /* Define to 1 if you have the `hwloc_topology_set_components' function. */ #undef HAVE_HWLOC_TOPOLOGY_SET_COMPONENTS /* 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 `blas-openblas' library (-lblas-openblas). */ #undef HAVE_LIBBLAS_OPENBLAS /* Define to 1 if you have the `cblas' library (-lcblas). */ #undef HAVE_LIBCBLAS /* Define to 1 if you have the cusparse library */ #undef HAVE_LIBCUSPARSE /* Define to 1 if you have the `dlb' library (-ldlb). */ #undef HAVE_LIBDLB /* 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 `hdf5' library (-lhdf5). */ #undef HAVE_LIBHDF5 /* 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 `openblas' library (-lopenblas). */ #undef HAVE_LIBOPENBLAS /* 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 header file. */ #undef HAVE_MSG_MSG_H /* 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_self_name' function. */ #undef HAVE_MSG_PROCESS_SELF_NAME /* Define to 1 if you have the `MSG_process_userdata_init' function. */ #undef HAVE_MSG_PROCESS_USERDATA_INIT /* 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 `nvmlDeviceGetTotalEnergyConsumption' function. */ #undef HAVE_NVMLDEVICEGETTOTALENERGYCONSUMPTION /* piom_ltask_set_bound_thread_os_indexes is availabe */ #undef HAVE_PIOM_LTASK_SET_BOUND_THREAD_OS_INDEXES /* 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 `poti_user_NewEvent' function. */ #undef HAVE_POTI_USER_NEWEVENT /* 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 `scandir' function. */ #undef HAVE_SCANDIR /* Define to 1 if you have the `sg_actor_attach' function. */ #undef HAVE_SG_ACTOR_ATTACH /* Define to 1 if you have the `sg_actor_data' function. */ #undef HAVE_SG_ACTOR_DATA /* Define to 1 if you have the `sg_actor_execute' function. */ #undef HAVE_SG_ACTOR_EXECUTE /* Define to 1 if you have the `sg_actor_get_data' function. */ #undef HAVE_SG_ACTOR_GET_DATA /* Define to 1 if you have the `sg_actor_init' function. */ #undef HAVE_SG_ACTOR_INIT /* Define to 1 if you have the `sg_actor_on_exit' function. */ #undef HAVE_SG_ACTOR_ON_EXIT /* Define to 1 if you have the `sg_actor_ref' function. */ #undef HAVE_SG_ACTOR_REF /* Define to 1 if you have the `sg_actor_self' function. */ #undef HAVE_SG_ACTOR_SELF /* Define to 1 if you have the `sg_actor_self_execute' function. */ #undef HAVE_SG_ACTOR_SELF_EXECUTE /* Define to 1 if you have the `sg_actor_set_data' function. */ #undef HAVE_SG_ACTOR_SET_DATA /* Define to 1 if you have the `sg_actor_sleep_for' function. */ #undef HAVE_SG_ACTOR_SLEEP_FOR /* Define to 1 if you have the `sg_cfg_set_int' function. */ #undef HAVE_SG_CFG_SET_INT /* Define to 1 if you have the `sg_config_continue_after_help' function. */ #undef HAVE_SG_CONFIG_CONTINUE_AFTER_HELP /* Define to 1 if you have the `sg_host_get_properties' function. */ #undef HAVE_SG_HOST_GET_PROPERTIES /* Define to 1 if you have the `sg_host_get_route' function. */ #undef HAVE_SG_HOST_GET_ROUTE /* Define to 1 if you have the `sg_host_get_speed' function. */ #undef HAVE_SG_HOST_GET_SPEED /* Define to 1 if you have the `sg_host_list' function. */ #undef HAVE_SG_HOST_LIST /* Define to 1 if you have the `sg_host_route' function. */ #undef HAVE_SG_HOST_ROUTE /* Define to 1 if you have the `sg_host_self' function. */ #undef HAVE_SG_HOST_SELF /* Define to 1 if you have the `sg_host_sendto' function. */ #undef HAVE_SG_HOST_SENDTO /* Define to 1 if you have the `sg_host_send_to' function. */ #undef HAVE_SG_HOST_SEND_TO /* Define to 1 if you have the `sg_host_speed' function. */ #undef HAVE_SG_HOST_SPEED /* Define to 1 if you have the `sg_link_bandwidth_set' function. */ #undef HAVE_SG_LINK_BANDWIDTH_SET /* Define to 1 if you have the `sg_link_get_name' function. */ #undef HAVE_SG_LINK_GET_NAME /* Define to 1 if you have the `sg_link_name' function. */ #undef HAVE_SG_LINK_NAME /* Define to 1 if you have the `sg_link_set_bandwidth' function. */ #undef HAVE_SG_LINK_SET_BANDWIDTH /* Define to 1 if you have the `sg_zone_get_by_name' function. */ #undef HAVE_SG_ZONE_GET_BY_NAME /* Define to 1 if you have the `sg_zone_get_hosts' function. */ #undef HAVE_SG_ZONE_GET_HOSTS /* Define to 1 if you have the `simcall_process_create' function. */ #undef HAVE_SIMCALL_PROCESS_CREATE /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_ACTOR_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_BARRIER_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_COND_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_ENGINE_H /* Define to 1 if you have the `simgrid_get_clock' function. */ #undef HAVE_SIMGRID_GET_CLOCK /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_HOST_H /* Define to 1 if you have the `simgrid_init' function. */ #undef HAVE_SIMGRID_INIT /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_MSG_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_MUTEX_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_SEMAPHORE_H /* Define to 1 if you have the `simgrid_set_maestro' function. */ #undef HAVE_SIMGRID_SET_MAESTRO /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_SIMDAG_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_VERSION_H /* Define to 1 if you have the header file. */ #undef HAVE_SIMGRID_ZONE_H /* 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 `SMPI_thread_create' function. */ #undef HAVE_SMPI_THREAD_CREATE /* Define to 1 if the system has the type `smx_actor_t'. */ #undef HAVE_SMX_ACTOR_T /* 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 header file. */ #undef HAVE_XBT_BASE_H /* Define to 1 if you have the header file. */ #undef HAVE_XBT_CONFIG_H /* 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 where 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 /* display DLB resource management verbose debug messages */ #undef STARPURM_DLB_VERBOSE /* Define to 1 if dlb support is enabled. */ #undef STARPURM_HAVE_DLB /* Define to 1 if DLB callbacks expect an user argument */ #undef STARPURM_HAVE_DLB_CALLBACK_ARG /* Define to 1 if StarPU has support for worker callbacks. */ #undef STARPURM_STARPU_HAVE_WORKER_CALLBACKS /* display resource management verbose debug messages */ #undef STARPURM_VERBOSE /* use ARMPL library */ #undef STARPU_ARMPL /* use STARPU_ATLAS library */ #undef STARPU_ATLAS /* location of StarPU build directory */ #undef STARPU_BUILD_DIR /* use built-in min_dgels */ #undef STARPU_BUILT_IN_MIN_DGELS /* Define this to enable cluster support */ #undef STARPU_CLUSTER /* 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 MPI Master and MPI Slave devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY /* Define to 1 to disable asynchronous copy between CPU and OpenCL devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY /* 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 the target supports __atomic_compare_exchange_n */ #undef STARPU_HAVE_ATOMIC_COMPARE_EXCHANGE_N /* Define to 1 if the target supports __atomic_exchange_n */ #undef STARPU_HAVE_ATOMIC_EXCHANGE_N /* Define to 1 if the target supports __atomic_fetch_add */ #undef STARPU_HAVE_ATOMIC_FETCH_ADD /* Define to 1 if the target supports __atomic_fetch_or */ #undef STARPU_HAVE_ATOMIC_FETCH_OR /* Define to 1 if the target supports __atomic_test_and_set */ #undef STARPU_HAVE_ATOMIC_TEST_AND_SET /* The blas library is available */ #undef STARPU_HAVE_BLAS /* Define to 1 if CUDA device properties include BusID */ #undef STARPU_HAVE_BUSID /* The blas library has blas.h */ #undef STARPU_HAVE_CBLAS_H /* Peer transfers are supported in CUDA */ #undef STARPU_HAVE_CUDA_MEMCPY_PEER /* cufftDoubleComplex is available */ #undef STARPU_HAVE_CUFFTDOUBLECOMPLEX /* CURAND is available */ #undef STARPU_HAVE_CURAND /* compiler supports cxx11 */ #undef STARPU_HAVE_CXX11 /* 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_HDF5 /* 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 nvidia-ml library */ #undef STARPU_HAVE_LIBNVIDIA_ML /* 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 you have msg.h in msg/. */ #undef STARPU_HAVE_MSG_MSG_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 and it is meant to be used */ #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 actor.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_ACTOR_H /* Define to 1 if you have barrier.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_BARRIER_H /* Define to 1 if you have cond.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_COND_H /* Define to 1 if you have engine.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_ENGINE_H /* Define to 1 if you have host.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_HOST_H /* Define to 1 if you have msg.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_MSG_H /* Define to 1 if you have mutex.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_MUTEX_H /* Define to 1 if you have semaphore.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_SEMAPHORE_H /* Define to 1 if you have simdag.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_SIMDAG_H /* Define to 1 if you have version.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_VERSION_H /* Define to 1 if you have zone.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_ZONE_H /* Define to 1 if you have the smx_actor_t type. */ #undef STARPU_HAVE_SMX_ACTOR_T /* 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 base.h in xbt/. */ #undef STARPU_HAVE_XBT_BASE_H /* Define to 1 if you have config.h in xbt/. */ #undef STARPU_HAVE_XBT_CONFIG_H /* Define to 1 if you have synchro.h in xbt/. */ #undef STARPU_HAVE_XBT_SYNCHRO_H /* calibration heuristic value */ #undef STARPU_HISTORYMAXERROR /* 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 MPI devices */ #undef STARPU_MAXMPIDEVS /* maximum number of message-passing kernels */ #undef STARPU_MAXMPKERNELS /* maximum number of memory nodes */ #undef STARPU_MAXNODES /* maximum number of NUMA nodes */ #undef STARPU_MAXNUMANODES /* maximum number of OPENCL devices */ #undef STARPU_MAXOPENCLDEVS /* 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 /* use user defined library */ #undef STARPU_MLR_MODEL /* enable performance model debug */ #undef STARPU_MODEL_DEBUG /* display MPI verbose debug messages */ #undef STARPU_MPI_EXTRA_VERBOSE /* Use multiple threads to communicate with slaves */ #undef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD /* enable StarPU MPI pedantic isend */ #undef STARPU_MPI_PEDANTIC_ISEND /* 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 if you use the openblas library. */ #undef STARPU_OPENBLAS /* 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 `simgrid_init' function. */ #undef STARPU_SIMGRID_HAVE_SIMGRID_INIT /* Define to 1 if you have the `xbt_barrier_init' function. */ #undef STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT /* Define this to enable Model Checker in simgrid execution */ #undef STARPU_SIMGRID_MC /* check spinlock use */ #undef STARPU_SPINLOCK_CHECK /* location of StarPU sources */ #undef STARPU_SRC_DIR /* Only static compilation was made */ #undef STARPU_STATIC_ONLY /* 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 /* MPI Master Slave support is enabled */ #undef STARPU_USE_MPI_MASTER_SLAVE /* whether the StarPU MPI library (with a native MPI implementation) is available */ #undef STARPU_USE_MPI_MPI /* whether the StarPU MPI library (with a NewMadeleine implementation) is available */ #undef STARPU_USE_MPI_NMAD /* OpenCL support is activated */ #undef STARPU_USE_OPENCL /* enable sc_hypervisor lib */ #undef STARPU_USE_SC_HYPERVISOR /* Define to 1 to disable STARPU_SKIP_IF_VALGRIND when running tests. */ #undef STARPU_VALGRIND_FULL /* display verbose debug messages */ #undef STARPU_VERBOSE /* workers must call callbacks on sleep/wake-up */ #undef STARPU_WORKER_CALLBACKS /* 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 starpu-1.3.9+dfsg/src/common/fxt.c000066400000000000000000000210611413463044200170060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 need to identify each task to generate the DAG. */ unsigned long _starpu_job_cnt = 0; #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; int _starpu_fxt_willstart = 1; starpu_pthread_mutex_t _starpu_fxt_started_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; starpu_pthread_cond_t _starpu_fxt_started_cond = STARPU_PTHREAD_COND_INITIALIZER; /* and their submission order. */ unsigned long _starpu_submit_order = 0; 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 # ifdef HAVE_SG_ACTOR_SELF return (uintptr_t) sg_actor_self(); # else return (uintptr_t) MSG_process_self(); # endif #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) starpu_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[64]; char *fxt_suffix = starpu_getenv("STARPU_FXT_SUFFIX"); if (!fxt_suffix) { snprintf(suffix, sizeof(suffix), "prof_file_%s_%d", user, _starpu_id); } else { snprintf(suffix, sizeof(suffix), "%s_%d", fxt_suffix, _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); } int starpu_fxt_is_enabled() { return starpu_get_env_number_default("STARPU_FXT_TRACE", 1); } #ifdef HAVE_FUT_SETUP_FLUSH_CALLBACK void _starpu_fxt_flush_callback() { _STARPU_MSG("FxT is flushing trace to disk ! This can impact performance.\n"); _STARPU_MSG("Maybe you should increase the value of STARPU_TRACE_BUFFER_SIZE ?\n"); starpu_fxt_trace_user_event_string("fxt flush"); } #endif void _starpu_fxt_init_profiling(uint64_t trace_buffer_size) { unsigned threadid; STARPU_PTHREAD_MUTEX_LOCK(&_starpu_fxt_started_mutex); if (!(_starpu_fxt_willstart = starpu_fxt_is_enabled())) { STARPU_PTHREAD_COND_BROADCAST(&_starpu_fxt_started_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_fxt_started_mutex); return; } 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(); #ifdef HAVE_FUT_SETUP_FLUSH_CALLBACK if (fut_setup_flush_callback(trace_buffer_size / sizeof(unsigned long), initial_key_mask, threadid, &_starpu_fxt_flush_callback) < 0) #else if (fut_setup(trace_buffer_size / sizeof(unsigned long), initial_key_mask, threadid) < 0) #endif { 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_read_option(const char *option, struct starpu_fxt_options *options) { if (strcmp(option, "-c") == 0) { options->per_task_colour = 1; } else if (strcmp(option, "-no-events") == 0) { options->no_events = 1; } else if (strcmp(option, "-no-counter") == 0) { options->no_counter = 1; } else if (strcmp(option, "-no-bus") == 0) { options->no_bus = 1; } else if (strcmp(option, "-no-flops") == 0) { options->no_flops = 1; } else if (strcmp(option, "-no-smooth") == 0) { options->no_smooth = 1; } else if (strcmp(option, "-no-acquire") == 0) { options->no_acquire = 1; } else if (strcmp(option, "-memory-states") == 0) { options->memory_states = 1; } else if (strcmp(option, "-internal") == 0) { options->internal = 1; } else if (strcmp(option, "-label-deps") == 0) { options->label_deps = 1; } else { _STARPU_MSG("Option <%s> is not a valid option for starpu_fxt_tool\n", option); } } 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); char *trace_options = starpu_getenv("STARPU_GENERATE_TRACE_OPTIONS"); if (trace_options) { char *option = strtok(trace_options, " "); while (option) { _starpu_generate_paje_trace_read_option(option, &options); option = strtok(NULL, " "); } } 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_fxt_dump_file(void) { if (!_starpu_fxt_started) return; char hostname[128]; gethostname(hostname, 128); int ret = fut_endup(_starpu_prof_file_user); if (ret < 0) _STARPU_MSG("Problem when writing FxT traces into file %s:%s\n", hostname, _starpu_prof_file_user); #ifdef STARPU_VERBOSE else _STARPU_MSG("Writing FxT traces into file %s:%s\n", hostname, _starpu_prof_file_user); #endif } void _starpu_stop_fxt_profiling(void) { if (!_starpu_fxt_started) return; if (!_starpu_written) { _starpu_fxt_dump_file(); /* 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.3.9+dfsg/src/common/fxt.h000066400000000000000000001521771413463044200170300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Joris Pablo * Copyright (C) 2018,2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 /* 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_MPI_KEY 0x106 #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_ON_TID 0x5107 #define _STARPU_FUT_END_FETCH_INPUT_ON_TID 0x5108 #define _STARPU_FUT_START_PUSH_OUTPUT_ON_TID 0x5109 #define _STARPU_FUT_END_PUSH_OUTPUT_ON_TID 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_DATA_WONT_USE 0x512c #define _STARPU_FUT_TASK_COLOR 0x512d #define _STARPU_FUT_DATA_DOING_WONT_USE 0x512e #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_ON_TID 0x5154 #define _STARPU_FUT_END_UNPARTITION_ON_TID 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_START_FETCH_INPUT 0x517e #define _STARPU_FUT_END_FETCH_INPUT 0x517f #define _STARPU_FUT_TASK_THROTTLE_START 0x5180 #define _STARPU_FUT_TASK_THROTTLE_END 0x5181 #define _STARPU_FUT_DATA_STATE_INVALID 0x5182 #define _STARPU_FUT_DATA_STATE_OWNER 0x5183 #define _STARPU_FUT_DATA_STATE_SHARED 0x5184 #define _STARPU_FUT_DATA_REQUEST_CREATED 0x5185 #define _STARPU_FUT_TASK_EXCLUDE_FROM_DAG 0x5187 extern unsigned long _starpu_job_cnt; static inline unsigned long _starpu_fxt_get_job_id(void) { unsigned long ret = STARPU_ATOMIC_ADDL(&_starpu_job_cnt, 1); STARPU_ASSERT_MSG(ret != 0, "Oops, job_id wrapped! There are too many tasks for tracking them for profiling"); return ret; } #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 int _starpu_fxt_willstart; extern starpu_pthread_mutex_t _starpu_fxt_started_mutex; extern starpu_pthread_cond_t _starpu_fxt_started_cond; /** Wait until FXT is started (or not). Returns if FXT was started */ static inline int _starpu_fxt_wait_initialisation() { STARPU_PTHREAD_MUTEX_LOCK(&_starpu_fxt_started_mutex); while (_starpu_fxt_willstart && !_starpu_fxt_started) STARPU_PTHREAD_COND_WAIT(&_starpu_fxt_started_cond, &_starpu_fxt_started_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_fxt_started_mutex); return _starpu_fxt_started; } extern unsigned long _starpu_submit_order; static inline unsigned long _starpu_fxt_get_submit_order(void) { unsigned long ret = STARPU_ATOMIC_ADDL(&_starpu_submit_order, 1); STARPU_ASSERT_MSG(_starpu_submit_order != 0, "Oops, submit_order wrapped! There are too many tasks for tracking them for profiling"); return ret; } long _starpu_gettid(void); /** Initialize the FxT library. */ void _starpu_fxt_init_profiling(uint64_t trace_buffer_size); /** Stop the FxT library, and generate the trace file. */ void _starpu_stop_fxt_profiling(void); /** Generate the trace file. Used when catching signals SIGINT and SIGSEGV */ void _starpu_fxt_dump_file(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) \ _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->cl && job->task->cl->type != STARPU_SEQ ? j->task_size : 1), (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, _starpu_get_job_associated_to_task(task)->job_id, prio, _starpu_gettid()); #define _STARPU_TRACE_JOB_POP(task, prio) \ FUT_DO_PROBE3(_STARPU_FUT_JOB_POP, _starpu_get_job_associated_to_task(task)->job_id, 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_ON_TID, job, _starpu_gettid()); #define _STARPU_TRACE_END_FETCH_INPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_FETCH_INPUT_ON_TID, job, _starpu_gettid()); #define _STARPU_TRACE_START_PUSH_OUTPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_PUSH_OUTPUT_ON_TID, job, _starpu_gettid()); #define _STARPU_TRACE_END_PUSH_OUTPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_PUSH_OUTPUT_ON_TID, job, _starpu_gettid()); #define _STARPU_TRACE_WORKER_END_FETCH_INPUT(job, id) \ FUT_DO_PROBE2(_STARPU_FUT_END_FETCH_INPUT, job, id); #define _STARPU_TRACE_WORKER_START_FETCH_INPUT(job, id) \ FUT_DO_PROBE2(_STARPU_FUT_START_FETCH_INPUT, job, id); #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) \ _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_TASK_DEPS, (job_prev)->job_id, (job_succ)->job_id, (job_succ)->task->type, 1, "task") #define _STARPU_TRACE_GHOST_TASK_DEPS(ghost_prev_id, job_succ) \ _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_TASK_DEPS, (ghost_prev_id), (job_succ)->job_id, (job_succ)->task->type, 1, "ghost") #define _STARPU_TRACE_TASK_EXCLUDE_FROM_DAG(job) \ do { \ unsigned exclude_from_dag = (job)->exclude_from_dag; \ FUT_DO_PROBE2(_STARPU_FUT_TASK_EXCLUDE_FROM_DAG, (job)->job_id, (long unsigned)exclude_from_dag); \ } while(0) #define _STARPU_TRACE_TASK_NAME(job) \ do { \ const char *model_name = _starpu_job_get_task_name((job)); \ if (model_name) \ { \ _STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_TASK_NAME, (job)->job_id, model_name);\ } \ else { \ FUT_DO_PROBE2(_STARPU_FUT_TASK_NAME, (job)->job_id, "unknown");\ } \ } while(0) #define _STARPU_TRACE_TASK_COLOR(job) \ do { \ if ((job)->task->color != 0) \ FUT_DO_PROBE3(_STARPU_FUT_TASK_COLOR, (job)->job_id, (job)->task->color, _starpu_gettid()); \ else if ((job)->task->cl && (job)->task->cl->color != 0) \ FUT_DO_PROBE3(_STARPU_FUT_TASK_COLOR, (job)->job_id, (job)->task->cl->color, _starpu_gettid()); \ } 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_DATA_WONT_USE(handle) \ FUT_DO_PROBE4(_STARPU_FUT_DATA_WONT_USE, handle, _starpu_fxt_get_submit_order(), _starpu_fxt_get_job_id(), _starpu_gettid()) #define _STARPU_TRACE_DATA_DOING_WONT_USE(handle) \ FUT_DO_PROBE1(_STARPU_FUT_DATA_DOING_WONT_USE, handle) #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_PROBE7(_STARPU_FUT_TASK_SUBMIT, (job)->job_id, iter, subiter, (job)->task->no_submitorder?0:_starpu_fxt_get_submit_order(), (job)->task->priority, (job)->task->type, _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, handle, is_prefetch) \ FUT_DO_PROBE5(_STARPU_FUT_START_ALLOC, memnode, _starpu_gettid(), size, handle, is_prefetch); #define _STARPU_TRACE_END_ALLOC(memnode, handle, r) \ FUT_DO_PROBE4(_STARPU_FUT_END_ALLOC, memnode, _starpu_gettid(), handle, r); #define _STARPU_TRACE_START_ALLOC_REUSE(memnode, size, handle, is_prefetch) \ FUT_DO_PROBE5(_STARPU_FUT_START_ALLOC_REUSE, memnode, _starpu_gettid(), size, handle, is_prefetch); #define _STARPU_TRACE_END_ALLOC_REUSE(memnode, handle, r) \ FUT_DO_PROBE4(_STARPU_FUT_END_ALLOC_REUSE, memnode, _starpu_gettid(), handle, r); #define _STARPU_TRACE_START_FREE(memnode, size, handle) \ FUT_DO_PROBE4(_STARPU_FUT_START_FREE, memnode, _starpu_gettid(), size, handle); #define _STARPU_TRACE_END_FREE(memnode, handle) \ FUT_DO_PROBE3(_STARPU_FUT_END_FREE, memnode, _starpu_gettid(), handle); #define _STARPU_TRACE_START_WRITEBACK(memnode, handle) \ FUT_DO_PROBE3(_STARPU_FUT_START_WRITEBACK, memnode, _starpu_gettid(), handle); #define _STARPU_TRACE_END_WRITEBACK(memnode, handle) \ FUT_DO_PROBE3(_STARPU_FUT_END_WRITEBACK, memnode, _starpu_gettid(), handle); #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 {(void) file; (void)line;} while(0) #define _STARPU_TRACE_SPINLOCK_LOCKED(file, line) do {(void) file; (void)line;} while(0) #define _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line) do {(void) file; (void)line;} while(0) #define _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line) do {(void) file; (void)line;} while(0) #define _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line) do {(void) file; (void)line;} 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_ON_TID, memnode, _starpu_gettid(), handle); #define _STARPU_TRACE_END_UNPARTITION(handle, memnode) \ FUT_DO_PROBE3(_STARPU_FUT_END_UNPARTITION_ON_TID, 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, prio) \ FUT_DO_PROBE5(_STARPU_FUT_SCHED_COMPONENT_PUSH, _starpu_gettid(), from, to, task, prio); #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) //Coherency Data Traces #define _STARPU_TRACE_DATA_STATE_INVALID(handle, node) \ FUT_DO_PROBE2(_STARPU_FUT_DATA_STATE_INVALID, handle, node) #define _STARPU_TRACE_DATA_STATE_OWNER(handle, node) \ FUT_DO_PROBE2(_STARPU_FUT_DATA_STATE_OWNER, handle, node) #define _STARPU_TRACE_DATA_STATE_SHARED(handle, node) \ FUT_DO_PROBE2(_STARPU_FUT_DATA_STATE_SHARED, handle, node) #define _STARPU_TRACE_DATA_REQUEST_CREATED(handle, orig, dest, prio, is_pre) \ FUT_DO_PROBE5(_STARPU_FUT_DATA_REQUEST_CREATED, orig, dest, prio, handle, is_pre) #else // !STARPU_USE_FXT /* Dummy macros in case FxT is disabled */ #define _STARPU_TRACE_NEW_MEM_NODE(nodeid) do {(void)(nodeid);} while(0) #define _STARPU_TRACE_WORKER_INIT_START(a,b,c,d,e,f) do {(void)(a); (void)(b); (void)(c); (void)(d); (void)(e); (void)(f);} while(0) #define _STARPU_TRACE_WORKER_INIT_END(workerid) do {(void)(workerid);} while(0) #define _STARPU_TRACE_START_CODELET_BODY(job, nimpl, perf_arch, workerid) do {(void)(job); (void)(nimpl); (void)(perf_arch); (void)(workerid);} while(0) #define _STARPU_TRACE_END_CODELET_BODY(job, nimpl, perf_arch, workerid) do {(void)(job); (void)(nimpl); (void)(perf_arch); (void)(workerid);} 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 {(void)(job);} while(0) #define _STARPU_TRACE_END_CALLBACK(job) do {(void)(job);} while(0) #define _STARPU_TRACE_JOB_PUSH(task, prio) do {(void)(task); (void)(prio);} while(0) #define _STARPU_TRACE_JOB_POP(task, prio) do {(void)(task); (void)(prio);} while(0) #define _STARPU_TRACE_UPDATE_TASK_CNT(counter) do {(void)(counter);} while(0) #define _STARPU_TRACE_START_FETCH_INPUT(job) do {(void)(job);} while(0) #define _STARPU_TRACE_END_FETCH_INPUT(job) do {(void)(job);} while(0) #define _STARPU_TRACE_START_PUSH_OUTPUT(job) do {(void)(job);} while(0) #define _STARPU_TRACE_END_PUSH_OUTPUT(job) do {(void)(job);} while(0) #define _STARPU_TRACE_TAG(tag, job) do {(void)(tag); (void)(job);} while(0) #define _STARPU_TRACE_TAG_DEPS(a, b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_TASK_DEPS(a, b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_GHOST_TASK_DEPS(a, b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_TASK_EXCLUDE_FROM_DAG(a) do {(void)(a);} while(0) #define _STARPU_TRACE_TASK_NAME(a) do {(void)(a);} while(0) #define _STARPU_TRACE_TASK_COLOR(a) do {(void)(a);} while(0) #define _STARPU_TRACE_TASK_DONE(a) do {(void)(a);} while(0) #define _STARPU_TRACE_TAG_DONE(a) do {(void)(a);} while(0) #define _STARPU_TRACE_DATA_NAME(a, b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_DATA_COORDINATES(a, b, c) do {(void)(a); (void)(b); (void)(c);} while(0) #define _STARPU_TRACE_DATA_COPY(a, b, c) do {(void)(a); (void)(b); (void)(c);} while(0) #define _STARPU_TRACE_DATA_WONT_USE(a) do {(void)(a);} while(0) #define _STARPU_TRACE_DATA_DOING_WONT_USE(a) do {(void)(a);} while(0) #define _STARPU_TRACE_START_DRIVER_COPY(a,b,c,d,e,f) do {(void)(a); (void)(b); (void)(c); (void)(d); (void)(e); (void)(f);} while(0) #define _STARPU_TRACE_END_DRIVER_COPY(a,b,c,d,e) do {(void)(a); (void)(b); (void)(c); (void)(d); (void)(e);} while(0) #define _STARPU_TRACE_START_DRIVER_COPY_ASYNC(a,b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_END_DRIVER_COPY_ASYNC(a,b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_WORK_STEALING(a, b) do {(void)(a); (void)(b);} while(0) #define _STARPU_TRACE_WORKER_DEINIT_START do {} while(0) #define _STARPU_TRACE_WORKER_DEINIT_END(a) do {(void)(a);} 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 {(void)(job); (void)(a);(void)(b);} 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 {(void)(job);} 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, handle, is_prefetch) do {(void)(memnode); (void)(size); (void)(handle);} while(0) #define _STARPU_TRACE_END_ALLOC(memnode, handle, r) do {(void)(memnode); (void)(handle); (void)(r);} while(0) #define _STARPU_TRACE_START_ALLOC_REUSE(a, size, handle, is_prefetch) do {(void)(a); (void)(size); (void)(handle);} while(0) #define _STARPU_TRACE_END_ALLOC_REUSE(a, handle, r) do {(void)(a); (void)(handle); (void)(r);} while(0) #define _STARPU_TRACE_START_FREE(memnode, size, handle) do {(void)(memnode); (void)(size); (void)(handle);} while(0) #define _STARPU_TRACE_END_FREE(memnode, handle) do {(void)(memnode); (void)(handle);} while(0) #define _STARPU_TRACE_START_WRITEBACK(memnode, handle) do {(void)(memnode); (void)(handle);} while(0) #define _STARPU_TRACE_END_WRITEBACK(memnode, handle) do {(void)(memnode); (void)(handle);} while(0) #define _STARPU_TRACE_USED_MEM(memnode,used) do {(void)(memnode); (void)(used);} while (0) #define _STARPU_TRACE_START_MEMRECLAIM(memnode,is_prefetch) do {(void)(memnode); (void)(is_prefetch);} while(0) #define _STARPU_TRACE_END_MEMRECLAIM(memnode,is_prefetch) do {(void)(memnode); (void)(is_prefetch);} while(0) #define _STARPU_TRACE_START_WRITEBACK_ASYNC(memnode) do {(void)(memnode);} while(0) #define _STARPU_TRACE_END_WRITEBACK_ASYNC(memnode) do {(void)(memnode);} while(0) #define _STARPU_TRACE_START_PROGRESS(memnode) do {(void)( memnode);} while(0) #define _STARPU_TRACE_END_PROGRESS(memnode) do {(void)( memnode);} while(0) #define _STARPU_TRACE_USER_EVENT(code) do {(void)(code);} while(0) #define _STARPU_TRACE_SET_PROFILING(status) do {(void)(status);} while(0) #define _STARPU_TRACE_TASK_WAIT_FOR_ALL() do {} while(0) #define _STARPU_TRACE_EVENT(S) do {(void)(S);} while(0) #define _STARPU_TRACE_THREAD_EVENT(S) do {(void)(S);} 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 {(void)(file); (void)(line);} while(0) #define _STARPU_TRACE_SPINLOCK_LOCKED(file, line) do {(void)(file); (void)(line);} while(0) #define _STARPU_TRACE_UNLOCKING_SPINLOCK(file, line) do {(void)(file); (void)(line);} while(0) #define _STARPU_TRACE_SPINLOCK_UNLOCKED(file, line) do {(void)(file); (void)(line);} while(0) #define _STARPU_TRACE_TRYLOCK_SPINLOCK(file, line) do {(void)(file); (void)(line);} 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 {(void)(size);} while(0) #define _STARPU_TRACE_DATA_LOAD(workerid,size) do {(void)(workerid); (void)(size);} while(0) #define _STARPU_TRACE_START_UNPARTITION(handle, memnode) do {(void)(handle); (void)(memnode);} while(0) #define _STARPU_TRACE_END_UNPARTITION(handle, memnode) do {(void)(handle); (void)(memnode);} while(0) #define _STARPU_TRACE_SCHED_COMPONENT_PUSH_PRIO(workerid, ntasks, exp_len) do {(void)(workerid); (void)(ntasks); (void)(exp_len);} while(0) #define _STARPU_TRACE_SCHED_COMPONENT_POP_PRIO(workerid, ntasks, exp_len) do {(void)(workerid); (void)(ntasks); (void)(exp_len);} 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 {(void)(component);} while (0) #define _STARPU_TRACE_SCHED_COMPONENT_CONNECT(parent, child) do {(void)(parent); (void)(child);} while (0) #define _STARPU_TRACE_SCHED_COMPONENT_PUSH(from, to, task, prio) do {(void)(from); (void)(to); (void)(task); (void)(prio);} while (0) #define _STARPU_TRACE_SCHED_COMPONENT_PULL(from, to, task) do {(void)(from); (void)(to); (void)(task);} while (0) #define _STARPU_TRACE_HANDLE_DATA_REGISTER(handle) do {(void)(handle);} while (0) #define _STARPU_TRACE_HANDLE_DATA_UNREGISTER(handle) do {(void)(handle);} while (0) #define _STARPU_TRACE_WORKER_START_FETCH_INPUT(job, id) do {(void)(job); (void)(id);} while(0) #define _STARPU_TRACE_WORKER_END_FETCH_INPUT(job, id) do {(void)(job); (void)(id);} while(0) #define _STARPU_TRACE_DATA_STATE_INVALID(handle, node) do {(void)(handle); (void)(node);} while(0) #define _STARPU_TRACE_DATA_STATE_OWNER(handle, node) do {(void)(handle); (void)(node);} while(0) #define _STARPU_TRACE_DATA_STATE_SHARED(handle, node) do {(void)(handle); (void)(node);} while(0) #define _STARPU_TRACE_DATA_REQUEST_CREATED(handle, orig, dest, prio, is_pre) do {(void)(handle); (void)(orig); (void)(dest); (void)(prio); (void)(is_pre);} while(0) #endif // STARPU_USE_FXT #endif // __FXT_H__ starpu-1.3.9+dfsg/src/common/graph.c000066400000000000000000000327571413463044200173240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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 */ static struct _starpu_graph_node_multilist_top top; /* This list contains all nodes without outgoing dependency */ static struct _starpu_graph_node_multilist_bottom bottom; /* This list contains all nodes */ static 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 */ static struct _starpu_graph_node_multilist_dropped dropped; void _starpu_graph_init(void) { STARPU_PTHREAD_RWLOCK_INIT(&graph_lock, NULL); _starpu_graph_node_multilist_head_init_top(&top); _starpu_graph_node_multilist_head_init_bottom(&bottom); _starpu_graph_node_multilist_head_init_all(&all); STARPU_PTHREAD_MUTEX_INIT(&dropped_lock, NULL); _starpu_graph_node_multilist_head_init_dropped(&dropped); } /* LockWR the graph lock */ void _starpu_graph_wrlock(void) { starpu_worker_relax_on(); STARPU_PTHREAD_RWLOCK_WRLOCK(&graph_lock); starpu_worker_relax_off(); } void _starpu_graph_drop_node(struct _starpu_graph_node *node); /* This flushes the list of nodes to be dropped. Both the dropped_lock and * graph_lock mutexes have to be held on entry, and are released. */ void _starpu_graph_drop_dropped_nodes(void) { struct _starpu_graph_node_multilist_dropped dropping; /* 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; 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); } /* UnlockWR the graph lock */ void _starpu_graph_wrunlock(void) { starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&dropped_lock); starpu_worker_relax_off(); _starpu_graph_drop_dropped_nodes(); } /* LockRD the graph lock */ void _starpu_graph_rdlock(void) { starpu_worker_relax_on(); STARPU_PTHREAD_RWLOCK_RDLOCK(&graph_lock); starpu_worker_relax_off(); } /* UnlockRD the graph lock */ void _starpu_graph_rdunlock(void) { STARPU_PTHREAD_RWLOCK_UNLOCK(&graph_lock); /* Take the opportunity to try to take it WR */ if (STARPU_PTHREAD_RWLOCK_TRYWRLOCK(&graph_lock) == 0) /* Good, flush dropped nodes */ _starpu_graph_wrunlock(); } 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&node->mutex); starpu_worker_relax_off(); /* Will not be able to use the job any more */ node->job = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&node->mutex); starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&dropped_lock); starpu_worker_relax_off(); /* Queue for removal when lock becomes available */ _starpu_graph_node_multilist_push_back_dropped(&dropped, node); if (STARPU_PTHREAD_RWLOCK_TRYWRLOCK(&graph_lock) == 0) { /* Graph wrlock is available, drop nodes immediately */ _starpu_graph_drop_dropped_nodes(); } else 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) { (void)data; 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.3.9+dfsg/src/common/graph.h000066400000000000000000000077351413463044200173270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ 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 { /** protects access to the job */ starpu_pthread_mutex_t mutex; /** pointer to the job, if it is still alive, NULL otherwise */ struct _starpu_job *job; /** * 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 */ /** May contain NULLs for terminated jobs */ struct _starpu_graph_node **incoming; /** Index within corresponding outgoing array */ unsigned *incoming_slot; /** Number of slots used */ unsigned n_incoming; /** Size of incoming */ unsigned alloc_incoming; /** set of outgoing dependencies */ struct _starpu_graph_node **outgoing; /** Index within corresponding incoming array */ unsigned *outgoing_slot; /** Number of slots used */ unsigned n_outgoing; /** Size of outgoing */ unsigned alloc_outgoing; /** Rank from bottom, in number of jobs * Only available if _starpu_graph_compute_depths was called */ unsigned depth; /** Number of children, grand-children, etc. * Only available if _starpu_graph_compute_descendants was called */ unsigned descendants; /** Variable available for graph flow */ int graph_n; }; 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.3.9+dfsg/src/common/hash.c000066400000000000000000000035431413463044200171350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/common/inlines.c000066400000000000000000000015411413463044200176470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 includes the inline definitions in a .c file so that they can also be * referenced from outside */ #define LIST_INLINE #define PRIO_LIST_INLINE #include starpu-1.3.9+dfsg/src/common/list.h000066400000000000000000000370371413463044200171770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 */ #include /** @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*) * * * Return the position of the cell in the list (indexed from 0) (O(n) on average) * int FOO_list_member(struct FOO_list*, struct FOO*) * * * Test whether the cell is in the list (O(n) on average) * int FOO_list_ismember(struct FOO_list*, struct FOO*) * * ********************************************************* * 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); * } * ********************************************************* */ #ifndef LIST_INLINE #define LIST_INLINE static inline #endif /**@hideinitializer * Generates a new type for list of elements */ #define LIST_TYPE(ENAME, DECL) \ LIST_CREATE_TYPE(ENAME, DECL) #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 \ }; \ LIST_CREATE_TYPE_NOSTRUCT(ENAME, _prev, _next) /**@hideinitializer * The effective type declaration for lists */ #define LIST_CREATE_TYPE_NOSTRUCT(ENAME, _prev, _next) \ /** @internal */ \ /* NOTE: this must not be greater than the struct defined in include/starpu_task_list.h */ \ struct ENAME##_list \ { \ struct ENAME *_head; /**< @internal head of the list */ \ struct ENAME *_tail; /**< @internal tail of the list */ \ }; \ /** @internal */LIST_INLINE struct ENAME *ENAME##_new(void) \ { struct ENAME *e; _STARPU_MALLOC(e, sizeof(struct ENAME)); \ e->_next = NULL; e->_prev = NULL; return e; } \ /** @internal */LIST_INLINE void ENAME##_delete(struct ENAME *e) \ { free(e); } \ /** @internal */LIST_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 */LIST_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 */LIST_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 */LIST_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 */LIST_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 */LIST_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 */LIST_INLINE struct ENAME *ENAME##_list_front(const struct ENAME##_list *l) \ { return l->_head; } \ /** @internal */LIST_INLINE struct ENAME *ENAME##_list_back(const struct ENAME##_list *l) \ { return l->_tail; } \ /** @internal */LIST_INLINE void ENAME##_list_init(struct ENAME##_list *l) \ { l->_head=NULL; l->_tail=l->_head; } \ /** @internal */LIST_INLINE struct ENAME##_list *ENAME##_list_new(void) \ { struct ENAME##_list *l; _STARPU_MALLOC(l, sizeof(struct ENAME##_list)); \ ENAME##_list_init(l); return l; } \ /** @internal */LIST_INLINE int ENAME##_list_empty(const struct ENAME##_list *l) \ { return (l->_head == NULL); } \ /** @internal */LIST_INLINE void ENAME##_list_delete(struct ENAME##_list *l) \ { free(l); } \ /** @internal */LIST_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 */LIST_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 */LIST_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 */LIST_INLINE struct ENAME *ENAME##_list_begin(const struct ENAME##_list *l) \ { return l->_head; } \ /** @internal */LIST_INLINE struct ENAME *ENAME##_list_end(const struct ENAME##_list *l STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ /** @internal */LIST_INLINE struct ENAME *ENAME##_list_next(const struct ENAME *i) \ { return i->_next; } \ /** @internal */LIST_INLINE struct ENAME *ENAME##_list_last(const struct ENAME##_list *l) \ { return l->_tail; } \ /** @internal */LIST_INLINE struct ENAME *ENAME##_list_alpha(const struct ENAME##_list *l STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ /** @internal */LIST_INLINE struct ENAME *ENAME##_list_prev(const struct ENAME *i) \ { return i->_prev; } \ /** @internal */LIST_INLINE int ENAME##_list_ismember(const struct ENAME##_list *l, const struct ENAME *e) \ { struct ENAME *i=l->_head; while(i!=NULL){ if (i == e) return 1; i=i->_next; } return 0; } \ /** @internal */LIST_INLINE int ENAME##_list_member(const struct ENAME##_list *l, const struct ENAME *e) \ { struct ENAME *i=l->_head; int k=0; while(i!=NULL){if (i == e) return k; k++; i=i->_next; } return -1; } \ /** @internal */LIST_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 */LIST_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; } \ /** @internal */LIST_INLINE void ENAME##_list_move(struct ENAME##_list *ldst, struct ENAME##_list *lsrc) \ { ENAME##_list_init(ldst); ldst->_head = lsrc->_head; ldst->_tail = lsrc->_tail; lsrc->_head = NULL; lsrc->_tail = NULL; } #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. */ \ LIST_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. */ \ LIST_INLINE void ENAME##_multilist_head_init_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ head->next = head; \ head->prev = head; \ } \ \ /* Initialize a list element. */ \ LIST_INLINE void ENAME##_multilist_init_##MEMBER(TYPE *e) { \ (e)->MEMBER.next = NULL; \ (e)->MEMBER.prev = NULL; \ } \ \ /* Push element to head of a list. */ \ LIST_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. */ \ LIST_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. */ \ LIST_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. */ \ LIST_INLINE int ENAME##_multilist_queued_##MEMBER(TYPE *e) { \ return ((e)->MEMBER.next != NULL); \ } \ \ /* Test whether the list is empty. */ \ LIST_INLINE int ENAME##_multilist_empty_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ return head->next == head; \ } \ \ /* Test whether the element is alone in a list. */ \ LIST_INLINE int ENAME##_multilist_alone_##MEMBER(TYPE *e) { \ return (e)->MEMBER.next == (e)->MEMBER.prev; \ } \ \ /* Return the first element of the list. */ \ LIST_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. */ \ LIST_INLINE TYPE *ENAME##_multilist_end_##MEMBER(struct ENAME##_multilist_##MEMBER *head) { \ return ENAME##_of_multilist_##MEMBER(head); \ } \ /* Return the next element of the list. */ \ LIST_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. Passing newhead == NULL allows to detach the list from any head. */ \ LIST_INLINE void ENAME##_multilist_move_##MEMBER(struct ENAME##_multilist_##MEMBER *head, struct ENAME##_multilist_##MEMBER *newhead) { \ if (ENAME##_multilist_empty_##MEMBER(head)) \ ENAME##_multilist_head_init_##MEMBER(newhead); \ else { \ if (newhead) { \ newhead->next = head->next; \ newhead->next->prev = newhead; \ } else { \ head->next->prev = head->prev; \ } \ if (newhead) { \ newhead->prev = head->prev; \ newhead->prev->next = newhead; \ } else { \ head->prev->next = head->next; \ } \ head->next = head; \ head->prev = head; \ } \ } #endif /* __LIST_H__ */ starpu-1.3.9+dfsg/src/common/prio_list.h000066400000000000000000000544601413463044200202270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /** @file */ /* * This implements list with priorities (as an int), by using two stages: * - an RB tree stage sorted by priority, whose leaves are... * - ... double-linked lists sorted by insertion order. * * We always keep the 0-priority list allocated, to avoid keeping * allocating/deallocating it when all priorities are 0. * * We maintain an "empty" flag, to allow lockless FOO_prio_list_empty call. * * PRIO_LIST_TYPE(FOO, priority_field) * * - Declares the following type: * + priority list: struct FOO_prio_list * * - Declares the following inlines (all O(1) except stated otherwise, n is the * number of elements, p is the number of different priorities): * * * Initialize a new priority list * void FOO_prio_list_init(struct FOO_prio_list*) * * * Free an empty priority list * void FOO_prio_list_deinit(struct FOO_prio_list*) * * * Add a new cell at the end of the list of the priority of the cell (O(log2 p)) * void FOO_prio_list_push_back(struct FOO_prio_list*, struct FOO*) * * * Add a new cell at the beginning of the list of the priority of the cell (O(log2 p)) * void FOO_prio_list_push_front(struct FOO_prio_list*, struct FOO*) * * * Test whether the priority list is empty * void FOO_prio_list_empty(struct FOO_prio_list*) * * * Remove given cell from the priority list * void FOO_prio_list_erase(struct FOO_prio_list*, struct FOO*) * * * Return and remove the first cell of highest priority of the priority list * void FOO_prio_list_pop_front_highest(struct FOO_prio_list*) * * Return and remove the first cell of lowest priority of the priority list * void FOO_prio_list_pop_front_lowest(struct FOO_prio_list*) * * * Return and remove the last cell of highest priority of the priority list * void FOO_prio_list_pop_back_highest(struct FOO_prio_list*) * * Return and remove the last cell of lowest priority of the priority list * void FOO_prio_list_pop_back_lowest(struct FOO_prio_list*) * * * Return the first cell of highest priority of the priority list * void FOO_prio_list_front_highest(struct FOO_prio_list*) * * Return the first cell of lowest priority of the priority list * void FOO_prio_list_front_lowest(struct FOO_prio_list*) * * * Return the last cell of highest priority of sthe priority list * void FOO_prio_list_back_highest(struct FOO_prio_list*) * * Return the last cell of lowest priority of sthe priority list * void FOO_prio_list_back_lowest(struct FOO_prio_list*) * * * Append second priority list at ends of the first priority list (O(log2 p)) * void FOO_prio_list_push_prio_list_back(struct FOO_prio_list*, struct FOO_prio_list*) * * * Test whether cell is part of the list (O(n)) * void FOO_prio_list_ismember(struct FOO_prio_list*, struct FOO*) * * * Return the first cell of the list * struct FOO* FOO_prio_list_begin(struct FOO_prio_list*); * * * Return the value to test at the end of the list * struct FOO* FOO_prio_list_end(struct FOO_prio_list*); * * * Return the next cell of the list * struct FOO* FOO_prio_list_next(struct FOO_prio_list*, struct FOO*) * * * Return the last cell of the list * struct FOO* FOO_prio_list_last(struct FOO_prio_list*); * * * Return the value to test at the beginning of the list * struct FOO* FOO_prio_list_alpha(struct FOO_prio_list*); * * * Return the previous cell of the list * struct FOO* FOO_prio_list_prev(struct FOO_prio_list*, struct FOO*) * * PRIO_LIST_TYPE assumes that LIST_TYPE has already been called to create the * final structure. * * ********************************************************* * Usage example: * LIST_TYPE(my_struct, * int a; * int b; * int prio; * ); * PRIO_LIST_TYPE(my_struct, prio); * * and then my_struct_prio_list_* inlines are available */ #ifndef __PRIO_LIST_H__ #define __PRIO_LIST_H__ #include #ifndef PRIO_LIST_INLINE #define PRIO_LIST_INLINE static inline #endif #define PRIO_LIST_TYPE(ENAME, PRIOFIELD) \ PRIO_LIST_CREATE_TYPE(ENAME, PRIOFIELD) #ifndef STARPU_DEBUG #define PRIO_LIST_CREATE_TYPE(ENAME, PRIOFIELD) \ /* The main type: an RB binary tree */ \ struct ENAME##_prio_list { \ struct starpu_rbtree tree; \ int empty; \ }; \ /* The second stage: a list */ \ struct ENAME##_prio_list_stage { \ struct starpu_rbtree_node node; /* Keep this first so ENAME##_node_to_list_stage can work. */ \ int prio; \ struct ENAME##_list list; \ }; \ PRIO_LIST_INLINE struct ENAME##_prio_list_stage *ENAME##_node_to_list_stage(struct starpu_rbtree_node *node) \ { \ /* This assumes node is first member of stage */ \ return (struct ENAME##_prio_list_stage *) node; \ } \ PRIO_LIST_INLINE const struct ENAME##_prio_list_stage *ENAME##_node_to_list_stage_const(const struct starpu_rbtree_node *node) \ { \ /* This assumes node is first member of stage */ \ return (struct ENAME##_prio_list_stage *) node; \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_init(struct ENAME##_prio_list *priolist) \ { \ starpu_rbtree_init(&priolist->tree); \ priolist->empty = 1; \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_deinit(struct ENAME##_prio_list *priolist) \ { \ if (starpu_rbtree_empty(&priolist->tree)) \ return; \ struct starpu_rbtree_node *root = priolist->tree.root; \ struct ENAME##_prio_list_stage *stage = ENAME##_node_to_list_stage(root); \ assert(ENAME##_list_empty(&stage->list)); \ assert(!root->children[0] && !root->children[1]); \ starpu_rbtree_remove(&priolist->tree, root); \ free(stage); \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_cmp_fn(int prio, const struct starpu_rbtree_node *node) \ { \ /* Sort by decreasing order */ \ const struct ENAME##_prio_list_stage *e2 = ENAME##_node_to_list_stage_const(node); \ if (e2->prio < prio) \ return -1; \ if (e2->prio == prio) \ return 0; \ /* e2->prio > prio */ \ return 1; \ } \ PRIO_LIST_INLINE struct ENAME##_prio_list_stage *ENAME##_prio_list_add(struct ENAME##_prio_list *priolist, int prio) \ { \ uintptr_t slot; \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ node = starpu_rbtree_lookup_slot(&priolist->tree, prio, ENAME##_prio_list_cmp_fn, slot); \ if (node) \ stage = ENAME##_node_to_list_stage(node); \ else { \ _STARPU_MALLOC(stage, sizeof(*stage)); \ starpu_rbtree_node_init(&stage->node); \ stage->prio = prio; \ ENAME##_list_init(&stage->list); \ starpu_rbtree_insert_slot(&priolist->tree, slot, &stage->node); \ } \ return stage; \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_push_back(struct ENAME##_prio_list *priolist, struct ENAME *e) \ { \ struct ENAME##_prio_list_stage *stage = ENAME##_prio_list_add(priolist, e->PRIOFIELD); \ ENAME##_list_push_back(&stage->list, e); \ priolist->empty = 0; \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_push_front(struct ENAME##_prio_list *priolist, struct ENAME *e) \ { \ struct ENAME##_prio_list_stage *stage = ENAME##_prio_list_add(priolist, e->PRIOFIELD); \ ENAME##_list_push_front(&stage->list, e); \ priolist->empty = 0; \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_empty(const struct ENAME##_prio_list *priolist) \ { \ return priolist->empty; \ } \ /* Version of list_empty which does not use the cached empty flag, * typically used to compute the value of the flag */ \ PRIO_LIST_INLINE int ENAME##_prio_list_empty_slow(const struct ENAME##_prio_list *priolist) \ { \ if (starpu_rbtree_empty(&priolist->tree)) \ return 1; \ struct starpu_rbtree_node *root = priolist->tree.root; \ const struct ENAME##_prio_list_stage *stage = ENAME##_node_to_list_stage_const(root); \ if (ENAME##_list_empty(&stage->list) && !root->children[0] && !root->children[1]) \ /* Just one empty list */ \ return 1; \ return 0; \ } \ /* To be called when removing an element from a stage, to potentially remove this stage */ \ PRIO_LIST_INLINE void ENAME##_prio_list_check_empty_stage(struct ENAME##_prio_list *priolist, struct ENAME##_prio_list_stage *stage) \ { \ if (ENAME##_list_empty(&stage->list)) { \ if (stage->prio != 0) \ { \ /* stage got empty, remove it */ \ starpu_rbtree_remove(&priolist->tree, &stage->node); \ free(stage); \ } \ priolist->empty = ENAME##_prio_list_empty_slow(priolist); \ } \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_erase(struct ENAME##_prio_list *priolist, struct ENAME *e) \ { \ struct starpu_rbtree_node *node = starpu_rbtree_lookup(&priolist->tree, e->PRIOFIELD, ENAME##_prio_list_cmp_fn); \ struct ENAME##_prio_list_stage *stage = ENAME##_node_to_list_stage(node); \ ENAME##_list_erase(&stage->list, e); \ ENAME##_prio_list_check_empty_stage(priolist, stage); \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_get_next_nonempty_stage(struct ENAME##_prio_list *priolist, struct starpu_rbtree_node *node, struct starpu_rbtree_node **pnode, struct ENAME##_prio_list_stage **pstage) \ { \ struct ENAME##_prio_list_stage *stage; \ while(1) { \ struct starpu_rbtree_node *next; \ if (!node) \ /* Tree is empty */ \ return 0; \ stage = ENAME##_node_to_list_stage(node); \ if (!ENAME##_list_empty(&stage->list)) \ break; \ /* Empty list, skip to next tree entry */ \ next = starpu_rbtree_next(node); \ /* drop it if not 0-prio */ \ if (stage->prio != 0) \ { \ starpu_rbtree_remove(&priolist->tree, node); \ free(stage); \ } \ node = next; \ } \ *pnode = node; \ *pstage = stage; \ return 1; \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_get_prev_nonempty_stage(struct ENAME##_prio_list *priolist, struct starpu_rbtree_node *node, struct starpu_rbtree_node **pnode, struct ENAME##_prio_list_stage **pstage) \ { \ struct ENAME##_prio_list_stage *stage; \ while(1) { \ struct starpu_rbtree_node *prev; \ if (!node) \ /* Tree is empty */ \ return 0; \ stage = ENAME##_node_to_list_stage(node); \ if (!ENAME##_list_empty(&stage->list)) \ break; \ /* Empty list, skip to prev tree entry */ \ prev = starpu_rbtree_prev(node); \ /* drop it if not 0-prio */ \ if (stage->prio != 0) \ { \ starpu_rbtree_remove(&priolist->tree, node); \ free(stage); \ } \ node = prev; \ } \ *pnode = node; \ *pstage = stage; \ return 1; \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_get_first_nonempty_stage(struct ENAME##_prio_list *priolist, struct starpu_rbtree_node **pnode, struct ENAME##_prio_list_stage **pstage) \ { \ struct starpu_rbtree_node *node = starpu_rbtree_first(&priolist->tree); \ return ENAME##_prio_list_get_next_nonempty_stage(priolist, node, pnode, pstage); \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_get_last_nonempty_stage(struct ENAME##_prio_list *priolist, struct starpu_rbtree_node **pnode, struct ENAME##_prio_list_stage **pstage) \ { \ struct starpu_rbtree_node *node = starpu_rbtree_last(&priolist->tree); \ return ENAME##_prio_list_get_prev_nonempty_stage(priolist, node, pnode, pstage); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_front_highest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ struct ENAME *ret; \ if (!ENAME##_prio_list_get_first_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ ret = ENAME##_list_pop_front(&stage->list); \ ENAME##_prio_list_check_empty_stage(priolist, stage); \ return ret; \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_front_lowest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ struct ENAME *ret; \ if (!ENAME##_prio_list_get_last_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ ret = ENAME##_list_pop_front(&stage->list); \ ENAME##_prio_list_check_empty_stage(priolist, stage); \ return ret; \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_front_highest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ if (!ENAME##_prio_list_get_first_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ return ENAME##_list_front(&stage->list); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_front_lowest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ if (!ENAME##_prio_list_get_last_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ return ENAME##_list_front(&stage->list); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_back_highest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ struct ENAME *ret; \ if (!ENAME##_prio_list_get_first_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ ret = ENAME##_list_pop_back(&stage->list); \ ENAME##_prio_list_check_empty_stage(priolist, stage); \ return ret; \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_back_lowest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ struct ENAME *ret; \ if (!ENAME##_prio_list_get_last_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ ret = ENAME##_list_pop_back(&stage->list); \ ENAME##_prio_list_check_empty_stage(priolist, stage); \ return ret; \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_back_highest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ if (!ENAME##_prio_list_get_first_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ return ENAME##_list_back(&stage->list); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_back_lowest(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ if (!ENAME##_prio_list_get_last_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ return ENAME##_list_back(&stage->list); \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_push_prio_list_back(struct ENAME##_prio_list *priolist, struct ENAME##_prio_list *priolist_toadd) \ { \ struct starpu_rbtree_node *node_toadd, *tmp; \ starpu_rbtree_for_each_remove(&priolist_toadd->tree, node_toadd, tmp) { \ struct ENAME##_prio_list_stage *stage_toadd = ENAME##_node_to_list_stage(node_toadd); \ uintptr_t slot; \ struct starpu_rbtree_node *node = starpu_rbtree_lookup_slot(&priolist->tree, stage_toadd->prio, ENAME##_prio_list_cmp_fn, slot); \ if (node) \ { \ /* Catenate the lists */ \ if (!ENAME##_list_empty(&stage_toadd->list)) { \ struct ENAME##_prio_list_stage *stage = ENAME##_node_to_list_stage(node); \ ENAME##_list_push_list_back(&stage->list, &stage_toadd->list); \ free(node_toadd); \ priolist->empty = 0; \ } \ } \ else \ { \ if (!ENAME##_list_empty(&stage_toadd->list)) { \ /* Just move the node between the trees */ \ starpu_rbtree_insert_slot(&priolist->tree, slot, node_toadd); \ priolist->empty = 0; \ } \ else \ { \ /* Actually empty, don't bother moving the list */ \ free(node_toadd); \ } \ } \ } \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_ismember(const struct ENAME##_prio_list *priolist, const struct ENAME *e) \ { \ struct starpu_rbtree_node *node = starpu_rbtree_lookup(&priolist->tree, e->PRIOFIELD, ENAME##_prio_list_cmp_fn); \ if (node) { \ const struct ENAME##_prio_list_stage *stage = ENAME##_node_to_list_stage_const(node); \ return ENAME##_list_ismember(&stage->list, e); \ } \ return 0; \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_begin(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ if (!ENAME##_prio_list_get_first_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ return ENAME##_list_begin(&stage->list); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_end(struct ENAME##_prio_list *priolist STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_next(struct ENAME##_prio_list *priolist, const struct ENAME *i) \ { \ struct ENAME *next = ENAME##_list_next(i); \ if (next != ENAME##_list_end(NULL)) \ return next; \ struct starpu_rbtree_node *node = starpu_rbtree_lookup(&priolist->tree, i->PRIOFIELD, ENAME##_prio_list_cmp_fn); \ struct ENAME##_prio_list_stage *stage; \ node = starpu_rbtree_next(node); \ if (!ENAME##_prio_list_get_next_nonempty_stage(priolist, node, &node, &stage)) \ return NULL; \ return ENAME##_list_begin(&stage->list); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_last(struct ENAME##_prio_list *priolist) \ { \ struct starpu_rbtree_node *node; \ struct ENAME##_prio_list_stage *stage; \ if (!ENAME##_prio_list_get_last_nonempty_stage(priolist, &node, &stage)) \ return NULL; \ return ENAME##_list_last(&stage->list); \ } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_alpha(struct ENAME##_prio_list *priolist STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_prev(struct ENAME##_prio_list *priolist, const struct ENAME *i) \ { \ struct ENAME *next = ENAME##_list_prev(i); \ if (next != ENAME##_list_alpha(NULL)) \ return next; \ struct starpu_rbtree_node *node = starpu_rbtree_lookup(&priolist->tree, i->PRIOFIELD, ENAME##_prio_list_cmp_fn); \ struct ENAME##_prio_list_stage *stage; \ node = starpu_rbtree_prev(node); \ if (!ENAME##_prio_list_get_prev_nonempty_stage(priolist, node, &node, &stage)) \ return NULL; \ return ENAME##_list_last(&stage->list); \ } \ #else /* gdbinit can't recurse in a tree. Use a mere list in debugging mode. */ #define PRIO_LIST_CREATE_TYPE(ENAME, PRIOFIELD) \ struct ENAME##_prio_list { struct ENAME##_list list; }; \ PRIO_LIST_INLINE void ENAME##_prio_list_init(struct ENAME##_prio_list *priolist) \ { ENAME##_list_init(&(priolist)->list); } \ PRIO_LIST_INLINE void ENAME##_prio_list_deinit(struct ENAME##_prio_list *priolist) \ { (void) (priolist); /* ENAME##_list_deinit(&(priolist)->list); */ } \ PRIO_LIST_INLINE void ENAME##_prio_list_push_back(struct ENAME##_prio_list *priolist, struct ENAME *e) \ { \ struct ENAME *cur; \ for (cur = ENAME##_list_begin(&(priolist)->list); \ cur != ENAME##_list_end(&(priolist)->list); \ cur = ENAME##_list_next(cur)) \ if ((e)->PRIOFIELD > cur->PRIOFIELD) \ break; \ if (cur == ENAME##_list_end(&(priolist)->list)) \ ENAME##_list_push_back(&(priolist)->list, (e)); \ else \ ENAME##_list_insert_before(&(priolist)->list, (e), cur); \ } \ PRIO_LIST_INLINE void ENAME##_prio_list_push_front(struct ENAME##_prio_list *priolist, struct ENAME *e) \ { \ struct ENAME *cur; \ for (cur = ENAME##_list_begin(&(priolist)->list); \ cur != ENAME##_list_end(&(priolist)->list); \ cur = ENAME##_list_next(cur)) \ if ((e)->PRIOFIELD >= cur->PRIOFIELD) \ break; \ if (cur == ENAME##_list_end(&(priolist)->list)) \ ENAME##_list_push_back(&(priolist)->list, (e)); \ else \ ENAME##_list_insert_before(&(priolist)->list, (e), cur); \ } \ PRIO_LIST_INLINE int ENAME##_prio_list_empty(const struct ENAME##_prio_list *priolist) \ { return ENAME##_list_empty(&(priolist)->list); } \ PRIO_LIST_INLINE void ENAME##_prio_list_erase(struct ENAME##_prio_list *priolist, struct ENAME *e) \ { ENAME##_list_erase(&(priolist)->list, (e)); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_front_highest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_pop_front(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_front_lowest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_pop_front(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_back_highest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_pop_back(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_pop_back_lowest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_pop_back(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_front_highest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_front(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_front_lowest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_front(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_back_highest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_back(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_back_lowest(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_back(&(priolist)->list); } \ PRIO_LIST_INLINE void ENAME##_prio_list_push_prio_list_back(struct ENAME##_prio_list *priolist, struct ENAME##_prio_list *priolist_toadd) \ { ENAME##_list_push_list_back(&(priolist)->list, &(priolist_toadd)->list); } \ PRIO_LIST_INLINE int ENAME##_prio_list_ismember(const struct ENAME##_prio_list *priolist, const struct ENAME *e) \ { return ENAME##_list_ismember(&(priolist)->list, (e)); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_begin(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_begin(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_end(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_end(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_next(struct ENAME##_prio_list *priolist STARPU_ATTRIBUTE_UNUSED, const struct ENAME *i) \ { return ENAME##_list_next(i); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_last(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_last(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_alpha(struct ENAME##_prio_list *priolist) \ { return ENAME##_list_alpha(&(priolist)->list); } \ PRIO_LIST_INLINE struct ENAME *ENAME##_prio_list_prev(struct ENAME##_prio_list *priolist STARPU_ATTRIBUTE_UNUSED, const struct ENAME *i) \ { return ENAME##_list_prev(i); } \ #endif #endif // __PRIO_LIST_H__ starpu-1.3.9+dfsg/src/common/rbtree.c000066400000000000000000000337111413463044200174750ustar00rootroot00000000000000/* * Copyright (c) 2010, 2012 Richard Braun. * 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 AUTHOR ``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 AUTHOR 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. */ #include #include #include #define unlikely(expr) __builtin_expect(!!(expr), 0) /* * Return the index of a node in the children array of its parent. * * The parent parameter must not be null, and must be the parent of the * given node. */ static inline int starpu_rbtree_index(const struct starpu_rbtree_node *node, const struct starpu_rbtree_node *parent) { assert(parent != NULL); assert((node == NULL) || (starpu_rbtree_parent(node) == parent)); if (parent->children[STARPU_RBTREE_LEFT] == node) return STARPU_RBTREE_LEFT; assert(parent->children[STARPU_RBTREE_RIGHT] == node); return STARPU_RBTREE_RIGHT; } /* * Return the color of a node. */ static inline int starpu_rbtree_color(const struct starpu_rbtree_node *node) { return node->parent & STARPU_RBTREE_COLOR_MASK; } /* * Return true if the node is red. */ static inline int starpu_rbtree_is_red(const struct starpu_rbtree_node *node) { return starpu_rbtree_color(node) == STARPU_RBTREE_COLOR_RED; } /* * Return true if the node is black. */ static inline int starpu_rbtree_is_black(const struct starpu_rbtree_node *node) { return starpu_rbtree_color(node) == STARPU_RBTREE_COLOR_BLACK; } /* * Set the parent of a node, retaining its current color. */ static inline void starpu_rbtree_set_parent(struct starpu_rbtree_node *node, struct starpu_rbtree_node *parent) { assert(starpu_rbtree_check_alignment(node)); assert(starpu_rbtree_check_alignment(parent)); node->parent = (uintptr_t)parent | (node->parent & STARPU_RBTREE_COLOR_MASK); } /* * Set the color of a node, retaining its current parent. */ static inline void starpu_rbtree_set_color(struct starpu_rbtree_node *node, int color) { assert((color & ~STARPU_RBTREE_COLOR_MASK) == 0); node->parent = (node->parent & STARPU_RBTREE_PARENT_MASK) | color; } /* * Set the color of a node to red, retaining its current parent. */ static inline void starpu_rbtree_set_red(struct starpu_rbtree_node *node) { starpu_rbtree_set_color(node, STARPU_RBTREE_COLOR_RED); } /* * Set the color of a node to black, retaining its current parent. */ static inline void starpu_rbtree_set_black(struct starpu_rbtree_node *node) { starpu_rbtree_set_color(node, STARPU_RBTREE_COLOR_BLACK); } /* * Perform a tree rotation, rooted at the given node. * * The direction parameter defines the rotation direction and is either * STARPU_RBTREE_LEFT or STARPU_RBTREE_RIGHT. */ static void starpu_rbtree_rotate(struct starpu_rbtree *tree, struct starpu_rbtree_node *node, int direction) { struct starpu_rbtree_node *parent, *rnode; int left, right; left = direction; right = 1 - left; parent = starpu_rbtree_parent(node); rnode = node->children[right]; node->children[right] = rnode->children[left]; if (rnode->children[left] != NULL) starpu_rbtree_set_parent(rnode->children[left], node); rnode->children[left] = node; starpu_rbtree_set_parent(rnode, parent); if (unlikely(parent == NULL)) tree->root = rnode; else parent->children[starpu_rbtree_index(node, parent)] = rnode; starpu_rbtree_set_parent(node, rnode); } void starpu_rbtree_insert_rebalance(struct starpu_rbtree *tree, struct starpu_rbtree_node *parent, int index, struct starpu_rbtree_node *node) { struct starpu_rbtree_node *grand_parent, *tmp; assert(starpu_rbtree_check_alignment(parent)); assert(starpu_rbtree_check_alignment(node)); node->parent = (uintptr_t)parent | STARPU_RBTREE_COLOR_RED; node->children[STARPU_RBTREE_LEFT] = NULL; node->children[STARPU_RBTREE_RIGHT] = NULL; if (unlikely(parent == NULL)) tree->root = node; else parent->children[index] = node; for (;;) { struct starpu_rbtree_node *uncle; int left, right; if (parent == NULL) { starpu_rbtree_set_black(node); break; } if (starpu_rbtree_is_black(parent)) break; grand_parent = starpu_rbtree_parent(parent); assert(grand_parent != NULL); left = starpu_rbtree_index(parent, grand_parent); right = 1 - left; uncle = grand_parent->children[right]; /* * Uncle is red. Flip colors and repeat at grand parent. */ if ((uncle != NULL) && starpu_rbtree_is_red(uncle)) { starpu_rbtree_set_black(uncle); starpu_rbtree_set_black(parent); starpu_rbtree_set_red(grand_parent); node = grand_parent; parent = starpu_rbtree_parent(node); continue; } /* * Node is the right child of its parent. Rotate left at parent. */ if (parent->children[right] == node) { starpu_rbtree_rotate(tree, parent, left); tmp = node; node = parent; parent = tmp; } /* * Node is the left child of its parent. Handle colors, rotate right * at grand parent, and leave. */ starpu_rbtree_set_black(parent); starpu_rbtree_set_red(grand_parent); starpu_rbtree_rotate(tree, grand_parent, right); break; } assert(starpu_rbtree_is_black(tree->root)); } void starpu_rbtree_remove(struct starpu_rbtree *tree, struct starpu_rbtree_node *node) { struct starpu_rbtree_node *child, *parent, *brother; int color, left, right; if (node->children[STARPU_RBTREE_LEFT] == NULL) child = node->children[STARPU_RBTREE_RIGHT]; else if (node->children[STARPU_RBTREE_RIGHT] == NULL) child = node->children[STARPU_RBTREE_LEFT]; else { struct starpu_rbtree_node *successor; /* * Two-children case: replace the node with its successor. */ successor = node->children[STARPU_RBTREE_RIGHT]; while (successor->children[STARPU_RBTREE_LEFT] != NULL) successor = successor->children[STARPU_RBTREE_LEFT]; color = starpu_rbtree_color(successor); child = successor->children[STARPU_RBTREE_RIGHT]; parent = starpu_rbtree_parent(node); if (unlikely(parent == NULL)) tree->root = successor; else parent->children[starpu_rbtree_index(node, parent)] = successor; parent = starpu_rbtree_parent(successor); /* * Set parent directly to keep the original color. */ successor->parent = node->parent; successor->children[STARPU_RBTREE_LEFT] = node->children[STARPU_RBTREE_LEFT]; starpu_rbtree_set_parent(successor->children[STARPU_RBTREE_LEFT], successor); if (node == parent) parent = successor; else { successor->children[STARPU_RBTREE_RIGHT] = node->children[STARPU_RBTREE_RIGHT]; starpu_rbtree_set_parent(successor->children[STARPU_RBTREE_RIGHT], successor); parent->children[STARPU_RBTREE_LEFT] = child; if (child != NULL) starpu_rbtree_set_parent(child, parent); } goto update_color; } /* * Node has at most one child. */ color = starpu_rbtree_color(node); parent = starpu_rbtree_parent(node); if (child != NULL) starpu_rbtree_set_parent(child, parent); if (unlikely(parent == NULL)) tree->root = child; else parent->children[starpu_rbtree_index(node, parent)] = child; /* * The node has been removed, update the colors. The child pointer can * be null, in which case it is considered a black leaf. */ update_color: if (color == STARPU_RBTREE_COLOR_RED) return; for (;;) { if ((child != NULL) && starpu_rbtree_is_red(child)) { starpu_rbtree_set_black(child); break; } if (parent == NULL) break; left = starpu_rbtree_index(child, parent); right = 1 - left; brother = parent->children[right]; /* * Brother is red. Recolor and rotate left at parent so that brother * becomes black. */ if (starpu_rbtree_is_red(brother)) { starpu_rbtree_set_black(brother); starpu_rbtree_set_red(parent); starpu_rbtree_rotate(tree, parent, left); brother = parent->children[right]; } /* * Brother has no red child. Recolor and repeat at parent. */ if (((brother->children[STARPU_RBTREE_LEFT] == NULL) || starpu_rbtree_is_black(brother->children[STARPU_RBTREE_LEFT])) && ((brother->children[STARPU_RBTREE_RIGHT] == NULL) || starpu_rbtree_is_black(brother->children[STARPU_RBTREE_RIGHT]))) { starpu_rbtree_set_red(brother); child = parent; parent = starpu_rbtree_parent(child); continue; } /* * Brother's right child is black. Recolor and rotate right at brother. */ if ((brother->children[right] == NULL) || starpu_rbtree_is_black(brother->children[right])) { starpu_rbtree_set_black(brother->children[left]); starpu_rbtree_set_red(brother); starpu_rbtree_rotate(tree, brother, right); brother = parent->children[right]; } /* * Brother's left child is black. Exchange parent and brother colors * (we already know brother is black), set brother's right child black, * rotate left at parent and leave. */ starpu_rbtree_set_color(brother, starpu_rbtree_color(parent)); starpu_rbtree_set_black(parent); starpu_rbtree_set_black(brother->children[right]); starpu_rbtree_rotate(tree, parent, left); break; } assert((tree->root == NULL) || starpu_rbtree_is_black(tree->root)); } struct starpu_rbtree_node * starpu_rbtree_nearest(struct starpu_rbtree_node *parent, int index, int direction) { assert(starpu_rbtree_check_index(direction)); if (parent == NULL) return NULL; assert(starpu_rbtree_check_index(index)); if (index != direction) return parent; return starpu_rbtree_walk(parent, direction); } struct starpu_rbtree_node * starpu_rbtree_firstlast(const struct starpu_rbtree *tree, int direction) { struct starpu_rbtree_node *prev, *cur; assert(starpu_rbtree_check_index(direction)); prev = NULL; for (cur = tree->root; cur != NULL; cur = cur->children[direction]) prev = cur; return prev; } struct starpu_rbtree_node * starpu_rbtree_walk(struct starpu_rbtree_node *node, int direction) { int left, right; assert(starpu_rbtree_check_index(direction)); left = direction; right = 1 - left; if (node == NULL) return NULL; if (node->children[left] != NULL) { node = node->children[left]; while (node->children[right] != NULL) node = node->children[right]; } else { for (;;) { struct starpu_rbtree_node *parent; int index; parent = starpu_rbtree_parent(node); if (parent == NULL) return NULL; index = starpu_rbtree_index(node, parent); node = parent; if (index == right) break; } } return node; } /* * Return the left-most deepest child node of the given node. */ static struct starpu_rbtree_node * starpu_rbtree_find_deepest(struct starpu_rbtree_node *node) { struct starpu_rbtree_node *parent; assert(node != NULL); for (;;) { parent = node; node = node->children[STARPU_RBTREE_LEFT]; if (node == NULL) { node = parent->children[STARPU_RBTREE_RIGHT]; if (node == NULL) return parent; } } } struct starpu_rbtree_node * starpu_rbtree_postwalk_deepest(const struct starpu_rbtree *tree) { struct starpu_rbtree_node *node; node = tree->root; if (node == NULL) return NULL; return starpu_rbtree_find_deepest(node); } struct starpu_rbtree_node * starpu_rbtree_postwalk_unlink(struct starpu_rbtree_node *node) { struct starpu_rbtree_node *parent; int index; if (node == NULL) return NULL; assert(node->children[STARPU_RBTREE_LEFT] == NULL); assert(node->children[STARPU_RBTREE_RIGHT] == NULL); parent = starpu_rbtree_parent(node); if (parent == NULL) return NULL; index = starpu_rbtree_index(node, parent); parent->children[index] = NULL; node = parent->children[STARPU_RBTREE_RIGHT]; if (node == NULL) return parent; return starpu_rbtree_find_deepest(node); } starpu-1.3.9+dfsg/src/common/rbtree.h000066400000000000000000000300301413463044200174710ustar00rootroot00000000000000/* * Copyright (c) 2010, 2011 Richard Braun. * 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 AUTHOR ``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 AUTHOR 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. * * * Red-black tree. */ #ifndef _KERN_RBTREE_H #define _KERN_RBTREE_H /** @file */ #include #include #include #include #define MACRO_BEGIN ({ #define MACRO_END }) /* * Indexes of the left and right nodes in the children array of a node. */ #define STARPU_RBTREE_LEFT 0 #define STARPU_RBTREE_RIGHT 1 /** * Red-black node. */ struct starpu_rbtree_node; /** * Red-black tree. */ struct starpu_rbtree; /** * Static tree initializer. */ #define STARPU_RBTREE_INITIALIZER { NULL } #include "rbtree_i.h" /** * Initialize a tree. */ static inline void starpu_rbtree_init(struct starpu_rbtree *tree) { tree->root = NULL; } /** * Initialize a node. * * A node is in no tree when its parent points to itself. */ static inline void starpu_rbtree_node_init(struct starpu_rbtree_node *node) { assert(starpu_rbtree_check_alignment(node)); node->parent = (uintptr_t)node | STARPU_RBTREE_COLOR_RED; node->children[STARPU_RBTREE_LEFT] = NULL; node->children[STARPU_RBTREE_RIGHT] = NULL; } /* * Return true if node is in no tree. */ static inline int starpu_rbtree_node_unlinked(const struct starpu_rbtree_node *node) { return starpu_rbtree_parent(node) == node; } /** * Macro that evaluates to the address of the structure containing the * given node based on the given type and member. */ #define starpu_rbtree_entry(node, type, member) structof(node, type, member) /** * Return true if tree is empty. */ static inline int starpu_rbtree_empty(const struct starpu_rbtree *tree) { return tree->root == NULL; } /** * Look up a node in a tree. * * Note that implementing the lookup algorithm as a macro gives two benefits: * First, it avoids the overhead of a callback function. Next, the type of the * cmp_fn parameter isn't rigid. The only guarantee offered by this * implementation is that the key parameter is the first parameter given to * cmp_fn. This way, users can pass only the value they need for comparison * instead of e.g. allocating a full structure on the stack. * * See starpu_rbtree_insert(). */ #define starpu_rbtree_lookup(tree, key, cmp_fn) \ MACRO_BEGIN \ struct starpu_rbtree_node *___cur; \ int ___diff; \ \ ___cur = (tree)->root; \ \ while (___cur != NULL) { \ ___diff = cmp_fn(key, ___cur); \ \ if (___diff == 0) \ break; \ \ ___cur = ___cur->children[starpu_rbtree_d2i(___diff)]; \ } \ \ ___cur; \ MACRO_END /** * Look up a node or one of its nearest nodes in a tree. * * This macro essentially acts as starpu_rbtree_lookup() but if no entry matched * the key, an additional step is performed to obtain the next or previous * node, depending on the direction (left or right). * * The constraints that apply to the key parameter are the same as for * starpu_rbtree_lookup(). */ #define starpu_rbtree_lookup_nearest(tree, key, cmp_fn, dir) \ MACRO_BEGIN \ struct starpu_rbtree_node *___cur, *___prev; \ int ___diff, ___index; \ \ ___prev = NULL; \ ___index = -1; \ ___cur = (tree)->root; \ \ while (___cur != NULL) { \ ___diff = cmp_fn(key, ___cur); \ \ if (___diff == 0) \ break; \ \ ___prev = ___cur; \ ___index = starpu_rbtree_d2i(___diff); \ ___cur = ___cur->children[___index]; \ } \ \ if (___cur == NULL) \ ___cur = starpu_rbtree_nearest(___prev, ___index, dir); \ \ ___cur; \ MACRO_END /** * Insert a node in a tree. * * This macro performs a standard lookup to obtain the insertion point of * the given node in the tree (it is assumed that the inserted node never * compares equal to any other entry in the tree) and links the node. It * then checks red-black rules violations, and rebalances the tree if * necessary. * * Unlike starpu_rbtree_lookup(), the cmp_fn parameter must compare two complete * entries, so it is suggested to use two different comparison inline * functions, such as myobj_cmp_lookup() and myobj_cmp_insert(). There is no * guarantee about the order of the nodes given to the comparison function. * * See starpu_rbtree_lookup(). */ #define starpu_rbtree_insert(tree, node, cmp_fn) \ MACRO_BEGIN \ struct starpu_rbtree_node *___cur, *___prev; \ int ___diff, ___index; \ \ ___prev = NULL; \ ___index = -1; \ ___cur = (tree)->root; \ \ while (___cur != NULL) { \ ___diff = cmp_fn(node, ___cur); \ assert(___diff != 0); \ ___prev = ___cur; \ ___index = starpu_rbtree_d2i(___diff); \ ___cur = ___cur->children[___index]; \ } \ \ starpu_rbtree_insert_rebalance(tree, ___prev, ___index, node); \ MACRO_END /** * Look up a node/slot pair in a tree. * * This macro essentially acts as starpu_rbtree_lookup() but in addition to a node, * it also returns a slot, which identifies an insertion point in the tree. * If the returned node is null, the slot can be used by starpu_rbtree_insert_slot() * to insert without the overhead of an additional lookup. The slot is a * simple uintptr_t integer. * * The constraints that apply to the key parameter are the same as for * starpu_rbtree_lookup(). */ #define starpu_rbtree_lookup_slot(tree, key, cmp_fn, slot) \ MACRO_BEGIN \ struct starpu_rbtree_node *___cur, *___prev; \ int ___diff, ___index; \ \ ___prev = NULL; \ ___index = 0; \ ___cur = (tree)->root; \ \ while (___cur != NULL) { \ ___diff = cmp_fn(key, ___cur); \ \ if (___diff == 0) \ break; \ \ ___prev = ___cur; \ ___index = starpu_rbtree_d2i(___diff); \ ___cur = ___cur->children[___index]; \ } \ \ (slot) = starpu_rbtree_slot(___prev, ___index); \ ___cur; \ MACRO_END /** * Insert a node at an insertion point in a tree. * * This macro essentially acts as starpu_rbtree_insert() except that it doesn't * obtain the insertion point with a standard lookup. The insertion point * is obtained by calling starpu_rbtree_lookup_slot(). In addition, the new node * must not compare equal to an existing node in the tree (i.e. the slot * must denote a null node). */ static inline void starpu_rbtree_insert_slot(struct starpu_rbtree *tree, uintptr_t slot, struct starpu_rbtree_node *node) { struct starpu_rbtree_node *parent; int index; parent = starpu_rbtree_slot_parent(slot); index = starpu_rbtree_slot_index(slot); starpu_rbtree_insert_rebalance(tree, parent, index, node); } /** * Remove a node from a tree. * * After completion, the node is stale. */ void starpu_rbtree_remove(struct starpu_rbtree *tree, struct starpu_rbtree_node *node); /** * Return the first node of a tree. */ /* TODO: optimize by maintaining the first node of the tree */ #define starpu_rbtree_first(tree) starpu_rbtree_firstlast(tree, STARPU_RBTREE_LEFT) /** * Return the last node of a tree. */ /* TODO: optimize by maintaining the first node of the tree */ /* TODO: could be useful to optimize the case when the key being inserted is * bigger that the biggest node */ #define starpu_rbtree_last(tree) starpu_rbtree_firstlast(tree, STARPU_RBTREE_RIGHT) /** * Return the node previous to the given node. */ #define starpu_rbtree_prev(node) starpu_rbtree_walk(node, STARPU_RBTREE_LEFT) /** * Return the node next to the given node. */ #define starpu_rbtree_next(node) starpu_rbtree_walk(node, STARPU_RBTREE_RIGHT) /** * Forge a loop to process all nodes of a tree, removing them when visited. * * This macro can only be used to destroy a tree, so that the resources used * by the entries can be released by the user. It basically removes all nodes * without doing any color checking. * * After completion, all nodes and the tree root member are stale. */ #define starpu_rbtree_for_each_remove(tree, node, tmp) \ for (node = starpu_rbtree_postwalk_deepest(tree), \ tmp = starpu_rbtree_postwalk_unlink(node); \ node != NULL; \ node = tmp, tmp = starpu_rbtree_postwalk_unlink(node)) \ #endif /* _KERN_RBTREE_H */ starpu-1.3.9+dfsg/src/common/rbtree_i.h000066400000000000000000000142201413463044200200040ustar00rootroot00000000000000/* * Copyright (c) 2010, 2011 Richard Braun. * 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 AUTHOR ``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 AUTHOR 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 _KERN_RBTREE_I_H #define _KERN_RBTREE_I_H #include /** @file */ /** * Red-black node structure. * * To reduce the number of branches and the instruction cache footprint, * the left and right child pointers are stored in an array, and the symmetry * of most tree operations is exploited by using left/right variables when * referring to children. * * In addition, this implementation assumes that all nodes are 4-byte aligned, * so that the least significant bit of the parent member can be used to store * the color of the node. This is true for all modern 32 and 64 bits * architectures, as long as the nodes aren't embedded in structures with * special alignment constraints such as member packing. */ struct starpu_rbtree_node { uintptr_t parent; struct starpu_rbtree_node *children[2]; }; /** * Red-black tree structure. */ struct starpu_rbtree { struct starpu_rbtree_node *root; }; /** * Masks applied on the parent member of a node to obtain either the * color or the parent address. */ #define STARPU_RBTREE_COLOR_MASK ((uintptr_t) 0x1) #define STARPU_RBTREE_PARENT_MASK (~((uintptr_t) 0x3)) /** * Node colors. */ #define STARPU_RBTREE_COLOR_RED 0 #define STARPU_RBTREE_COLOR_BLACK 1 /** * Masks applied on slots to obtain either the child index or the parent * address. */ #define STARPU_RBTREE_SLOT_INDEX_MASK ((uintptr_t) 0x1) #define STARPU_RBTREE_SLOT_PARENT_MASK (~STARPU_RBTREE_SLOT_INDEX_MASK) /** * Return true if the given pointer is suitably aligned. */ static inline int starpu_rbtree_check_alignment(const struct starpu_rbtree_node *node) { return ((uintptr_t)node & (~STARPU_RBTREE_PARENT_MASK)) == 0; } /** * Return true if the given index is a valid child index. */ static inline int starpu_rbtree_check_index(int index) { return index == (index & 1); } /** * Convert the result of a comparison into an index in the children array * (0 or 1). * * This function is mostly used when looking up a node. */ static inline int starpu_rbtree_d2i(int diff) { return !(diff <= 0); } /** * Return the parent of a node. */ static inline struct starpu_rbtree_node * starpu_rbtree_parent(const struct starpu_rbtree_node *node) { return (struct starpu_rbtree_node *)(node->parent & STARPU_RBTREE_PARENT_MASK); } /** * Translate an insertion point into a slot. */ static inline uintptr_t starpu_rbtree_slot(struct starpu_rbtree_node *parent, int index) { assert(starpu_rbtree_check_alignment(parent)); assert(starpu_rbtree_check_index(index)); return (uintptr_t)parent | index; } /** * Extract the parent address from a slot. */ static inline struct starpu_rbtree_node * starpu_rbtree_slot_parent(uintptr_t slot) { return (struct starpu_rbtree_node *)(slot & STARPU_RBTREE_SLOT_PARENT_MASK); } /** * Extract the index from a slot. */ static inline int starpu_rbtree_slot_index(uintptr_t slot) { return slot & STARPU_RBTREE_SLOT_INDEX_MASK; } /** * Insert a node in a tree, rebalancing it if necessary. * * The index parameter is the index in the children array of the parent where * the new node is to be inserted. It is ignored if the parent is null. * * This function is intended to be used by the starpu_rbtree_insert() macro only. */ void starpu_rbtree_insert_rebalance(struct starpu_rbtree *tree, struct starpu_rbtree_node *parent, int index, struct starpu_rbtree_node *node); /** * Return the previous or next node relative to a location in a tree. * * The parent and index parameters define the location, which can be empty. * The direction parameter is either STARPU_RBTREE_LEFT (to obtain the previous * node) or STARPU_RBTREE_RIGHT (to obtain the next one). */ struct starpu_rbtree_node * starpu_rbtree_nearest(struct starpu_rbtree_node *parent, int index, int direction); /** * Return the first or last node of a tree. * * The direction parameter is either STARPU_RBTREE_LEFT (to obtain the first node) * or STARPU_RBTREE_RIGHT (to obtain the last one). */ struct starpu_rbtree_node * starpu_rbtree_firstlast(const struct starpu_rbtree *tree, int direction); /** * Return the node next to, or previous to the given node. * * The direction parameter is either STARPU_RBTREE_LEFT (to obtain the previous node) * or STARPU_RBTREE_RIGHT (to obtain the next one). */ struct starpu_rbtree_node * starpu_rbtree_walk(struct starpu_rbtree_node *node, int direction); /** * Return the left-most deepest node of a tree, which is the starting point of * the postorder traversal performed by starpu_rbtree_for_each_remove(). */ struct starpu_rbtree_node * starpu_rbtree_postwalk_deepest(const struct starpu_rbtree *tree); /** * Unlink a node from its tree and return the next (right) node in postorder. */ struct starpu_rbtree_node * starpu_rbtree_postwalk_unlink(struct starpu_rbtree_node *node); #endif /* _KERN_RBTREE_I_H */ starpu-1.3.9+dfsg/src/common/rwlock.c000066400000000000000000000061711413463044200175130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/src/common/rwlock.h000066400000000000000000000031511413463044200175130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ /** 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.3.9+dfsg/src/common/starpu_spinlock.c000066400000000000000000000026711413463044200214330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; int ret; ret = starpu_pthread_mutexattr_init(&errcheck_attr); STARPU_CHECK_RETURN_VALUE(ret, "starpu_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.3.9+dfsg/src/common/starpu_spinlock.h000066400000000000000000000107521413463044200214370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/common/thread.c000066400000000000000000000675771413463044200175020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_DEBUG #include #endif #include #include #include #include #include #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_SIMGRID_MUTEX_H #include #include #elif defined(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_equal(starpu_pthread_t t1, starpu_pthread_t t2) { return t1 == t2; } starpu_pthread_t starpu_pthread_self(void) { #ifdef HAVE_SG_ACTOR_SELF return sg_actor_self(); #else return MSG_process_self(); #endif } int starpu_pthread_create_on(const char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr STARPU_ATTRIBUTE_UNUSED, void *(*start_routine) (void *), void *arg, starpu_sg_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 = _starpu_simgrid_get_host_by_name("MAIN"); void *tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); #ifdef HAVE_SG_ACTOR_INIT *thread= sg_actor_init(name, host); #ifdef HAVE_SG_ACTOR_SET_DATA sg_actor_set_data(*thread, tsd); #else sg_actor_data_set(*thread, tsd); #endif sg_actor_start(*thread, _starpu_simgrid_thread_start, 2, _args); #else *thread = MSG_process_create_with_arguments(name, _starpu_simgrid_thread_start, tsd, host, 2, _args); #if defined(HAVE_SG_ACTOR_DATA) || defined(HAVE_SG_ACTOR_GET_DATA) #ifdef HAVE_SG_ACTOR_SET_DATA sg_actor_set_data(*thread, tsd); #else sg_actor_data_set(*thread, tsd); #endif #endif #endif #if SIMGRID_VERSION >= 31500 && SIMGRID_VERSION != 31559 # ifdef HAVE_SG_ACTOR_REF sg_actor_ref(*thread); # else MSG_process_ref(*thread); # endif #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 SIMGRID_VERSION >= 31400 # ifdef STARPU_HAVE_SIMGRID_ACTOR_H sg_actor_join(thread, 1000000); # else MSG_process_join(thread, 1000000); # endif #if SIMGRID_VERSION >= 31500 && SIMGRID_VERSION != 31559 # ifdef HAVE_SG_ACTOR_REF sg_actor_unref(thread); # else MSG_process_unref(thread); # endif #endif #else starpu_sleep(1); #endif return 0; } int starpu_pthread_exit(void *retval STARPU_ATTRIBUTE_UNUSED) { #ifdef HAVE_SG_ACTOR_SELF sg_actor_kill(sg_actor_self()); #else MSG_process_kill(MSG_process_self()); #endif 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) { #ifdef STARPU_HAVE_SIMGRID_MUTEX_H *mutex = sg_mutex_init(); #else *mutex = xbt_mutex_init(); #endif return 0; } int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex) { if (*mutex) #ifdef STARPU_HAVE_SIMGRID_MUTEX_H sg_mutex_destroy(*mutex); #else xbt_mutex_destroy(*mutex); #endif 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 */ #ifdef STARPU_HAVE_SIMGRID_MUTEX_H sg_mutex_t new_mutex = sg_mutex_init(); #else xbt_mutex_t new_mutex = xbt_mutex_init(); #endif if (!*mutex) *mutex = new_mutex; else /* Somebody already initialized it while we were * calling sg_mutex_init, this one is now useless */ #ifdef STARPU_HAVE_SIMGRID_MUTEX_H sg_mutex_destroy(new_mutex); #else xbt_mutex_destroy(new_mutex); #endif } #ifdef STARPU_HAVE_SIMGRID_MUTEX_H sg_mutex_lock(*mutex); #else xbt_mutex_acquire(*mutex); #endif _STARPU_TRACE_MUTEX_LOCKED(); return 0; } int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex) { _STARPU_TRACE_UNLOCKING_MUTEX(); #ifdef STARPU_HAVE_SIMGRID_MUTEX_H sg_mutex_unlock(*mutex); #else xbt_mutex_release(*mutex); #endif _STARPU_TRACE_MUTEX_UNLOCKED(); return 0; } int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex) { int ret; _STARPU_TRACE_TRYLOCK_MUTEX(); #ifdef STARPU_HAVE_SIMGRID_MUTEX_H ret = sg_mutex_try_lock(*mutex); #elif defined(HAVE_XBT_MUTEX_TRY_ACQUIRE) || defined(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 && !defined(smpi_process_get_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_SG_ACTOR_GET_DATA array = sg_actor_get_data(sg_actor_self()); #elif defined(HAVE_SG_ACTOR_DATA) array = sg_actor_data(sg_actor_self()); #else #if defined(HAVE_SMPI_PROCESS_SET_USER_DATA) || defined(smpi_process_get_user_data) #if defined(HAVE_MSG_PROCESS_SELF_NAME) || defined(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 || !strcmp(process_name, "wait for mpi transfer") || (!strcmp(process_name, "main") && _starpu_simgrid_running_smpi())) /* Special-case the SMPI process */ array = smpi_process_get_user_data(); else #endif array = MSG_process_get_data(MSG_process_self()); #endif array[key] = (void*) pointer; return 0; } void* starpu_pthread_getspecific(starpu_pthread_key_t key) { void **array; #ifdef HAVE_SG_ACTOR_GET_DATA array = sg_actor_get_data(sg_actor_self()); #elif defined(HAVE_SG_ACTOR_DATA) array = sg_actor_data(sg_actor_self()); #else #if defined(HAVE_SMPI_PROCESS_SET_USER_DATA) || defined(smpi_process_get_user_data) #if defined(HAVE_MSG_PROCESS_SELF_NAME) || defined(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 || !strcmp(process_name, "wait for mpi transfer") || (!strcmp(process_name, "main") && _starpu_simgrid_running_smpi())) /* Special-case the SMPI processes */ array = smpi_process_get_user_data(); else #endif array = MSG_process_get_data(MSG_process_self()); #endif 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) { #ifdef STARPU_HAVE_SIMGRID_COND_H *cond = sg_cond_init(); #else *cond = xbt_cond_init(); #endif 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 */ #ifdef STARPU_HAVE_SIMGRID_COND_H sg_cond_t new_cond = sg_cond_init(); #else xbt_cond_t new_cond = xbt_cond_init(); #endif if (!*cond) *cond = new_cond; else /* Somebody already initialized it while we were * calling xbt_cond_init, this one is now useless */ #ifdef STARPU_HAVE_SIMGRID_COND_H sg_cond_destroy(new_cond); #else xbt_cond_destroy(new_cond); #endif } } int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond) { _starpu_pthread_cond_auto_init(cond); #ifdef STARPU_HAVE_SIMGRID_COND_H sg_cond_notify_one(*cond); #else xbt_cond_signal(*cond); #endif return 0; } int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond) { _starpu_pthread_cond_auto_init(cond); #ifdef STARPU_HAVE_SIMGRID_COND_H sg_cond_notify_all(*cond); #else xbt_cond_broadcast(*cond); #endif 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); #ifdef STARPU_HAVE_SIMGRID_COND_H sg_cond_wait(*cond, *mutex); #else xbt_cond_wait(*cond, *mutex); #endif _STARPU_TRACE_COND_WAIT_END(); return 0; } int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime) { #if SIMGRID_VERSION >= 31800 struct timespec now, delta; double delay; int ret = 0; _starpu_clock_gettime(&now); delta.tv_sec = abstime->tv_sec - now.tv_sec; delta.tv_nsec = abstime->tv_nsec - now.tv_nsec; delay = (double) delta.tv_sec + (double) delta.tv_nsec / 1000000000.; _STARPU_TRACE_COND_WAIT_BEGIN(); _starpu_pthread_cond_auto_init(cond); #ifdef STARPU_HAVE_SIMGRID_COND_H ret = sg_cond_wait_for(*cond, *mutex, delay) ? ETIMEDOUT : 0; #else ret = xbt_cond_timedwait(*cond, *mutex, delay) ? ETIMEDOUT : 0; #endif _STARPU_TRACE_COND_WAIT_END(); return ret; #else STARPU_ASSERT_MSG(0, "simgrid version is too old for this"); #endif } int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond) { if (*cond) #ifdef STARPU_HAVE_SIMGRID_COND_H sg_cond_destroy(*cond); #else xbt_cond_destroy(*cond); #endif return 0; } /* TODO: use rwlocks * https://gforge.inria.fr/tracker/index.php?func=detail&aid=17213&group_id=12&atid=165 */ 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; } #ifdef STARPU_HAVE_SIMGRID_BARRIER_H int starpu_pthread_barrier_init(starpu_pthread_barrier_t *restrict barrier, const starpu_pthread_barrierattr_t *restrict attr STARPU_ATTRIBUTE_UNUSED, unsigned count) { *barrier = sg_barrier_init(count); return 0; } int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier) { if (*barrier) sg_barrier_destroy(*barrier); return 0; } int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier) { int ret; _STARPU_TRACE_BARRIER_WAIT_BEGIN(); ret = sg_barrier_wait(*barrier); _STARPU_TRACE_BARRIER_WAIT_END(); return ret; } #elif defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) || defined(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) { int ret; _STARPU_TRACE_BARRIER_WAIT_BEGIN(); ret = xbt_barrier_wait(*barrier); _STARPU_TRACE_BARRIER_WAIT_END(); return ret; } #endif /* defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) */ int starpu_pthread_queue_init(starpu_pthread_queue_t *q) { STARPU_PTHREAD_MUTEX_INIT(&q->mutex, NULL); q->queue = NULL; q->allocqueue = 0; q->nqueue = 0; return 0; } int starpu_pthread_wait_init(starpu_pthread_wait_t *w) { STARPU_PTHREAD_MUTEX_INIT(&w->mutex, NULL); STARPU_PTHREAD_COND_INIT(&w->cond, NULL); w->block = 1; return 0; } int starpu_pthread_queue_register(starpu_pthread_wait_t *w, starpu_pthread_queue_t *q) { STARPU_PTHREAD_MUTEX_LOCK(&q->mutex); if (q->nqueue == q->allocqueue) { /* Make room for the new waiter */ unsigned newalloc; newalloc = q->allocqueue * 2; if (!newalloc) newalloc = 1; _STARPU_REALLOC(q->queue, newalloc * sizeof(*(q->queue))); q->allocqueue = newalloc; } q->queue[q->nqueue++] = w; STARPU_PTHREAD_MUTEX_UNLOCK(&q->mutex); return 0; } int starpu_pthread_queue_unregister(starpu_pthread_wait_t *w, starpu_pthread_queue_t *q) { unsigned i; STARPU_PTHREAD_MUTEX_LOCK(&q->mutex); for (i = 0; i < q->nqueue; i++) { if (q->queue[i] == w) { memmove(&q->queue[i], &q->queue[i+1], (q->nqueue - i - 1) * sizeof(*(q->queue))); break; } } STARPU_ASSERT(i < q->nqueue); q->nqueue--; STARPU_PTHREAD_MUTEX_UNLOCK(&q->mutex); return 0; } int starpu_pthread_wait_reset(starpu_pthread_wait_t *w) { STARPU_PTHREAD_MUTEX_LOCK(&w->mutex); w->block = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&w->mutex); return 0; } int starpu_pthread_wait_wait(starpu_pthread_wait_t *w) { STARPU_PTHREAD_MUTEX_LOCK(&w->mutex); while (w->block == 1) STARPU_PTHREAD_COND_WAIT(&w->cond, &w->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&w->mutex); return 0; } /* pthread_cond_timedwait not yet available on windows, but we don't run simgrid there anyway */ #ifdef STARPU_SIMGRID int starpu_pthread_wait_timedwait(starpu_pthread_wait_t *w, const struct timespec *abstime) { STARPU_PTHREAD_MUTEX_LOCK(&w->mutex); while (w->block == 1) STARPU_PTHREAD_COND_TIMEDWAIT(&w->cond, &w->mutex, abstime); STARPU_PTHREAD_MUTEX_UNLOCK(&w->mutex); return 0; } #endif int starpu_pthread_queue_signal(starpu_pthread_queue_t *q) { starpu_pthread_wait_t *w; STARPU_PTHREAD_MUTEX_LOCK(&q->mutex); if (q->nqueue) { /* TODO: better try to wake a sleeping one if possible */ w = q->queue[0]; STARPU_PTHREAD_MUTEX_LOCK(&w->mutex); w->block = 0; STARPU_PTHREAD_COND_SIGNAL(&w->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&w->mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&q->mutex); return 0; } int starpu_pthread_queue_broadcast(starpu_pthread_queue_t *q) { unsigned i; starpu_pthread_wait_t *w; STARPU_PTHREAD_MUTEX_LOCK(&q->mutex); for (i = 0; i < q->nqueue; i++) { w = q->queue[i]; STARPU_PTHREAD_MUTEX_LOCK(&w->mutex); w->block = 0; STARPU_PTHREAD_COND_SIGNAL(&w->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&w->mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&q->mutex); return 0; } int starpu_pthread_wait_destroy(starpu_pthread_wait_t *w) { STARPU_PTHREAD_MUTEX_LOCK(&w->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&w->mutex); STARPU_PTHREAD_MUTEX_DESTROY(&w->mutex); STARPU_PTHREAD_COND_DESTROY(&w->cond); return 0; } int starpu_pthread_queue_destroy(starpu_pthread_queue_t *q) { STARPU_ASSERT(!q->nqueue); STARPU_PTHREAD_MUTEX_LOCK(&q->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&q->mutex); STARPU_PTHREAD_MUTEX_DESTROY(&q->mutex); free(q->queue); return 0; } #endif /* STARPU_SIMGRID */ #if (defined(STARPU_SIMGRID) && !defined(STARPU_HAVE_SIMGRID_BARRIER_H) && !defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) && !defined(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 STARPU_ATTRIBUTE_UNUSED, 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) { return starpu_pthread_mutex_lock(mutex); } int starpu_pthread_mutex_unlock_sched(starpu_pthread_mutex_t *mutex) { return starpu_pthread_mutex_unlock(mutex); } int starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex) { return starpu_pthread_mutex_trylock(mutex); } #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 */ /* This avoids typical 10ms pauses when the application thread tries to submit tasks. */ while (1) { /* Tell releaser to wake us */ unsigned prev = STARPU_VAL_EXCHANGE(&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) */ #ifdef STARPU_SIMGRID int starpu_sem_destroy(starpu_sem_t *sem) { #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H sg_sem_destroy(*sem); #else MSG_sem_destroy(*sem); #endif return 0; } int starpu_sem_init(starpu_sem_t *sem, int pshared, unsigned value) { STARPU_ASSERT_MSG(pshared == 0, "pshared semaphores not supported under simgrid"); #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H *sem = sg_sem_init(value); #else *sem = MSG_sem_init(value); #endif return 0; } int starpu_sem_post(starpu_sem_t *sem) { #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H sg_sem_release(*sem); #else MSG_sem_release(*sem); #endif return 0; } int starpu_sem_wait(starpu_sem_t *sem) { #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H sg_sem_acquire(*sem); #else MSG_sem_acquire(*sem); #endif return 0; } int starpu_sem_trywait(starpu_sem_t *sem) { #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H if (sg_sem_would_block(*sem)) #else if (MSG_sem_would_block(*sem)) #endif return EAGAIN; starpu_sem_wait(sem); return 0; } int starpu_sem_getvalue(starpu_sem_t *sem, int *sval) { #if SIMGRID_VERSION > 31300 # ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H *sval = sg_sem_get_capacity(*sem); # else *sval = MSG_sem_get_capacity(*sem); # endif return 0; #else (void) sem; (void) sval; STARPU_ABORT_MSG("sigmrid up to 3.13 did not have working MSG_sem_get_capacity"); #endif } #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */ int starpu_sem_wait(starpu_sem_t *sem) { int ret; while((ret = sem_wait(sem)) == -1 && errno == EINTR) ; return ret; } int starpu_sem_trywait(starpu_sem_t *sem) { int ret; while((ret = sem_trywait(sem)) == -1 && errno == EINTR) ; return ret; } #endif starpu-1.3.9+dfsg/src/common/thread.h000066400000000000000000000104461413463044200174660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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. */ starpu_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.3.9+dfsg/src/common/timing.c000066400000000000000000000143411413463044200174770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #ifdef HAVE_SIMGRID_ENGINE_H #include #endif #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) { #ifdef HAVE_SIMGRID_GET_CLOCK double now = simgrid_get_clock(); #else double now = MSG_get_clock(); #endif 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) { ts->tv_sec = 0; ts->tv_nsec = 0; } #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 # ifdef HAVE_SIMGRID_GET_CLOCK return simgrid_get_clock()*1000000; # else return MSG_get_clock()*1000000; # endif #else struct timespec now; _starpu_clock_gettime(&now); return starpu_timing_timespec_to_us(&now); #endif } starpu-1.3.9+dfsg/src/common/timing.h000066400000000000000000000020671413463044200175060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include /** * _starpu_timing_init must be called prior to using any of these timing * functions. */ void _starpu_timing_init(void); void _starpu_clock_gettime(struct timespec *ts); #endif /* TIMING_H */ starpu-1.3.9+dfsg/src/common/uthash.h000066400000000000000000002066511413463044200175200ustar00rootroot00000000000000/* 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 /** @file */ #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=0,_hf_hashv=0; \ 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_MSG(!_out,"Cannot insert the same key twice"); \ } 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=0; \ 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 */ \ default: break; \ } \ 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; \ break; \ default: break; \ } \ \ /* 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; \ /* FALLTHRU */ \ case 2: hashv ^= _mur_key[1] << 8; \ /* FALLTHRU */ \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ /* FALLTHRU */ \ default: break; \ }; \ \ 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; \ /* FALLTHRU */ \ case 2: _mur_t |= _mur_key[1] << 8; \ /* FALLTHRU */ \ case 3: _mur_t |= _mur_key[0]; \ /* FALLTHRU */ \ default: break; \ } \ _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; \ /* FALLTHRU */ \ case 2: _mur_d |= _mur_key[1] << 8; \ /* FALLTHRU */ \ case 1: _mur_d |= _mur_key[0]; \ /* FALLTHRU */ \ default: break; \ } \ 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; \ /* FALLTHRU */ \ case 2: hashv ^= _mur_key[1] << 8; \ /* FALLTHRU */ \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ /* FALLTHRU */ \ default: break; \ } \ } else { \ switch(_mur_len) \ { \ case 3: _mur_d ^= _mur_key[2] << 16; \ /* FALLTHRU */ \ case 2: _mur_d ^= _mur_key[1] << 8; \ /* FALLTHRU */ \ case 1: _mur_d ^= _mur_key[0]; \ /* FALLTHRU */ \ case 0: hashv ^= (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ hashv *= _mur_m; \ /* FALLTHRU */ \ default: break; \ } \ } \ \ 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; \ /* FALLTHRU */ \ case 2: hashv ^= _mur_key[1] << 8; \ /* FALLTHRU */ \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ /* FALLTHRU */ \ default: break; \ } \ \ 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.3.9+dfsg/src/common/utils.c000066400000000000000000000351741413463044200173570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #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 = -1; while (s[0] == '/' && s[1] == '/') s++; 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 already exists and 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); } static int _strings_ncmp(const char *strings[], const char *str) { int pos = 0; while (strings[pos]) { if ((strlen(str) == strlen(strings[pos]) && strncasecmp(str, strings[pos], strlen(strings[pos])) == 0)) break; pos++; } if (strings[pos] == NULL) return -1; return pos; } int starpu_get_env_string_var_default(const char *str, const char *strings[], int defvalue) { int val; char *strval; strval = starpu_getenv(str); if (!strval) { val = defvalue; } else { val = _strings_ncmp(strings, strval); if (val < 0) { int i; _STARPU_MSG("\n"); _STARPU_MSG("Invalid value '%s' for environment variable '%s'\n", strval, str); _STARPU_MSG("Valid values are:\n"); for(i=0;strings[i]!=NULL;i++) _STARPU_MSG("\t%s\n",strings[i]); _STARPU_MSG("\n"); STARPU_ABORT(); } } return val; } 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]; } } int starpu_get_env_size_default(const char *str, int defval) { int val; char *strval; strval = starpu_getenv(str); if (!strval) { val = defval; } else { char *value = strdup(strval); if (value == NULL) _STARPU_ERROR("memory allocation failed\n"); remove_spaces(value); if (value[0] == '\0') { free(value); val = defval; } else { char *endptr = NULL; int mult = 1024; errno = 0; int v = (int)strtol(value, &endptr, 10); if (errno != 0) _STARPU_ERROR("could not parse environment variable '%s' with value '%s', strtol failed with error %s\n", str, value, 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' with value '%s' size suffix invalid\n", str, value); } } val = v*mult; free(value); } } return val; } void starpu_display_bindings(void) { #ifdef STARPU_HAVE_HWLOC int hwloc_ret = system("hwloc-ps -a -t -c"); if (hwloc_ret) { _STARPU_DISP("hwloc-ps returned %d\n", hwloc_ret); fflush(stderr); } fflush(stdout); #else _STARPU_DISP("hwloc not available to display bindings.\n"); #endif } starpu-1.3.9+dfsg/src/common/utils.h000066400000000000000000000167711413463044200173660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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_VALGRIND_YIELD() do { if (STARPU_RUNNING_ON_VALGRIND) sched_yield(); } while (0) #define STARPU_UYIELD() do { if (STARPU_RUNNING_ON_VALGRIND) sched_yield(); else _STARPU_UYIELD(); } while (0) #else #define STARPU_VALGRIND_YIELD() do { } while (0) #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) # define _STARPU_DEBUG_NO_HEADER(fmt, ...) do { if (!_starpu_silent) {fprintf(stderr, fmt , ## __VA_ARGS__); fflush(stderr); }} while(0) #else # define _STARPU_DEBUG(fmt, ...) do { } while (0) # define _STARPU_DEBUG_NO_HEADER(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", starpu_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", starpu_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", starpu_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) #ifdef _MSC_VER # if defined(__cplusplus) # define _STARPU_DECLTYPE(x) (decltype(x)) # else # define _STARPU_DECLTYPE(x) # endif #else # define _STARPU_DECLTYPE(x) (__typeof(x)) #endif #define _STARPU_MALLOC(ptr, size) do { ptr = _STARPU_DECLTYPE(ptr) malloc(size); STARPU_ASSERT_MSG(ptr != NULL || size == 0, "Cannot allocate %ld bytes\n", (long) (size)); } while (0) #define _STARPU_CALLOC(ptr, nmemb, size) do { ptr = _STARPU_DECLTYPE(ptr) calloc(nmemb, size); STARPU_ASSERT_MSG(ptr != NULL || size == 0, "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 || size == 0, "Cannot reallocate %ld bytes\n", (long) (size)); ptr = _STARPU_DECLTYPE(ptr) _new_ptr;} 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.3.9+dfsg/src/core/000077500000000000000000000000001413463044200155015ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/core/combined_workers.c000066400000000000000000000140631413463044200212050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; STARPU_ASSERT_MSG(new_workerid < STARPU_NMAXWORKERS, "Too many combined workers for parallel task execution. Please use configure option --enable-maxcpus to increase it beyond the current value %d", STARPU_MAXCPUS); config->topology.ncombinedworkers++; // fprintf(stderr, "COMBINED WORKERS "); // for (i = 0; i < nworkers; i++) // { // fprintf(stderr, "%d ", workerid_array[i]); // } // fprintf(stderr, "into worker %d\n", new_workerid); 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 } starpu_sched_ctx_add_combined_workers(&new_workerid, 1, STARPU_GLOBAL_SCHED_CTX); 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.3.9+dfsg/src/core/combined_workers.h000066400000000000000000000015161413463044200212110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #endif // __COMBINED_WORKERS_H__ starpu-1.3.9+dfsg/src/core/debug.c000066400000000000000000000064531413463044200167430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 int _starpu_debug #ifdef STARPU_DEBUG = 1 #else = 0 #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) static 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.3.9+dfsg/src/core/debug.h000066400000000000000000000221461413463044200167450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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, sizeof(__buf), "%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, sizeof(__buf), "%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, sizeof(__buf), "%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, sizeof(__buf), "%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.3.9+dfsg/src/core/dependencies/000077500000000000000000000000001413463044200201275ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/core/dependencies/cg.c000066400000000000000000000257201413463044200206720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; #ifdef STARPU_DEBUG list->deps = NULL; list->done = NULL; #endif 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) { #ifdef STARPU_DEBUG free(list->succ[id]->deps); free(list->succ[id]->done); #endif free(list->succ[id]); } } #ifdef STARPU_DYNAMIC_DEPS_SIZE free(list->succ); #endif #ifdef STARPU_DEBUG free(list->deps); free(list->done); #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->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; } void _starpu_notify_cg(void *pred STARPU_ATTRIBUTE_UNUSED, 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); /* Note: This looks racy to helgrind when the tasks are not * autoregenerated, since they then unsubcribe from the * completion group in parallel, thus decreasing ntags. This is * however not a problem since it means we will not reuse this * cg, and remaining will not be used, so a bogus value won't * hurt. */ 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; _starpu_spin_lock(&tag->lock); 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; /* This releases the lock */ _starpu_tag_set_ready(tag); } else _starpu_spin_unlock(&tag->lock); 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; #ifdef STARPU_DEBUG if (!j->task->regenerate) { unsigned i; /* Remove backward cg pointers for easier debugging */ if (job_successors->deps) { for (i = 0; i < job_successors->ndeps; i++) if (job_successors->deps[i] == cg) break; STARPU_ASSERT(i < job_successors->ndeps); job_successors->done[i] = 1; } if (cg->deps) { for (i = 0; i < cg->ndeps; i++) if (cg->deps[i] == pred) break; STARPU_ASSERT(i < cg->ndeps); cg->done[i] = 1; } } #endif 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(); } } } /* Called when a job has just started, so we can notify tasks which were waiting * only for this one when they can expect to start */ /* Note: in case of a tag, it must be already locked */ void _starpu_notify_job_ready_soon_cg(void *pred STARPU_ATTRIBUTE_UNUSED, struct _starpu_cg *cg, _starpu_notify_job_start_data *data) { STARPU_ASSERT(cg); if (cg->remaining == 1) { /* the group is to be completed */ switch (cg->cg_type) { case STARPU_CG_APPS: /* Not a task */ break; case STARPU_CG_TAG: { struct _starpu_cg_list *tag_successors; struct _starpu_tag *tag; tag = cg->succ.tag; tag_successors = &tag->tag_successors; /* Note: the tag is already locked by the * caller. */ if ((tag->state == STARPU_BLOCKED) && (tag_successors->ndeps == tag_successors->ndeps_completed + 1)) { /* This is to be ready */ _starpu_enforce_deps_notify_job_ready_soon(tag->job, data, 1); } break; } case STARPU_CG_TASK: { struct _starpu_cg_list *job_successors; struct _starpu_job *j; j = cg->succ.job; job_successors = &j->job_successors; if (job_successors->ndeps == job_successors->ndeps_completed + 1 && j->task->status == STARPU_TASK_BLOCKED_ON_TASK) { /* This is to be ready */ _starpu_enforce_deps_notify_job_ready_soon(j, data, 0); } 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(void *pred, 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); _starpu_notify_cg(pred, cg); _starpu_spin_lock(&successors->lock); } successors->terminated = 1; _starpu_spin_unlock(&successors->lock); } /* Called when a job has just started, so we can notify tasks which were waiting * only for this one when they can expect to start */ /* 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_job_start_cg_list(void *pred, struct _starpu_cg_list *successors, _starpu_notify_job_start_data *data) { 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_spin_unlock(&successors->lock); STARPU_ASSERT(cg); unsigned cg_type = cg->cg_type; 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_job_ready_soon_cg(pred, cg, data); if (cg_type == STARPU_CG_TAG) _starpu_spin_unlock(&cgtag->lock); _starpu_spin_lock(&successors->lock); } _starpu_spin_unlock(&successors->lock); } starpu-1.3.9+dfsg/src/core/dependencies/cg.h000066400000000000000000000104251413463044200206730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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 ? */ #ifdef STARPU_DEBUG /** Array of the notifications, size ndeps */ struct _starpu_cg **deps; /** Which ones have notified, size ndeps */ char *done; #endif /** 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 /** How many allocated items in succ */ unsigned succ_list_size; 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 { /** number of tags depended on */ unsigned ntags; /** number of remaining tags */ unsigned remaining; #ifdef STARPU_DEBUG unsigned ndeps; /** array of predecessors, size ndeps */ void **deps; /** which ones have notified, size ndeps */ char *done; #endif 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; }; typedef struct _starpu_notify_job_start_data _starpu_notify_job_start_data; void _starpu_notify_dependencies(struct _starpu_job *j); void _starpu_job_notify_start(struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch); void _starpu_job_notify_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data); 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(void *pred, struct _starpu_cg *cg); void _starpu_notify_cg_list(void *pred, struct _starpu_cg_list *successors); void _starpu_notify_job_start_cg_list(void *pred, struct _starpu_cg_list *successors, _starpu_notify_job_start_data *data); void _starpu_notify_task_dependencies(struct _starpu_job *j); void _starpu_notify_job_start_tasks(struct _starpu_job *j, _starpu_notify_job_start_data *data); #endif // __CG_H__ starpu-1.3.9+dfsg/src/core/dependencies/data_arbiter_concurrency.c000066400000000000000000000576771413463044200253540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 */ //#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 * - call _starpu_notify_arbitered_dependencies which does the following * - 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 (_starpu_submit_job_enforce_arbitered_deps): * * - 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; * * at acquire (_starpu_attempt_to_submit_arbitered_data_request): * - mutex_lock(&arbiter) * - try to take a reference on h * - on failure, record as waiting on h * - mutex_unlock(&arbiter); * - return 0 if succeeded, 1 if failed; */ static int _starpu_arbiter_filter_modes(int mode) { /* Do not care about some flags */ mode &= ~STARPU_COMMUTE; mode &= ~STARPU_SSEND; mode &= ~STARPU_LOCALITY; if (mode == STARPU_RW) mode = STARPU_W; return mode; } 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, *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 just one 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 mode = _starpu_arbiter_filter_modes(mode); 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(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 = 1; if ((handle->refcnt == 0) || (!(mode == STARPU_W) && (handle->current_mode == mode))) { /* TODO: Detect whether this is the end of a reduction phase etc. like in data_concurrency.c */ if (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->prio = j ? j->task->priority : 0; r->ready_data_callback = callback; r->argcb = argcb; _starpu_data_requester_prio_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) { struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); starpu_arbiter_t arbiter = descrs[buf].handle->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 = descrs[idx_buf_arbiter].handle; mode = descrs[idx_buf_arbiter].mode & ~STARPU_COMMUTE; mode = _starpu_arbiter_filter_modes(mode); STARPU_ASSERT_MSG(!(mode & STARPU_REDUX), "REDUX with arbiter is not implemented\n"); if (idx_buf_arbiter && (descrs[idx_buf_arbiter-1].handle == 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) || (!(mode == STARPU_W) && (handle->current_mode == mode))) { /* Got it */ handle->refcnt++; handle->busy_count++; if (mode != STARPU_R || handle->current_mode != mode) 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->prio = j->task->priority; r->ready_data_callback = NULL; r->argcb = NULL; /* store node in list */ _starpu_data_requester_prio_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 = descrs[idx_buf_cancel].handle; if (idx_buf_cancel && (descrs[idx_buf_cancel-1].handle == 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_prio_list_empty(&handle->arbitered_req_list)) { /* No waiter, just remove our reference */ _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->refcnt > 0); handle->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif if (_starpu_data_check_not_busy(handle)) /* Handle was even destroyed, don't unlock it. */ return; _starpu_spin_unlock(&handle->header_lock); return; } /* There is a waiter, remove our reference */ _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->refcnt > 0); handle->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; /* There should be at least one busy_count reference for the waiter * (thus we don't risk to see the handle disappear below) */ STARPU_ASSERT(handle->busy_count > 0); _starpu_spin_unlock(&handle->header_lock); /* Note: we may be putting back our own requests, so avoid looping by * extracting the list */ struct _starpu_data_requester_prio_list l = handle->arbitered_req_list; _starpu_data_requester_prio_list_init(&handle->arbitered_req_list); while (!_starpu_data_requester_prio_list_empty(&l)) { struct _starpu_data_requester *r = _starpu_data_requester_prio_list_pop_front_highest(&l); if (!r->is_requested_by_codelet) { /* data_acquire_cb, process it */ enum starpu_data_access_mode r_mode = r->mode; int put_in_list = 1; r_mode = _starpu_arbiter_filter_modes(r_mode); _starpu_spin_lock(&handle->header_lock); handle->busy_count++; if ((handle->refcnt == 0) || (!(r_mode == STARPU_W) && (handle->current_mode == r_mode))) { handle->refcnt++; handle->current_mode = r_mode; put_in_list = 0; } _starpu_spin_unlock(&handle->header_lock); if (put_in_list) _starpu_data_requester_prio_list_push_front(&l, r); /* Put back remaining requests */ _starpu_data_requester_prio_list_push_prio_list_back(&handle->arbitered_req_list, &l); #ifndef LOCK_OR_DELEGATE STARPU_PTHREAD_MUTEX_UNLOCK(&arbiter->mutex); #endif if (!put_in_list) { 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; struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); for (idx_buf_arbiter = start_buf_arbiter; idx_buf_arbiter < nbuffers; idx_buf_arbiter++) { handle_arbiter = descrs[idx_buf_arbiter].handle; if (idx_buf_arbiter && (descrs[idx_buf_arbiter-1].handle == 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 = descrs[idx_buf_arbiter].mode; mode = _starpu_arbiter_filter_modes(mode); /* we post all arbiter */ _starpu_spin_lock(&handle_arbiter->header_lock); if (!((handle_arbiter->refcnt == 0) || (!(mode == STARPU_W) && (handle_arbiter->current_mode == mode)))) { /* 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_prio_list_push_prio_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_prio_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 = descrs[idx_buf_cancel].handle; if (idx_buf_cancel && (descrs[idx_buf_cancel-1].handle == 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.3.9+dfsg/src/core/dependencies/data_concurrency.c000066400000000000000000000414141413463044200236220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_concurrent_data_access). * * _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_access_data) * - 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_prio_list *req_list; if (handle->reduction_refcnt > 0) { req_list = &handle->reduction_req_list; } else { if (_starpu_data_requester_prio_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_prio_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_prio_list_pop_front_highest(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_prio_list_front_highest(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_prio_list_pop_front_highest(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); /* Do not care about some flags */ mode &= ~STARPU_COMMUTE; mode &= ~STARPU_SSEND; mode &= ~STARPU_LOCALITY; 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(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 && 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->prio = j ? j->task->priority : 0; 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_prio_list *req_list = is_a_reduction_task?&handle->reduction_req_list:&handle->req_list; _starpu_data_requester_prio_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. */ struct _starpu_data_descr *buffer = &(_STARPU_JOB_GET_ORDERED_BUFFERS(j)[buffer_index]); starpu_data_handle_t handle = buffer->handle; enum starpu_data_access_mode mode = buffer->mode & ~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_access_data(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; } STARPU_ASSERT(j->task->status == STARPU_TASK_BLOCKED || j->task->status == STARPU_TASK_BLOCKED_ON_TAG || j->task->status == STARPU_TASK_BLOCKED_ON_TASK || j->task->status == STARPU_TASK_BLOCKED_ON_DATA); 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; } /* This is called when the tag+task dependencies are to be finished releasing. */ void _starpu_enforce_data_deps_notify_job_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data) { unsigned buf; if (j->task->cl) { unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(j->task); for (buf = 0; buf < nbuffers; buf++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(j->task, buf); if (handle->arbiter) /* Oops, it's the arbiter's decision */ return; } /* We need to check data availability only if sequential consistency * dependencies have not been used */ if (!j->sequential_consistency) { for (buf = 0; buf < nbuffers; buf++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(j->task, buf); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(j->task, buf) & ~STARPU_COMMUTE; if (handle->reduction_refcnt) /* Reduction pending, don't bother trying */ return; if (handle->refcnt != 0 && (mode == STARPU_W || handle->current_mode != mode)) /* Incompatible modes, not ready immediately */ return; } } } /* Ok, it really looks like this job will be ready soon */ _starpu_job_notify_ready_soon(j, data); } 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; struct _starpu_data_descr *buffers = _STARPU_JOB_GET_ORDERED_BUFFERS(j); for (i=0 ; itask->cl; if ((cl == NULL) || (STARPU_TASK_GET_NBUFFERS(j->task) == 0)) return 0; return _submit_job_access_data(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_access_data(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); if (handle->arbiter) { /* Keep our reference for now, _starpu_notify_arbitered_dependencies * will drop it when it needs to */ STARPU_ASSERT(_starpu_data_requester_prio_list_empty(&handle->req_list)); STARPU_ASSERT(_starpu_data_requester_prio_list_empty(&handle->reduction_req_list)); _starpu_spin_unlock(&handle->header_lock); /* _starpu_notify_arbitered_dependencies will handle its own locking */ _starpu_notify_arbitered_dependencies(handle); /* We have already unlocked */ return 1; } /* 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; STARPU_ASSERT(_starpu_data_requester_prio_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_prio_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.3.9+dfsg/src/core/dependencies/data_concurrency.h000066400000000000000000000033511413463044200236250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include void _starpu_job_set_ordered_buffers(struct _starpu_job *j); unsigned _starpu_concurrent_data_access(struct _starpu_job *j); void _starpu_submit_job_enforce_arbitered_deps(struct _starpu_job *j, unsigned buf, unsigned nbuffers); void _starpu_enforce_data_deps_notify_job_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data); 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.3.9+dfsg/src/core/dependencies/dependencies.c000066400000000000000000000065051413463044200227270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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); } /* TODO: make this a hashtable indexed by func+data and pass that through data. */ static starpu_notify_ready_soon_func notify_ready_soon_func; static void *notify_ready_soon_func_data; struct _starpu_notify_job_start_data { double delay; }; void starpu_task_notify_ready_soon_register(starpu_notify_ready_soon_func f, void *data) { STARPU_ASSERT(!notify_ready_soon_func); notify_ready_soon_func = f; notify_ready_soon_func_data = data; } /* Called when a job has just started, so we can notify tasks which were waiting * only for this one when they can expect to start */ static void __starpu_job_notify_start(struct _starpu_job *j, double delay); void _starpu_job_notify_start(struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch) { double delay; if (!notify_ready_soon_func) return; delay = starpu_task_expected_length(j->task, perf_arch, j->nimpl); if (isnan(delay) || _STARPU_IS_ZERO(delay)) return; __starpu_job_notify_start(j, delay); } static void __starpu_job_notify_start(struct _starpu_job *j, double delay) { _starpu_notify_job_start_data data = { .delay = delay }; _starpu_notify_job_start_tasks(j, &data); if (j->task->use_tag) _starpu_notify_job_start_tag_dependencies(j->tag, &data); /* TODO: check data notification */ } /* Called when the last dependency of this job has just started, so we know that * this job will be released after the given delay. */ void _starpu_job_notify_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data) { struct starpu_task *task = j->task; /* Notify that this task will start after the given delay */ notify_ready_soon_func(notify_ready_soon_func_data, task, data->delay); /* Notify some known transitions as well */ if (!task->cl || task->cl->where == STARPU_NOWHERE || task->where == STARPU_NOWHERE) /* This task will immediately terminate, so transition this */ __starpu_job_notify_start(_starpu_get_job_associated_to_task(task), data->delay); if (j->quick_next) /* This job is actually a pre_sync job with a post_sync job to be released right after */ _starpu_job_notify_ready_soon(j->quick_next, data); } starpu-1.3.9+dfsg/src/core/dependencies/implicit_data_deps.c000066400000000000000000000576041413463044200241250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 (*write_hook)(starpu_data_handle_t); void _starpu_implicit_data_deps_write_hook(void (*func)(starpu_data_handle_t)) { STARPU_ASSERT_MSG(!write_hook || write_hook == func, "only one implicit data deps hook at a time\n"); write_hook = func; } static void _starpu_add_ghost_dependency(starpu_data_handle_t handle, unsigned long previous, struct starpu_task *next) { 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, struct starpu_task *previous, struct starpu_task *next) { _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)); _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)); _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, unsigned task_handle_sequential_consistency) { 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 && task_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_R && !handle->initialized) { STARPU_ASSERT_MSG(handle->init_cl, "Handle %p is not initialized, it cannot be read", handle); /* The task will initialize it with init_cl */ handle->initialized = 1; } if (mode & STARPU_W || mode == STARPU_REDUX) { handle->initialized = 1; if (write_hook) write_hook(handle); } /* 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); _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) || (l != &handle->last_submitted_accessors && handle->last_submitted_ghost_accessors_id)) { /* 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 = "_starpu_sync_task_redux"; else if (mode == STARPU_COMMUTE || previous_mode == STARPU_COMMUTE) sync_task->name = "_starpu_sync_task_commute"; else sync_task->name = "_starpu_sync_task"; sync_task->cl = NULL; sync_task->type = post_sync_task->type; /* 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 { struct _starpu_jobid_list *ghost_accessors_id = handle->last_submitted_ghost_accessors_id; /* At most one previous accessor or one ghost */ if (l != &handle->last_submitted_accessors) { /* One accessor, make it the sync task, * and start depending on it. */ _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; handle->last_submitted_ghost_sync_id_is_valid = 0; } else if (ghost_accessors_id) { /* One ghost, just remember its id */ _STARPU_DEP_DEBUG("No more currently running accessor, but a ghost id, taking it.\n"); handle->last_submitted_ghost_sync_id = ghost_accessors_id->id; handle->last_submitted_ghost_sync_id_is_valid = 1; STARPU_ASSERT(!ghost_accessors_id->next); handle->last_submitted_ghost_accessors_id = NULL; free(ghost_accessors_id); } 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; j->sequential_consistency = 1; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); 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 = descrs[buffer].handle; enum starpu_data_access_mode mode = descrs[buffer].mode; struct starpu_task *new_task; /* Scratch memory does not introduce any deps */ if (mode & STARPU_SCRATCH) continue; if (buffer) { starpu_data_handle_t handle_m1 = descrs[buffer-1].handle; enum starpu_data_access_mode mode_m1 = descrs[buffer-1].mode; if (handle_m1 == handle && mode_m1 == mode) /* We have already added dependencies for this * data, skip it. This reduces the number of * dependencies, and allows notify_soon to work * when a task uses the same data several times * (otherwise it will not be able to find out that the two * dependencies will be over at the same time) */ continue; } STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); unsigned index = descrs[buffer].index; unsigned task_handle_sequential_consistency = task->handles_sequential_consistency ? task->handles_sequential_consistency[index] : handle->sequential_consistency; if (!task_handle_sequential_consistency) j->sequential_consistency = 0; new_task = _starpu_detect_implicit_data_deps_with_handle(task, task, &dep_slots[buffer], handle, mode, task_handle_sequential_consistency); 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; if (!task->cl) return; struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); struct _starpu_task_wrapper_dlist *slots = _STARPU_JOB_GET_DEP_SLOTS(j); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; /* Release all implicit dependencies */ for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = descrs[index].handle; enum starpu_data_access_mode mode = descrs[index].mode; if (index) { starpu_data_handle_t handle_m1 = descrs[index-1].handle; enum starpu_data_access_mode mode_m1 = descrs[index-1].mode; if (handle_m1 == handle && mode_m1 == mode) /* See _starpu_detect_implicit_data_deps */ continue; } _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 (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; sync_task->type = STARPU_TASK_TYPE_INTERNAL; /* 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, sequential_consistency); 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.3.9+dfsg/src/core/dependencies/implicit_data_deps.h000066400000000000000000000042131413463044200241160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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, unsigned task_handle_sequential_consistency); 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); /** Register a hook to be called when a write is submitted */ void _starpu_implicit_data_deps_write_hook(void (*func)(starpu_data_handle_t)); /** 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.3.9+dfsg/src/core/dependencies/tags.c000066400000000000000000000341461413463044200212410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; #ifdef STARPU_DEBUG cg->ndeps = ntags; cg->deps = NULL; cg->done = NULL; #endif cg->cg_type = STARPU_CG_TAG; cg->succ.tag = tag; tag->tag_successors.ndeps++; #ifdef STARPU_DEBUG _STARPU_REALLOC(tag->tag_successors.deps, tag->tag_successors.ndeps * sizeof(tag->tag_successors.deps[0])); _STARPU_REALLOC(tag->tag_successors.done, tag->tag_successors.ndeps * sizeof(tag->tag_successors.done[0])); tag->tag_successors.deps[tag->tag_successors.ndeps-1] = cg; tag->tag_successors.done[tag->tag_successors.ndeps-1] = 0; #endif 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 */ #ifdef STARPU_DEBUG free(cg->deps); free(cg->done); #endif free(cg); } } #ifdef STARPU_DYNAMIC_DEPS_SIZE free(tag->tag_successors.succ); #endif #ifdef STARPU_DEBUG free(tag->tag_successors.deps); free(tag->tag_successors.done); #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=NULL, *tmp=NULL; 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, and this releases it */ 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; 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); /* 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); } /* the lock of the tag must already 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(tag, 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->tag_successors); _starpu_spin_unlock(&tag->lock); } /* Called when a job has just started, so we can notify tasks which were waiting * only for this one when they can expect to start */ void _starpu_notify_job_start_tag_dependencies(struct _starpu_tag *tag, _starpu_notify_job_start_data *data) { _starpu_notify_job_start_cg_list(tag, &tag->tag_successors, data); } 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_notify_restart_tag_dependencies(struct _starpu_tag *tag) { _starpu_spin_lock(&tag->lock); if (tag->state == STARPU_DONE) { tag->state = STARPU_BLOCKED; _starpu_spin_unlock(&tag->lock); return; } _STARPU_TRACE_TAG_DONE(tag); tag->state = STARPU_BLOCKED; _starpu_notify_cg_list(tag, &tag->tag_successors); _starpu_spin_unlock(&tag->lock); } void starpu_tag_notify_restart_from_apps(starpu_tag_t id) { struct _starpu_tag *tag = gettag_struct(id); _starpu_notify_restart_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); #ifdef STARPU_DEBUG _STARPU_MALLOC(cg->deps, ndeps * sizeof(cg->deps[0])); _STARPU_MALLOC(cg->done, ndeps * sizeof(cg->done[0])); #endif for (i = 0; i < ndeps; i++) { starpu_tag_t dep_id = array[i]; #ifdef STARPU_DEBUG cg->deps[i] = (void*) (uintptr_t) dep_id; cg->done[i] = 0; #endif /* 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_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_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_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_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); } struct starpu_task *starpu_tag_get_task(starpu_tag_t id) { struct _starpu_tag_table *entry; struct _starpu_tag *tag; STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); HASH_FIND_UINT64_T(tag_htbl, &id, entry); STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); if (!entry) return NULL; tag = entry->tag; if (!tag->job) return NULL; return tag->job->task; } starpu-1.3.9+dfsg/src/core/dependencies/tags.h000066400000000000000000000045221413463044200212410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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; /** an identifier for the task */ starpu_tag_t id; enum _starpu_tag_state state; struct _starpu_cg_list tag_successors; /** which job is associated to the tag if any ? */ struct _starpu_job *job; unsigned is_assigned; unsigned is_submitted; }; void _starpu_init_tags(void); void _starpu_notify_tag_dependencies(struct _starpu_tag *tag); void _starpu_notify_job_start_tag_dependencies(struct _starpu_tag *tag, _starpu_notify_job_start_data *data); void _starpu_tag_declare(starpu_tag_t id, struct _starpu_job *job); /** lock should be taken, and this releases it */ 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.3.9+dfsg/src/core/dependencies/task_deps.c000066400000000000000000000174131413463044200222560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; #ifdef STARPU_DEBUG cg->ndeps = ntags; cg->deps = NULL; cg->done = NULL; #endif cg->cg_type = STARPU_CG_TASK; cg->succ.job = j; j->job_successors.ndeps++; #ifdef STARPU_DEBUG _STARPU_REALLOC(j->job_successors.deps, j->job_successors.ndeps * sizeof(j->job_successors.deps[0])); _STARPU_REALLOC(j->job_successors.done, j->job_successors.ndeps * sizeof(j->job_successors.done[0])); j->job_successors.deps[j->job_successors.ndeps-1] = cg; j->job_successors.done[j->job_successors.ndeps-1] = 0; #endif 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(j, cg); } void _starpu_notify_task_dependencies(struct _starpu_job *j) { _starpu_notify_cg_list(j, &j->job_successors); } /* Called when a job has just started, so we can notify tasks which were waiting * only for this one when they can expect to start */ void _starpu_notify_job_start_tasks(struct _starpu_job *j, _starpu_notify_job_start_data *data) { _starpu_notify_job_start_cg_list(j, &j->job_successors, data); } /* 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) { int ret = !job->submitted || !task->destroy || task->detach; #ifdef STARPU_OPENMP ret = ret || job->continuation; #endif STARPU_ASSERT_MSG(ret, "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); #ifdef STARPU_DEBUG _STARPU_MALLOC(cg->deps, ndeps * sizeof(cg->deps[0])); _STARPU_MALLOC(cg->done, ndeps * sizeof(cg->done[0])); #endif 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); #ifdef STARPU_DEBUG cg->deps[i] = dep_job; cg->done[i] = 0; #endif 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 || starpu_task_get_current() == dep_task, "Unless it is not to be destroyed automatically, 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); } void starpu_task_declare_deps(struct starpu_task *task, unsigned ndeps, ...) { if (ndeps == 0) return; struct starpu_task *tasks[ndeps]; unsigned i; va_list pa; va_start(pa, ndeps); for (i = 0; i < ndeps; i++) { tasks[i] = va_arg(pa, struct starpu_task *); } va_end(pa); starpu_task_declare_deps_array(task, ndeps, tasks); } void starpu_task_declare_end_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]) { unsigned i; starpu_task_end_dep_add(task, ndeps); for (i = 0; i < ndeps; i++) { struct starpu_task *dep_task = task_array[i]; struct _starpu_job *dep_job = _starpu_get_job_associated_to_task(dep_task); int done = 0; STARPU_ASSERT_MSG(!dep_job->submitted || !dep_job->task->destroy || !dep_job->task->detach || starpu_task_get_current() == dep_task, "Unless it is not to be destroyed automatically, task end 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"); STARPU_ASSERT_MSG(!dep_job->end_rdep, "multiple end dependencies are not supported yet"); STARPU_ASSERT_MSG(!dep_job->task->regenerate, "end dependencies are not supported yet for regenerated tasks"); STARPU_PTHREAD_MUTEX_LOCK(&dep_job->sync_mutex); dep_job->end_rdep = task; if (dep_job->terminated) /* It's actually already over */ done = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&dep_job->sync_mutex); if (done) starpu_task_end_dep_release(task); } } void starpu_task_declare_end_deps(struct starpu_task *task, unsigned ndeps, ...) { if (ndeps == 0) return; struct starpu_task *tasks[ndeps]; unsigned i; va_list pa; va_start(pa, ndeps); for (i = 0; i < ndeps; i++) { tasks[i] = va_arg(pa, struct starpu_task *); } va_end(pa); starpu_task_declare_end_deps_array(task, ndeps, tasks); } 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.3.9+dfsg/src/core/detect_combined_workers.c000066400000000000000000000266241413463044200225430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 int _starpu_initialized_combined_workers; #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; STARPU_ASSERT_MSG(synthesize_arity > 0, "STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER must be greater than 0"); /* 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; //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); 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) { /* FIXME: this seems to be lacking shutdown support? */ if (_starpu_initialized_combined_workers) return; _starpu_initialized_combined_workers = 1; 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 } } void starpu_sched_find_all_worker_combinations(void) { const unsigned nbasic_workers = starpu_worker_get_count(); int basic_workerids[nbasic_workers]; unsigned i; for(i = 0; i < nbasic_workers; i++) { basic_workerids[i] = i; } _starpu_sched_find_worker_combinations(basic_workerids, nbasic_workers); } starpu-1.3.9+dfsg/src/core/detect_combined_workers.h000066400000000000000000000015631413463044200225430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /** @file */ /** Initialize combined workers */ void _starpu_sched_find_worker_combinations(int *workerids, int nworkers); extern int _starpu_initialized_combined_workers; starpu-1.3.9+dfsg/src/core/disk.c000066400000000000000000000432631413463044200166070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 #include #include #include #include #include #include #include #include #include struct disk_register { void *base; struct starpu_disk_ops *functions; /* disk condition (1 = all authorizations, */ int flag; }; static int add_disk_in_list(unsigned node, struct starpu_disk_ops *func, void *base); static struct disk_register *disk_register_list[STARPU_MAXNODES]; static int disk_number = 0; int starpu_disk_swap_node = -1; static void add_async_event(struct _starpu_async_channel * channel, void * event) { if (!event) return; if (channel->event.disk_event.requests == NULL) { channel->event.disk_event.requests = _starpu_disk_backend_event_list_new(); } struct _starpu_disk_backend_event * disk_event = _starpu_disk_backend_event_new(); disk_event->backend_event = event; /* Store event at the end of the list */ _starpu_disk_backend_event_list_push_back(channel->event.disk_event.requests, disk_event); } 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 disk_memnode = _starpu_memory_node_register(STARPU_DISK_RAM, 0, &_starpu_driver_disk_node_ops); /* Connect the disk memory node to all numa memory nodes */ int nb_numa_nodes = starpu_memory_nodes_get_numa_count(); int numa_node; for (numa_node = 0; numa_node < nb_numa_nodes; numa_node++) { _starpu_register_bus(disk_memnode, numa_node); _starpu_register_bus(numa_node, disk_memnode); } /* Any worker can manage disk memnode */ struct _starpu_machine_config *config = _starpu_get_machine_config(); unsigned worker; for (worker = 0; worker < starpu_worker_get_count(); worker++) { /* But prefer to use only CPU workers if possible */ if (starpu_worker_get_type(worker) == STARPU_CPU_WORKER) { struct _starpu_worker *workerarg = &config->workers[worker]; _starpu_memory_node_add_nworkers(disk_memnode); _starpu_worker_drives_memory_node(workerarg, disk_memnode); } } if (!_starpu_memory_node_get_nworkers(disk_memnode)) { /* Bleh, no CPU worker to drive the disk, use non-CPU workers too */ for (worker = 0; worker < starpu_worker_get_count(); worker++) { if (starpu_worker_get_type(worker) != STARPU_CPU_WORKER) { struct _starpu_worker *workerarg = &config->workers[worker]; _starpu_memory_node_add_nworkers(disk_memnode); _starpu_worker_drives_memory_node(workerarg, disk_memnode); } } } //Add bus for disk <-> disk copy if (func->copy != NULL) { int disk; for (disk = 0; disk < STARPU_MAXNODES; disk++) if (disk_register_list[disk] != NULL && disk_register_list[disk]->functions->copy != NULL && disk_register_list[disk]->functions->copy == func->copy) { _starpu_register_bus(disk_memnode, disk); _starpu_register_bus(disk, disk_memnode); } } /* connect disk */ void *base = func->plug(parameter, size); /* remember it */ int n STARPU_ATTRIBUTE_UNUSED = add_disk_in_list(disk_memnode, func, base); #ifdef STARPU_SIMGRID char name[16]; snprintf(name, sizeof(name), "DISK%d", n); starpu_sg_host_t host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT_MSG(host, "Could not find disk %s in platform file", name); _starpu_simgrid_memory_node_set_host(disk_memnode, host); #endif int ret = func->bandwidth(disk_memnode, base); /* have a problem with the disk */ if (ret == 0) return -ENOENT; if (size >= 0) _starpu_memory_manager_set_global_memory_size(disk_memnode, size); _starpu_mem_chunk_disk_register(disk_memnode); return disk_memnode; } void _starpu_disk_unregister(void) { int i; /* search disk and delete it */ for (i = 0; i < STARPU_MAXNODES; ++i) { if (disk_register_list[i] == NULL) continue; _starpu_set_disk_flag(i, STARPU_DISK_NO_RECLAIM); _starpu_free_all_automatically_allocated_buffers(i); /* don't forget to unplug */ disk_register_list[i]->functions->unplug(disk_register_list[i]->base); free(disk_register_list[i]); disk_register_list[i] = NULL; disk_number--; } /* no disk in the list -> delete the list */ STARPU_ASSERT_MSG(disk_number == 0, "Some disks are not unregistered !"); } /* interface between user and disk memory */ void *_starpu_disk_alloc(unsigned node, size_t size) { return disk_register_list[node]->functions->alloc(disk_register_list[node]->base, size); } void _starpu_disk_free(unsigned node, void *obj, size_t size) { disk_register_list[node]->functions->free(disk_register_list[node]->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) { void *event = NULL; if (channel != NULL) { if (disk_register_list[src_node]->functions->async_read == NULL) channel = NULL; else { double start; channel->event.disk_event.memory_node = src_node; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); event = disk_register_list[src_node]->functions->async_read(disk_register_list[src_node]->base, obj, buf, offset, size); starpu_interface_end_driver_copy_async(src_node, dst_node, start); add_async_event(channel, event); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !event) { disk_register_list[src_node]->functions->read(disk_register_list[src_node]->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) { void *event = NULL; if (channel != NULL) { if (disk_register_list[dst_node]->functions->async_write == NULL) channel = NULL; else { double start; channel->event.disk_event.memory_node = dst_node; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); event = disk_register_list[dst_node]->functions->async_write(disk_register_list[dst_node]->base, obj, buf, offset, size); starpu_interface_end_driver_copy_async(src_node, dst_node, start); add_async_event(channel, event); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !event) { disk_register_list[dst_node]->functions->write(disk_register_list[dst_node]->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) { /* both nodes have same copy function */ void * event = NULL; if (channel) { channel->event.disk_event.memory_node = node_src; event = disk_register_list[node_src]->functions->copy(disk_register_list[node_src]->base, obj_src, offset_src, disk_register_list[node_dst]->base, obj_dst, offset_dst, size); add_async_event(channel, event); } /* Something goes wrong with copy disk to disk... */ if (!event) { if (channel || starpu_asynchronous_copy_disabled()) disk_register_list[node_src]->functions->copy = NULL; /* perform a read, and after a write... */ void * ptr; int ret = _starpu_malloc_flags_on_node(STARPU_MAIN_RAM, &ptr, size, 0); STARPU_ASSERT_MSG(ret == 0, "Cannot allocate %zu bytes to perform disk to disk operation", size); ret = _starpu_disk_read(node_src, STARPU_MAIN_RAM, obj_src, ptr, offset_src, size, NULL); STARPU_ASSERT_MSG(ret == 0, "Cannot read %zu bytes to perform disk to disk copy", size); ret = _starpu_disk_write(STARPU_MAIN_RAM, node_dst, obj_dst, ptr, offset_dst, size, NULL); STARPU_ASSERT_MSG(ret == 0, "Cannot write %zu bytes to perform disk to disk copy", size); _starpu_free_flags_on_node(STARPU_MAIN_RAM, ptr, size, 0); return 0; } STARPU_ASSERT(event); return -EAGAIN; } int _starpu_disk_full_read(unsigned src_node, unsigned dst_node, void *obj, void **ptr, size_t *size, struct _starpu_async_channel *channel) { void *event = NULL; if (channel != NULL) { if (disk_register_list[src_node]->functions->async_full_read == NULL) channel = NULL; else { double start; channel->event.disk_event.memory_node = src_node; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); event = disk_register_list[src_node]->functions->async_full_read(disk_register_list[src_node]->base, obj, ptr, size, dst_node); starpu_interface_end_driver_copy_async(src_node, dst_node, start); add_async_event(channel, event); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !event) { disk_register_list[src_node]->functions->full_read(disk_register_list[src_node]->base, obj, ptr, size, dst_node); 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) { void *event = NULL; if (channel != NULL) { if (disk_register_list[dst_node]->functions->async_full_write == NULL) channel = NULL; else { double start; channel->event.disk_event.memory_node = dst_node; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); event = disk_register_list[dst_node]->functions->async_full_write(disk_register_list[dst_node]->base, obj, ptr, size); starpu_interface_end_driver_copy_async(src_node, dst_node, start); add_async_event(channel, event); } } /* asynchronous request failed or synchronous request is asked */ if (channel == NULL || !event) { disk_register_list[dst_node]->functions->full_write(disk_register_list[dst_node]->base, obj, ptr, size); return 0; } return -EAGAIN; } void *starpu_disk_open(unsigned node, void *pos, size_t size) { return disk_register_list[node]->functions->open(disk_register_list[node]->base, pos, size); } void starpu_disk_close(unsigned node, void *obj, size_t size) { disk_register_list[node]->functions->close(disk_register_list[node]->base, obj, size); } void starpu_disk_wait_request(struct _starpu_async_channel *async_channel) { unsigned node = async_channel->event.disk_event.memory_node; if (async_channel->event.disk_event.requests != NULL && !_starpu_disk_backend_event_list_empty(async_channel->event.disk_event.requests)) { struct _starpu_disk_backend_event * event = _starpu_disk_backend_event_list_begin(async_channel->event.disk_event.requests); struct _starpu_disk_backend_event * next; /* Wait all events in the list and remove them */ while (event != _starpu_disk_backend_event_list_end(async_channel->event.disk_event.requests)) { next = _starpu_disk_backend_event_list_next(event); disk_register_list[node]->functions->wait_request(event->backend_event); disk_register_list[node]->functions->free_request(event->backend_event); _starpu_disk_backend_event_list_erase(async_channel->event.disk_event.requests, event); _starpu_disk_backend_event_delete(event); event = next; } /* Remove the list because it doesn't contain any event */ _starpu_disk_backend_event_list_delete(async_channel->event.disk_event.requests); async_channel->event.disk_event.requests = NULL; } } int starpu_disk_test_request(struct _starpu_async_channel *async_channel) { unsigned node = async_channel->event.disk_event.memory_node; if (async_channel->event.disk_event.requests != NULL && !_starpu_disk_backend_event_list_empty(async_channel->event.disk_event.requests)) { struct _starpu_disk_backend_event * event = _starpu_disk_backend_event_list_begin(async_channel->event.disk_event.requests); struct _starpu_disk_backend_event * next; /* Wait all events in the list and remove them */ while (event != _starpu_disk_backend_event_list_end(async_channel->event.disk_event.requests)) { next = _starpu_disk_backend_event_list_next(event); int res = disk_register_list[node]->functions->test_request(event->backend_event); if (res) { disk_register_list[node]->functions->free_request(event->backend_event); _starpu_disk_backend_event_list_erase(async_channel->event.disk_event.requests, event); _starpu_disk_backend_event_delete(event); } event = next; } /* Remove the list because it doesn't contain any event */ if (_starpu_disk_backend_event_list_empty(async_channel->event.disk_event.requests)) { _starpu_disk_backend_event_list_delete(async_channel->event.disk_event.requests); async_channel->event.disk_event.requests = NULL; } } return async_channel->event.disk_event.requests == NULL; } void starpu_disk_free_request(struct _starpu_async_channel *async_channe STARPU_ATTRIBUTE_UNUSED) { /* It does not have any sense to use this function currently because requests are freed in test of wait functions */ STARPU_ABORT(); /* 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 int add_disk_in_list(unsigned node, struct starpu_disk_ops *func, void *base) { int n; struct disk_register *dr; _STARPU_MALLOC(dr, sizeof(struct disk_register)); dr->base = base; dr->flag = STARPU_DISK_ALL; dr->functions = func; n = disk_number++; disk_register_list[node] = dr; return n; } int _starpu_disk_can_copy(unsigned node1, unsigned node2) { STARPU_ASSERT(starpu_node_get_kind(node1) == STARPU_DISK_RAM && starpu_node_get_kind(node2) == STARPU_DISK_RAM); if (disk_register_list[node1]->functions == disk_register_list[node2]->functions) /* they must have a copy function */ if (disk_register_list[node1]->functions->copy != NULL) return 1; return 0; } void _starpu_set_disk_flag(unsigned node, int flag) { disk_register_list[node]->flag = flag; } int _starpu_get_disk_flag(unsigned node) { return disk_register_list[node]->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) { ops = &starpu_disk_unistd_ops; } else if (!strcmp(backend, "stdio")) { ops = &starpu_disk_stdio_ops; } else if (!strcmp(backend, "unistd")) { ops = &starpu_disk_unistd_ops; } else if (!strcmp(backend, "unistd_o_direct")) { #ifdef STARPU_LINUX_SYS 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 if (!strcmp(backend, "hdf5")) { #ifdef STARPU_HAVE_HDF5 ops = &starpu_disk_hdf5_ops; #else _STARPU_DISP("Warning: hdf5 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.3.9+dfsg/src/core/disk.h000066400000000000000000000053521413463044200166110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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__ /** @file */ #define STARPU_DISK_ALL 1 #define STARPU_DISK_NO_RECLAIM 2 #ifdef __cplusplus extern "C" { #endif #include #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_disk_can_copy(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.3.9+dfsg/src/core/disk_ops/000077500000000000000000000000001413463044200173145ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/core/disk_ops/disk_hdf5.c000066400000000000000000001001711413463044200213200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #include #include #ifndef O_BINARY #define O_BINARY 0 #endif #define NITER _starpu_calibration_minimum #define STARPU_CHUNK_DIM 4096 /* ------------------- use HDF5 to write on disk ------------------- */ #ifndef H5_HAVE_THREADSAFE static int nb_disk_open = 0; static volatile int init_finished = 0; static starpu_pthread_t global_thread; /* This thread will perform each write/read because we don't have asynchronous functions */ static volatile int global_run; /* Ask to the thread if he can continue */ static starpu_pthread_mutex_t global_mutex; /* Mutex is used to protect work_list and if HDF5 library is not safe */ static starpu_pthread_cond_t global_cond; static struct _starpu_hdf5_work_list global_work_list; /* This list contains the work for the hdf5 thread */ #endif #ifdef H5_HAVE_THREADSAFE #define HDF5_VAR_THREAD fileBase->thread #define HDF5_VAR_RUN fileBase->run #define HDF5_VAR_MUTEX fileBase->mutex #define HDF5_VAR_COND fileBase->cond #define HDF5_VAR_WORK_LIST fileBase->work_list #else #define HDF5_VAR_THREAD global_thread #define HDF5_VAR_RUN global_run #define HDF5_VAR_MUTEX global_mutex #define HDF5_VAR_COND global_cond #define HDF5_VAR_WORK_LIST global_work_list #endif enum hdf5_work_type { READ, WRITE, FULL_READ, FULL_WRITE, COPY }; LIST_TYPE(_starpu_hdf5_work, enum hdf5_work_type type; struct starpu_hdf5_base * base_src; struct starpu_hdf5_obj * obj_src; off_t offset_src; struct starpu_hdf5_base * base_dst; struct starpu_hdf5_obj * obj_dst; off_t offset_dst; void * ptr; size_t size; void * event; ); struct starpu_hdf5_base { hid_t fileID; char * path; unsigned created; /* StarPU creates the HDF5 file */ unsigned next_dataset_id; starpu_pthread_t thread; /* This thread will perform each write/read because we don't have asynchronous functions */ int run; /* Ask to the thread if he can continue */ starpu_pthread_mutex_t mutex; /* Mutex is used to protect work_list and if HDF5 library is not safe */ starpu_pthread_cond_t cond; struct _starpu_hdf5_work_list work_list; /* This list contains the work for the hdf5 thread */ }; struct starpu_hdf5_obj { hid_t dataset; /* describe this object in HDF5 file */ char * path; /* path where data are stored in HDF5 file */ size_t size; }; static inline void _starpu_hdf5_protect_start(void * base STARPU_ATTRIBUTE_UNUSED) { #ifndef H5_HAVE_THREADSAFE if (base != NULL) STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); #endif } static inline void _starpu_hdf5_protect_stop(void * base STARPU_ATTRIBUTE_UNUSED) { #ifndef H5_HAVE_THREADSAFE if (base != NULL) STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); #endif } /* ------------------ Functions for internal thread -------------------- */ /* TODO : Dataspace may not be NATIVE_CHAR for opened data */ static void starpu_hdf5_full_read_internal(struct _starpu_hdf5_work * work) { herr_t status; status = H5Dread(work->obj_src->dataset, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, work->ptr); STARPU_ASSERT_MSG(status >= 0, "Can not read data associed to this dataset (%s)\n", work->obj_src->path); } /* TODO : Dataspace may not be NATIVE_CHAR for opened data */ static void starpu_hdf5_full_write_internal(struct _starpu_hdf5_work * work) { herr_t status; /* Update size of dataspace */ if (work->size > work->obj_dst->size) { /* Get official datatype */ hid_t datatype = H5Dget_type(work->obj_dst->dataset); hsize_t sizeDatatype = H5Tget_size(datatype); /* Count in number of elements */ hsize_t extendsdim[1] = {work->size/sizeDatatype}; status = H5Dset_extent (work->obj_dst->dataset, extendsdim); STARPU_ASSERT_MSG(status >= 0, "Error when extending HDF5 dataspace !\n"); work->obj_dst->size = work->size; } /* Write ALL the dataspace */ status = H5Dwrite(work->obj_dst->dataset, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, work->ptr); STARPU_ASSERT_MSG(status >= 0, "Can not write data to this dataset (%s)\n", work->obj_dst->path); } static void starpu_hdf5_read_internal(struct _starpu_hdf5_work * work) { herr_t status; /* Get official datatype */ hid_t datatype = H5Dget_type(work->obj_src->dataset); hsize_t sizeDatatype = H5Tget_size(datatype); /* count in element, not in byte */ work->offset_src /= sizeDatatype; work->size /= sizeDatatype; /* duplicate the dataspace in the dataset */ hid_t dataspace_select = H5Dget_space(work->obj_src->dataset); STARPU_ASSERT_MSG(dataspace_select >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); /* Select what we want of the duplicated dataspace (it's called an hyperslab). This operation is done on place */ hsize_t offsets[1] = {work->offset_src}; hsize_t count[1] = {work->size}; /* stride and block size are NULL which is equivalent of a shift of 1 */ status = H5Sselect_hyperslab(dataspace_select, H5S_SELECT_SET, offsets, NULL, count, NULL); STARPU_ASSERT_MSG(status >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); /* create the dataspace for the received data which describes ptr */ hsize_t dims_receive[1] = {work->size}; hid_t dataspace_receive = H5Screate_simple(1, dims_receive, NULL); STARPU_ASSERT_MSG(dataspace_receive >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); /* Receiver has to be an hyperslabs */ offsets[0] = 0; count[0] = work->size; H5Sselect_hyperslab(dataspace_receive, H5S_SELECT_SET, offsets, NULL, count, NULL); STARPU_ASSERT_MSG(dataspace_receive >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); status = H5Dread(work->obj_src->dataset, datatype, dataspace_receive, dataspace_select, H5P_DEFAULT, work->ptr); STARPU_ASSERT_MSG(status >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); /* don't need these dataspaces */ status = H5Sclose(dataspace_select); STARPU_ASSERT_MSG(status >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); status = H5Sclose(dataspace_receive); STARPU_ASSERT_MSG(status >= 0, "Error when reading this HDF5 dataset (%s)\n", work->obj_src->path); } static void starpu_hdf5_write_internal(struct _starpu_hdf5_work * work) { herr_t status; /* Get official datatype */ hid_t datatype = H5Dget_type(work->obj_dst->dataset); hsize_t sizeDatatype = H5Tget_size(datatype); /* Update size of dataspace */ if (work->size + work->offset_dst > work->obj_dst->size) { /* Count in number of elements */ hsize_t extendsdim[1] = {(work->offset_dst + work->size)/sizeDatatype}; status = H5Dset_extent (work->obj_dst->dataset, extendsdim); STARPU_ASSERT_MSG(status >= 0, "Error when extending HDF5 dataspace !\n"); work->obj_dst->size = work->offset_dst + work->size; } /* count in element, not in byte */ work->offset_dst /= sizeDatatype; work->size /= sizeDatatype; /* duplicate the dataspace in the dataset */ hid_t dataspace_select = H5Dget_space(work->obj_dst->dataset); STARPU_ASSERT_MSG(dataspace_select >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); /* Select what we want of the duplicated dataspace (it's called an hyperslab). This operation is done on place */ hsize_t offsets[1] = {work->offset_dst}; hsize_t count[1] = {work->size}; /* stride and block size are NULL which is equivalent of a shift of 1 */ status = H5Sselect_hyperslab(dataspace_select, H5S_SELECT_SET, offsets, NULL, count, NULL); STARPU_ASSERT_MSG(status >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); /* create the dataspace for the received data which describes ptr */ hsize_t dims_send[1] = {work->size}; hid_t dataspace_send = H5Screate_simple(1, dims_send, NULL); STARPU_ASSERT_MSG(dataspace_send >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); /* Receiver has to be an hyperslabs */ offsets[0] = 0; count[0] = work->size; H5Sselect_hyperslab(dataspace_send, H5S_SELECT_SET, offsets, NULL, count, NULL); STARPU_ASSERT_MSG(dataspace_send >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); status = H5Dwrite(work->obj_dst->dataset, datatype, dataspace_send, dataspace_select, H5P_DEFAULT, work->ptr); STARPU_ASSERT_MSG(status >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); /* don't need these dataspaces */ status = H5Sclose(dataspace_select); STARPU_ASSERT_MSG(status >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); status = H5Sclose(dataspace_send); STARPU_ASSERT_MSG(status >= 0, "Error when writing this HDF5 dataset (%s)\n", work->obj_dst->path); } unsigned warned = 0; static void starpu_hdf5_copy_internal(struct _starpu_hdf5_work * work) { herr_t status; /* HDF5 H50copy supports only same size in both areas and copies the entire object */ if (work->offset_src == 0 && work->offset_dst == 0 && work->size == work->obj_src->size && work->size == work->obj_dst->size) { H5Dclose(work->obj_dst->dataset); /* Dirty : Delete dataspace because H5Ocopy only works if destination does not exist */ H5Ldelete(work->base_dst->fileID, work->obj_dst->path, H5P_DEFAULT); status = H5Ocopy(work->base_src->fileID, work->obj_src->path, work->base_dst->fileID, work->obj_dst->path, H5P_DEFAULT, H5P_DEFAULT); STARPU_ASSERT_MSG(status >= 0, "Can not copy data (%s) associed to this disk (%s) to the data (%s) on this disk (%s)\n", work->obj_src->path, work->base_src->path, work->obj_dst->path, work->base_dst->path); work->obj_dst->dataset = H5Dopen2(work->base_dst->fileID, work->obj_dst->path, H5P_DEFAULT); } else { if (!warned) { _STARPU_DISP("Direct disk to disk copy is not supported for a piece of data. Data will be transfered to RAM memory and then, be pushed on disk \n"); warned = 1; } void * ptr; int ret = _starpu_malloc_flags_on_node(STARPU_MAIN_RAM, &ptr, work->size, 0); STARPU_ASSERT_MSG(ret == 0, "Cannot allocate %lu bytes to perform disk to disk operation", (unsigned long)work->size); /* buffer is only used internally to store intermediate data */ work->ptr = ptr; starpu_hdf5_read_internal(work); starpu_hdf5_write_internal(work); _starpu_free_flags_on_node(STARPU_MAIN_RAM, ptr, work->size, 0); } } static void * _starpu_hdf5_internal_thread(void * arg) { #ifdef H5_HAVE_THREADSAFE struct starpu_hdf5_base * fileBase = (struct starpu_hdf5_base *) arg; #endif while (HDF5_VAR_RUN || !_starpu_hdf5_work_list_empty(&HDF5_VAR_WORK_LIST)) { STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); if (_starpu_hdf5_work_list_empty(&HDF5_VAR_WORK_LIST) && HDF5_VAR_RUN) STARPU_PTHREAD_COND_WAIT(&HDF5_VAR_COND, &HDF5_VAR_MUTEX); STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); /* We are the only consummer here, don't need to protect here */ if (!_starpu_hdf5_work_list_empty(&HDF5_VAR_WORK_LIST)) { STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); struct _starpu_hdf5_work * work = _starpu_hdf5_work_list_pop_back(&HDF5_VAR_WORK_LIST); STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); if (work->base_src < work->base_dst) { _starpu_hdf5_protect_start(work->base_src); #ifdef H5_HAVE_THREADSAFE _starpu_hdf5_protect_start(work->base_dst); #endif } else { _starpu_hdf5_protect_start(work->base_dst); #ifdef H5_HAVE_THREADSAFE if (work->base_src != work->base_dst) _starpu_hdf5_protect_start(work->base_src); #endif } switch(work->type) { case READ: starpu_hdf5_read_internal(work); break; case WRITE: starpu_hdf5_write_internal(work); break; case FULL_READ: starpu_hdf5_full_read_internal(work); break; case FULL_WRITE: starpu_hdf5_full_write_internal(work); break; case COPY: starpu_hdf5_copy_internal(work); break; default: STARPU_ABORT(); } if (work->base_src < work->base_dst) { _starpu_hdf5_protect_stop(work->base_src); #ifdef H5_HAVE_THREADSAFE _starpu_hdf5_protect_stop(work->base_dst); #endif } else { _starpu_hdf5_protect_stop(work->base_dst); #ifdef H5_HAVE_THREADSAFE if (work->base_src != work->base_dst) _starpu_hdf5_protect_stop(work->base_src); #endif } /* Update event to tell it's finished */ starpu_sem_post((starpu_sem_t *) work->event); free(work); } } return NULL; } static void _starpu_hdf5_create_thread(struct starpu_hdf5_base * fileBase) { _starpu_hdf5_work_list_init(&HDF5_VAR_WORK_LIST); HDF5_VAR_RUN = 1; STARPU_PTHREAD_COND_INIT(&HDF5_VAR_COND, NULL); STARPU_PTHREAD_CREATE(&HDF5_VAR_THREAD, NULL, _starpu_hdf5_internal_thread, (void *) fileBase); } /* returns the size in BYTES */ static hsize_t _starpu_get_size_obj(struct starpu_hdf5_obj * obj) { herr_t status; hid_t dataspace = H5Dget_space(obj->dataset); STARPU_ASSERT_MSG(dataspace >= 0, "Can not get the size of this HDF5 dataset (%s)\n", obj->path); hsize_t dims[1]; status = H5Sget_simple_extent_dims(dataspace, dims, NULL); STARPU_ASSERT_MSG(status >= 0, "Can not get the size of this HDF5 dataset (%s)\n", obj->path); hid_t datatype = H5Dget_type(obj->dataset); STARPU_ASSERT_MSG(datatype >= 0, "Can not get the size of this HDF5 dataset (%s)\n", obj->path); hsize_t sizeDatatype = H5Tget_size(datatype); STARPU_ASSERT_MSG(sizeDatatype > 0, "Can not get the size of this HDF5 dataset (%s)\n", obj->path); H5Sclose(dataspace); H5Tclose(datatype); return dims[0]*sizeDatatype; } static void starpu_hdf5_send_work(void *base_src, void *obj_src, off_t offset_src, void *base_dst, void *obj_dst, off_t offset_dst, void *buf, size_t size, void * event, enum hdf5_work_type type) { struct starpu_hdf5_obj * dataObj_src = (struct starpu_hdf5_obj *) obj_src; struct starpu_hdf5_obj * dataObj_dst = (struct starpu_hdf5_obj *) obj_dst; struct starpu_hdf5_base * fileBase_src = (struct starpu_hdf5_base *) base_src; struct starpu_hdf5_base * fileBase_dst = (struct starpu_hdf5_base *) base_dst; struct _starpu_hdf5_work * work; _STARPU_MALLOC(work, sizeof(*work)); work->type = type; work->base_src = fileBase_src; work->obj_src = dataObj_src; work->offset_src = offset_src; work->base_dst = fileBase_dst; work->obj_dst = dataObj_dst; work->offset_dst = offset_dst; work->ptr = buf; work->size = size; work->event = event; #ifdef H5_HAVE_THREADSAFE struct starpu_hdf5_base * fileBase; if (fileBase_src != NULL) fileBase = fileBase_src; else fileBase = fileBase_dst; #endif STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); _starpu_hdf5_work_list_push_front(&HDF5_VAR_WORK_LIST, work); /* Wake up internal thread */ STARPU_PTHREAD_COND_BROADCAST(&HDF5_VAR_COND); STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); } static struct starpu_hdf5_obj * _starpu_hdf5_data_alloc(struct starpu_hdf5_base * fileBase, char * name, size_t size) { struct starpu_hdf5_obj * obj; _STARPU_MALLOC(obj, sizeof(*obj)); _starpu_hdf5_protect_start((void *) fileBase); /* create a dataspace with one dimension of size elements */ hsize_t dim[1] = {size}; hsize_t maxdim[1] = {H5S_UNLIMITED}; hid_t dataspace = H5Screate_simple(1, dim, maxdim); if (dataspace < 0) { free(obj); return NULL; } hsize_t chunkdim[1] = {STARPU_CHUNK_DIM}; hid_t prop = H5Pcreate (H5P_DATASET_CREATE); herr_t status = H5Pset_chunk (prop, 1, chunkdim); STARPU_ASSERT_MSG(status >= 0, "Error when setting HDF5 property \n"); /* create a dataset at location name, with data described by the dataspace. * Each element are like char in C (expected one byte) */ obj->dataset = H5Dcreate2(fileBase->fileID, name, H5T_NATIVE_CHAR, dataspace, H5P_DEFAULT, prop, H5P_DEFAULT); H5Sclose(dataspace); H5Pclose(prop); if (obj->dataset < 0) { free(obj); return NULL; } obj->path = name; obj->size = size; _starpu_hdf5_protect_stop((void *) fileBase); return obj; } static struct starpu_hdf5_obj * _starpu_hdf5_data_open(struct starpu_hdf5_base * fileBase, char * name, size_t size) { struct starpu_hdf5_obj * obj; _STARPU_MALLOC(obj, sizeof(*obj)); _starpu_hdf5_protect_start((void *) fileBase); /* create a dataset at location name, with data described by the dataspace. * Each element are like char in C (expected one byte) */ obj->dataset = H5Dopen2(fileBase->fileID, name, H5P_DEFAULT); _starpu_hdf5_protect_stop((void *) fileBase); if (obj->dataset < 0) { free(obj); return NULL; } obj->path = name; obj->size = size; return obj; } static void *starpu_hdf5_plug(void *parameter, starpu_ssize_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_hdf5_base * fileBase; _STARPU_MALLOC(fileBase, sizeof(struct starpu_hdf5_base)); #ifndef H5_HAVE_THREADSAFE int actual_nb_disk = STARPU_ATOMIC_ADD(&nb_disk_open, 1); if (actual_nb_disk == 1) { #endif STARPU_PTHREAD_MUTEX_INIT(&HDF5_VAR_MUTEX, NULL); #ifndef H5_HAVE_THREADSAFE } else { while (!init_finished) STARPU_UYIELD(); } #endif _starpu_hdf5_protect_start(fileBase); struct stat buf; if (stat(parameter, &buf) != 0 || !S_ISREG(buf.st_mode)) { /* The file doesn't exist or the directory exists => create the datafile */ int id; _starpu_mkpath(parameter, S_IRWXU); fileBase->path = _starpu_mktemp(parameter, O_RDWR | O_BINARY, &id); if (!fileBase->path) { free(fileBase); _STARPU_ERROR("Can not create the HDF5 file (%s)", (char *) parameter); return NULL; } /* just use _starpu_mktemp_many to create a file, close the file descriptor */ close(id); /* Truncate it */ fileBase->fileID = H5Fcreate((char *)fileBase->path, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (fileBase->fileID < 0) { free(fileBase); _STARPU_ERROR("Can not create the HDF5 file (%s)", (char *) parameter); return NULL; } fileBase->created = 1; } else { /* Well, open it ! */ char *path = strdup((char *)parameter); STARPU_ASSERT(path); fileBase->fileID = H5Fopen((char *)parameter, H5F_ACC_RDWR, H5P_DEFAULT); if (fileBase->fileID < 0) { free(fileBase); free(path); _STARPU_ERROR("Can not open the HDF5 file (%s)", (char *) parameter); return NULL; } fileBase->created = 0; fileBase->path = path; } #ifndef H5_HAVE_THREADSAFE if (actual_nb_disk == 1) { #endif _starpu_hdf5_create_thread(fileBase); #ifndef H5_HAVE_THREADSAFE init_finished = 1; } #endif #if H5_VERS_MAJOR > 1 || (H5_VERS_MAJOR == 1 && H5_VERS_MINOR > 10) || (H5_VERS_MAJOR == 1 && H5_VERS_MINOR == 10 && H5_VERS_RELEASE > 0) H5Pset_file_space_strategy(fileBase->fileID, H5F_FSPACE_STRATEGY_FSM_AGGR, 0, 0); #endif _starpu_hdf5_protect_stop(fileBase); fileBase->next_dataset_id = 0; return (void *) fileBase; } /* free memory allocated for the base */ static void starpu_hdf5_unplug(void *base) { #ifndef H5_HAVE_THREADSAFE int actual_nb_disk = STARPU_ATOMIC_ADD(&nb_disk_open, -1); #endif struct starpu_hdf5_base * fileBase = (struct starpu_hdf5_base *) base; herr_t status; STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); #ifndef H5_HAVE_THREADSAFE if (actual_nb_disk == 0) { #endif HDF5_VAR_RUN = 0; STARPU_PTHREAD_COND_BROADCAST(&HDF5_VAR_COND); STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); STARPU_PTHREAD_JOIN(HDF5_VAR_THREAD, NULL); STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); STARPU_PTHREAD_COND_DESTROY(&HDF5_VAR_COND); STARPU_ASSERT(_starpu_hdf5_work_list_empty(&HDF5_VAR_WORK_LIST)); /* the internal thread is deleted */ #ifndef H5_HAVE_THREADSAFE } #endif status = H5Fclose(fileBase->fileID); STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); #ifndef H5_HAVE_THREADSAFE if (actual_nb_disk == 0) { #endif STARPU_PTHREAD_MUTEX_DESTROY(&HDF5_VAR_MUTEX); #ifndef H5_HAVE_THREADSAFE init_finished = 0; } #endif STARPU_ASSERT_MSG(status >= 0, "Can not unplug this HDF5 disk (%s)\n", fileBase->path); if (fileBase->created) { unlink(fileBase->path); } else { /* Warn user about repack, because unlink dataset doesn't delete data in file */ _STARPU_DISP("This disk (%s) was used to store temporary data. You may use the h5repack command to reduce the size of the file... \n", fileBase->path); } free(fileBase->path); free(fileBase); } static void *starpu_hdf5_alloc(void *base, size_t size) { struct starpu_hdf5_base * fileBase = (struct starpu_hdf5_base *) base; struct starpu_hdf5_obj * obj; char * name; char * prefix = "STARPU_"; char name_id[16]; /* Save the name of the dataset */ STARPU_PTHREAD_MUTEX_LOCK(&HDF5_VAR_MUTEX); snprintf(name_id, sizeof(name_id), "%u", fileBase->next_dataset_id); fileBase->next_dataset_id++; STARPU_PTHREAD_MUTEX_UNLOCK(&HDF5_VAR_MUTEX); /* name in HDF5 is like a path */ _STARPU_MALLOC(name, 1+strlen(prefix)+strlen(name_id)+1); snprintf(name, 1+strlen(prefix)+strlen(name_id)+1, "/%s%s", prefix, name_id); obj = _starpu_hdf5_data_alloc(fileBase, name, size); if (!obj) { free(name); } return (void *) obj; } static void starpu_hdf5_free(void *base, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_hdf5_base * fileBase = (struct starpu_hdf5_base *) base; struct starpu_hdf5_obj * dataObj = (struct starpu_hdf5_obj *) obj; herr_t status; _starpu_hdf5_protect_start(base); status = H5Dclose(dataObj->dataset); STARPU_ASSERT_MSG(status >= 0, "Can not free this HDF5 dataset (%s)\n", dataObj->path); /* remove the dataset link in the HDF5 * But it doesn't delete the space in the file */ status = H5Ldelete(fileBase->fileID, dataObj->path, H5P_DEFAULT); STARPU_ASSERT_MSG(status >= 0, "Can not delete the link associed to this dataset (%s)\n", dataObj->path); _starpu_hdf5_protect_stop(base); free(dataObj->path); free(dataObj); } static void *starpu_hdf5_open(void *base, void *pos, size_t size) { struct starpu_hdf5_base * fileBase = (struct starpu_hdf5_base *) base; struct starpu_hdf5_obj * obj; char *name; name = strdup((char *)pos); STARPU_ASSERT(name); obj = _starpu_hdf5_data_open(fileBase, name, size); if (!obj) { free(name); } return (void *) obj; } static void starpu_hdf5_close(void *base, void *obj, size_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_hdf5_obj * dataObj = (struct starpu_hdf5_obj *) obj; herr_t status; _starpu_hdf5_protect_start(base); status = H5Dclose(dataObj->dataset); STARPU_ASSERT_MSG(status >= 0, "Can not close this HDF5 dataset (%s)\n", dataObj->path); _starpu_hdf5_protect_stop(base); free(dataObj->path); free(dataObj); } static void starpu_hdf5_wait(void * event) { starpu_sem_t * finished = (starpu_sem_t *) event; starpu_sem_wait(finished); } static int starpu_hdf5_test(void * event) { starpu_sem_t * finished = (starpu_sem_t *) event; return starpu_sem_trywait(finished) == 0; } static int starpu_hdf5_full_read(void *base, void *obj, void **ptr, size_t *size, unsigned dst_node) { struct starpu_hdf5_obj * dataObj = (struct starpu_hdf5_obj *) obj; starpu_sem_t finished; starpu_sem_init(&finished, 0, 0); _starpu_hdf5_protect_start(base); *size = _starpu_get_size_obj(dataObj); _starpu_hdf5_protect_stop(base); _starpu_malloc_flags_on_node(dst_node, ptr, *size, 0); starpu_hdf5_send_work(base, obj, 0, NULL, NULL, 0, *ptr, *size, (void*) &finished, FULL_READ); starpu_hdf5_wait(&finished); starpu_sem_destroy(&finished); return 0; } static int starpu_hdf5_full_write(void *base, void *obj, void *ptr, size_t size) { starpu_sem_t finished; starpu_sem_init(&finished, 0, 0); starpu_hdf5_send_work(NULL, NULL, 0, base, obj, 0, ptr, size, (void*) &finished, FULL_WRITE); starpu_hdf5_wait(&finished); starpu_sem_destroy(&finished); return 0; } static int starpu_hdf5_read(void *base, void *obj, void *buf, off_t offset, size_t size) { starpu_sem_t finished; starpu_sem_init(&finished, 0, 0); starpu_hdf5_send_work(base, obj, offset, NULL, NULL, 0, buf, size, (void*) &finished, READ); starpu_hdf5_wait(&finished); starpu_sem_destroy(&finished); return 0; } static int starpu_hdf5_write(void *base, void *obj, const void *buf, off_t offset, size_t size) { starpu_sem_t finished; starpu_sem_init(&finished, 0, 0); starpu_hdf5_send_work(NULL, NULL, 0, base, obj, offset, (void *) buf, size, (void*) &finished, WRITE); starpu_hdf5_wait(&finished); starpu_sem_destroy(&finished); return 0; } static void * starpu_hdf5_async_read(void *base, void *obj, void *buf, off_t offset, size_t size) { starpu_sem_t * finished; _STARPU_MALLOC(finished, sizeof(*finished)); starpu_sem_init(finished, 0, 0); starpu_hdf5_send_work(base, obj, offset, NULL, NULL, 0, buf, size, (void*) finished, READ); return finished; } static void * starpu_hdf5_async_write(void *base, void *obj, void *buf, off_t offset, size_t size) { starpu_sem_t * finished; _STARPU_MALLOC(finished, sizeof(*finished)); starpu_sem_init(finished, 0, 0); starpu_hdf5_send_work(NULL, NULL, 0, base, obj, offset, (void *) buf, size, (void*) finished, WRITE); return finished; } void * starpu_hdf5_async_full_read (void * base, void * obj, void ** ptr, size_t * size, unsigned dst_node) { struct starpu_hdf5_obj * dataObj = (struct starpu_hdf5_obj *) obj; starpu_sem_t * finished; _STARPU_MALLOC(finished, sizeof(*finished)); starpu_sem_init(finished, 0, 0); _starpu_hdf5_protect_start(base); *size = _starpu_get_size_obj(dataObj); _starpu_hdf5_protect_stop(base); _starpu_malloc_flags_on_node(dst_node, ptr, *size, 0); starpu_hdf5_send_work(base, obj, 0, NULL, NULL, 0, *ptr, *size, (void*) finished, FULL_READ); return finished; } void * starpu_hdf5_async_full_write (void * base, void * obj, void * ptr, size_t size) { starpu_sem_t * finished; _STARPU_MALLOC(finished, sizeof(*finished)); starpu_sem_init(finished, 0, 0); starpu_hdf5_send_work(NULL, NULL, 0, base, obj, 0, ptr, size, (void*) finished, FULL_WRITE); return finished; } void * starpu_hdf5_copy(void *base_src, void* obj_src, off_t offset_src, void *base_dst, void* obj_dst, off_t offset_dst, size_t size) { starpu_sem_t * finished; _STARPU_MALLOC(finished, sizeof(*finished)); starpu_sem_init(finished, 0, 0); starpu_hdf5_send_work(base_src, obj_src, offset_src, base_dst, obj_dst, offset_dst, NULL, size, (void*) finished, COPY); return finished; } static void starpu_hdf5_free_request(void * event) { starpu_sem_destroy(event); free(event); } static int get_hdf5_bandwidth_between_disk_and_main_ram(unsigned node, void *base) { unsigned iter; double timing_slowness, timing_latency; double start; double end; char *buf; struct starpu_hdf5_base * fileBase = (struct starpu_hdf5_base *) base; 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; memset(buf, 0, STARPU_DISK_SIZE_MIN); /* 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 */ 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) { _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); 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, fileBase->path); return 1; } struct starpu_disk_ops starpu_disk_hdf5_ops = { .alloc = starpu_hdf5_alloc, .free = starpu_hdf5_free, .open = starpu_hdf5_open, .close = starpu_hdf5_close, .read = starpu_hdf5_read, .write = starpu_hdf5_write, .plug = starpu_hdf5_plug, .unplug = starpu_hdf5_unplug, .copy = starpu_hdf5_copy, .bandwidth = get_hdf5_bandwidth_between_disk_and_main_ram, .full_read = starpu_hdf5_full_read, .full_write = starpu_hdf5_full_write, .async_read = starpu_hdf5_async_read, .async_write = starpu_hdf5_async_write, .async_full_read = starpu_hdf5_async_full_read, .async_full_write = starpu_hdf5_async_full_write, .wait_request = starpu_hdf5_wait, .test_request = starpu_hdf5_test, .free_request = starpu_hdf5_free_request }; starpu-1.3.9+dfsg/src/core/disk_ops/disk_leveldb.cpp000066400000000000000000000240521413463044200224520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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); STARPU_PTHREAD_MUTEX_INIT(&obj->mutex, NULL); size_t len = 6 + 1 + 2+sizeof(void*)*2 + 1; char *key = (char *)malloc(len*sizeof(char)); STARPU_ASSERT(key); 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); 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, unsigned dst_node) { 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(); _starpu_malloc_flags_on_node(dst_node, ptr, *size, 0); STARPU_ASSERT(*ptr); /* 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 = malloc((tmp->size > (offset + size)) ? tmp->size : (offset + size)); STARPU_ASSERT(buffer); /* 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); 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); /* 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.3.9+dfsg/src/core/disk_ops/disk_stdio.c000066400000000000000000000254701413463044200216240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 #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; }; struct starpu_stdio_base { char * path; int created; }; static struct starpu_stdio_obj *_starpu_stdio_init(int descriptor, char *path, size_t size) { struct starpu_stdio_obj *obj; _STARPU_MALLOC(obj, sizeof(struct starpu_stdio_obj)); 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; struct starpu_stdio_base * fileBase = (struct starpu_stdio_base *) base; int id; char *baseCpy = _starpu_mktemp_many(fileBase->path, 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_base * fileBase = (struct starpu_stdio_base *) base; struct starpu_stdio_obj *obj; /* create template */ char *baseCpy; _STARPU_MALLOC(baseCpy, strlen(fileBase->path)+1+strlen(pos)+1); snprintf(baseCpy, strlen(fileBase->path)+1+strlen(pos)+1, "%s/%s", fileBase->path, (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, unsigned dst_node) { 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_on_node(dst_node, 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; } static void *starpu_stdio_plug(void *parameter, starpu_ssize_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_stdio_base * base; struct stat buf; _STARPU_MALLOC(base, sizeof(*base)); base->created = 0; base->path = strdup((char *) parameter); STARPU_ASSERT(base->path); if (!(stat(base->path, &buf) == 0 && S_ISDIR(buf.st_mode))) { _starpu_mkpath(base->path, S_IRWXU); base->created = 1; } return (void *) base; } /* free memory allocated for the base */ static void starpu_stdio_unplug(void *base) { struct starpu_stdio_base * fileBase = (struct starpu_stdio_base *) base; if (fileBase->created) rmdir(fileBase->path); free(fileBase->path); free(fileBase); } 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; struct starpu_stdio_base * fileBase = (struct starpu_stdio_base *) base; 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, fileBase->path); 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.3.9+dfsg/src/core/disk_ops/disk_unistd.c000066400000000000000000000054131413463044200220030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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; _STARPU_MALLOC(obj, sizeof(struct starpu_unistd_global_obj)); /* 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; _STARPU_MALLOC(obj, sizeof(struct starpu_unistd_global_obj)); /* 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, #ifdef STARPU_UNISTD_USE_COPY .copy = starpu_unistd_global_copy, #else .copy = NULL, #endif .bandwidth = _starpu_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, .async_full_read = starpu_unistd_global_async_full_read, .async_full_write = starpu_unistd_global_async_full_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.3.9+dfsg/src/core/disk_ops/disk_unistd_o_direct.c000066400000000000000000000152771413463044200236640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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; _STARPU_MALLOC(obj, sizeof(struct starpu_unistd_global_obj)); /* 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; _STARPU_MALLOC(obj, sizeof(struct starpu_unistd_global_obj)); /* 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 to get aligned buffers for the unistd_o_direct variant"); 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 to get aligned buffers for the unistd_o_direct variant"); 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 to get aligned buffers for the unistd_o_direct variant"); 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 to get aligned buffers for the unistd_o_direct variant"); return starpu_unistd_global_async_write (base, obj, buf, offset, size); } #endif #ifdef STARPU_UNISTD_USE_COPY void * starpu_unistd_o_direct_global_copy(void *base_src, void* obj_src, off_t offset_src, void *base_dst, void* obj_dst, off_t offset_dst, 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()); return starpu_unistd_global_copy(base_src, obj_src, offset_src, base_dst, obj_dst, offset_dst, size); } #endif int starpu_unistd_o_direct_global_full_write(void *base, void *obj, void *ptr, 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)ptr) % getpagesize()) == 0, "You have to use starpu_malloc function to get aligned buffers for the unistd_o_direct variant"); return starpu_unistd_global_full_write(base, obj, ptr, size); } 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, #ifdef STARPU_UNISTD_USE_COPY .copy = starpu_unistd_o_direct_global_copy, #else .copy = NULL, #endif .bandwidth = _starpu_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, .async_full_read = starpu_unistd_global_async_full_read, .async_full_write = starpu_unistd_global_async_full_write, #endif .full_read = starpu_unistd_global_full_read, .full_write = starpu_unistd_o_direct_global_full_write }; starpu-1.3.9+dfsg/src/core/disk_ops/unistd/000077500000000000000000000000001413463044200206225ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/core/disk_ops/unistd/disk_unistd_global.c000066400000000000000000000737621413463044200246450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 #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 #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 #if !defined(HAVE_COPY_FILE_RANGE) && defined( __NR_copy_file_range) static starpu_ssize_t copy_file_range(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags) { return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags); } #endif static unsigned starpu_unistd_opened_files; #ifdef STARPU_UNISTD_USE_COPY LIST_TYPE(starpu_unistd_work_copy, int fd_src; int fd_dst; loff_t off_src; loff_t off_dst; struct starpu_unistd_global_obj * obj_src; struct starpu_unistd_global_obj * obj_dst; size_t len; unsigned flags; starpu_sem_t finished; ); struct starpu_unistd_copy_thread { int run; starpu_pthread_t thread; starpu_pthread_cond_t cond; starpu_pthread_mutex_t mutex; struct starpu_unistd_work_copy_list list; }; static struct starpu_unistd_copy_thread copy_thread[STARPU_MAXNODES][STARPU_MAXNODES]; static unsigned starpu_unistd_nb_disk_opened = 0; /* copy_file_range syscall can return ENOSYS. Use global var to catch * and prevent StarPU using direct disk to disk copy */ static int starpu_unistd_copy_works = 1; #endif struct starpu_unistd_base { char * path; int created; /* To know which thread handles the copy function */ #ifdef STARPU_UNISTD_USE_COPY unsigned disk_index; #endif #if defined(HAVE_LIBAIO_H) io_context_t ctx; struct starpu_unistd_aiocb_link * hashtable; starpu_pthread_mutex_t mutex; #endif }; #if defined(HAVE_LIBAIO_H) struct starpu_unistd_aiocb_link { UT_hash_handle hh; void * starpu_aiocb; void * aiocb; }; struct starpu_unistd_aiocb { int finished; struct iocb iocb; struct starpu_unistd_global_obj *obj; struct starpu_unistd_base *base; size_t len; }; #elif defined(HAVE_AIO_H) struct starpu_unistd_aiocb { struct aiocb aiocb; struct starpu_unistd_global_obj *obj; }; #endif enum starpu_unistd_wait_type { STARPU_UNISTD_AIOCB, STARPU_UNISTD_COPY }; union starpu_unistd_wait_event { struct starpu_unistd_work_copy * event_copy; #if defined(HAVE_LIBAIO_H) || defined(HAVE_AIO_H) struct starpu_unistd_aiocb event_aiocb; #endif }; struct starpu_unistd_wait { enum starpu_unistd_wait_type type; union starpu_unistd_wait_event event; }; /* ------------------- 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); #ifdef STARPU_UNISTD_USE_COPY STARPU_HG_DISABLE_CHECKING(starpu_unistd_copy_works); #endif 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; struct starpu_unistd_base * fileBase = (struct starpu_unistd_base *) base; char *baseCpy = _starpu_mktemp_many(fileBase->path, 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) { struct starpu_unistd_base *fileBase = (struct starpu_unistd_base *) base; /* create template */ char *baseCpy; _STARPU_MALLOC(baseCpy, strlen(fileBase->path)+1+strlen(pos)+1); snprintf(baseCpy, strlen(fileBase->path)+1+strlen(pos)+1, "%s/%s", fileBase->path, (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, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_base * fileBase = (struct starpu_unistd_base *) base; struct starpu_unistd_global_obj *tmp = obj; struct starpu_unistd_wait * event; _STARPU_CALLOC(event, 1,sizeof(*event)); event->type = STARPU_UNISTD_AIOCB; struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; struct iocb *iocb = &starpu_aiocb->iocb; starpu_aiocb->obj = obj; int fd = tmp->descriptor; int err; if (fd < 0) fd = _starpu_unistd_reopen(obj); starpu_aiocb->len = size; starpu_aiocb->finished = 0; starpu_aiocb->base = fileBase; io_prep_pread(iocb, fd, buf, size, offset); if ((err = io_submit(fileBase->ctx, 1, &iocb)) < 0) { _STARPU_DISP("Warning: io_submit returned %d (%s)\n", err, strerror(err)); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); iocb = NULL; } struct starpu_unistd_aiocb_link *l; _STARPU_MALLOC(l, sizeof(*l)); l->aiocb = iocb; l->starpu_aiocb = starpu_aiocb; STARPU_PTHREAD_MUTEX_LOCK(&fileBase->mutex); HASH_ADD_PTR(fileBase->hashtable, aiocb, l); STARPU_PTHREAD_MUTEX_UNLOCK(&fileBase->mutex); return event; } #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_wait * event; _STARPU_CALLOC(event, 1,sizeof(*event)); event->type = STARPU_UNISTD_AIOCB; struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_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) { _STARPU_DISP("Warning: aio_read returned %d (%s)\n", errno, strerror(errno)); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); } return event; } #endif int starpu_unistd_global_full_read(void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void **ptr, size_t *size, unsigned dst_node) { 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_on_node(dst_node, 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, void *obj, void *buf, off_t offset, size_t size) { struct starpu_unistd_base * fileBase = (struct starpu_unistd_base *) base; struct starpu_unistd_global_obj *tmp = obj; struct starpu_unistd_wait * event; _STARPU_CALLOC(event, 1,sizeof(*event)); event->type = STARPU_UNISTD_AIOCB; struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; struct iocb *iocb = &starpu_aiocb->iocb; starpu_aiocb->obj = obj; int fd = tmp->descriptor; int err; if (fd < 0) fd = _starpu_unistd_reopen(obj); starpu_aiocb->len = size; starpu_aiocb->finished = 0; starpu_aiocb->base = fileBase; io_prep_pwrite(iocb, fd, buf, size, offset); if ((err = io_submit(fileBase->ctx, 1, &iocb)) < 0) { _STARPU_DISP("Warning: io_submit returned %d (%s)\n", err, strerror(err)); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); iocb = NULL; } struct starpu_unistd_aiocb_link *l; _STARPU_MALLOC(l, sizeof(*l)); l->aiocb = iocb; l->starpu_aiocb = starpu_aiocb; STARPU_PTHREAD_MUTEX_LOCK(&fileBase->mutex); HASH_ADD_PTR(fileBase->hashtable, aiocb, l); STARPU_PTHREAD_MUTEX_UNLOCK(&fileBase->mutex); return event; } #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_wait * event; _STARPU_CALLOC(event, 1,sizeof(*event)); event->type = STARPU_UNISTD_AIOCB; struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_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) { _STARPU_DISP("Warning: aio_write returned %d (%s)\n", errno, strerror(errno)); if (tmp->descriptor < 0) _starpu_unistd_reclose(fd); aiocb = NULL; } return event; } #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); } #if defined(HAVE_AIO_H) void * starpu_unistd_global_async_full_read (void * base, void * obj, void ** ptr, size_t * size, unsigned dst_node) { 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_on_node(dst_node, ptr, *size, 0); return starpu_unistd_global_async_read(base, obj, *ptr, 0, *size); } void * starpu_unistd_global_async_full_write (void * base, 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_async_write(base, obj, ptr, 0, size); } #endif #ifdef STARPU_UNISTD_USE_COPY static void * starpu_unistd_internal_thread(void * arg) { struct starpu_unistd_copy_thread * internal_copy_thread = (struct starpu_unistd_copy_thread *) arg; while (internal_copy_thread->run || !starpu_unistd_work_copy_list_empty(&internal_copy_thread->list)) { STARPU_PTHREAD_MUTEX_LOCK(&internal_copy_thread->mutex); if (internal_copy_thread->run && starpu_unistd_work_copy_list_empty(&internal_copy_thread->list)) STARPU_PTHREAD_COND_WAIT(&internal_copy_thread->cond, &internal_copy_thread->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&internal_copy_thread->mutex); if (!starpu_unistd_work_copy_list_empty(&internal_copy_thread->list)) { STARPU_PTHREAD_MUTEX_LOCK(&internal_copy_thread->mutex); struct starpu_unistd_work_copy * work = starpu_unistd_work_copy_list_pop_back(&internal_copy_thread->list); STARPU_PTHREAD_MUTEX_UNLOCK(&internal_copy_thread->mutex); starpu_ssize_t ret = copy_file_range(work->fd_src, &work->off_src, work->fd_dst, &work->off_dst, work->len, work->flags); if (ret == -1 && (errno == ENOSYS || errno == EINVAL)) { void *buf; /* System call not supported, or glibc * compatibility layer does not work (e.g. * because we use O_DIRECT and glibc doesn't * align the buffer), avoid submitting more * copies. */ starpu_unistd_copy_works = 0; /* And do the copy by hand for this time */ starpu_malloc(&buf, work->len); ret = pread(work->fd_src, buf, work->len, work->off_src); STARPU_ASSERT_MSG(ret >= 0, "Reading failed (errno %d)", errno); STARPU_ASSERT_MSG((size_t) ret == work->len, "Reading failed (value %ld instead of %ld)", (long)ret, (long)work->len); ret = pwrite(work->fd_dst, buf, work->len, work->off_dst); STARPU_ASSERT_MSG(ret >= 0, "Writing failed (errno %d)", errno); STARPU_ASSERT_MSG((size_t) ret == work->len, "Writing failed (value %ld instead of %ld)", (long)ret, (long)work->len); starpu_free(buf); } else { STARPU_ASSERT_MSG(ret >= 0, "Copy_file_range failed (errno %d)", errno); STARPU_ASSERT_MSG((size_t) ret == work->len, "Copy_file_range failed (value %ld instead of %ld)", (long)ret, (long)work->len); } starpu_sem_post(&work->finished); /* Don't free work, it's done when tested/waited are completed */ } } return NULL; } static void initialize_working_thread(struct starpu_unistd_copy_thread *internal_copy_thread) { STARPU_PTHREAD_MUTEX_INIT(&internal_copy_thread->mutex, NULL); STARPU_PTHREAD_COND_INIT(&internal_copy_thread->cond, NULL); internal_copy_thread->run = 1; starpu_unistd_work_copy_list_init(&internal_copy_thread->list); STARPU_PTHREAD_CREATE(&internal_copy_thread->thread, NULL, starpu_unistd_internal_thread, internal_copy_thread); } #endif /* create a new copy of parameter == base */ void *starpu_unistd_global_plug(void *parameter, starpu_ssize_t size STARPU_ATTRIBUTE_UNUSED) { struct starpu_unistd_base * base; struct stat buf; _STARPU_MALLOC(base, sizeof(*base)); base->created = 0; base->path = strdup((char *) parameter); STARPU_ASSERT(base->path); if (!(stat(base->path, &buf) == 0 && S_ISDIR(buf.st_mode))) { _starpu_mkpath(base->path, S_IRWXU); base->created = 1; } #if defined(HAVE_LIBAIO_H) STARPU_PTHREAD_MUTEX_INIT(&base->mutex, NULL); base->hashtable = NULL; unsigned nb_event = MAX_PENDING_REQUESTS_PER_NODE + MAX_PENDING_PREFETCH_REQUESTS_PER_NODE + MAX_PENDING_IDLE_REQUESTS_PER_NODE; memset(&base->ctx, 0, sizeof(base->ctx)); int ret = io_setup(nb_event, &base->ctx); STARPU_ASSERT(ret == 0); #endif #ifdef STARPU_UNISTD_USE_COPY base->disk_index = starpu_unistd_nb_disk_opened; starpu_unistd_nb_disk_opened++; unsigned i; for (i = 0; i < starpu_unistd_nb_disk_opened; i++) { initialize_working_thread(©_thread[i][base->disk_index]); /* don't initialize twice this case */ if (i != base->disk_index) initialize_working_thread(©_thread[base->disk_index][i]); } #endif return (void *) base; } #ifdef STARPU_UNISTD_USE_COPY static void ending_working_thread(struct starpu_unistd_copy_thread *internal_copy_thread) { STARPU_PTHREAD_MUTEX_LOCK(&internal_copy_thread->mutex); internal_copy_thread->run = 0; STARPU_PTHREAD_COND_BROADCAST(&internal_copy_thread->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&internal_copy_thread->mutex); STARPU_PTHREAD_JOIN(internal_copy_thread->thread, NULL); STARPU_PTHREAD_MUTEX_DESTROY(&internal_copy_thread->mutex); STARPU_PTHREAD_COND_DESTROY(&internal_copy_thread->cond); } #endif /* free memory allocated for the base */ void starpu_unistd_global_unplug(void *base) { struct starpu_unistd_base * fileBase = (struct starpu_unistd_base *) base; #if defined(HAVE_LIBAIO_H) STARPU_PTHREAD_MUTEX_DESTROY(&fileBase->mutex); io_destroy(fileBase->ctx); #endif if (fileBase->created) rmdir(fileBase->path); #ifdef STARPU_UNISTD_USE_COPY unsigned i; for (i = 0; i < fileBase->disk_index+1; i++) { ending_working_thread(©_thread[i][fileBase->disk_index]); /* don't uninitialize twice this case */ if (i != fileBase->disk_index) ending_working_thread(©_thread[fileBase->disk_index][i]); } starpu_unistd_nb_disk_opened--; #endif free(fileBase->path); free(fileBase); } int _starpu_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; struct starpu_unistd_base * fileBase = (struct starpu_unistd_base *) base; 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, fileBase->path); return 1; } void starpu_unistd_global_wait_request(void *async_channel) { struct starpu_unistd_wait * event = async_channel; switch (event->type) { case STARPU_UNISTD_AIOCB : { #if defined(HAVE_LIBAIO_H) struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; struct io_event event; int values = -1; int myerrno = EAGAIN; while(!starpu_aiocb->finished || (values <= 0 && (myerrno == EAGAIN || myerrno == EINTR))) { /* Wait the answer of the request timeout IS NULL */ values = io_getevents(starpu_aiocb->base->ctx, 1, 1, &event, NULL); if (values < 0) myerrno = -values; if (values > 0) { //we may catch an other request... STARPU_PTHREAD_MUTEX_LOCK(&starpu_aiocb->base->mutex); struct starpu_unistd_aiocb_link *l = NULL; HASH_FIND_PTR(starpu_aiocb->base->hashtable, &event.obj, l); STARPU_ASSERT(l != NULL); HASH_DEL(starpu_aiocb->base->hashtable, l); STARPU_PTHREAD_MUTEX_UNLOCK(&starpu_aiocb->base->mutex); ((struct starpu_unistd_aiocb *) l->starpu_aiocb)->finished = 1; free(l); } } #elif defined(HAVE_AIO_H) struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; const struct aiocb *aiocb = &starpu_aiocb->aiocb; 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); #endif break; } #ifdef STARPU_UNISTD_USE_COPY case STARPU_UNISTD_COPY : { starpu_sem_wait(&event->event.event_copy->finished); break; } #endif default : STARPU_ABORT_MSG(); break; } } int starpu_unistd_global_test_request(void *async_channel) { struct starpu_unistd_wait * event = async_channel; switch (event->type) { case STARPU_UNISTD_AIOCB : { #if defined(HAVE_LIBAIO_H) struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; struct io_event event; struct timespec ts; int ret; if (starpu_aiocb->finished) return 1; memset(&ts, 0, sizeof(ts)); /* Test the answer of the request */ ret = io_getevents(starpu_aiocb->base->ctx, 0, 1, &event, &ts); if (ret == 1) { //we may catch an other request... STARPU_PTHREAD_MUTEX_LOCK(&starpu_aiocb->base->mutex); struct starpu_unistd_aiocb_link *l = NULL; HASH_FIND_PTR(starpu_aiocb->base->hashtable, &event.obj, l); STARPU_ASSERT(l != NULL); HASH_DEL(starpu_aiocb->base->hashtable, l); STARPU_PTHREAD_MUTEX_UNLOCK(&starpu_aiocb->base->mutex); ((struct starpu_unistd_aiocb *) l->starpu_aiocb)->finished = 1; free(l); if (starpu_aiocb->finished) return 1; } return 0; #elif defined(HAVE_AIO_H) struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; const struct aiocb *aiocb = &starpu_aiocb->aiocb; 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); #endif break; } #ifdef STARPU_UNISTD_USE_COPY case STARPU_UNISTD_COPY : { return starpu_sem_trywait(&event->event.event_copy->finished) == 0; } #endif default : STARPU_ABORT_MSG(); break; } return 0; } void starpu_unistd_global_free_request(void *async_channel) { struct starpu_unistd_wait * event = async_channel; switch (event->type) { case STARPU_UNISTD_AIOCB : { #if defined(HAVE_LIBAIO_H) struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; struct iocb *iocb = &starpu_aiocb->iocb; if (starpu_aiocb->obj->descriptor < 0) _starpu_unistd_reclose(iocb->aio_fildes); free(event); #elif defined(HAVE_AIO_H) struct starpu_unistd_aiocb *starpu_aiocb = &event->event.event_aiocb; struct aiocb *aiocb = &starpu_aiocb->aiocb; if (starpu_aiocb->obj->descriptor < 0) _starpu_unistd_reclose(aiocb->aio_fildes); aio_return(aiocb); free(event); #endif break; } #ifdef STARPU_UNISTD_USE_COPY case STARPU_UNISTD_COPY : { starpu_sem_destroy(&event->event.event_copy->finished); int fd_src = event->event.event_copy->obj_src->descriptor; if (fd_src < 0) _starpu_unistd_reclose(event->event.event_copy->fd_src); int fd_dst = event->event.event_copy->obj_dst->descriptor; if (fd_dst < 0) _starpu_unistd_reclose(event->event.event_copy->fd_dst); starpu_unistd_work_copy_delete(event->event.event_copy); free(event); break; } #endif default : STARPU_ABORT_MSG(); break; } } #ifdef STARPU_UNISTD_USE_COPY void * starpu_unistd_global_copy(void *base_src, void* obj_src, off_t offset_src, void *base_dst, void* obj_dst, off_t offset_dst, size_t size) { struct starpu_unistd_global_obj * unistd_obj_src = obj_src; struct starpu_unistd_global_obj * unistd_obj_dst = obj_dst; struct starpu_unistd_base * unistd_base_src = base_src; struct starpu_unistd_base * unistd_base_dst = base_dst; if (starpu_unistd_copy_works == 0) /* It didn't work previously, don't bother submitting more. */ return NULL; struct starpu_unistd_wait * event; _STARPU_CALLOC(event, 1,sizeof(*event)); event->type = STARPU_UNISTD_COPY; int fd_src = unistd_obj_src->descriptor; if (fd_src < 0) fd_src = _starpu_unistd_reopen(obj_src); int fd_dst = unistd_obj_dst->descriptor; if (fd_dst < 0) fd_dst = _starpu_unistd_reopen(obj_dst); struct starpu_unistd_work_copy * work = starpu_unistd_work_copy_new(); work->fd_src = fd_src; work->fd_dst = fd_dst; work->obj_src = unistd_obj_src; work->obj_dst = unistd_obj_dst; work->off_src = offset_src; work->off_dst = offset_dst; work->len = size; /* currently not used by copy_file_range */ work->flags = 0; starpu_sem_init(&work->finished, 0, 0); event->event.event_copy = work; struct starpu_unistd_copy_thread * thread = ©_thread[unistd_base_src->disk_index][unistd_base_dst->disk_index]; STARPU_PTHREAD_MUTEX_LOCK(&thread->mutex); starpu_unistd_work_copy_list_push_front(&thread->list, work); STARPU_PTHREAD_COND_BROADCAST(&thread->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&thread->mutex); return event; } #endif starpu-1.3.9+dfsg/src/core/disk_ops/unistd/disk_unistd_global.h000066400000000000000000000056201413463044200246360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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__ /** @file */ #include #ifdef __linux__ #include #endif #ifndef O_BINARY #define O_BINARY 0 #endif #define STARPU_UNISTD_USE_COPY 1 #if !defined(HAVE_COPY_FILE_RANGE) && !defined(__NR_copy_file_range) #undef STARPU_UNISTD_USE_COPY #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 _starpu_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_async_full_write (void * base, void * obj, void * ptr, size_t size); void * starpu_unistd_global_async_full_read (void * base, void * obj, void ** ptr, size_t * size, unsigned dst_node); 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, unsigned dst_node); int starpu_unistd_global_full_write (void * base, void * obj, void * ptr, size_t size); #ifdef STARPU_UNISTD_USE_COPY void * starpu_unistd_global_copy(void *base_src, void* obj_src, off_t offset_src, void *base_dst, void* obj_dst, off_t offset_dst, size_t size); #endif #endif starpu-1.3.9+dfsg/src/core/drivers.c000066400000000000000000000035541413463044200173320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_driver_init(struct starpu_driver *d) { STARPU_ASSERT(d); struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); if (worker->driver_ops == NULL) return -EINVAL; else return worker->driver_ops->init(worker); } int starpu_driver_run(struct starpu_driver *d) { if (!d) { _STARPU_DEBUG("Invalid argument\n"); return -EINVAL; } struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); if (worker->driver_ops == NULL) return -EINVAL; else return worker->driver_ops->run(worker); } int starpu_driver_run_once(struct starpu_driver *d) { STARPU_ASSERT(d); struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); if (worker->driver_ops == NULL) return -EINVAL; else return worker->driver_ops->run_once(worker); } int starpu_driver_deinit(struct starpu_driver *d) { STARPU_ASSERT(d); struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); if (worker->driver_ops == NULL) return -EINVAL; else return worker->driver_ops->deinit(worker); } starpu-1.3.9+dfsg/src/core/drivers.h000066400000000000000000000020131413463044200173240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __DRIVERS_H__ #define __DRIVERS_H__ /** @file */ struct _starpu_driver_ops { int (*init)(struct _starpu_worker *worker); int (*run)(struct _starpu_worker *worker); int (*run_once)(struct _starpu_worker *worker); int (*deinit)(struct _starpu_worker *worker); }; #endif // __DRIVERS_H__ starpu-1.3.9+dfsg/src/core/errorcheck.c000066400000000000000000000047251413463044200200040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/src/core/errorcheck.h000066400000000000000000000045101413463044200200010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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, but looking for tasks to do */ STATUS_SLEEPING_SCHEDULING, /** while sleeping because there is nothing to do, and not even scheduling */ STATUS_SLEEPING }; 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.3.9+dfsg/src/core/idle_hook.c000066400000000000000000000055411413463044200176070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 idle_hook_rwlock; static struct progression_hook idle_hooks[NMAXHOOKS] = {{NULL, NULL, 0}}; static int active_idle_hook_cnt = 0; /* * Staticly initializing idle_hook_rwlock seems to lead to weird errors * on Darwin, so we do it dynamically. */ void _starpu_init_idle_hooks(void) { STARPU_PTHREAD_RWLOCK_INIT(&idle_hook_rwlock, NULL); STARPU_HG_DISABLE_CHECKING(active_idle_hook_cnt); } int starpu_idle_hook_register(unsigned (*func)(void *arg), void *arg) { int hook; STARPU_PTHREAD_RWLOCK_WRLOCK(&idle_hook_rwlock); for (hook = 0; hook < NMAXHOOKS; hook++) { if (!idle_hooks[hook].active) { /* We found an empty slot */ idle_hooks[hook].func = func; idle_hooks[hook].arg = arg; idle_hooks[hook].active = 1; active_idle_hook_cnt++; STARPU_PTHREAD_RWLOCK_UNLOCK(&idle_hook_rwlock); return hook; } } STARPU_PTHREAD_RWLOCK_UNLOCK(&idle_hook_rwlock); starpu_wake_all_blocked_workers(); /* We could not find an empty slot */ return -1; } void starpu_idle_hook_deregister(int hook_id) { STARPU_PTHREAD_RWLOCK_WRLOCK(&idle_hook_rwlock); if (idle_hooks[hook_id].active) active_idle_hook_cnt--; idle_hooks[hook_id].active = 0; STARPU_PTHREAD_RWLOCK_UNLOCK(&idle_hook_rwlock); } unsigned _starpu_execute_registered_idle_hooks(void) { if (active_idle_hook_cnt == 0) return 1; /* By default, it is possible to block, but if some idle 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(&idle_hook_rwlock); active = idle_hooks[hook].active; STARPU_PTHREAD_RWLOCK_UNLOCK(&idle_hook_rwlock); unsigned may_block_hook = 1; if (active) may_block_hook = idle_hooks[hook].func(idle_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.3.9+dfsg/src/core/idle_hook.h000066400000000000000000000015511413463044200176110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __IDLE_HOOK_H__ #define __IDLE_HOOK_H__ /** @file */ void _starpu_init_idle_hooks(void); unsigned _starpu_execute_registered_idle_hooks(void); #endif /* !__IDLE_HOOK_H__ */ starpu-1.3.9+dfsg/src/core/jobs.c000066400000000000000000000635501413463044200166130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 max_memory_use; static int task_progress; static unsigned long njobs_finished; 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); task_progress = starpu_get_env_number_default("STARPU_TASK_PROGRESS", 0); #ifdef STARPU_DEBUG _starpu_job_multilist_head_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; _STARPU_TRACE_TASK_EXCLUDE_FROM_DAG(j); } /* 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; #if !defined(STARPU_USE_FXT) && !defined(STARPU_DEBUG) if (_starpu_bound_recording || _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_fxt_get_job_id(); 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; } struct _starpu_job* _starpu_get_job_associated_to_task_slow(struct starpu_task *task, struct _starpu_job *job) { if (job == _STARPU_JOB_UNSET) { job = STARPU_VAL_COMPARE_AND_SWAP_PTR(&task->starpu_private, _STARPU_JOB_UNSET, _STARPU_JOB_SETTING); if (job != _STARPU_JOB_UNSET && job != _STARPU_JOB_SETTING) { /* Actually available in the meanwhile */ STARPU_RMB(); return job; } if (job == _STARPU_JOB_UNSET) { /* Ok, we have to do it */ job = _starpu_job_create(task); STARPU_WMB(); task->starpu_private = job; return job; } } /* Saw _STARPU_JOB_SETTING, somebody is doing it, wait for it. * This is rare enough that busy-reading is fine enough. */ while ((job = task->starpu_private) == _STARPU_JOB_SETTING) { STARPU_UYIELD(); STARPU_SYNCHRONIZE(); } STARPU_RMB(); 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_task_end_dep_release(struct starpu_task *t) { struct _starpu_job *j = _starpu_get_job_associated_to_task(t); _starpu_handle_job_termination(j); } void starpu_task_end_dep_add(struct starpu_task *t, int nb_deps) { struct _starpu_job *j = _starpu_get_job_associated_to_task(t); STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); t->nb_termination_call_required += nb_deps; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); } void _starpu_handle_job_termination(struct _starpu_job *j) { if (j->task->nb_termination_call_required != 0) { STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); int nb = j->task->nb_termination_call_required; j->task->nb_termination_call_required -= 1; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); if (nb != 0) return; } if (task_progress) { unsigned long jobs = STARPU_ATOMIC_ADDL(&njobs_finished, 1); fprintf(stderr,"\r%lu tasks finished (last %lu %p on %d)...", jobs, j->job_id, j->task, starpu_worker_get_id()); } struct starpu_task *task = j->task; struct starpu_task *end_rdep = NULL; unsigned sched_ctx = task->sched_ctx; double flops = task->flops; const unsigned continuation = #ifdef STARPU_OPENMP j->continuation #else 0 #endif ; #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); STARPU_ASSERT(task->status == STARPU_TASK_RUNNING); #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; end_rdep = j->end_rdep; } 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); } } /* Check nowhere before releasing the sequential consistency (which may * unregister the handle and free its switch_cl, and thus task->cl here. */ unsigned nowhere = !task->cl || task->cl->where == STARPU_NOWHERE || task->where == STARPU_NOWHERE; /* 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 } /* Remove ourself from the graph before notifying dependencies */ if (_starpu_graph_record) _starpu_graph_drop_job(j); /* Get callback pointer for codelet before notifying dependencies, in case dependencies free the codelet (see starpu_data_unregister for instance) */ void (*callback)(void *) = task->callback_func; if (!callback && task->cl) callback = task->cl->callback_func; /* 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); } /* 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); } /* 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 */ if (end_rdep) starpu_task_end_dep_release(end_rdep); _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 (callback) { 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); if (callback) callback(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); } } /* 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; unsigned synchronous = task->synchronous; /* 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 && !synchronous) || continuation , "Regenerated task must be detached (was %u), and not have detroy=1 (was %u) or synchronous=1 (was %u)", detach, destroy, 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 */ task->status = STARPU_TASK_BLOCKED; 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)) { STARPU_ASSERT(j->task->status == STARPU_TASK_BLOCKED || j->task->status == STARPU_TASK_BLOCKED_ON_TAG); 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); /* respect data concurrent access */ if (_starpu_concurrent_data_access(j)) { _STARPU_LOG_OUT_TAG("concurrent_data_access"); 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); /* respect data concurrent access */ if (_starpu_concurrent_data_access(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 /* This is called when a tag or task dependency is to be released. */ void _starpu_enforce_deps_notify_job_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data, int tag) { if (!j->submitted) /* It's not even submitted actually */ return; struct _starpu_cg_list *job_successors = &j->job_successors; /* tag is 1 when we got woken up by a tag dependency about to be * released, and thus we have to check the exact numbner of * dependencies. Otherwise it's a task dependency which is about to be * released. */ if (job_successors->ndeps != job_successors->ndeps_completed + 1 - tag) /* There are still other dependencies */ return; _starpu_enforce_data_deps_notify_job_ready_soon(j, data); } /* 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->where))) return -ENODEV; starpu_worker_lock(worker->workerid); 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 { #ifdef STARPU_DEVEL #warning FIXME use a prio_list #endif 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_worker_unlock(worker->workerid); return 0; } starpu-1.3.9+dfsg/src/core/jobs.h000066400000000000000000000270031413463044200166110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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->where & STARPU_CPU) #define _STARPU_CUDA_MAY_PERFORM(j) ((j)->task->where & STARPU_CUDA) #define _STARPU_OPENCL_MAY_PERFORM(j) ((j)->task->where & STARPU_OPENCL) #define _STARPU_MIC_MAY_PERFORM(j) ((j)->task->where & STARPU_MIC) struct _starpu_data_descr { starpu_data_handle_t handle; enum starpu_data_access_mode mode; int node; /** This is the value actually chosen, only set by _starpu_fetch_task_input for coherency with __starpu_push_task_output */ int index; int orderedindex; /** For this field the array is actually indexed by parameter order, and this provides the ordered index */ }; #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; /** A task that this will unlock quickly, e.g. we are the pre_sync part * of a data acquisition, and the caller promised that data release will * happen immediately, so that the post_sync task will be started * immediately after. */ struct _starpu_job *quick_next; /** 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; /** Task whose termination depends on this task */ struct starpu_task *end_rdep; /** 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; /** Did that task use sequential consistency for its data? */ unsigned sequential_consistency: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 void _starpu_enforce_deps_notify_job_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data, int tag); /** 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_INDEX(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].index : job->ordered_buffers[i].index) #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_INDEX(job, __index, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].index = (__index); else job->ordered_buffers[i].index = (__index);} while(0) #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[0]) #define _STARPU_JOB_GET_DEP_SLOTS(job) (((job)->dyn_dep_slots) ? (job)->dyn_dep_slots : (job)->dep_slots) #endif // __JOBS_H__ starpu-1.3.9+dfsg/src/core/parallel_task.c000066400000000000000000000042241413463044200204650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/core/perfmodel/000077500000000000000000000000001413463044200174565ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/core/perfmodel/multiple_regression.c000066400000000000000000000272451413463044200237270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2018 Umeà University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Code for computing multiple linear regression */ #include typedef long int integer; typedef double doublereal; #ifdef STARPU_MLR_MODEL #ifdef STARPU_BUILT_IN_MIN_DGELS int _starpu_dgels_(char *trans, integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); #else int dgels_(char *trans, integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info); #endif #endif //STARPU_MLR_MODEL static unsigned long count_file_lines(FILE *f) { unsigned long lines=0; while(!feof(f)) { int ch = fgetc(f); if(ch == '\n') { lines++; } } rewind(f); return lines; } static void dump_multiple_regression_list(double *mpar, double *my, int start, unsigned nparameters, struct starpu_perfmodel_history_list *list_history) { struct starpu_perfmodel_history_list *ptr = list_history; int i = start; unsigned j; while (ptr) { my[i] = ptr->entry->duration; for(j=0; jentry->parameters[j]; ptr = ptr->next; i++; } } static void load_old_calibration(double *mx, double *my, unsigned nparameters, char *filepath) { char buffer[1024]; char *line; int i=0; FILE *f = fopen(filepath, "a+"); STARPU_ASSERT_MSG(f, "Could not load performance model from file %s\n", filepath); line = fgets(buffer,sizeof(buffer),f);//skipping first line STARPU_ASSERT(line); while((line=fgets(buffer,sizeof(buffer),f))!=NULL) { char *record = strtok(line,","); STARPU_ASSERT_MSG(record, "Could not load performance model from file %s\n", filepath); my[i] = atof(record); record = strtok(NULL,","); int j=0; while(record != NULL) { mx[i*nparameters+j] = atof(record) ; ++j; record = strtok(NULL,","); } ++i ; } fclose(f); } static unsigned long find_long_list_size(struct starpu_perfmodel_history_list *list_history) { long cnt = 0; struct starpu_perfmodel_history_list *ptr = list_history; while (ptr) { cnt++; ptr = ptr->next; } return cnt; } #ifdef STARPU_MLR_MODEL int dgels_multiple_reg_coeff(double *mpar, double *my, unsigned long nn, unsigned ncoeff, unsigned nparameters, double *coeff, unsigned **combinations) { /* Arguments */ /* ========= */ /* TRANS (input) CHARACTER*1 */ /* = 'N': the linear system involves A; */ /* = 'T': the linear system involves A**T. */ /* M (input) INTEGER */ /* The number of rows of the matrix A. M >= 0. */ /* N (input) INTEGER */ /* The number of columns of the matrix A. N >= 0. */ /* NRHS (input) INTEGER */ /* The number of right hand sides, i.e., the number of */ /* columns of the matrices B and X. NRHS >=0. */ /* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) */ /* On entry, the M-by-N matrix A. */ /* On exit, */ /* if M >= N, A is overwritten by details of its QR */ /* factorization as returned by DGEQRF; */ /* if M < N, A is overwritten by details of its LQ */ /* factorization as returned by DGELQF. */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,M). */ /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */ /* On entry, the matrix B of right hand side vectors, stored */ /* columnwise; B is M-by-NRHS if TRANS = 'N', or N-by-NRHS */ /* if TRANS = 'T'. */ /* On exit, if INFO = 0, B is overwritten by the solution */ /* vectors, stored columnwise: */ /* if TRANS = 'N' and m >= n, rows 1 to n of B contain the least */ /* squares solution vectors; the residual sum of squares for the */ /* solution in each column is given by the sum of squares of */ /* elements N+1 to M in that column; */ /* if TRANS = 'N' and m < n, rows 1 to N of B contain the */ /* minimum norm solution vectors; */ /* if TRANS = 'T' and m >= n, rows 1 to M of B contain the */ /* minimum norm solution vectors; */ /* if TRANS = 'T' and m < n, rows 1 to M of B contain the */ /* least squares solution vectors; the residual sum of squares */ /* for the solution in each column is given by the sum of */ /* squares of elements M+1 to N in that column. */ /* LDB (input) INTEGER */ /* The leading dimension of the array B. LDB >= MAX(1,M,N). */ /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ /* LWORK (input) INTEGER */ /* The dimension of the array WORK. */ /* LWORK >= max( 1, MN + max( MN, NRHS ) ). */ /* For optimal performance, */ /* LWORK >= max( 1, MN + max( MN, NRHS )*NB ). */ /* where MN = min(M,N) and NB is the optimum block size. */ /* If LWORK = -1, then a workspace query is assumed; the routine */ /* only calculates the optimal size of the WORK array, returns */ /* this value as the first entry of the WORK array, and no error */ /* message related to LWORK is issued by XERBLA. */ /* INFO (output) INTEGER */ /* = 0: successful exit */ /* < 0: if INFO = -i, the i-th argument had an illegal value */ /* > 0: if INFO = i, the i-th diagonal element of the */ /* triangular factor of A is zero, so that A does not have */ /* full rank; the least squares solution could not be */ /* computed. */ /* ===================================================================== */ if(nn <= ncoeff) { _STARPU_DISP("Warning: This function is not intended for the use when number of parameters is larger than the number of observations. Check how your matrices A and B were allocated or simply add more benchmarks.\n Multiple linear regression model will not be written into perfmodel file.\n"); return 1; } char trans = 'N'; integer m = nn; integer n = ncoeff; integer nrhs = 1; // number of columns of B and X (wich are vectors therefore nrhs=1) doublereal *X; _STARPU_MALLOC(X, sizeof(double)*n*m); // (/!\ modified at the output) contain the model and the different values of pararmters doublereal *Y; _STARPU_MALLOC(Y, sizeof(double)*m); double coefficient; int i, j; unsigned k; for (i=0; i < m; i++) { Y[i] = my[i]; X[i] = 1.; for (j=1; j < n; j++) { coefficient = 1.; for(k=0; k < nparameters; k++) { coefficient *= pow(mpar[i*nparameters+k],combinations[j-1][k]); } X[i+j*m] = coefficient; } } integer lda = m; integer ldb = m; // integer info = 0; integer lwork = n*2; doublereal *work; // (output) _STARPU_MALLOC(work, sizeof(double)*lwork); /* // Running LAPACK dgels_ */ #ifdef STARPU_BUILT_IN_MIN_DGELS _starpu_dgels_(&trans, &m, &n, &nrhs, X, &lda, Y, &ldb, work, &lwork, &info); #else dgels_(&trans, &m, &n, &nrhs, X, &lda, Y, &ldb, work, &lwork, &info); #endif /* Check for the full rank */ if( info != 0 ) { _STARPU_DISP("Warning: Problems when executing dgels_ function. It seems like the diagonal element %ld is zero.\n Multiple linear regression model will not be written into perfmodel file.\n", info); free(X); free(Y); free(work); return 1; } /* Copy computed coefficients */ for(i=0; i<(int) ncoeff; i++) coeff[i] = Y[i]; free(X); free(Y); free(work); return 0; } #endif //STARPU_MLR_MODEL /* Validating the accuracy of the coefficients. For the the validation is extremely basic, but it should be improved. */ void starpu_validate_mlr(double *coeff, unsigned ncoeff, const char *codelet_name) { unsigned i; if (coeff[0] < 0) _STARPU_DISP("Warning: Constant computed by least square method is negative (%f). The model %s is likely to be inaccurate.\n", coeff[0], codelet_name); for(i=1; i 0) load_old_calibration(mpar, my, nparameters, filepath); /* Filling X and Y matrices with measured values */ dump_multiple_regression_list(mpar, my, old_lines, nparameters, ptr); if (ncoeff!=0 && combinations!=NULL) { #ifdef STARPU_MLR_MODEL /* Computing coefficients using multiple linear regression */ if(dgels_multiple_reg_coeff(mpar, my, n, ncoeff, nparameters, coeff, combinations)) { free(mpar); free(my); return 1; } /* Basic validation of the model accuracy */ starpu_validate_mlr(coeff, ncoeff, codelet_name); #else _STARPU_DISP("Warning: StarPU was compiled without '--enable-mlr' option, thus multiple linear regression model will not be computed.\n"); for(i=0; i 0) { f = fopen(filepath, "a+"); STARPU_ASSERT_MSG(f, "Could not save performance model into the file %s\n", filepath); } else { f = fopen(filepath, "w+"); STARPU_ASSERT_MSG(f, "Could not save performance model into the file %s\n", filepath); fprintf(f, "Duration"); for(j=0; j #include #include #include #include int _starpu_multiple_regression(struct starpu_perfmodel_history_list *ptr, double *coeff, unsigned ncoeff, unsigned nparameters, const char **parameters_names, unsigned **combinations, const char *codelet_name); #endif // __MULTIPLE_REGRESSION_H__ starpu-1.3.9+dfsg/src/core/perfmodel/perfmodel.c000066400000000000000000000421111413463044200215760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #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_sched_ctx *stream_ctx = _starpu_worker_get_ctx_stream(workerid); if(stream_ctx != NULL) return _starpu_sched_ctx_get_perf_archtype(stream_ctx->id); } 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_MPI_MS_WORKER) coef = _STARPU_MPI_MS_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: case STARPU_MULTIPLE_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) { double exp_perf = 0.0; 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: exp_perf = per_arch_task_expected_perf(model, arch, task, nimpl); STARPU_ASSERT_MSG(isnan(exp_perf)||exp_perf>=0,"exp_perf=%lf\n",exp_perf); break; case STARPU_COMMON: exp_perf = common_task_expected_perf(model, arch, task, nimpl); STARPU_ASSERT_MSG(isnan(exp_perf)||exp_perf>=0,"exp_perf=%lf\n",exp_perf); break; case STARPU_HISTORY_BASED: exp_perf = _starpu_history_based_job_expected_perf(model, arch, j, nimpl); STARPU_ASSERT_MSG(isnan(exp_perf)||exp_perf>=0,"exp_perf=%lf\n",exp_perf); break; case STARPU_REGRESSION_BASED: exp_perf = _starpu_regression_based_job_expected_perf(model, arch, j, nimpl); STARPU_ASSERT_MSG(isnan(exp_perf)||exp_perf>=0,"exp_perf=%lf\n",exp_perf); break; case STARPU_NL_REGRESSION_BASED: exp_perf = _starpu_non_linear_regression_based_job_expected_perf(model, arch, j,nimpl); STARPU_ASSERT_MSG(isnan(exp_perf)||exp_perf>=0,"exp_perf=%lf\n",exp_perf); break; case STARPU_MULTIPLE_REGRESSION_BASED: exp_perf = _starpu_multiple_regression_based_job_expected_perf(model, arch, j, nimpl); STARPU_ASSERT_MSG(isnan(exp_perf)||exp_perf>=0,"exp_perf=%lf\n",exp_perf); break; default: STARPU_ABORT(); } } /* no model was found */ return exp_perf; } 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; 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; enum starpu_node_kind node_kind; handle = STARPU_TASK_GET_HANDLE(task, i); if (!_starpu_data_is_multiformat_handle(handle)) continue; node_kind = _starpu_worker_get_node_kind(arch->devices[0].type); 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_data_is_on_node(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; #define MAX_REQUESTS 4 unsigned src_nodes[MAX_REQUESTS]; unsigned dst_nodes[MAX_REQUESTS]; unsigned handling_nodes[MAX_REQUESTS]; int nhops = _starpu_determine_request_path(handle, src_node, memory_node, mode, MAX_REQUESTS, src_nodes, dst_nodes, handling_nodes, 0); int i; double duration = 0.; for (i = 0; i < nhops; i++) duration += starpu_transfer_predict(src_nodes[i], dst_nodes[i], size); return duration; } /* 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); int node = _starpu_task_data_get_node_on_node(task, buffer, memory_node); penalty += starpu_data_expected_transfer_time(handle, node, mode); } return penalty; } /* Data transfer performance modeling */ double starpu_task_expected_data_transfer_time_for(struct starpu_task *task, unsigned worker) { 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); int node = _starpu_task_data_get_node_on_worker(task, buffer, worker); penalty += starpu_data_expected_transfer_time(handle, 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. */ _starpu_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(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_free_arch_combs(); } static double nop_cost_function(struct starpu_task *t STARPU_ATTRIBUTE_UNUSED, struct starpu_perfmodel_arch *a STARPU_ATTRIBUTE_UNUSED, unsigned i STARPU_ATTRIBUTE_UNUSED) { return 0.000001; } struct starpu_perfmodel starpu_perfmodel_nop = { .type = STARPU_PER_ARCH, .arch_cost_function = nop_cost_function, }; starpu-1.3.9+dfsg/src/core/perfmodel/perfmodel.h000066400000000000000000000105121413463044200216030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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 45 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; /** The number of combinations currently used by the model */ int ncombs; /** The number of combinations allocated in the array nimpls and ncombs */ int ncombs_set; 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); double _starpu_multiple_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) unsigned *_starpu_get_cuda_affinity_vector(unsigned gpuid); #endif #if defined(STARPU_USE_OPENCL) unsigned *_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); void _starpu_free_arch_combs(void); #if defined(STARPU_HAVE_HWLOC) hwloc_topology_t _starpu_perfmodel_get_hwtopology(); #endif #ifdef __cplusplus } #endif #endif // __PERFMODEL_H__ starpu-1.3.9+dfsg/src/core/perfmodel/perfmodel_bus.c000066400000000000000000002633661413463044200224700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 1 #endif #include #endif #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #ifdef STARPU_USE_OPENCL #include #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef STARPU_HAVE_HWLOC #include #ifdef STARPU_HAVE_LIBNVIDIA_ML #include #endif #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #if HWLOC_API_VERSION < 0x00010b00 #define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE #endif #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 numa_id; double timing_htod; double latency_htod; double timing_dtoh; double latency_dtoh; }; /* TODO: measure latency */ static double bandwidth_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; /* MB/s */ static double latency_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; /* µs */ static unsigned was_benchmarked = 0; #ifndef STARPU_SIMGRID static unsigned ncpus = 0; #endif static unsigned nnumas = 0; static unsigned ncuda = 0; static unsigned nopencl = 0; static unsigned nmic = 0; static unsigned nmpi_ms = 0; /* Benchmarking the performance of the bus */ static double numa_latency[STARPU_MAXNUMANODES][STARPU_MAXNUMANODES]; static double numa_timing[STARPU_MAXNUMANODES][STARPU_MAXNUMANODES]; #ifndef STARPU_SIMGRID static uint64_t cuda_size[STARPU_MAXCUDADEVS]; #endif #ifdef STARPU_USE_CUDA /* preference order of cores (logical indexes) */ static unsigned cuda_affinity_matrix[STARPU_MAXCUDADEVS][STARPU_MAXNUMANODES]; #ifndef STARPU_SIMGRID #ifdef STARPU_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_numa[STARPU_MAXCUDADEVS*STARPU_MAXNUMANODES]; static char cudadev_direct[STARPU_MAXNODES][STARPU_MAXNODES]; #endif #ifndef STARPU_SIMGRID static uint64_t opencl_size[STARPU_MAXOPENCLDEVS]; #endif #ifdef STARPU_USE_OPENCL /* preference order of cores (logical indexes) */ static unsigned opencl_affinity_matrix[STARPU_MAXOPENCLDEVS][STARPU_MAXNUMANODES]; static struct dev_timing opencldev_timing_per_numa[STARPU_MAXOPENCLDEVS*STARPU_MAXNUMANODES]; #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_USE_MPI_MASTER_SLAVE static double mpi_time_device_to_device[STARPU_MAXMPIDEVS][STARPU_MAXMPIDEVS] = {{0.0}}; static double mpi_latency_device_to_device[STARPU_MAXMPIDEVS][STARPU_MAXMPIDEVS] = {{0.0}}; #endif #ifdef STARPU_HAVE_HWLOC static hwloc_topology_t hwtopology; hwloc_topology_t _starpu_perfmodel_get_hwtopology() { return 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_numa_with_cuda(int dev, int numa, int cpu, struct dev_timing *dev_timing_per_cpu) { _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); 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(cpu, STARPU_NOWORKERID, NULL); /* hack to force the initialization */ cudaFree(0); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); /* 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); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); /* Allocate a buffer on the host */ unsigned char *h_buffer; #if defined(STARPU_HAVE_HWLOC) struct _starpu_machine_config *config = _starpu_get_machine_config(); const unsigned nnuma_nodes = _starpu_topology_get_nnumanodes(config); if (nnuma_nodes > 1) { /* NUMA mode activated */ hwloc_obj_t obj = hwloc_get_obj_by_type(hwtopology, HWLOC_OBJ_NUMANODE, numa); #if HWLOC_API_VERSION >= 0x00020000 h_buffer = hwloc_alloc_membind(hwtopology, size, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); #else h_buffer = hwloc_alloc_membind_nodeset(hwtopology, size, obj->nodeset, HWLOC_MEMBIND_BIND, 0); #endif } else #endif { /* we use STARPU_MAIN_RAM */ _STARPU_MALLOC(h_buffer, size); cudaHostRegister((void *)h_buffer, size, 0); } if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); /* Fill them */ memset(h_buffer, 0, size); cudaMemset(d_buffer, 0, size); cudaDeviceSynchronize(); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); const unsigned timing_numa_index = dev*STARPU_MAXNUMANODES + numa; 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); cudaDeviceSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[timing_numa_index].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); cudaDeviceSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[timing_numa_index].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); cudaDeviceSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[timing_numa_index].latency_htod = timing/NITER; /* Measure download latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(h_buffer, d_buffer, 1, cudaMemcpyDeviceToHost); cudaDeviceSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[timing_numa_index].latency_dtoh = timing/NITER; /* Free buffers */ cudaHostUnregister(h_buffer); #if defined(STARPU_HAVE_HWLOC) if (nnuma_nodes > 1) { /* NUMA mode activated */ hwloc_free(hwtopology, h_buffer, size); } else #endif { free(h_buffer); } cudaFree(d_buffer); #if CUDART_VERSION >= 4000 cudaDeviceReset(); #else cudaThreadExit(); #endif } #ifdef STARPU_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); (void) cudaGetLastError(); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(dst, 0); (void) cudaGetLastError(); if (!cures) { _STARPU_DISP("GPU-Direct %d -> %d\n", dst, src); cudadev_direct[src][dst] = 1; } } } /* Allocate a buffer on the device */ unsigned char *s_buffer; cures = cudaMalloc((void **)&s_buffer, size); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cudaMemset(s_buffer, 0, size); cudaDeviceSynchronize(); /* 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); (void) cudaGetLastError(); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(src, 0); (void) cudaGetLastError(); if (!cures) { _STARPU_DISP("GPU-Direct %d -> %d\n", src, dst); cudadev_direct[dst][src] = 1; } } } /* Allocate a buffer on the device */ unsigned char *d_buffer; cures = cudaMalloc((void **)&d_buffer, size); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cudaMemset(d_buffer, 0, size); cudaDeviceSynchronize(); 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); cudaDeviceSynchronize(); } end = starpu_timing_now(); timing = end - start; cudadev_timing_dtod[src][dst] = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpyPeer(d_buffer, dst, s_buffer, src, 1); cudaDeviceSynchronize(); } end = starpu_timing_now(); timing = end - start; cudadev_latency_dtod[src][dst] = timing/NITER; /* Free buffers */ cudaFree(d_buffer); cudaSetDevice(src); cudaFree(s_buffer); #if CUDART_VERSION >= 4000 cudaDeviceReset(); #else cudaThreadExit(); #endif } #endif #endif #ifdef STARPU_USE_OPENCL static void measure_bandwidth_between_host_and_dev_on_numa_with_opencl(int dev, int numa, 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; _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); /* 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(cpu, STARPU_NOWORKERID, NULL); /* 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(cpu, STARPU_NOWORKERID, NULL); /* Allocate a buffer on the host */ unsigned char *h_buffer; #if defined(STARPU_HAVE_HWLOC) struct _starpu_machine_config *config = _starpu_get_machine_config(); const unsigned nnuma_nodes = _starpu_topology_get_nnumanodes(config); if (nnuma_nodes > 1) { /* NUMA mode activated */ hwloc_obj_t obj = hwloc_get_obj_by_type(hwtopology, HWLOC_OBJ_NUMANODE, numa); #if HWLOC_API_VERSION >= 0x00020000 h_buffer = hwloc_alloc_membind(hwtopology, size, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); #else h_buffer = hwloc_alloc_membind_nodeset(hwtopology, size, obj->nodeset, HWLOC_MEMBIND_BIND, 0); #endif } else #endif { /* we use STARPU_MAIN_RAM */ _STARPU_MALLOC(h_buffer, size); } /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(cpu, STARPU_NOWORKERID, NULL); /* 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(cpu, STARPU_NOWORKERID, NULL); const unsigned timing_numa_index = dev*STARPU_MAXNUMANODES + numa; 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[timing_numa_index].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[timing_numa_index].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[timing_numa_index].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[timing_numa_index].latency_dtoh = timing/NITER; /* Free buffers */ err = clReleaseMemObject(d_buffer); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); #if defined(STARPU_HAVE_HWLOC) if (nnuma_nodes > 1) { /* NUMA mode activated */ hwloc_free(hwtopology, h_buffer, size); } else #endif { 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_cpu_from_numa_node(hwloc_obj_t obj) { STARPU_ASSERT(obj); hwloc_obj_t current = obj; while (current->depth != HWLOC_OBJ_PU) { current = current->first_child; /* If we don't find a "PU" obj before the leave, perhaps we are * just not allowed to use it. */ if (!current) return -1; } STARPU_ASSERT(current->depth == HWLOC_OBJ_PU); return current->logical_index; } #endif static void measure_bandwidth_between_numa_nodes_and_dev(int dev, struct dev_timing *dev_timing_per_numanode, char *type) { /* We measure the bandwith between each GPU and each NUMA node */ struct _starpu_machine_config * config = _starpu_get_machine_config(); const unsigned nnuma_nodes = _starpu_topology_get_nnumanodes(config); unsigned numa_id; for (numa_id = 0; numa_id < nnuma_nodes; numa_id++) { /* Store results by starpu id */ const unsigned timing_numa_index = dev*STARPU_MAXNUMANODES + numa_id; /* Store STARPU_memnode for later */ dev_timing_per_numanode[timing_numa_index].numa_id = numa_id; /* Chose one CPU connected to this NUMA node */ int cpu_id = 0; #ifdef STARPU_HAVE_HWLOC hwloc_obj_t obj = hwloc_get_obj_by_type(hwtopology, HWLOC_OBJ_NUMANODE, numa_id); if (obj) { #if HWLOC_API_VERSION >= 0x00020000 /* From hwloc 2.0, NUMAnode objects do not contain CPUs, they are contained in a group which contain the CPUs. */ obj = obj->parent; #endif cpu_id = find_cpu_from_numa_node(obj); } else /* No such NUMA node, probably hwloc 1.x with no NUMA * node, just take one CPU from the whole system */ cpu_id = find_cpu_from_numa_node(hwloc_get_root_obj(hwtopology)); #endif if (cpu_id < 0) continue; #ifdef STARPU_USE_CUDA if (strncmp(type, "CUDA", 4) == 0) measure_bandwidth_between_host_and_dev_on_numa_with_cuda(dev, numa_id, cpu_id, dev_timing_per_numanode); #endif #ifdef STARPU_USE_OPENCL if (strncmp(type, "OpenCL", 6) == 0) measure_bandwidth_between_host_and_dev_on_numa_with_opencl(dev, numa_id, cpu_id, dev_timing_per_numanode); #endif } } static void measure_bandwidth_between_host_and_dev(int dev, struct dev_timing *dev_timing_per_numa, char *type) { measure_bandwidth_between_numa_nodes_and_dev(dev, dev_timing_per_numa, type); #ifdef STARPU_VERBOSE struct _starpu_machine_config * config = _starpu_get_machine_config(); const unsigned nnuma_nodes = _starpu_topology_get_nnumanodes(config); unsigned numa_id; for (numa_id = 0; numa_id < nnuma_nodes; numa_id++) { const unsigned timing_numa_index = dev*STARPU_MAXNUMANODES + numa_id; double bandwidth_dtoh = dev_timing_per_numa[timing_numa_index].timing_dtoh; double bandwidth_htod = dev_timing_per_numa[timing_numa_index].timing_htod; double bandwidth_sum2 = bandwidth_dtoh*bandwidth_dtoh + bandwidth_htod*bandwidth_htod; _STARPU_DISP("(%10s) BANDWIDTH GPU %d NUMA %u - htod %f - dtoh %f - %f\n", type, dev, numa_id, bandwidth_htod, bandwidth_dtoh, sqrt(bandwidth_sum2)); } #endif } #endif /* defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) */ static void measure_bandwidth_latency_between_numa(int numa_src, int numa_dst) { #if defined(STARPU_HAVE_HWLOC) if (nnumas > 1) { /* NUMA mode activated */ double start, end, timing; unsigned iter; unsigned char *h_buffer; hwloc_obj_t obj_src = hwloc_get_obj_by_type(hwtopology, HWLOC_OBJ_NUMANODE, numa_src); #if HWLOC_API_VERSION >= 0x00020000 h_buffer = hwloc_alloc_membind(hwtopology, SIZE, obj_src->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); #else h_buffer = hwloc_alloc_membind_nodeset(hwtopology, SIZE, obj_src->nodeset, HWLOC_MEMBIND_BIND, 0); #endif unsigned char *d_buffer; hwloc_obj_t obj_dst = hwloc_get_obj_by_type(hwtopology, HWLOC_OBJ_NUMANODE, numa_dst); #if HWLOC_API_VERSION >= 0x00020000 d_buffer = hwloc_alloc_membind(hwtopology, SIZE, obj_dst->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); #else d_buffer = hwloc_alloc_membind_nodeset(hwtopology, SIZE, obj_dst->nodeset, HWLOC_MEMBIND_BIND, 0); #endif memset(h_buffer, 0, SIZE); start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { memcpy(d_buffer, h_buffer, SIZE); } end = starpu_timing_now(); timing = end - start; numa_timing[numa_src][numa_dst] = timing/NITER/SIZE; start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { memcpy(d_buffer, h_buffer, 1); } end = starpu_timing_now(); timing = end - start; numa_latency[numa_src][numa_dst] = timing/NITER; hwloc_free(hwtopology, h_buffer, SIZE); hwloc_free(hwtopology, d_buffer, SIZE); } else #endif { /* Cannot make a real calibration */ numa_timing[numa_src][numa_dst] = 0.01; numa_latency[numa_src][numa_dst] = 0; } } 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 */ unsigned i, j; _STARPU_DEBUG("Benchmarking the speed of the bus\n"); #ifdef STARPU_HAVE_HWLOC hwloc_topology_init(&hwtopology); _starpu_topology_filter(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 defined(__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); nnumas = _starpu_topology_get_nnumanodes(config); for (i = 0; i < nnumas; i++) for (j = 0; j < nnumas; j++) if (i != j) { _STARPU_DISP("NUMA %d -> %d...\n", i, j); measure_bandwidth_latency_between_numa(i, j); } #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_per_numa, "CUDA"); } #ifdef STARPU_HAVE_CUDA_MEMCPY_PEER for (i = 0; i < ncuda; i++) { 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_per_numa, "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_USE_MPI_MASTER_SLAVE _starpu_mpi_common_measure_bandwidth_latency(mpi_time_device_to_device, mpi_latency_device_to_device); #endif /* STARPU_USE_MPI_MASTER_SLAVE */ #ifdef STARPU_HAVE_HWLOC hwloc_set_cpubind(hwtopology, former_cpuset, HWLOC_CPUBIND_THREAD); hwloc_bitmap_free(former_cpuset); #elif defined(__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 #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static void load_bus_affinity_file_content(void) { 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_MSG(f, "Error when reading from file '%s'", path); locked = _starpu_frdlock(f) == 0; 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_MSG(ret == 1, "Error when reading from file '%s'", path); STARPU_ASSERT(dummy == gpu); unsigned numa; for (numa = 0; numa < nnumas; numa++) { ret = fscanf(f, "%u\t", &cuda_affinity_matrix[gpu][numa]); STARPU_ASSERT_MSG(ret == 1, "Error when reading from file '%s'", path); } ret = fscanf(f, "\n"); STARPU_ASSERT_MSG(ret == 0, "Error when reading from file '%s'", path); } #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_MSG(ret == 1, "Error when reading from file '%s'", path); STARPU_ASSERT(dummy == gpu); unsigned numa; for (numa = 0; numa < nnumas; numa++) { ret = fscanf(f, "%u\t", &opencl_affinity_matrix[gpu][numa]); STARPU_ASSERT_MSG(ret == 1, "Error when reading from file '%s'", path); } ret = fscanf(f, "\n"); STARPU_ASSERT_MSG(ret == 0, "Error when reading from file '%s'", path); } #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 numa; unsigned gpu; fprintf(f, "# GPU\t"); for (numa = 0; numa < nnumas; numa++) fprintf(f, "NUMA%u\t", numa); fprintf(f, "\n"); #ifdef STARPU_USE_CUDA { /* Use an other array to sort bandwidth */ struct dev_timing cudadev_timing_per_numa_sorted[STARPU_MAXCUDADEVS*STARPU_MAXNUMANODES]; memcpy(cudadev_timing_per_numa_sorted, cudadev_timing_per_numa, STARPU_MAXCUDADEVS*STARPU_MAXNUMANODES*sizeof(struct dev_timing)); for (gpu = 0; gpu < ncuda; gpu++) { fprintf(f, "%u\t", gpu); qsort(&(cudadev_timing_per_numa_sorted[gpu*STARPU_MAXNUMANODES]), nnumas, sizeof(struct dev_timing), compar_dev_timing); for (numa = 0; numa < nnumas; numa++) { fprintf(f, "%d\t", cudadev_timing_per_numa_sorted[gpu*STARPU_MAXNUMANODES+numa].numa_id); } fprintf(f, "\n"); } } #endif #ifdef STARPU_USE_OPENCL { /* Use an other array to sort bandwidth */ struct dev_timing opencldev_timing_per_numa_sorted[STARPU_MAXOPENCLDEVS*STARPU_MAXNUMANODES]; memcpy(opencldev_timing_per_numa_sorted, opencldev_timing_per_numa, STARPU_MAXOPENCLDEVS*STARPU_MAXNUMANODES*sizeof(struct dev_timing)); for (gpu = 0; gpu < nopencl; gpu++) { fprintf(f, "%u\t", gpu); qsort(&(opencldev_timing_per_numa_sorted[gpu*STARPU_MAXNUMANODES]), nnumas, sizeof(struct dev_timing), compar_dev_timing); for (numa = 0; numa < nnumas; numa++) { fprintf(f, "%d\t", opencldev_timing_per_numa_sorted[gpu*STARPU_MAXNUMANODES+numa].numa_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(); #ifdef STARPU_USE_MPI_MASTER_SLAVE /* Slaves don't write files */ if (!_starpu_mpi_common_is_src_node()) return; #endif write_bus_affinity_file_content(); } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static int check_bus_affinity_file(void) { int ret = 1; FILE *f; int locked; unsigned dummy; char path[PATH_LENGTH]; get_affinity_path(path, sizeof(path)); _STARPU_DEBUG("loading affinities from %s\n", path); f = fopen(path, "r"); STARPU_ASSERT_MSG(f, "Error when reading from file '%s'", path); locked = _starpu_frdlock(f) == 0; ret = fscanf(f, "# GPU\t"); STARPU_ASSERT_MSG(ret == 0, "Error when reading from file '%s'", path); ret = fscanf(f, "NUMA%u\t", &dummy); if (locked) _starpu_frdunlock(f); fclose(f); return ret == 1; } #endif static void load_bus_affinity_file(void) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) int exist, check = 1; char path[PATH_LENGTH]; get_affinity_path(path, sizeof(path)); /* access return 0 if file exists */ exist = access(path, F_OK); if (exist == 0) /* return 0 if it's not good */ check = check_bus_affinity_file(); if (check == 0) _STARPU_DISP("Affinity File is too old for this version of StarPU ! Rebuilding it...\n"); if (check == 0 || exist != 0) { /* File does not exist yet */ generate_bus_affinity_file(); } load_bus_affinity_file_content(); #endif } #ifdef STARPU_USE_CUDA unsigned *_starpu_get_cuda_affinity_vector(unsigned gpuid) { return cuda_affinity_matrix[gpuid]; } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL unsigned *_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 numa; unsigned gpu; #endif fprintf(f, "# GPU\tNUMA 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' (%d) in latency file %s\n", 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' (%d) in latency file %s\n", 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; } #if !defined(STARPU_SIMGRID) && (defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)) static double search_bus_best_latency(int src, char * type, int htod) { /* Search the best latency for this node */ double best = 0.0; double actual = 0.0; unsigned check = 0; unsigned numa; for (numa = 0; numa < nnumas; numa++) { #ifdef STARPU_USE_CUDA if (strncmp(type, "CUDA", 4) == 0) { if (htod) actual = cudadev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].latency_htod; else actual = cudadev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].latency_dtoh; } #endif #ifdef STARPU_USE_OPENCL if (strncmp(type, "OpenCL", 6) == 0) { if (htod) actual = opencldev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].latency_htod; else actual = opencldev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].latency_dtoh; } #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) if (!check || actual < best) { best = actual; check = 1; } #endif } return best; } #endif #if !defined(STARPU_SIMGRID) static void write_bus_latency_file_content(void) { unsigned src, dst, maxnode; /* Boundaries to check if src or dst are inside the interval */ unsigned b_low, b_up; 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, "a+"); if (!f) { perror("fopen write_bus_latency_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } locked = _starpu_fwrlock(f) == 0; fseek(f, 0, SEEK_SET); _starpu_fftruncate(f, 0); fprintf(f, "# "); for (dst = 0; dst < STARPU_MAXNODES; dst++) fprintf(f, "to %u\t\t", dst); fprintf(f, "\n"); maxnode = nnumas; #ifdef STARPU_USE_CUDA maxnode += ncuda; #endif #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif #ifdef STARPU_USE_MIC maxnode += nmic; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE maxnode += nmpi_ms; #endif for (src = 0; src < STARPU_MAXNODES; src++) { for (dst = 0; dst < STARPU_MAXNODES; dst++) { /* µs */ double latency = 0.0; if ((src >= maxnode) || (dst >= maxnode)) { /* convention */ latency = NAN; } else if (src == dst) { latency = 0.0; } else { b_low = b_up = 0; /* ---- Begin NUMA ---- */ b_up += nnumas; if (src >= b_low && src < b_up && dst >= b_low && dst < b_up) latency += numa_latency[src-b_low][dst-b_low]; /* copy interval to check numa index later */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) unsigned numa_low = b_low; unsigned numa_up = b_up; #endif b_low += nnumas; /* ---- End NUMA ---- */ #ifdef STARPU_USE_CUDA b_up += ncuda; #ifdef STARPU_HAVE_CUDA_MEMCPY_PEER if (src >= b_low && src < b_up && dst >= b_low && dst < b_up) latency += cudadev_latency_dtod[src-b_low][dst-b_low]; else #endif { /* Check if it's CUDA <-> NUMA link */ if (src >=b_low && src < b_up && dst >= numa_low && dst < numa_up) latency += cudadev_timing_per_numa[(src-b_low)*STARPU_MAXNUMANODES+dst-numa_low].latency_dtoh; if (dst >= b_low && dst < b_up && src >= numa_low && dst < numa_up) latency += cudadev_timing_per_numa[(dst-b_low)*STARPU_MAXNUMANODES+src-numa_low].latency_htod; /* To other devices, take the best latency */ if (src >= b_low && src < b_up && !(dst >= numa_low && dst < numa_up)) latency += search_bus_best_latency(src-b_low, "CUDA", 0); if (dst >= b_low && dst < b_up && !(src >= numa_low && dst < numa_up)) latency += search_bus_best_latency(dst-b_low, "CUDA", 1); } b_low += ncuda; #endif #ifdef STARPU_USE_OPENCL b_up += nopencl; /* Check if it's OpenCL <-> NUMA link */ if (src >= b_low && src < b_up && dst >= numa_low && dst < numa_up) latency += opencldev_timing_per_numa[(src-b_low)*STARPU_MAXNUMANODES+dst-numa_low].latency_dtoh; if (dst >= b_low && dst < b_up && src >= numa_low && dst < numa_up) latency += opencldev_timing_per_numa[(dst-b_low)*STARPU_MAXNUMANODES+src-numa_low].latency_htod; /* To other devices, take the best latency */ if (src >= b_low && src < b_up && !(dst >= numa_low && dst < numa_up)) latency += search_bus_best_latency(src-b_low, "OpenCL", 0); if (dst >= b_low && dst < b_up && !(src >= numa_low && dst < numa_up)) latency += search_bus_best_latency(dst-b_low, "OpenCL", 1); b_low += nopencl; #endif #ifdef STARPU_USE_MIC b_up += nmic; /* TODO Latency MIC */ b_low += nmic; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE b_up += nmpi_ms; /* Modify MPI src and MPI dst if they contain the master node or not * Because, we only take care about slaves */ int mpi_master = _starpu_mpi_common_get_src_node(); int mpi_src = src - b_low; mpi_src = (mpi_master <= mpi_src) ? mpi_src+1 : mpi_src; int mpi_dst = dst - b_low; mpi_dst = (mpi_master <= mpi_dst) ? mpi_dst+1 : mpi_dst; if (src >= b_low && src < b_up && dst >= b_low && dst < b_up) latency += mpi_latency_device_to_device[mpi_src][mpi_dst]; else { if (src >= b_low && src < b_up) latency += mpi_latency_device_to_device[mpi_src][mpi_master]; if (dst >= b_low && dst < b_up) latency += mpi_latency_device_to_device[mpi_master][mpi_dst]; } b_low += nmpi_ms; #endif } if (dst > 0) 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(); #ifdef STARPU_USE_MPI_MASTER_SLAVE /* Slaves don't write files */ if (!_starpu_mpi_common_is_src_node()) return; #endif #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(); res = load_bus_latency_file_content(); STARPU_ASSERT(res); } } /* * 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' (%d) in bandwidth file %s\n", n, n, path); fclose(f); return 0; } int limit_bandwidth = starpu_get_env_number("STARPU_LIMIT_BANDWIDTH"); if (limit_bandwidth >= 0) { #ifndef STARPU_SIMGRID _STARPU_DISP("Warning: STARPU_LIMIT_BANDWIDTH set to %d but simgrid not enabled, thus ignored\n", limit_bandwidth); #else #ifdef HAVE_SG_LINK_BANDWIDTH_SET bandwidth = limit_bandwidth; #else _STARPU_DISP("Warning: STARPU_LIMIT_BANDWIDTH set to %d but this requires simgrid 3.26\n", limit_bandwidth); #endif #endif } 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' (%d) in bandwidth file %s\n", 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; } #if !defined(STARPU_SIMGRID) && (defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)) static double search_bus_best_timing(int src, char * type, int htod) { /* Search the best latency for this node */ double best = 0.0; double actual = 0.0; unsigned check = 0; unsigned numa; for (numa = 0; numa < nnumas; numa++) { #ifdef STARPU_USE_CUDA if (strncmp(type, "CUDA", 4) == 0) { if (htod) actual = cudadev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].timing_htod; else actual = cudadev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].timing_dtoh; } #endif #ifdef STARPU_USE_OPENCL if (strncmp(type, "OpenCL", 6) == 0) { if (htod) actual = opencldev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].timing_htod; else actual = opencldev_timing_per_numa[src*STARPU_MAXNUMANODES+numa].timing_dtoh; } #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) if (!check || actual < best) { best = actual; check = 1; } #endif } return best; } #endif #if !defined(STARPU_SIMGRID) static void write_bus_bandwidth_file_content(void) { unsigned src, dst, maxnode; unsigned b_low, b_up; 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, "a+"); STARPU_ASSERT_MSG(f, "Error when opening file (writing) '%s'", path); locked = _starpu_fwrlock(f) == 0; fseek(f, 0, SEEK_SET); _starpu_fftruncate(f, 0); fprintf(f, "# "); for (dst = 0; dst < STARPU_MAXNODES; dst++) fprintf(f, "to %u\t\t", dst); fprintf(f, "\n"); maxnode = nnumas; #ifdef STARPU_USE_CUDA maxnode += ncuda; #endif #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif #ifdef STARPU_USE_MIC maxnode += nmic; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE maxnode += nmpi_ms; #endif for (src = 0; src < STARPU_MAXNODES; src++) { for (dst = 0; dst < STARPU_MAXNODES; dst++) { double bandwidth; if ((src >= maxnode) || (dst >= maxnode)) { bandwidth = NAN; } else if (src != dst) { double slowness = 0.0; /* Total bandwidth is the harmonic mean of bandwidths */ b_low = b_up = 0; /* Begin NUMA */ b_up += nnumas; if (src >= b_low && src < b_up && dst >= b_low && dst < b_up) slowness += numa_timing[src-b_low][dst-b_low]; /* copy interval to check numa index later */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) unsigned numa_low = b_low; unsigned numa_up = b_up; #endif b_low += nnumas; /* End NUMA */ #ifdef STARPU_USE_CUDA b_up += ncuda; #ifdef STARPU_HAVE_CUDA_MEMCPY_PEER if (src >= b_low && src < b_up && dst >= b_low && dst < b_up) /* Direct GPU-GPU transfert */ slowness += cudadev_timing_dtod[src-b_low][dst-b_low]; else #endif { /* Check if it's CUDA <-> NUMA link */ if (src >= b_low && src < b_up && dst >= numa_low && dst < numa_up) slowness += cudadev_timing_per_numa[(src-b_low)*STARPU_MAXNUMANODES+dst-numa_low].timing_dtoh; if (dst >= b_low && dst < b_up && src >= numa_low && dst < numa_up) slowness += cudadev_timing_per_numa[(dst-b_low)*STARPU_MAXNUMANODES+src-numa_low].timing_htod; /* To other devices, take the best slowness */ if (src >= b_low && src < b_up && !(dst >= numa_low && dst < numa_up)) slowness += search_bus_best_timing(src-b_low, "CUDA", 0); if (dst >= b_low && dst < b_up && !(src >= numa_low && dst < numa_up)) slowness += search_bus_best_timing(dst-b_low, "CUDA", 1); } b_low += ncuda; #endif #ifdef STARPU_USE_OPENCL b_up += nopencl; /* Check if it's OpenCL <-> NUMA link */ if (src >= b_low && src < b_up && dst >= numa_low && dst < numa_up) slowness += opencldev_timing_per_numa[(src-b_low)*STARPU_MAXNUMANODES+dst-numa_low].timing_dtoh; if (dst >= b_low && dst < b_up && src >= numa_low && dst < numa_up) slowness += opencldev_timing_per_numa[(dst-b_low)*STARPU_MAXNUMANODES+src-numa_low].timing_htod; /* To other devices, take the best slowness */ if (src >= b_low && src < b_up && !(dst >= numa_low && dst < numa_up)) slowness += search_bus_best_timing(src-b_low, "OpenCL", 0); if (dst >= b_low && dst < b_up && !(src >= numa_low && dst < numa_up)) slowness += search_bus_best_timing(dst-b_low, "OpenCL", 1); b_low += nopencl; #endif #ifdef STARPU_USE_MIC b_up += nmic; if (src >= b_low && src < b_up) slowness += mic_time_device_to_host[src-b_low]; if (dst >= b_low && dst < b_up) slowness += mic_time_host_to_device[dst-b_low]; b_low += nmic; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE b_up += nmpi_ms; /* Modify MPI src and MPI dst if they contain the master node or not * Because, we only take care about slaves */ int mpi_master = _starpu_mpi_common_get_src_node(); int mpi_src = src - b_low; mpi_src = (mpi_master <= mpi_src) ? mpi_src+1 : mpi_src; int mpi_dst = dst - b_low; mpi_dst = (mpi_master <= mpi_dst) ? mpi_dst+1 : mpi_dst; if (src >= b_low && src < b_up && dst >= b_low && dst < b_up) slowness += mpi_time_device_to_device[mpi_src][mpi_dst]; else { if (src >= b_low && src < b_up) slowness += mpi_time_device_to_device[mpi_src][mpi_master]; if (dst >= b_low && dst < b_up) slowness += mpi_time_device_to_device[mpi_master][mpi_dst]; } b_low += nmpi_ms; #endif bandwidth = 1.0/slowness; } 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 = starpu_memory_nodes_get_count(); fprintf(f, "from/to\t"); for (dst = 0; dst < maxnode; dst++) { char name[128]; starpu_memory_node_get_name(dst, name, sizeof(name)); fprintf(f, "%s\t", name); } fprintf(f, "\n"); for (src = 0; src < maxnode; src++) { char name[128]; starpu_memory_node_get_name(src, name, sizeof(name)); fprintf(f, "%s\t", name); 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++) { char name[128]; starpu_memory_node_get_name(src, name, sizeof(name)); fprintf(f, "%s\t", name); 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\tNUMA in preference order (logical index), host-to-device, device-to-host\n"); for (src = 0; src < ncuda + nopencl; src++) { struct dev_timing *timing; struct _starpu_machine_config * config = _starpu_get_machine_config(); unsigned config_nnumas = _starpu_topology_get_nnumanodes(config); unsigned numa; #ifdef STARPU_USE_CUDA if (src < ncuda) { fprintf(f, "CUDA_%u\t", src); for (numa = 0; numa < config_nnumas; numa++) { timing = &cudadev_timing_per_numa[src*STARPU_MAXNUMANODES+numa]; if (timing->timing_htod) fprintf(f, "%2d %.0f %.0f\t", timing->numa_id, 1/timing->timing_htod, 1/timing->timing_dtoh); else fprintf(f, "%2u\t", cuda_affinity_matrix[src][numa]); } } #ifdef STARPU_USE_OPENCL else #endif #endif #ifdef STARPU_USE_OPENCL { fprintf(f, "OpenCL%u\t", src-ncuda); for (numa = 0; numa < config_nnumas; numa++) { timing = &opencldev_timing_per_numa[(src-ncuda)*STARPU_MAXNUMANODES+numa]; if (timing->timing_htod) fprintf(f, "%2d %.0f %.0f\t", timing->numa_id, 1/timing->timing_htod, 1/timing->timing_dtoh); else fprintf(f, "%2u\t", opencl_affinity_matrix[src][numa]); } } #endif fprintf(f, "\n"); } #endif } static void generate_bus_bandwidth_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); #ifdef STARPU_USE_MPI_MASTER_SLAVE /* Slaves don't write files */ if (!_starpu_mpi_common_is_src_node()) return; #endif #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(); res = load_bus_bandwidth_file_content(); STARPU_ASSERT(res); } } #ifndef STARPU_SIMGRID /* * Config */ static void get_config_path(char *path, size_t maxlen) { get_bus_path("config", path, maxlen); } #if defined(STARPU_USE_MPI_MASTER_SLAVE) /* check if the master or one slave has to recalibrate */ static int mpi_check_recalibrate(int my_recalibrate) { int nb_mpi = _starpu_mpi_src_get_device_count() + 1; int mpi_recalibrate[nb_mpi]; int i; MPI_Allgather(&my_recalibrate, 1, MPI_INT, mpi_recalibrate, 1, MPI_INT, MPI_COMM_WORLD); for (i = 0; i < nb_mpi; i++) { if (mpi_recalibrate[i]) { return 1; } } return 0; } #endif static void compare_value_and_recalibrate(char * msg, unsigned val_file, unsigned val_detected) { int recalibrate = 0; if (val_file != val_detected) recalibrate = 1; #ifdef STARPU_USE_MPI_MASTER_SLAVE //Send to each other to know if we had to recalibrate because someone cannot have the correct value in the config file recalibrate = mpi_check_recalibrate(recalibrate); #endif if (recalibrate) { #ifdef STARPU_USE_MPI_MASTER_SLAVE /* Only the master prints the message */ if (_starpu_mpi_common_is_src_node()) #endif _STARPU_DISP("Current configuration does not match the bus performance model (%s: (stored) %d != (current) %d), recalibrating...\n", msg, val_file, val_detected); _starpu_bus_force_sampling(); #ifdef STARPU_USE_MPI_MASTER_SLAVE if (_starpu_mpi_common_is_src_node()) #endif _STARPU_DISP("... done\n"); } } static void check_bus_config_file(void) { int res; char path[PATH_LENGTH]; struct _starpu_machine_config *config = _starpu_get_machine_config(); int recalibrate = 0; get_config_path(path, sizeof(path)); res = access(path, F_OK); if (res || config->conf.bus_calibrate > 0) recalibrate = 1; #if defined(STARPU_USE_MPI_MASTER_SLAVE) //Send to each other to know if we had to recalibrate because someone cannot have the config file recalibrate = mpi_check_recalibrate(recalibrate); #endif if (recalibrate) { 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, read_mpi_ms = -1; unsigned read_cpus = -1, read_numa = -1; int locked; // Loading configuration from file f = fopen(path, "r"); STARPU_ASSERT_MSG(f, "Error when reading from file '%s'", path); locked = _starpu_frdlock(f) == 0; _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_cpus); STARPU_ASSERT_MSG(ret == 1, "Error when reading from file '%s'", path); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_numa); STARPU_ASSERT_MSG(ret == 1, "Error when reading from file '%s'", path); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_cuda); STARPU_ASSERT_MSG(ret == 1, "Error when reading from file '%s'", path); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_opencl); STARPU_ASSERT_MSG(ret == 1, "Error when reading from file '%s'", path); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_mic); if (ret == 0) read_mic = 0; _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_mpi_ms); if (ret == 0) read_mpi_ms = 0; _starpu_drop_comments(f); if (locked) _starpu_frdunlock(f); fclose(f); // Loading current configuration ncpus = _starpu_topology_get_nhwcpu(config); nnumas = _starpu_topology_get_nnumanodes(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 */ #ifdef STARPU_USE_MPI_MASTER_SLAVE nmpi_ms = _starpu_mpi_src_get_device_count(); #endif /* STARPU_USE_MPI_MASTER_SLAVE */ // Checking if both configurations match compare_value_and_recalibrate("CPUS", read_cpus, ncpus); compare_value_and_recalibrate("NUMA", read_numa, nnumas); compare_value_and_recalibrate("CUDA", read_cuda, ncuda); compare_value_and_recalibrate("OpenCL", read_opencl, nopencl); compare_value_and_recalibrate("MIC", read_mic, nmic); compare_value_and_recalibrate("MPI Master-Slave", read_mpi_ms, nmpi_ms); } } 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, "a+"); STARPU_ASSERT_MSG(f, "Error when opening file (writing) '%s'", path); locked = _starpu_fwrlock(f) == 0; fseek(f, 0, SEEK_SET); _starpu_fftruncate(f, 0); fprintf(f, "# Current configuration\n"); fprintf(f, "%u # Number of CPUs\n", ncpus); fprintf(f, "%u # Number of NUMA nodes\n", nnumas); 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); fprintf(f, "%u # Number of MPI devices\n", nmpi_ms); if (locked) _starpu_fwrunlock(f); fclose(f); } static void generate_bus_config_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); #ifdef STARPU_USE_MPI_MASTER_SLAVE /* Slaves don't write files */ if (!_starpu_mpi_common_is_src_node()) return; #endif 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(STARPU_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; } #if HWLOC_API_VERSION >= 0x00020000 hwloc_obj_t io; for (io = parent->io_first_child; io; io = io->next_sibling) if (io != obj1 && find_platform_path_down(io, NULL, obj2, bandwidth)) { /* Found it down there, update bandwidth of parent */ update_bandwidth_down(io, bandwidth); update_bandwidth_through(parent, bandwidth); return 1; } #endif 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; } static hwloc_obj_t get_hwloc_cuda_obj(hwloc_topology_t topology, unsigned devid) { hwloc_obj_t res; struct cudaDeviceProp props; cudaError_t cures; res = hwloc_cuda_get_device_osdev_by_index(topology, devid); if (res) return res; cures = cudaGetDeviceProperties(&props, devid); if (cures == cudaSuccess) { res = hwloc_get_pcidev_by_busid(topology, props.pciDomainID, props.pciBusID, props.pciDeviceID, 0); if (res) return res; #ifdef STARPU_HAVE_LIBNVIDIA_ML nvmlDevice_t nvmldev = _starpu_cuda_get_nvmldev(&props); if (nvmldev) { unsigned int index; if (nvmlDeviceGetIndex(nvmldev, &index) == NVML_SUCCESS) { res = hwloc_nvml_get_device_osdev_by_index(topology, index); if (res) return res; } res = hwloc_nvml_get_device_osdev(topology, nvmldev); if (res) return res; } #endif } return NULL; } /* 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 = get_hwloc_cuda_obj(topology, i); cudaj = get_hwloc_cuda_obj(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); #if HWLOC_API_VERSION >= 0x00020000 hwloc_obj_t io; for (io = obj->io_first_child; io; io = io->next_sibling) emit_topology_bandwidths(f, io, Bps, s); #endif } /* 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; } #if HWLOC_API_VERSION >= 0x00020000 hwloc_obj_t io; for (io = parent->io_first_child; io; io = io->next_sibling) if (io != obj1 && emit_platform_path_down(f, io, NULL, obj2)) { /* Found it down there, path goes through this hub */ emit_pci_link_down(f, io); emit_pci_link_through(f, parent); return 1; } #endif 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); obj->userdata = NULL; } for (i = 0; i < obj->arity; i++) clean_topology(obj->children[i]); #if HWLOC_API_VERSION >= 0x00020000 hwloc_obj_t io; for (io = obj->io_first_child; io; io = io->next_sibling) clean_topology(io); #endif } #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, "a+"); if (!f) { perror("fopen write_bus_platform_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } locked = _starpu_fwrlock(f) == 0; fseek(f, 0, SEEK_SET); _starpu_fftruncate(f, 0); fprintf(f, "\n" "\n" " \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, 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 STARPU_HAVE_CUDA_MEMCPY_PEER fprintf(f, " \n"); #endif /* TODO: record cudadev_direct instead of assuming it's NUMA nodes */ 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; #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) unsigned numa; #endif #ifdef STARPU_USE_CUDA for (i = 0; i < ncuda; i++) { for (numa = 0; numa < nnumas; numa++) { double down_bw = 1.0 / cudadev_timing_per_numa[i*STARPU_MAXNUMANODES+numa].timing_dtoh; double up_bw = 1.0 / cudadev_timing_per_numa[i*STARPU_MAXNUMANODES+numa].timing_htod; 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++) { for (numa = 0; numa < nnumas; numa++) { double down_bw = 1.0 / opencldev_timing_per_numa[i*STARPU_MAXNUMANODES+numa].timing_dtoh; double up_bw = 1.0 / opencldev_timing_per_numa[i*STARPU_MAXNUMANODES+numa].timing_htod; 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 / search_bus_best_timing(i, "OpenCL", 1), Bps, search_bus_best_latency(i, "OpenCL", 1)/1000000., s); fprintf(f, " \n", i_name, 1000000 / search_bus_best_timing(i, "OpenCL", 0), Bps, search_bus_best_latency(i, "OpenCL", 0)/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. / search_bus_best_timing(i, "CUDA", 1), Bps, search_bus_best_latency(i, "CUDA", 1)/1000000., s); fprintf(f, " \n", i_name, 1000000. / search_bus_best_timing(i, "CUDA", 0), Bps, search_bus_best_latency(i, "CUDA", 0)/1000000., s); } fprintf(f, "\n"); #ifdef STARPU_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[i][j], Bps, cudadev_latency_dtod[i][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(STARPU_USE_CUDA) && defined(STARPU_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) && ncuda > 0) { hwloc_topology_t topology; hwloc_topology_init(&topology); _starpu_topology_filter(topology); hwloc_topology_load(topology); char nvlink[ncuda][ncuda]; char nvlinkhost[ncuda]; memset(nvlink, 0, sizeof(nvlink)); memset(nvlinkhost, 0, sizeof(nvlinkhost)); #ifdef STARPU_HAVE_LIBNVIDIA_ML /* First find NVLinks */ struct cudaDeviceProp props[ncuda]; for (i = 0; i < ncuda; i++) { cudaError_t cures = cudaGetDeviceProperties(&props[i], i); if (cures != cudaSuccess) props[i].name[0] = 0; } for (i = 0; i < ncuda; i++) { unsigned j; if (!props[i].name[0]) continue; nvmlDevice_t nvmldev; nvmldev = _starpu_cuda_get_nvmldev(&props[i]); if (!nvmldev) continue; for (j = 0; j < NVML_NVLINK_MAX_LINKS; j++) { nvmlEnableState_t active; nvmlReturn_t ret; nvmlPciInfo_t pci; unsigned k; ret = nvmlDeviceGetNvLinkState(nvmldev, j, &active); if (ret != NVML_SUCCESS) continue; if (active != NVML_FEATURE_ENABLED) continue; ret = nvmlDeviceGetNvLinkRemotePciInfo(nvmldev, j, &pci); if (ret != NVML_SUCCESS) continue; hwloc_obj_t obj = hwloc_get_pcidev_by_busid(topology, pci.domain, pci.bus, pci.device, 0); if (obj && obj->type == HWLOC_OBJ_PCI_DEVICE && (obj->attr->pcidev.class_id >> 8 == 0x06)) { switch (obj->attr->pcidev.vendor_id) { case 0x1014: /* IBM OpenCAPI port, direct CPU-GPU NVLink */ /* TODO: NUMA affinity */ nvlinkhost[i] = 1; continue; case 0x10de: /* TODO: NVIDIA NVSwitch */ continue; } } /* Otherwise, link to another GPU? */ for (k = i+1; k < ncuda; k++) { if ((int) pci.domain == props[k].pciDomainID && (int) pci.bus == props[k].pciBusID && (int) pci.device == props[k].pciDeviceID) { nvlink[i][k] = 1; nvlink[k][i] = 1; break; } } } } #endif /* 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 && !nvlink[i][j] && !nvlinkhost[i] && !nvlinkhost[j]) if (!find_platform_cuda_path(topology, i, j, 1000000. / cudadev_timing_dtod[i][j])) { _STARPU_DISP("Warning: could not get CUDA location from hwloc\n"); clean_topology(hwloc_get_root_obj(topology)); hwloc_topology_destroy(topology); goto flat_cuda; } /* Record RAM/CUDA bandwidths */ if (!nvlinkhost[i]) { find_platform_forward_path(get_hwloc_cuda_obj(topology, i), 1000000. / search_bus_best_timing(i, "CUDA", 0)); find_platform_backward_path(get_hwloc_cuda_obj(topology, i), 1000000. / search_bus_best_timing(i, "CUDA", 1)); } } /* 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); if (!nvlink[i][j]) { if (nvlinkhost[i] && nvlinkhost[j]) /* TODO: NUMA affinity */ fprintf(f, " \n"); else emit_platform_path_up(f, get_hwloc_cuda_obj(topology, i), get_hwloc_cuda_obj(topology, j)); } fprintf(f, " \n"); } fprintf(f, " \n", i); fprintf(f, " \n", i); if (nvlinkhost[i]) /* TODO: NUMA affinity */ fprintf(f, " \n"); else emit_platform_forward_path(f, get_hwloc_cuda_obj(topology, i)); fprintf(f, " \n"); fprintf(f, " \n", i); fprintf(f, " \n", i); if (nvlinkhost[i]) /* TODO: NUMA affinity */ fprintf(f, " \n"); else emit_platform_backward_path(f, get_hwloc_cuda_obj(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 STARPU_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(STARPU_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(); #ifdef STARPU_USE_MPI_MASTER_SLAVE /* Slaves don't write files */ if (!_starpu_mpi_common_is_src_node()) return; #endif 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(); struct _starpu_machine_config * config = _starpu_get_machine_config(); nnumas = _starpu_topology_get_nnumanodes(config); #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_MPI_MASTER_SLAVE) || defined(STARPU_USE_SIMGRID) nmpi_ms = _starpu_mpi_src_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(); #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE /* be sure that master wrote the perf files */ _starpu_mpi_common_barrier(); #endif #ifndef STARPU_SIMGRID 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) { if (src_node == dst_node) return 0; 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; #if 0 int busid = starpu_bus_get_id(src_node, dst_node); int direct = starpu_bus_get_direct(busid); #endif float ngpus = topology->ncudagpus+topology->nopenclgpus; #ifdef STARPU_DEVEL #warning FIXME: ngpus should not be used e.g. for slow disk transfers... #endif #if 0 /* Ideally we should take into account that some GPUs are directly * connected through a PCI switch, which has less contention that the * Host bridge, but doing that seems to *decrease* performance... */ if (direct) { float neighbours = starpu_bus_get_ngpus(busid); /* Count transfers of these GPUs, and count transfers between * other GPUs and these GPUs */ ngpus = neighbours + (ngpus - neighbours) * neighbours / ngpus; } #endif return latency + (size/bandwidth)*2*ngpus; } /* 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 us\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 us\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.3.9+dfsg/src/core/perfmodel/perfmodel_history.c000066400000000000000000002135761413463044200233760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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) { int i; _STARPU_MALLOC(model->state->per_arch_is_set[comb], nb_impl*sizeof(int)); for(i = 0; i < nb_impl; i++) { model->state->per_arch_is_set[comb][i] = 0; } } 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; } void _starpu_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); arch_combs = NULL; 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]; } static 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; } } size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned impl, struct _starpu_job *j) { size_t ret; if (model) STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); ret = __starpu_job_get_data_size(model, arch, impl, j); if (model) STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); return ret; } /* * 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 check_reg_model(struct starpu_perfmodel *model, int comb, int impl) { struct starpu_perfmodel_per_arch *per_arch_model = &model->state->per_arch[comb][impl]; struct starpu_perfmodel_regression_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; } } /* TODO: check: * reg_model->sumlnx * reg_model->sumlnx2 * reg_model->sumlny * reg_model->sumlnxlny * alpha * beta * reg_model->minx * reg_model->maxx */ (void)alpha; (void)beta; /* * 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); /* TODO: check: * a * b * c */ /* * Multiple Regression Model */ if (model->type == STARPU_MULTIPLE_REGRESSION_BASED) { /* TODO: check: */ } } 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) { if (_starpu_regression_non_linear_power(per_arch_model->list, &a, &b, &c) != 0) _STARPU_DISP("Warning: could not compute a non-linear regression for model %s\n", model->symbol); } 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"); /* * Multiple Regression Model */ if (model->type != STARPU_MULTIPLE_REGRESSION_BASED) { fprintf(f, "# not multiple-regression-base\n"); fprintf(f, "0\n"); } else { if (reg_model->ncoeff==0 && model->ncombinations!=0 && model->combinations!=NULL) { reg_model->ncoeff = model->ncombinations + 1; } _STARPU_MALLOC(reg_model->coeff, reg_model->ncoeff*sizeof(double)); _starpu_multiple_regression(per_arch_model->list, reg_model->coeff, reg_model->ncoeff, model->nparameters, model->parameters_names, model->combinations, model->symbol); fprintf(f, "# n\tintercept\t"); if (reg_model->ncoeff==0 || model->ncombinations==0 || model->combinations==NULL) fprintf(f, "\n1\tnan"); else { unsigned i; for (i=0; i < model->ncombinations; i++) { if (model->parameters_names == NULL) fprintf(f, "c%u", i+1); else { unsigned j; int first=1; for(j=0; j < model->nparameters; j++) { if (model->combinations[i][j] > 0) { if (first) first=0; else fprintf(f, "*"); if(model->parameters_names[j] != NULL) fprintf(f, "%s", model->parameters_names[j]); else fprintf(f, "P%u", j); if (model->combinations[i][j] > 1) fprintf(f, "^%d", model->combinations[i][j]); } } } fprintf(f, "\t\t"); } fprintf(f, "\n%u", reg_model->ncoeff); for (i=0; i < reg_model->ncoeff; i++) fprintf(f, "\t%-15e", reg_model->coeff[i]); } } } #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); _starpu_drop_comments(f); // Read how many coefficients is there res = fscanf(f, "%u", ®_model->ncoeff); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); /* * Multiple Regression Model */ if (reg_model->ncoeff != 0) { _STARPU_MALLOC(reg_model->coeff, reg_model->ncoeff*sizeof(double)); unsigned multi_invalid = 0; unsigned i; for (i=0; i < reg_model->ncoeff; i++) { res = _starpu_read_double(f, "%le", ®_model->coeff[i]); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file %s", path); multi_invalid = (multi_invalid||isnan(reg_model->coeff[i])); } reg_model->multi_valid = !multi_invalid; } res = fscanf(f, "\n"); STARPU_ASSERT_MSG(res == 0, "Incorrect performance model file %s", path); } #ifndef STARPU_SIMGRID static void check_history_entry(struct starpu_perfmodel_history_entry *entry) { STARPU_ASSERT_MSG(entry->deviation >= 0, "entry=%p, entry->deviation=%lf\n", entry, entry->deviation); STARPU_ASSERT_MSG(entry->sum >= 0, "entry=%p, entry->sum=%lf\n", entry, entry->sum); STARPU_ASSERT_MSG(entry->sum2 >= 0, "entry=%p, entry->sum2=%lf\n", entry, entry->sum2); STARPU_ASSERT_MSG(entry->mean >= 0, "entry=%p, entry->mean=%lf\n", entry, entry->mean); STARPU_ASSERT_MSG(isnan(entry->flops)||entry->flops >= 0, "entry=%p, entry->flops=%lf\n", entry, entry->flops); STARPU_ASSERT_MSG(entry->duration >= 0, "entry=%p, entry->duration=%lf\n", entry, entry->duration); } 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) { STARPU_ASSERT_MSG(isnan(flops) || flops >=0, "Negative flops %lf in performance model file %s", flops, path); STARPU_ASSERT_MSG(mean >=0, "Negative mean %lf in performance model file %s", mean, path); STARPU_ASSERT_MSG(deviation >=0, "Negative deviation %lf in performance model file %s", deviation, path); STARPU_ASSERT_MSG(sum >=0, "Negative sum %lf in performance model file %s", sum, path); STARPU_ASSERT_MSG(sum2 >=0, "Negative sum2 %lf in performance model file %s", sum2, path); 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, struct starpu_perfmodel *model) { unsigned nentries; struct starpu_perfmodel_regression_model *reg_model = &per_arch_model->regression; _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, reg_model); /* parse entries */ unsigned i; for (i = 0; i < nentries; i++) { struct starpu_perfmodel_history_entry *entry = NULL; if (scan_history) { _STARPU_CALLOC(entry, 1, 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); } if (model && model->type == STARPU_PERFMODEL_INVALID) { /* Tool loading a perfmodel without having the corresponding codelet */ if (reg_model->ncoeff != 0) model->type = STARPU_MULTIPLE_REGRESSION_BASED; else if (!isnan(reg_model->a) && !isnan(reg_model->b) && !isnan(reg_model->c)) model->type = STARPU_NL_REGRESSION_BASED; else if (!isnan(reg_model->alpha) && !isnan(reg_model->beta)) model->type = STARPU_REGRESSION_BASED; else if (nentries) model->type = STARPU_HISTORY_BASED; /* else unknown, leave invalid */ } } 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, 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 */ unsigned 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, model); } } 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, NULL); } 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++) { _starpu_drop_comments(f); int type; ret = fscanf(f, "%d\n", &type); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file %s", path); 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 = 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 check_per_arch_model(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 || model->type == STARPU_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); STARPU_ASSERT(strlen(archname)>0); check_reg_model(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 || model->type == STARPU_REGRESSION_BASED) { ptr = per_arch_model->list; while (ptr) { check_history_entry(ptr->entry); ptr = ptr->next; } } } 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 || model->type == STARPU_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 || model->type == STARPU_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 check_model(struct starpu_perfmodel *model) { int ncombs = model->state->ncombs; STARPU_ASSERT(ncombs >= 0); int i, impl, dev; for(i = 0; i < ncombs; i++) { int comb = model->state->combs[i]; STARPU_ASSERT(comb >= 0); int ndevices = arch_combs[comb]->ndevices; STARPU_ASSERT(ndevices >= 1); for(dev = 0; dev < ndevices; dev++) { STARPU_ASSERT(arch_combs[comb]->devices[dev].type >= 0); STARPU_ASSERT(arch_combs[comb]->devices[dev].type <= 5); STARPU_ASSERT(arch_combs[comb]->devices[dev].devid >= 0); STARPU_ASSERT(arch_combs[comb]->devices[dev].ncores >= 0); } int nimpls = model->state->nimpls[comb]; STARPU_ASSERT(nimpls >= 1); for (impl = 0; impl < nimpls; impl++) { check_per_arch_model(model, comb, impl); } } } 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 - %d, CUDA - %d, OPENCL - %d, MIC - %d, MPI_MS - %d)\n", STARPU_CPU_WORKER, STARPU_CUDA_WORKER, STARPU_OPENCL_WORKER, STARPU_MIC_WORKER, STARPU_MPI_MS_WORKER); 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 static void dump_history_entry_xml(FILE *f, struct starpu_perfmodel_history_entry *entry) { fprintf(f, " \n", entry->footprint, (unsigned long) entry->size, entry->flops, entry->mean, entry->deviation, entry->sum, entry->sum2, entry->nsample); } static void dump_reg_model_xml(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 = &per_arch_model->regression; /* * Linear Regression model */ if (model->type == STARPU_REGRESSION_BASED) { fprintf(f, " \n"); fprintf(f, " sumlnx, reg_model->sumlnx2, reg_model->sumlny, reg_model->sumlnxlny); fprintf(f, " alpha=\""); _starpu_write_double(f, "%e", reg_model->alpha); fprintf(f, "\" beta=\""); _starpu_write_double(f, "%e", reg_model->beta); fprintf(f, "\" nsample=\"%u\" minx=\"%lu\" maxx=\"%lu\"/>\n", reg_model->nsample, reg_model->minx, reg_model->maxx); } /* * Non-Linear Regression model */ else if (model->type == STARPU_NL_REGRESSION_BASED) { fprintf(f, " \n"); fprintf(f, " a); fprintf(f, "\" b=\""); _starpu_write_double(f, "%e", reg_model->b); fprintf(f, "\" c=\""); _starpu_write_double(f, "%e", reg_model->c); fprintf(f, "\"/>\n"); } else if (model->type == STARPU_MULTIPLE_REGRESSION_BASED) { if (reg_model->ncoeff==0 || model->ncombinations==0 || model->combinations==NULL) fprintf(f, " \n"); else { unsigned i; fprintf(f, " \n", reg_model->coeff[0]); for (i=0; i < model->ncombinations; i++) { fprintf(f, " parameters_names == NULL) fprintf(f, "c%u", i+1); else { unsigned j; int first=1; for(j=0; j < model->nparameters; j++) { if (model->combinations[i][j] > 0) { if (first) first=0; else fprintf(f, "*"); if(model->parameters_names[j] != NULL) fprintf(f, "%s", model->parameters_names[j]); else fprintf(f, "P%u", j); if (model->combinations[i][j] > 1) fprintf(f, "^%d", model->combinations[i][j]); } } } fprintf(f, "\" coef=\"%e\"/>\n", reg_model->coeff[i+1]); } fprintf(f, " \n"); } } } static void dump_per_arch_model_xml(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; dump_reg_model_xml(f, model, comb, impl); /* Dump the history into the model file in case it is necessary */ ptr = per_arch_model->list; while (ptr) { dump_history_entry_xml(f, ptr->entry); ptr = ptr->next; } } void starpu_perfmodel_dump_xml(FILE *f, struct starpu_perfmodel *model) { _starpu_init_and_load_perfmodel(model); fprintf(f, "\n"); fprintf(f, "\n"); fprintf(f, "\n", model->symbol); fprintf(f, "\n"); fprintf(f, "\n", _STARPU_PERFMODEL_VERSION); STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); int ncombs = model->state->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"); for(dev = 0; dev < ndevices; dev++) { const char *type; switch (arch_combs[comb]->devices[dev].type) { case STARPU_CPU_WORKER: type = "CPU"; break; case STARPU_CUDA_WORKER: type = "CUDA"; break; case STARPU_OPENCL_WORKER: type = "OpenCL"; break; case STARPU_MIC_WORKER: type = "MIC"; break; case STARPU_MPI_MS_WORKER: type = "MPI_MS"; break; default: STARPU_ASSERT(0); } fprintf(f, " devices[dev].devid); if (arch_combs[comb]->devices[dev].type == STARPU_CPU_WORKER) fprintf(f, " ncores=\"%d\"", arch_combs[comb]->devices[dev].ncores); fprintf(f, "/>\n"); } int nimpls = model->state->nimpls[comb]; for (impl = 0; impl < nimpls; impl++) { fprintf(f, " \n", impl); char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch_combs[comb], archname, sizeof(archname), impl); fprintf(f, " \n", archname); dump_per_arch_model_xml(f, model, comb, impl); fprintf(f, " \n"); } fprintf(f, " \n"); } STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); fprintf(f, "\n"); } 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 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_CALLOC(model->state->per_arch, ncombs, sizeof(struct starpu_perfmodel_per_arch*)); _STARPU_CALLOC(model->state->per_arch_is_set, ncombs, sizeof(int*)); _STARPU_CALLOC(model->state->nimpls, ncombs, sizeof(int)); _STARPU_CALLOC(model->state->nimpls_set, ncombs, sizeof(int)); _STARPU_MALLOC(model->state->combs, ncombs*sizeof(int)); model->state->ncombs = 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, "a+"); STARPU_ASSERT_MSG(f, "Could not save performance model %s\n", path); locked = _starpu_fwrlock(f) == 0; check_model(model); fseek(f, 0, SEEK_SET); _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 && (node->model->type != STARPU_PER_ARCH && node->model->type != STARPU_COMMON)) 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; #if STARPU_MAXMICDEVS > 0 || STARPU_MAXMPIDEVS > 0 unsigned i; #endif #if STARPU_MAXMICDEVS > 0 for(i = 0; i < conf->topology.nhwmicdevices; i++) nmic += conf->topology.nhwmiccores[i]; #endif unsigned nmpi = 0; #if STARPU_MAXMPIDEVS > 0 for(i = 0; i < conf->topology.nhwmpidevices; i++) nmpi += conf->topology.nhwmpicores[i]; #endif // We used to allocate 2**(ncores + ncuda + nopencl + nmic + nmpi), this is too big // We now allocate only 2*(ncores + ncuda + nopencl + nmic + nmpi), and reallocate when necessary in starpu_perfmodel_arch_comb_add nb_arch_combs = 2 * (ncores + ncuda + nopencl + nmic + nmpi); _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_MPI_MS_WORKER] = starpu_get_env_number_default("STARPU_PERF_MODEL_HOMOGENEOUS_MPI_MS", 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; struct starpu_perfmodel_history_table *entry=NULL, *tmp=NULL; HASH_ITER(hh, archmodel->history, entry, tmp) { HASH_DEL(archmodel->history, entry); free(entry); } archmodel->history = NULL; list = archmodel->list; while (list) { struct starpu_perfmodel_history_list *plist; 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); starpu_perfmodel_free_sampling(); } /* 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]; // 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_perfmodel_get_model_path(model->symbol, path, sizeof(path)); _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: %s\n", path, strerror(errno)); } } } 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) { #ifdef HAVE_SCANDIR char *path; struct dirent **list; int n; path = _starpu_get_perf_model_dir_codelet(); n = scandir(path, &list, NULL, alphasort); if (n < 0) { _STARPU_DISP("Could not open the perfmodel directory <%s>: %s\n", path, strerror(errno)); return 1; } else { int i; for (i = 0; i < n; i++) { if (strcmp(list[i]->d_name, ".") && strcmp(list[i]->d_name, "..")) fprintf(output, "file: <%s>\n", list[i]->d_name); free(list[i]); } free(list); 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); if (ret) starpu_perfmodel_unload_model(model); else model->is_loaded = 1; 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_MPI_MS_WORKER): return "mpi_ms"; 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; devices[0] = '\0'; 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); STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); size = __starpu_job_get_data_size(model, arch, nimpl, j); if (comb == -1 || model->state->per_arch[comb] == NULL) { // The model has not been executed on this combination STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); 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); STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); 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. You probably need to run again to continue calibrating the model, until this warning disappears.\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; comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); size = __starpu_job_get_data_size(model, arch, nimpl, j); if (comb == -1 || model->state->per_arch[comb] == NULL) { // The model has not been executed on this combination STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); 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; STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); } 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; 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. You probably need to run again to continue calibrating the model, until this warning disappears.\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_multiple_regression_based_job_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, struct _starpu_job *j, unsigned nimpl) { int comb; double expected_duration=NAN; struct starpu_perfmodel_regression_model *reg_model = NULL; comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if(comb == -1) goto docal; STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); if (model->state->per_arch[comb] == NULL) { // The model has not been executed on this combination STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); goto docal; } reg_model = &model->state->per_arch[comb][nimpl].regression; STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); if (reg_model->coeff == NULL) goto docal; double *parameters; _STARPU_MALLOC(parameters, model->nparameters*sizeof(double)); model->parameters(j->task, parameters); expected_duration=reg_model->coeff[0]; unsigned i; for (i=0; i < model->ncombinations; i++) { double parameter_value=1.; unsigned k; for (k=0; k < model->nparameters; k++) parameter_value *= pow(parameters[k],model->combinations[i][k]); expected_duration += reg_model->coeff[i+1]*parameter_value; } docal: STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(expected_duration) && !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, forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this. You probably need to run again to continue calibrating the model, until this warning disappears.\n", model->symbol, archname); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } // In the unlikely event that predicted duration is negative // in case multiple linear regression is not so accurate if (expected_duration < 0 ) expected_duration = 0.00001; //Make sure that the injected time is in milliseconds return expected_duration; } 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); key = _starpu_compute_buffers_footprint(model, arch, nimpl, j); if(comb == -1) goto docal; STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock); if (model->state->per_arch[comb] == NULL) { // The model has not been executed on this combination STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); goto docal; } per_arch_model = &model->state->per_arch[comb][nimpl]; history = per_arch_model->history; HASH_FIND_UINT32_T(history, &key, elt); entry = (elt == NULL) ? NULL : elt->history_entry; STARPU_ASSERT_MSG(!entry || entry->mean >= 0, "entry=%p, entry->mean=%lf\n", entry, entry?entry->mean:NAN); 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) { #ifdef STARPU_SIMGRID if (entry->nsample < _starpu_calibration_minimum) { 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 footprint %x (only %u measurements). Using it anyway for the simulation\n", model->symbol, archname, j->task?(long int)_starpu_job_get_data_size(model, arch, nimpl, j):-1, key, entry->nsample); } #else if (entry->nsample >= _starpu_calibration_minimum) #endif { STARPU_ASSERT_MSG(entry->mean >= 0, "entry->mean=%lf\n", entry->mean); /* 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: #ifdef STARPU_SIMGRID if (isnan(exp)) { char archname[STR_SHORT_LENGTH]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated at all for %s size %ld footprint %x. Assuming it can not work there\n", model->symbol, archname, j->task?(long int)_starpu_job_get_data_size(model, arch, nimpl, j):-1, key); exp = 0.; } #else 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 footprint %x (only %u measurements), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this. You probably need to run again to continue calibrating the model, until this warning disappears.\n", model->symbol, archname, j->task?(long int)_starpu_job_get_data_size(model, arch, nimpl, j):-1, key, entry ? entry->nsample : 0); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } #endif STARPU_ASSERT_MSG(isnan(exp)||exp >= 0, "exp=%lf\n", exp); 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) { STARPU_ASSERT_MSG(measured >= 0, "measured=%lf\n", measured); 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 || model->type == STARPU_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_CALLOC(entry, 1, 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); /* For history-based, 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. */ if (model->type != STARPU_HISTORY_BASED) { entry->sum = measured; entry->sum2 = measured*measured; entry->nsample = 1; entry->mean = measured; } entry->size = __starpu_job_get_data_size(model, arch, impl, j); entry->flops = j->task->flops; entry->footprint = key; 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: %fus vs average %fus, %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((fabs(entry->sum2 - (entry->sum*entry->sum)/n))/n); } if (j->task->flops != 0. && !isnan(entry->flops)) { if (entry->flops == 0.) entry->flops = j->task->flops; else if ((fabs(entry->flops - j->task->flops) / entry->flops) > 0.00001) { /* Incoherent flops! forget about trying to record flops */ _STARPU_DISP("Incoherent flops in model %s: %f vs previous %f, stopping recording flops\n", model->symbol, j->task->flops, entry->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; } } if (model->type == STARPU_MULTIPLE_REGRESSION_BASED) { struct starpu_perfmodel_history_entry *entry; struct starpu_perfmodel_history_list **list; list = &per_arch_model->list; _STARPU_CALLOC(entry, 1, sizeof(struct starpu_perfmodel_history_entry)); _STARPU_MALLOC(entry->parameters, model->nparameters*sizeof(double)); model->parameters(j->task, entry->parameters); entry->tag = j->task->tag_id; STARPU_ASSERT(measured >= 0); entry->duration = measured; struct starpu_perfmodel_history_list *link; _STARPU_MALLOC(link, sizeof(struct starpu_perfmodel_history_list)); link->next = *list; link->entry = entry; *list = link; } #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); STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock); 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]; } static 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.3.9+dfsg/src/core/perfmodel/perfmodel_nan.c000066400000000000000000000041621413463044200224360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/core/perfmodel/perfmodel_print.c000066400000000000000000000227741413463044200230270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 */ fprintf(output, "%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) { fprintf(output, "%-15e\n", entry->mean); } if (strcmp(parameter, "stddev") == 0) { fprintf(output, "%-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); _STARPU_MSG("\t debug file path : %s\n", debugname); #endif } else { /* only display the parameter that was specifically requested */ if (strcmp(parameter, "a") == 0) { fprintf(output, "%e\n", arch_model->regression.a); return; } if (strcmp(parameter, "b") == 0) { fprintf(output, "%e\n", arch_model->regression.b); return; } if (strcmp(parameter, "c") == 0) { fprintf(output, "%e\n", arch_model->regression.c); return; } if (strcmp(parameter, "alpha") == 0) { fprintf(output, "%e\n", arch_model->regression.alpha); return; } if (strcmp(parameter, "beta") == 0) { fprintf(output, "%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); fprintf(output, "%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 ? */ _STARPU_ERROR("Unknown parameter requested, aborting.\n"); } } int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output) { _starpu_init_and_load_perfmodel(model); 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)) { _STARPU_ERROR("Invalid CPU size\n"); } 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; } _STARPU_MSG("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.3.9+dfsg/src/core/perfmodel/regression.c000066400000000000000000000126751413463044200220150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 /* For measurements close to C, we do not want to try to fit, since we are fitting the distance to C, which won't actually really get smaller */ #define C_RADIUS 1 /* * smoothly ramp from 0 to 1 between 0 and 1 * <= 0: stay 0 * >= 1: stay 1 */ static double level(double x) { if (x <= 0.) return 0.; if (x >= 1.) return 1.; if (x < 0.5) return -2*x*x+4*x-1; return 2*x*x; } static double fixpop(unsigned pop, double c, double y) { double distance = (y-c)/c; return pop * level((distance - C_RADIUS) / C_RADIUS); } static double compute_b(double c, unsigned n, size_t *x, double *y, unsigned *pop) { 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; double nn = 0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); double popi = fixpop(pop[i], c, y[i]); if (popi <= 0) continue; sumxy += xi*yi*popi; sumx += xi*popi; sumx2 += xi*xi*popi; sumy += yi*popi; nn += popi; } b = (nn * sumxy - sumx * sumy) / (nn*sumx2 - sumx*sumx); return b; } static double compute_a(double c, double b, unsigned n, size_t *x, double *y, unsigned *pop) { double a; /* X = log (x) , Y = log (y - c) */ double sumx = 0.0; double sumy = 0.0; double nn = 0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); double popi = fixpop(pop[i], c, y[i]); if (popi <= 0) continue; sumx += xi*popi; sumy += yi*popi; nn += popi; } a = (sumy - b*sumx) / nn; return a; } /* returns r */ static double test_r(double c, unsigned n, size_t *x, double *y, unsigned *pop) { 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; double nn = 0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); double popi = fixpop(pop[i], c, y[i]); if (popi <= 0) continue; // printf("Xi = %e, Yi = %e\n", xi, yi); sumxy += xi*yi*popi; sumx += xi*popi; sumx2 += xi*xi*popi; sumy += yi*popi; sumy2 += yi*yi*popi; nn += popi; } //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 = (nn * sumxy - sumx * sumy) / sqrt( (nn* sumx2 - sumx*sumx) * (nn*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) { if (ptr->entry->nsample) cnt++; ptr = ptr->next; } return cnt; } static int compar(const void *_a, const void *_b) { double a = *(double*) _a; double b = *(double*) _b; if (a < b) return -1; if (a > b) return 1; return 0; } static double get_list_fourth(double *y, unsigned n) { double sorted[n]; memcpy(sorted, y, n * sizeof(*sorted)); qsort(sorted, n, sizeof(*sorted), compar); return sorted[n/3]; } static void dump_list(size_t *x, double *y, unsigned *pop, struct starpu_perfmodel_history_list *list_history) { struct starpu_perfmodel_history_list *ptr = list_history; unsigned i = 0; while (ptr) { if (ptr->entry->nsample) { x[i] = ptr->entry->size; y[i] = ptr->entry->mean; pop[i] = ptr->entry->nsample; i++; } ptr = ptr->next; } } /* 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); if (!n) return -1; size_t *x; _STARPU_MALLOC(x, n*sizeof(size_t)); double *y; _STARPU_MALLOC(y, n*sizeof(double)); STARPU_ASSERT(y); unsigned *pop; _STARPU_MALLOC(pop, n*sizeof(unsigned)); STARPU_ASSERT(y); dump_list(x, y, pop, ptr); double cmin = 0.0; double cmax = get_list_fourth(y, n); unsigned iter; double err = 100000.0; for (iter = 0; iter < MAXREGITER; iter++) { //fprintf(stderr,"%f - %f\n", cmin, cmax); 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, pop); r2 = test_r(c2, n, x, y, pop); 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, pop); *a = exp(compute_a(*c, *b, n, x, y, pop)); free(x); free(y); free(pop); return 0; } starpu-1.3.9+dfsg/src/core/perfmodel/regression.h000066400000000000000000000017661413463044200220210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/core/perfmodel/starpu-perfmodel.dtd000066400000000000000000000041761413463044200234540ustar00rootroot00000000000000 starpu-1.3.9+dfsg/src/core/progress_hook.c000066400000000000000000000056031413463044200205350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/core/progress_hook.h000066400000000000000000000016031413463044200205360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ void _starpu_init_progression_hooks(void); unsigned _starpu_execute_registered_progression_hooks(void); #endif /* !__PROGRESS_HOOK_H__ */ starpu-1.3.9+dfsg/src/core/sched_ctx.c000066400000000000000000002705211413463044200176200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * Copyright (C) 2017 Arthur Chevalier * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 enum _starpu_ctx_change_op { ctx_change_invalid = 0, ctx_change_add = 1, ctx_change_remove = 2 }; 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; static 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 int occupied_sms = 0; static unsigned _starpu_get_first_free_sched_ctx(struct _starpu_machine_config *config); static void _starpu_sched_ctx_put_new_master(unsigned sched_ctx_id); static void _starpu_sched_ctx_block_workers_in_parallel(unsigned sched_ctx_id, unsigned all); static void _starpu_sched_ctx_unblock_workers_in_parallel(unsigned sched_ctx_id, unsigned all); static void _starpu_sched_ctx_update_parallel_workers_with(unsigned sched_ctx_id); static void _starpu_sched_ctx_update_parallel_workers_without(unsigned sched_ctx_id); static void set_priority_on_notified_workers(int *workers, int nworkers, unsigned sched_ctx_id, unsigned priority); static void set_priority_hierarchically_on_notified_workers(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx, unsigned priority); static void fetch_tasks_from_empty_ctx_list(struct _starpu_sched_ctx *sched_ctx); static void add_notified_workers(int *workers_to_add, int nworkers_to_add, unsigned sched_ctx_id); /* reused from combined_workers.c */ static int compar_int(const void *pa, const void *pb) { int a = *((int *)pa); int b = *((int *)pb); return a - b; } /* reused from combined_workers.c */ static void sort_workerid_array(int nworkers, int workerid_array[]) { qsort(workerid_array, nworkers, sizeof(int), compar_int); } /* notify workers that a ctx change operation is about to proceed. * * workerids must be sorted by ascending id * * Once this function returns, the notified workers must not start a new * scheduling operation until they are notified that the ctx change op is * done. */ static void notify_workers_about_changing_ctx_pending(const unsigned nworkers, const int * const workerids) { STARPU_ASSERT(!_starpu_worker_sched_op_pending()); const int cur_workerid = _starpu_worker_get_id(); unsigned i; for (i=0; i workerids[i-1])); if (starpu_worker_is_combined_worker(workerids[i])) continue; if (workerids[i] == cur_workerid) continue; struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[i]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_enter_changing_ctx_op(worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } } /* notify workers that a ctx change operation is complete. * * workerids must be sorted by ascending id * * Once this function returns, the workers may proceed with scheduling operations again. */ static void notify_workers_about_changing_ctx_done(const unsigned nworkers, const int * const workerids) { STARPU_ASSERT(!_starpu_worker_sched_op_pending()); const int cur_workerid = _starpu_worker_get_id(); unsigned i; for (i=0; i workerids[i-1])); if (starpu_worker_is_combined_worker(workerids[i])) continue; if (workerids[i] == cur_workerid) continue; struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[i]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_leave_changing_ctx_op(worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } } static void _starpu_worker_gets_into_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker) { unsigned ret_sched_ctx = _starpu_sched_ctx_elt_exists(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) { /* 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_elt_exists(worker->sched_ctx_list, sched_ctx_id); /* remove context from worker */ if(ret_sched_ctx) { /* 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_SCHED_BEGIN; */ /* sched_ctx->sched_policy->remove_workers(sched_ctx_id, &worker->workerid, 1); */ /* _STARPU_SCHED_END; */ /* } */ if (!_starpu_sched_ctx_list_remove(&worker->sched_ctx_list, sched_ctx_id)) worker->nsched_ctxs--; } return; } #if 0 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; } #endif static void _starpu_update_notified_workers_with_ctx(int *workerids, int nworkers, int sched_ctx_id) { int i; for(i = 0; i < nworkers; i++) { struct _starpu_worker *worker; worker = _starpu_get_worker_struct(workerids[i]); _starpu_worker_gets_into_ctx(sched_ctx_id, worker); } return; } #if 0 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; } #endif static void _starpu_update_notified_workers_without_ctx(int *workerids, int nworkers, int sched_ctx_id, unsigned now) { int i; for(i = 0; i < nworkers; i++) { struct _starpu_worker *worker; worker = _starpu_get_worker_struct(workerids[i]); if(now) { _starpu_worker_gets_out_of_ctx(sched_ctx_id, worker); } else { worker->removed_from_ctx[sched_ctx_id] = 1; } } 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); } /* must be called with sched_mutex locked */ void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); worker->shares_tasks_lists[sched_ctx_id] = 1; } static void _do_add_notified_workers(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers) { int ndevices = 0; struct starpu_perfmodel_device devices[nworkers]; int i = 0; for(i = 0; i < nworkers; i++) { int workerid = workerids[i]; if (workerid >= (int) starpu_worker_get_count()) /* Combined worker, don't care */ continue; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); int dev1, dev2; unsigned found = 0; for(dev1 = 0; dev1 < worker->perf_arch.ndevices; dev1++) { for(dev2 = 0; dev2 < ndevices; dev2++) { if(devices[dev2].type == worker->perf_arch.devices[dev1].type && devices[dev2].devid == worker->perf_arch.devices[dev1].devid) { devices[dev2].ncores += worker->perf_arch.devices[dev1].ncores; found = 1; break; } } if(!found) { devices[ndevices].type = worker->perf_arch.devices[dev1].type; devices[ndevices].devid = worker->perf_arch.devices[dev1].devid; devices[ndevices].ncores = 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; if (sched_ctx->stream_worker != -1) sched_ctx->perf_arch.devices[sched_ctx->perf_arch.ndevices].ncores = sched_ctx->nsms; else sched_ctx->perf_arch.devices[sched_ctx->perf_arch.ndevices].ncores = devices[dev1].ncores; sched_ctx->perf_arch.ndevices++; } else found = 0; } } _starpu_sched_ctx_update_parallel_workers_with(sched_ctx->id); } static void _starpu_add_workers_to_new_sched_ctx(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers) { struct starpu_worker_collection *workers = sched_ctx->workers; struct _starpu_machine_config *config = _starpu_get_machine_config(); if (nworkers == -1) nworkers = config->topology.nworkers; if (!nworkers) return; int _workerids[nworkers]; int i; if (workerids == NULL) { for(i = 0; i < nworkers; i++) _workerids[i] = i; workerids = _workerids; } for(i = 0; i < nworkers; i++) { int workerid = workerids[i]; { workers->add(workers, workerid); } struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); worker->tmp_sched_ctx = (int)sched_ctx->id; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } sort_workerid_array(nworkers, workerids); notify_workers_about_changing_ctx_pending(nworkers, workerids); _do_add_notified_workers(sched_ctx, workerids, nworkers); if(sched_ctx->sched_policy && sched_ctx->sched_policy->add_workers) { _STARPU_SCHED_BEGIN; sched_ctx->sched_policy->add_workers(sched_ctx->id, workerids, nworkers); _STARPU_SCHED_END; } notify_workers_about_changing_ctx_done(nworkers, workerids); } 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; } } } 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)) { int 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; } _starpu_sched_ctx_update_parallel_workers_without(sched_ctx->id); 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_SCHED_BEGIN; sched_ctx->sched_policy->remove_workers(sched_ctx->id, workerids, nworkers_ctx); _STARPU_SCHED_END; } 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 /* Must be called with sched_ctx_manag mutex held */ 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, void (*sched_policy_init)(unsigned), void * user_data, int nsub_ctxs, int *sub_ctxs, int nsms) { struct _starpu_machine_config *config = _starpu_get_machine_config(); 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]; STARPU_ASSERT(sched_ctx->do_schedule == 0); sched_ctx->id = id; int nworkers = config->topology.nworkers; int i; STARPU_ASSERT(nworkers_ctx <= nworkers); starpu_task_list_init(&sched_ctx->empty_ctx_tasks); 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; else sched_ctx->min_priority = 0; sched_ctx->max_priority_is_set = max_prio_set; if (sched_ctx->max_priority_is_set) sched_ctx->max_priority = max_prio; else sched_ctx->max_priority = 0; _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; sched_ctx->init_sched = sched_policy_init; sched_ctx->user_data = user_data; sched_ctx->sms_start_idx = 0; sched_ctx->sms_end_idx = STARPU_NMAXSMS; sched_ctx->nsms = nsms; sched_ctx->stream_worker = -1; memset(&sched_ctx->lock_write_owner, 0, sizeof(sched_ctx->lock_write_owner)); STARPU_PTHREAD_RWLOCK_INIT(&sched_ctx->rwlock, NULL); if(nsms > 0) { STARPU_ASSERT_MSG(workerids, "workerids is needed when setting nsms"); sched_ctx->sms_start_idx = occupied_sms; sched_ctx->sms_end_idx = occupied_sms+nsms; occupied_sms += nsms; _STARPU_DEBUG("ctx %u: stream worker %d nsms %d ocupied sms %d\n", sched_ctx->id, workerids[0], nsms, occupied_sms); STARPU_ASSERT_MSG(occupied_sms <= STARPU_NMAXSMS , "STARPU:requested more sms than available"); _starpu_worker_set_stream_ctx(workerids[0], sched_ctx); sched_ctx->stream_worker = workerids[0]; } sched_ctx->nsub_ctxs = 0; sched_ctx->parallel_view = 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); } /*add sub_ctxs before add workers, in order to be able to associate them if necessary */ if(nsub_ctxs != 0) { for(i = 0; i < nsub_ctxs; i++) sched_ctx->sub_ctxs[i] = sub_ctxs[i]; sched_ctx->nsub_ctxs = nsub_ctxs; } /* starpu_do_schedule() starts to consider the new sched_ctx for scheduling * once 'sched_cts->do_schedule == 1' becomes visible. * Make sure the sched_ctx struct and the policy struct initialization are complete at this time. */ STARPU_WMB(); sched_ctx->do_schedule = 1; _starpu_add_workers_to_new_sched_ctx(sched_ctx, workerids, nworkers_ctx); #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); if(!_starpu_sched_ctx_list_add(&worker->sched_ctx_list, sched_ctx->id)) worker->nsched_ctxs++; } } (void)STARPU_ATOMIC_ADD(&config->topology.nsched_ctxs,1); return sched_ctx; } int starpu_sched_ctx_get_nsms(unsigned sched_ctx) { struct _starpu_sched_ctx *sc = _starpu_get_sched_ctx_struct(sched_ctx); return sc->nsms; } void starpu_sched_ctx_get_sms_interval(int stream_workerid, int *start, int *end) { struct _starpu_sched_ctx *sc = _starpu_worker_get_ctx_stream(stream_workerid); *start = sc->sms_start_idx; *end = sc->sms_end_idx; } int starpu_sched_ctx_get_sub_ctxs(unsigned sched_ctx, int *ctxs) { struct _starpu_sched_ctx *sc = _starpu_get_sched_ctx_struct(sched_ctx); int i; for(i = 0; i < sc->nsub_ctxs; i++) ctxs[i] = sc->sub_ctxs[i]; return sc->nsub_ctxs; } int starpu_sched_ctx_get_stream_worker(unsigned sub_ctx) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sub_ctx); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; int worker = -1; workers->init_iterator(workers, &it); if(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); } return worker; } unsigned starpu_sched_ctx_create(int *workerids, int nworkers, const char *sched_ctx_name, ...) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); 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; int nsms = 0; int *sub_ctxs = NULL; int nsub_ctxs = 0; void *user_data = NULL; struct starpu_sched_policy *sched_policy = NULL; unsigned hierarchy_level = 0; unsigned nesting_sched_ctx = STARPU_NMAX_SCHED_CTXS; unsigned awake_workers = 0; void (*init_sched)(unsigned) = NULL; 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 if (arg_type == STARPU_SCHED_CTX_POLICY_INIT) { init_sched = va_arg(varg_list, void(*)(unsigned)); } else if (arg_type == STARPU_SCHED_CTX_USER_DATA) { user_data = va_arg(varg_list, void *); } else if (arg_type == STARPU_SCHED_CTX_SUB_CTXS) { sub_ctxs = va_arg(varg_list, int*); nsub_ctxs = va_arg(varg_list, int); } else if (arg_type == STARPU_SCHED_CTX_CUDA_NSMS) { nsms = va_arg(varg_list, int); } else { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } va_end(varg_list); /* 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]); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); return STARPU_NMAX_SCHED_CTXS; } } struct _starpu_sched_ctx *sched_ctx; 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, init_sched, user_data, nsub_ctxs, sub_ctxs, nsms); sched_ctx->hierarchy_level = hierarchy_level; sched_ctx->nesting_sched_ctx = nesting_sched_ctx; int *added_workerids; unsigned nw_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &added_workerids); sort_workerid_array(nw_ctx, added_workerids); notify_workers_about_changing_ctx_pending(nw_ctx, added_workerids); _starpu_sched_ctx_lock_write(sched_ctx->id); _starpu_update_notified_workers_with_ctx(added_workerids, nw_ctx, sched_ctx->id); notify_workers_about_changing_ctx_done(nw_ctx, added_workerids); _starpu_sched_ctx_unlock_write(sched_ctx->id); free(added_workerids); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); return sched_ctx->id; } int fstarpu_sched_ctx_create(int *workerids, int nworkers, const char *sched_ctx_name, void **arglist) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); int arg_i = 0; int min_prio_set = 0; int max_prio_set = 0; int min_prio = 0; int max_prio = 0; int nsms = 0; int *sub_ctxs = NULL; int nsub_ctxs = 0; void *user_data = NULL; struct starpu_sched_policy *sched_policy = NULL; unsigned hierarchy_level = 0; unsigned nesting_sched_ctx = STARPU_NMAX_SCHED_CTXS; unsigned awake_workers = 0; void (*init_sched)(unsigned) = NULL; 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 if (arg_type == STARPU_SCHED_CTX_POLICY_INIT) { arg_i++; init_sched = arglist[arg_i]; } else if (arg_type == STARPU_SCHED_CTX_USER_DATA) { arg_i++; user_data = arglist[arg_i]; } else if (arg_type == STARPU_SCHED_CTX_SUB_CTXS) { arg_i++; sub_ctxs = (int*)arglist[arg_i]; arg_i++; nsub_ctxs = *(int*)arglist[arg_i]; } else if (arg_type == STARPU_SCHED_CTX_CUDA_NSMS) { arg_i++; nsms = *(int*)arglist[arg_i]; } 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]); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); return STARPU_NMAX_SCHED_CTXS; } } } struct _starpu_sched_ctx *sched_ctx; 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, init_sched, user_data, nsub_ctxs, sub_ctxs, nsms); sched_ctx->hierarchy_level = hierarchy_level; sched_ctx->nesting_sched_ctx = nesting_sched_ctx; int *added_workerids; unsigned nw_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &added_workerids); sort_workerid_array(nw_ctx, added_workerids); notify_workers_about_changing_ctx_pending(nw_ctx, added_workerids); _starpu_sched_ctx_lock_write(sched_ctx->id); _starpu_update_notified_workers_with_ctx(added_workerids, nw_ctx, sched_ctx->id); notify_workers_about_changing_ctx_done(nw_ctx, added_workerids); _starpu_sched_ctx_unlock_write(sched_ctx->id); free(added_workerids); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); 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 Must be called with sched_ctx_manag mutex held */ static void _starpu_delete_sched_ctx(struct _starpu_sched_ctx *sched_ctx) { STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS); STARPU_ASSERT(sched_ctx->do_schedule == 1); sched_ctx->do_schedule = 0; struct _starpu_machine_config *config = _starpu_get_machine_config(); 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; } sched_ctx->min_priority_is_set = 0; sched_ctx->max_priority_is_set = 0; sched_ctx->id = STARPU_NMAX_SCHED_CTXS; #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_free(sched_ctx->hwloc_workers_set); #endif //STARPU_HAVE_HWLOC config->topology.nsched_ctxs--; } void starpu_sched_ctx_delete(unsigned sched_ctx_id) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT(sched_ctx); #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 _starpu_sched_ctx_lock_write(sched_ctx_id); unsigned inheritor_sched_ctx_id = sched_ctx->inheritor; struct _starpu_sched_ctx *inheritor_sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx->inheritor); _starpu_sched_ctx_lock_write(inheritor_sched_ctx_id); STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS); int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct _starpu_sched_ctx *psched_ctx = _starpu_get_sched_ctx_struct(i); if (psched_ctx->inheritor == sched_ctx_id) { _starpu_sched_ctx_lock_write(i); psched_ctx->inheritor = inheritor_sched_ctx_id; _starpu_sched_ctx_unlock_write(i); } } int *workerids; unsigned nworkers_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids); int backup_workerids[nworkers_ctx]; memcpy(backup_workerids, workerids, nworkers_ctx*sizeof(backup_workerids[0])); sort_workerid_array(nworkers_ctx, backup_workerids); notify_workers_about_changing_ctx_pending(nworkers_ctx, backup_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)) { add_notified_workers(workerids, nworkers_ctx, inheritor_sched_ctx_id); } notify_workers_about_changing_ctx_done(nworkers_ctx, backup_workerids); _starpu_sched_ctx_unlock_write(sched_ctx_id); int wait_status = _starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx_id); _starpu_sched_ctx_lock_write(sched_ctx_id); notify_workers_about_changing_ctx_pending(nworkers_ctx, backup_workerids); if(!wait_status) { if(!sched_ctx->sched_policy) _starpu_sched_ctx_unblock_workers_in_parallel(sched_ctx_id, 0); /*if btw the mutex release & the mutex lock the context has changed take care to free all scheduling data before deleting the context */ /* announce upcoming context changes, then wait for sched_op operations to * complete before altering the sched_ctx under sched_mutex protection */ _starpu_update_notified_workers_without_ctx(workerids, nworkers_ctx, sched_ctx_id, 1); _starpu_sched_ctx_free_scheduling_data(sched_ctx); notify_workers_about_changing_ctx_done(nworkers_ctx, backup_workerids); occupied_sms -= sched_ctx->nsms; _starpu_sched_ctx_unlock_write(sched_ctx_id); _starpu_sched_ctx_unlock_write(inheritor_sched_ctx_id); STARPU_PTHREAD_RWLOCK_DESTROY(&sched_ctx->rwlock); _starpu_delete_sched_ctx(sched_ctx); } else { notify_workers_about_changing_ctx_done(nworkers_ctx, backup_workerids); occupied_sms -= sched_ctx->nsms; _starpu_sched_ctx_unlock_write(sched_ctx_id); _starpu_sched_ctx_unlock_write(inheritor_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_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); } /* 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() { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(i); if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_sched_ctx_lock_write(i); _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_sched_ctx_unlock_write(i); STARPU_PTHREAD_RWLOCK_DESTROY(&sched_ctx->rwlock); _starpu_delete_sched_ctx(sched_ctx); } } STARPU_PTHREAD_KEY_DELETE(sched_ctx_key); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); } 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); } } /* ctx_mutex must be held when calling this function */ static void fetch_tasks_from_empty_ctx_list(struct _starpu_sched_ctx *sched_ctx) { struct starpu_task_list list; starpu_task_list_move(&list, &sched_ctx->empty_ctx_tasks); _starpu_sched_ctx_unlock_write(sched_ctx->id); while(!starpu_task_list_empty(&list)) { struct starpu_task *old_task = starpu_task_list_pop_back(&list); if(old_task == &stop_submission_task) break; /* if no workers are able to execute the task, it will be put * in the empty_ctx_tasks list forever again */ unsigned able = _starpu_workers_able_to_execute_task(old_task, sched_ctx); STARPU_ASSERT(able); int ret = _starpu_push_task_to_workers(old_task); /* if we should stop poping from empty ctx tasks */ if (ret == -EAGAIN) break; } _starpu_sched_ctx_lock_write(sched_ctx->id); } 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_sched_ctx_lock_read(sched_ctx->id); double expected_end = sched_ctx->sched_policy->simulate_push_task(task); _starpu_sched_ctx_unlock_read(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) _STARPU_MSG("exp len negative %lf \n", expected_len); expected_len /= 1000000.0; // _STARPU_MSG("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; } static void set_priority_hierarchically_on_notified_workers(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); set_priority_on_notified_workers(workers_to_add, nworkers_to_add, father, priority); set_priority_hierarchically_on_notified_workers(workers_to_add, nworkers_to_add, father, priority); } return; } static void add_notified_workers(int *workerids, int nworkers, unsigned sched_ctx_id) { if (!nworkers) return; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); /* if the context has not already been deleted */ if(sched_ctx->id == STARPU_NMAX_SCHED_CTXS) return; int added_workers[nworkers]; int n_added_workers = 0; { struct starpu_worker_collection *workers = sched_ctx->workers; int i = 0; for(i = 0; i < nworkers; i++) { if (workerids[i] >= (int) starpu_worker_get_count()) /* Combined worker, don't care */ continue; int workerid = workers->add(workers, workerids[i]); if(workerid >= 0) { added_workers[n_added_workers] = workerid; n_added_workers++; } else { struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[i]); worker->removed_from_ctx[sched_ctx->id] = 0; } } } _do_add_notified_workers(sched_ctx, workerids, nworkers); if(n_added_workers > 0) { if(sched_ctx->sched_policy && sched_ctx->sched_policy->add_workers) { _STARPU_SCHED_BEGIN; sched_ctx->sched_policy->add_workers(sched_ctx->id, added_workers, n_added_workers); _STARPU_SCHED_END; } _starpu_update_notified_workers_with_ctx(added_workers, n_added_workers, sched_ctx->id); } set_priority_on_notified_workers(workerids, nworkers, sched_ctx_id, 1); set_priority_hierarchically_on_notified_workers(workerids, nworkers, sched_ctx_id, 0); fetch_tasks_from_empty_ctx_list(sched_ctx); } /* Queue a new ctx change operation in the list of deferred ctx changes of the current worker. * * The set of workers to notify should contain all workers directly or * indirectly affected by the change. In particular, all workers of * sched_ctx_id should be notified even if they are not part of the change */ static void _defer_ctx_change(int sched_ctx_id, enum _starpu_ctx_change_op op, int nworkers_to_notify, int *workerids_to_notify, int nworkers_to_change, int *workerids_to_change) { STARPU_ASSERT(_starpu_worker_sched_op_pending()); if (nworkers_to_change == 0) return; int workerid = starpu_worker_get_id_check(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_ctx_change_list *l = &worker->ctx_change_list; struct _starpu_ctx_change *chg = _starpu_ctx_change_new(); chg->sched_ctx_id = sched_ctx_id; STARPU_ASSERT(op == ctx_change_add || op == ctx_change_remove); chg->op = op; STARPU_ASSERT(workerids_to_change != NULL); chg->nworkers_to_change = nworkers_to_change; _STARPU_MALLOC(chg->workerids_to_change, nworkers_to_change * sizeof(chg->workerids_to_change[0])); memcpy(chg->workerids_to_change, workerids_to_change, nworkers_to_change * sizeof(chg->workerids_to_change[0])); if (nworkers_to_notify != 0) { STARPU_ASSERT(workerids_to_notify != NULL); chg->nworkers_to_notify = nworkers_to_notify; _STARPU_MALLOC(chg->workerids_to_notify, nworkers_to_notify * sizeof(chg->workerids_to_notify[0])); memcpy(chg->workerids_to_notify, workerids_to_notify, nworkers_to_notify * sizeof(chg->workerids_to_notify[0])); } else { STARPU_ASSERT(workerids_to_notify == NULL); chg->nworkers_to_notify = 0; chg->workerids_to_notify = 0; } _starpu_ctx_change_list_push_back(l, chg); } void starpu_sched_ctx_add_workers(int *workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx_id) { STARPU_ASSERT(workers_to_add != NULL && nworkers_to_add > 0); _starpu_check_workers(workers_to_add, nworkers_to_add); int *ctx_workerids = NULL; _starpu_sched_ctx_lock_read(sched_ctx_id); unsigned ctx_nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &ctx_workerids); _starpu_sched_ctx_unlock_read(sched_ctx_id); int cumulated_workerids[ctx_nworkers + nworkers_to_add]; memcpy(cumulated_workerids, ctx_workerids, ctx_nworkers*sizeof(cumulated_workerids[0])); unsigned cumulated_nworkers = ctx_nworkers; { unsigned i; for (i=0; iworkers->nworkers]; int n_removed_workers = 0; _starpu_remove_workers_from_sched_ctx(sched_ctx, workerids, nworkers, removed_workers, &n_removed_workers); if(n_removed_workers > 0) { _starpu_update_notified_workers_without_ctx(removed_workers, n_removed_workers, sched_ctx_id, 0); set_priority_on_notified_workers(removed_workers, n_removed_workers, sched_ctx_id, 1); } } void starpu_sched_ctx_remove_workers(int *workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); _starpu_check_workers(workers_to_remove, nworkers_to_remove); int *ctx_workerids = NULL; _starpu_sched_ctx_lock_read(sched_ctx_id); unsigned ctx_nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &ctx_workerids); _starpu_sched_ctx_unlock_read(sched_ctx_id); int cumulated_workerids[ctx_nworkers + nworkers_to_remove]; memcpy(cumulated_workerids, ctx_workerids, ctx_nworkers*sizeof(cumulated_workerids[0])); unsigned cumulated_nworkers = ctx_nworkers; { unsigned i; for (i=0; iid != STARPU_NMAX_SCHED_CTXS) { if (_starpu_worker_sched_op_pending()) { _defer_ctx_change(sched_ctx_id, ctx_change_remove, cumulated_nworkers, cumulated_workerids, nworkers_to_remove, workers_to_remove); } else { sort_workerid_array(cumulated_nworkers, cumulated_workerids); notify_workers_about_changing_ctx_pending(cumulated_nworkers, cumulated_workerids); _starpu_sched_ctx_lock_write(sched_ctx_id); remove_notified_workers(workers_to_remove, nworkers_to_remove, sched_ctx_id); notify_workers_about_changing_ctx_done(cumulated_nworkers, cumulated_workerids); _starpu_sched_ctx_unlock_write(sched_ctx_id); } } } int _starpu_workers_able_to_execute_task(struct starpu_task *task, struct _starpu_sched_ctx *sched_ctx) { unsigned able = 0; _starpu_sched_ctx_lock_read(sched_ctx->id); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; workers->init_iterator_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); STARPU_ASSERT_MSG(worker < STARPU_NMAXWORKERS, "worker id %u", worker); if (starpu_worker_can_execute_task_first_impl(worker, task, NULL)) { able++; break; } } _starpu_sched_ctx_unlock_read(sched_ctx->id); return able; } /* 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].do_schedule = 0; 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"); _starpu_barrier_counter_wait_for_empty_counter(&sched_ctx->tasks_barrier); return 0; } 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_sched_ctx_lock_write(sched_ctx->id); } _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_sched_ctx_unlock_write(sched_ctx->id); } return ret; } void _starpu_decrement_nready_tasks_of_sched_ctx_locked(unsigned sched_ctx_id, double ready_flops) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); _starpu_barrier_counter_decrement_until_empty_counter(&sched_ctx->ready_tasks_barrier, ready_flops); } 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_sched_ctx_lock_write(sched_ctx->id); } _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_sched_ctx_unlock_write(sched_ctx->id); } } 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); _starpu_barrier_counter_wait_for_empty_counter(&sched_ctx->ready_tasks_barrier); return 0; } /* * FIXME: This should rather be * void starpu_sched_ctx_set_context(unsigned sched_ctx) */ void starpu_sched_ctx_set_context(unsigned *sched_ctx) { if (sched_ctx) STARPU_PTHREAD_SETSPECIFIC(sched_ctx_key, (void*)(uintptr_t)(*sched_ctx + 1)); else STARPU_PTHREAD_SETSPECIFIC(sched_ctx_key, (void*)(uintptr_t) 0); } unsigned starpu_sched_ctx_get_context() { unsigned id = (unsigned)(uintptr_t)STARPU_PTHREAD_GETSPECIFIC(sched_ctx_key); if (id == 0) return STARPU_NMAX_SCHED_CTXS; else return id - 1; } 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_sched_policy *starpu_sched_ctx_get_sched_policy(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->sched_policy; } 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 = starpu_worker_tree.has_next; sched_ctx->workers->get_next = starpu_worker_tree.get_next; sched_ctx->workers->add = starpu_worker_tree.add; sched_ctx->workers->remove = starpu_worker_tree.remove; sched_ctx->workers->init = starpu_worker_tree.init; sched_ctx->workers->deinit = starpu_worker_tree.deinit; sched_ctx->workers->init_iterator = starpu_worker_tree.init_iterator; sched_ctx->workers->init_iterator_for_parallel_tasks = starpu_worker_tree.init_iterator_for_parallel_tasks; sched_ctx->workers->type = STARPU_WORKER_TREE; break; #endif // case STARPU_WORKER_LIST: default: sched_ctx->workers->has_next = starpu_worker_list.has_next; sched_ctx->workers->get_next = starpu_worker_list.get_next; sched_ctx->workers->add = starpu_worker_list.add; sched_ctx->workers->remove = starpu_worker_list.remove; sched_ctx->workers->init = starpu_worker_list.init; sched_ctx->workers->deinit = starpu_worker_list.deinit; sched_ctx->workers->init_iterator = starpu_worker_list.init_iterator; sched_ctx->workers->init_iterator_for_parallel_tasks = starpu_worker_list.init_iterator_for_parallel_tasks; 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; 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)) { int 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 npus = 0; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int 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; } 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 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)) { int worker = workers->get_next(workers, &it1); while(workers2->has_next(workers2, &it2)) { int 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); unsigned i; for (i = 0; i < workers->nworkers; i++) { int 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; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct _starpu_sched_ctx *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_get_ctx_for_task(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); unsigned ret_sched_ctx = task->sched_ctx; if (task->possibly_parallel && !sched_ctx->sched_policy && sched_ctx->nesting_sched_ctx != STARPU_NMAX_SCHED_CTXS) ret_sched_ctx = sched_ctx->nesting_sched_ctx; return ret_sched_ctx; } 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; } static void set_priority_on_notified_workers(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++) { if (workers[w] >= (int) starpu_worker_get_count()) /* Combined worker, don't care */ continue; worker = _starpu_get_worker_struct(workers[w]); _starpu_sched_ctx_list_move(&worker->sched_ctx_list, sched_ctx_id, priority); } } } void starpu_sched_ctx_set_priority(int *workerids, int nworkers, unsigned sched_ctx_id, unsigned priority) { if(nworkers != -1) { notify_workers_about_changing_ctx_pending(nworkers, workerids); _starpu_sched_ctx_lock_write(sched_ctx_id); int w; for(w = 0; w < nworkers; w++) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[w]); _starpu_sched_ctx_list_move(&worker->sched_ctx_list, sched_ctx_id, priority); } notify_workers_about_changing_ctx_done(nworkers, workerids); _starpu_sched_ctx_unlock_write(sched_ctx_id); } } unsigned starpu_sched_ctx_get_priority(int workerid, unsigned sched_ctx_id) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); return _starpu_sched_ctx_elt_get_priority(worker->sched_ctx_list, sched_ctx_id); } unsigned _starpu_sched_ctx_last_worker_awake(struct _starpu_worker *worker) { /* The worker being checked must have its status set to sleeping during * the check, to allow for an other worker being checked concurrently * to make the safe, pessimistic assumption that it is the last worker * awake. In the worst case, both workers will follow this pessimistic * path and perform one more scheduling loop */ STARPU_HG_DISABLE_CHECKING(_starpu_config.workers[worker->workerid].status); STARPU_ASSERT(_starpu_config.workers[worker->workerid].status == STATUS_SLEEPING || _starpu_config.workers[worker->workerid].status == STATUS_SLEEPING_SCHEDULING); STARPU_HG_ENABLE_CHECKING(_starpu_config.workers[worker->workerid].status); struct _starpu_sched_ctx_list_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx_elt *e = _starpu_sched_ctx_list_iterator_get_next(&list_it); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(e->sched_ctx); unsigned last_worker_awake = 1; struct starpu_worker_collection *workers = sched_ctx->workers; /* workers can be NULL in some corner cases, since we do not lock sched_ctx here */ if (workers != NULL) { 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(workerid != worker->workerid) { if(starpu_worker_is_combined_worker(workerid)) { continue; } /* The worker status is intendedly checked * without taking locks. If multiple workers * are concurrently assessing whether they are * the last worker awake, they will follow the * pessimistic path and assume that they are * the last worker awake */ STARPU_HG_DISABLE_CHECKING(_starpu_config.workers[workerid].status); const int cond = _starpu_config.workers[workerid].status != STATUS_SLEEPING && _starpu_config.workers[workerid].status != STATUS_SLEEPING_SCHEDULING; STARPU_HG_ENABLE_CHECKING(_starpu_config.workers[workerid].status); if (cond) { 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_bind_thread_on_cpu(cpuid, STARPU_NOWORKERID, NULL); } 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_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx_elt *e = _starpu_sched_ctx_list_iterator_get_next(&list_it); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(e->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; } unsigned starpu_sched_ctx_master_get_context(int masterid) { struct _starpu_worker *worker = _starpu_get_worker_struct(masterid); struct _starpu_sched_ctx_list_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx_elt *e = _starpu_sched_ctx_list_iterator_get_next(&list_it); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(e->sched_ctx); if(sched_ctx->main_master == masterid) 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_iterator list_it; struct _starpu_sched_ctx *ret = NULL; starpu_worker_lock(worker->workerid); _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx_elt *e = _starpu_sched_ctx_list_iterator_get_next(&list_it); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(e->sched_ctx); if (j->task->sched_ctx == sched_ctx->id) { ret = sched_ctx; break; } } starpu_worker_unlock(worker->workerid); return ret; } void starpu_sched_ctx_revert_task_counters_ctx_locked(unsigned sched_ctx_id, double ready_flops) { _starpu_decrement_nsubmitted_tasks_of_sched_ctx(sched_ctx_id); _starpu_decrement_nready_tasks_of_sched_ctx_locked(sched_ctx_id, ready_flops); } 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_locked(struct starpu_task *task, unsigned sched_ctx, unsigned with_repush) { /* Restore state just like out of dependency layers */ STARPU_ASSERT(task->status == STARPU_TASK_READY); task->status = STARPU_TASK_BLOCKED; /* TODO: make something cleaner which differentiates between calls from push or pop (have mutex or not) and from another worker or not */ 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); if(with_repush) _starpu_repush_task(j); else _starpu_increment_nready_tasks_of_sched_ctx(j->task->sched_ctx, j->task->flops, j->task); } #if 0 void starpu_sched_ctx_move_task_to_ctx(struct starpu_task *task, unsigned sched_ctx, unsigned manage_mutex, unsigned with_repush) { /* TODO: make something cleaner which differentiates between calls from push or pop (have mutex or not) and from another worker or not */ int workerid = starpu_worker_get_id(); struct _starpu_worker *worker = NULL; if(workerid != -1 && manage_mutex) { 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); if(with_repush) _starpu_repush_task(j); else _starpu_increment_nready_tasks_of_sched_ctx(j->task->sched_ctx, j->task->flops, j->task); if(workerid != -1 && manage_mutex) STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } #endif void starpu_sched_ctx_list_task_counters_increment(unsigned sched_ctx_id, int workerid) { /* Note : often we don't have any sched_mutex taken here but we should, so take it */ struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); /* FIXME: why do we push events only when the worker belongs to more than one ctx? */ if (worker->nsched_ctxs > 1) { starpu_worker_lock(workerid); _starpu_sched_ctx_list_push_event(worker->sched_ctx_list, sched_ctx_id); starpu_worker_unlock(workerid); } } void starpu_sched_ctx_list_task_counters_decrement(unsigned sched_ctx_id, int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->nsched_ctxs > 1) _starpu_sched_ctx_list_pop_event(worker->sched_ctx_list, sched_ctx_id); } void starpu_sched_ctx_list_task_counters_reset(unsigned sched_ctx_id, int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->nsched_ctxs > 1) _starpu_sched_ctx_list_pop_all_event(worker->sched_ctx_list, sched_ctx_id); } void starpu_sched_ctx_list_task_counters_increment_all_ctx_locked(struct starpu_task *task, unsigned sched_ctx_id) { /* TODO: add proper, but light-enough locking to sched_ctx counters */ /* Note that with 1 ctx we will default to the global context, hence our counters are useless */ if (_starpu_get_nsched_ctxs() > 1) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { int worker = workers->get_next(workers, &it); starpu_sched_ctx_list_task_counters_increment(sched_ctx_id, worker); } } } void starpu_sched_ctx_list_task_counters_increment_all(struct starpu_task *task, unsigned sched_ctx_id) { /* TODO: add proper, but light-enough locking to sched_ctx counters */ /* Note that with 1 ctx we will default to the global context, hence our counters are useless */ if (_starpu_get_nsched_ctxs() > 1) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; _starpu_sched_ctx_lock_write(sched_ctx_id); workers->init_iterator_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { int worker = workers->get_next(workers, &it); starpu_sched_ctx_list_task_counters_increment(sched_ctx_id, worker); } _starpu_sched_ctx_unlock_write(sched_ctx_id); } } void starpu_sched_ctx_list_task_counters_decrement_all_ctx_locked(struct starpu_task *task, unsigned sched_ctx_id) { if (_starpu_get_nsched_ctxs() > 1) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; workers->init_iterator_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->nsched_ctxs > 1) { starpu_worker_lock(workerid); starpu_sched_ctx_list_task_counters_decrement(sched_ctx_id, workerid); starpu_worker_unlock(workerid); } } } } void starpu_sched_ctx_list_task_counters_decrement_all(struct starpu_task *task, unsigned sched_ctx_id) { if (_starpu_get_nsched_ctxs() > 1) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; _starpu_sched_ctx_lock_write(sched_ctx_id); workers->init_iterator_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->nsched_ctxs > 1) { starpu_worker_lock(workerid); starpu_sched_ctx_list_task_counters_decrement(sched_ctx_id, workerid); starpu_worker_unlock(workerid); } } _starpu_sched_ctx_unlock_write(sched_ctx_id); } } void starpu_sched_ctx_list_task_counters_reset_all(struct starpu_task *task, unsigned sched_ctx_id) { if (_starpu_get_nsched_ctxs() > 1) { _starpu_sched_ctx_lock_write(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_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->nsched_ctxs > 1) { starpu_worker_lock(workerid); starpu_sched_ctx_list_task_counters_reset(sched_ctx_id, workerid); starpu_worker_unlock(workerid); } } _starpu_sched_ctx_unlock_write(sched_ctx_id); } } static void _starpu_sched_ctx_block_workers_in_parallel(unsigned sched_ctx_id, unsigned all) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int current_worker_id = starpu_worker_get_id(); int master, temp_master = 0; struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; /* temporarily put a master if needed */ if (sched_ctx->main_master == -1) { _starpu_sched_ctx_put_new_master(sched_ctx_id); temp_master = 1; } master = sched_ctx->main_master; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); if(starpu_worker_get_type(workerid) == STARPU_CPU_WORKER && (workerid != master || all) && (current_worker_id == -1 || workerid != current_worker_id)) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_request_blocking_in_parallel(worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } } if (temp_master) sched_ctx->main_master = -1; } static void _starpu_sched_ctx_unblock_workers_in_parallel(unsigned sched_ctx_id, unsigned all) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int current_worker_id = starpu_worker_get_id(); int master, temp_master = 0; struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; /* temporarily put a master if needed */ if (sched_ctx->main_master == -1) { _starpu_sched_ctx_put_new_master(sched_ctx_id); temp_master = 1; } master = sched_ctx->main_master; workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { int workerid = workers->get_next(workers, &it); if(starpu_worker_get_type(workerid) == STARPU_CPU_WORKER && (workerid != master || all)) { if (current_worker_id == -1 || workerid != current_worker_id) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); _starpu_worker_request_unblocking_in_parallel(worker); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); } } } if (temp_master) sched_ctx->main_master = -1; return; } void* starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void* param, unsigned sched_ctx_id) { _starpu_sched_ctx_block_workers_in_parallel(sched_ctx_id, 1); /* execute parallel code */ void* ret = func(param); /* wake up starpu workers */ _starpu_sched_ctx_unblock_workers_in_parallel(sched_ctx_id, 1); return ret; } static void _starpu_sched_ctx_update_parallel_workers_with(unsigned sched_ctx_id) { struct _starpu_sched_ctx * sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx->sched_policy) return; _starpu_sched_ctx_put_new_master(sched_ctx_id); if(!sched_ctx->awake_workers) { _starpu_sched_ctx_block_workers_in_parallel(sched_ctx_id, 0); } } static void _starpu_sched_ctx_update_parallel_workers_without(unsigned sched_ctx_id) { struct _starpu_sched_ctx * sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx->sched_policy) return; _starpu_sched_ctx_put_new_master(sched_ctx_id); if(!sched_ctx->awake_workers) { _starpu_sched_ctx_unblock_workers_in_parallel(sched_ctx_id, 0); } } 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; _STARPU_MALLOC((*cpuids), workers->nworkers*sizeof(int)); int w = 0; 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 master = sched_ctx->main_master; 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_put_new_master(unsigned sched_ctx_id) { int *workerids; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); unsigned nworkers = starpu_sched_ctx_get_workers_list_raw(sched_ctx_id, &workerids); unsigned i; for (i=0; imain_master = workerids[i]; break; } } STARPU_ASSERT_MSG(iperf_arch; } int starpu_sched_ctx_get_worker_rank(unsigned sched_ctx_id) { int idx = 0; int curr_workerid = starpu_worker_get_id(); 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)) { int worker = workers->get_next(workers, &it); if(worker == curr_workerid) return idx; idx++; } return -1; } void (*starpu_sched_ctx_get_sched_policy_init(unsigned sched_ctx_id))(unsigned) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->init_sched; } unsigned starpu_sched_ctx_has_starpu_scheduler(unsigned sched_ctx_id, unsigned *awake_workers) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); *awake_workers = sched_ctx->awake_workers; return sched_ctx->sched_policy != NULL; } void *starpu_sched_ctx_get_user_data(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT(sched_ctx != NULL); return sched_ctx->user_data; } void starpu_sched_ctx_set_user_data(unsigned sched_ctx_id, void* user_data) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT(sched_ctx != NULL); sched_ctx->user_data = user_data; } void _starpu_worker_apply_deferred_ctx_changes(void) { int workerid = starpu_worker_get_id_check(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_ctx_change_list *l = &worker->ctx_change_list; STARPU_ASSERT(!_starpu_worker_sched_op_pending()); while (!_starpu_ctx_change_list_empty(l)) { struct _starpu_ctx_change *chg = _starpu_ctx_change_list_pop_front(l); STARPU_ASSERT(chg->workerids_to_change != NULL); if (chg->nworkers_to_notify) { STARPU_ASSERT(chg->workerids_to_notify != NULL); notify_workers_about_changing_ctx_pending(chg->nworkers_to_notify, chg->workerids_to_notify); } else { STARPU_ASSERT(chg->workerids_to_notify == NULL); notify_workers_about_changing_ctx_pending(chg->nworkers_to_change, chg->workerids_to_change); } _starpu_sched_ctx_lock_write(chg->sched_ctx_id); switch (chg->op) { case ctx_change_add: { add_notified_workers(chg->workerids_to_change, chg->nworkers_to_change, chg->sched_ctx_id); } break; case ctx_change_remove: { remove_notified_workers(chg->workerids_to_change, chg->nworkers_to_change, chg->sched_ctx_id); { int i; for (i = 0; i < chg->nworkers_to_change; i++) { struct _starpu_worker *w = _starpu_get_worker_struct(chg->workerids_to_change[i]); if(w->removed_from_ctx[chg->sched_ctx_id] == 1 && w->shares_tasks_lists[chg->sched_ctx_id] == 1) { _starpu_worker_gets_out_of_ctx(chg->sched_ctx_id, w); w->removed_from_ctx[chg->sched_ctx_id] = 0; } } } } break; default: STARPU_ASSERT_MSG(0, "invalid ctx change opcode\n"); } if (chg->nworkers_to_notify) { notify_workers_about_changing_ctx_done(chg->nworkers_to_notify, chg->workerids_to_notify); } else { notify_workers_about_changing_ctx_done(chg->nworkers_to_change, chg->workerids_to_change); } _starpu_sched_ctx_unlock_write(chg->sched_ctx_id); free(chg->workerids_to_notify); free(chg->workerids_to_change); _starpu_ctx_change_delete(chg); } } /* TODO: verify starpu_sched_ctx_create_inside_interval correctness before re-enabling the functions below */ #if 0 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; 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) { int n=0; 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; _STARPU_DEBUG("%d: ", nw); for(i = 0; i < nw; i++) _STARPU_DEBUG_NO_HEADER("%d ", workers[i]); _STARPU_DEBUG_NO_HEADER("\n"); sched_ctx = _starpu_create_sched_ctx(selected_policy, workers, nw, 0, sched_ctx_name, 0, 0, 0, 0, 1, NULL, NULL,0, NULL, 0); sched_ctx->min_ncpus = min_ncpus; sched_ctx->max_ncpus = max_ncpus; sched_ctx->min_ngpus = min_ngpus; sched_ctx->max_ngpus = max_ngpus; int *added_workerids; unsigned nw_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &added_workerids); #warning TODO: verify call below, shouldn t it be _starpu_update_workers_with_ctx? _starpu_update_workers_without_ctx(added_workerids, nw_ctx, sched_ctx->id, 0); free(added_workerids); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif return sched_ctx->id; } #endif starpu-1.3.9+dfsg/src/core/sched_ctx.h000066400000000000000000000276521413463044200176320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #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 #define STARPU_NMAXSMS 13 struct _starpu_sched_ctx { /** id of the context used in user mode*/ unsigned id; /** boolean indicating whether the scheduling_ctx will be considered for scheduling (1) or not (0)*/ unsigned do_schedule; /** name of context */ const char *name; /** policy of the context */ struct starpu_sched_policy *sched_policy; /** data necessary for the policy */ void *policy_data; /** pointer for application use */ void *user_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; /*ready tasks that couldn't be pushed because the ctx has no workers*/ struct starpu_task_list empty_ctx_tasks; /*ready tasks that couldn't be pushed because the the window of tasks was already full*/ struct starpu_task_list waiting_tasks; /** 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; /** 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 parallel workers, say whether it is viewed as sequential or not. This is a helper for the prologue code. */ unsigned parallel_view; /** 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; /** function called when initializing the scheduler */ void (*init_sched)(unsigned); int sub_ctxs[STARPU_NMAXWORKERS]; int nsub_ctxs; /** nr of SMs assigned to this ctx if we partition gpus*/ int nsms; int sms_start_idx; int sms_end_idx; int stream_worker; starpu_pthread_rwlock_t rwlock; starpu_pthread_t lock_write_owner; }; /** per-worker list of deferred ctx_change ops */ LIST_TYPE(_starpu_ctx_change, int sched_ctx_id; int op; int nworkers_to_notify; int *workerids_to_notify; int nworkers_to_change; int *workerids_to_change; ); 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, void (*sched_policy_init)(unsigned), void *user_data, int nsub_ctxs, int *sub_ctxs, int nsms); /** 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); /** 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); /** 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 that some worker can execute a certain task */ int _starpu_workers_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 void starpu_sched_ctx_add_combined_workers(int *combined_workers_to_add, unsigned n_combined_workers_to_add, unsigned sched_ctx_id); /** 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))) static inline struct _starpu_sched_ctx *_starpu_get_sched_ctx_struct(unsigned id); static inline int _starpu_sched_ctx_check_write_locked(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return starpu_pthread_equal(sched_ctx->lock_write_owner, starpu_pthread_self()); } #define STARPU_SCHED_CTX_CHECK_LOCK(sched_ctx_id) STARPU_ASSERT(_starpu_sched_ctx_check_write_locked((sched_ctx_id))) static inline void _starpu_sched_ctx_lock_write(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_HG_DISABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_ASSERT(!starpu_pthread_equal(sched_ctx->lock_write_owner, starpu_pthread_self())); STARPU_HG_ENABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_PTHREAD_RWLOCK_WRLOCK(&sched_ctx->rwlock); sched_ctx->lock_write_owner = starpu_pthread_self(); } static inline void _starpu_sched_ctx_unlock_write(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_HG_DISABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_ASSERT(starpu_pthread_equal(sched_ctx->lock_write_owner, starpu_pthread_self())); memset(&sched_ctx->lock_write_owner, 0, sizeof(sched_ctx->lock_write_owner)); STARPU_HG_ENABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_PTHREAD_RWLOCK_UNLOCK(&sched_ctx->rwlock); } static inline void _starpu_sched_ctx_lock_read(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_HG_DISABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_ASSERT(!starpu_pthread_equal(sched_ctx->lock_write_owner, starpu_pthread_self())); STARPU_HG_ENABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_PTHREAD_RWLOCK_RDLOCK(&sched_ctx->rwlock); } static inline void _starpu_sched_ctx_unlock_read(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_HG_DISABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_ASSERT(!starpu_pthread_equal(sched_ctx->lock_write_owner, starpu_pthread_self())); STARPU_HG_ENABLE_CHECKING(sched_ctx->lock_write_owner); STARPU_PTHREAD_RWLOCK_UNLOCK(&sched_ctx->rwlock); } static inline unsigned _starpu_sched_ctx_worker_is_master_for_child_ctx(unsigned sched_ctx_id, unsigned workerid, struct starpu_task *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_locked(task, child_sched_ctx, 1); starpu_sched_ctx_revert_task_counters_ctx_locked(sched_ctx_id, task->flops); return 1; } return 0; } /** Go through the list of deferred ctx changes of the current worker and apply * any ctx change operation found until the list is empty */ void _starpu_worker_apply_deferred_ctx_changes(void); #endif // __SCHED_CONTEXT_H__ starpu-1.3.9+dfsg/src/core/sched_ctx_list.c000066400000000000000000000232721413463044200206520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_find(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_list *l = NULL; struct _starpu_sched_ctx_elt *e = NULL; unsigned found = 0; for (l = list; l && !found; l=l->next) { e=l->head; //Go in a circle once before stopping do { if (e->sched_ctx == sched_ctx) { found = 1; break; } e = e->next; } while (e != l->head); } return found ? e : NULL; } void _starpu_sched_ctx_elt_init(struct _starpu_sched_ctx_elt *elt, unsigned sched_ctx) { elt->sched_ctx = sched_ctx; elt->task_number = 0; elt->last_poped = 0; elt->parent = NULL; elt->next = NULL; elt->prev = NULL; } void _starpu_sched_ctx_elt_ensure_consistency(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *elt = _starpu_sched_ctx_elt_find(list, sched_ctx); if (elt && elt->task_number>0) elt->task_number = 0; } /* Adds a new element after the head of the given list. */ struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_add_after(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *head, *next; struct _starpu_sched_ctx_elt *elt; _STARPU_MALLOC(elt, sizeof(struct _starpu_sched_ctx_elt)); _starpu_sched_ctx_elt_init(elt, sched_ctx); elt->parent = list; head = list->head; if (head != NULL) { next = head->next; head->next = elt; elt->prev = head; /** We know next != NULL since it is at least head **/ elt->next = next; next->prev = elt; } else { elt->next = elt; elt->prev = elt; list->head = elt; } return elt; } /* Adds a new element before the head of the given list. */ struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_add_before(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *head, *prev; struct _starpu_sched_ctx_elt *elt; _STARPU_MALLOC(elt, sizeof(struct _starpu_sched_ctx_elt)); _starpu_sched_ctx_elt_init(elt, sched_ctx); elt->parent = list; head = list->head; if (head != NULL) { prev = head->prev; head->prev = elt; elt->next = head; elt->prev = prev; prev->next = elt; } else { elt->next = elt; elt->prev = elt; list->head = elt; } return elt; } struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_add(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { return _starpu_sched_ctx_elt_add_after(list, sched_ctx); } /* Remove elt from list */ void _starpu_sched_ctx_elt_remove(struct _starpu_sched_ctx_list *list, struct _starpu_sched_ctx_elt *elt) { elt->prev->next = elt->next; elt->next->prev = elt->prev; if (elt->next == elt) //singleton list->head = NULL; else if (elt->next != elt && list->head == elt) list->head = elt->next; free(elt); return; } int _starpu_sched_ctx_elt_exists(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *e; e = _starpu_sched_ctx_elt_find(list, sched_ctx); return (e == NULL) ? 0 : 1; } int _starpu_sched_ctx_elt_get_priority(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *e; e = _starpu_sched_ctx_elt_find(list, sched_ctx); return (e == NULL) ? 0 : e->parent->priority; } struct _starpu_sched_ctx_list* _starpu_sched_ctx_list_find(struct _starpu_sched_ctx_list *list, unsigned prio) { struct _starpu_sched_ctx_list *l = NULL; for (l = list; l != NULL ; l=l->next) { if (l->priority == prio) break; } return l; } /* Adds sched_ctx in a priority list. We consider that we don't add two times * the same sched_ctx. Returns head of list. */ struct _starpu_sched_ctx_elt* _starpu_sched_ctx_list_add_prio(struct _starpu_sched_ctx_list **list, unsigned prio, unsigned sched_ctx) { struct _starpu_sched_ctx_list *parent_list = NULL, *prev = NULL, *last = NULL; struct _starpu_sched_ctx_list *l; for (l = *list; l != NULL; l=l->next) { if (l->priority <= prio) break; last = l; } if (l != NULL && l->priority == prio) { parent_list = l; } else //l's priority is inferior or inexistant, add before { _STARPU_MALLOC(parent_list, sizeof(struct _starpu_sched_ctx_list)); parent_list->priority = prio; parent_list->next = l; parent_list->head = NULL; parent_list->prev = NULL; if (l != NULL) { prev = l->prev; l->prev = parent_list; if (prev != NULL) { prev->next = parent_list; parent_list->prev = prev; } else { *list = parent_list; } } else { if (last == NULL) { *list = parent_list; } else { last->next = parent_list; parent_list->prev = last; } } } return _starpu_sched_ctx_elt_add(parent_list, sched_ctx); } int _starpu_sched_ctx_list_add(struct _starpu_sched_ctx_list **list, unsigned sched_ctx) { return _starpu_sched_ctx_list_add_prio(list, 0, sched_ctx) != NULL ? 0 : -1; } void _starpu_sched_ctx_list_remove_elt(struct _starpu_sched_ctx_list **list, struct _starpu_sched_ctx_elt *rm) { struct _starpu_sched_ctx_list *parent; parent = rm->parent; _starpu_sched_ctx_elt_remove(parent, rm); /* Automatically clean up useless prio list */ if (parent->head == NULL) { if (parent->prev == NULL) { *list = parent->next; if (parent->next != NULL) parent->next->prev = NULL; } else { parent->prev->next = parent->next; parent->next->prev = parent->prev; } free(parent); parent = NULL; } return; } /* Searches for a context and remove it */ int _starpu_sched_ctx_list_remove(struct _starpu_sched_ctx_list **list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *rm; rm = _starpu_sched_ctx_elt_find(*list, sched_ctx); if (rm == NULL) return -1; _starpu_sched_ctx_list_remove_elt(list, rm); return 0; } int _starpu_sched_ctx_list_move(struct _starpu_sched_ctx_list **list, unsigned sched_ctx, unsigned prio_to) { struct _starpu_sched_ctx_elt *elt = _starpu_sched_ctx_elt_find(*list, sched_ctx); long task_number = 0; if (elt == NULL) return -1; task_number = elt->task_number; _starpu_sched_ctx_list_remove_elt(list, elt); elt = _starpu_sched_ctx_list_add_prio(list, prio_to, sched_ctx); elt->task_number = task_number; return 0; } int _starpu_sched_ctx_list_exists(struct _starpu_sched_ctx_list *list, unsigned prio) { struct _starpu_sched_ctx_list *l; l = _starpu_sched_ctx_list_find(list, prio); return ((l == NULL && list->priority == prio) || l != NULL) ? 1 : 0; } void _starpu_sched_ctx_list_remove_all(struct _starpu_sched_ctx_list *list) { while (list->head != NULL) _starpu_sched_ctx_elt_remove(list, list->head); free(list); } void _starpu_sched_ctx_list_delete(struct _starpu_sched_ctx_list **list) { while(*list) { struct _starpu_sched_ctx_list *next = (*list)->next; _starpu_sched_ctx_list_remove_all(*list); *list = NULL; if(next) *list = next; } } int _starpu_sched_ctx_list_iterator_init(struct _starpu_sched_ctx_list *list, struct _starpu_sched_ctx_list_iterator *it) { it->list_head = list; it->cursor = NULL; return 0; } int _starpu_sched_ctx_list_iterator_has_next(struct _starpu_sched_ctx_list_iterator *it) { if (it->cursor == NULL) { if (it->list_head != NULL) return it->list_head->head != NULL; else return 0; } else { struct _starpu_sched_ctx_list *parent = it->cursor->parent; if (it->cursor->next == parent->head) return parent->next != NULL; } return 1; } struct _starpu_sched_ctx_elt* _starpu_sched_ctx_list_iterator_get_next(struct _starpu_sched_ctx_list_iterator *it) { struct _starpu_sched_ctx_elt *ret=NULL, *current; struct _starpu_sched_ctx_list *parent; current = it->cursor; if (current != NULL) { parent = it->cursor->parent; if (current->next == parent->head) { if (parent->next != NULL) { it->cursor = parent->next->head; ret = it->cursor; } else { /* if everything fails (e.g. worker removed from ctx since related has_next call) just return head, it'll save us a synchro */ it->cursor = NULL; ret = it->list_head->head; } } else { it->cursor = current->next; ret = it->cursor; } } else { it->cursor = it->list_head->head; ret = it->cursor; } return ret; } int _starpu_sched_ctx_list_push_event(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *elt = _starpu_sched_ctx_elt_find(list, sched_ctx); if (elt == NULL) return -1; elt->task_number++; return 0; } int _starpu_sched_ctx_list_pop_event(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *elt = _starpu_sched_ctx_elt_find(list, sched_ctx); if (elt == NULL) return -1; elt->task_number--; /** Balance circular lists **/ elt->parent->head = elt->next; return 0; } int _starpu_sched_ctx_list_pop_all_event(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_elt *elt = _starpu_sched_ctx_elt_find(list, sched_ctx); if (elt == NULL) return -1; elt->task_number = 0; /** Balance circular lists **/ elt->parent->head = elt->next; return 0; } starpu-1.3.9+dfsg/src/core/sched_ctx_list.h000066400000000000000000000077711413463044200206650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ /** Represents a non circular list of priorities and contains a list of sched context */ struct _starpu_sched_ctx_elt; struct _starpu_sched_ctx_list { struct _starpu_sched_ctx_list *prev; struct _starpu_sched_ctx_list *next; struct _starpu_sched_ctx_elt *head; unsigned priority; }; /** Represents a circular list of sched context. */ struct _starpu_sched_ctx_elt { struct _starpu_sched_ctx_elt *prev; struct _starpu_sched_ctx_elt *next; struct _starpu_sched_ctx_list *parent; unsigned sched_ctx; long task_number; unsigned last_poped; }; struct _starpu_sched_ctx_list_iterator { struct _starpu_sched_ctx_list *list_head; struct _starpu_sched_ctx_elt *cursor; }; /** Element (sched_ctx) level operations */ struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_find(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); void _starpu_sched_ctx_elt_ensure_consistency(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); void _starpu_sched_ctx_elt_init(struct _starpu_sched_ctx_elt *elt, unsigned sched_ctx); struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_add_after(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_add_before(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); struct _starpu_sched_ctx_elt* _starpu_sched_ctx_elt_add(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); void _starpu_sched_ctx_elt_remove(struct _starpu_sched_ctx_list *list, struct _starpu_sched_ctx_elt *elt); int _starpu_sched_ctx_elt_exists(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); int _starpu_sched_ctx_elt_get_priority(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); /** List (priority) level operations */ struct _starpu_sched_ctx_list* _starpu_sched_ctx_list_find(struct _starpu_sched_ctx_list *list, unsigned prio); struct _starpu_sched_ctx_elt* _starpu_sched_ctx_list_add_prio(struct _starpu_sched_ctx_list **list, unsigned prio, unsigned sched_ctx); int _starpu_sched_ctx_list_add(struct _starpu_sched_ctx_list **list, unsigned sched_ctx); void _starpu_sched_ctx_list_remove_elt(struct _starpu_sched_ctx_list **list, struct _starpu_sched_ctx_elt *rm); int _starpu_sched_ctx_list_remove(struct _starpu_sched_ctx_list **list, unsigned sched_ctx); int _starpu_sched_ctx_list_move(struct _starpu_sched_ctx_list **list, unsigned sched_ctx, unsigned prio_to); int _starpu_sched_ctx_list_exists(struct _starpu_sched_ctx_list *list, unsigned prio); void _starpu_sched_ctx_list_remove_all(struct _starpu_sched_ctx_list *list); void _starpu_sched_ctx_list_delete(struct _starpu_sched_ctx_list **list); /** Task number management */ int _starpu_sched_ctx_list_push_event(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); int _starpu_sched_ctx_list_pop_event(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); int _starpu_sched_ctx_list_pop_all_event(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); /** Iterator operations */ int _starpu_sched_ctx_list_iterator_init(struct _starpu_sched_ctx_list *list, struct _starpu_sched_ctx_list_iterator *it); int _starpu_sched_ctx_list_iterator_has_next(struct _starpu_sched_ctx_list_iterator *it); struct _starpu_sched_ctx_elt* _starpu_sched_ctx_list_iterator_get_next(struct _starpu_sched_ctx_list_iterator *it); #endif // __SCHED_CONTEXT_H__ starpu-1.3.9+dfsg/src/core/sched_policy.c000066400000000000000000001073671413463044200203300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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_eager_prio_policy, &_starpu_sched_modular_gemm_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_parallel_random_policy, &_starpu_sched_modular_parallel_random_prio_policy, &_starpu_sched_modular_ws_policy, &_starpu_sched_modular_heft_policy, &_starpu_sched_modular_heft_prio_policy, &_starpu_sched_modular_heft2_policy, &_starpu_sched_modular_heteroprio_policy, &_starpu_sched_modular_heteroprio_heft_policy, &_starpu_sched_modular_parallel_heft_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_prio_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_heteroprio_policy, &_starpu_sched_graph_test_policy, #ifdef STARPU_HAVE_HWLOC //&_starpu_sched_tree_heft_hierarchical_policy, #endif 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 lws policy by default */ return &_starpu_sched_lws_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); if (starpu_get_env_number_default("STARPU_WORKER_TREE", 0)) { #ifdef STARPU_HAVE_HWLOC sched_ctx->sched_policy->worker_type = STARPU_WORKER_TREE; #else _STARPU_DISP("STARPU_WORKER_TREE ignored, please rebuild StarPU with hwloc support to enable it."); #endif } starpu_sched_ctx_create_worker_collection(sched_ctx->id, sched_ctx->sched_policy->worker_type); _STARPU_SCHED_BEGIN; sched_ctx->sched_policy->init_sched(sched_ctx->id); _STARPU_SCHED_END; } 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_SCHED_BEGIN; policy->deinit_sched(sched_ctx->id); _STARPU_SCHED_END; } starpu_sched_ctx_delete_worker_collection(sched_ctx->id); } 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_SCHED_BEGIN; sched_ctx->sched_policy->submit_hook(task); _STARPU_SCHED_END; } 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_SCHED_BEGIN; sched_ctx->sched_policy->do_schedule(sched_ctx_id); _STARPU_SCHED_END; } 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_list_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx_elt *e = _starpu_sched_ctx_list_iterator_get_next(&list_it); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(e->sched_ctx); if (sched_ctx->sched_policy != NULL && sched_ctx->sched_policy->push_task_notify) { _STARPU_SCHED_BEGIN; sched_ctx->sched_policy->push_task_notify(task, workerid, perf_workerid, sched_ctx->id); _STARPU_SCHED_END; } } } /* 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); struct _starpu_worker *worker = NULL; struct _starpu_combined_worker *combined_worker = NULL; if (is_basic_worker) { worker = _starpu_get_worker_struct(workerid); } else { combined_worker = _starpu_get_combined_worker_struct(workerid); } if (use_prefetch) starpu_prefetch_task_input_for(task, workerid); 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 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); unsigned i; 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; _STARPU_TRACE_JOB_PUSH(alias, alias->priority > 0); 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) { _starpu_set_current_task(j->task); j->task->prologue_callback_func(j->task->prologue_callback_arg); _starpu_set_current_task(NULL); } 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); int ret; _STARPU_LOG_IN(); unsigned can_push = _starpu_increment_nready_tasks_of_sched_ctx(task->sched_ctx, task->flops, task); STARPU_ASSERT(task->status == STARPU_TASK_BLOCKED || task->status == STARPU_TASK_BLOCKED_ON_TAG || task->status == STARPU_TASK_BLOCKED_ON_TASK || task->status == STARPU_TASK_BLOCKED_ON_DATA); 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->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 */ unsigned able = _starpu_workers_able_to_execute_task(task, sched_ctx); if(!able) { _starpu_sched_ctx_lock_write(sched_ctx->id); starpu_task_list_push_front(&sched_ctx->empty_ctx_tasks, task); _starpu_sched_ctx_unlock_write(sched_ctx->id); #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->where == STARPU_NOWHERE) { task->status = STARPU_TASK_RUNNING; if (task->prologue_callback_pop_func) { _starpu_set_current_task(task); task->prologue_callback_pop_func(task->prologue_callback_pop_arg); _starpu_set_current_task(NULL); } 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); _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 */ unsigned able = _starpu_workers_able_to_execute_task(task, sched_ctx); if (!able) { _starpu_sched_ctx_lock_write(sched_ctx->id); starpu_task_list_push_back(&sched_ctx->empty_ctx_tasks, task); _starpu_sched_ctx_unlock_write(sched_ctx->id); #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)) { if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_for(task, task->workerid); 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() && starpu_memory_nodes_get_count() > 1) { if (task->where == STARPU_CPU && config->cpus_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->cpus_nodeid); else if (task->where == STARPU_CUDA && config->cuda_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->cuda_nodeid); else if (task->where == STARPU_OPENCL && config->opencl_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->opencl_nodeid); else if (task->where == STARPU_MIC && config->mic_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->mic_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; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { unsigned workerid = workers->get_next(workers, &it); struct starpu_task *alias; if (job->task_size > 1) { alias = starpu_task_dup(task); _STARPU_TRACE_JOB_PUSH(alias, alias->priority > 0); alias->destroy = 1; } else alias = task; 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 */ unsigned nworkers = starpu_sched_ctx_get_nworkers(sched_ctx->id); if (nworkers == 0) ret = -1; else { struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (worker) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_enter_sched_op(worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } _STARPU_TASK_BREAK_ON(task, push); _STARPU_SCHED_BEGIN; ret = sched_ctx->sched_policy->push_task(task); _STARPU_SCHED_END; if (worker) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_leave_sched_op(worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_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_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_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: switch (starpu_node_get_kind(handle->mf_node)) { case STARPU_CPU_RAM: 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_codelet_check_deprecated_fields(conversion_task->cl); 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_elt *e = NULL; struct _starpu_sched_ctx_list_iterator list_it; int found = 0; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { e = _starpu_sched_ctx_list_iterator_get_next(&list_it); if (e->task_number > 0) return _starpu_get_sched_ctx_struct(e->sched_ctx); } _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { e = _starpu_sched_ctx_list_iterator_get_next(&list_it); if (e->last_poped) { e->last_poped = 0; if (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { e = _starpu_sched_ctx_list_iterator_get_next(&list_it); found = 1; } break; } } if (!found) e = worker->sched_ctx_list->head; e->last_poped = 1; return _starpu_get_sched_ctx_struct(e->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) { /** Caution * If you use multiple contexts your scheduler *needs* * to update the variable task_number of the ctx list. * In order to get the best performances. * This is done using functions : * starpu_sched_ctx_list_task_counters_increment...(...) * starpu_sched_ctx_list_task_counters_decrement...(...) **/ 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) { /* Note: we do not push the scheduling state here, because * otherwise when a worker is idle, we'd keep * pushing/popping a scheduling state here, while what we * want to see in the trace is a permanent idle state. */ 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_check(); 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. */ 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); 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) { _starpu_set_current_task(task); task->prologue_callback_pop_func(task->prologue_callback_pop_arg); _starpu_set_current_task(NULL); } 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_SCHED_BEGIN; task = sched_ctx->sched_policy->pop_every_task(sched_ctx->id); _STARPU_SCHED_END; } } return task; } void _starpu_sched_pre_exec_hook(struct starpu_task *task) { unsigned sched_ctx_id = starpu_sched_ctx_get_ctx_for_task(task); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if (sched_ctx->sched_policy && sched_ctx->sched_policy->pre_exec_hook) { _STARPU_SCHED_BEGIN; sched_ctx->sched_policy->pre_exec_hook(task, sched_ctx_id); _STARPU_SCHED_END; } if(!sched_ctx->sched_policy) { int workerid = starpu_worker_get_id(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx_list_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx *other_sched_ctx; struct _starpu_sched_ctx_elt *e; e = _starpu_sched_ctx_list_iterator_get_next(&list_it); other_sched_ctx = _starpu_get_sched_ctx_struct(e->sched_ctx); if (other_sched_ctx != sched_ctx && other_sched_ctx->sched_policy != NULL && other_sched_ctx->sched_policy->pre_exec_hook) { _STARPU_SCHED_BEGIN; other_sched_ctx->sched_policy->pre_exec_hook(task, other_sched_ctx->id); _STARPU_SCHED_END; } } } } void _starpu_sched_post_exec_hook(struct starpu_task *task) { STARPU_ASSERT(task->cl != NULL && task->cl->where != STARPU_NOWHERE); unsigned sched_ctx_id = starpu_sched_ctx_get_ctx_for_task(task); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if (sched_ctx->sched_policy && sched_ctx->sched_policy->post_exec_hook) { _STARPU_SCHED_BEGIN; sched_ctx->sched_policy->post_exec_hook(task, sched_ctx_id); _STARPU_SCHED_END; } if(!sched_ctx->sched_policy) { int workerid = starpu_worker_get_id(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx_list_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { struct _starpu_sched_ctx *other_sched_ctx; struct _starpu_sched_ctx_elt *e; e = _starpu_sched_ctx_list_iterator_get_next(&list_it); other_sched_ctx = _starpu_get_sched_ctx_struct(e->sched_ctx); if (other_sched_ctx != sched_ctx && other_sched_ctx->sched_policy != NULL && other_sched_ctx->sched_policy->post_exec_hook) { _STARPU_SCHED_BEGIN; other_sched_ctx->sched_policy->post_exec_hook(task, other_sched_ctx->id); _STARPU_SCHED_END; } } } } 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); } } void starpu_sched_task_break(struct starpu_task *task) { _STARPU_TASK_BREAK_ON(task, sched); } starpu-1.3.9+dfsg/src/core/sched_policy.h000066400000000000000000000132551413463044200203250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ #ifndef __SCHED_POLICY_H__ #define __SCHED_POLICY_H__ /** @file */ #include #include #include #include #include #include #define _STARPU_SCHED_BEGIN \ _STARPU_TRACE_WORKER_SCHEDULING_PUSH; \ _SIMGRID_TIMER_BEGIN(_starpu_simgrid_sched_cost()) #define _STARPU_SCHED_END \ _SIMGRID_TIMER_END; \ _STARPU_TRACE_WORKER_SCHEDULING_POP 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_prio_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_heteroprio_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_eager_prio_policy; extern struct starpu_sched_policy _starpu_sched_modular_gemm_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_parallel_random_policy; extern struct starpu_sched_policy _starpu_sched_modular_parallel_random_prio_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_modular_heteroprio_policy; extern struct starpu_sched_policy _starpu_sched_modular_heteroprio_heft_policy; extern struct starpu_sched_policy _starpu_sched_modular_parallel_heft_policy; extern struct starpu_sched_policy _starpu_sched_graph_test_policy; extern struct starpu_sched_policy _starpu_sched_tree_heft_hierarchical_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.3.9+dfsg/src/core/simgrid.c000066400000000000000000001202541413463044200173070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #if defined(HAVE_SIMGRID_SIMDAG_H) && (SIMGRID_VERSION >= 31300) #include #endif #ifdef STARPU_SIMGRID #ifdef HAVE_GETRLIMIT #include #endif #include #ifdef STARPU_HAVE_SIMGRID_HOST_H #include #endif #ifdef STARPU_HAVE_SIMGRID_ENGINE_H #include #endif #ifdef STARPU_HAVE_XBT_CONFIG_H #include #endif #include #pragma weak starpu_main extern int starpu_main(int argc, char *argv[]); #if SIMGRID_VERSION < 31600 #pragma weak smpi_main extern int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[]); #endif #pragma weak _starpu_mpi_simgrid_init extern int _starpu_mpi_simgrid_init(int argc, char *argv[]); #pragma weak smpi_process_set_user_data #if !HAVE_DECL_SMPI_PROCESS_SET_USER_DATA && !defined(smpi_process_set_user_data) extern void smpi_process_set_user_data(void *); #endif /* 1 when MSG_init was done, 2 when initialized through redirected main, 3 when * initialized through MSG_process_attach */ static int simgrid_started; static int simgrid_transfer_cost = 1; static int runners_running; starpu_pthread_queue_t _starpu_simgrid_transfer_queue[STARPU_MAXNODES]; static struct transfer_runner { struct transfer *first_transfer, *last_transfer; starpu_sem_t sem; starpu_pthread_t runner; } transfer_runner[STARPU_MAXNODES][STARPU_MAXNODES]; static void *transfer_execute(void *arg); starpu_pthread_queue_t _starpu_simgrid_task_queue[STARPU_NMAXWORKERS]; static struct worker_runner { struct task *first_task, *last_task; starpu_sem_t sem; starpu_pthread_t runner; } worker_runner[STARPU_NMAXWORKERS]; static void *task_execute(void *arg); #ifdef HAVE_SG_ACTOR_ON_EXIT static void on_exit_backtrace(int failed, void *data STARPU_ATTRIBUTE_UNUSED) { if (failed) xbt_backtrace_display_current(); } #endif void _starpu_simgrid_actor_setup(void) { #ifdef HAVE_SG_ACTOR_ON_EXIT sg_actor_on_exit(on_exit_backtrace, NULL); #endif } #if defined(HAVE_SG_ZONE_GET_BY_NAME) || defined(sg_zone_get_by_name) #define HAVE_STARPU_SIMGRID_GET_AS_BY_NAME sg_netzone_t _starpu_simgrid_get_as_by_name(const char *name) { return sg_zone_get_by_name(name); } #elif defined(HAVE_MSG_ZONE_GET_BY_NAME) || defined(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) || defined(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) || defined(MSG_environment_as_get_routing_sons) #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; #ifdef HAVE_SG_HOST_LIST sg_host_t *hosts_list = NULL; #endif xbt_dynar_t hosts = NULL; unsigned i, nb = 0; 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()); #if defined(HAVE_MSG_ZONE_GET_HOSTS) || defined(HAVE_SG_ZONE_GET_HOSTS) || defined(MSG_zone_get_hosts) || defined(sg_zone_get_hosts) hosts = xbt_dynar_new(sizeof(sg_host_t), NULL); # if defined(HAVE_SG_ZONE_GET_HOSTS) || defined(sg_zone_get_hosts) sg_zone_get_hosts(_starpu_simgrid_get_as_by_name(name), hosts); # else MSG_zone_get_hosts(_starpu_simgrid_get_as_by_name(name), hosts); # endif #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 { #ifdef HAVE_SG_HOST_LIST hosts_list = sg_host_list(); nb = sg_host_count(); #elif defined(STARPU_HAVE_SIMGRID_HOST_H) hosts = sg_hosts_as_dynar(); #else hosts = MSG_hosts_as_dynar(); #endif } if (hosts) nb = xbt_dynar_length(hosts); ret = 0; for (i = 0; i < nb; i++) { const char *name; #ifdef HAVE_SG_HOST_LIST if (hosts_list) name = sg_host_get_name(hosts_list[i]); else #endif #if defined(STARPU_HAVE_SIMGRID_HOST_H) name = sg_host_get_name(xbt_dynar_get_as(hosts, i, sg_host_t)); #else name = MSG_host_get_name(xbt_dynar_get_as(hosts, i, msg_host_t)); #endif if (!strncmp(name, prefix, len)) ret++; } if (hosts) xbt_dynar_free(&hosts); return ret; } unsigned long long _starpu_simgrid_get_memsize(const char *prefix, unsigned devid) { char name[32]; starpu_sg_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; #ifdef HAVE_SG_HOST_GET_PROPERTIES if (!sg_host_get_properties(host)) #else if (!MSG_host_get_properties(host)) #endif return 0; #ifdef HAVE_SG_HOST_GET_PROPERTIES memsize = sg_host_get_property_value(host, "memsize"); #else memsize = MSG_host_get_property_value(host, "memsize"); #endif if (!memsize) return 0; return atoll(memsize); } starpu_sg_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); #ifdef STARPU_HAVE_SIMGRID_HOST_H return sg_host_by_name(mpiname); #else return MSG_get_host_by_name(mpiname); #endif } else #ifdef STARPU_HAVE_SIMGRID_HOST_H return sg_host_by_name(name); #else return MSG_get_host_by_name(name); #endif } starpu_sg_host_t _starpu_simgrid_get_host_by_worker(struct _starpu_worker *worker) { char *prefix; char name[16]; starpu_sg_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; } /* Simgrid up to 3.15 would rename main into smpi_simulated_main_, and call that * from SMPI initialization * In case the MPI application didn't use smpicc to build the file containing * main(), but included our #define main starpu_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"); } return starpu_main(argc, argv); } int smpi_simulated_main_(int argc, char *argv[]) __attribute__((weak, alias("_starpu_smpi_simulated_main_"))); /* This is used to start a non-MPI simgrid environment */ void _starpu_start_simgrid(int *argc, char **argv) { char path[256]; if (simgrid_started) return; simgrid_started = 1; #if defined(STARPU_SIMGRID_HAVE_SIMGRID_INIT) && defined(HAVE_SG_ACTOR_INIT) simgrid_init(argc, argv); #else MSG_init(argc, argv); #endif /* Simgrid uses tiny stacks by default. This comes unexpected to our users. */ unsigned stack_size = 8192; #ifdef HAVE_GETRLIMIT struct rlimit rlim; if (getrlimit(RLIMIT_STACK, &rlim) == 0 && rlim.rlim_cur != 0 && rlim.rlim_cur != RLIM_INFINITY) stack_size = rlim.rlim_cur / 1024; #endif #ifdef HAVE_SG_CFG_SET_INT sg_cfg_set_int("contexts/stack-size", stack_size); #elif SIMGRID_VERSION < 31300 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 < 31300 _starpu_simgrid_get_platform_path(3, path, sizeof(path)); #else _starpu_simgrid_get_platform_path(4, path, sizeof(path)); #endif #if defined(STARPU_SIMGRID_HAVE_SIMGRID_INIT) && defined(HAVE_SG_ACTOR_INIT) simgrid_load_platform(path); #else MSG_create_environment(path); #endif int limit_bandwidth = starpu_get_env_number("STARPU_LIMIT_BANDWIDTH"); if (limit_bandwidth >= 0) { #if defined(HAVE_SG_LINK_BANDWIDTH_SET) || defined(HAVE_SG_LINK_SET_BANDWIDTH) sg_link_t *links = sg_link_list(); int count = sg_link_count(), i; for (i = 0; i < count; i++) { #ifdef HAVE_SG_LINK_SET_BANDWIDTH sg_link_set_bandwidth(links[i], limit_bandwidth * 1000000.); #else sg_link_bandwidth_set(links[i], limit_bandwidth * 1000000.); #endif } #else _STARPU_DISP("Warning: STARPU_LIMIT_BANDWIDTH set to %d but this requires simgrid 3.26, thus ignored\n", limit_bandwidth); #endif } simgrid_transfer_cost = starpu_get_env_number_default("STARPU_SIMGRID_TRANSFER_COST", 1); } 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 */ starpu_sleep(0.000001); _starpu_simgrid_actor_setup(); 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"); } 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(); /* This is hopefully called before the application and simgrid */ #undef main #pragma weak main int main(int argc, char **argv) { #ifdef HAVE_SG_CONFIG_CONTINUE_AFTER_HELP sg_config_continue_after_help(); #endif if (_starpu_simgrid_running_smpi()) { if (!smpi_process_get_user_data) { _STARPU_ERROR("Your version of simgrid does not provide smpi_process_get_user_data, we can not continue without it\n"); } #if SIMGRID_VERSION >= 31600 /* Recent versions of simgrid dlopen() us, so we don't need to * do circumvolutions, just init MPI early and run the application's main */ return _starpu_mpi_simgrid_init(argc, argv); #else /* Oops, we are running old 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); #endif } /* Already initialized? It probably has been done through a * constructor and MSG_process_attach, directly jump to real main */ if (simgrid_started == 3) { return do_starpu_main(argc, argv); } /* Managed to catch application's main, initialize simgrid first */ _starpu_start_simgrid(&argc, argv); simgrid_started = 2; /* 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]); /* Run the application in a separate thread */ _starpu_simgrid_actor_create("main", &do_starpu_main, _starpu_simgrid_get_host_by_name("MAIN"), argc, argv_cpy); /* And run maestro in the main thread */ #if defined(STARPU_SIMGRID_HAVE_SIMGRID_INIT) && defined(HAVE_SG_ACTOR_INIT) simgrid_run(); #else MSG_main(); #endif return main_ret; } #if defined(HAVE_MSG_PROCESS_ATTACH) || defined(MSG_process_attach) || defined(HAVE_SG_ACTOR_ATTACH) static void maestro(void *data STARPU_ATTRIBUTE_UNUSED) { #if defined(STARPU_SIMGRID_HAVE_SIMGRID_INIT) && defined(HAVE_SG_ACTOR_INIT) simgrid_run(); #else MSG_main(); #endif } #endif /* This is called early from starpu_init, so thread functions etc. can work */ void _starpu_simgrid_init_early(int *argc STARPU_ATTRIBUTE_UNUSED, char ***argv STARPU_ATTRIBUTE_UNUSED) { #ifdef HAVE_SG_CONFIG_CONTINUE_AFTER_HELP sg_config_continue_after_help(); #endif #if defined(HAVE_MSG_PROCESS_ATTACH) || defined(MSG_process_attach) || defined(HAVE_SG_ACTOR_ATTACH) if (simgrid_started < 2 && !_starpu_simgrid_running_smpi()) { /* "Cannot create_maestro with this ContextFactory. * Try using --cfg=contexts/factory:thread instead." * See https://github.com/simgrid/simgrid/issues/141 */ _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 >= 31400 /* Only recent versions of simgrid support setting sg_cfg_set_string before starting simgrid */ # ifdef HAVE_SG_CFG_SET_INT sg_cfg_set_string("contexts/factory", "thread"); # else xbt_cfg_set_string("contexts/factory", "thread"); # endif #endif /* We didn't catch application's main. */ /* Start maestro as a separate thread */ #ifdef HAVE_SIMGRID_SET_MAESTRO simgrid_set_maestro(maestro, NULL); #else SIMIX_set_maestro(maestro, NULL); #endif /* Initialize simgrid */ _starpu_start_simgrid(argc, *argv); /* And attach the main thread to the main simgrid process */ void **tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); #if defined(HAVE_SG_ACTOR_ATTACH) && (defined (HAVE_SG_ACTOR_DATA) || defined(HAVE_SG_ACTOR_GET_DATA)) sg_actor_t actor = sg_actor_attach("main", NULL, _starpu_simgrid_get_host_by_name("MAIN"), NULL); #ifdef HAVE_SG_ACTOR_SET_DATA sg_actor_set_data(actor, tsd); #else sg_actor_data_set(actor, tsd); #endif #else MSG_process_attach("main", tsd, _starpu_simgrid_get_host_by_name("MAIN"), NULL); #endif /* We initialized through MSG_process_attach */ simgrid_started = 3; } #endif if (!simgrid_started && !starpu_main && !_starpu_simgrid_running_smpi()) { /* Oops, we don't have MSG_process_attach and didn't catch the * 'main' symbol, there is no way for us */ _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"); } if (_starpu_simgrid_running_smpi()) { #ifndef STARPU_STATIC_ONLY _STARPU_ERROR("Simgrid currently does not support privatization for dynamically-linked libraries in SMPI. Please reconfigure and build StarPU with --disable-shared"); #endif #if defined(HAVE_MSG_PROCESS_USERDATA_INIT) && !(defined(HAVE_SG_ACTOR_DATA) || defined(HAVE_SG_ACTOR_GET_DATA)) MSG_process_userdata_init(); #endif void **tsd; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); #ifdef HAVE_SG_ACTOR_DATA #ifdef HAVE_SG_ACTOR_SET_DATA sg_actor_set_data(sg_actor_self(), tsd); #else sg_actor_data_set(sg_actor_self(), tsd); #endif #else smpi_process_set_user_data(tsd); #endif } unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) starpu_pthread_queue_init(&_starpu_simgrid_transfer_queue[i]); for (i = 0; i < STARPU_NMAXWORKERS; i++) starpu_pthread_queue_init(&_starpu_simgrid_task_queue[i]); } /* This is called late from starpu_init, to start task executors */ void _starpu_simgrid_init(void) { unsigned i; runners_running = 1; for (i = 0; i < starpu_worker_get_count(); i++) { char s[32]; snprintf(s, sizeof(s), "worker %u runner", i); starpu_sem_init(&worker_runner[i].sem, 0, 0); starpu_pthread_create_on(s, &worker_runner[i].runner, NULL, task_execute, (void*)(uintptr_t) i, _starpu_simgrid_get_host_by_worker(_starpu_get_worker_struct(i))); } } void _starpu_simgrid_deinit_late(void) { #if defined(HAVE_MSG_PROCESS_ATTACH) || defined(MSG_process_attach) || defined(HAVE_SG_ACTOR_ATTACH) if (simgrid_started == 3) { /* Started with MSG_process_attach, now detach */ #ifdef HAVE_SG_ACTOR_ATTACH sg_actor_detach(); #else MSG_process_detach(); #endif simgrid_started = 0; } #endif } void _starpu_simgrid_deinit(void) { unsigned i, j; runners_running = 0; for (i = 0; i < STARPU_MAXNODES; i++) { for (j = 0; j < STARPU_MAXNODES; j++) { struct transfer_runner *t = &transfer_runner[i][j]; if (t->runner) { starpu_sem_post(&t->sem); #ifdef STARPU_HAVE_SIMGRID_ACTOR_H sg_actor_join(t->runner, 1000000); #elif SIMGRID_VERSION >= 31400 MSG_process_join(t->runner, 1000000); #else starpu_sleep(1); #endif STARPU_ASSERT(t->first_transfer == NULL); STARPU_ASSERT(t->last_transfer == NULL); starpu_sem_destroy(&t->sem); } } /* FIXME: queue not empty at this point, needs proper unregistration */ /* starpu_pthread_queue_destroy(&_starpu_simgrid_transfer_queue[i]); */ } for (i = 0; i < starpu_worker_get_count(); i++) { struct worker_runner *w = &worker_runner[i]; starpu_sem_post(&w->sem); #ifdef STARPU_HAVE_SIMGRID_ACTOR_H sg_actor_join(w->runner, 1000000); #elif SIMGRID_VERSION >= 31400 MSG_process_join(w->runner, 1000000); #else starpu_sleep(1); #endif STARPU_ASSERT(w->first_task == NULL); STARPU_ASSERT(w->last_task == NULL); starpu_sem_destroy(&w->sem); starpu_pthread_queue_destroy(&_starpu_simgrid_task_queue[i]); } #if SIMGRID_VERSION >= 31300 /* clean-atexit introduced in simgrid 3.13 */ # ifdef HAVE_SG_CFG_SET_INT if ( sg_cfg_get_boolean("debug/clean-atexit")) # elif SIMGRID_VERSION >= 32300 if ( xbt_cfg_get_boolean("debug/clean-atexit")) # else if ( xbt_cfg_get_boolean("clean-atexit")) # endif { _starpu_simgrid_deinit_late(); } #endif } /* * Tasks */ struct task { #if defined(HAVE_SG_ACTOR_SELF_EXECUTE) || defined(HAVE_SG_ACTOR_EXECUTE) double flops; #else msg_task_t task; #endif /* communication termination signalization */ unsigned *finished; /* Next task on this worker */ struct task *next; }; /* Actually execute the task. */ static void *task_execute(void *arg) { unsigned workerid = (uintptr_t) arg; struct worker_runner *w = &worker_runner[workerid]; _STARPU_DEBUG("worker runner %u started\n", workerid); while (1) { struct task *task; starpu_sem_wait(&w->sem); if (!runners_running) break; task = w->first_task; w->first_task = task->next; if (w->last_task == task) w->last_task = NULL; _STARPU_DEBUG("task %p started\n", task); #ifdef HAVE_SG_ACTOR_EXECUTE sg_actor_execute(task->flops); #elif defined(HAVE_SG_ACTOR_SELF_EXECUTE) sg_actor_self_execute(task->flops); #else MSG_task_execute(task->task); MSG_task_destroy(task->task); #endif _STARPU_DEBUG("task %p finished\n", task); *task->finished = 1; /* The worker which started this task may be sleeping out of tasks, wake it */ _starpu_wake_worker_relax(workerid); free(task); } _STARPU_DEBUG("worker %u stopped\n", workerid); return 0; } /* Wait for completion of all asynchronous tasks for this worker */ void _starpu_simgrid_wait_tasks(int workerid) { struct task *task = worker_runner[workerid].last_task; if (!task) return; unsigned *finished = task->finished; starpu_pthread_wait_t wait; starpu_pthread_wait_init(&wait); starpu_pthread_queue_register(&wait, &_starpu_simgrid_task_queue[workerid]); while(1) { starpu_pthread_wait_reset(&wait); if (*finished) break; starpu_pthread_wait_wait(&wait); } starpu_pthread_queue_unregister(&wait, &_starpu_simgrid_task_queue[workerid]); starpu_pthread_wait_destroy(&wait); } /* Task execution submitted by StarPU */ void _starpu_simgrid_submit_job(int workerid, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch STARPU_ATTRIBUTE_UNUSED, double length, unsigned *finished) { struct starpu_task *starpu_task = j->task; double flops; #if !(defined(HAVE_SG_ACTOR_SELF_EXECUTE) || defined(HAVE_SG_ACTOR_EXECUTE)) msg_task_t simgrid_task; #endif 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 (in directory %s), or is not calibrated enough, please re-run in non-simgrid mode until it is calibrated, or fix the STARPU_HOSTNAME and STARPU_PERF_MODEL_DIR environment variables", _starpu_job_get_model_name(j), _starpu_get_perf_model_dir_codelet()); /* TODO: option to add variance according to performance model, * to be able to easily check scheduling robustness */ } #ifdef HAVE_SG_HOST_GET_SPEED flops = length/1000000.0*sg_host_get_speed(sg_host_self()); #else #if defined(HAVE_SG_HOST_SPEED) || defined(sg_host_speed) # if defined(HAVE_SG_HOST_SELF) || defined(sg_host_self) flops = length/1000000.0*sg_host_speed(sg_host_self()); # else flops = length/1000000.0*sg_host_speed(MSG_host_self()); # endif #elif defined HAVE_MSG_HOST_GET_SPEED || defined(MSG_host_get_speed) flops = length/1000000.0*MSG_host_get_speed(MSG_host_self()); #else flops = length/1000000.0*MSG_get_host_speed(MSG_host_self()); #endif #endif #if !(defined(HAVE_SG_ACTOR_SELF_EXECUTE) || defined(HAVE_SG_ACTOR_EXECUTE)) simgrid_task = MSG_task_create(_starpu_job_get_task_name(j), flops, 0, NULL); #endif if (finished == NULL) { /* Synchronous execution */ /* First wait for previous tasks */ _starpu_simgrid_wait_tasks(workerid); #ifdef HAVE_SG_ACTOR_EXECUTE sg_actor_execute(flops); #elif defined(HAVE_SG_ACTOR_SELF_EXECUTE) sg_actor_self_execute(flops); #else MSG_task_execute(simgrid_task); MSG_task_destroy(simgrid_task); #endif } else { /* Asynchronous execution */ struct task *task; struct worker_runner *w = &worker_runner[workerid]; _STARPU_MALLOC(task, sizeof(*task)); #if defined(HAVE_SG_ACTOR_SELF_EXECUTE) || defined(HAVE_SG_ACTOR_EXECUTE) task->flops = flops; #else task->task = simgrid_task; #endif task->finished = finished; *finished = 0; task->next = NULL; /* Sleep 10µs for the GPU task queueing */ if (_starpu_simgrid_queue_malloc_cost()) starpu_sleep(0.000010); if (w->last_task) { /* Already running a task, queue */ w->last_task->next = task; w->last_task = task; } else { STARPU_ASSERT(!w->first_task); w->first_task = task; w->last_task = task; } starpu_sem_post(&w->sem); } } /* * Transfers */ /* Note: simgrid is not parallel, so there is no need to hold locks for management of transfers. */ LIST_TYPE(transfer, #if defined(HAVE_SG_HOST_SEND_TO) || defined(HAVE_SG_HOST_SENDTO) size_t size; #else msg_task_t task; #endif int src_node; int dst_node; int run_node; /* communication termination signalization */ unsigned *finished; /* transfers which wait for this transfer */ struct transfer **wake; unsigned nwake; /* Number of transfers that this transfer waits for */ unsigned nwait; /* Next transfer on this stream */ struct transfer *next; ) 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; } static void transfer_queue(struct transfer *transfer) { unsigned src = transfer->src_node; unsigned dst = transfer->dst_node; struct transfer_runner *t = &transfer_runner[src][dst]; if (!t->runner) { /* No runner yet, start it */ static starpu_pthread_mutex_t mutex; /* process_create may yield */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!t->runner) { char s[64]; snprintf(s, sizeof(s), "transfer %u-%u runner", src, dst); starpu_pthread_create_on(s, &t->runner, NULL, transfer_execute, (void*)(uintptr_t)((src<<16) + dst), _starpu_simgrid_get_memnode_host(src)); starpu_sem_init(&t->sem, 0, 0); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } if (t->last_transfer) { /* Already running a transfer, queue */ t->last_transfer->next = transfer; t->last_transfer = transfer; } else { STARPU_ASSERT(!t->first_transfer); t->first_transfer = transfer; t->last_transfer = transfer; } starpu_sem_post(&t->sem); } /* Actually execute the transfer, and then start transfers waiting for this one. */ static void *transfer_execute(void *arg) { unsigned src_dst = (uintptr_t) arg; unsigned src = src_dst >> 16; unsigned dst = src_dst & 0xffff; struct transfer_runner *t = &transfer_runner[src][dst]; _STARPU_DEBUG("transfer runner %u-%u started\n", src, dst); while (1) { struct transfer *transfer; starpu_sem_wait(&t->sem); if (!runners_running) break; transfer = t->first_transfer; t->first_transfer = transfer->next; if (t->last_transfer == transfer) t->last_transfer = NULL; #if defined(HAVE_SG_HOST_SEND_TO) || defined(HAVE_SG_HOST_SENDTO) if (transfer->size) #else if (transfer->task) #endif { _STARPU_DEBUG("transfer %p started\n", transfer); #if defined(HAVE_SG_HOST_SEND_TO) || defined(HAVE_SG_HOST_SENDTO) #ifdef HAVE_SG_HOST_SENDTO sg_host_sendto #else sg_host_send_to #endif (_starpu_simgrid_memory_node_get_host(transfer->src_node), _starpu_simgrid_memory_node_get_host(transfer->dst_node), transfer->size); #else MSG_task_execute(transfer->task); MSG_task_destroy(transfer->task); #endif _STARPU_DEBUG("transfer %p finished\n", transfer); } *transfer->finished = 1; transfer_list_erase(&pending, transfer); /* The workers which started this request may be sleeping out of tasks, wake it */ _starpu_wake_all_blocked_workers_on_node(transfer->run_node); unsigned i; /* 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) { _STARPU_DEBUG("triggering transfer %p\n", wake); transfer_queue(wake); } } free(transfer->wake); free(transfer); } 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) { _STARPU_DEBUG("transfer %p waits for nobody, starting\n", transfer); transfer_queue(transfer); } } int _starpu_simgrid_wait_transfer_event(union _starpu_async_channel_event *event) { /* this is not associated to a request so it's synchronous */ starpu_pthread_wait_t wait; starpu_pthread_wait_init(&wait); starpu_pthread_queue_register(&wait, event->queue); while(1) { starpu_pthread_wait_reset(&wait); if (event->finished) break; starpu_pthread_wait_wait(&wait); } starpu_pthread_queue_unregister(&wait, event->queue); starpu_pthread_wait_destroy(&wait); return 0; } int _starpu_simgrid_test_transfer_event(union _starpu_async_channel_event *event) { return event->finished; } /* Wait for completion of all transfers */ static void _starpu_simgrid_wait_transfers(void) { unsigned finished = 0; struct transfer *sync = transfer_new(); struct transfer *cur; #if defined(HAVE_SG_HOST_SEND_TO) || defined(HAVE_SG_HOST_SENDTO) sync->size = 0; #else sync->task = NULL; #endif sync->finished = &finished; sync->src_node = STARPU_MAIN_RAM; sync->dst_node = STARPU_MAIN_RAM; sync->run_node = STARPU_MAIN_RAM; sync->wake = NULL; sync->nwake = 0; sync->nwait = 0; sync->next = NULL; for (cur = transfer_list_begin(&pending); cur != transfer_list_end(&pending); cur = transfer_list_next(cur)) { sync->nwait++; _STARPU_REALLOC(cur->wake, (cur->nwake + 1) * sizeof(cur->wake)); cur->wake[cur->nwake] = sync; cur->nwake++; } if (sync->nwait == 0) { /* No transfer to wait for */ free(sync); return; } /* Push synchronization pseudo-transfer */ transfer_list_push_front(&pending, sync); /* And wait for it */ starpu_pthread_wait_t wait; starpu_pthread_wait_init(&wait); starpu_pthread_queue_register(&wait, &_starpu_simgrid_transfer_queue[STARPU_MAIN_RAM]); while(1) { starpu_pthread_wait_reset(&wait); if (finished) break; starpu_pthread_wait_wait(&wait); } starpu_pthread_queue_unregister(&wait, &_starpu_simgrid_transfer_queue[STARPU_MAIN_RAM]); starpu_pthread_wait_destroy(&wait); } /* 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; /* Explicitly disabled by user? */ if (!simgrid_transfer_cost) return 0; union _starpu_async_channel_event *event, myevent; double start = 0.; struct transfer *transfer = transfer_new(); _STARPU_DEBUG("creating transfer %p for %lu bytes\n", transfer, (unsigned long) size); #if defined(HAVE_SG_HOST_SEND_TO) || defined(HAVE_SG_HOST_SENDTO) transfer->size = size; #else msg_task_t task; starpu_sg_host_t *hosts; double *computation; double *communication; _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); transfer->task = task; #endif transfer->src_node = src_node; transfer->dst_node = dst_node; transfer->run_node = starpu_worker_get_local_memory_node(); if (req) event = &req->async_channel.event; else event = &myevent; event->finished = 0; transfer->finished = &event->finished; event->queue = &_starpu_simgrid_transfer_queue[transfer->run_node]; transfer->wake = NULL; transfer->nwake = 0; transfer->nwait = 0; transfer->next = NULL; if (req) starpu_interface_start_driver_copy_async(src_node, dst_node, &start); /* Sleep 10µs for the GPU transfer queueing */ if (_starpu_simgrid_queue_malloc_cost()) starpu_sleep(0.000010); transfer_submit(transfer); /* Note: from here, transfer might be already freed */ if (req) { starpu_interface_end_driver_copy_async(src_node, dst_node, start); starpu_interface_data_copy(src_node, dst_node, size); return -EAGAIN; } else { /* this is not associated to a request so it's synchronous */ _starpu_simgrid_wait_transfer_event(event); return 0; } } /* Sync all GPUs (used on CUDA Free, typically) */ void _starpu_simgrid_sync_gpus(void) { _starpu_simgrid_wait_transfers(); } 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 */ starpu_sleep(0.000001); _starpu_simgrid_actor_setup(); /* _args is freed with process context */ f(arg); return 0; } starpu_pthread_t _starpu_simgrid_actor_create(const char *name, xbt_main_func_t code, starpu_sg_host_t host, int argc, char *argv[]) { void **tsd; starpu_pthread_t actor; _STARPU_CALLOC(tsd, MAX_TSD+1, sizeof(void*)); #ifdef HAVE_SG_ACTOR_INIT actor = sg_actor_init(name, host); #ifdef HAVE_SG_ACTOR_SET_DATA sg_actor_set_data(actor, tsd); #else sg_actor_data_set(actor, tsd); #endif sg_actor_start(actor, code, argc, argv); #else actor = MSG_process_create_with_arguments(name, code, tsd, host, argc, argv); #ifdef HAVE_SG_ACTOR_DATA #ifdef HAVE_SG_ACTOR_SET_DATA sg_actor_set_data(actor, tsd); #else sg_actor_data_set(actor, tsd); #endif #endif #endif return actor; } starpu_sg_host_t _starpu_simgrid_get_memnode_host(unsigned node) { const char *fmt; char name[16]; switch (starpu_node_get_kind(node)) { case STARPU_CPU_RAM: fmt = "RAM"; break; case STARPU_CUDA_RAM: fmt = "CUDA%u"; break; case STARPU_OPENCL_RAM: fmt = "OpenCL%u"; break; case STARPU_DISK_RAM: fmt = "DISK%u"; break; default: STARPU_ABORT(); break; } snprintf(name, sizeof(name), fmt, starpu_memory_node_get_devid(node)); return _starpu_simgrid_get_host_by_name(name); } void _starpu_simgrid_count_ngpus(void) { #if (defined(HAVE_SG_LINK_GET_NAME) || defined(HAVE_SG_LINK_NAME) || defined sg_link_name) && (SIMGRID_VERSION >= 31300) unsigned src, dst; starpu_sg_host_t ramhost = _starpu_simgrid_get_host_by_name("RAM"); /* For each pair of memory nodes, get the route */ for (src = 1; src < STARPU_MAXNODES; src++) for (dst = 1; dst < STARPU_MAXNODES; dst++) { int busid; starpu_sg_host_t srchost, dsthost; xbt_dynar_t route_dynar = xbt_dynar_new(sizeof(SD_link_t), NULL); SD_link_t link; int i, routesize; int through; unsigned src2; unsigned ngpus; const char *name; if (dst == src) continue; busid = starpu_bus_get_id(src, dst); if (busid == -1) continue; srchost = _starpu_simgrid_get_memnode_host(src); dsthost = _starpu_simgrid_get_memnode_host(dst); #if defined(HAVE_SG_HOST_GET_ROUTE) || defined(HAVE_SG_HOST_ROUTE) || defined(sg_host_route) #ifdef HAVE_SG_HOST_GET_ROUTE sg_host_get_route(srchost, dsthost, route_dynar); #else sg_host_route(srchost, dsthost, route_dynar); #endif routesize = xbt_dynar_length(route_dynar); #else const SD_link_t *route = SD_route_get_list(srchost, dsthost); routesize = SD_route_get_size(srchost, dsthost); for (i = 0; i < routesize; i++) xbt_dynar_push(route_dynar, &route[i]); free(route); #endif /* If it goes through "Host", do not care, there is no * direct transfer support */ for (i = 0; i < routesize; i++) { xbt_dynar_get_cpy(route_dynar, i, &link); if ( #ifdef HAVE_SG_LINK_GET_NAME !strcmp(sg_link_get_name(link), "Host") #else !strcmp(sg_link_name(link), "Host") #endif ) break; } if (i < routesize) continue; /* Get the PCI bridge between down and up links */ through = -1; for (i = 0; i < routesize; i++) { xbt_dynar_get_cpy(route_dynar, i, &link); #ifdef HAVE_SG_LINK_GET_NAME name = sg_link_get_name(link); #else name = sg_link_name(link); #endif size_t len = strlen(name); if (!strcmp(" through", name+len-8)) through = i; else if (!strcmp(" up", name+len-3)) break; } /* Didn't find it ?! */ if (through == -1) { _STARPU_DEBUG("Didn't find through-link for %d->%d\n", src, dst); continue; } xbt_dynar_get_cpy(route_dynar, through, &link); #ifdef HAVE_SG_LINK_GET_NAME name = sg_link_get_name(link); #else name = sg_link_name(link); #endif /* * count how many direct routes go through it between * GPUs and RAM */ ngpus = 0; for (src2 = 1; src2 < STARPU_MAXNODES; src2++) { int numa; int nnumas = starpu_memory_nodes_get_numa_count(); int found = 0; for (numa = 0; numa < nnumas; numa++) if (starpu_bus_get_id(src2, numa) != -1) { found = 1; break; } if (!found) continue; starpu_sg_host_t srchost2 = _starpu_simgrid_get_memnode_host(src2); int routesize2; xbt_dynar_t route_dynar2 = xbt_dynar_new(sizeof(SD_link_t), NULL); #if defined(HAVE_SG_HOST_GET_ROUTE) || defined(HAVE_SG_HOST_ROUTE) || defined(sg_host_route) #ifdef HAVE_SG_HOST_GET_ROUTE sg_host_get_route(srchost2, ramhost, route_dynar2); #else sg_host_route(srchost2, ramhost, route_dynar2); #endif routesize2 = xbt_dynar_length(route_dynar2); #else const SD_link_t *route2 = SD_route_get_list(srchost2, ramhost); routesize2 = SD_route_get_size(srchost2, ramhost); for (i = 0; i < routesize2; i++) xbt_dynar_push(route_dynar2, &route2[i]); free(route2); #endif for (i = 0; i < routesize2; i++) { xbt_dynar_get_cpy(route_dynar, i, &link); if ( #ifdef HAVE_SG_LINK_GET_NAME !strcmp(name, sg_link_get_name(link)) #else !strcmp(name, sg_link_name(link)) #endif ) { /* This GPU goes through this PCI bridge to access RAM */ ngpus++; break; } } } _STARPU_DEBUG("%d->%d through %s, %u GPUs\n", src, dst, name, ngpus); starpu_bus_set_ngpus(busid, ngpus); } #endif } #if 0 static size_t used; void _starpu_simgrid_data_new(size_t size) { // Note: this is just declarative //_STARPU_DISP("data new: %zd, now %zd\n", size, used); } void _starpu_simgrid_data_increase(size_t size) { used += size; _STARPU_DISP("data increase: %zd, now %zd\n", size, used); } void _starpu_simgrid_data_alloc(size_t size) { used += size; _STARPU_DISP("data alloc: %zd, now %zd\n", size, used); } void _starpu_simgrid_data_free(size_t size) { used -= size; _STARPU_DISP("data free: %zd, now %zd\n", size, used); } void _starpu_simgrid_data_transfer(size_t size, unsigned src_node, unsigned dst_node) { _STARPU_DISP("data transfer %zd from %u to %u\n", size, src_node, dst_node); } #endif #endif starpu-1.3.9+dfsg/src/core/simgrid.h000066400000000000000000000125471413463044200173210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #ifdef __cplusplus extern "C" { #endif /* Note: when changing something here, update the include list in configure.ac * in the part that tries to enable stdc++11 */ #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #elif defined(STARPU_HAVE_MSG_MSG_H) #include #endif #ifdef STARPU_HAVE_XBT_BASE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_VERSION_H #include #endif #ifdef STARPU_HAVE_SIMGRID_ZONE_H #include #endif #ifdef STARPU_HAVE_SIMGRID_HOST_H #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_start_simgrid(int *argc, char **argv); void _starpu_simgrid_init_early(int *argc, char ***argv); void _starpu_simgrid_init(void); void _starpu_simgrid_deinit(void); void _starpu_simgrid_deinit_late(void); void _starpu_simgrid_actor_setup(void); void _starpu_simgrid_wait_tasks(int workerid); struct _starpu_job; void _starpu_simgrid_submit_job(int workerid, struct _starpu_job *job, struct starpu_perfmodel_arch* perf_arch, double length, unsigned *finished); struct _starpu_data_request; int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req); union _starpu_async_channel_event; int _starpu_simgrid_wait_transfer_event(union _starpu_async_channel_event *event); int _starpu_simgrid_test_transfer_event(union _starpu_async_channel_event *event); void _starpu_simgrid_sync_gpus(void); /** 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); starpu_sg_host_t _starpu_simgrid_get_host_by_name(const char *name); starpu_sg_host_t _starpu_simgrid_get_memnode_host(unsigned node); struct _starpu_worker; starpu_sg_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); #if defined(HAVE_SG_ZONE_GET_BY_NAME) || defined(sg_zone_get_by_name) sg_netzone_t _starpu_simgrid_get_as_by_name(const char *name); #else msg_as_t _starpu_simgrid_get_as_by_name(const char *name); #endif #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[]); extern starpu_pthread_queue_t _starpu_simgrid_transfer_queue[STARPU_MAXNODES]; extern starpu_pthread_queue_t _starpu_simgrid_task_queue[STARPU_NMAXWORKERS]; #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) #define _starpu_simgrid_task_submit_cost() starpu_get_env_number_default("STARPU_SIMGRID_TASK_SUBMIT_COST", 1) #define _starpu_simgrid_fetching_input_cost() starpu_get_env_number_default("STARPU_SIMGRID_FETCHING_INPUT_COST", 1) #define _starpu_simgrid_sched_cost() starpu_get_env_number_default("STARPU_SIMGRID_SCHED_COST", 0) /** Called at initialization to count how many GPUs are interfering with each * bus */ void _starpu_simgrid_count_ngpus(void); void _starpu_simgrid_xbt_thread_create(const char *name, void_f_pvoid_t code, void *param); #define _SIMGRID_TIMER_BEGIN(cond) \ { \ xbt_os_timer_t __timer = NULL; \ if (cond) { \ __timer = xbt_os_timer_new(); \ xbt_os_threadtimer_start(__timer); \ } #define _SIMGRID_TIMER_END \ if (__timer) { \ xbt_os_threadtimer_stop(__timer); \ starpu_sleep(xbt_os_timer_elapsed(__timer));\ xbt_os_timer_free(__timer); \ } \ } #else // !STARPU_SIMGRID #define _SIMGRID_TIMER_BEGIN(cond) { #define _SIMGRID_TIMER_END } #endif /** Experimental functions for OOC stochastic analysis */ /* disk <-> MAIN_RAM only */ #if defined(STARPU_SIMGRID) && 0 void _starpu_simgrid_data_new(size_t size); void _starpu_simgrid_data_increase(size_t size); void _starpu_simgrid_data_alloc(size_t size); void _starpu_simgrid_data_free(size_t size); void _starpu_simgrid_data_transfer(size_t size, unsigned src_node, unsigned dst_node); #else #define _starpu_simgrid_data_new(size) (void)0 #define _starpu_simgrid_data_increase(size) (void)0 #define _starpu_simgrid_data_alloc(size) (void)0 #define _starpu_simgrid_data_free(size) (void)0 #define _starpu_simgrid_data_transfer(size, src_node, dst_node) (void)0 #endif #ifdef __cplusplus } #endif #endif // __SIMGRID_H__ starpu-1.3.9+dfsg/src/core/simgrid_cpp.cpp000066400000000000000000000102561413463044200205110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #if SIMGRID_VERSION >= 32190 #include #else #include #endif #include /* thread_create function which implements inheritence of MPI privatization */ /* See https://github.com/simgrid/simgrid/issues/139 */ typedef struct { void_f_pvoid_t code; void *userparam; #if SIMGRID_VERSION < 32501 void *father_data; #endif } thread_data_t; #if SIMGRID_VERSION >= 32501 static void *_starpu_simgrid_xbt_thread_create_wrapper(void *arg) { thread_data_t *t = (thread_data_t *) arg; /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */ starpu_sleep(0.000001); #ifdef HAVE_SMPI_THREAD_CREATE /* Make this actor inherit SMPI data from father actor */ SMPI_thread_create(); #endif t->code(t->userparam); free(t); return NULL; } #else #if SIMGRID_VERSION >= 32190 static void _starpu_simgrid_xbt_thread_create_wrapper(void) #else static int _starpu_simgrid_xbt_thread_create_wrapper(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) #endif { /* FIXME: Ugly work-around for bug in simgrid: the MPI context is not properly set at MSG process startup */ starpu_sleep(0.000001); #ifdef HAVE_SMX_ACTOR_T smx_actor_t #else smx_process_t #endif self = SIMIX_process_self(); #if SIMGRID_VERSION < 31300 thread_data_t *t = (thread_data_t *) SIMIX_process_self_get_data(self); #else thread_data_t *t = (thread_data_t *) SIMIX_process_self_get_data(); #endif simcall_process_set_data(self, t->father_data); t->code(t->userparam); simcall_process_set_data(self, NULL); free(t); #if SIMGRID_VERSION < 32190 return 0; #endif } #endif void _starpu_simgrid_xbt_thread_create(const char *name, void_f_pvoid_t code, void *param) { #if SIMGRID_VERSION >= 32501 starpu_pthread_t t; thread_data_t *res = (thread_data_t *) malloc(sizeof(thread_data_t)); res->userparam = param; res->code = code; starpu_pthread_create_on(name, &t, NULL, _starpu_simgrid_xbt_thread_create_wrapper, res, sg_host_self()); #else #if SIMGRID_VERSION >= 32190 || defined(HAVE_SIMCALL_PROCESS_CREATE) || defined(simcall_process_create) #ifdef HAVE_SMX_ACTOR_T smx_actor_t process STARPU_ATTRIBUTE_UNUSED; #else smx_process_t process STARPU_ATTRIBUTE_UNUSED; #endif thread_data_t *res = (thread_data_t *) malloc(sizeof(thread_data_t)); res->userparam = param; res->code = code; #if SIMGRID_VERSION < 31300 res->father_data = SIMIX_process_self_get_data(SIMIX_process_self()); #else res->father_data = SIMIX_process_self_get_data(); #endif #if SIMGRID_VERSION < 31200 simcall_process_create(&process, #else process = simcall_process_create( #endif name, _starpu_simgrid_xbt_thread_create_wrapper, res, #if SIMGRID_VERSION < 31400 SIMIX_host_self_get_name(), #else # if defined(HAVE_SG_HOST_SELF) || defined(sg_host_self) sg_host_self(), # else SIMIX_host_self(), # endif #endif #if SIMGRID_VERSION < 31500 || SIMGRID_VERSION == 31559 -1.0, #endif #if SIMGRID_VERSION < 32190 0, NULL, #endif /*props */ NULL #if SIMGRID_VERSION < 31500 || SIMGRID_VERSION == 31559 , 0 #endif ); #else STARPU_ABORT_MSG("Can't run StarPU-Simgrid-MPI with a Simgrid version which does not provide simcall_process_create and does not fix https://github.com/simgrid/simgrid/issues/139 , sorry."); #endif #endif } #endif starpu-1.3.9+dfsg/src/core/task.c000066400000000000000000001160301413463044200166100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * Copyright (C) 2017 Erwan Leria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #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; /* * Function to call when watchdog detects that no task has finished for more than STARPU_WATCHDOG_TIMEOUT seconds */ static void (*watchdog_hook)(void *) = NULL; static void * watchdog_hook_arg = NULL; #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; task->where = -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_INIT != 0 task->status = STARPU_TASK_INIT; #endif task->predicted = NAN; task->predicted_transfer = NAN; task->predicted_start = NAN; task->magic = _STARPU_TASK_MAGIC; task->sched_ctx = STARPU_NMAX_SCHED_CTXS; task->flops = 0.0; } /* 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 -> assertion failure, it's too dangerous to be doing something like this */ /* 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 = _starpu_get_job_associated_to_task(task); _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; } int starpu_task_wait_array(struct starpu_task **tasks, unsigned nb_tasks) { unsigned i; for (i = 0; i < nb_tasks; i++) { int ret = starpu_task_wait(tasks[i]); if (ret) return ret; } 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; if (cl->checked) { STARPU_RMB(); 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->mpi_ms_funcs[i]) { some_impl = 1; break; } if (some_impl && is_where_unset) { where |= STARPU_MPI_MS; } 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_MPI_MS; } cl->where = where; STARPU_WMB(); cl->checked = 1; } 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 (task->status == STARPU_TASK_STOPPED || task->status == STARPU_TASK_FINISHED) task->status = STARPU_TASK_INIT; else STARPU_ASSERT(task->status == STARPU_TASK_INIT); 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->where== -1 && task->cl) task->where = task->cl->where; 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); enum starpu_data_access_mode mode = STARPU_TASK_GET_MODE(task, i); int node = task->cl->specific_nodes ? STARPU_CODELET_GET_NODE(task->cl, i) : -1; /* 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"); /* Make sure the specified node exists */ STARPU_ASSERT_MSG(node == STARPU_SPECIFIC_NODE_LOCAL || node == STARPU_SPECIFIC_NODE_CPU || node == STARPU_SPECIFIC_NODE_SLOW || (node >= 0 && node < (int) starpu_memory_nodes_get_count()), "The codelet-specified memory node does not exist"); /* 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); if (!(task->cl->flags & STARPU_CODELET_NOPLANS) && ((handle->nplans && !handle->nchildren) || handle->siblings) && !(mode & STARPU_NOPLAN)) /* This handle is involved with asynchronous * partitioning as a parent or a child, make * sure the right plan is active, submit * appropiate partitioning / unpartitioning if * not */ _starpu_data_partition_access_submit(handle, (mode & STARPU_W) != 0); } /* 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."); STARPU_ASSERT_MSG(starpu_is_initialized(), "starpu_init must be called (and return no error) before submitting tasks."); 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 && limit_max_submitted_tasks >= 0 && limit_min_submitted_tasks >= 0) { int nsubmitted_tasks = starpu_task_nsubmitted(); if (limit_max_submitted_tasks < nsubmitted_tasks && 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 (!continuation) { #ifndef STARPU_NO_ASSERT STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); STARPU_ASSERT_MSG(!j->submitted || j->terminated >= 1, "Tasks can not be submitted a second time before being terminated. Please use different task structures, or use the regenerate flag to let the task resubmit itself automatically."); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); #endif _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]); _STARPU_TRACE_TASK_NAME(j); } /* If this is a continuation, we don't modify the implicit data dependencies detected earlier. */ if (task->cl && !continuation) { _starpu_job_set_ordered_buffers(j); _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 = task->profiling_info; int profiling = starpu_profiling_status_get(); if (!info) { 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 if (_starpu_simgrid_task_submit_cost()) starpu_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); STARPU_ASSERT(task->status == STARPU_TASK_BLOCKED); 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); STARPU_ASSERT(task->status == STARPU_TASK_INIT); 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_wake_worker_locked(worker->workerid); _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].do_schedule == 1) { _starpu_sched_do_schedule(config->sched_ctxs[s].id); } } for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].do_schedule == 1) { 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].do_schedule == 1) { _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].do_schedule == 1) { _starpu_sched_do_schedule(config->sched_ctxs[s].id); } } for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].do_schedule == 1) { _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].do_schedule == 1) { _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].do_schedule == 1) { _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].do_schedule == 1) { 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].do_schedule == 1) { 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); } int starpu_task_get_current_data_node(unsigned i) { struct starpu_task *task = starpu_task_get_current(); if (!task) return -1; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); unsigned orderedindex = descrs[i].orderedindex; return descrs[orderedindex].node; } #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_MPI_MS_RAM: return 1; default: STARPU_ABORT(); } break; case STARPU_CUDA_RAM: /* Fall through */ case STARPU_OPENCL_RAM: case STARPU_MIC_RAM: case STARPU_MPI_MS_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_MPI_MS_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()) { if (watchdog_hook == NULL) _STARPU_MSG("The StarPU watchdog detected that no task finished for %fs (can be configured through STARPU_WATCHDOG_TIMEOUT)\n", timeout); else watchdog_hook(watchdog_hook_arg); if (watchdog_crash) { _STARPU_MSG("Crashing the process\n"); raise(SIGABRT); } else if (watchdog_hook == NULL) _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_task_watchdog_set_hook(void (*hook)(void *), void *hook_arg) { watchdog_hook = hook; watchdog_hook_arg = hook_arg; } void _starpu_watchdog_init() { 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.3.9+dfsg/src/core/task.h000066400000000000000000000121561413463044200166210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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); #define _STARPU_JOB_UNSET ((struct _starpu_job *) NULL) #define _STARPU_JOB_SETTING ((struct _starpu_job *) 1) /** Returns the job structure (which is the internal data structure associated * to a task). */ struct _starpu_job *_starpu_get_job_associated_to_task_slow(struct starpu_task *task, struct _starpu_job *job); static inline struct _starpu_job *_starpu_get_job_associated_to_task(struct starpu_task *task) { STARPU_ASSERT(task); struct _starpu_job *job = (struct _starpu_job *) task->starpu_private; if (STARPU_LIKELY(job != _STARPU_JOB_UNSET && job != _STARPU_JOB_SETTING)) { /* Already available */ STARPU_RMB(); return job; } return _starpu_get_job_associated_to_task_slow(task, 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_mpi_ms_func_t _starpu_task_get_mpi_ms_nth_implementation(struct starpu_codelet *cl, unsigned nimpl) { return cl->mpi_ms_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); #ifdef BUILDING_STARPU LIST_CREATE_TYPE_NOSTRUCT(starpu_task, prev, next); PRIO_LIST_CREATE_TYPE(starpu_task, priority); #endif #endif // __CORE_TASK_H__ starpu-1.3.9+dfsg/src/core/task_bundle.c000066400000000000000000000137001413463044200201410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 /* 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_INIT) { /* 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 _starpu_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.3.9+dfsg/src/core/task_bundle.h000066400000000000000000000073301413463044200201500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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); /** _starpu_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 _starpu_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.3.9+dfsg/src/core/topology.c000066400000000000000000003000631413463044200175230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #if HWLOC_API_VERSION < 0x00010b00 #define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE #endif #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef STARPU_SIMGRID #include #endif #if defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX #include #endif #if defined(STARPU_HAVE_HWLOC) && defined(STARPU_USE_OPENCL) #include #endif static unsigned topology_is_initialized = 0; static int nobind; static int numa_enabled = -1; /* For checking whether two workers share the same PU, indexed by PU number */ static int cpu_worker[STARPU_MAXCPUS]; static char * cpu_name[STARPU_MAXCPUS]; static unsigned nb_numa_nodes = 0; static int numa_memory_nodes_to_hwloclogid[STARPU_MAXNUMANODES]; /* indexed by StarPU numa node to convert in hwloc logid */ static int numa_memory_nodes_to_physicalid[STARPU_MAXNUMANODES]; /* indexed by StarPU numa node to convert in physical id */ static unsigned numa_bus_id[STARPU_MAXNUMANODES*STARPU_MAXNUMANODES]; static int _starpu_get_logical_numa_node_worker(unsigned workerid); #define STARPU_NUMA_UNINITIALIZED (-2) #define STARPU_NUMA_MAIN_RAM (-1) #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) || defined(STARPU_USE_MPI_MASTER_SLAVE) 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) #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 #ifdef STARPU_USE_MPI_MASTER_SLAVE struct _starpu_worker_set mpi_worker_set[STARPU_MAXMPIDEVS]; #endif int starpu_memory_nodes_get_numa_count(void) { return nb_numa_nodes; } #if defined(STARPU_HAVE_HWLOC) static hwloc_obj_t numa_get_obj(hwloc_obj_t obj) { #if HWLOC_API_VERSION >= 0x00020000 while (obj->memory_first_child == NULL) { obj = obj->parent; if (!obj) return NULL; } return obj->memory_first_child; #else while (obj->type != HWLOC_OBJ_NUMANODE) { obj = obj->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. */ if (!obj) return NULL; } return obj; #endif } static int numa_get_logical_id(hwloc_obj_t obj) { STARPU_ASSERT(obj); obj = numa_get_obj(obj); if (!obj) return 0; return obj->logical_index; } static int numa_get_physical_id(hwloc_obj_t obj) { STARPU_ASSERT(obj); obj = numa_get_obj(obj); if (!obj) return 0; return obj->os_index; } #endif /* This returns the exact NUMA node next to a worker */ static int _starpu_get_logical_numa_node_worker(unsigned workerid) { #if defined(STARPU_HAVE_HWLOC) STARPU_ASSERT(numa_enabled != -1); if (numa_enabled) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config() ; struct _starpu_machine_topology *topology = &config->topology ; hwloc_obj_t obj; switch(worker->arch) { case STARPU_CPU_WORKER: obj = hwloc_get_obj_by_type(topology->hwtopology, HWLOC_OBJ_PU, worker->bindid) ; break; default: STARPU_ABORT(); } return numa_get_logical_id(obj); } else #endif { (void) workerid; /* unused */ return STARPU_NUMA_MAIN_RAM; } } /* This returns the exact NUMA node next to a worker */ static int _starpu_get_physical_numa_node_worker(unsigned workerid) { #if defined(STARPU_HAVE_HWLOC) STARPU_ASSERT(numa_enabled != -1); if (numa_enabled) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config() ; struct _starpu_machine_topology *topology = &config->topology ; hwloc_obj_t obj; switch(worker->arch) { case STARPU_CPU_WORKER: obj = hwloc_get_obj_by_type(topology->hwtopology, HWLOC_OBJ_PU, worker->bindid) ; break; default: STARPU_ABORT(); } return numa_get_physical_id(obj); } else #endif { (void) workerid; /* unused */ return STARPU_NUMA_MAIN_RAM; } } /* This returns the CPU NUMA memory close to a worker */ static int _starpu_get_logical_close_numa_node_worker(unsigned workerid) { #if defined(STARPU_HAVE_HWLOC) STARPU_ASSERT(numa_enabled != -1); if (numa_enabled) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config() ; struct _starpu_machine_topology *topology = &config->topology ; hwloc_obj_t obj; switch(worker->arch) { case STARPU_CPU_WORKER: obj = hwloc_get_obj_by_type(topology->hwtopology, HWLOC_OBJ_PU, worker->bindid) ; break; #ifndef STARPU_SIMGRID #if defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX case STARPU_CUDA_WORKER: obj = hwloc_cuda_get_device_osdev_by_index(topology->hwtopology, worker->devid); break; #endif #endif default: return 0; } return numa_get_logical_id(obj); } else #endif { (void) workerid; /* unused */ return STARPU_NUMA_MAIN_RAM; } } //TODO change this in an array int starpu_memory_nodes_numa_hwloclogid_to_id(int logid) { unsigned n; for (n = 0; n < nb_numa_nodes; n++) if (numa_memory_nodes_to_hwloclogid[n] == logid) return n; return -1; } int starpu_memory_nodes_numa_id_to_hwloclogid(unsigned id) { STARPU_ASSERT(id < STARPU_MAXNUMANODES); return numa_memory_nodes_to_hwloclogid[id]; } int starpu_memory_nodes_numa_devid_to_id(unsigned id) { STARPU_ASSERT(id < STARPU_MAXNUMANODES); return numa_memory_nodes_to_physicalid[id]; } //TODO change this in an array int starpu_memory_nodes_numa_id_to_devid(int osid) { unsigned n; for (n = 0; n < nb_numa_nodes; n++) if (numa_memory_nodes_to_physicalid[n] == osid) return n; return -1; } // TODO: cache the values instead of looking in hwloc each time /* Avoid using this one, prefer _starpu_task_data_get_node_on_worker */ int _starpu_task_data_get_node_on_node(struct starpu_task *task, unsigned index, unsigned local_node) { int node = STARPU_SPECIFIC_NODE_LOCAL; if (task->cl->specific_nodes) node = STARPU_CODELET_GET_NODE(task->cl, index); switch (node) { case STARPU_SPECIFIC_NODE_LOCAL: // TODO: rather find MCDRAM node = local_node; break; case STARPU_SPECIFIC_NODE_CPU: switch (starpu_node_get_kind(local_node)) { case STARPU_CPU_RAM: node = local_node; break; default: // TODO: rather take close NUMA node node = STARPU_MAIN_RAM; break; } break; case STARPU_SPECIFIC_NODE_SLOW: // TODO: rather leave in DDR node = local_node; break; } return node; } int _starpu_task_data_get_node_on_worker(struct starpu_task *task, unsigned index, unsigned worker) { unsigned local_node = starpu_worker_get_memory_node(worker); int node = STARPU_SPECIFIC_NODE_LOCAL; if (task->cl->specific_nodes) node = STARPU_CODELET_GET_NODE(task->cl, index); switch (node) { case STARPU_SPECIFIC_NODE_LOCAL: // TODO: rather find MCDRAM node = local_node; break; case STARPU_SPECIFIC_NODE_CPU: node = starpu_memory_nodes_numa_hwloclogid_to_id(_starpu_get_logical_close_numa_node_worker(worker)); if (node == -1) node = STARPU_MAIN_RAM; break; case STARPU_SPECIFIC_NODE_SLOW: // TODO: rather leave in DDR node = local_node; break; } return node; } struct _starpu_worker *_starpu_get_worker_from_driver(struct starpu_driver *d) { unsigned nworkers = starpu_worker_get_count(); unsigned workerid; 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 #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: { if (worker->devid == d->id.cuda_id) return worker; break; } #endif default: (void) worker; _STARPU_DEBUG("Invalid device type\n"); return NULL; } } } return NULL; } /* * Discover the topology of the machine */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) || defined(STARPU_USE_MPI_MASTER_SLAVE) 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=NULL, *tempo=NULL; 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 #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_MPI_MASTER_SLAVE static inline int _starpu_get_next_mpi_deviceid(struct _starpu_machine_config *config) { unsigned i = ((config->current_mpi_deviceid++) % config->topology.nmpidevices); return (int)config->topology.workers_mpi_ms_deviceid[i]; } static void _starpu_init_mpi_topology(struct _starpu_machine_config *config, long mpi_idx) { /* Discover the topology of the mpi node identifier by MPI_IDX. That * means, make this StarPU instance aware of the number of cores available * on this MPI device. Update the `nhwmpicores' topology field * accordingly. */ struct _starpu_machine_topology *topology = &config->topology; int nbcores; _starpu_src_common_sink_nbcores(_starpu_mpi_ms_nodes[mpi_idx], &nbcores); topology->nhwmpicores[mpi_idx] = nbcores; } #endif /* STARPU_USE_MPI_MASTER_SLAVE */ #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(_starpu_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]; snprintf(mic_idx_env, sizeof(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]; snprintf(nb_mic_env, sizeof(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 */ _starpu_mic_nodes[mic_idx] = _starpu_mp_common_node_create(STARPU_NODE_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]); #if HWLOC_API_VERSION >= 0x00020000 hwloc_obj_t child; for (child = obj->io_first_child; child; child = child->next_sibling) _starpu_allocate_topology_userdata(child); #endif } 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]); #if HWLOC_API_VERSION >= 0x00020000 hwloc_obj_t child; for (child = obj->io_first_child; child; child = child->next_sibling) _starpu_deallocate_topology_userdata(child); #endif } #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); char *hwloc_input = starpu_getenv("STARPU_HWLOC_INPUT"); if (hwloc_input && hwloc_input[0]) { int err = hwloc_topology_set_xml(topology->hwtopology, hwloc_input); if (err < 0) _STARPU_DISP("Could not load hwloc input %s\n", hwloc_input); } _starpu_topology_filter(topology->hwtopology); hwloc_topology_load(topology->hwtopology); #ifdef HAVE_HWLOC_CPUKINDS_GET_NR int nr_kinds = hwloc_cpukinds_get_nr(topology->hwtopology, 0); if (nr_kinds > 1) _STARPU_DISP("Warning: there are several kinds of CPU on this system. For now StarPU assumes all CPU are equal\n"); #endif if (starpu_get_env_number_default("STARPU_WORKERS_GETBIND", 0)) { /* Respect the existing binding */ hwloc_bitmap_t cpuset = hwloc_bitmap_alloc(); int ret = hwloc_get_cpubind(topology->hwtopology, cpuset, HWLOC_CPUBIND_THREAD); if (ret) _STARPU_DISP("Warning: could not get current CPU binding: %s\n", strerror(errno)); else { ret = hwloc_topology_restrict(topology->hwtopology, cpuset, 0); if (ret) _STARPU_DISP("Warning: could not restrict hwloc to cpuset: %s\n", strerror(errno)); } hwloc_bitmap_free(cpuset); } _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 if (config->conf.ncuda != 0) _starpu_cuda_discover_devices(config); if (config->conf.nopencl != 0) _starpu_opencl_discover_devices(config); #ifdef STARPU_USE_MPI_MASTER_SLAVE config->topology.nhwmpi = _starpu_mpi_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; int nhyperthreads = topology->nhwpus / topology->nhwcpus; unsigned bind_on_core = 0; int scale = 1; config->current_bindid = 0; if (starpu_getenv("STARPU_WORKERS_CPUID") && starpu_getenv("STARPU_WORKERS_COREID")) { _STARPU_DISP("Warning: STARPU_WORKERS_CPUID and STARPU_WORKERS_COREID cannot be set at the same time. STARPU_WORKERS_CPUID will be used.\n"); } /* 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 == NULL) { strval = starpu_getenv("STARPU_WORKERS_COREID"); if (strval) { bind_on_core = 1; scale = nhyperthreads; } } 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 * scale) % 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 = (bind_on_core ? topology->nhwcpus : topology->nhwpus) - 1; if (*strval) strval++; } for (val++; val <= endval && i < STARPU_NMAXWORKERS-1; val++) { i++; topology->workers_bindid[i] = (unsigned)((val * scale) % 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; 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)); memset(&config->currently_shared, 0, sizeof(config->currently_shared)); } static void _starpu_deinitialize_workers_bindid(struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED) { unsigned i; for (i = 0; i < STARPU_MAXCPUS;i++) { if (cpu_name[i]) { free(cpu_name[i]); cpu_name[i] = NULL; } } } /* 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 unsigned _starpu_get_next_bindid(struct _starpu_machine_config *config, unsigned flags, unsigned *preferred_binding, unsigned npreferred) { struct _starpu_machine_topology *topology = &config->topology; STARPU_ASSERT_MSG(topology_is_initialized, "The StarPU core is not initialized yet, have you called starpu_init?"); unsigned current_preferred; unsigned nhyperthreads = topology->nhwpus / topology->nhwcpus; unsigned ncores = topology->nhwpus / nhyperthreads; 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++) { /* can we bind the worker on the preferred core ? */ unsigned requested_core = preferred_binding[current_preferred]; unsigned requested_bindid = requested_core * nhyperthreads; /* Look at the remaining cores to be bound to */ for (i = 0; i < ncores; i++) { if (topology->workers_bindid[i] == requested_bindid && (!config->currently_bound[i] || (config->currently_shared[i] && !(flags & STARPU_THREAD_ACTIVE))) ) { /* the cpu is available, or shareable with us, we use it ! */ config->currently_bound[i] = 1; if (!(flags & STARPU_THREAD_ACTIVE)) config->currently_shared[i] = 1; return requested_bindid; } } } if (!(flags & STARPU_THREAD_ACTIVE)) { /* Try to find a shareable PU */ for (i = 0; i < ncores; i++) if (config->currently_shared[i]) return topology->workers_bindid[i]; } /* Try to find an available PU from last used PU */ for (i = config->current_bindid; i < ncores; i++) if (!config->currently_bound[i]) /* Found a cpu ready for use, use it! */ break; if (i == ncores) { /* 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; } STARPU_ASSERT(i < ncores); unsigned bindid = topology->workers_bindid[i]; config->currently_bound[i] = 1; if (!(flags & STARPU_THREAD_ACTIVE)) config->currently_shared[i] = 1; config->current_bindid = i; return bindid; } unsigned starpu_get_next_bindid(unsigned flags, unsigned *preferred, unsigned npreferred) { return _starpu_get_next_bindid(_starpu_get_machine_config(), flags, preferred, npreferred); } unsigned _starpu_topology_get_nhwcpu(struct _starpu_machine_config *config) { #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) if (config->conf.nopencl != 0) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (config->conf.ncuda != 0) _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) if (config->conf.nopencl != 0) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (config->conf.ncuda != 0) _starpu_init_cuda(); #endif _starpu_init_topology(config); return config->topology.nhwpus; } unsigned _starpu_topology_get_nnumanodes(struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED) { #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) if (config->conf.nopencl != 0) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (config->conf.ncuda != 0) _starpu_init_cuda(); #endif _starpu_init_topology(config); int res; #if defined(STARPU_HAVE_HWLOC) if (numa_enabled == -1) numa_enabled = starpu_get_env_number_default("STARPU_USE_NUMA", 0); if (numa_enabled) { struct _starpu_machine_topology *topology = &config->topology ; int nnumanodes = hwloc_get_nbobjs_by_type(topology->hwtopology, HWLOC_OBJ_NUMANODE) ; res = nnumanodes > 0 ? nnumanodes : 1 ; } else #endif { res = 1; } STARPU_ASSERT_MSG(res <= STARPU_MAXNUMANODES, "Number of NUMA nodes discovered %d is higher than maximum accepted %d ! Use configure option --enable-maxnumanodes=xxx to increase the maximum value of supported NUMA nodes.\n", res, STARPU_MAXNUMANODES); return res; } #ifdef STARPU_HAVE_HWLOC void _starpu_topology_filter(hwloc_topology_t topology) { #if HWLOC_API_VERSION >= 0x20000 hwloc_topology_set_io_types_filter(topology, HWLOC_TYPE_FILTER_KEEP_ALL); hwloc_topology_set_flags(topology, HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM); #else hwloc_topology_set_flags(topology, HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM | HWLOC_TOPOLOGY_FLAG_WHOLE_IO); #endif #ifdef HAVE_HWLOC_TOPOLOGY_SET_COMPONENTS # ifndef STARPU_USE_CUDA hwloc_topology_set_components(topology, HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST, "cuda"); hwloc_topology_set_components(topology, HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST, "nvml"); # endif # ifndef STARPU_USE_OPENCL hwloc_topology_set_components(topology, HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST, "opencl"); # endif #endif } #endif #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"); STARPU_ASSERT_MSG(nmiccores >= -1, "nmiccores can not be negative and different from -1 (is is %d)", nmiccores); 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); */ mic_worker_set[mic_idx].workers = &config->workers[topology->nworkers]; mic_worker_set[mic_idx].nworkers = topology->nmiccores[mic_idx]; 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].set = &mic_worker_set[mic_idx]; 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; } _starpu_mic_nodes[mic_idx]->baseworkerid = topology->nworkers; topology->nworkers += topology->nmiccores[mic_idx]; } static COIENGINE mic_handles[STARPU_MAXMICDEVS]; COIPROCESS _starpu_mic_process[STARPU_MAXMICDEVS]; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE static void _starpu_init_mpi_config(struct _starpu_machine_config *config, struct starpu_conf *user_conf, unsigned mpi_idx) { struct _starpu_machine_topology *topology = &config->topology; topology->nhwmpicores[mpi_idx] = 0; _starpu_init_mpi_topology(config, mpi_idx); int nmpicores; nmpicores = starpu_get_env_number("STARPU_NMPIMSTHREADS"); if (nmpicores == -1) { /* Nothing was specified, so let's use the number of * detected mpi cores. ! */ nmpicores = topology->nhwmpicores[mpi_idx]; } else { if ((unsigned) nmpicores > topology->nhwmpicores[mpi_idx]) { /* The user requires more MPI cores than there is available */ _STARPU_MSG("# Warning: %d MPI cores requested. Only %u available.\n", nmpicores, topology->nhwmpicores[mpi_idx]); nmpicores = topology->nhwmpicores[mpi_idx]; } } topology->nmpicores[mpi_idx] = nmpicores; STARPU_ASSERT_MSG(topology->nmpicores[mpi_idx] + topology->nworkers <= STARPU_NMAXWORKERS, "topology->nmpicores[mpi_idx(%u)] (%u) + topology->nworkers (%u) <= STARPU_NMAXWORKERS (%d)", mpi_idx, topology->nmpicores[mpi_idx], topology->nworkers, STARPU_NMAXWORKERS); mpi_worker_set[mpi_idx].workers = &config->workers[topology->nworkers]; mpi_worker_set[mpi_idx].nworkers = topology->nmpicores[mpi_idx]; unsigned mpicore_id; for (mpicore_id = 0; mpicore_id < topology->nmpicores[mpi_idx]; mpicore_id++) { int worker_idx = topology->nworkers + mpicore_id; config->workers[worker_idx].set = &mpi_worker_set[mpi_idx]; config->workers[worker_idx].arch = STARPU_MPI_MS_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_MPI_MS_WORKER; config->workers[worker_idx].perf_arch.devices[0].devid = mpi_idx; config->workers[worker_idx].perf_arch.devices[0].ncores = 1; config->workers[worker_idx].devid = mpi_idx; config->workers[worker_idx].subworkerid = mpicore_id; config->workers[worker_idx].worker_mask = STARPU_MPI_MS; config->worker_mask |= STARPU_MPI_MS; } _starpu_mpi_ms_nodes[mpi_idx]->baseworkerid = topology->nworkers; topology->nworkers += topology->nmpicores[mpi_idx]; } #endif #if defined(STARPU_USE_MIC) || defined(STARPU_USE_MPI_MASTER_SLAVE) static void _starpu_init_mp_config(struct _starpu_machine_config *config, struct starpu_conf *user_conf, int no_mp_config) { /* 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. */ #ifdef STARPU_USE_MIC if (!no_mp_config) { struct _starpu_machine_topology *topology = &config->topology; /* 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) /* Nothing was specified, so let's use the number of * detected mic devices. ! */ reqmicdevices = nhwmicdevices; STARPU_ASSERT_MSG(reqmicdevices >= -1, "nmic can not be negative and different from -1 (is is %d)", reqmicdevices); if (reqmicdevices != -1) { 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 #ifdef STARPU_USE_MPI_MASTER_SLAVE { struct _starpu_machine_topology *topology = &config->topology; /* Discover and initialize the number of MPI nodes through the mp * infrastructure. */ unsigned nhwmpidevices = _starpu_mpi_src_get_device_count(); int reqmpidevices = starpu_get_env_number("STARPU_NMPI_MS"); if (reqmpidevices == -1 && user_conf) reqmpidevices = user_conf->nmpi_ms; if (reqmpidevices == -1) /* Nothing was specified, so let's use the number of * detected mpi devices. ! */ reqmpidevices = nhwmpidevices; if (reqmpidevices != -1) { if ((unsigned) reqmpidevices > nhwmpidevices) { /* The user requires more MPI devices than there is available */ _STARPU_MSG("# Warning: %d MPI Master-Slave devices requested. Only %u available.\n", reqmpidevices, nhwmpidevices); reqmpidevices = nhwmpidevices; } } topology->nmpidevices = reqmpidevices; /* if user don't want to use MPI slaves, we close the slave processes */ if (no_mp_config && topology->nmpidevices == 0) { _starpu_mpi_common_mp_deinit(); exit(0); } if (!no_mp_config) { unsigned i; for (i = 0; i < topology->nmpidevices; i++) _starpu_mpi_ms_nodes[i] = _starpu_mp_common_node_create(STARPU_NODE_MPI_SOURCE, i); for (i = 0; i < topology->nmpidevices; i++) _starpu_init_mpi_config(config, user_conf, i); } } #endif } #endif #ifdef STARPU_USE_MIC static void _starpu_deinit_mic_node(unsigned mic_idx) { _starpu_mp_common_send_command(_starpu_mic_nodes[mic_idx], STARPU_MP_COMMAND_EXIT, NULL, 0); COIProcessDestroy(_starpu_mic_process[mic_idx], -1, 0, NULL, NULL); _starpu_mp_common_node_destroy(_starpu_mic_nodes[mic_idx]); } #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE static void _starpu_deinit_mpi_node(int devid) { _starpu_mp_common_send_command(_starpu_mpi_ms_nodes[devid], STARPU_MP_COMMAND_EXIT, NULL, 0); _starpu_mp_common_node_destroy(_starpu_mpi_ms_nodes[devid]); } #endif #if defined(STARPU_USE_MIC) || defined(STARPU_USE_MPI_MASTER_SLAVE) static void _starpu_deinit_mp_config(struct _starpu_machine_config *config) { struct _starpu_machine_topology *topology = &config->topology; unsigned i; #ifdef STARPU_USE_MIC for (i = 0; i < topology->nmicdevices; i++) _starpu_deinit_mic_node(i); _starpu_mic_clear_kernels(); #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE for (i = 0; i < topology->nmpidevices; i++) _starpu_deinit_mpi_node(i); #endif } #endif #ifdef STARPU_HAVE_HWLOC static unsigned _starpu_topology_count_ngpus(hwloc_obj_t obj) { struct _starpu_hwloc_userdata *data = obj->userdata; unsigned n = data->ngpus; unsigned i; for (i = 0; i < obj->arity; i++) n += _starpu_topology_count_ngpus(obj->children[i]); data->ngpus = n; //#ifdef STARPU_VERBOSE // { // char name[64]; // hwloc_obj_type_snprintf(name, sizeof(name), obj, 0); // _STARPU_DEBUG("hwloc obj %s has %u GPUs below\n", name, n); // } //#endif return n; } #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; config->workers[i].set = NULL; } 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) if (config->conf.nopencl != 0) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (config->conf.ncuda != 0) _starpu_init_cuda(); #endif _starpu_init_topology(config); _starpu_initialize_workers_bindid(config); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) for (i = 0; i < (int) (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 < (int) (sizeof(mic_worker_set)/sizeof(mic_worker_set[0])); i++) mic_worker_set[i].workers = NULL; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE for (i = 0; i < (int) (sizeof(mpi_worker_set)/sizeof(mpi_worker_set[0])); i++) mpi_worker_set[i].workers = NULL; #endif #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(); STARPU_ASSERT_MSG(ncuda >= -1, "ncuda can not be negative and different from -1 (is is %d)", ncuda); 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); /* allow having one worker per stream */ topology->cuda_th_per_stream = starpu_get_env_number_default("STARPU_CUDA_THREAD_PER_WORKER", -1); topology->cuda_th_per_dev = starpu_get_env_number_default("STARPU_CUDA_THREAD_PER_DEV", -1); STARPU_ASSERT_MSG(!(topology->cuda_th_per_stream == 1 && topology->cuda_th_per_dev != -1), "It does not make sense to set both STARPU_CUDA_THREAD_PER_WORKER to 1 and to set STARPU_CUDA_THREAD_PER_DEV, please choose either per worker or per device or none"); /* per device by default */ if (topology->cuda_th_per_dev == -1) { if (topology->cuda_th_per_stream == 1) topology->cuda_th_per_dev = 0; else topology->cuda_th_per_dev = 1; } /* Not per stream by default */ if (topology->cuda_th_per_stream == -1) { topology->cuda_th_per_stream = 0; } if (!topology->cuda_th_per_dev) { cuda_worker_set[0].workers = &config->workers[topology->nworkers]; cuda_worker_set[0].nworkers = topology->ncudagpus * nworker_per_cuda; } unsigned cudagpu; for (cudagpu = 0; cudagpu < topology->ncudagpus; cudagpu++) { int devid = _starpu_get_next_cuda_gpuid(config); int worker_idx0 = topology->nworkers + cudagpu * nworker_per_cuda; struct _starpu_worker_set *worker_set; if (topology->cuda_th_per_dev) { worker_set = &cuda_worker_set[devid]; worker_set->workers = &config->workers[worker_idx0]; worker_set->nworkers = nworker_per_cuda; } else { /* Same worker set for all devices */ worker_set = &cuda_worker_set[0]; } for (i = 0; i < nworker_per_cuda; i++) { int worker_idx = worker_idx0 + i; if(topology->cuda_th_per_stream) { /* Just one worker in the set */ _STARPU_CALLOC(config->workers[worker_idx].set, 1, sizeof(struct _starpu_worker_set)); config->workers[worker_idx].set->workers = &config->workers[worker_idx]; config->workers[worker_idx].set->nworkers = 1; } else config->workers[worker_idx].set = worker_set; 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); } } #ifndef STARPU_SIMGRID #if defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX { hwloc_obj_t obj = hwloc_cuda_get_device_osdev_by_index(topology->hwtopology, devid); if (obj) { struct _starpu_hwloc_userdata *data = obj->userdata; data->ngpus++; } else { _STARPU_DEBUG("Warning: could not find location of CUDA%u, do you have the hwloc CUDA plugin installed?\n", devid); } } #endif #endif } 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(); STARPU_ASSERT_MSG(nopencl >= -1, "nopencl can not be negative and different from -1 (is is %d)", nopencl); 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 #if defined(STARPU_USE_MIC) || defined(STARPU_USE_MPI_MASTER_SLAVE) _starpu_init_mp_config(config, &config->conf, no_mp_config); #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) { STARPU_ASSERT_MSG(ncpu >= -1, "ncpus can not be negative and different from -1 (is is %d)", ncpu); if (ncpu == -1) { unsigned mic_busy_cpus = 0; int j = 0; for (j = 0; j < STARPU_MAXMICDEVS; j++) mic_busy_cpus += (topology->nmiccores[j] ? 1 : 0); unsigned mpi_ms_busy_cpus = 0; #ifdef STARPU_USE_MPI_MASTER_SLAVE #ifdef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD for (j = 0; j < STARPU_MAXMPIDEVS; j++) mpi_ms_busy_cpus += (topology->nmpicores[j] ? 1 : 0); #else mpi_ms_busy_cpus = 1; /* we launch one thread to control all slaves */ #endif #endif /* STARPU_USE_MPI_MASTER_SLAVE */ unsigned cuda_busy_cpus = 0; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) cuda_busy_cpus = topology->cuda_th_per_dev == 0 && topology->cuda_th_per_stream == 0 ? (topology->ncudagpus ? 1 : 0) : topology->cuda_th_per_stream ? (nworker_per_cuda * topology->ncudagpus) : topology->ncudagpus; #endif unsigned already_busy_cpus = mpi_ms_busy_cpus + mic_busy_cpus + cuda_busy_cpus + topology->nopenclgpus; 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 = avail_cpus; } if (ncpu > STARPU_MAXCPUS) { _STARPU_DISP("Warning: %d CPU cores 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; } if (config->conf.reserve_ncpus > 0) { if (ncpu < config->conf.reserve_ncpus) { _STARPU_DISP("Warning: %d CPU cores were requested to be reserved, but only %d were available,\n", config->conf.reserve_ncpus, ncpu); ncpu = 0; } else { ncpu -= config->conf.reserve_ncpus; } } } 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=NULL, *tmp=NULL; 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 ret; if (cpuid < 0) return ret; #ifdef STARPU_HAVE_HWLOC const struct hwloc_topology_support *support; struct _starpu_machine_config *config = _starpu_get_machine_config(); #ifdef STARPU_USE_OPENCL if (config->conf.nopencl != 0) _starpu_opencl_init(); #endif #ifdef STARPU_USE_CUDA if (config->conf.ncuda != 0) _starpu_init_cuda(); #endif _starpu_init_topology(config); if (workerid != STARPU_NOWORKERID && cpuid < STARPU_MAXCPUS) { /* TODO: mutex... */ int previous = cpu_worker[cpuid]; /* We would like the PU to be available, or we are perhaps fine to share it */ if ( !( previous == STARPU_NOWORKERID || (previous == STARPU_NONACTIVETHREAD && workerid == STARPU_NONACTIVETHREAD) || (previous >= 0 && previous == workerid) || (name && cpu_name[cpuid] && !strcmp(name, cpu_name[cpuid])) ) ) { if (previous == STARPU_ACTIVETHREAD) _STARPU_DISP("Warning: active thread %s was already bound to PU %d\n", cpu_name[cpuid], cpuid); else if (previous == STARPU_NONACTIVETHREAD) _STARPU_DISP("Warning: non-active thread %s was already bound to PU %d\n", cpu_name[cpuid], cpuid); else _STARPU_DISP("Warning: worker %d was already bound to PU %d\n", previous, cpuid); if (workerid == STARPU_ACTIVETHREAD) _STARPU_DISP("and we were told to also bind active thread %s to it.\n", name); else if (previous == STARPU_NONACTIVETHREAD) _STARPU_DISP("and we were told to also bind non-active thread %s to it.\n", name); else _STARPU_DISP("and we were told to also bind worker %d to it.\n", workerid); _STARPU_DISP("This will strongly degrade performance.\n"); if (workerid >= 0) /* This shouldn't happen for workers */ _STARPU_DISP("Maybe check starpu_machine_display's output to determine what wrong binding happened. Hwloc reported %d cores and %d threads, perhaps there is misdetection between hwloc, the kernel and the BIOS, or an administrative allocation issue from e.g. the job scheduler?\n", config->topology.nhwcpus, config->topology.nhwpus); ret = -1; } else { cpu_worker[cpuid] = workerid; if (name) { if (cpu_name[cpuid]) free(cpu_name[cpuid]); cpu_name[cpuid] = strdup(name); } } } 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 res; hwloc_bitmap_singlify(set); res = hwloc_set_cpubind(config->topology.hwtopology, set, HWLOC_CPUBIND_THREAD); if (res) { perror("hwloc_set_cpubind"); STARPU_ABORT(); } } #elif defined(HAVE_PTHREAD_SETAFFINITY_NP) && defined(__linux__) int res; /* 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 = starpu_pthread_self(); res = pthread_setaffinity_np(self, sizeof(aff_mask), &aff_mask); if (res) { const char *msg = strerror(res); _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 return ret; } int starpu_bind_thread_on(int cpuid, unsigned flags, const char *name) { int workerid; STARPU_ASSERT_MSG(name, "starpu_bind_thread_on must be provided with a name"); starpu_pthread_setname(name); if (flags & STARPU_THREAD_ACTIVE) workerid = STARPU_ACTIVETHREAD; else workerid = STARPU_NONACTIVETHREAD; return _starpu_bind_thread_on_cpu(cpuid, workerid, name); } void _starpu_bind_thread_on_cpus(struct _starpu_combined_worker *combined_worker STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID return; #endif #ifdef STARPU_HAVE_HWLOC const struct hwloc_topology_support *support; struct _starpu_machine_config *config = _starpu_get_machine_config(); #ifdef STARPU_USE_OPENC if (config->conf.nopencl != 0) _starpu_opencl_init(); #endif #ifdef STARPU_USE_CUDA if (config->conf.ncuda != 0) _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_binding_cpu(struct _starpu_machine_config *config) { unsigned worker; for (worker = 0; worker < config->topology.nworkers; worker++) { struct _starpu_worker *workerarg = &config->workers[worker]; switch (workerarg->arch) { case STARPU_CPU_WORKER: { /* Dedicate a cpu core to that worker */ workerarg->bindid = _starpu_get_next_bindid(config, STARPU_THREAD_ACTIVE, NULL, 0); break; } default: /* Do nothing */ break; } } } static size_t _starpu_cpu_get_global_mem_size(int nodeid, struct _starpu_machine_config *config) { size_t global_mem; starpu_ssize_t limit = -1; #if defined(STARPU_HAVE_HWLOC) struct _starpu_machine_topology *topology = &config->topology; STARPU_ASSERT(numa_enabled != -1); if (numa_enabled) { int depth_node = hwloc_get_type_depth(topology->hwtopology, HWLOC_OBJ_NUMANODE); if (depth_node == HWLOC_TYPE_DEPTH_UNKNOWN) { #if HWLOC_API_VERSION >= 0x00020000 global_mem = hwloc_get_root_obj(topology->hwtopology)->total_memory; #else global_mem = hwloc_get_root_obj(topology->hwtopology)->memory.total_memory; #endif } else { char name[32]; hwloc_obj_t obj = hwloc_get_obj_by_depth(topology->hwtopology, depth_node, nodeid); #if HWLOC_API_VERSION >= 0x00020000 global_mem = obj->attr->numanode.local_memory; #else global_mem = obj->memory.local_memory; #endif snprintf(name, sizeof(name), "STARPU_LIMIT_CPU_NUMA_%d_MEM", obj->os_index); limit = starpu_get_env_number(name); } } else { /* Do not limit ourself to a single NUMA node */ #if HWLOC_API_VERSION >= 0x00020000 global_mem = hwloc_get_root_obj(topology->hwtopology)->total_memory; #else global_mem = hwloc_get_root_obj(topology->hwtopology)->memory.total_memory; #endif } #else /* STARPU_HAVE_HWLOC */ #ifdef STARPU_DEVEL # warning TODO: use sysinfo when available to get global size #endif global_mem = 0; #endif if (limit == -1) limit = starpu_get_env_number("STARPU_LIMIT_CPU_NUMA_MEM"); if (limit == -1) { limit = starpu_get_env_number("STARPU_LIMIT_CPU_MEM"); if (limit != -1 && numa_enabled) { _STARPU_DISP("NUMA is enabled and STARPU_LIMIT_CPU_MEM is set to %luMB. Assuming that it should be distributed over the %d NUMA node(s). You probably want to use STARPU_LIMIT_CPU_NUMA_MEM instead.\n", (long) limit, _starpu_topology_get_nnumanodes(config)); limit /= _starpu_topology_get_nnumanodes(config); } } 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) { if (numa_enabled) _STARPU_DISP("The requested limit %ldMB for NUMA node %d is higher that available memory %luMB, using the latter\n", (unsigned long) limit, nodeid, (unsigned long) global_mem / (1024*1024)); else _STARPU_DISP("The requested limit %ldMB is higher that available memory %luMB, using the latter\n", (long) limit, (unsigned long) global_mem / (1024*1024)); return global_mem; } else // We limit the memory return limit*1024*1024; } //TODO : Check SIMGRID static void _starpu_init_numa_node(struct _starpu_machine_config *config) { nb_numa_nodes = 0; unsigned i; for (i = 0; i < STARPU_MAXNUMANODES; i++) { numa_memory_nodes_to_hwloclogid[i] = STARPU_NUMA_UNINITIALIZED; numa_memory_nodes_to_physicalid[i] = STARPU_NUMA_UNINITIALIZED; } #ifdef STARPU_SIMGRID char name[16]; starpu_sg_host_t host; #endif numa_enabled = starpu_get_env_number_default("STARPU_USE_NUMA", 0); /* NUMA mode activated */ if (numa_enabled) { /* Take all NUMA nodes used by CPU workers */ unsigned worker; for (worker = 0; worker < config->topology.nworkers; worker++) { struct _starpu_worker *workerarg = &config->workers[worker]; if (workerarg->arch == STARPU_CPU_WORKER) { int numa_logical_id = _starpu_get_logical_numa_node_worker(worker); /* Convert logical id to StarPU id to check if this NUMA node is already saved or not */ int numa_starpu_id = starpu_memory_nodes_numa_hwloclogid_to_id(numa_logical_id); /* This shouldn't happen */ if (numa_starpu_id == -1 && nb_numa_nodes == STARPU_MAXNUMANODES) { _STARPU_MSG("Warning: %u NUMA nodes available. Only %u enabled. Use configure option --enable-maxnumanodes=xxx to update the maximum value of supported NUMA nodes.\n", _starpu_topology_get_nnumanodes(config), STARPU_MAXNUMANODES); STARPU_ABORT(); } if (numa_starpu_id == -1) { int devid = numa_logical_id == STARPU_NUMA_MAIN_RAM ? 0 : numa_logical_id; int memnode = _starpu_memory_node_register(STARPU_CPU_RAM, devid, &_starpu_driver_cpu_node_ops); _starpu_memory_manager_set_global_memory_size(memnode, _starpu_cpu_get_global_mem_size(devid, config)); STARPU_ASSERT_MSG(memnode < STARPU_MAXNUMANODES, "Wrong Memory Node : %d (only %d available)", memnode, STARPU_MAXNUMANODES); numa_memory_nodes_to_hwloclogid[memnode] = numa_logical_id; int numa_physical_id = _starpu_get_physical_numa_node_worker(worker); numa_memory_nodes_to_physicalid[memnode] = numa_physical_id; nb_numa_nodes++; #ifdef STARPU_SIMGRID snprintf(name, sizeof(name), "RAM%d", memnode); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memnode, host); #endif } } } /* If we found NUMA nodes from CPU workers, it's good */ if (nb_numa_nodes != 0) return; _STARPU_DISP("No NUMA nodes found when checking CPU workers...\n"); #if (defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)) && defined(STARPU_HAVE_HWLOC) _STARPU_DISP("Take NUMA nodes attached to CUDA and OpenCL devices...\n"); #endif #if defined(STARPU_USE_CUDA) && defined(STARPU_HAVE_HWLOC) for (i = 0; i < config->topology.ncudagpus; i++) { hwloc_obj_t obj = hwloc_cuda_get_device_osdev_by_index(config->topology.hwtopology, i); if (obj) obj = numa_get_obj(obj); /* Hwloc cannot recognize some devices */ if (!obj) continue; int numa_starpu_id = starpu_memory_nodes_numa_hwloclogid_to_id(obj->logical_index); /* This shouldn't happen */ if (numa_starpu_id == -1 && nb_numa_nodes == STARPU_MAXNUMANODES) { _STARPU_MSG("Warning: %u NUMA nodes available. Only %u enabled. Use configure option --enable-maxnumanodes=xxx to update the maximum value of supported NUMA nodes.\n", _starpu_topology_get_nnumanodes(config), STARPU_MAXNUMANODES); STARPU_ABORT(); } if (numa_starpu_id == -1) { int memnode = _starpu_memory_node_register(STARPU_CPU_RAM, obj->logical_index, &_starpu_driver_cpu_node_ops); _starpu_memory_manager_set_global_memory_size(memnode, _starpu_cpu_get_global_mem_size(obj->logical_index, config)); STARPU_ASSERT_MSG(memnode < STARPU_MAXNUMANODES, "Wrong Memory Node : %d (only %d available)", memnode, STARPU_MAXNUMANODES); numa_memory_nodes_to_hwloclogid[memnode] = obj->logical_index; numa_memory_nodes_to_physicalid[memnode] = obj->os_index; nb_numa_nodes++; #ifdef STARPU_SIMGRID snprintf(name, sizeof(name), "RAM%d", memnode); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memnode, host); #endif } } #endif #if defined(STARPU_USE_OPENCL) && defined(STARPU_HAVE_HWLOC) if (config->topology.nopenclgpus > 0) { cl_int err; cl_platform_id platform_id[_STARPU_OPENCL_PLATFORM_MAX]; cl_uint nb_platforms; unsigned platform; unsigned nb_opencl_devices = 0, num = 0; err = clGetPlatformIDs(_STARPU_OPENCL_PLATFORM_MAX, platform_id, &nb_platforms); if (STARPU_UNLIKELY(err != CL_SUCCESS)) nb_platforms=0; 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; for (platform = 0; platform < nb_platforms ; platform++) { err = clGetDeviceIDs(platform_id[platform], device_type, 0, NULL, &num); if (err != CL_SUCCESS) num = 0; nb_opencl_devices += num; for (i = 0; i < num; i++) { hwloc_obj_t obj = hwloc_opencl_get_device_osdev_by_index(config->topology.hwtopology, platform, i); if (obj) obj = numa_get_obj(obj); /* Hwloc cannot recognize some devices */ if (!obj) continue; int numa_starpu_id = starpu_memory_nodes_numa_hwloclogid_to_id(obj->logical_index); /* This shouldn't happen */ if (numa_starpu_id == -1 && nb_numa_nodes == STARPU_MAXNUMANODES) { _STARPU_MSG("Warning: %u NUMA nodes available. Only %u enabled. Use configure option --enable-maxnumanodes=xxx to update the maximum value of supported NUMA nodes.\n", _starpu_topology_get_nnumanodes(config), STARPU_MAXNUMANODES); STARPU_ABORT(); } if (numa_starpu_id == -1) { int memnode = _starpu_memory_node_register(STARPU_CPU_RAM, obj->logical_index, &_starpu_driver_cpu_node_ops); _starpu_memory_manager_set_global_memory_size(memnode, _starpu_cpu_get_global_mem_size(obj->logical_index, config)); STARPU_ASSERT_MSG(memnode < STARPU_MAXNUMANODES, "Wrong Memory Node : %d (only %d available)", memnode, STARPU_MAXNUMANODES); numa_memory_nodes_to_hwloclogid[memnode] = obj->logical_index; numa_memory_nodes_to_physicalid[memnode] = obj->os_index; nb_numa_nodes++; #ifdef STARPU_SIMGRID snprintf(name, sizeof(name), "RAM%d", memnode); host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memnode, host); #endif } } } } #endif } #if (defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)) && defined(STARPU_HAVE_HWLOC) //Found NUMA nodes from CUDA nodes if (nb_numa_nodes != 0) return; /* In case, we do not find any NUMA nodes when checking NUMA nodes attached to GPUs, we take all of them */ if (numa_enabled) _STARPU_DISP("No NUMA nodes found when checking GPUs devices...\n"); #endif if (numa_enabled) _STARPU_DISP("Finally, take all NUMA nodes available... \n"); unsigned nnuma = _starpu_topology_get_nnumanodes(config); if (nnuma > STARPU_MAXNUMANODES) { _STARPU_MSG("Warning: %u NUMA nodes available. Only %u enabled. Use configure option --enable-maxnumanodes=xxx to update the maximum value of supported NUMA nodes.\n", _starpu_topology_get_nnumanodes(config), STARPU_MAXNUMANODES); nnuma = STARPU_MAXNUMANODES; } unsigned numa; for (numa = 0; numa < nnuma; numa++) { unsigned numa_logical_id; unsigned numa_physical_id; #if defined(STARPU_HAVE_HWLOC) hwloc_obj_t obj = hwloc_get_obj_by_type(config->topology.hwtopology, HWLOC_OBJ_NUMANODE, numa); if (obj) { numa_logical_id = obj->logical_index; numa_physical_id = obj->os_index; } else #endif { numa_logical_id = 0; numa_physical_id = 0; } int memnode = _starpu_memory_node_register(STARPU_CPU_RAM, numa_logical_id, &_starpu_driver_cpu_node_ops); _starpu_memory_manager_set_global_memory_size(memnode, _starpu_cpu_get_global_mem_size(numa_logical_id, config)); numa_memory_nodes_to_hwloclogid[memnode] = numa_logical_id; numa_memory_nodes_to_physicalid[memnode] = numa_physical_id; nb_numa_nodes++; if (numa == 0) STARPU_ASSERT_MSG(memnode == STARPU_MAIN_RAM, "Wrong Memory Node : %d (expected %d) \n", memnode, STARPU_MAIN_RAM); STARPU_ASSERT_MSG(memnode < STARPU_MAXNUMANODES, "Wrong Memory Node : %d (only %d available) \n", memnode, STARPU_MAXNUMANODES); #ifdef STARPU_SIMGRID if (nnuma > 1) { snprintf(name, sizeof(name), "RAM%d", memnode); host = _starpu_simgrid_get_host_by_name(name); } else { /* In this case, nnuma has only one node */ host = _starpu_simgrid_get_host_by_name("RAM"); } STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memnode, host); #endif } STARPU_ASSERT_MSG(nb_numa_nodes > 0, "No NUMA node found... We need at least one memory node !\n"); } static void _starpu_init_numa_bus() { unsigned i, j; for (i = 0; i < nb_numa_nodes; i++) for (j = 0; j < nb_numa_nodes; j++) if (i != j) numa_bus_id[i*nb_numa_nodes+j] = _starpu_register_bus(i, j); } #if defined(STARPU_HAVE_HWLOC) && !defined(STARPU_SIMGRID) static int _starpu_find_pu_driving_numa_from(hwloc_obj_t root, unsigned node) { unsigned i; int found = 0; if (!root->arity) { if (root->type == HWLOC_OBJ_PU) { struct _starpu_hwloc_userdata *userdata = root->userdata; if (userdata->pu_worker) { /* Cool, found a worker! */ _STARPU_DEBUG("found PU %d to drive memory node %d\n", userdata->pu_worker->bindid, node); _starpu_worker_drives_memory_node(userdata->pu_worker, node); found = 1; } } } for (i = 0; i < root->arity; i++) { if (_starpu_find_pu_driving_numa_from(root->children[i], node)) found = 1; } return found; } /* Look upward to find a level containing the given NUMA node and workers to drive it */ static int _starpu_find_pu_driving_numa_up(hwloc_obj_t root, unsigned node) { if (_starpu_find_pu_driving_numa_from(root, node)) /* Ok, we already managed to find drivers */ return 1; if (!root->parent) /* And no parent!? nobody can drive this... */ return 0; /* Try from parent */ return _starpu_find_pu_driving_numa_up(root->parent, node); } #endif static void _starpu_init_workers_binding_and_memory(struct _starpu_machine_config *config, int no_mp_config STARPU_ATTRIBUTE_UNUSED) { /* We will store all the busid of the different (src, dst) * combinations in a matrix which we initialize here. */ _starpu_initialize_busid_matrix(); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) unsigned cuda_init[STARPU_MAXCUDADEVS] = { }; unsigned cuda_memory_nodes[STARPU_MAXCUDADEVS]; unsigned cuda_bindid[STARPU_MAXCUDADEVS]; int cuda_globalbindid = -1; #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 #ifdef STARPU_USE_MPI_MASTER_SLAVE unsigned mpi_init[STARPU_MAXMPIDEVS] = { }; unsigned mpi_memory_nodes[STARPU_MAXMPIDEVS]; unsigned mpi_bindid[STARPU_MAXMPIDEVS]; #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; } /* Init CPU binding before NUMA nodes, because we use it to discover NUMA nodes */ _starpu_init_binding_cpu(config); /* Initialize NUMA nodes */ _starpu_init_numa_node(config); _starpu_init_numa_bus(); unsigned worker; for (worker = 0; worker < config->topology.nworkers; worker++) { unsigned memory_node = -1; struct _starpu_worker *workerarg = &config->workers[worker]; unsigned devid STARPU_ATTRIBUTE_UNUSED = workerarg->devid; #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_USE_MIC) || defined(STARPU_SIMGRID) || defined(STARPU_USE_MPI_MASTER_SLAVE) /* Perhaps the worker has some "favourite" bindings */ unsigned *preferred_binding = NULL; unsigned npreferred = 0; #endif /* select the memory node that contains worker's memory */ switch (workerarg->arch) { case STARPU_CPU_WORKER: { int numa_logical_id = _starpu_get_logical_numa_node_worker(worker); int numa_starpu_id = starpu_memory_nodes_numa_hwloclogid_to_id(numa_logical_id); if (numa_starpu_id < 0 || numa_starpu_id >= STARPU_MAXNUMANODES) numa_starpu_id = STARPU_MAIN_RAM; #if defined(STARPU_HAVE_HWLOC) && !defined(STARPU_SIMGRID) hwloc_obj_t pu_obj = hwloc_get_obj_by_type(config->topology.hwtopology, HWLOC_OBJ_PU, workerarg->bindid); struct _starpu_hwloc_userdata *userdata = pu_obj->userdata; userdata->pu_worker = workerarg; #endif workerarg->numa_memory_node = memory_node = numa_starpu_id; _starpu_memory_node_add_nworkers(memory_node); _starpu_worker_drives_memory_node(workerarg, numa_starpu_id); break; } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_WORKER: { unsigned numa; #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]; if (config->topology.cuda_th_per_stream == 0) workerarg->bindid = cuda_bindid[devid]; else workerarg->bindid = _starpu_get_next_bindid(config, STARPU_THREAD_ACTIVE, preferred_binding, npreferred); } else { cuda_init[devid] = 1; if (config->topology.cuda_th_per_dev == 0 && config->topology.cuda_th_per_stream == 0) { if (cuda_globalbindid == -1) cuda_globalbindid = _starpu_get_next_bindid(config, STARPU_THREAD_ACTIVE, preferred_binding, npreferred); workerarg->bindid = cuda_bindid[devid] = cuda_globalbindid; } else workerarg->bindid = cuda_bindid[devid] = _starpu_get_next_bindid(config, STARPU_THREAD_ACTIVE, preferred_binding, npreferred); memory_node = cuda_memory_nodes[devid] = _starpu_memory_node_register(STARPU_CUDA_RAM, devid, &_starpu_driver_cuda_node_ops); for (numa = 0; numa < nb_numa_nodes; numa++) { _starpu_cuda_bus_ids[numa][devid+STARPU_MAXNUMANODES] = _starpu_register_bus(numa, memory_node); _starpu_cuda_bus_ids[devid+STARPU_MAXNUMANODES][numa] = _starpu_register_bus(memory_node, numa); } #ifdef STARPU_SIMGRID const char* cuda_memcpy_peer; char name[16]; snprintf(name, sizeof(name), "CUDA%u", devid); starpu_sg_host_t host = _starpu_simgrid_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memory_node, host); # ifdef STARPU_HAVE_SIMGRID_ACTOR_H cuda_memcpy_peer = sg_host_get_property_value(host, "memcpy_peer"); # else cuda_memcpy_peer = MSG_host_get_property_value(host, "memcpy_peer"); # endif #endif /* SIMGRID */ if ( #ifdef STARPU_SIMGRID cuda_memcpy_peer && atoll(cuda_memcpy_peer) #elif defined(STARPU_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]; int devid2 = workerarg2->devid; if (workerarg2->arch == STARPU_CUDA_WORKER) { unsigned memory_node2 = starpu_worker_get_memory_node(worker2); _starpu_cuda_bus_ids[devid2+STARPU_MAXNUMANODES][devid+STARPU_MAXNUMANODES] = _starpu_register_bus(memory_node2, memory_node); _starpu_cuda_bus_ids[devid+STARPU_MAXNUMANODES][devid2+STARPU_MAXNUMANODES] = _starpu_register_bus(memory_node, memory_node2); #ifndef STARPU_SIMGRID #if defined(HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX) && HAVE_DECL_HWLOC_CUDA_GET_DEVICE_OSDEV_BY_INDEX { hwloc_obj_t obj, obj2, ancestor; obj = hwloc_cuda_get_device_osdev_by_index(config->topology.hwtopology, devid); obj2 = hwloc_cuda_get_device_osdev_by_index(config->topology.hwtopology, devid2); ancestor = hwloc_get_common_ancestor_obj(config->topology.hwtopology, obj, obj2); if (ancestor) { struct _starpu_hwloc_userdata *data = ancestor->userdata; #ifdef STARPU_VERBOSE { char name[64]; hwloc_obj_type_snprintf(name, sizeof(name), ancestor, 0); _STARPU_DEBUG("CUDA%u and CUDA%u are linked through %s, along %u GPUs\n", devid, devid2, name, data->ngpus); } #endif starpu_bus_set_ngpus(_starpu_cuda_bus_ids[devid2+STARPU_MAXNUMANODES][devid+STARPU_MAXNUMANODES], data->ngpus); starpu_bus_set_ngpus(_starpu_cuda_bus_ids[devid+STARPU_MAXNUMANODES][devid2+STARPU_MAXNUMANODES], data->ngpus); } } #endif #endif } } } } _starpu_memory_node_add_nworkers(memory_node); //This worker can manage transfers on NUMA nodes for (numa = 0; numa < nb_numa_nodes; numa++) _starpu_worker_drives_memory_node(&workerarg->set->workers[0], numa); _starpu_worker_drives_memory_node(&workerarg->set->workers[0], memory_node); break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: { unsigned numa; #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, STARPU_THREAD_ACTIVE, preferred_binding, npreferred); memory_node = opencl_memory_nodes[devid] = _starpu_memory_node_register(STARPU_OPENCL_RAM, devid, &_starpu_driver_opencl_node_ops); for (numa = 0; numa < nb_numa_nodes; numa++) { _starpu_register_bus(numa, memory_node); _starpu_register_bus(memory_node, numa); } #ifdef STARPU_SIMGRID char name[16]; snprintf(name, sizeof(name), "OpenCL%u", devid); starpu_sg_host_t 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); //This worker can manage transfers on NUMA nodes for (numa = 0; numa < nb_numa_nodes; numa++) _starpu_worker_drives_memory_node(workerarg, numa); _starpu_worker_drives_memory_node(workerarg, memory_node); break; } #endif #ifdef STARPU_USE_MIC case STARPU_MIC_WORKER: { unsigned numa; 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, STARPU_THREAD_ACTIVE, preferred_binding, npreferred); memory_node = mic_memory_nodes[devid] = _starpu_memory_node_register(STARPU_MIC_RAM, devid, &_starpu_driver_mic_node_ops); for (numa = 0; numa < nb_numa_nodes; numa++) { _starpu_register_bus(numa, memory_node); _starpu_register_bus(memory_node, numa); } } workerarg->bindid = mic_bindid[devid]; _starpu_memory_node_add_nworkers(memory_node); //This worker can manage transfers on NUMA nodes for (numa = 0; numa < nb_numa_nodes; numa++) _starpu_worker_drives_memory_node(&workerarg->set->workers[0], numa); _starpu_worker_drives_memory_node(&workerarg->set->workers[0], memory_node); break; } #endif /* STARPU_USE_MIC */ #ifdef STARPU_USE_MPI_MASTER_SLAVE case STARPU_MPI_MS_WORKER: { unsigned numa; if (mpi_init[devid]) { memory_node = mpi_memory_nodes[devid]; } else { mpi_init[devid] = 1; mpi_bindid[devid] = _starpu_get_next_bindid(config, STARPU_THREAD_ACTIVE, preferred_binding, npreferred); memory_node = mpi_memory_nodes[devid] = _starpu_memory_node_register(STARPU_MPI_MS_RAM, devid, &_starpu_driver_mpi_node_ops); for (numa = 0; numa < nb_numa_nodes; numa++) { _starpu_register_bus(numa, memory_node); _starpu_register_bus(memory_node, numa); } } //This worker can manage transfers on NUMA nodes for (numa = 0; numa < nb_numa_nodes; numa++) _starpu_worker_drives_memory_node(&workerarg->set->workers[0], numa); _starpu_worker_drives_memory_node(&workerarg->set->workers[0], memory_node); #ifndef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD /* MPI driver thread can manage all slave memories if we disable the MPI multiple thread */ unsigned findworker; for (findworker = 0; findworker < worker; findworker++) { struct _starpu_worker *findworkerarg = &config->workers[findworker]; if (findworkerarg->arch == STARPU_MPI_MS_WORKER) { _starpu_worker_drives_memory_node(workerarg, findworkerarg->memory_node); _starpu_worker_drives_memory_node(findworkerarg, memory_node); } } #endif workerarg->bindid = mpi_bindid[devid]; _starpu_memory_node_add_nworkers(memory_node); break; } #endif /* STARPU_USE_MPI_MASTER_SLAVE */ 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(); workerarg->hwloc_obj = NULL; } 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); workerarg->hwloc_obj = worker_obj; } #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; if (bindid >= config->nbindid) { config->nbindid = bindid+1; } _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; } } #if defined(STARPU_HAVE_HWLOC) && !defined(STARPU_SIMGRID) /* If some NUMA nodes don't have drivers, attribute some */ unsigned node, nnodes = starpu_memory_nodes_get_count();; for (node = 0; node < nnodes; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) /* Only RAM nodes can be processed by any CPU */ continue; for (worker = 0; worker < config->topology.nworkers; worker++) { if (_starpu_worker_drives_memory[worker][node]) break; } if (worker < config->topology.nworkers) /* Already somebody driving it */ continue; /* Nobody driving this node! Attribute some */ _STARPU_DEBUG("nobody drives memory node %d\n", node); hwloc_obj_t numa_node_obj = hwloc_get_obj_by_type(config->topology.hwtopology, HWLOC_OBJ_NUMANODE, starpu_memory_nodes_numa_id_to_hwloclogid(node)); int ret = _starpu_find_pu_driving_numa_up(numa_node_obj, node); STARPU_ASSERT_MSG(ret, "oops, didn't find any worker to drive memory node %d!?", node); } #endif #ifdef STARPU_SIMGRID _starpu_simgrid_count_ngpus(); #else #ifdef STARPU_HAVE_HWLOC _starpu_topology_count_ngpus(hwloc_get_root_obj(config->topology.hwtopology)); #endif #endif } 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_datastats_init(); _starpu_init_workers_binding_and_memory(config, no_mp_config); _starpu_mem_chunk_init_last(); config->cpus_nodeid = -1; config->cuda_nodeid = -1; config->opencl_nodeid = -1; config->mic_nodeid = -1; config->mpi_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_MPI_MS_WORKER: if (config->mpi_nodeid == -1) config->mpi_nodeid = starpu_worker_get_memory_node(i); else if (config->mpi_nodeid != (int) starpu_worker_get_memory_node(i)) config->mpi_nodeid = -2; break; case STARPU_ANY_WORKER: STARPU_ASSERT(0); } } return 0; } void _starpu_destroy_topology(struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED) { #if defined(STARPU_USE_MIC) || defined(STARPU_USE_MPI_MASTER_SLAVE) _starpu_deinit_mp_config(config); #endif /* cleanup StarPU internal data structures */ _starpu_memory_nodes_deinit(); _starpu_destroy_machine_config(config); _starpu_deinitialize_workers_bindid(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 = numa_get_obj(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"); } } int starpu_get_pu_os_index(unsigned logical_index) { #ifdef STARPU_HAVE_HWLOC struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; hwloc_topology_t topo = topology->hwtopology; return hwloc_get_obj_by_type(topo, HWLOC_OBJ_PU, logical_index)->os_index; #else return logical_index; #endif } #ifdef STARPU_HAVE_HWLOC hwloc_topology_t starpu_get_hwloc_topology(void) { struct _starpu_machine_config *config = _starpu_get_machine_config(); return config->topology.hwtopology; } #endif unsigned _starpu_get_nhyperthreads() { struct _starpu_machine_config *config = _starpu_get_machine_config(); return config->topology.nhwpus / config->topology.nhwcpus; } starpu-1.3.9+dfsg/src/core/topology.h000066400000000000000000000065751413463044200175430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #include #include struct _starpu_machine_config; #ifndef STARPU_SIMGRID #ifdef STARPU_HAVE_HWLOC /** This is allocated for each hwloc object */ struct _starpu_hwloc_userdata { /** List of workers running on this obj */ struct _starpu_worker_list *worker_list; /** Number of GPUs sharing this PCI link */ unsigned ngpus; /** Worker running this PU */ struct _starpu_worker *pu_worker; }; #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); /** returns the number of NUMA nodes */ unsigned _starpu_topology_get_nnumanodes(struct _starpu_machine_config *config); /** returns the number of hyperthreads per core */ unsigned _starpu_get_nhyperthreads(); #ifdef STARPU_HAVE_HWLOC /** Small convenient function to filter hwloc topology depending on HWLOC API version */ void _starpu_topology_filter(hwloc_topology_t topology); #endif #define STARPU_NOWORKERID -1 #define STARPU_ACTIVETHREAD -2 #define STARPU_NONACTIVETHREAD -2 /** 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. */ int _starpu_bind_thread_on_cpu(int cpuid, int workerid, const char *name); 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_combined_worker *combined_worker); struct _starpu_worker *_starpu_get_worker_from_driver(struct starpu_driver *d); int starpu_memory_nodes_get_numa_count(void); int starpu_memory_nodes_numa_id_to_hwloclogid(unsigned id); /** Get the memory node for data number i when task is to be executed on memory node target_node */ int _starpu_task_data_get_node_on_node(struct starpu_task *task, unsigned index, unsigned target_node); int _starpu_task_data_get_node_on_worker(struct starpu_task *task, unsigned index, unsigned worker); #endif // __TOPOLOGY_H__ starpu-1.3.9+dfsg/src/core/tree.c000066400000000000000000000074231413463044200166120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; if (father == NULL) return NULL; if (father == tree && father->arity == 0) return tree; 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.3.9+dfsg/src/core/workers.c000066400000000000000000002326241413463044200173520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 #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 initialization 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; int _starpu_worker_parallel_blocks; /* 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 != UNINITIALIZED; } void starpu_wait_initialized(void) { STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); while (initialized != INITIALIZED) STARPU_PTHREAD_COND_WAIT(&init_cond, &init_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); } /* 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 */ if (check_entire_platform && !task->cl->can_execute) { struct _starpu_machine_topology *topo = &_starpu_get_machine_config()->topology; switch (arch) { case STARPU_CPU_WORKER: if (!topo->ncpus) return 0; break; case STARPU_CUDA_WORKER: if (!topo->ncudagpus) return 0; break; case STARPU_OPENCL_WORKER: if (!topo->nopenclgpus) return 0; break; case STARPU_MIC_WORKER: if (!topo->nmicdevices) return 0; break; case STARPU_MPI_MS_WORKER: if (!topo->nmpidevices) return 0; break; default: STARPU_ABORT(); } unsigned impl; for (impl = 0; impl < STARPU_MAXIMPLEMENTATIONS; impl++) { switch (arch) { case STARPU_CPU_WORKER: if (task->cl->cpu_funcs[impl] != NULL) return 1; break; case STARPU_CUDA_WORKER: if (task->cl->cuda_funcs[impl] != NULL) return 1; break; case STARPU_OPENCL_WORKER: if (task->cl->opencl_funcs[impl] != NULL) return 1; break; case STARPU_MIC_WORKER: if (task->cl->cpu_funcs_name[impl] != NULL || task->cl->mic_funcs[impl] != NULL) return 1; break; case STARPU_MPI_MS_WORKER: if (task->cl->cpu_funcs_name[impl] != NULL || task->cl->mpi_ms_funcs[impl] != NULL) return 1; break; default: STARPU_ABORT(); } } return 0; } struct _starpu_sched_ctx *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_MPI_MS_WORKER: if (task->cl->cpu_funcs_name[impl] != NULL || task->cl->mpi_ms_funcs[impl] != NULL) test_implementation = 1; break; default: STARPU_ABORT(); } if (!test_implementation) /* No implementation here, cannot execute */ continue; if (task->cl->can_execute && !task->cl->can_execute(i, task, impl)) /* The implementation cannot be executed here */ continue; 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->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->where & _starpu_config.worker_mask)) return 0; if (!task->cl->can_execute) return 1; } #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) if ((task->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->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->where & STARPU_OPENCL) && _starpu_worker_exists_and_can_execute(task, STARPU_OPENCL_WORKER)) return 1; #endif #ifdef STARPU_USE_MIC if ((task->where & STARPU_MIC) && _starpu_worker_exists_and_can_execute(task, STARPU_MIC_WORKER)) return 1; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE if ((task->where & STARPU_MPI_MS) && _starpu_worker_exists_and_can_execute(task, STARPU_MPI_MS_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; } 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 */ #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_MPI_MS_WORKER: { starpu_mpi_ms_func_t func = _starpu_task_get_mpi_ms_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; } /* must be called with sched_mutex locked to protect state_blocked_in_parallel */ int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl) { /* if the worker is blocked in a parallel ctx don't submit tasks on it */ #ifdef STARPU_DEVEL #warning FIXME: this is very expensive, while can_execute is supposed to be not very costly so schedulers can call it a lot #endif if(starpu_worker_is_blocked_in_parallel(workerid)) return 0; /* TODO: check that the task operand sizes will fit on that device */ return (task->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)); } /* must be called with sched_mutex locked to protect state_blocked_in_parallel */ int starpu_worker_can_execute_task_impl(unsigned workerid, struct starpu_task *task, unsigned *impl_mask) { /* if the worker is blocked in a parallel ctx don't submit tasks on it */ if(starpu_worker_is_blocked_in_parallel(workerid)) return 0; unsigned mask; int i; enum starpu_worker_archtype arch; struct starpu_codelet *cl; /* TODO: check that the task operand sizes will fit on that device */ cl = task->cl; if (!(task->where & _starpu_config.workers[workerid].worker_mask)) return 0; if (task->workerids_len) { size_t div = sizeof(*task->workerids) * 8; if (workerid / div >= task->workerids_len || ! (task->workerids[workerid / div] & (1UL << workerid % div))) 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; } /* must be called with sched_mutex locked to protect state_blocked */ int starpu_worker_can_execute_task_first_impl(unsigned workerid, struct starpu_task *task, unsigned *nimpl) { /* if the worker is blocked in a parallel ctx don't submit tasks on it */ if(starpu_worker_is_blocked_in_parallel(workerid)) return 0; int i; enum starpu_worker_archtype arch; struct starpu_codelet *cl; /* TODO: check that the task operand sizes will fit on that device */ cl = task->cl; if (!(task->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->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 */ static void _starpu_init_worker_queue(struct _starpu_worker *worker) { _starpu_memory_node_register_condition(worker, &worker->sched_cond, worker->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 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); _starpu_ctx_change_list_init(&workerarg->ctx_change_list); 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; #ifdef STARPU_SIMGRID starpu_pthread_wait_init(&workerarg->wait); starpu_pthread_queue_register(&workerarg->wait, &_starpu_simgrid_task_queue[workerarg->workerid]); #endif workerarg->task_transferring = NULL; workerarg->nb_buffers_transferred = 0; workerarg->nb_buffers_totransfer = 0; workerarg->first_task = 0; workerarg->ntasks = 0; /* set initialized by topology.c */ workerarg->pipeline_length = 0; workerarg->pipeline_stuck = 0; workerarg->worker_is_running = 0; workerarg->worker_is_initialized = 0; workerarg->status = STATUS_INITIALIZING; workerarg->state_keep_awake = 0; /* name initialized by driver */ /* short_name initialized by driver */ workerarg->run_by_starpu = 1; workerarg->driver_ops = NULL; 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->is_slave_somewhere = 0; workerarg->state_relax_refcnt = 1; #ifdef STARPU_SPINLOCK_CHECK workerarg->relax_on_file = __FILE__; workerarg->relax_on_line = __LINE__; workerarg->relax_on_func = __starpu_func__; workerarg->relax_off_file = NULL; workerarg->relax_off_line = 0; workerarg->relax_off_func = NULL; #endif workerarg->state_sched_op_pending = 0; workerarg->state_changing_ctx_waiting = 0; workerarg->state_changing_ctx_notice = 0; workerarg->state_blocked_in_parallel_observed = 0; workerarg->state_blocked_in_parallel = 0; workerarg->state_block_in_parallel_req = 0; workerarg->state_block_in_parallel_ack = 0; workerarg->state_unblock_in_parallel_req = 0; workerarg->state_unblock_in_parallel_ack = 0; workerarg->block_in_parallel_ref_count = 0; /* cpu_set/hwloc_cpu_set/hwloc_obj initialized in topology.c */ } static void _starpu_worker_deinit(struct _starpu_worker *workerarg) { (void) workerarg; #ifdef STARPU_SIMGRID starpu_pthread_queue_unregister(&workerarg->wait, &_starpu_simgrid_task_queue[workerarg->workerid]); starpu_pthread_wait_destroy(&workerarg->wait); #endif } #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_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->bindid, worker->workerid, NULL); #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; unsigned worker; #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(); /* Launch workers asynchronously */ for (worker = 0; worker < nworkers; worker++) { struct _starpu_worker *workerarg = &pconfig->workers[worker]; unsigned devid = workerarg->devid; #if defined(STARPU_USE_MIC) || defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) || defined(STARPU_USE_MPI_MASTER_SLAVE) struct _starpu_worker_set *worker_set = workerarg->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 = devid; workerarg->driver_ops = &_starpu_driver_cpu_ops; 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 = devid; workerarg->driver_ops = &_starpu_driver_cuda_ops; if (worker_set->workers != workerarg) /* We are not the first worker of the * set, don't start a thread for it. */ break; 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(devid, &driver.id.opencl_id); workerarg->driver_ops = &_starpu_driver_opencl_ops; 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: /* We spawn only one thread * per MIC device, which will control all MIC * workers of this device. (by using a worker set). */ if (worker_set->workers != workerarg) break; worker_set->set_is_initialized = 0; STARPU_PTHREAD_CREATE_ON( "MIC", &worker_set->worker_thread, NULL, _starpu_mic_src_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 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 /* STARPU_USE_MIC */ #ifdef STARPU_USE_MPI_MASTER_SLAVE case STARPU_MPI_MS_WORKER: /* We spawn only one thread * per MPI device, which will control all MPI * workers of this device. (by using a worker set). */ if (worker_set->workers != workerarg) break; worker_set->set_is_initialized = 0; #ifdef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD /* if MPI has multiple threads supports * we launch 1 thread per device * else * we launch one thread for all devices */ STARPU_PTHREAD_CREATE_ON( "MPI MS", &worker_set->worker_thread, NULL, _starpu_mpi_src_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 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; #endif /* STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD */ break; #endif /* STARPU_USE_MPI_MASTER_SLAVE */ default: STARPU_ABORT(); } } #if defined(STARPU_USE_MPI_MASTER_SLAVE) && !defined(STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD) if (pconfig->topology.nmpidevices > 0) { struct _starpu_worker_set * worker_set_zero = &mpi_worker_set[0]; struct _starpu_worker * worker_zero = &worker_set_zero->workers[0]; STARPU_PTHREAD_CREATE_ON( "zero", &worker_set_zero->worker_thread, NULL, _starpu_mpi_src_worker, &mpi_worker_set, _starpu_simgrid_get_host_by_worker(worker_zero)); /* We use the first worker to know if everything are finished */ #ifdef STARPU_USE_FXT STARPU_PTHREAD_MUTEX_LOCK(&worker_zero->mutex); while (!worker_zero->worker_is_running) STARPU_PTHREAD_COND_WAIT(&worker_zero->started_cond, &worker_zero->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_zero->mutex); #endif STARPU_PTHREAD_MUTEX_LOCK(&worker_set_zero->mutex); while (!worker_set_zero->set_is_initialized) STARPU_PTHREAD_COND_WAIT(&worker_set_zero->ready_cond, &worker_set_zero->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_set_zero->mutex); worker_set_zero->started = 1; worker_set_zero->worker_thread = mpi_worker_set[0].worker_thread; } #endif for (worker = 0; worker < nworkers; worker++) { struct _starpu_worker *workerarg = &pconfig->workers[worker]; _STARPU_DEBUG("waiting for worker %u initialization\n", worker); if (!workerarg->run_by_starpu) break; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (workerarg->arch == STARPU_CUDA_WORKER) { struct _starpu_worker_set *worker_set = workerarg->set; 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; } else #endif if (workerarg->arch != STARPU_CUDA_WORKER && workerarg->arch != STARPU_MPI_MS_WORKER && workerarg->arch != STARPU_MIC_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); } } _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->will_use_mpi = 0; 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"); conf->catch_signals = starpu_get_env_number_default("STARPU_CATCH_SIGNALS", 1); /* 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->reserve_ncpus = starpu_get_env_number("STARPU_RESERVE_NCPU"); int main_thread_bind = starpu_get_env_number_default("STARPU_MAIN_THREAD_BIND", 0); if (main_thread_bind) conf->reserve_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->nmpi_ms = starpu_get_env_number("STARPU_NMPI_MS"); 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_mpi_ms_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 #if defined(STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY) conf->disable_asynchronous_mpi_ms_copy = 1; #else conf->disable_asynchronous_mpi_ms_copy = starpu_get_env_number("STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY"); if(conf->disable_asynchronous_mpi_ms_copy == -1) conf->disable_asynchronous_mpi_ms_copy = 0; #endif /* 64MiB by default */ conf->trace_buffer_size = ((uint64_t) starpu_get_env_number_default("STARPU_TRACE_BUFFER_SIZE", 64)) << 20; conf->driver_spinning_backoff_min = (unsigned) starpu_get_env_number_default("STARPU_BACKOFF_MIN", 1); conf->driver_spinning_backoff_max = (unsigned) starpu_get_env_number_default("STARPU_BACKOFF_MAX", 32); return 0; } static void _starpu_conf_set_value_against_environment(char *name, int *value, int precedence_over_env) { if (precedence_over_env == 0) { 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, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_NCPU", &conf->ncpus, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_RESERVE_NCPU", &conf->reserve_ncpus, conf->precedence_over_environment_variables); int main_thread_bind = starpu_get_env_number_default("STARPU_MAIN_THREAD_BIND", 0); if (main_thread_bind) conf->reserve_ncpus++; _starpu_conf_set_value_against_environment("STARPU_NCUDA", &conf->ncuda, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_NOPENCL", &conf->nopencl, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_CALIBRATE", &conf->calibrate, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_BUS_CALIBRATE", &conf->bus_calibrate, conf->precedence_over_environment_variables); #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, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_COPY", &conf->disable_asynchronous_copy, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY", &conf->disable_asynchronous_cuda_copy, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY", &conf->disable_asynchronous_opencl_copy, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_MIC_COPY", &conf->disable_asynchronous_mic_copy, conf->precedence_over_environment_variables); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_MPI_MS_COPY", &conf->disable_asynchronous_mpi_ms_copy, conf->precedence_over_environment_variables); } struct starpu_tree* starpu_workers_get_tree(void) { return _starpu_config.topology.tree; } #if HWLOC_API_VERSION >= 0x20000 #define NORMAL_CHILD(obj) 1 #else #define NORMAL_CHILD(obj) ((obj)->type < HWLOC_OBJ_BRIDGE) #endif #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 HWLOC_API_VERSION >= 0x20000 arity = curr_obj->arity; #else arity = 0; for(i = 0; i < curr_obj->arity; i++) { if (!NORMAL_CHILD(curr_obj->children[i])) /* I/O stuff, stop caring */ break; arity++; } #endif if (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, arity, father); starpu_tree_prepare_children(arity, tree); j = 0; for(i = 0; i < arity; i++) { hwloc_obj_t child = curr_obj->children[i]; if (!NORMAL_CHILD(child)) /* I/O stuff, stop caring (shouldn't happen, though) */ break; #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 } static void (*act_sigint)(int); static void (*act_sigsegv)(int); static void (*act_sigtrap)(int); void _starpu_handler(int sig) { #ifdef STARPU_VERBOSE _STARPU_MSG("Catching signal '%d'\n", sig); #endif #ifdef STARPU_USE_FXT _starpu_fxt_dump_file(); #endif if (sig == SIGINT) { signal(SIGINT, act_sigint); } if (sig == SIGSEGV) { signal(SIGSEGV, act_sigsegv); } #ifdef SIGTRAP if (sig == SIGTRAP) { signal(SIGTRAP, act_sigtrap); } #endif #ifdef STARPU_VERBOSE _STARPU_MSG("Rearming signal '%d'\n", sig); #endif raise(sig); } void _starpu_catch_signals(void) { if (_starpu_config.conf.catch_signals == 1) { act_sigint = signal(SIGINT, _starpu_handler); act_sigsegv = signal(SIGSEGV, _starpu_handler); #ifdef SIGTRAP act_sigtrap = signal(SIGTRAP, _starpu_handler); #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(); STARPU_HG_DISABLE_CHECKING(_starpu_worker_parallel_blocks); #ifdef STARPU_SIMGRID /* This initializes the simgrid thread library, thus needs to be early */ _starpu_simgrid_init_early(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_MPI_MASTER_SLAVE if (_starpu_mpi_common_mp_init() == -ENODEV) { initialized = UNINITIALIZED; return -ENODEV; } /* In MPI case we look at the rank to know if we are a sink */ if (!_starpu_mpi_common_is_src_node()) setenv("STARPU_SINK", "STARPU_MPI_MS", 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_FXT_LOCK_TRACES _STARPU_DISP("Warning: StarPU was configured with --enable-fxt-lock, which slows down things a huge lot, and is really only meant for StarPU insides debugging. Did you really want to enable that?\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 __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 (starpu_getenv("STARPU_ENABLE_STATS")) { _STARPU_DISP("Warning: STARPU_ENABLE_STATS is enabled, which slows down a bit\n"); } #ifndef STARPU_SIMGRID if (starpu_get_env_number_default("STARPU_SIMGRID", 0)) { _STARPU_DISP("Simulation mode requested, but this libstarpu was built without simgrid support, please recompile\n"); return -EINVAL; } #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_idle_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); /* sink doesn't exit even if no worker discorvered */ if (ret && !is_a_sink) { starpu_perfmodel_free_sampling(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); init_count--; _starpu_destroy_machine_config(&_starpu_config); #ifdef STARPU_USE_MPI_MASTER_SLAVE if (_starpu_mpi_common_is_mp_initialized()) _starpu_mpi_common_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); //FIXME: find out if the variable STARPU_CHECK_ENTIRE_PLATFORM is really needed, for now, just set 1 as a default value check_entire_platform = 1;//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_WMB(); _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_max_priority != -1), _starpu_config.conf.global_sched_ctx_max_priority, 1, _starpu_config.conf.sched_policy_init, NULL, 0, NULL, 0); } _starpu_initialize_registered_performance_models(); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) _starpu_cuda_init(); #endif #ifdef STARPU_SIMGRID _starpu_simgrid_init(); #endif /* Launch "basic" workers (ie. non-combined workers) */ if (!is_a_sink) _starpu_launch_drivers(&_starpu_config); /* Allocate swap, if any */ if (!is_a_sink) _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); int main_thread_cpuid = starpu_get_env_number_default("STARPU_MAIN_THREAD_CPUID", -1); int main_thread_coreid = starpu_get_env_number_default("STARPU_MAIN_THREAD_COREID", -1); if (main_thread_cpuid >= 0 && main_thread_coreid >= 0) { _STARPU_DISP("Warning: STARPU_MAIN_THREAD_CPUID and STARPU_MAIN_THREAD_COREID cannot be set at the same time. STARPU_MAIN_THREAD_CPUID will be used.\n"); } if (main_thread_cpuid == -1 && main_thread_coreid >= 0) { main_thread_cpuid = main_thread_coreid * _starpu_get_nhyperthreads(); } int main_thread_bind = starpu_get_env_number_default("STARPU_MAIN_THREAD_BIND", 0); int main_thread_activity = STARPU_NONACTIVETHREAD; if (main_thread_bind) { main_thread_activity = STARPU_ACTIVETHREAD; if (main_thread_cpuid == -1) main_thread_cpuid = starpu_get_next_bindid(STARPU_THREAD_ACTIVE, NULL, 0); } if (main_thread_cpuid >= 0) _starpu_bind_thread_on_cpu(main_thread_cpuid, main_thread_activity, "main"); _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 _starpu_catch_signals(); /* if MPI is enabled, binding display will be done later, after MPI initialization */ if (!_starpu_config.conf.will_use_mpi && starpu_get_env_number_default("STARPU_DISPLAY_BINDINGS", 0)) { fprintf(stdout, "== Binding ==\n"); starpu_display_bindings(); fprintf(stdout, "== End of binding ==\n"); fflush(stdout); } 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 starpu_pthread_self() is the worker itself */ if (set && set->nworkers > 0) { if (set->started) { if (!starpu_pthread_equal(starpu_pthread_self(), set->worker_thread)) status = starpu_pthread_join(set->worker_thread, NULL); 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; if (!starpu_pthread_equal(starpu_pthread_self(), worker->worker_thread)) status = starpu_pthread_join(worker->worker_thread, NULL); 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); STARPU_ASSERT(_starpu_ctx_change_list_empty(&worker->ctx_change_list)); } } /* 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; starpu_fxt_trace_user_event_string("starpu_pause"); } 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); starpu_fxt_trace_user_event_string("starpu_resume"); } 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 /* do not block if a sched_ctx change operation is pending */ if (worker->state_changing_ctx_notice) return 0; 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) { unsigned worker; 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); unsigned i; unsigned nb_numa_nodes = starpu_memory_nodes_get_numa_count(); for (i=0; isched_mutex); struct _starpu_worker *cur_worker = NULL; int cur_workerid = starpu_worker_get_id(); if (workerid != cur_workerid) { /* in order to observe the 'blocked' state of a worker from * another worker, we must avoid race conditions between * 'blocked' state changes and state observations. This is the * purpose of this 'if' block. */ cur_worker = cur_workerid >= 0 ? _starpu_get_worker_struct(cur_workerid) : NULL; relax_own_observation_state = (cur_worker != NULL) && (cur_worker->state_relax_refcnt == 0); if (relax_own_observation_state && !worker->state_relax_refcnt) { /* moreover, when a worker (cur_worker != NULL) * observes another worker, we need to take special * care to avoid live locks, thus the observing worker * must enter the relaxed state (if not relaxed * already) before doing the observation in mutual * exclusion */ STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&cur_worker->sched_mutex); cur_worker->state_relax_refcnt = 1; STARPU_PTHREAD_COND_BROADCAST(&cur_worker->sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&cur_worker->sched_mutex); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } /* the observer waits for a safe window to observe the state, * and also waits for any pending blocking state change * requests to be processed, in order to not obtain an * ephemeral information */ while (!worker->state_relax_refcnt || worker->state_block_in_parallel_req || worker->state_unblock_in_parallel_req) { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); } } unsigned ret = _starpu_config.workers[workerid].state_blocked_in_parallel; /* once a worker state has been observed, the worker is 'tainted' for the next one full sched_op, * to avoid changing the observed worker state - on which the observer * made a scheduling decision - after the fact. */ worker->state_blocked_in_parallel_observed = 1; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); if (relax_own_observation_state) { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&cur_worker->sched_mutex); cur_worker->state_relax_refcnt = 0; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&cur_worker->sched_mutex); } return ret; } unsigned starpu_worker_is_slave_somewhere(int workerid) { starpu_worker_lock(workerid); unsigned ret = _starpu_config.workers[workerid].is_slave_somewhere; starpu_worker_unlock(workerid); return ret; } 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_MPI_MS_WORKER: return _starpu_config.topology.nmpidevices; 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.nmpidevices; 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; } int starpu_asynchronous_mpi_ms_copy_disabled(void) { return _starpu_config.conf.disable_asynchronous_mpi_ms_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_mpi_ms_worker_get_count(void) { return _starpu_config.topology.nmpidevices; } /* 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) { (void) f; (void) 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; } unsigned starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, unsigned maxsize) { unsigned nworkers = starpu_worker_get_count(); unsigned 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; } int starpu_worker_get_devids(enum starpu_worker_archtype type, int *devids, int num) { unsigned nworkers = starpu_worker_get_count(); int workerids[nworkers]; unsigned ndevice_workers = starpu_worker_get_ids_by_type(type, workerids, nworkers); unsigned ndevids = 0; if(ndevice_workers > 0) { unsigned id, devid; int cnt = 0; unsigned found = 0; for(id = 0; id < ndevice_workers; id++) { int curr_devid; curr_devid = _starpu_config.workers[workerids[id]].devid; for(devid = 0; devid < ndevids; devid++) { if(curr_devid == devids[devid]) { found = 1; break; } } if(!found) { devids[ndevids++] = curr_devid; cnt++; } else found = 0; if(cnt == num) break; } } return ndevids; } 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; } int starpu_worker_get_stream_workerids(unsigned devid, int *workerids, enum starpu_worker_archtype type) { unsigned nworkers = starpu_worker_get_count(); int nw = 0; unsigned id; for (id = 0; id < nworkers; id++) { if (_starpu_config.workers[id].devid == devid && (type == STARPU_ANY_WORKER || _starpu_config.workers[id].arch == type)) workerids[nw++] = id; } return nw; } void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond) { STARPU_ASSERT(workerid >= 0 && workerid < STARPU_NMAXWORKERS); *sched_cond = &_starpu_config.workers[workerid].sched_cond; *sched_mutex = &_starpu_config.workers[workerid].sched_mutex; } /* returns 1 if the call results in initiating a transition of worker WORKERID * from sleeping state to awake * returns 0 if worker WORKERID is not sleeping or the wake-up transition * already has been initiated */ static int starpu_wakeup_worker_locked(int workerid, starpu_pthread_cond_t *sched_cond, starpu_pthread_mutex_t *mutex STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID starpu_pthread_queue_broadcast(&_starpu_simgrid_task_queue[workerid]); #endif if (_starpu_config.workers[workerid].status == STATUS_SCHEDULING || _starpu_config.workers[workerid].status == STATUS_SLEEPING_SCHEDULING) { _starpu_config.workers[workerid].state_keep_awake = 1; return 0; } else if (_starpu_config.workers[workerid].status == STATUS_SLEEPING) { int ret = 0; if (_starpu_config.workers[workerid].state_keep_awake != 1) { _starpu_config.workers[workerid].state_keep_awake = 1; ret = 1; } /* cond_broadcast is required over cond_signal since * the condition is share for multiple purpose */ STARPU_PTHREAD_COND_BROADCAST(sched_cond); return ret; } return 0; } static int starpu_wakeup_worker_no_relax(int workerid, starpu_pthread_cond_t *sched_cond, starpu_pthread_mutex_t *sched_mutex) { int success; STARPU_PTHREAD_MUTEX_LOCK_SCHED(sched_mutex); success = starpu_wakeup_worker_locked(workerid, sched_cond, sched_mutex); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(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_no_relax(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_no_relax(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; } void starpu_get_version(int *major, int *minor, int *release) { *major = STARPU_MAJOR_VERSION; *minor = STARPU_MINOR_VERSION; *release = STARPU_RELEASE_VERSION; } 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_elt *e = NULL; struct _starpu_sched_ctx_list_iterator list_it; _starpu_sched_ctx_list_iterator_init(worker->sched_ctx_list, &list_it); while (_starpu_sched_ctx_list_iterator_has_next(&list_it)) { e = _starpu_sched_ctx_list_iterator_get_next(&list_it); (*sched_ctxs)[s++] = e->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_MPI_MS_WORKER) return "STARPU_MPI_MS_WORKER"; if (type == STARPU_ANY_WORKER) return "STARPU_ANY_WORKER"; return "STARPU_unknown_WORKER"; } void _starpu_worker_set_stream_ctx(unsigned workerid, struct _starpu_sched_ctx *sched_ctx) { STARPU_ASSERT(workerid < starpu_worker_get_count()); struct _starpu_worker *w = _starpu_get_worker_struct(workerid); w->stream_ctx = sched_ctx; } struct _starpu_sched_ctx* _starpu_worker_get_ctx_stream(unsigned stream_workerid) { if (stream_workerid >= starpu_worker_get_count()) return NULL; struct _starpu_worker *w = _starpu_get_worker_struct(stream_workerid); return w->stream_ctx; } unsigned starpu_worker_get_sched_ctx_id_stream(unsigned stream_workerid) { if (stream_workerid >= starpu_worker_get_count()) return STARPU_NMAX_SCHED_CTXS; struct _starpu_worker *w = _starpu_get_worker_struct(stream_workerid); return w->stream_ctx != NULL ? w->stream_ctx->id : STARPU_NMAX_SCHED_CTXS; } void starpu_worker_display_names(FILE *output, enum starpu_worker_archtype type) { int nworkers = starpu_worker_get_count_by_type(type); if (nworkers <= 0) { fprintf(output, "No %s worker\n", starpu_worker_get_type_as_string(type)); } else { int i, ids[nworkers]; starpu_worker_get_ids_by_type(type, ids, nworkers); fprintf(output, "%d %s worker%s:\n", nworkers, starpu_worker_get_type_as_string(type), nworkers==1?"":"s"); for(i = 0; i < nworkers; i++) { char name[256]; starpu_worker_get_name(ids[i], name, 256); fprintf(output, "\t%s\n", name); } } } void _starpu_worker_refuse_task(struct _starpu_worker *worker, struct starpu_task *task) { if (worker->pipeline_length || worker->arch == STARPU_OPENCL_WORKER) { int j; for (j = 0; j < worker->ntasks; j++) { const int j_mod = (j+worker->first_task)%STARPU_MAX_PIPELINE; if (task == worker->current_tasks[j_mod]) { worker->current_tasks[j_mod] = NULL; if (j == 0) { worker->first_task = (worker->first_task + 1) % STARPU_MAX_PIPELINE; worker->current_task = NULL; _starpu_set_current_task(NULL); } break; } } STARPU_ASSERT(jntasks); } else { worker->current_task = NULL; _starpu_set_current_task(NULL); } worker->ntasks--; task->prefetched = 0; int res = _starpu_push_task_to_workers(task); STARPU_ASSERT_MSG(res == 0, "_starpu_push_task_to_workers() unexpectedly returned = %d\n", res); } int starpu_worker_sched_op_pending(void) { return _starpu_worker_sched_op_pending(); } #undef starpu_worker_relax_on void starpu_worker_relax_on(void) { _starpu_worker_relax_on(); } #undef starpu_worker_relax_off void starpu_worker_relax_off(void) { _starpu_worker_relax_off(); } #undef starpu_worker_get_relax_state int starpu_worker_get_relax_state(void) { return _starpu_worker_get_relax_state(); } void starpu_worker_lock(int workerid) { _starpu_worker_lock(workerid); } int starpu_worker_trylock(int workerid) { return _starpu_worker_trylock(workerid); } void starpu_worker_unlock(int workerid) { _starpu_worker_unlock(workerid); } void starpu_worker_lock_self(void) { _starpu_worker_lock_self(); } void starpu_worker_unlock_self(void) { _starpu_worker_unlock_self(); } int starpu_wake_worker_relax(int workerid) { return _starpu_wake_worker_relax(workerid); } #ifdef STARPU_HAVE_HWLOC hwloc_cpuset_t starpu_worker_get_hwloc_cpuset(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); return hwloc_bitmap_dup(worker->hwloc_cpu_set); } hwloc_obj_t starpu_worker_get_hwloc_obj(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); return worker->hwloc_obj; } #endif /* Light version of _starpu_wake_worker_relax, which, when possible, * speculatively sets keep_awake on the target worker without waiting that * worker to enter the relaxed state. */ int starpu_wake_worker_relax_light(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); int cur_workerid = starpu_worker_get_id(); if (workerid != cur_workerid) { starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); while (!worker->state_relax_refcnt) { /* Attempt a fast path if the worker is not really asleep */ if (_starpu_config.workers[workerid].status == STATUS_SCHEDULING || _starpu_config.workers[workerid].status == STATUS_SLEEPING_SCHEDULING) { _starpu_config.workers[workerid].state_keep_awake = 1; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); starpu_worker_relax_off(); return 1; } STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); } } else { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } int ret = starpu_wake_worker_locked(workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); if (workerid != cur_workerid) { starpu_worker_relax_off(); } return ret; } #ifdef STARPU_WORKER_CALLBACKS void starpu_worker_set_going_to_sleep_callback(void (*callback)(unsigned workerid)) { STARPU_ASSERT(_starpu_config.conf.callback_worker_going_to_sleep); _starpu_config.conf.callback_worker_going_to_sleep = callback; } void starpu_worker_set_waking_up_callback(void (*callback)(unsigned workerid)) { STARPU_ASSERT(_starpu_config.conf.callback_worker_waking_up); _starpu_config.conf.callback_worker_waking_up = callback; } #endif enum starpu_node_kind _starpu_worker_get_node_kind(enum starpu_worker_archtype type) { switch(type) { case STARPU_CPU_WORKER: return STARPU_CPU_RAM; case STARPU_CUDA_WORKER: return STARPU_CUDA_RAM; case STARPU_OPENCL_WORKER: return STARPU_OPENCL_RAM; break; case STARPU_MIC_WORKER: return STARPU_MIC_RAM; case STARPU_MPI_MS_WORKER: return STARPU_MPI_MS_RAM; default: STARPU_ABORT(); } } starpu-1.3.9+dfsg/src/core/workers.h000066400000000000000000001231501413463044200173500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** \addtogroup workers */ /* @{ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include #endif #include #include #include #ifdef STARPU_USE_MIC #include #endif /* STARPU_USE_MIC */ #ifdef STARPU_USE_MPI_MASTER_SLAVE #include #endif #include #include #include #define STARPU_MAX_PIPELINE 4 enum initialization { UNINITIALIZED = 0, CHANGING, INITIALIZED }; struct _starpu_ctx_change_list; /** This is initialized by _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 ? */ unsigned numa_memory_node; /**< which numa memory node is the worker associated with? (logical index) */ /** * condition variable used for passive waiting operations on worker * STARPU_PTHREAD_COND_BROADCAST must be used instead of STARPU_PTHREAD_COND_SIGNAL, * since the condition is shared for multiple purpose */ starpu_pthread_cond_t sched_cond; starpu_pthread_mutex_t sched_mutex; /**< mutex protecting sched_cond */ unsigned state_relax_refcnt; /**< mark scheduling sections where other workers can safely access the worker state */ #ifdef STARPU_SPINLOCK_CHECK const char *relax_on_file; int relax_on_line; const char *relax_on_func; const char *relax_off_file; int relax_off_line; const char *relax_off_func; #endif unsigned state_sched_op_pending; /**< a task pop is ongoing even though sched_mutex may temporarily be unlocked */ unsigned state_changing_ctx_waiting; /**< a thread is waiting for operations such as pop to complete before acquiring sched_mutex and modifying the worker ctx*/ unsigned state_changing_ctx_notice; /**< the worker ctx is about to change or being changed, wait for flag to be cleared before starting new scheduling operations */ unsigned state_blocked_in_parallel; /**< worker is currently blocked on a parallel section */ unsigned state_blocked_in_parallel_observed; /**< the blocked state of the worker has been observed by another worker during a relaxed section */ unsigned state_block_in_parallel_req; /**< a request for state transition from unblocked to blocked is pending */ unsigned state_block_in_parallel_ack; /**< a block request has been honored */ unsigned state_unblock_in_parallel_req; /**< a request for state transition from blocked to unblocked is pending */ unsigned state_unblock_in_parallel_ack; /**< an unblock request has been honored */ /** * cumulative blocking depth * - =0 worker unblocked * - >0 worker blocked * - transition from 0 to 1 triggers a block_req * - transition from 1 to 0 triggers a unblock_req */ unsigned block_in_parallel_ref_count; starpu_pthread_t thread_changing_ctx; /**< thread currently changing a sched_ctx containing the worker */ /** list of deferred context changes * * when the current thread is a worker, _and_ this worker is in a * scheduling operation, new ctx changes are queued to this list for * subsequent processing once worker completes the ongoing scheduling * operation */ struct _starpu_ctx_change_list ctx_change_list; 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) */ #ifdef STARPU_SIMGRID starpu_pthread_wait_t wait; #endif 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) */ unsigned state_keep_awake; /**< !0 if a task has been pushed to the worker and the task has not yet been seen by the worker, the worker should no go to sleep before processing this task*/ char name[128]; char short_name[32]; unsigned run_by_starpu; /**< Is this run by StarPU or directly by the application ? */ struct _starpu_driver_ops *driver_ops; 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 */ unsigned nb_buffers_transferred; /**< number of piece of data already send to worker */ unsigned nb_buffers_totransfer; /**< number of piece of data already send to worker */ struct starpu_task *task_transferring; /**< The buffers of this task are being sent */ /** * 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]; unsigned poped_in_ctx[STARPU_NMAX_SCHED_CTXS+1]; /**< boolean to chose the next ctx a worker will pop into */ /** * 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]; unsigned pop_ctx_priority; /**< indicate which priority of ctx is currently active: the values are 0 or 1*/ unsigned is_slave_somewhere; /**< bool to indicate if the worker is slave in a ctx */ struct _starpu_sched_ctx *stream_ctx; #ifdef __GLIBC__ cpu_set_t cpu_set; #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t hwloc_cpu_set; hwloc_obj_t hwloc_obj; #endif /** Keep this last, to make sure to separate worker data in separate cache lines. */ char padding[STARPU_CACHELINE_SIZE]; ); 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 /** Keep this last, to make sure to separate worker data in separate cache lines. */ char padding[STARPU_CACHELINE_SIZE]; }; /** * in case a single CPU worker may control multiple * accelerators */ 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; }; #ifdef STARPU_USE_MPI_MASTER_SLAVE extern struct _starpu_worker_set mpi_worker_set[STARPU_MAXMPIDEVS]; #endif 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 CPU cores, as detected by the topology code. May * be different from the actual number of CPU workers. */ unsigned nhwcpus; /** Total number of PUs (i.e. threads), 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 MPI nodes, as detected. May be different * from the actual number of node workers. */ unsigned nhwmpi; /** Actual number of CPU workers used by StarPU. */ unsigned ncpus; /** Actual number of CUDA GPUs used by StarPU. */ unsigned ncudagpus; unsigned nworkerpercuda; int cuda_th_per_stream; int cuda_th_per_dev; /** Actual number of OpenCL workers used by StarPU. */ unsigned nopenclgpus; /** Actual number of MPI workers used by StarPU. */ unsigned nmpidevices; unsigned nhwmpidevices; unsigned nhwmpicores[STARPU_MAXMPIDEVS]; /**< Each MPI node has its set of cores. */ unsigned nmpicores[STARPU_MAXMPIDEVS]; /** Topology of MP nodes (MIC) 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]; */ unsigned workers_mpi_ms_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]; char currently_shared[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 MPI do we use? */ int current_mpi_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 MPI, if only one */ int mpi_nodeid; /** Separate out previous variables from per-worker data. */ char padding1[STARPU_CACHELINE_SIZE]; /** 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]; starpu_pthread_mutex_t submitted_mutex; /** Separate out previous mutex from the rest of the data. */ char padding2[STARPU_CACHELINE_SIZE]; /** 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; }; extern int _starpu_worker_parallel_blocks; 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; } /** initialise a worker */ void _starpu_worker_init(struct _starpu_worker *workerarg, struct _starpu_machine_config *pconfig); /** 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); /** 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 describes 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); /** 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); 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) { /* topology.nsched_ctxs may be increased asynchronously in sched_ctx_create */ STARPU_RMB(); 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 /** Similar behaviour to starpu_worker_get_id() but fails when called from outside a worker */ /** This returns an unsigned object on purpose, so that the caller is sure to get a positive value */ static inline unsigned __starpu_worker_get_id_check(const char *f, int l) { (void) l; (void) f; 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; } #define _starpu_worker_get_id_check(f,l) __starpu_worker_get_id_check(f,l) enum starpu_node_kind _starpu_worker_get_node_kind(enum starpu_worker_archtype type); void _starpu_worker_set_stream_ctx(unsigned workerid, struct _starpu_sched_ctx *sched_ctx); struct _starpu_sched_ctx* _starpu_worker_get_ctx_stream(unsigned stream_workerid); /** Send a request to the worker to block, before a parallel task is about to * begin. * * Must be called with worker's sched_mutex held. */ static inline void _starpu_worker_request_blocking_in_parallel(struct _starpu_worker * const worker) { _starpu_worker_parallel_blocks = 1; /* flush pending requests to start on a fresh transaction epoch */ while (worker->state_unblock_in_parallel_req) STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); /* announce blocking intent */ STARPU_ASSERT(worker->block_in_parallel_ref_count < UINT_MAX); worker->block_in_parallel_ref_count++; if (worker->block_in_parallel_ref_count == 1) { /* only the transition from 0 to 1 triggers the block_in_parallel_req */ STARPU_ASSERT(!worker->state_blocked_in_parallel); STARPU_ASSERT(!worker->state_block_in_parallel_req); STARPU_ASSERT(!worker->state_block_in_parallel_ack); STARPU_ASSERT(!worker->state_unblock_in_parallel_req); STARPU_ASSERT(!worker->state_unblock_in_parallel_ack); /* trigger the block_in_parallel_req */ worker->state_block_in_parallel_req = 1; STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); #ifdef STARPU_SIMGRID starpu_pthread_queue_broadcast(&_starpu_simgrid_task_queue[worker->workerid]); #endif /* wait for block_in_parallel_req to be processed */ while (!worker->state_block_in_parallel_ack) STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); STARPU_ASSERT(worker->block_in_parallel_ref_count >= 1); STARPU_ASSERT(worker->state_block_in_parallel_req); STARPU_ASSERT(worker->state_blocked_in_parallel); /* reset block_in_parallel_req state flags */ worker->state_block_in_parallel_req = 0; worker->state_block_in_parallel_ack = 0; /* broadcast block_in_parallel_req state flags reset */ STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); } } /** Send a request to the worker to unblock, after a parallel task is complete. * * Must be called with worker's sched_mutex held. */ static inline void _starpu_worker_request_unblocking_in_parallel(struct _starpu_worker * const worker) { /* flush pending requests to start on a fresh transaction epoch */ while (worker->state_block_in_parallel_req) STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); /* unblocking may be requested unconditionnally * thus, check is unblocking is really needed */ if (worker->state_blocked_in_parallel) { if (worker->block_in_parallel_ref_count == 1) { /* only the transition from 1 to 0 triggers the unblock_in_parallel_req */ STARPU_ASSERT(!worker->state_block_in_parallel_req); STARPU_ASSERT(!worker->state_block_in_parallel_ack); STARPU_ASSERT(!worker->state_unblock_in_parallel_req); STARPU_ASSERT(!worker->state_unblock_in_parallel_ack); /* trigger the unblock_in_parallel_req */ worker->state_unblock_in_parallel_req = 1; STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); /* wait for the unblock_in_parallel_req to be processed */ while (!worker->state_unblock_in_parallel_ack) STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); STARPU_ASSERT(worker->state_unblock_in_parallel_req); STARPU_ASSERT(!worker->state_blocked_in_parallel); /* reset unblock_in_parallel_req state flags */ worker->state_unblock_in_parallel_req = 0; worker->state_unblock_in_parallel_ack = 0; /* broadcast unblock_in_parallel_req state flags reset */ STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); } /* announce unblocking complete */ STARPU_ASSERT(worker->block_in_parallel_ref_count > 0); worker->block_in_parallel_ref_count--; } } /** Called by the the worker to process incoming requests to block or unblock on * parallel task boundaries. * * Must be called with worker's sched_mutex held. */ static inline void _starpu_worker_process_block_in_parallel_requests(struct _starpu_worker * const worker) { while (worker->state_block_in_parallel_req) { STARPU_ASSERT(!worker->state_blocked_in_parallel); STARPU_ASSERT(!worker->state_block_in_parallel_ack); STARPU_ASSERT(!worker->state_unblock_in_parallel_req); STARPU_ASSERT(!worker->state_unblock_in_parallel_ack); STARPU_ASSERT(worker->block_in_parallel_ref_count > 0); /* enter effective blocked state */ worker->state_blocked_in_parallel = 1; /* notify block_in_parallel_req processing */ worker->state_block_in_parallel_ack = 1; STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); /* block */ while (!worker->state_unblock_in_parallel_req) STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); STARPU_ASSERT(worker->state_blocked_in_parallel); STARPU_ASSERT(!worker->state_block_in_parallel_req); STARPU_ASSERT(!worker->state_block_in_parallel_ack); STARPU_ASSERT(!worker->state_unblock_in_parallel_ack); STARPU_ASSERT(worker->block_in_parallel_ref_count > 0); /* leave effective blocked state */ worker->state_blocked_in_parallel = 0; /* notify unblock_in_parallel_req processing */ worker->state_unblock_in_parallel_ack = 1; STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); } } /** Mark the beginning of a scheduling operation by the worker. No worker * blocking operations on parallel tasks and no scheduling context change * operations must be performed on contexts containing the worker, on * contexts about to add the worker and on contexts about to remove the * worker, while the scheduling operation is in process. The sched mutex * of the worker may only be acquired permanently by another thread when * no scheduling operation is in process, or when a scheduling operation * is in process _and_ worker->state_relax_refcnt!=0. If a * scheduling operation is in process _and_ * worker->state_relax_refcnt==0, a thread other than the worker * must wait on condition worker->sched_cond for * worker->state_relax_refcnt!=0 to become true, before acquiring * the worker sched mutex permanently. * * Must be called with worker's sched_mutex held. */ #ifdef STARPU_SPINLOCK_CHECK static inline void __starpu_worker_enter_sched_op(struct _starpu_worker * const worker, const char*file, int line, const char* func) #else static inline void _starpu_worker_enter_sched_op(struct _starpu_worker * const worker) #endif { STARPU_ASSERT(!worker->state_sched_op_pending); if (!worker->state_blocked_in_parallel_observed) { /* process pending block requests before entering a sched_op region */ _starpu_worker_process_block_in_parallel_requests(worker); while (worker->state_changing_ctx_notice) { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); /* new block requests may have been triggered during the wait, * need to check again */ _starpu_worker_process_block_in_parallel_requests(worker); } } else { /* if someone observed the worker state since the last call, postpone block request * processing for one sched_op turn more, because the observer will not have seen * new block requests between its observation and now. * * however, the worker still has to wait for context change operations to complete * before entering sched_op again*/ while (worker->state_changing_ctx_notice) { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); } } /* no block request and no ctx change ahead, * enter sched_op */ worker->state_sched_op_pending = 1; worker->state_blocked_in_parallel_observed = 0; worker->state_relax_refcnt = 0; #ifdef STARPU_SPINLOCK_CHECK worker->relax_on_file = file; worker->relax_on_line = line; worker->relax_on_func = func; #endif } #ifdef STARPU_SPINLOCK_CHECK #define _starpu_worker_enter_sched_op(worker) __starpu_worker_enter_sched_op((worker), __FILE__, __LINE__, __starpu_func__) #endif /** Mark the end of a scheduling operation by the worker. * * Must be called with worker's sched_mutex held. */ void _starpu_worker_apply_deferred_ctx_changes(void); #ifdef STARPU_SPINLOCK_CHECK static inline void __starpu_worker_leave_sched_op(struct _starpu_worker * const worker, const char*file, int line, const char* func) #else static inline void _starpu_worker_leave_sched_op(struct _starpu_worker * const worker) #endif { STARPU_ASSERT(worker->state_sched_op_pending); worker->state_relax_refcnt = 1; #ifdef STARPU_SPINLOCK_CHECK worker->relax_off_file = file; worker->relax_off_line = line; worker->relax_off_func = func; #endif worker->state_sched_op_pending = 0; STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); _starpu_worker_apply_deferred_ctx_changes(); } #ifdef STARPU_SPINLOCK_CHECK #define _starpu_worker_leave_sched_op(worker) __starpu_worker_leave_sched_op((worker), __FILE__, __LINE__, __starpu_func__) #endif static inline int _starpu_worker_sched_op_pending(void) { int workerid = starpu_worker_get_id(); if (workerid == -1) return 0; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); return worker->state_sched_op_pending; } /** Must be called before altering a context related to the worker * whether about adding the worker to a context, removing it from a * context or modifying the set of workers of a context of which the * worker is a member, to mark the beginning of a context change * operation. The sched mutex of the worker must be held before calling * this function. * * Must be called with worker's sched_mutex held. */ static inline void _starpu_worker_enter_changing_ctx_op(struct _starpu_worker * const worker) { STARPU_ASSERT(!starpu_pthread_equal(worker->thread_changing_ctx, starpu_pthread_self())); /* flush pending requests to start on a fresh transaction epoch */ while (worker->state_changing_ctx_notice) STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); /* announce changing_ctx intent * * - an already started sched_op is allowed to complete * - no new sched_op may be started */ worker->state_changing_ctx_notice = 1; worker->thread_changing_ctx = starpu_pthread_self(); /* allow for an already started sched_op to complete */ if (worker->state_sched_op_pending) { /* request sched_op to broadcast when way is cleared */ worker->state_changing_ctx_waiting = 1; /* wait for sched_op completion */ STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); #ifdef STARPU_SIMGRID starpu_pthread_queue_broadcast(&_starpu_simgrid_task_queue[worker->workerid]); #endif do { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); } while (worker->state_sched_op_pending); /* reset flag so other sched_ops wont have to broadcast state */ worker->state_changing_ctx_waiting = 0; } } /** Mark the end of a context change operation. * * Must be called with worker's sched_mutex held. */ static inline void _starpu_worker_leave_changing_ctx_op(struct _starpu_worker * const worker) { worker->thread_changing_ctx = (starpu_pthread_t)0; worker->state_changing_ctx_notice = 0; STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); } /** Temporarily allow other worker to access current worker state, when still scheduling, * but the scheduling has not yet been made or is already done */ #ifdef STARPU_SPINLOCK_CHECK static inline void __starpu_worker_relax_on(const char*file, int line, const char* func) #else static inline void _starpu_worker_relax_on(void) #endif { struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (worker == NULL) return; if (!worker->state_sched_op_pending) return; STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); #ifdef STARPU_SPINLOCK_CHECK STARPU_ASSERT_MSG(worker->state_relax_refcntrelax_on_func, worker->relax_on_file, worker->relax_on_line); #else STARPU_ASSERT(worker->state_relax_refcntstate_relax_refcnt++; #ifdef STARPU_SPINLOCK_CHECK worker->relax_on_file = file; worker->relax_on_line = line; worker->relax_on_func = func; #endif STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } #ifdef STARPU_SPINLOCK_CHECK #define _starpu_worker_relax_on() __starpu_worker_relax_on(__FILE__, __LINE__, __starpu_func__) #endif #define starpu_worker_relax_on _starpu_worker_relax_on /** Same, but with current worker mutex already held */ #ifdef STARPU_SPINLOCK_CHECK static inline void __starpu_worker_relax_on_locked(struct _starpu_worker *worker, const char*file, int line, const char* func) #else static inline void _starpu_worker_relax_on_locked(struct _starpu_worker *worker) #endif { if (!worker->state_sched_op_pending) return; #ifdef STARPU_SPINLOCK_CHECK STARPU_ASSERT_MSG(worker->state_relax_refcntrelax_on_func, worker->relax_on_file, worker->relax_on_line); #else STARPU_ASSERT(worker->state_relax_refcntstate_relax_refcnt++; #ifdef STARPU_SPINLOCK_CHECK worker->relax_on_file = file; worker->relax_on_line = line; worker->relax_on_func = func; #endif STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); } #ifdef STARPU_SPINLOCK_CHECK #define _starpu_worker_relax_on_locked(worker) __starpu_worker_relax_on_locked(worker,__FILE__, __LINE__, __starpu_func__) #endif #ifdef STARPU_SPINLOCK_CHECK static inline void __starpu_worker_relax_off(const char*file, int line, const char* func) #else static inline void _starpu_worker_relax_off(void) #endif { int workerid = starpu_worker_get_id(); if (workerid == -1) return; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); if (!worker->state_sched_op_pending) return; STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); #ifdef STARPU_SPINLOCK_CHECK STARPU_ASSERT_MSG(worker->state_relax_refcnt>0, "relax last turn off in %s (%s:%d)\n", worker->relax_on_func, worker->relax_on_file, worker->relax_on_line); #else STARPU_ASSERT(worker->state_relax_refcnt>0); #endif worker->state_relax_refcnt--; #ifdef STARPU_SPINLOCK_CHECK worker->relax_off_file = file; worker->relax_off_line = line; worker->relax_off_func = func; #endif STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } #ifdef STARPU_SPINLOCK_CHECK #define _starpu_worker_relax_off() __starpu_worker_relax_off(__FILE__, __LINE__, __starpu_func__) #endif #define starpu_worker_relax_off _starpu_worker_relax_off #ifdef STARPU_SPINLOCK_CHECK static inline void __starpu_worker_relax_off_locked(const char*file, int line, const char* func) #else static inline void _starpu_worker_relax_off_locked(void) #endif { int workerid = starpu_worker_get_id(); if (workerid == -1) return; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); if (!worker->state_sched_op_pending) return; #ifdef STARPU_SPINLOCK_CHECK STARPU_ASSERT_MSG(worker->state_relax_refcnt>0, "relax last turn off in %s (%s:%d)\n", worker->relax_on_func, worker->relax_on_file, worker->relax_on_line); #else STARPU_ASSERT(worker->state_relax_refcnt>0); #endif worker->state_relax_refcnt--; #ifdef STARPU_SPINLOCK_CHECK worker->relax_off_file = file; worker->relax_off_line = line; worker->relax_off_func = func; #endif } #ifdef STARPU_SPINLOCK_CHECK #define _starpu_worker_relax_off_locked() __starpu_worker_relax_off_locked(__FILE__, __LINE__, __starpu_func__) #endif static inline int _starpu_worker_get_relax_state(void) { int workerid = starpu_worker_get_id(); if (workerid < 0) return 1; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); return worker->state_relax_refcnt != 0; } #define starpu_worker_get_relax_state _starpu_worker_get_relax_state /** lock a worker for observing contents * * notes: * - if the observed worker is not in state_relax_refcnt, the function block until the state is reached */ static inline void _starpu_worker_lock(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); int cur_workerid = starpu_worker_get_id(); if (workerid != cur_workerid) { starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); while (!worker->state_relax_refcnt) { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); } } else { STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } } static inline int _starpu_worker_trylock(int workerid) { struct _starpu_worker *cur_worker = _starpu_get_local_worker_key(); int cur_workerid = cur_worker->workerid; struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); /* Start with ourself */ int ret = STARPU_PTHREAD_MUTEX_TRYLOCK_SCHED(&cur_worker->sched_mutex); if (ret) return ret; if (workerid == cur_workerid) /* We only needed to lock ourself */ return 0; /* Now try to lock the other worker */ ret = STARPU_PTHREAD_MUTEX_TRYLOCK_SCHED(&worker->sched_mutex); if (!ret) { /* Good, check that it is relaxed */ ret = !worker->state_relax_refcnt; if (ret) STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } if (!ret) _starpu_worker_relax_on_locked(cur_worker); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&cur_worker->sched_mutex); return ret; } static inline void _starpu_worker_unlock(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); int cur_workerid = starpu_worker_get_id(); if (workerid != cur_workerid) { starpu_worker_relax_off(); } } static inline void _starpu_worker_lock_self(void) { int workerid = starpu_worker_get_id_check(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); } static inline void _starpu_worker_unlock_self(void) { int workerid = starpu_worker_get_id_check(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); STARPU_ASSERT(worker != NULL); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); } static inline int _starpu_wake_worker_relax(int workerid) { _starpu_worker_lock(workerid); int ret = starpu_wake_worker_locked(workerid); _starpu_worker_unlock(workerid); return ret; } int starpu_wake_worker_relax_light(int workerid); /** * Allow a worker pulling a task it cannot execute to properly refuse it and * send it back to the scheduler. */ void _starpu_worker_refuse_task(struct _starpu_worker *worker, struct starpu_task *task); /* @}*/ #endif // __WORKERS_H__ starpu-1.3.9+dfsg/src/datawizard/000077500000000000000000000000001413463044200167035ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/datawizard/coherency.c000066400000000000000000001266721413463044200210440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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_MPI_MS_RAM) 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; if (mode & STARPU_W) { /* the requesting node now has the only valid copy */ unsigned node; for (node = 0; node < nnodes; node++) { if (handle->per_node[node].state != STARPU_INVALID) _STARPU_TRACE_DATA_STATE_INVALID(handle, node); handle->per_node[node].state = STARPU_INVALID; } if (requesting_replicate->state != STARPU_OWNER) _STARPU_TRACE_DATA_STATE_OWNER(handle, requesting_node); 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) { if (replicate->state != STARPU_SHARED) _STARPU_TRACE_DATA_STATE_SHARED(handle, node); replicate->state = STARPU_SHARED; } } if (requesting_replicate->state != STARPU_SHARED) _STARPU_TRACE_DATA_STATE_SHARED(handle, requesting_node); requesting_replicate->state = STARPU_SHARED; } } } static int worker_supports_direct_access(unsigned node, unsigned handling_node) { 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; struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(node); if (node_ops && node_ops->is_direct_access_supported) return node_ops->is_direct_access_supported(node, handling_node); else { STARPU_ABORT_MSG("Node %s does not define the operation 'is_direct_access_supported'", _starpu_node_get_prefix(starpu_node_get_kind(node))); 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; } return 0; } /* Now, we use slowness/bandwidth to compare numa nodes, is it better to use latency ? */ static unsigned chose_best_numa_between_src_and_dest(int src, int dst) { double timing_best; int best_numa = -1; unsigned numa; const unsigned nb_numa_nodes = starpu_memory_nodes_get_numa_count(); for(numa = 0; numa < nb_numa_nodes; numa++) { double actual = 1.0/starpu_transfer_bandwidth(src, numa) + 1.0/starpu_transfer_bandwidth(numa, dst); /* Compare slowness : take the lowest */ if (best_numa < 0 || actual < timing_best) { best_numa = numa; timing_best = actual; } } STARPU_ASSERT(best_numa >= 0); return best_numa; } /* 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. */ int _starpu_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; } if (src_node < 0) { /* Will just initialize the destination */ STARPU_ASSERT(max_len >= 1); src_nodes[0] = src_node; // 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); STARPU_ASSERT(src_node >= 0); unsigned numa = chose_best_numa_between_src_and_dest(src_node, dst_node); /* GPU -> RAM */ src_nodes[0] = src_node; dst_nodes[0] = numa; 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] = numa; 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(STARPU_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, enum _starpu_is_prefetch 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, enum _starpu_is_prefetch is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg, int prio, const char *origin) { /* 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 (starpu_node_get_kind(requesting_node) == STARPU_CPU_RAM && !nwait && !_starpu_malloc_willpin_on_node(requesting_node)) { /* And this is the main RAM without pinning, really no need for a * request, just quickly allocate and be done */ 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 = _starpu_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, prio, 0, origin); 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, prio, 1, origin); /* 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, enum _starpu_is_prefetch is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg, int prio, const char *origin) { _STARPU_LOG_IN(); _starpu_spin_lock(&handle->header_lock); if (is_prefetch > 0) { unsigned src_node_mask = 0; unsigned nnodes = starpu_memory_nodes_get_count(); unsigned n; for (n = 0; n < nnodes; n++) { if (handle->per_node[n].state != STARPU_INVALID) { /* we found a copy ! */ src_node_mask |= (1<header_lock); return 0; } } 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_NO_NODE_LOCK_ALL) { 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, prio, origin); /* 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, int prio) { return _starpu_fetch_data_on_node(handle, node, replicate, mode, 1, STARPU_IDLEFETCH, 1, NULL, NULL, prio, "idle_prefetch_data_on_node"); } static int prefetch_data_on_node(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode, int prio) { return _starpu_fetch_data_on_node(handle, node, replicate, mode, 1, STARPU_PREFETCH, 1, NULL, NULL, prio, "prefetch_data_on_node"); } static int fetch_data(starpu_data_handle_t handle, int node, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode, int prio) { return _starpu_fetch_data_on_node(handle, node, replicate, mode, 0, STARPU_FETCH, 0, NULL, NULL, prio, "fetch_data"); } 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); } size_t _starpu_data_get_alloc_size(starpu_data_handle_t handle) { if (handle->ops->get_alloc_size) return handle->ops->get_alloc_size(handle); else 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; size_t max_wt_mask = sizeof(wt_mask) * 8; unsigned wt_count = starpu_memory_nodes_get_count(); if (max_wt_mask > STARPU_MAXNODES) max_wt_mask = STARPU_MAXNODES; if (wt_count > max_wt_mask) wt_count = max_wt_mask; wt_mask = default_wt_mask | handle->wt_mask; wt_mask &= (1ULL<memory_node; if (replicate->state != STARPU_INVALID && handle->current_mode & STARPU_W) if (wt_mask && (memory_node >= max_wt_mask || wt_mask & ~(1<header_lock)) { cpt++; _starpu_datawizard_progress(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); } int starpu_prefetch_task_input_on_node_prio(struct starpu_task *task, unsigned target_node, int prio) { #ifdef STARPU_OPENMP struct _starpu_job *j = _starpu_get_job_associated_to_task(task); /* do not attempt to prefetch task input if this is an OpenMP task resuming after blocking */ if (j->discontinuous != 0) return 0; #endif 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; int node = _starpu_task_data_get_node_on_node(task, index, target_node); struct _starpu_data_replicate *replicate = &handle->per_node[node]; prefetch_data_on_node(handle, node, replicate, mode, prio); } return 0; } int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) { int prio = task->priority; if (task->workerorder) prio = INT_MAX - task->workerorder; return starpu_prefetch_task_input_on_node_prio(task, node, prio); } int starpu_idle_prefetch_task_input_on_node_prio(struct starpu_task *task, unsigned target_node, int prio) { 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; int node = _starpu_task_data_get_node_on_node(task, index, target_node); struct _starpu_data_replicate *replicate = &handle->per_node[node]; idle_prefetch_data_on_node(handle, node, replicate, mode, prio); } return 0; } int starpu_idle_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) { int prio = task->priority; if (task->workerorder) prio = INT_MAX - task->workerorder; return starpu_idle_prefetch_task_input_on_node_prio(task, node, prio); } int starpu_prefetch_task_input_for_prio(struct starpu_task *task, unsigned worker, int prio) { #ifdef STARPU_OPENMP struct _starpu_job *j = _starpu_get_job_associated_to_task(task); /* do not attempt to prefetch task input if this is an OpenMP task resuming after blocking */ if (j->discontinuous != 0) return 0; #endif 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; int node = _starpu_task_data_get_node_on_worker(task, index, worker); struct _starpu_data_replicate *replicate = &handle->per_node[node]; prefetch_data_on_node(handle, node, replicate, mode, prio); } return 0; } int starpu_prefetch_task_input_for(struct starpu_task *task, unsigned worker) { int prio = task->priority; if (task->workerorder) prio = INT_MAX - task->workerorder; return starpu_prefetch_task_input_for_prio(task, worker, prio); } int starpu_idle_prefetch_task_input_for_prio(struct starpu_task *task, unsigned worker, int prio) { 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; int node = _starpu_task_data_get_node_on_worker(task, index, worker); struct _starpu_data_replicate *replicate = &handle->per_node[node]; idle_prefetch_data_on_node(handle, node, replicate, mode, prio); } return 0; } int starpu_idle_prefetch_task_input_for(struct starpu_task *task, unsigned worker) { int prio = task->priority; if (task->workerorder) prio = INT_MAX - task->workerorder; return starpu_idle_prefetch_task_input_for_prio(task, worker, prio); } 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]; } /* Callback used when a buffer is send asynchronously to the sink */ static void _starpu_fetch_task_input_cb(void *arg) { struct _starpu_worker * worker = (struct _starpu_worker *) arg; /* increase the number of buffer received */ STARPU_WMB(); (void)STARPU_ATOMIC_ADD(&worker->nb_buffers_transferred, 1); #ifdef STARPU_SIMGRID starpu_pthread_queue_broadcast(&_starpu_simgrid_transfer_queue[worker->memory_node]); #endif } /* Synchronously or asynchronously fetch data for a given task (if it's not there already) * Returns the number of data acquired here. */ /* _starpu_fetch_task_input must be called before * executing the task. __starpu_push_task_output but be called after the * execution of the task. */ /* The driver can either just call _starpu_fetch_task_input with async==0, * or to improve overlapping, it can call _starpu_fetch_task_input with * async==1, then wait for transfers to complete, then call * _starpu_fetch_task_input_tail to complete the fetch. */ int _starpu_fetch_task_input(struct starpu_task *task, struct _starpu_job *j, int async) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); int workerid = worker->workerid; if (async) { worker->task_transferring = task; worker->nb_buffers_transferred = 0; if (worker->ntasks <= 1) _STARPU_TRACE_WORKER_START_FETCH_INPUT(NULL, workerid); } else _STARPU_TRACE_START_FETCH_INPUT(NULL); int profiling = starpu_profiling_status_get(); 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 nacquires; unsigned index; nacquires = 0; 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 = _starpu_task_data_get_node_on_worker(task, descrs[index].index, workerid); /* We set this here for coherency with __starpu_push_task_output */ descrs[index].node = 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); if (async) { ret = _starpu_fetch_data_on_node(handle, node, local_replicate, mode, 0, STARPU_FETCH, 1, _starpu_fetch_task_input_cb, worker, 0, "_starpu_fetch_task_input"); #ifdef STARPU_SIMGRID if (_starpu_simgrid_fetching_input_cost()) starpu_sleep(0.000001); #endif if (STARPU_UNLIKELY(ret)) { /* Ooops, not enough memory, make worker wait for these for now, and the synchronous call will finish by forcing eviction*/ worker->nb_buffers_totransfer = nacquires; _starpu_set_worker_status(worker, STATUS_WAITING); return 0; } } else { ret = fetch_data(handle, node, local_replicate, mode, 0); #ifdef STARPU_SIMGRID if (_starpu_simgrid_fetching_input_cost()) starpu_sleep(0.000001); #endif if (STARPU_UNLIKELY(ret)) goto enomem; } nacquires++; } if (async) { worker->nb_buffers_totransfer = nacquires; _starpu_set_worker_status(worker, STATUS_WAITING); return 0; } _starpu_fetch_task_input_tail(task, j, worker); 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; 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; } /* Now that we have taken the data locks in locking order, fill the codelet interfaces in function order. */ void _starpu_fetch_task_input_tail(struct starpu_task *task, struct _starpu_job *j, struct _starpu_worker *worker) { int workerid = worker->workerid; int profiling = starpu_profiling_status_get(); unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); unsigned index; unsigned long total_size = 0; 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; struct _starpu_data_replicate *local_replicate; int needs_init; local_replicate = get_replicate(handle, mode, workerid, node); _starpu_spin_lock(&handle->header_lock); if (local_replicate->mc) local_replicate->mc->diduse = 1; needs_init = !local_replicate->initialized; _starpu_spin_unlock(&handle->header_lock); _STARPU_TASK_SET_INTERFACE(task , local_replicate->data_interface, descrs[index].index); /* If the replicate was not initialized yet, we have to do it now */ if (!(mode & STARPU_SCRATCH) && needs_init) _starpu_redux_init_data_replicate(handle, local_replicate, workerid); #ifdef STARPU_USE_FXT total_size += _starpu_data_get_size(handle); #endif } _STARPU_TRACE_DATA_LOAD(workerid,total_size); if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_end_time); _STARPU_TRACE_END_FETCH_INPUT(NULL); } /* 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 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; 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++) { /* Note here we just follow what was requested, and not use _starpu_task_data_get_node* */ int node = -1; if (task->cl->specific_nodes) node = STARPU_CODELET_GET_NODE(task->cl, descrs[index].index); descrs[index].node = 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, STARPU_FETCH, 1, _starpu_fetch_nowhere_task_input_cb, wrapper, 0, "_starpu_fetch_nowhere_task_input"); } 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_data_is_on_node(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].request[i]) ret = 1; } } // STARPU_PTHREAD_SPIN_UNLOCK(&handle->header_lock); return ret; } starpu-1.3.9+dfsg/src/datawizard/coherency.h000066400000000000000000000322411413463044200210350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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. */ struct _starpu_data_request *request[STARPU_MAXNODES]; /** Pointer to memchunk for LRU strategy */ struct _starpu_mem_chunk * mc; }; struct _starpu_data_requester_prio_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_prio_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 */ starpu_data_handle_t *active_children; /** The currently active set of read-write children */ starpu_data_handle_t **active_readonly_children; /** The currently active set of read-only children */ unsigned nactive_readonly_children; /** Size of active_readonly_children array */ /** Our siblings in the father partitioning */ unsigned nsiblings; /** How many siblings */ starpu_data_handle_t *siblings; 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 ? */ /** Synchronous partitioning */ 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:1; /** Whether our father is currently partitioned into ourself */ unsigned active:1; unsigned active_ro:1; /** 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; /** Can the data be pushed to the disk? */ unsigned ooc; /** 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_prio_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_prio_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; /** Application-provided coordinates. The maximum dimension (5) is * relatively arbitrary. */ unsigned dimensions; int coordinates[5]; /** 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, enum _starpu_is_prefetch is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg, int prio, const char *origin); /** 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); size_t _starpu_data_get_alloc_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); struct _starpu_worker; STARPU_ATTRIBUTE_WARN_UNUSED_RESULT int _starpu_fetch_task_input(struct starpu_task *task, struct _starpu_job *j, int async); void _starpu_fetch_task_input_tail(struct starpu_task *task, struct _starpu_job *j, struct _starpu_worker *worker); void _starpu_fetch_nowhere_task_input(struct _starpu_job *j); int _starpu_select_src_node(struct _starpu_data_state *state, unsigned destination); int _starpu_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); /** 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, enum _starpu_is_prefetch is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg, int prio, const char *origin); 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.3.9+dfsg/src/datawizard/copy_driver.c000066400000000000000000000426501413463044200214030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #ifdef STARPU_SIMGRID #include #endif void _starpu_wake_all_blocked_workers_on_node(unsigned nodeid) { /* wake up all workers on that memory node */ struct _starpu_memory_node_descr * const descr = _starpu_memory_node_get_description(); const int cur_workerid = starpu_worker_get_id(); struct _starpu_worker *cur_worker = cur_workerid>=0?_starpu_get_worker_struct(cur_workerid):NULL; STARPU_PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->condition_count[nodeid]; unsigned cond_id; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _starpu_cond_and_worker *condition; condition = &descr->conditions_attached_to_node[nodeid][cond_id]; if (condition->worker == cur_worker) { if (condition->cond == &condition->worker->sched_cond) { condition->worker->state_keep_awake = 1; } /* 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->worker->sched_mutex); if (condition->cond == &condition->worker->sched_cond) { condition->worker->state_keep_awake = 1; } STARPU_PTHREAD_COND_BROADCAST(condition->cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&condition->worker->sched_mutex); } STARPU_PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); #ifdef STARPU_SIMGRID starpu_pthread_queue_broadcast(&_starpu_simgrid_transfer_queue[nodeid]); #endif } void starpu_wake_all_blocked_workers(void) { /* workers may be blocked on the various queues' conditions */ struct _starpu_memory_node_descr * const descr = _starpu_memory_node_get_description(); const int cur_workerid = starpu_worker_get_id(); struct _starpu_worker *cur_worker = cur_workerid>=0?_starpu_get_worker_struct(cur_workerid):NULL; STARPU_PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->total_condition_count; unsigned cond_id; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _starpu_cond_and_worker *condition; condition = &descr->conditions_all[cond_id]; if (condition->worker == cur_worker) { if (condition->cond == &condition->worker->sched_cond) { condition->worker->state_keep_awake = 1; } /* 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->worker->sched_mutex); if (condition->cond == &condition->worker->sched_cond) { condition->worker->state_keep_awake = 1; } STARPU_PTHREAD_COND_BROADCAST(condition->cond); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&condition->worker->sched_mutex); } STARPU_PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); #ifdef STARPU_SIMGRID unsigned workerid, nodeid; for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) starpu_pthread_queue_broadcast(&_starpu_simgrid_task_queue[workerid]); for (nodeid = 0; nodeid < starpu_memory_nodes_get_count(); nodeid++) starpu_pthread_queue_broadcast(&_starpu_simgrid_transfer_queue[nodeid]); #endif } #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 = (unsigned)src_replicate->memory_node; unsigned dst_node = (unsigned)dst_replicate->memory_node; STARPU_ASSERT(src_replicate->refcnt); STARPU_ASSERT(dst_replicate->refcnt); STARPU_ASSERT(src_replicate->allocated); STARPU_ASSERT(dst_replicate->allocated); #ifdef STARPU_SIMGRID if (src_node == STARPU_MAIN_RAM || dst_node == STARPU_MAIN_RAM) _starpu_simgrid_data_transfer(handle->ops->get_size(handle), src_node, dst_node); return _starpu_simgrid_transfer(handle->ops->get_size(handle), src_node, dst_node, req); #else /* !SIMGRID */ enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); void *src_interface = src_replicate->data_interface; void *dst_interface = dst_replicate->data_interface; #if defined(STARPU_USE_CUDA) && defined(STARPU_HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); 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 destination */ devid = starpu_memory_node_get_devid(dst_node); } 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 struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(src_node); if (node_ops && node_ops->copy_interface_to[dst_kind]) { return node_ops->copy_interface_to[dst_kind](handle, src_interface, src_node, dst_interface, dst_node, req); } else { STARPU_ABORT_MSG("No copy_interface_to function defined from node %s to node %s\n", _starpu_node_get_prefix(starpu_node_get_kind(src_node)), _starpu_node_get_prefix(starpu_node_get_kind(dst_node))); } #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, enum _starpu_is_prefetch 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 : STARPU_FETCH); 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; } void starpu_interface_data_copy(unsigned src_node, unsigned dst_node, size_t size) { _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); } void starpu_interface_start_driver_copy_async(unsigned src_node, unsigned dst_node, double *start) { *start = starpu_timing_now(); _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); } void starpu_interface_end_driver_copy_async(unsigned src_node, unsigned dst_node, double start) { double end = starpu_timing_now(); double elapsed = end - start; if (elapsed > 300) { static int warned = 0; STARPU_HG_DISABLE_CHECKING(warned); if (!warned) { char src_name[16], dst_name[16]; warned = 1; starpu_memory_node_get_name(src_node, src_name, sizeof(src_name)); starpu_memory_node_get_name(dst_node, dst_name, sizeof(dst_name)); _STARPU_DISP("Warning: the submission of asynchronous transfer from %s to %s took a very long time (%f ms)\nFor proper asynchronous transfer overlapping, data registered to StarPU must be allocated with starpu_malloc() or pinned with starpu_memory_pin()\n", src_name, dst_name, elapsed / 1000.); } } _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } /* 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 dst_kind = starpu_node_get_kind(dst_node); struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(src_node); if (node_ops && node_ops->copy_data_to[dst_kind]) { return node_ops->copy_data_to[dst_kind](src, src_offset, src_node, dst, dst_offset, dst_node, size, async_channel); } else { STARPU_ABORT_MSG("No copy_data_to function defined from node %s to node %s\n", _starpu_node_get_prefix(starpu_node_get_kind(src_node)), _starpu_node_get_prefix(starpu_node_get_kind(dst_node))); return -1; } } int starpu_interface_copy2d(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, void *async_data) { int ret = 0; unsigned i; struct _starpu_async_channel *async_channel = async_data; enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(src_node); STARPU_ASSERT_MSG(ld_src >= blocksize, "block size %lu is bigger than ld %lu in source", (unsigned long) blocksize, (unsigned long) ld_src); STARPU_ASSERT_MSG(ld_dst >= blocksize, "block size %lu is bigger than ld %lu in destination", (unsigned long) blocksize, (unsigned long) ld_dst); if (ld_src == blocksize && ld_dst == blocksize) /* Optimize contiguous case */ return starpu_interface_copy(src, src_offset, src_node, dst, dst_offset, dst_node, blocksize * numblocks, async_data); if (node_ops && node_ops->copy2d_data_to[dst_kind]) /* Hardware-optimized non-contiguous case */ return node_ops->copy2d_data_to[dst_kind](src, src_offset, src_node, dst, dst_offset, dst_node, blocksize, numblocks, ld_src, ld_dst, async_channel); for (i = 0; i < numblocks; i++) { if (starpu_interface_copy(src, src_offset + i*ld_src, src_node, dst, dst_offset + i*ld_dst, dst_node, blocksize, async_data)) ret = -EAGAIN; } return ret; } int starpu_interface_copy3d(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, void *async_data) { int ret = 0; unsigned i; struct _starpu_async_channel *async_channel = async_data; enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(src_node); STARPU_ASSERT_MSG(ld1_src >= blocksize, "block size %lu is bigger than ld %lu in source", (unsigned long) blocksize, (unsigned long) ld1_src); STARPU_ASSERT_MSG(ld1_dst >= blocksize, "block size %lu is bigger than ld %lu in destination", (unsigned long) blocksize, (unsigned long) ld1_dst); STARPU_ASSERT_MSG(ld2_src >= numblocks_1 * ld1_src, "block group size %lu is bigger than group ld %lu in source", (unsigned long) numblocks_1 * ld1_src, (unsigned long) ld2_src); STARPU_ASSERT_MSG(ld2_dst >= numblocks_1 * ld1_dst, "block group size %lu is bigger than group ld %lu in destination", (unsigned long) numblocks_1 * ld1_dst, (unsigned long) ld2_dst); if (ld2_src == blocksize * numblocks_1 && ld2_dst == blocksize * numblocks_1) /* Optimize contiguous case */ return starpu_interface_copy(src, src_offset, src_node, dst, dst_offset, dst_node, blocksize * numblocks_1 * numblocks_2, async_data); if (node_ops && node_ops->copy3d_data_to[dst_kind]) /* Hardware-optimized non-contiguous case */ return node_ops->copy3d_data_to[dst_kind](src, src_offset, src_node, dst, dst_offset, dst_node, blocksize, numblocks_1, ld1_src, ld1_dst, numblocks_2, ld2_src, ld2_dst, async_channel); for (i = 0; i < numblocks_2; i++) { if (starpu_interface_copy2d(src, src_offset + i*ld2_src, src_node, dst, dst_offset + i*ld2_dst, dst_node, blocksize, numblocks_1, ld1_src, ld1_dst, async_data)) ret = -EAGAIN; } return ret; } int starpu_interface_copy4d(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, size_t numblocks_3, size_t ld3_src, size_t ld3_dst, void *async_data) { int ret = 0; unsigned i; STARPU_ASSERT_MSG(ld1_src >= blocksize, "block size %lu is bigger than ld %lu in source", (unsigned long) blocksize, (unsigned long) ld1_src); STARPU_ASSERT_MSG(ld1_dst >= blocksize, "block size %lu is bigger than ld %lu in destination", (unsigned long) blocksize, (unsigned long) ld1_dst); STARPU_ASSERT_MSG(ld2_src >= numblocks_1 * ld1_src, "block group size %lu is bigger than group ld %lu in source", (unsigned long) numblocks_1 * ld1_src, (unsigned long) ld2_src); STARPU_ASSERT_MSG(ld2_dst >= numblocks_1 * ld1_dst, "block group size %lu is bigger than group ld %lu in destination", (unsigned long) numblocks_1 * ld1_dst, (unsigned long) ld2_dst); STARPU_ASSERT_MSG(ld3_src >= numblocks_2 * ld2_src, "block group group size %lu is bigger than group group ld %lu in source", (unsigned long) numblocks_2 * ld2_src, (unsigned long) ld3_src); STARPU_ASSERT_MSG(ld3_dst >= numblocks_2 * ld2_dst, "block group group size %lu is bigger than group group ld %lu in destination", (unsigned long) numblocks_2 * ld2_dst, (unsigned long) ld3_dst); if (ld3_src == blocksize * numblocks_1 * numblocks_2 && ld3_dst == blocksize * numblocks_1 * numblocks_2) /* Optimize contiguous case */ return starpu_interface_copy(src, src_offset, src_node, dst, dst_offset, dst_node, blocksize * numblocks_1 * numblocks_2 * numblocks_3, async_data); /* Probably won't ever have a 4D interface in drivers :) */ for (i = 0; i < numblocks_3; i++) { if (starpu_interface_copy3d(src, src_offset + i*ld3_src, src_node, dst, dst_offset + i*ld3_dst, dst_node, blocksize, numblocks_1, ld1_src, ld1_dst, numblocks_2, ld2_src, ld2_dst, async_data)) ret = -EAGAIN; } return ret; } void _starpu_driver_wait_request_completion(struct _starpu_async_channel *async_channel) { #ifdef STARPU_SIMGRID _starpu_simgrid_wait_transfer_event(&async_channel->event); #else /* !SIMGRID */ struct _starpu_node_ops *node_ops = async_channel->node_ops; if (node_ops && node_ops->wait_request_completion != NULL) { node_ops->wait_request_completion(async_channel); } else { STARPU_ABORT_MSG("No wait_request_completion function defined for node %s\n", node_ops?node_ops->name:"unknown"); } #endif /* !SIMGRID */ } unsigned _starpu_driver_test_request_completion(struct _starpu_async_channel *async_channel) { #ifdef STARPU_SIMGRID return _starpu_simgrid_test_transfer_event(&async_channel->event); #else /* !SIMGRID */ struct _starpu_node_ops *node_ops = async_channel->node_ops; if (node_ops && node_ops->test_request_completion != NULL) { return node_ops->test_request_completion(async_channel); } else { STARPU_ABORT_MSG("No test_request_completion function defined for node %s\n", node_ops?node_ops->name:"unknown"); } #endif /* !SIMGRID */ } starpu-1.3.9+dfsg/src/datawizard/copy_driver.h000066400000000000000000000074041413463044200214060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #ifdef HAVE_AIO_H #include #endif #include #include #ifdef STARPU_USE_CUDA #include #include #endif #ifdef STARPU_USE_OPENCL #include #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE #include #endif #ifdef __cplusplus extern "C" { #endif struct _starpu_data_request; struct _starpu_data_replicate; enum _starpu_is_prefetch { /** A task really needs it now! */ STARPU_FETCH = 0, /** It is a good idea to have it asap */ STARPU_PREFETCH = 1, /** Get this here when you have time to */ STARPU_IDLEFETCH = 2, STARPU_NFETCH }; #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 #ifdef STARPU_USE_MPI_MASTER_SLAVE LIST_TYPE(_starpu_mpi_ms_event_request, MPI_Request request; ); struct _starpu_mpi_ms_async_event { int is_sender; struct _starpu_mpi_ms_event_request_list * requests; }; #endif LIST_TYPE(_starpu_disk_backend_event, void *backend_event; ); struct _starpu_disk_async_event { unsigned memory_node; struct _starpu_disk_backend_event_list * requests; void * ptr; unsigned node; size_t size; starpu_data_handle_t handle; }; /** 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_queue_t *queue; }; #endif #ifdef STARPU_USE_CUDA cudaEvent_t cuda_event; #endif #ifdef STARPU_USE_OPENCL cl_event opencl_event; #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE struct _starpu_mpi_ms_async_event mpi_ms_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; struct _starpu_node_ops *node_ops; /** Which node to polling when needing ACK msg */ struct _starpu_mp_node *polling_node_sender; struct _starpu_mp_node *polling_node_receiver; /** Used to know if the acknowlegdment msg is arrived from sinks */ volatile int starpu_mp_common_finished_sender; volatile int starpu_mp_common_finished_receiver; }; 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, enum _starpu_is_prefetch 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.3.9+dfsg/src/datawizard/data_request.c000066400000000000000000000671461413463044200215460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* requests that have not been treated at all */ static struct _starpu_data_request_prio_list data_requests[STARPU_MAXNODES]; static struct _starpu_data_request_prio_list prefetch_requests[STARPU_MAXNODES]; static struct _starpu_data_request_prio_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_prio_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_prio_list_init(&data_requests[i]); _starpu_data_request_prio_list_init(&prefetch_requests[i]); _starpu_data_request_prio_list_init(&idle_requests[i]); #ifndef STARPU_DEBUG /* 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].tree.root); STARPU_HG_DISABLE_CHECKING(prefetch_requests[i].tree.root); STARPU_HG_DISABLE_CHECKING(idle_requests[i].tree.root); #endif STARPU_PTHREAD_MUTEX_INIT(&data_requests_list_mutex[i], NULL); _starpu_data_request_prio_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_data_request_prio_list_deinit(&data_requests[i]); _starpu_data_request_prio_list_deinit(&prefetch_requests[i]); _starpu_data_request_prio_list_deinit(&idle_requests[i]); STARPU_PTHREAD_MUTEX_DESTROY(&data_requests_pending_list_mutex[i]); _starpu_data_request_prio_list_deinit(&data_requests_pending[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) { //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, enum _starpu_is_prefetch is_prefetch, int prio, unsigned is_write_invalidation, const char *origin) { struct _starpu_data_request *r = _starpu_data_request_new(); _starpu_spin_checklocked(&handle->header_lock); _starpu_spin_init(&r->lock); _STARPU_TRACE_DATA_REQUEST_CREATED(handle, src_replicate?src_replicate->memory_node:-1, dst_replicate?dst_replicate->memory_node:-1, prio, is_prefetch); r->origin = origin; r->handle = handle; r->src_replicate = src_replicate; r->dst_replicate = dst_replicate; r->mode = mode; r->async_channel.node_ops = NULL; r->async_channel.starpu_mp_common_finished_sender = 0; r->async_channel.starpu_mp_common_finished_receiver = 0; r->async_channel.polling_node_sender = NULL; r->async_channel.polling_node_receiver = NULL; #ifdef STARPU_USE_MPI_MASTER_SLAVE r->async_channel.event.mpi_ms_event.requests = NULL; #endif if (handling_node == -1) handling_node = STARPU_MAIN_RAM; r->handling_node = handling_node; STARPU_ASSERT(starpu_node_get_kind(handling_node) == STARPU_CPU_RAM || _starpu_memory_node_get_nworkers(handling_node)); r->completed = 0; r->prefetch = is_prefetch; r->prio = prio; 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; #ifdef STARPU_SIMGRID unsigned local_node = starpu_worker_get_local_memory_node(); starpu_pthread_wait_t wait; starpu_pthread_wait_init(&wait); /* We need to get woken both when requests finish on our node, and on * the target node of the request we are waiting for */ starpu_pthread_queue_register(&wait, &_starpu_simgrid_transfer_queue[local_node]); starpu_pthread_queue_register(&wait, &_starpu_simgrid_transfer_queue[(unsigned) r->dst_replicate->memory_node]); #endif 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 { #ifdef STARPU_SIMGRID starpu_pthread_wait_reset(&wait); #endif 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_SIMGRID #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 #endif _starpu_datawizard_progress(may_alloc); #ifdef STARPU_SIMGRID starpu_pthread_wait_wait(&wait); #endif } while (1); if (worker) { _starpu_set_worker_status(worker, old_status); } #ifdef STARPU_SIMGRID starpu_pthread_queue_unregister(&wait, &_starpu_simgrid_transfer_queue[local_node]); starpu_pthread_queue_unregister(&wait, &_starpu_simgrid_transfer_queue[(unsigned) r->dst_replicate->memory_node]); starpu_pthread_wait_destroy(&wait); #endif 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; STARPU_ASSERT(starpu_node_get_kind(handling_node) == STARPU_CPU_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 == STARPU_IDLEFETCH) _starpu_data_request_prio_list_push_back(&idle_requests[handling_node], r); else if (r->prefetch > STARPU_FETCH) _starpu_data_request_prio_list_push_back(&prefetch_requests[handling_node], r); else _starpu_data_request_prio_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; #ifdef STARPU_SIMGRID /* Wake potential worker which was waiting for it */ if (dst_replicate) _starpu_wake_all_blocked_workers_on_node(dst_replicate->memory_node); #endif /* 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, enum _starpu_is_prefetch 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_prio_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_prio_list *reqlist, unsigned src_node, unsigned may_alloc, unsigned n, unsigned *pushed, enum _starpu_is_prefetch prefetch) { struct _starpu_data_request *r; struct _starpu_data_request_prio_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_prio_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_prio_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_prio_list local_list = reqlist[src_node]; _starpu_data_request_prio_list_init(&reqlist[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); for (i = 0; i <= prefetch; i++) _starpu_data_request_prio_list_init(&new_data_requests[i]); double start = starpu_timing_now(); /* for all entries of the list */ while (!_starpu_data_request_prio_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_prio_list_pop_front_highest(&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_prio_list_push_back(&new_data_requests[r->prefetch], r); if (prefetch > STARPU_FETCH) /* 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_prio_list_empty(&local_list)) { r = _starpu_data_request_prio_list_pop_front_highest(&local_list); /* Prefetch requests might have gotten promoted while in tmp list */ _starpu_data_request_prio_list_push_back(&new_data_requests[r->prefetch], r); } _starpu_data_request_prio_list_deinit(&local_list); for (i = 0; i <= prefetch; i++) if (!_starpu_data_request_prio_list_empty(&new_data_requests[i])) break; if (i <= prefetch) { STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); if (!(_starpu_data_request_prio_list_empty(&new_data_requests[STARPU_FETCH]))) { _starpu_data_request_prio_list_push_prio_list_back(&new_data_requests[STARPU_FETCH], &data_requests[src_node]); data_requests[src_node] = new_data_requests[STARPU_FETCH]; } if (prefetch >= STARPU_PREFETCH && !(_starpu_data_request_prio_list_empty(&new_data_requests[STARPU_PREFETCH]))) { _starpu_data_request_prio_list_push_prio_list_back(&new_data_requests[STARPU_PREFETCH], &prefetch_requests[src_node]); prefetch_requests[src_node] = new_data_requests[STARPU_PREFETCH]; } if (prefetch >= STARPU_IDLEFETCH && !(_starpu_data_request_prio_list_empty(&new_data_requests[STARPU_IDLEFETCH]))) { _starpu_data_request_prio_list_push_prio_list_back(&new_data_requests[STARPU_IDLEFETCH], &idle_requests[src_node]); idle_requests[src_node] = new_data_requests[STARPU_IDLEFETCH]; } STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); #ifdef STARPU_SIMGRID if (*pushed) { /* We couldn't process the request due to missing * space. Advance the clock a bit to let eviction have * the time to make some room for us. Ideally we should * rather have the caller block, and explicitly wait * for eviction to happen. */ starpu_sleep(0.000001); _starpu_wake_all_blocked_workers_on_node(src_node); } #elif !defined(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, STARPU_FETCH); } 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, STARPU_PREFETCH); } 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, STARPU_IDLEFETCH); } 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_prio_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_prio_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_prio_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_prio_list local_list = data_requests_pending[src_node]; _starpu_data_request_prio_list_init(&data_requests_pending[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); _starpu_data_request_prio_list_init(&new_data_requests_pending); taken = 0; kept = 0; while (!_starpu_data_request_prio_list_empty(&local_list)) { struct _starpu_data_request *r; r = _starpu_data_request_prio_list_pop_front_highest(&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_prio_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_prio_list_push_back(&new_data_requests_pending, r); kept++; } } } _starpu_data_request_prio_list_deinit(&local_list); STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]); data_requests_npending[src_node] -= taken - kept; if (kept) _starpu_data_request_prio_list_push_prio_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_prio_list_empty(&data_requests[node]) && _starpu_data_request_prio_list_empty(&prefetch_requests[node]) && _starpu_data_request_prio_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, enum _starpu_is_prefetch 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. */ if (_starpu_data_request_prio_list_ismember(&prefetch_requests[r->handling_node], r)) { _starpu_data_request_prio_list_erase(&prefetch_requests[r->handling_node],r); _starpu_data_request_prio_list_push_back(&data_requests[r->handling_node],r); } /* 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. */ else if (_starpu_data_request_prio_list_ismember(&idle_requests[r->handling_node], r)) { _starpu_data_request_prio_list_erase(&idle_requests[r->handling_node],r); if (prefetch >= STARPU_PREFETCH) _starpu_data_request_prio_list_push_back(&prefetch_requests[r->handling_node],r); else _starpu_data_request_prio_list_push_back(&data_requests[r->handling_node],r); } 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.3.9+dfsg/src/datawizard/data_request.h000066400000000000000000000132421413463044200215370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /** @file */ /* This one includes us, so make sure to include it first */ #include #ifndef __DATA_REQUEST_H__ #define __DATA_REQUEST_H__ #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 /** Maximum time in us that we can afford pushing requests before going back to the driver loop, e.g. for checking GPU task termination */ #define MAX_PUSH_TIME 1000 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; const char *origin; /** Name of the function that triggered the request */ 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 */ enum _starpu_is_prefetch prefetch; /** Priority of the request. Default is 0 */ int prio; /** 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; ) PRIO_LIST_TYPE(_starpu_data_request, prio) /** 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; int prio; /** 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; ) PRIO_LIST_TYPE(_starpu_data_requester, prio) 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, enum _starpu_is_prefetch is_prefetch, int prio, unsigned is_write_invalidation, const char *origin) 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, enum _starpu_is_prefetch prefetch); #endif // __DATA_REQUEST_H__ starpu-1.3.9+dfsg/src/datawizard/datastats.c000066400000000000000000000066741413463044200210540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 int _starpu_enable_stats = 0; void _starpu_datastats_init() { _starpu_enable_stats = !!starpu_getenv("STARPU_ENABLE_STATS"); } /* measure the cache hit ratio for each node */ static unsigned hit_cnt[STARPU_MAXNODES]; static unsigned miss_cnt[STARPU_MAXNODES]; void __starpu_msi_cache_hit(unsigned node) { STARPU_HG_DISABLE_CHECKING(hit_cnt[node]); hit_cnt[node]++; } void __starpu_msi_cache_miss(unsigned node) { STARPU_HG_DISABLE_CHECKING(miss_cnt[node]); miss_cnt[node]++; } void _starpu_display_msi_stats(FILE *stream) { if (!starpu_enable_stats()) return; 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]) { char name[128]; starpu_memory_node_get_name(node, name, sizeof(name)); fprintf(stream, "memory node %s\n", name); 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"); } /* measure the efficiency of our allocation cache */ static unsigned alloc_cnt[STARPU_MAXNODES]; static unsigned alloc_cache_hit_cnt[STARPU_MAXNODES]; void __starpu_allocation_cache_hit(unsigned node) { STARPU_HG_DISABLE_CHECKING(alloc_cache_hit_cnt[node]); alloc_cache_hit_cnt[node]++; } void __starpu_data_allocation_inc_stats(unsigned node) { STARPU_HG_DISABLE_CHECKING(alloc_cnt[node]); alloc_cnt[node]++; } void _starpu_display_alloc_cache_stats(FILE *stream) { if (!starpu_enable_stats()) return; fprintf(stream, "\n#---------------------\n"); fprintf(stream, "Allocation cache stats:\n"); unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { if (alloc_cnt[node]) { char name[128]; starpu_memory_node_get_name(node, name, sizeof(name)); fprintf(stream, "memory node %s\n", name); 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])); } } fprintf(stream, "#---------------------\n"); } starpu-1.3.9+dfsg/src/datawizard/datastats.h000066400000000000000000000035261413463044200210520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #include #include extern int _starpu_enable_stats; void _starpu_datastats_init(); static inline int starpu_enable_stats(void) { return _starpu_enable_stats; } void __starpu_msi_cache_hit(unsigned node); void __starpu_msi_cache_miss(unsigned node); #define _starpu_msi_cache_hit(node) do { \ if (starpu_enable_stats()) \ __starpu_msi_cache_hit(node); \ } while (0) #define _starpu_msi_cache_miss(node) do { \ if (starpu_enable_stats()) \ __starpu_msi_cache_miss(node); \ } while (0) 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); #define _starpu_allocation_cache_hit(node) do { \ if (starpu_enable_stats()) \ __starpu_allocation_cache_hit(node); \ } while (0) #define _starpu_data_allocation_inc_stats(node) do { \ if (starpu_enable_stats()) \ __starpu_data_allocation_inc_stats(node); \ } while (0) void _starpu_display_alloc_cache_stats(FILE *stream); #endif // __DATASTATS_H__ starpu-1.3.9+dfsg/src/datawizard/datawizard.c000066400000000000000000000064331413463044200212070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_SIMGRID #include #endif int ___starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc, unsigned push_requests) { int ret = 0; #ifdef STARPU_SIMGRID /* XXX */ starpu_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; } int __starpu_datawizard_progress(unsigned may_alloc, unsigned push_requests) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); unsigned memnode; if (!worker) { /* Call from main application, only make RAM requests progress */ int ret = 0; int nnumas = starpu_memory_nodes_get_numa_count(); int numa; for (numa = 0; numa < nnumas; numa++) ret |= ___starpu_datawizard_progress(numa, may_alloc, push_requests); return ret; } /* processing requests may release some tasks, we cannot be already * scheduling a task. */ STARPU_ASSERT(!worker->state_sched_op_pending); if (worker->set) /* Runing one of the workers of a worker set. The reference for * driving memory is its worker 0 (see registrations in topology.c) */ worker = &worker->set->workers[0]; unsigned current_worker_id = worker->workerid; int ret = 0; unsigned nnodes = starpu_memory_nodes_get_count(); for (memnode = 0; memnode < nnodes; memnode++) { if (_starpu_worker_drives_memory[current_worker_id][memnode] == 1) ret |= ___starpu_datawizard_progress(memnode, may_alloc, push_requests); } return ret; } void _starpu_datawizard_progress(unsigned may_alloc) { __starpu_datawizard_progress(may_alloc, 1); } starpu-1.3.9+dfsg/src/datawizard/datawizard.h000066400000000000000000000025251413463044200212120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #include #include #include #include #include #include #include #include int ___starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc, unsigned push_requests); int __starpu_datawizard_progress(unsigned may_alloc, unsigned push_requests); void _starpu_datawizard_progress(unsigned may_alloc); #endif // __DATAWIZARD_H__ starpu-1.3.9+dfsg/src/datawizard/filters.c000066400000000000000000001170261413463044200205260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 STARPU_VERBOSE #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 home_node = initial_handle->home_node; if (home_node < 0 || (starpu_node_get_kind(home_node) != STARPU_CPU_RAM)) home_node = STARPU_MAIN_RAM; int ret = _starpu_allocate_memory_on_node(initial_handle, &initial_handle->per_node[home_node], STARPU_FETCH); #ifdef STARPU_DEVEL #warning we should reclaim memory if allocation failed #endif STARPU_ASSERT(!ret); } for (node = 0; node < STARPU_MAXNODES; node++) _starpu_data_unregister_ram_pointer(initial_handle, node); 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->active = inherit_state; child->active_ro = 0; child->mpi_data = NULL; child->root_handle = initial_handle->root_handle; child->father_handle = initial_handle; child->active_children = NULL; child->active_readonly_children = NULL; child->nactive_readonly_children = 0; child->nsiblings = nparts; if (inherit_state) child->siblings = NULL; else child->siblings = childrenp; 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_prio_list_init(&child->req_list); _starpu_data_requester_prio_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; child->ooc = initial_handle->ooc; 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_prio_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); for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; void *ptr = starpu_data_handle_to_pointer(child, node); 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_alloc_size(child_handle); if (child_handle->unregister_hook) { child_handle->unregister_hook(child_handle); } for (node = 0; node < STARPU_MAXNODES; node++) _starpu_data_unregister_ram_pointer(child_handle, node); 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); } for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; ptr = starpu_data_handle_to_pointer(root_handle, node); 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_alloc_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); } /* Set the initialized state */ starpu_data_handle_t first_child = starpu_data_get_child(root_handle, 0); root_handle->initialized = first_child->initialized; for (child = 1; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); STARPU_ASSERT_MSG(child_handle->initialized == root_handle->initialized, "Inconsistent state between children initialization"); } if (root_handle->initialized) { for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *root_replicate; root_replicate = &root_handle->per_node[node]; root_replicate->initialized = still_valid[node]; } } 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; starpu_data_handle_t *children; 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; _STARPU_MALLOC(children, nparts * sizeof(*children)); for (i = 0; i < nparts; i++) { _STARPU_CALLOC(children[i], 1, sizeof(struct _starpu_data_state)); childrenp[i] = children[i]; } _starpu_data_partition(initial_handle, children, 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->flags = STARPU_CODELET_NOPLANS; 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; if (children[0]->active) { #ifdef STARPU_DEVEL #warning FIXME: better choose gathering node #endif starpu_data_unpartition_submit(root_handle, nparts, children, STARPU_MAIN_RAM); } free(children[0]->siblings); for (i = 0; i < nparts; i++) { children[i]->siblings = NULL; starpu_data_unregister_submit(children[i]); } _starpu_spin_lock(&root_handle->header_lock); root_handle->nplans--; _starpu_spin_unlock(&root_handle->header_lock); } static void _starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, unsigned char *handles_sequential_consistency) { unsigned i; 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"); STARPU_ASSERT_MSG(nparts > 0, "One can't partition into 0 parts"); initial_handle->partitioned++; initial_handle->active_children = children[0]->siblings; _starpu_spin_unlock(&initial_handle->header_lock); for (i = 0; i < nparts; i++) { _starpu_spin_lock(&children[i]->header_lock); children[i]->active = 1; _starpu_spin_unlock(&children[i]->header_lock); } if (!initial_handle->initialized) /* No need for coherency, it is not initialized */ return; struct starpu_data_descr descr[nparts]; for (i = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "child(%d) %p is partitioned from %p and not from the given parameter %p", i, children[i], children[i]->father_handle, initial_handle); descr[i].handle = children[i]; descr[i].mode = STARPU_W; } /* TODO: assert nparts too */ int ret; if (handles_sequential_consistency) ret = starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts, STARPU_NAME, "partition", STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, handles_sequential_consistency, 0); else ret = starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts, STARPU_NAME, "partition", 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); if (!handles_sequential_consistency || handles_sequential_consistency[0]) _starpu_data_invalidate_submit_noplan(initial_handle); } void starpu_data_partition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int sequential_consistency) { unsigned i; unsigned char handles_sequential_consistency[nparts+1]; handles_sequential_consistency[0] = sequential_consistency; for(i=1 ; isequential_consistency; _starpu_data_partition_submit(initial_handle, nparts, children, handles_sequential_consistency); } void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) { _starpu_data_partition_submit(initial_handle, nparts, children, NULL); } void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children) { unsigned i; 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"); STARPU_ASSERT_MSG(nparts > 0, "One can't partition into 0 parts"); initial_handle->partitioned++; initial_handle->readonly = 1; if (initial_handle->nactive_readonly_children < initial_handle->partitioned) { _STARPU_REALLOC(initial_handle->active_readonly_children, initial_handle->partitioned * sizeof(initial_handle->active_readonly_children[0])); initial_handle->nactive_readonly_children = initial_handle->partitioned; } initial_handle->active_readonly_children[initial_handle->partitioned-1] = children[0]->siblings; _starpu_spin_unlock(&initial_handle->header_lock); for (i = 0; i < nparts; i++) { _starpu_spin_lock(&children[i]->header_lock); children[i]->active = 1; children[i]->active_ro = 1; _starpu_spin_unlock(&children[i]->header_lock); } STARPU_ASSERT_MSG(initial_handle->initialized, "It is odd to read-only-partition a data which does not have a value yet"); struct starpu_data_descr descr[nparts]; for (i = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "child(%d) %p is partitioned from %p and not from the given parameter %p", i, children[i], children[i]->father_handle, initial_handle); 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"); STARPU_ASSERT_MSG(nparts > 0, "One can't partition into 0 parts"); initial_handle->readonly = 0; initial_handle->active_children = initial_handle->active_readonly_children[0]; initial_handle->active_readonly_children[0] = NULL; _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, "child(%d) %p is partitioned from %p and not from the given parameter %p", i, children[i], children[i]->father_handle, initial_handle); children[i]->active_ro = 0; 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_noplan(initial_handle); } void _starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node, unsigned char *handles_sequential_consistency, void (*callback_func)(void *), void *callback_arg) { unsigned i; 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 handle %p", initial_handle); STARPU_ASSERT_MSG(nparts > 0, "One can't partition into 0 parts"); if (initial_handle->readonly) { /* Replace this children set with the last set in the list of readonly children sets */ for (i = 0; i < initial_handle->partitioned-1; i++) { if (initial_handle->active_readonly_children[i] == children[0]->siblings) { initial_handle->active_readonly_children[i] = initial_handle->active_readonly_children[initial_handle->partitioned-1]; initial_handle->active_readonly_children[initial_handle->partitioned-1] = NULL; break; } } } else { initial_handle->active_children = NULL; } initial_handle->partitioned--; if (!initial_handle->partitioned) initial_handle->readonly = 0; initial_handle->active_children = NULL; _starpu_spin_unlock(&initial_handle->header_lock); for (i = 0; i < nparts; i++) { _starpu_spin_lock(&children[i]->header_lock); children[i]->active = 0; children[i]->active_ro = 0; _starpu_spin_unlock(&children[i]->header_lock); } unsigned n; struct starpu_data_descr descr[nparts]; for (i = 0, n = 0; i < nparts; i++) { STARPU_ASSERT_MSG(children[i]->father_handle == initial_handle, "child(%d) %p is partitioned from %p and not from the given parameter %p", i, children[i], children[i]->father_handle, initial_handle); 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 */ int ret; if (handles_sequential_consistency) ret = starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n, STARPU_NAME, "unpartition", STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, handles_sequential_consistency, STARPU_CALLBACK_WITH_ARG_NFREE, callback_func, callback_arg, 0); else ret = starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n, STARPU_NAME, "unpartition", STARPU_CALLBACK_WITH_ARG_NFREE, callback_func, callback_arg, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); for (i = 0; i < nparts; i++) { if (!handles_sequential_consistency || handles_sequential_consistency[i+1]) _starpu_data_invalidate_submit_noplan(children[i]); } } void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node) { _starpu_data_unpartition_submit(initial_handle, nparts, children, gather_node, NULL, NULL, NULL); } void starpu_data_unpartition_submit_sequential_consistency_cb(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node, int sequential_consistency, void (*callback_func)(void *), void *callback_arg) { unsigned i; unsigned char handles_sequential_consistency[nparts+1]; handles_sequential_consistency[0] = sequential_consistency; for(i=1 ; isequential_consistency; _starpu_data_unpartition_submit(initial_handle, nparts, children, gather_node, handles_sequential_consistency, callback_func, callback_arg); } void starpu_data_unpartition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node, int sequential_consistency) { unsigned i; unsigned char handles_sequential_consistency[nparts+1]; handles_sequential_consistency[0] = sequential_consistency; for(i=1 ; isequential_consistency; _starpu_data_unpartition_submit(initial_handle, nparts, children, gather_node, handles_sequential_consistency, NULL, NULL); } 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 handle %p", initial_handle); STARPU_ASSERT_MSG(nparts > 0, "One can't partition into 0 parts"); 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, "child(%d) %p is partitioned from %p and not from the given parameter %p", i, children[i], children[i]->father_handle, initial_handle); 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); } /* Unpartition everything below ancestor */ void starpu_data_unpartition_submit_r(starpu_data_handle_t ancestor, int gathering_node) { unsigned i, j, nsiblings; if (!ancestor->partitioned) /* It's already unpartitioned */ return; _STARPU_DEBUG("ancestor %p needs unpartitioning\n", ancestor); if (ancestor->readonly) { unsigned n = ancestor->partitioned; /* Uh, has to go through all read-only partitions */ for (i = 0; i < n; i++) { /* Note: active_readonly_children is emptied by starpu_data_unpartition_submit_r calls below, that's why we always refer to [0] here */ starpu_data_handle_t *children = ancestor->active_readonly_children[0]; _STARPU_DEBUG("unpartition readonly children %p etc.\n", children[0]); nsiblings = children[0]->nsiblings; for (j = 0; j < nsiblings; j++) { /* Make sure our children are unpartitioned */ starpu_data_unpartition_submit_r(children[j], gathering_node); } /* And unpartition them */ starpu_data_unpartition_submit(ancestor, nsiblings, children, gathering_node); } } else { _STARPU_DEBUG("unpartition children %p\n", ancestor->active_children); /* Only one partition */ nsiblings = ancestor->active_children[0]->nsiblings; for (i = 0; i < nsiblings; i++) starpu_data_unpartition_submit_r(ancestor->active_children[i], gathering_node); /* And unpartition ourself */ starpu_data_unpartition_submit(ancestor, nsiblings, ancestor->active_children, gathering_node); } } /* Make ancestor partition itself properly for target */ static void _starpu_data_partition_access_look_up(starpu_data_handle_t ancestor, starpu_data_handle_t target, int write) { /* First make sure ancestor has proper state, if not, ask father */ if (!ancestor->active || (write && ancestor->active_ro)) { /* (The root is always active-rw) */ STARPU_ASSERT(ancestor->father_handle); _STARPU_DEBUG("ancestor %p is not ready: %s, asking father %p\n", ancestor, ancestor->active ? ancestor->active_ro ? "RO" : "RW" : "NONE", ancestor->father_handle); _starpu_data_partition_access_look_up(ancestor->father_handle, ancestor, write); _STARPU_DEBUG("ancestor %p is now ready\n", ancestor); } else _STARPU_DEBUG("ancestor %p was ready\n", ancestor); /* We shouldn't be called for nothing */ STARPU_ASSERT(!ancestor->partitioned || !target || ancestor->active_children != target->siblings || (ancestor->readonly && write)); /* Then unpartition ancestor if needed */ if (ancestor->partitioned && /* Not the right children, unpartition ourself */ ((target && write && ancestor->active_children != target->siblings) || (target && !write && !ancestor->readonly) || /* We are partitioned and we want to write or some child * is writing and we want to read, unpartition ourself*/ (!target && (write || !ancestor->readonly)))) { #ifdef STARPU_DEVEL #warning FIXME: better choose gathering node #endif starpu_data_unpartition_submit_r(ancestor, STARPU_MAIN_RAM); } if (!target) { _STARPU_DEBUG("ancestor %p is done\n", ancestor); /* No child target, nothing more to do actually. */ return; } /* Then partition ancestor towards target, if needed */ if (ancestor->partitioned) { /* That must be readonly, otherwise we would have unpartitioned it */ STARPU_ASSERT(ancestor->readonly); if (write) { _STARPU_DEBUG("ancestor %p is already partitioned RO, turn RW\n", ancestor); /* Already partitioned, normally it's already for the target */ STARPU_ASSERT(ancestor->active_children == target->siblings); /* And we are here just because we haven't partitioned rw */ STARPU_ASSERT(ancestor->readonly && write); /* So we just need to upgrade ro to rw */ starpu_data_partition_readwrite_upgrade_submit(ancestor, target->nsiblings, target->siblings); } else { _STARPU_DEBUG("ancestor %p is already partitioned RO, but not to target, partition towards target too\n", ancestor); /* So we just need to upgrade ro to rw */ starpu_data_partition_readonly_submit(ancestor, target->nsiblings, target->siblings); } } else { /* Just need to partition properly for the child */ if (write) { _STARPU_DEBUG("partition ancestor %p RW\n", ancestor); starpu_data_partition_submit(ancestor, target->nsiblings, target->siblings); } else { _STARPU_DEBUG("partition ancestor %p RO\n", ancestor); starpu_data_partition_readonly_submit(ancestor, target->nsiblings, target->siblings); } } } void _starpu_data_partition_access_submit(starpu_data_handle_t target, int write) { _STARPU_DEBUG("accessing %p %s\n", target, write ? "RW" : "RO"); _starpu_data_partition_access_look_up(target, NULL, write); } 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.3.9+dfsg/src/datawizard/filters.h000066400000000000000000000020641413463044200205260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #include #include #include /** submit asynchronous unpartitioning / partitioning to make target active read-only or read-write */ void _starpu_data_partition_access_submit(starpu_data_handle_t target, int write); #endif starpu-1.3.9+dfsg/src/datawizard/footprint.c000066400000000000000000000064251413463044200211020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_compute_data_alloc_footprint(starpu_data_handle_t handle) { uint32_t interfaceid = (uint32_t)starpu_data_get_interface_id(handle); uint32_t handle_footprint; if (handle->ops->alloc_footprint) handle_footprint = handle->ops->alloc_footprint(handle); else 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.3.9+dfsg/src/datawizard/footprint.h000066400000000000000000000026531413463044200211060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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); /** Compute the footprint that characterizes the allocation of the data handle. */ uint32_t _starpu_compute_data_alloc_footprint(starpu_data_handle_t handle); #endif // __FOOTPRINT_H__ starpu-1.3.9+dfsg/src/datawizard/interfaces/000077500000000000000000000000001413463044200210265ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/datawizard/interfaces/bcsr_filters.c000066400000000000000000000075361413463044200236660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_vertical_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; struct starpu_bcsr_interface *bcsr_child = (struct starpu_bcsr_interface *) child_interface; size_t elemsize = bcsr_father->elemsize; uint32_t firstentry = bcsr_father->firstentry; uint32_t r = bcsr_father->r; uint32_t c = bcsr_father->c; uint32_t *rowptr = bcsr_father->rowptr; unsigned child_nrow; size_t child_rowoffset; STARPU_ASSERT_MSG(bcsr_father->id == STARPU_BCSR_INTERFACE_ID, "%s can only be applied on a bcsr data", __func__); bcsr_child->id = bcsr_father->id; if (!bcsr_father->nzval) /* Not supported yet */ return; starpu_filter_nparts_compute_chunk_size_and_offset(bcsr_father->nrow, nparts, 1, id, 1, &child_nrow, &child_rowoffset); /* child blocks indexes between these (0-based) */ uint32_t start_block = rowptr[child_rowoffset] - firstentry; uint32_t end_block = rowptr[child_rowoffset + child_nrow] - firstentry; bcsr_child->nzval = bcsr_father->nzval + start_block * r*c * elemsize; bcsr_child->nnz = end_block - start_block; bcsr_child->nrow = child_nrow; bcsr_child->colind = bcsr_father->colind + start_block; bcsr_child->rowptr = rowptr + child_rowoffset; bcsr_child->firstentry = firstentry + start_block; bcsr_child->r = bcsr_father->r; bcsr_child->c = bcsr_father->c; bcsr_child->elemsize = elemsize; } 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; matrix_child->allocsize = c*r*elemsize; if (bcsr_father->nzval) { uint8_t *nzval = (uint8_t *)(bcsr_father->nzval); matrix_child->dev_handle = matrix_child->ptr = (uintptr_t)&nzval[firstentry + ptr_offset]; matrix_child->offset = 0; } } unsigned starpu_bcsr_filter_canonical_block_get_nchildren(struct starpu_data_filter *f, starpu_data_handle_t handle) { return (unsigned)starpu_bcsr_get_nnz(handle); } struct starpu_data_interface_ops *starpu_bcsr_filter_canonical_block_child_ops(STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, STARPU_ATTRIBUTE_UNUSED unsigned child) { return &starpu_interface_matrix_ops; } starpu-1.3.9+dfsg/src/datawizard/interfaces/bcsr_interface.c000066400000000000000000000373331413463044200241540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #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_to_pointer(void *data_interface, unsigned node); static int bcsr_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .to_pointer = bcsr_to_pointer, .pointer_is_inside = bcsr_pointer_is_inside, .name = "STARPU_BCSR_INTERFACE", .pack_data = pack_data, .unpack_data = unpack_data }; static void *bcsr_to_pointer(void *data_interface, unsigned node) { (void) node; struct starpu_bcsr_interface *bcsr_interface = data_interface; return (void*) bcsr_interface->nzval; } static int bcsr_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void) node; struct starpu_bcsr_interface *bcsr_interface = data_interface; return ((char*) ptr >= (char*) bcsr_interface->nzval && (char*) ptr < (char*) bcsr_interface->nzval + bcsr_interface->nnz*bcsr_interface->r*bcsr_interface->c*bcsr_interface->elemsize) || ((char*) ptr >= (char*) bcsr_interface->colind && (char*) ptr < (char*) bcsr_interface->colind + bcsr_interface->nnz*sizeof(uint32_t)) || ((char*) ptr >= (char*) bcsr_interface->rowptr && (char*) ptr < (char*) bcsr_interface->rowptr + (bcsr_interface->nrow+1)*sizeof(uint32_t)); } 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 >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (nnz) { if (r && c && elemsize) { 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_worker_get_local_memory_node(); 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) { int node; node = starpu_worker_get_local_memory_node(); /* XXX 0 */ 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->colind; } uint32_t *starpu_bcsr_get_local_rowptr(starpu_data_handle_t handle) { int node; node = starpu_worker_get_local_memory_node(); /* XXX 0 */ 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->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; STARPU_ASSERT_MSG(r && c, "partitioning bcsr with several memory nodes is not supported yet"); if (nnz) { 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; } else { addr_nzval = addr_colind = 0; } 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: if (nnz) starpu_free_on_node(dst_node, addr_colind, nnz*sizeof(uint32_t)); fail_colind: if (nnz) 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; if (nnz) { 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 (nnz) { 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_interface_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) { *ptr = (void *)starpu_malloc_on_node_flags(node, *count, 0); char *tmp = *ptr; if (bcsr->nnz) { 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; if (bcsr->nnz) { 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); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); return 0; } starpu-1.3.9+dfsg/src/datawizard/interfaces/block_filters.c000066400000000000000000000230301413463044200240120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, "cannot split %u elements in %u parts", nx, nparts); 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, "cannot split %u elements in %u parts", nx, nparts); 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, "cannot split %u elements in %u parts", ny, nparts); 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, "cannot split %u elements in %u parts", ny, nparts); 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, "cannot split %u elements in %u parts", nz, nparts); 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, "cannot split %u elements into %u parts", nz, nparts); 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.3.9+dfsg/src/datawizard/interfaces/block_interface.c000066400000000000000000000372571413463044200243220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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 = { .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_to_pointer(void *data_interface, unsigned node); static int block_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .to_pointer = block_to_pointer, .pointer_is_inside = block_pointer_is_inside, .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_to_pointer(void *data_interface, unsigned node) { (void) node; struct starpu_block_interface *block_interface = data_interface; return (void*) block_interface->ptr; } static int block_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void) node; struct starpu_block_interface *block_interface = data_interface; uint32_t ldy = block_interface->ldy; uint32_t ldz = block_interface->ldz; uint32_t nx = block_interface->nx; uint32_t ny = block_interface->ny; uint32_t nz = block_interface->nz; size_t elemsize = block_interface->elemsize; return (char*) ptr >= (char*) block_interface->ptr && (char*) ptr < (char*) block_interface->ptr + (nz-1)*ldz*elemsize + (ny-1)*ldy*elemsize + nx*elemsize; } 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 >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (nx && ny && nz && elemsize) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + (nz-1)*ldz*elemsize + (ny-1)*ldy*elemsize + nx*elemsize - 1); } } #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); } #define IS_CONTIGUOUS_MATRIX(nx, ny, ldy) ((nx) == (ldy)) #define IS_CONTIGUOUS_BLOCK(nx, ny, nz, ldy, ldz) ((nx) * (ny) == (ldz)) 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); uint32_t ldy = block_interface->ldy; uint32_t ldz = block_interface->ldz; uint32_t nx = block_interface->nx; uint32_t ny = block_interface->ny; uint32_t nz = block_interface->nz; size_t elemsize = block_interface->elemsize; *count = nx*ny*nz*elemsize; if (ptr != NULL) { uint32_t z, y; char *block = (void *)block_interface->ptr; *ptr = (void *)starpu_malloc_on_node_flags(node, *count, 0); char *cur = *ptr; if (IS_CONTIGUOUS_BLOCK(nx, ny, nz, ldy, ldz)) memcpy(cur, block, nx * ny * nz * elemsize); else { char *block_z = block; for(z=0 ; zldy; uint32_t ldz = block_interface->ldz; 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_ASSERT(count == elemsize * nx * ny * nz); uint32_t z, y; char *cur = ptr; char *block = (void *)block_interface->ptr; if (IS_CONTIGUOUS_BLOCK(nx, ny, nz, ldy, ldz)) memcpy(block, cur, nx * ny * nz * elemsize); else { char *block_z = block; for(z=0 ; zid == 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_worker_get_local_memory_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); #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_worker_get_local_memory_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); #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_worker_get_local_memory_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); #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); } 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 (starpu_interface_copy3d(src_block->dev_handle, src_block->offset, src_node, dst_block->dev_handle, dst_block->offset, dst_node, nx * elemsize, ny, ldy_src * elemsize, ldy_dst * elemsize, nz, ldz_src * elemsize, ldz_dst * elemsize, async_data)) ret = -EAGAIN; starpu_interface_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.3.9+dfsg/src/datawizard/interfaces/coo_interface.c000066400000000000000000000207311413463044200237750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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_interface_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; uint32_t *addr_rows; uintptr_t addr_values; 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 int coo_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; (void) node; return ((char*) ptr >= (char*) coo_interface->columns && (char*) ptr < (char*) coo_interface->columns + coo_interface->n_values * sizeof(coo_interface->columns[0])) || ((char*) ptr >= (char*) coo_interface->rows && (char*) ptr < (char*) coo_interface->rows + coo_interface->n_values * sizeof(coo_interface->rows[0])) || ((char*) ptr >= (char*) coo_interface->values && (char*) ptr < (char*) coo_interface->values + coo_interface->n_values * coo_interface->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, .to_pointer = NULL, .pointer_is_inside = coo_pointer_is_inside, .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 >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (n_values) { 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.3.9+dfsg/src/datawizard/interfaces/csr_filters.c000066400000000000000000000042051413463044200235120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 *rowptr = csr_father->rowptr; size_t first_index; unsigned child_nrow; starpu_filter_nparts_compute_chunk_size_and_offset(nrow, nchunks, 1, id, 1, &child_nrow, &first_index); uint32_t local_firstentry = rowptr[first_index] - firstentry; uint32_t local_lastentry = rowptr[first_index + child_nrow] - firstentry; uint32_t local_nnz = local_lastentry - local_firstentry; 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.3.9+dfsg/src/datawizard/interfaces/csr_interface.c000066400000000000000000000335101413463044200240030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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 int csr_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .pointer_is_inside = csr_pointer_is_inside, .name = "STARPU_CSR_INTERFACE", .pack_data = pack_data, .unpack_data = unpack_data }; static int csr_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void) node; struct starpu_csr_interface *csr_interface = data_interface; return ((char*) ptr >= (char*) csr_interface->nzval && (char*) ptr < (char*) csr_interface->nzval + csr_interface->nnz*csr_interface->elemsize) || ((char*) ptr >= (char*) csr_interface->colind && (char*) ptr < (char*) csr_interface->colind + csr_interface->nnz*sizeof(uint32_t)) || ((char*) ptr >= (char*) csr_interface->rowptr && (char*) ptr < (char*) csr_interface->rowptr + (csr_interface->nrow+1)*sizeof(uint32_t)); } 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 >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (nnz) { if (elemsize) { 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_worker_get_local_memory_node(); 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_worker_get_local_memory_node(); 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_worker_get_local_memory_node(); 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; if (nnz) { 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; } else { addr_nzval = 0; addr_colind = NULL; } 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: if (nnz) starpu_free_on_node(dst_node, (uintptr_t) addr_colind, nnz*sizeof(uint32_t)); fail_colind: if (nnz) 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; if (nnz) { 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 (nnz) { 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_interface_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) { *ptr = (void *)starpu_malloc_on_node_flags(node, *count, 0); char *tmp = *ptr; if (csr->nnz) { 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; if (csr->nnz) { 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); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); return 0; } starpu-1.3.9+dfsg/src/datawizard/interfaces/data_interface.c000066400000000000000000001050521413463044200241260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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=NULL, *tmp=NULL; 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=NULL, *tmp=NULL; 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=NULL, *tmp=NULL; 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->flags & STARPU_OMP_TASK_FLAGS_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->flags & STARPU_OMP_TASK_FLAGS_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_prio_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->active = 1; handle->active_ro = 0; handle->root_handle = handle; handle->father_handle = NULL; handle->active_children = NULL; handle->active_readonly_children = NULL; handle->nactive_readonly_children = 0; handle->nsiblings = 0; handle->siblings = 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; handle->ooc = 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_prio_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_prio_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); for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; ptr = starpu_data_handle_to_pointer(handle, node); 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->nb_tasks_prefetch = 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); if (handle->ops->init) handle->ops->init(replicate->data_interface); } 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; /* check the interfaceid is set */ STARPU_ASSERT(ops->interfaceid != STARPU_UNKNOWN_INTERFACE_ID); /* 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 (!starpu_data_test_if_allocated_on_node(handle, node)) return NULL; if (handle->ops->to_pointer) { return handle->ops->to_pointer(starpu_data_get_interface_on_node(handle, node), node); } /* Deprecated */ if (handle->ops->handle_to_pointer) { return handle->ops->handle_to_pointer(handle, node); } return NULL; } int starpu_data_pointer_is_inside(starpu_data_handle_t handle, unsigned node, void *ptr) { /* Check whether the operation is supported and the node has actually * been allocated. */ if (!starpu_data_test_if_allocated_on_node(handle, node)) return 0; if (handle->ops->pointer_is_inside) { return handle->ops->pointer_is_inside(starpu_data_get_interface_on_node(handle, node), node, ptr); } /* Don't know :/ */ return -1; } void *starpu_data_get_local_ptr(starpu_data_handle_t handle) { return starpu_data_handle_to_pointer(handle, starpu_worker_get_local_memory_node()); } 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, unsigned node) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) return; #ifdef STARPU_OPENMP if (handle->removed_from_context_hash) return; #endif const void *ram_ptr = starpu_data_handle_to_pointer(handle, node); 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->flags & STARPU_OMP_TASK_FLAGS_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(); if (handle->ops->unregister_data_handle) handle->ops->unregister_data_handle(handle); 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, const char *origin) { 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, STARPU_FETCH, 0, NULL, NULL, 0, origin); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, 0, 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, "_starpu_data_unregister_fetch_data_callback"); /* unlock the caller */ STARPU_PTHREAD_MUTEX_LOCK(&arg->mutex); arg->terminated = 1; STARPU_PTHREAD_COND_SIGNAL(&arg->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&arg->mutex); } void _starpu_data_set_unregister_hook(starpu_data_handle_t handle, _starpu_data_handle_unregister_hook func) { STARPU_ASSERT(handle->unregister_hook == NULL); handle->unregister_hook = func; } /* 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) { /* We will acquire it in write mode to catch all dependencies, * but possibly it's not actually initialized. Fake it to avoid getting caught doing it */ handle->initialized = 1; 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 */ if ((handle->nplans && !handle->nchildren) || handle->siblings) _starpu_data_partition_access_submit(handle, 1); _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, "_starpu_data_unregister"); } 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_DEBUG("Conversion needed\n"); void *buffers[1]; struct starpu_multiformat_interface *format_interface; home_node = handle->home_node; if (home_node < 0 || (starpu_node_get_kind(home_node) != STARPU_CPU_RAM)) home_node = STARPU_MAIN_RAM; format_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, home_node); 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 ! */ 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); /* Unregister MPI things after having waiting for MPI reqs etc. to settle down */ if (handle->unregister_hook) { handle->unregister_hook(handle); handle->unregister_hook = NULL; } /* 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_alloc_size(handle); /* Destroy the data now */ unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local = &handle->per_node[node]; STARPU_ASSERT(!local->refcnt); if (local->allocated) { _starpu_data_unregister_ram_pointer(handle, node); /* free the data copy in a lazy fashion */ if (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]; STARPU_ASSERT(!local->refcnt); /* 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); free(handle->active_readonly_children); 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); _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); _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_NO_NODE_LOCK_ALL); } 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); /* Wait for all task dependencies on this handle before putting it for free */ starpu_data_acquire_on_node_cb(handle, STARPU_ACQUIRE_NO_NODE_LOCK_ALL, 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_alloc_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) { _starpu_data_unregister_ram_pointer(handle, node); /* 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_STATE_INVALID(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_NO_NODE_LOCK_ALL); } void starpu_data_invalidate(starpu_data_handle_t handle) { STARPU_ASSERT(handle); starpu_data_acquire_on_node(handle, STARPU_ACQUIRE_NO_NODE_LOCK_ALL, 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_NO_NODE_LOCK_ALL, STARPU_W, _starpu_data_invalidate, handle); handle->initialized = 0; } void _starpu_data_invalidate_submit_noplan(starpu_data_handle_t handle) { STARPU_ASSERT(handle); starpu_data_acquire_on_node_cb(handle, STARPU_ACQUIRE_NO_NODE_LOCK_ALL, STARPU_W | STARPU_NOPLAN, _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_worker_get_local_memory_node(), 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_worker_get_local_memory_node(), ptr, count); return ret; } size_t starpu_data_get_size(starpu_data_handle_t handle) { return handle->ops->get_size(handle); } size_t starpu_data_get_alloc_size(starpu_data_handle_t handle) { if (handle->ops->get_alloc_size) return handle->ops->get_alloc_size(handle); else return handle->ops->get_size(handle); } void starpu_data_set_name(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, const char *name STARPU_ATTRIBUTE_UNUSED) { _STARPU_TRACE_DATA_NAME(handle, name); } int starpu_data_get_home_node(starpu_data_handle_t handle) { return handle->home_node; } void starpu_data_set_coordinates_array(starpu_data_handle_t handle, unsigned dimensions, int dims[]) { unsigned i; unsigned max_dimensions = sizeof(handle->coordinates)/sizeof(handle->coordinates[0]); if (dimensions > max_dimensions) dimensions = max_dimensions; handle->dimensions = dimensions; for (i = 0; i < dimensions; i++) handle->coordinates[i] = dims[i]; _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); } unsigned starpu_data_get_coordinates_array(starpu_data_handle_t handle, unsigned dimensions, int dims[]) { unsigned i; if (dimensions > handle->dimensions) dimensions = handle->dimensions; for (i = 0; i < dimensions; i++) dims[i] = handle->coordinates[i]; return dimensions; } starpu-1.3.9+dfsg/src/datawizard/interfaces/data_interface.h000066400000000000000000000067631413463044200241440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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_void_interface void; void doesn't have any data */ struct starpu_variable_interface variable; struct starpu_vector_interface vector; struct starpu_matrix_interface matrix; struct starpu_block_interface block; struct starpu_csr_interface csr; struct starpu_bcsr_interface bcsr; struct starpu_coo_interface coo; }; /** 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, unsigned node) STARPU_ATTRIBUTE_INTERNAL; #define _starpu_data_is_multiformat_handle(handle) handle->ops->is_multiformat void _starpu_data_invalidate_submit_noplan(starpu_data_handle_t handle); #endif // __DATA_INTERFACE_H__ starpu-1.3.9+dfsg/src/datawizard/interfaces/matrix_filters.c000066400000000000000000000166541413463044200242420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, "cannot split %u elements in %u parts", nx, nchunks); 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; STARPU_ASSERT_MSG(matrix_father->allocsize == matrix_father->nx * matrix_father->ny * matrix_father->elemsize, "partitioning matrix with non-trivial allocsize not supported yet, patch welcome"); matrix_child->allocsize = matrix_child->nx * matrix_child->ny * 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, "cannot split %u elements in %u parts", nx, nchunks); 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; STARPU_ASSERT_MSG(matrix_father->allocsize == matrix_father->nx * matrix_father->ny * matrix_father->elemsize, "partitioning matrix with non-trivial allocsize not supported yet, patch welcome"); matrix_child->allocsize = matrix_child->nx * matrix_child->ny * 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, "cannot split %u elements in %u parts", ny, nchunks); 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; STARPU_ASSERT_MSG(matrix_father->allocsize == matrix_father->nx * matrix_father->ny * matrix_father->elemsize, "partitioning matrix with non-trivial allocsize not supported yet, patch welcome"); matrix_child->allocsize = matrix_child->nx * matrix_child->ny * 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, "cannot split %u elements in %u parts", ny, nchunks); 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; STARPU_ASSERT_MSG(matrix_father->allocsize == matrix_father->nx * matrix_father->ny * matrix_father->elemsize, "partitioning matrix with non-trivial allocsize not supported yet, patch welcomed"); matrix_child->allocsize = matrix_child->nx * matrix_child->ny * 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.3.9+dfsg/src/datawizard/interfaces/matrix_interface.c000066400000000000000000000371041413463044200245230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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 = { .any_to_any = copy_any_to_any, }; static void matrix_init(void *data_interface); static void register_matrix_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static void *matrix_to_pointer(void *data_interface, unsigned node); static int matrix_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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 size_t matrix_interface_get_alloc_size(starpu_data_handle_t handle); static uint32_t footprint_matrix_interface_crc32(starpu_data_handle_t handle); static uint32_t alloc_footprint_matrix_interface_crc32(starpu_data_handle_t handle); static int matrix_compare(void *data_interface_a, void *data_interface_b); static int matrix_alloc_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 = { .init = matrix_init, .register_data_handle = register_matrix_handle, .allocate_data_on_node = allocate_matrix_buffer_on_node, .to_pointer = matrix_to_pointer, .pointer_is_inside = matrix_pointer_is_inside, .free_data_on_node = free_matrix_buffer_on_node, .copy_methods = &matrix_copy_data_methods_s, .get_size = matrix_interface_get_size, .get_alloc_size = matrix_interface_get_alloc_size, .footprint = footprint_matrix_interface_crc32, .alloc_footprint = alloc_footprint_matrix_interface_crc32, .compare = matrix_compare, .alloc_compare = matrix_alloc_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 matrix_init(void *data_interface) { struct starpu_matrix_interface *matrix_interface = data_interface; matrix_interface->allocsize = -1; } 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; local_interface->allocsize = matrix_interface->allocsize; } } static void *matrix_to_pointer(void *data_interface, unsigned node) { (void) node; struct starpu_matrix_interface *matrix_interface = data_interface; return (void*) matrix_interface->ptr; } static int matrix_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void) node; struct starpu_matrix_interface *matrix_interface = data_interface; uint32_t ld = matrix_interface->ld; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; size_t elemsize = matrix_interface->elemsize; return (char*) ptr >= (char*) matrix_interface->ptr && (char*) ptr < (char*) matrix_interface->ptr + (ny-1)*ld*elemsize + nx*elemsize; } /* declare a new data with the matrix interface */ void starpu_matrix_data_register_allocsize(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize, size_t allocsize) { 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, .allocsize = allocsize, }; #ifndef STARPU_SIMGRID if (home_node >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (nx && ny && elemsize) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + (ny-1)*ld*elemsize + nx*elemsize - 1); } } #endif starpu_data_register(handleptr, home_node, &matrix_interface, &starpu_interface_matrix_ops); } 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) { starpu_matrix_data_register_allocsize(handleptr, home_node, ptr, ld, nx, ny, elemsize, nx * ny * 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) { 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 uint32_t alloc_footprint_matrix_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_matrix_get_allocsize(handle), 0); } 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 int matrix_alloc_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 allocation-compatible if they have the same size */ return (matrix_a->allocsize == matrix_b->allocsize); } 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); } #define IS_CONTIGUOUS_MATRIX(nx, ny, ld) ((nx) == (ld)) 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); uint32_t ld = matrix_interface->ld; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; size_t elemsize = matrix_interface->elemsize; *count = nx*ny*elemsize; if (ptr != NULL) { char *matrix = (void *)matrix_interface->ptr; *ptr = (void *)starpu_malloc_on_node_flags(node, *count, 0); char *cur = *ptr; if (IS_CONTIGUOUS_MATRIX(nx, ny, ld)) memcpy(cur, matrix, nx*ny*elemsize); else { uint32_t y; for(y=0 ; yld; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; size_t elemsize = matrix_interface->elemsize; STARPU_ASSERT(count == elemsize * nx * ny); char *matrix = (void *)matrix_interface->ptr; if (IS_CONTIGUOUS_MATRIX(nx, ny, ld)) memcpy(matrix, ptr, nx*ny*elemsize); else { uint32_t y; char *cur = ptr; for(y=0 ; yid == STARPU_MATRIX_INTERFACE_ID, "Error. The given data is not a matrix."); #endif return matrix_interface->nx * matrix_interface->ny * matrix_interface->elemsize; } static size_t matrix_interface_get_alloc_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 STARPU_ASSERT_MSG(matrix_interface->allocsize != (size_t)-1, "The matrix allocation size needs to be defined"); return matrix_interface->allocsize; } /* 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_worker_get_local_memory_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); #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_worker_get_local_memory_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); #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; } size_t starpu_matrix_get_allocsize(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->allocsize; } /* 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 ld = matrix_interface->nx; // by default starpu_ssize_t allocated_memory = matrix_interface->allocsize; handle = starpu_malloc_on_node(dst_node, allocated_memory); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; /* 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; starpu_free_on_node(node, matrix_interface->dev_handle, matrix_interface->allocsize); } 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 (starpu_interface_copy2d(src_matrix->dev_handle, src_matrix->offset, src_node, dst_matrix->dev_handle, dst_matrix->offset, dst_node, nx * elemsize, ny, ld_src * elemsize, ld_dst * elemsize, async_data)) ret = -EAGAIN; starpu_interface_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.3.9+dfsg/src/datawizard/interfaces/multiformat_interface.c000066400000000000000000000673411413463044200255700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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_to_pointer(void *data_interface, unsigned node); static int multiformat_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .to_pointer = multiformat_to_pointer, .pointer_is_inside = multiformat_pointer_is_inside, .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_to_pointer(void *data_interface, unsigned node) { struct starpu_multiformat_interface *multiformat_interface = data_interface; 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 int multiformat_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { struct starpu_multiformat_interface *multiformat_interface = data_interface; switch(starpu_node_get_kind(node)) { case STARPU_CPU_RAM: return (char*) ptr >= (char*) multiformat_interface->cpu_ptr && (char*) ptr < (char*) multiformat_interface->cpu_ptr + multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize; #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: return (char*) ptr >= (char*) multiformat_interface->cuda_ptr && (char*) ptr < (char*) multiformat_interface->cuda_ptr + multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: return (char*) ptr >= (char*) multiformat_interface->opencl_ptr && (char*) ptr < (char*) multiformat_interface->opencl_ptr + multiformat_interface->nx * multiformat_interface->ops->opencl_elemsize; #endif #ifdef STARPU_USE_MIC case STARPU_MIC_RAM: return (char*) ptr >= (char*) multiformat_interface->mic_ptr && (char*) ptr < (char*) multiformat_interface->mic_ptr + multiformat_interface->nx * multiformat_interface->ops->mic_elemsize; #endif default: STARPU_ABORT(); } return -1; } 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) { 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 (!status) status = cudaDeviceSynchronize(); 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 (!status) status = cudaDeviceSynchronize(); 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 (!status) status = cudaDeviceSynchronize(); 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 (!status) status = cudaDeviceSynchronize(); 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 STARPU_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) { double start; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); status = cudaMemcpyPeerAsync(dst_multiformat->cuda_ptr, dst_dev, src_multiformat->cuda_ptr, src_dev, size, stream); starpu_interface_end_driver_copy_async(src_node, dst_node, start); /* 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 (!status) status = cudaDeviceSynchronize(); if (STARPU_UNLIKELY(status != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(status); starpu_interface_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 STARPU_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 STARPU_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_interface_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... */ dst_multiformat->opencl_ptr = malloc(dst_multiformat->nx * dst_multiformat->ops->opencl_elemsize); STARPU_ASSERT_MSG(dst_multiformat->opencl_ptr != NULL || dst_multiformat->nx * dst_multiformat->ops->opencl_elemsize == 0, "Cannot allocate %ld bytes\n", (long) (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_interface_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_interface_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_interface_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.3.9+dfsg/src/datawizard/interfaces/variable_interface.c000066400000000000000000000227521413463044200250070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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_to_pointer(void *data_interface, unsigned node); static int variable_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .to_pointer = variable_to_pointer, .pointer_is_inside = variable_pointer_is_inside, .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_to_pointer(void *data_interface, unsigned node) { (void) node; return (void*) STARPU_VARIABLE_GET_PTR(data_interface); } static int variable_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void) node; struct starpu_variable_interface *variable_interface = data_interface; return (char*) ptr >= (char*) variable_interface->ptr && (char*) ptr < (char*) variable_interface->ptr + variable_interface->elemsize; } 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 >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (elemsize) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + elemsize - 1); } } #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) { *ptr = (void *)starpu_malloc_on_node_flags(node, *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); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); 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_worker_get_local_memory_node(); 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_interface_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.3.9+dfsg/src/datawizard/interfaces/vector_filters.c000066400000000000000000000202571413463044200242320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, "cannot split %u elements in %u parts", nx, nchunks); 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; STARPU_ASSERT_MSG(vector_father->allocsize == vector_father->nx * vector_father->elemsize, "partitioning vector with non-trival allocsize not supported yet, patch welcome"); vector_child->allocsize = vector_child->nx * 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, "cannot split %u elements in %u parts", nx, nchunks); 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; STARPU_ASSERT_MSG(vector_father->allocsize == vector_father->nx * vector_father->elemsize, "partitioning vector with non-trival allocsize not supported yet, patch welcome"); vector_child->allocsize = vector_child->nx * 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; STARPU_ASSERT_MSG(vector_father->allocsize == vector_father->nx * vector_father->elemsize, "partitioning vector with non-trival allocsize not supported yet, patch welcome"); /* this is the first child */ if (id == 0) { vector_child->nx = length_first; vector_child->elemsize = elemsize; vector_child->allocsize = vector_child->nx * 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; vector_child->allocsize = vector_child->nx * 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; STARPU_ASSERT_MSG(vector_father->allocsize == vector_father->nx * vector_father->elemsize, "partitioning vector with non-trival allocsize not supported yet, patch welcomed"); vector_child->allocsize = vector_child->nx * 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; STARPU_ASSERT_MSG(vector_father->allocsize == vector_father->nx * vector_father->elemsize, "partitioning vector with non-trival allocsize not supported yet, patch welcomed"); vector_child->allocsize = vector_child->nx * 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.3.9+dfsg/src/datawizard/interfaces/vector_interface.c000066400000000000000000000323301413463044200245150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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 vector_init(void *data_interface); 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_to_pointer(void *data_interface, unsigned node); static int vector_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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 size_t vector_interface_get_alloc_size(starpu_data_handle_t handle); static uint32_t footprint_vector_interface_crc32(starpu_data_handle_t handle); static uint32_t alloc_footprint_vector_interface_crc32(starpu_data_handle_t handle); static int vector_compare(void *data_interface_a, void *data_interface_b); static int vector_alloc_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 = { .init = vector_init, .register_data_handle = register_vector_handle, .allocate_data_on_node = allocate_vector_buffer_on_node, .to_pointer = vector_to_pointer, .pointer_is_inside = vector_pointer_is_inside, .free_data_on_node = free_vector_buffer_on_node, .copy_methods = &vector_copy_data_methods_s, .get_size = vector_interface_get_size, .get_alloc_size = vector_interface_get_alloc_size, .footprint = footprint_vector_interface_crc32, .alloc_footprint = alloc_footprint_vector_interface_crc32, .compare = vector_compare, .alloc_compare = vector_alloc_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_init(void *data_interface) { struct starpu_vector_interface *vector_interface = data_interface; vector_interface->allocsize = -1; } static void *vector_to_pointer(void *data_interface, unsigned node) { (void) node; struct starpu_vector_interface *vector_interface = data_interface; return (void*) vector_interface->ptr; } static int vector_pointer_is_inside(void *data_interface, unsigned node, void *ptr) { (void) node; struct starpu_vector_interface *vector_interface = data_interface; return (char*) ptr >= (char*) vector_interface->ptr && (char*) ptr < (char*) vector_interface->ptr + vector_interface->nx*vector_interface->elemsize; } 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->allocsize = vector_interface->allocsize; local_interface->slice_base = vector_interface->slice_base; } } /* declare a new data with the vector interface */ void starpu_vector_data_register_allocsize(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize, size_t allocsize) { struct starpu_vector_interface vector = { .id = STARPU_VECTOR_INTERFACE_ID, .ptr = ptr, .nx = nx, .elemsize = elemsize, .dev_handle = ptr, .slice_base = 0, .offset = 0, .allocsize = allocsize, }; #if (!defined(STARPU_SIMGRID) && !defined(STARPU_OPENMP)) if (home_node >= 0 && starpu_node_get_kind(home_node) == STARPU_CPU_RAM) { if (nx && elemsize) { STARPU_ASSERT_ACCESSIBLE(ptr); STARPU_ASSERT_ACCESSIBLE(ptr + nx*elemsize - 1); } } #endif starpu_data_register(handleptr, home_node, &vector, &starpu_interface_vector_ops); } void starpu_vector_data_register(starpu_data_handle_t *handleptr, int home_node, uintptr_t ptr, uint32_t nx, size_t elemsize) { starpu_vector_data_register_allocsize(handleptr, home_node, ptr, nx, elemsize, nx * elemsize); } 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 uint32_t alloc_footprint_vector_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_vector_get_allocsize(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 int vector_alloc_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 allocation-compatible if they have the same size */ return (vector_a->allocsize == vector_b->allocsize); } 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) { *ptr = (void *)starpu_malloc_on_node_flags(node, *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); starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0); 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; } static size_t vector_interface_get_alloc_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->allocsize; STARPU_ASSERT_MSG(size != (size_t)-1, "The vector allocation size needs to be defined"); 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_worker_get_local_memory_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); #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; } size_t starpu_vector_get_allocsize(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->allocsize; } /* 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_; starpu_ssize_t allocated_memory = vector_interface->allocsize; handle = starpu_malloc_on_node(dst_node, allocated_memory); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; /* 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; starpu_free_on_node(node, vector_interface->dev_handle, vector_interface->allocsize); } 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_interface_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.3.9+dfsg/src/datawizard/interfaces/void_interface.c000066400000000000000000000117131413463044200241560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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 int void_pointer_is_inside(void *data_interface, unsigned node, void *ptr); 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, .pointer_is_inside = void_pointer_is_inside, .name = "STARPU_VOID_INTERFACE" }; static int void_pointer_is_inside(void *data_interface STARPU_ATTRIBUTE_UNUSED, unsigned node STARPU_ATTRIBUTE_UNUSED, void *ptr STARPU_ATTRIBUTE_UNUSED) { return 0; } 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.3.9+dfsg/src/datawizard/malloc.c000066400000000000000000000677461413463044200203420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #include #include #endif #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #if HWLOC_API_VERSION < 0x00010b00 #define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE #endif #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 static int bogusfile = -1; static unsigned long _starpu_malloc_simulation_fold; #endif static starpu_malloc_hook malloc_hook; static starpu_free_hook free_hook; void starpu_malloc_set_hooks(starpu_malloc_hook _malloc_hook, starpu_free_hook _free_hook) { malloc_hook = _malloc_hook; free_hook = _free_hook; } 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(STARPU_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(STARPU_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(STARPU_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 /* Allocation in CPU RAM */ int starpu_malloc_flags(void **A, size_t dim, int flags) { return _starpu_malloc_flags_on_node(STARPU_MAIN_RAM, A, dim, flags); } /* Return whether we should pin the allocated data */ static int _starpu_malloc_should_pin(int flags) { if (flags & STARPU_MALLOC_PINNED && disable_pinning <= 0) { if (_starpu_can_submit_cuda_task()) { return 1; } // if (_starpu_can_submit_opencl_task()) // return 1; } return 0; } int _starpu_malloc_willpin_on_node(unsigned dst_node) { int flags = malloc_on_node_default_flags[dst_node]; return (_starpu_malloc_should_pin(flags) && STARPU_RUNNING_ON_VALGRIND == 0 && (_starpu_can_submit_cuda_task() /* || _starpu_can_submit_opencl_task() */ )); } int _starpu_malloc_flags_on_node(unsigned dst_node, 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(dst_node, 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(dst_node,0); freed = _starpu_memory_reclaim_generic(dst_node, 0, reclaim); _STARPU_TRACE_END_MEMRECLAIM(dst_node,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(dst_node, dim, flags); else starpu_memory_allocate(dst_node, dim, flags | STARPU_MEMORY_OVERFLOW); } if (malloc_hook) { ret = malloc_hook(dst_node, A, dim, flags); goto end; } /* Note: synchronize this test with _starpu_malloc_willpin_on_node */ if (_starpu_malloc_should_pin(flags) && STARPU_RUNNING_ON_VALGRIND == 0) { if (_starpu_can_submit_cuda_task()) { #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()) starpu_sleep((float) dim * 0.000650 / 1048576.); #else /* STARPU_SIMGRID */ #ifdef STARPU_USE_CUDA #ifdef STARPU_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->type = STARPU_TASK_TYPE_INTERNAL; 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_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; // task->type = STARPU_TASK_TYPE_INTERNAL; // // _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 >= 31500 && SIMGRID_VERSION != 31559 if (_starpu_simgrid_running_smpi()) *A = SMPI_SHARED_MALLOC(dim); else #endif { /* 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 #ifdef STARPU_HAVE_HWLOC if (starpu_memory_nodes_get_numa_count() > 1) { struct _starpu_machine_config *config = _starpu_get_machine_config(); hwloc_topology_t hwtopology = config->topology.hwtopology; hwloc_obj_t numa_node_obj = hwloc_get_obj_by_type(hwtopology, HWLOC_OBJ_NUMANODE, starpu_memory_nodes_numa_id_to_hwloclogid(dst_node)); hwloc_bitmap_t nodeset = numa_node_obj->nodeset; #if HWLOC_API_VERSION >= 0x00020000 *A = hwloc_alloc_membind(hwtopology, dim, nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET | HWLOC_MEMBIND_NOCPUBIND); #else *A = hwloc_alloc_membind_nodeset(hwtopology, dim, nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_NOCPUBIND); #endif //fprintf(stderr, "Allocation %lu bytes on NUMA node %d [%p]\n", (unsigned long) dim, starpu_memnode_get_numaphysid(dst_node), *A); if (!*A) ret = -ENOMEM; } #endif /* STARPU_HAVE_HWLOC */ 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; } end: 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(dst_node, 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(STARPU_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(STARPU_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) { return _starpu_free_flags_on_node(STARPU_MAIN_RAM, A, dim, flags); } int _starpu_free_flags_on_node(unsigned dst_node, void *A, size_t dim, int flags) { if (free_hook) { free_hook(dst_node, A, dim, flags); goto out; } if (_starpu_malloc_should_pin(flags) && STARPU_RUNNING_ON_VALGRIND == 0) { if (_starpu_can_submit_cuda_task()) { #ifdef STARPU_SIMGRID /* TODO: simulate CUDA barrier */ #else /* !STARPU_SIMGRID */ #ifdef STARPU_USE_CUDA #ifndef STARPU_HAVE_CUDA_MEMCPY_PEER if (!starpu_is_initialized()) { #endif /* This is especially useful when starpu_free is called even * though starpu_shutdown has 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 STARPU_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; task->type = STARPU_TASK_TYPE_INTERNAL; _starpu_exclude_task_from_dag(task); push_res = _starpu_task_submit_internally(task); STARPU_ASSERT(push_res != -ENODEV); goto out; } #endif /* STARPU_HAVE_CUDA_MEMCPY_PEER */ #endif /* STARPU_USE_CUDA */ #endif /* STARPU_SIMGRID */ } // 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; // task->type = STARPU_TASK_TYPE_INTERNAL; // // _starpu_exclude_task_from_dag(task); // // push_res = starpu_task_submit(task); // STARPU_ASSERT(push_res != -ENODEV); // goto out; // } //#endif } #ifdef STARPU_SIMGRID if (flags & STARPU_MALLOC_SIMULATION_FOLDED) { #if SIMGRID_VERSION >= 31500 && SIMGRID_VERSION != 31559 if (_starpu_simgrid_running_smpi()) SMPI_SHARED_FREE(A); else #endif munmap(A, dim); } #endif #ifdef STARPU_HAVE_HWLOC else if (starpu_memory_nodes_get_numa_count() > 1) { struct _starpu_machine_config *config = _starpu_get_machine_config(); hwloc_topology_t hwtopology = config->topology.hwtopology; hwloc_free(hwtopology, A, dim); } #endif /* STARPU_HAVE_HWLOC */ else free(A); out: if (flags & STARPU_MALLOC_COUNT) { starpu_memory_deallocate(dst_node, dim); } return 0; } int starpu_free(void *A) { return starpu_free_flags(A, 0, STARPU_MALLOC_PINNED); } static uintptr_t _starpu_malloc_on_node(unsigned dst_node, size_t size, int flags) { uintptr_t addr = 0; /* 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; } struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(dst_node); if (node_ops && node_ops->malloc_on_node) addr = node_ops->malloc_on_node(dst_node, size, flags & ~STARPU_MALLOC_COUNT); else STARPU_ABORT_MSG("No malloc_on_node function defined for node %s\n", _starpu_node_get_prefix(starpu_node_get_kind(dst_node))); if (addr == 0) { // Allocation failed, gives the memory back to the memory manager _STARPU_TRACE_MEMORY_FULL(size); if (flags & STARPU_MALLOC_COUNT) 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; struct _starpu_node_ops *node_ops = _starpu_memory_node_get_node_ops(dst_node); if (node_ops && node_ops->free_on_node) node_ops->free_on_node(dst_node, addr, size, flags); else STARPU_ABORT_MSG("No free_on_node function defined for node %s\n", _starpu_node_get_prefix(starpu_node_get_kind(dst_node))); 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(STARPU_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(STARPU_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) /* Don't really deallocate chunks unless we have more than this many chunks * which are completely free. */ #define CHUNKS_NFREE 4 /* 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 /* Reasonably "costless" */ _starpu_malloc_simulation_fold = starpu_get_env_number_default("STARPU_MALLOC_SIMULATION_FOLD", 1) << 20; #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; } /* Return whether we should use our suballocator */ static int _starpu_malloc_should_suballoc(unsigned dst_node, size_t size, int flags) { return size <= CHUNK_ALLOC_MAX && (starpu_node_get_kind(dst_node) == STARPU_CUDA_RAM || (starpu_node_get_kind(dst_node) == STARPU_CPU_RAM && _starpu_malloc_should_pin(flags)) ); } uintptr_t starpu_malloc_on_node_flags(unsigned dst_node, size_t size, int flags) { /* Big allocation, allocate normally */ if (!_starpu_malloc_should_suballoc(dst_node, size, flags)) 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 (!_starpu_malloc_should_suballoc(dst_node, size, flags)) { _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] >= CHUNKS_NFREE) { /* 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.3.9+dfsg/src/datawizard/malloc.h000066400000000000000000000024651413463044200203320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ 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); int _starpu_malloc_flags_on_node(unsigned dst_node, void **A, size_t dim, int flags); int _starpu_free_flags_on_node(unsigned dst_node, void *A, size_t dim, int flags); /** Returns whether when allocating data on \p dst_node, we will do pinning, i.e. the allocation will be very expensive, and should thus be moved out from the critical path */ int _starpu_malloc_willpin_on_node(unsigned dst_node); #endif starpu-1.3.9+dfsg/src/datawizard/memalloc.c000066400000000000000000001556471413463044200206620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* 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; /* 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; /* Prevent memchunks from being evicted from memory before they are actually used */ static int diduse_barrier; /* 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]; /* TODO: introduce head of data to be evicted */ /* 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]; /* This records that we tried to prefetch data but went out of memory, so will * probably fail again to prefetch data, thus not trace each and every * attempt. */ static volatile int prefetch_out_of_memory[STARPU_MAXNODES]; int _starpu_is_reclaiming(unsigned node) { STARPU_ASSERT(node < STARPU_MAXNODES); return tidying[node] || reclaiming[node]; } /* Whether this memory node can evict data to another node */ static unsigned evictable[STARPU_MAXNODES]; static int can_evict(unsigned node) { return evictable[node]; } /* Called after initializing the set of memory nodes */ /* We use an accelerator -> CPU RAM -> disk storage hierarchy */ void _starpu_mem_chunk_init_last(void) { unsigned disk = 0; unsigned nnodes = starpu_memory_nodes_get_count(), i; for (i = 0; i < nnodes; i++) { enum starpu_node_kind kind = starpu_node_get_kind(i); if (kind == STARPU_DISK_RAM) /* Some disk, will be able to evict RAM */ /* TODO: disk hierarchy */ disk = 1; else if (kind != STARPU_CPU_RAM) /* This is an accelerator, we can evict to main RAM */ evictable[i] = 1; } if (disk) for (i = 0; i < nnodes; i++) { enum starpu_node_kind kind = starpu_node_get_kind(i); if (kind == STARPU_CPU_RAM) evictable[i] = 1; } } /* A disk was registered, RAM is now evictable */ void _starpu_mem_chunk_disk_register(unsigned disk_memnode) { (void) disk_memnode; unsigned nnodes = starpu_memory_nodes_get_count(), i; for (i = 0; i < nnodes; i++) { enum starpu_node_kind kind = starpu_node_get_kind(i); if (kind == STARPU_CPU_RAM) { STARPU_HG_DISABLE_CHECKING(evictable[i]); evictable[i] = 1; } } } static int get_better_disk_can_accept_size(starpu_data_handle_t handle, unsigned node); static int 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]); STARPU_HG_DISABLE_CHECKING(prefetch_out_of_memory[i]); } /* We do not enable forcing available memory by default, since this makes StarPU spuriously free data when prefetching fills the memory. Clean buffers should be enough to be able to allocate data easily anyway. */ minimum_p = starpu_get_env_number_default("STARPU_MINIMUM_AVAILABLE_MEM", 0); target_p = starpu_get_env_number_default("STARPU_TARGET_AVAILABLE_MEM", 0); 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"); diduse_barrier = starpu_get_env_number_default("STARPU_DIDUSE_BARRIER", 0); } void _starpu_deinit_mem_chunk_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { struct mc_cache_entry *entry=NULL, *tmp=NULL; 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, STARPU_FETCH, 0, NULL, NULL, 0, "transfer_subtree_to_node"); /* 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 */ if (src_replicate->state != STARPU_INVALID) _STARPU_TRACE_DATA_STATE_INVALID(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) { if (handle->per_node[last].state != STARPU_OWNER) _STARPU_TRACE_DATA_STATE_OWNER(handle, last); 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(STARPU_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 && (starpu_node_get_kind(node) == STARPU_CPU_RAM)) _starpu_data_unregister_ram_pointer(handle, node); _STARPU_TRACE_START_FREE(node, mc->size, handle); mc->ops->free_data_on_node(data_interface, node); _STARPU_TRACE_END_FREE(node, handle); 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_alloc_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; } /* 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) { _starpu_data_unregister_ram_pointer(old_replicate->handle, node); old_replicate->mc = NULL; 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); } /* 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_throw_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node, struct _starpu_data_replicate *replicate, unsigned is_already_in_mc_list) { size_t freed = 0; starpu_data_handle_t handle; handle = mc->data; STARPU_ASSERT(handle); STARPU_ASSERT(node < STARPU_MAXNODES); /* This data should be written through to this node, avoid dropping it! */ if (node < sizeof(handle->wt_mask) * 8 && handle->wt_mask & (1<home_node) return 0; /* This data cannnot be pushed outside CPU memory */ if (!handle->ooc && starpu_node_get_kind(node) == STARPU_CPU_RAM && starpu_memory_nodes_get_numa_count() == 1) return 0; if (diduse_barrier && !mc->diduse) /* Hasn't been used yet, avoid evicting it */ 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. */ if (replicate) { /* Reuse for this replicate */ reuse_mem_chunk(node, replicate, mc, is_already_in_mc_list); freed = 1; } else { /* Free */ freed = do_free_mem_chunk(mc, node); } } _starpu_spin_unlock(&handle->header_lock); } else if (lock_all_subtree(handle)) /* try to lock all the subtree */ { if (!(replicate && handle->per_node[node].state == STARPU_OWNER)) { /* 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 && /* Only reuse memchunks which are easy to throw * away (which is likely thanks to periodic tidying). * If there are none, we prefer to let generic eviction * perhaps find other kinds of memchunks which will be * earlier in LRU, and easier to throw away. */ !(replicate && handle->per_node[node].state == STARPU_OWNER)) { 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, handle); /* 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, handle); #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 reused or freed */ if (replicate) { /* Reuse for this replicate */ reuse_mem_chunk(node, replicate, mc, is_already_in_mc_list); freed = 1; } else { /* Free */ freed = do_free_mem_chunk(mc, node); } } } } } } } /* unlock the tree */ unlock_all_subtree(handle); } return freed; } 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; if (ops_a->alloc_compare) ret = ops_a->alloc_compare(data_interface_a, data_interface_b); else ret = ops_a->compare(data_interface_a, data_interface_b); return ret; } #ifdef STARPU_USE_ALLOCATION_CACHE /* 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 int try_to_find_reusable_mc(unsigned node, starpu_data_handle_t data, struct _starpu_data_replicate *replicate, uint32_t footprint) { struct _starpu_mem_chunk *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); success = 1; } _starpu_spin_unlock(&mc_lock[node]); return success; } #endif /* this function looks for a memory chunk that matches a given footprint in the * list of mem chunk that are not important */ static int try_to_reuse_not_important_mc(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]); 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 (!mc->data->is_not_important) /* Important data, skip */ continue; if (mc->footprint != footprint || _starpu_data_interface_compare(data->per_node[node].data_interface, data->ops, mc->data->per_node[node].data_interface, mc->ops) != 1) /* Not the right type of interface, 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! */ success = try_to_throw_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; } /* * Try to find a buffer currently in use on the memory node which has the given * footprint. */ static int try_to_reuse_potentially_in_use_mc(unsigned node, starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, uint32_t footprint, enum _starpu_is_prefetch is_prefetch) { struct _starpu_mem_chunk *mc, *next_mc, *orig_next_mc; int success = 0; /* * 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. */ _starpu_spin_lock(&mc_lock[node]); restart: for (mc = _starpu_mem_chunk_list_begin(&mc_list[node]); mc != _starpu_mem_chunk_list_end(&mc_list[node]) && !success; mc = next_mc) { /* mc hopefully gets out of the list, we thus need to prefetch * the next element */ orig_next_mc = next_mc = _starpu_mem_chunk_list_next(mc); if (mc->remove_notify) /* Somebody already working here, skip */ continue; if (is_prefetch >= STARPU_IDLEFETCH) /* Do not evict a MC just for an idle fetch */ continue; if (is_prefetch >= STARPU_PREFETCH && !mc->wontuse) /* Do not evict something that we might reuse, just for a prefetch */ /* TODO ! */ /* FIXME: but perhaps we won't have any task using it in * the close future, we should perhaps rather check * mc->replicate->refcnt? */ continue; if (mc->footprint != footprint || _starpu_data_interface_compare(handle->per_node[node].data_interface, handle->ops, mc->data->per_node[node].data_interface, mc->ops) != 1) /* Not the right type of interface, 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! */ success = try_to_throw_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; } /* * Free the memory chunks 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=NULL, *tmp=NULL; 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_throw_mem_chunk(mc, node, NULL, 0); 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; STARPU_ASSERT(node < STARPU_MAXNODES); if (reclaim && !force) { static unsigned warned; STARPU_HG_DISABLE_CHECKING(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+1048575) / 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 && freedhome) /* 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); /* This data cannnot be pushed outside CPU memory */ if (!handle->ooc && starpu_node_get_kind(node) == STARPU_CPU_RAM) continue; 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! */ (node < sizeof(handle->wt_mask) * 8 && 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; } if (handle->home_node != -1 && (handle->per_node[handle->home_node].state != STARPU_INVALID || mc->relaxed_coherency == 1)) { /* It's available in the home node, this should have been marked as clean already */ mc->clean = 1; mc_clean_nb[node]++; _starpu_spin_unlock(&handle->header_lock); continue; } int target_node; if (handle->home_node == -1) target_node = choose_target(handle, node); else target_node = handle->home_node; if (target_node == -1) { /* Nowhere to put it, can't do much */ _starpu_spin_unlock(&handle->header_lock); continue; } STARPU_ASSERT(target_node != (int) node); /* 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[target_node], STARPU_R, STARPU_IDLEFETCH, 1, NULL, NULL, 0, "starpu_memchunk_tidy")) { /* 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); } total = starpu_memory_get_total(node); if (total <= 0) return; available = starpu_memory_get_available(node); /* Count cached allocation as being available */ available += mc_cache_size[node]; if (available >= (starpu_ssize_t) (total * minimum_p) / 100) /* Enough available space, do not trigger reclaiming */ 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; STARPU_HG_DISABLE_CHECKING(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+1048575) / 1048576)); } } _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; mc->diduse = 0; mc->wontuse = 0; 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, (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); STARPU_ASSERT(node < STARPU_MAXNODES); /* 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, enum _starpu_is_prefetch is_prefetch) { unsigned attempts = 0; starpu_ssize_t allocated_memory; int ret; starpu_ssize_t data_size = _starpu_data_get_alloc_size(handle); int told_reclaiming = 0; int reused = 0; _starpu_spin_checklocked(&handle->header_lock); _starpu_data_allocation_inc_stats(dst_node); /* perhaps we can directly reuse a buffer in the free-list */ uint32_t footprint = _starpu_compute_data_footprint(handle); int prefetch_oom = is_prefetch && prefetch_out_of_memory[dst_node]; #ifdef STARPU_USE_ALLOCATION_CACHE if (!prefetch_oom) _STARPU_TRACE_START_ALLOC_REUSE(dst_node, data_size, handle, is_prefetch); if (try_to_find_reusable_mc(dst_node, handle, replicate, footprint)) { _starpu_allocation_cache_hit(dst_node); if (!prefetch_oom) _STARPU_TRACE_END_ALLOC_REUSE(dst_node, handle, 1); return data_size; } if (!prefetch_oom) _STARPU_TRACE_END_ALLOC_REUSE(dst_node, handle, 0); #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 { if (!prefetch_oom) _STARPU_TRACE_START_ALLOC(dst_node, data_size, handle, is_prefetch); #if defined(STARPU_USE_CUDA) && defined(STARPU_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); if (!prefetch_oom) _STARPU_TRACE_END_ALLOC(dst_node, handle, allocated_memory); if (allocated_memory == -ENOMEM) { size_t handle_size = _starpu_data_get_alloc_size(handle); size_t reclaim = starpu_memstrategy_data_size_coefficient*handle_size; /* First try to flush data explicitly marked for freeing */ size_t freed = flush_memchunk_cache(dst_node, reclaim); if (freed >= reclaim) { /* That freed enough data, retry allocating */ prefetch_out_of_memory[dst_node] = 0; continue; } reclaim -= freed; /* Try to reuse an allocated data with the same interface (to avoid spurious free/alloc) */ if (_starpu_has_not_important_data && try_to_reuse_not_important_mc(dst_node, handle, replicate, footprint)) break; if (try_to_reuse_potentially_in_use_mc(dst_node, handle, replicate, footprint, is_prefetch)) { reused = 1; allocated_memory = data_size; break; } if (is_prefetch) { /* It's just prefetch, don't bother existing allocations */ /* And don't bother tracing allocation attempts */ prefetch_out_of_memory[dst_node] = 1; /* TODO: ideally we should not even try to allocate when we know we have not freed anything */ continue; } if (!told_reclaiming) { /* Prevent prefetches and such from happening */ (void) STARPU_ATOMIC_ADD(&reclaiming[dst_node], 1); told_reclaiming = 1; } /* That was not enough, we have to really reclaim */ _STARPU_TRACE_START_MEMRECLAIM(dst_node,is_prefetch); _starpu_memory_reclaim_generic(dst_node, 0, reclaim); _STARPU_TRACE_END_MEMRECLAIM(dst_node,is_prefetch); prefetch_out_of_memory[dst_node] = 0; } else prefetch_out_of_memory[dst_node] = 0; } while((allocated_memory == -ENOMEM) && attempts++ < 2); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(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 (reused) { /* We just reused an allocation, nothing more to do */ } else if (replicate->allocated) { /* Argl, somebody allocated it in between already, drop this one */ _STARPU_TRACE_START_FREE(dst_node, data_size, handle); handle->ops->free_data_on_node(data_interface, dst_node); _STARPU_TRACE_END_FREE(dst_node, handle); allocated_memory = 0; } else /* Install newly-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, enum _starpu_is_prefetch is_prefetch) { starpu_ssize_t allocated_memory; unsigned dst_node = replicate->memory_node; STARPU_ASSERT(dst_node < STARPU_MAXNODES); 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 && (starpu_node_get_kind(dst_node) == STARPU_CPU_RAM)) { /* We are allocating the buffer in main memory, also * register it for starpu_data_handle_to_pointer() */ void *ptr = starpu_data_handle_to_pointer(handle, dst_node); 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) { STARPU_ASSERT(memory_node < STARPU_MAXNODES); 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_ASSERT(node < STARPU_MAXNODES); if (!can_evict(node)) /* Don't bother */ return; _starpu_spin_lock(&mc_lock[node]); MC_LIST_ERASE(node, mc); mc->wontuse = 0; 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_ASSERT(node < STARPU_MAXNODES); if (!can_evict(node)) /* Don't bother */ return; _starpu_spin_lock(&mc_lock[node]); /* Avoid preventing it from being evicted */ mc->diduse = 1; mc->wontuse = 1; if (mc->data && mc->data->home_node != -1) { MC_LIST_ERASE(node, mc); /* Caller will schedule a clean transfer */ mc->clean = 1; MC_LIST_PUSH_CLEAN(node, mc); } /* TODO: else push to head of data to be evicted */ _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_ASSERT(node < STARPU_MAXNODES); if (!can_evict(node)) /* Don't bother */ 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_ASSERT(node < STARPU_MAXNODES); _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.0; for (i = 0; i < nnodes; i++) { if (starpu_node_get_kind(i) == STARPU_DISK_RAM && i != node && (handle->per_node[i].allocated || _starpu_memory_manager_test_allocate_size(i, _starpu_data_get_alloc_size(handle)) == 1)) { /* if we can write on the disk */ if ((_starpu_get_disk_flag(i) & STARPU_DISK_NO_RECLAIM) == 0) { unsigned numa; unsigned nnumas = starpu_memory_nodes_get_numa_count(); for (numa = 0; numa < nnumas; numa++) { /* TODO : check if starpu_transfer_predict(node, i,...) is the same */ double time_tmp = starpu_transfer_predict(node, numa, _starpu_data_get_alloc_size(handle)) + starpu_transfer_predict(i, numa, _starpu_data_get_alloc_size(handle)); if (target == -1 || time_disk > time_tmp) { target = i; time_disk = time_tmp; } } } } } return target; } #ifdef STARPU_DEVEL # warning TODO: better choose NUMA node #endif /* Choose a target memory node to put the value of the handle, because the current location (node) is getting tight */ static int choose_target(starpu_data_handle_t handle, unsigned node) { int target = -1; size_t size_handle = _starpu_data_get_alloc_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 && (starpu_node_get_kind(node) != STARPU_CPU_RAM)) { unsigned i; unsigned nb_numa_nodes = starpu_memory_nodes_get_numa_count(); for (i=0; iper_node[i].allocated || _starpu_memory_manager_test_allocate_size(i, size_handle) == 1) { target = i; break; } } if (target == -1) { 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 (starpu_node_get_kind(node) == STARPU_CPU_RAM) { target = get_better_disk_can_accept_size(handle, node); } else { /* node != 0 */ /* try to push data to RAM if we can before to push on disk*/ unsigned i; unsigned nb_numa_nodes = starpu_memory_nodes_get_numa_count(); for (i=0; iper_node[i].allocated || _starpu_memory_manager_test_allocate_size(i, size_handle) == 1) { target = i; break; } } /* no place in RAM */ if (target == -1) { 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.3.9+dfsg/src/datawizard/memalloc.h000066400000000000000000000074611413463044200206550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #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; /** Was this chunk used since it got allocated? */ unsigned diduse:1; /** Was this chunk marked as "won't use"? */ unsigned wontuse: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_mem_chunk_init_last(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, enum _starpu_is_prefetch 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); void _starpu_mem_chunk_disk_register(unsigned disk_memnode); #endif starpu-1.3.9+dfsg/src/datawizard/memory_manager.c000066400000000000000000000126201413463044200220520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 waiting_size[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]) { /* Tell deallocators we need this amount */ if (!waiting_size[node] || size < waiting_size[node]) waiting_size[node] = size; /* Wait for it */ 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; } 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 (waiting_size[node] && global_size[node] - used_size[node] >= waiting_size[node]) { /* And have those not happy enough tell us the size again */ waiting_size[node] = 0; 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_total_all_nodes() { unsigned memnodes, i; memnodes = starpu_memory_nodes_get_count(); starpu_ssize_t total = 0; for(i=0 ; i global_size[node]) { /* Tell deallocators we need this amount */ if (!waiting_size[node] || size < waiting_size[node]) waiting_size[node] = size; /* Wait for it */ STARPU_PTHREAD_COND_WAIT(&cond_nodes[node], &lock_nodes[node]); } STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); } int _starpu_memory_manager_test_allocate_size(unsigned node, size_t size) { int ret; if (global_size[node] == 0) ret = 1; else if (used_size[node] + size <= global_size[node]) ret = 1; else ret = 0; return ret; } starpu-1.3.9+dfsg/src/datawizard/memory_manager.h000066400000000000000000000024471413463044200220650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/datawizard/memory_nodes.c000066400000000000000000000132521413463044200215520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 char _starpu_worker_drives_memory[STARPU_NMAXWORKERS][STARPU_MAXNODES]; struct _starpu_memory_node_descr _starpu_descr; 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; unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { _starpu_descr.nodes[i] = STARPU_UNUSED; _starpu_descr.nworkers[i] = 0; } memset(&_starpu_worker_drives_memory, 0, sizeof(_starpu_worker_drives_memory)); STARPU_HG_DISABLE_CHECKING(_starpu_worker_drives_memory); _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); } #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(); } int starpu_memory_node_get_name(unsigned node, char *name, size_t size) { const char *prefix = _starpu_node_get_prefix(_starpu_descr.nodes[node]); return snprintf(name, size, "%s %d", prefix, _starpu_descr.devid[node]); } unsigned _starpu_memory_node_register(enum starpu_node_kind kind, int devid, struct _starpu_node_ops *node_ops) { 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 %d. 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; _starpu_descr.node_ops[node] = node_ops; /* 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(struct _starpu_worker *worker, starpu_pthread_cond_t *cond, 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].worker == worker); /* 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].worker = worker; _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].worker = worker; _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) { (void) workerid; return _starpu_worker_get_memory_node(workerid); } /* same utility as _starpu_memory_node_add_nworkers */ void _starpu_worker_drives_memory_node(struct _starpu_worker *worker, unsigned memnode) { if (! _starpu_worker_drives_memory[worker->workerid][memnode]) { _starpu_worker_drives_memory[worker->workerid][memnode] = 1; #ifdef STARPU_SIMGRID starpu_pthread_queue_register(&worker->wait, &_starpu_simgrid_transfer_queue[memnode]); #endif _starpu_memory_node_register_condition(worker, &worker->sched_cond, memnode); } } #undef starpu_worker_get_local_memory_node unsigned starpu_worker_get_local_memory_node(void) { return _starpu_worker_get_local_memory_node(); } int starpu_memory_node_get_devid(unsigned node) { return _starpu_descr.devid[node]; } starpu-1.3.9+dfsg/src/datawizard/memory_nodes.h000066400000000000000000000123261413463044200215600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif extern char _starpu_worker_drives_memory[STARPU_NMAXWORKERS][STARPU_MAXNODES]; struct _starpu_cond_and_worker { starpu_pthread_cond_t *cond; struct _starpu_worker *worker; }; struct _starpu_memory_node_descr { unsigned nnodes; enum starpu_node_kind nodes[STARPU_MAXNODES]; struct _starpu_node_ops *node_ops[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 starpu_sg_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_worker conditions_attached_to_node[STARPU_MAXNODES][STARPU_NMAXWORKERS]; struct _starpu_cond_and_worker 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); static inline void _starpu_memory_node_add_nworkers(unsigned node) { _starpu_descr.nworkers[node]++; } /** same utility as _starpu_memory_node_add_nworkers */ void _starpu_worker_drives_memory_node(struct _starpu_worker *worker, unsigned memnode); static inline struct _starpu_node_ops *_starpu_memory_node_get_node_ops(unsigned node) { return _starpu_descr.node_ops[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, starpu_sg_host_t host) { _starpu_descr.host[node] = host; } static inline starpu_sg_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, struct _starpu_node_ops *node_ops); //void _starpu_memory_node_attach_queue(struct starpu_jobq_s *q, unsigned nodeid); void _starpu_memory_node_register_condition(struct _starpu_worker *worker, starpu_pthread_cond_t *cond, unsigned nodeid); 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 #if STARPU_MAXNODES == 1 #define _starpu_memory_nodes_get_count() 1 #else static inline unsigned _starpu_memory_nodes_get_count(void) { return _starpu_descr.nnodes; } #endif #define starpu_memory_nodes_get_count _starpu_memory_nodes_get_count #if STARPU_MAXNODES == 1 #define _starpu_worker_get_memory_node(workerid) 0 #else 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; } #endif #define starpu_worker_get_memory_node _starpu_worker_get_memory_node #if STARPU_MAXNODES == 1 #define _starpu_worker_get_local_memory_node() 0 #else static inline unsigned _starpu_worker_get_local_memory_node(void) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (!worker) return STARPU_MAIN_RAM; return worker->memory_node; } #endif #define starpu_worker_get_local_memory_node _starpu_worker_get_local_memory_node #endif // __MEMORY_NODES_H__ starpu-1.3.9+dfsg/src/datawizard/memstats.c000066400000000000000000000067151413463044200207150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/datawizard/memstats.h000066400000000000000000000037161413463044200207200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/datawizard/node_ops.c000066400000000000000000000027021413463044200206560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 const char* _starpu_node_get_prefix(enum starpu_node_kind kind) { switch (kind) { case STARPU_CPU_RAM: return "NUMA"; case STARPU_CUDA_RAM: return "CUDA"; case STARPU_OPENCL_RAM: return "OpenCL"; case STARPU_DISK_RAM: return "Disk"; case STARPU_MIC_RAM: return "MIC"; case STARPU_MPI_MS_RAM: return "MPI_MS"; case STARPU_UNUSED: default: STARPU_ASSERT(0); return "unknown"; } } starpu-1.3.9+dfsg/src/datawizard/node_ops.h000066400000000000000000000050221413463044200206610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __NODE_OPS_H__ #define __NODE_OPS_H__ /** @file */ #include #include #include typedef int (*copy_interface_func_t)(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); typedef int (*copy_data_t)(uintptr_t src_ptr, size_t src_offset, unsigned src_node, uintptr_t dst_ptr, size_t dst_offset, unsigned dst_node, size_t ssize, struct _starpu_async_channel *async_channel); typedef int (*copy2d_data_t)(uintptr_t src_ptr, size_t src_offset, unsigned src_node, uintptr_t dst_ptr, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel); typedef int (*copy3d_data_t)(uintptr_t src_ptr, size_t src_offset, unsigned src_node, uintptr_t dst_ptr, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, struct _starpu_async_channel *async_channel); struct _starpu_node_ops { copy_interface_func_t copy_interface_to[STARPU_MPI_MS_RAM+1]; copy_data_t copy_data_to[STARPU_MPI_MS_RAM+1]; copy2d_data_t copy2d_data_to[STARPU_MPI_MS_RAM+1]; copy3d_data_t copy3d_data_to[STARPU_MPI_MS_RAM+1]; void (*wait_request_completion)(struct _starpu_async_channel *async_channel); unsigned (*test_request_completion)(struct _starpu_async_channel *async_channel); int (*is_direct_access_supported)(unsigned node, unsigned handling_node); uintptr_t (*malloc_on_node)(unsigned dst_node, size_t size, int flags); void (*free_on_node)(unsigned dst_node, uintptr_t addr, size_t size, int flags); char *name; }; const char* _starpu_node_get_prefix(enum starpu_node_kind kind); #endif // __NODE_OPS_H__ starpu-1.3.9+dfsg/src/datawizard/reduction.c000066400000000000000000000326211413463044200210470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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); #if defined(STARPU_HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) /* We make sure we do manipulate the proper device */ starpu_cuda_set_device(starpu_worker_get_devid(workerid)); #endif 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 #ifdef STARPU_USE_MPI_MASTER_SLAVE case STARPU_MPI_MS_WORKER: init_func = _starpu_mpi_ms_src_get_kernel_from_codelet(init_cl, 0); break; #endif default: STARPU_ABORT(); break; } STARPU_ASSERT(init_func); switch (starpu_worker_get_type(workerid)) { #ifdef STARPU_USE_MIC case 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, 1); _starpu_src_common_wait_completed_execution(node,devid,&arg,&arg_size); break; } #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE case STARPU_MPI_MS_WORKER: { struct _starpu_mp_node *node = _starpu_mpi_ms_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 , 1); _starpu_src_common_wait_completed_execution(node,devid,&arg,&arg_size); break; } #endif default: init_func(&replicate->data_interface, NULL); break; } 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.3.9+dfsg/src/datawizard/sort_data_handles.c000066400000000000000000000104661413463044200225340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_access_data, * _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.3.9+dfsg/src/datawizard/sort_data_handles.h000066400000000000000000000023171413463044200225350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/datawizard/user_interactions.c000066400000000000000000000632571413463044200226240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 (((handle->nplans && !handle->nchildren) || handle->siblings) && !(mode & STARPU_NOPLAN)) { _starpu_data_partition_access_submit(handle, (mode & STARPU_W) != 0); } 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, STARPU_PREFETCH, 0, 0, "starpu_data_request_allocation"); /* 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 detached; enum _starpu_is_prefetch prefetch; unsigned async; int prio; 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; }; static inline void _starpu_data_acquire_wrapper_init(struct user_interaction_wrapper *wrapper, starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode) { memset(wrapper, 0, sizeof(*wrapper)); wrapper->handle = handle; wrapper->node = node; wrapper->mode = mode; wrapper->finished = 0; STARPU_PTHREAD_COND_INIT(&wrapper->cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper->lock, NULL); } /* Called to signal completion of asynchronous data acquisition */ static inline void _starpu_data_acquire_wrapper_finished(struct user_interaction_wrapper *wrapper) { STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); wrapper->finished = 1; STARPU_PTHREAD_COND_SIGNAL(&wrapper->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); } /* Called to wait for completion of asynchronous data acquisition */ static inline void _starpu_data_acquire_wrapper_wait(struct user_interaction_wrapper *wrapper) { STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); while (!wrapper->finished) STARPU_PTHREAD_COND_WAIT(&wrapper->cond, &wrapper->lock); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); } static inline void _starpu_data_acquire_wrapper_fini(struct user_interaction_wrapper *wrapper) { STARPU_PTHREAD_COND_DESTROY(&wrapper->cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper->lock); } /* Called when the fetch into target memory is done, we're done! */ static inline void _starpu_data_acquire_fetch_done(struct user_interaction_wrapper *wrapper) { if (wrapper->node >= 0) { struct _starpu_data_replicate *replicate = &wrapper->handle->per_node[wrapper->node]; if (replicate->mc) replicate->mc->diduse = 1; } } /* Called when the data acquisition is done, to launch the fetch into target memory */ static inline void _starpu_data_acquire_launch_fetch(struct user_interaction_wrapper *wrapper, int async, void (*callback)(void *), void *callback_arg) { int node = wrapper->node; starpu_data_handle_t handle = wrapper->handle; struct _starpu_data_replicate *replicate = node >= 0 ? &handle->per_node[node] : NULL; int ret = _starpu_fetch_data_on_node(handle, node, replicate, wrapper->mode, wrapper->detached, wrapper->prefetch, async, callback, callback_arg, wrapper->prio, "_starpu_data_acquire_launch_fetch"); STARPU_ASSERT(!ret); } /* * Non Blocking data request from application */ /* Called when fetch is done, call the callback */ 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); _starpu_data_acquire_fetch_done(wrapper); wrapper->callback(wrapper->callback_arg); _starpu_data_acquire_wrapper_fini(wrapper); free(wrapper); } /* Called when the data acquisition is done, launch the fetch into target memory */ static void _starpu_data_acquire_continuation_non_blocking(void *arg) { _starpu_data_acquire_launch_fetch(arg, 1, _starpu_data_acquire_fetch_data_callback, arg); } /* Called when the implicit data dependencies are done, launch the data acquisition */ 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, int quick, 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)); _starpu_data_acquire_wrapper_init(wrapper, handle, node, mode); wrapper->async = 1; wrapper->callback = callback; wrapper->callback_arg = arg; 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; struct _starpu_job *pre_sync_job, *post_sync_job; 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; wrapper->pre_sync_task->type = STARPU_TASK_TYPE_DATA_ACQUIRE; pre_sync_job = _starpu_get_job_associated_to_task(wrapper->pre_sync_task); if (pre_sync_jobid) *pre_sync_jobid = pre_sync_job->job_id; wrapper->post_sync_task = starpu_task_create(); wrapper->post_sync_task->name = "_starpu_data_acquire_cb_release"; wrapper->post_sync_task->detach = 1; wrapper->post_sync_task->type = STARPU_TASK_TYPE_DATA_ACQUIRE; post_sync_job = _starpu_get_job_associated_to_task(wrapper->post_sync_task); if (post_sync_jobid) *post_sync_jobid = post_sync_job->job_id; if (quick) pre_sync_job->quick_next = post_sync_job; 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, sequential_consistency); 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_quick(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency, int quick) { return starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(handle, node, mode, callback, arg, sequential_consistency, quick, NULL, NULL); } 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_quick(handle, node, mode, callback, arg, sequential_consistency, 0); } 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) { int home_node = handle->home_node; if (home_node < 0) home_node = STARPU_MAIN_RAM; return starpu_data_acquire_on_node_cb(handle, home_node, 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) { int home_node = handle->home_node; if (home_node < 0) home_node = STARPU_MAIN_RAM; return starpu_data_acquire_on_node_cb_sequential_consistency(handle, home_node, 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); _starpu_data_acquire_launch_fetch(wrapper, 0, NULL, NULL); _starpu_data_acquire_fetch_done(wrapper); _starpu_data_acquire_wrapper_finished(wrapper); } /* 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; _starpu_data_acquire_wrapper_init(&wrapper, handle, node, mode); // _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.pre_sync_task->type = STARPU_TASK_TYPE_DATA_ACQUIRE; wrapper.post_sync_task = starpu_task_create(); wrapper.post_sync_task->name = "_starpu_data_acquire_post"; wrapper.post_sync_task->detach = 1; wrapper.post_sync_task->type = STARPU_TASK_TYPE_DATA_ACQUIRE; 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, sequential_consistency); 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)) { /* no one has locked this data yet, so we proceed immediately */ _starpu_data_acquire_launch_fetch(&wrapper, 0, NULL, NULL); _starpu_data_acquire_fetch_done(&wrapper); } else { _starpu_data_acquire_wrapper_wait(&wrapper); } _starpu_data_acquire_wrapper_fini(&wrapper); /* 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) { int home_node = handle->home_node; if (home_node < 0) home_node = STARPU_MAIN_RAM; return starpu_data_acquire_on_node(handle, home_node, 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; _starpu_data_acquire_wrapper_init(&wrapper, handle, node, mode); /* 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)) { /* no one has locked this data yet, so we proceed immediately */ _starpu_data_acquire_launch_fetch(&wrapper, 0, NULL, NULL); _starpu_data_acquire_fetch_done(&wrapper); } else { _starpu_data_acquire_wrapper_wait(&wrapper); } _starpu_data_acquire_wrapper_fini(&wrapper); 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_NO_NODE_LOCK_ALL) { 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) { int home_node = handle->home_node; if (home_node < 0) home_node = STARPU_MAIN_RAM; starpu_data_release_on_node(handle, home_node); } 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; _starpu_data_acquire_launch_fetch(wrapper, wrapper->async, NULL, NULL); if (wrapper->async) free(wrapper); else _starpu_data_acquire_wrapper_finished(wrapper); _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, enum _starpu_is_prefetch prefetch, int prio) { 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)); _starpu_data_acquire_wrapper_init(wrapper, handle, node, STARPU_R); wrapper->detached = async; wrapper->prefetch = prefetch; wrapper->async = async; wrapper->prio = prio; 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_data_acquire_launch_fetch(wrapper, async, NULL, NULL); _starpu_data_acquire_wrapper_fini(wrapper); free(wrapper); /* 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_data_acquire_wrapper_wait(wrapper); _starpu_data_acquire_wrapper_fini(wrapper); 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, STARPU_FETCH, 0); } int starpu_data_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio) { return _starpu_prefetch_data_on_node_with_mode(handle, node, async, STARPU_R, STARPU_PREFETCH, prio); } int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) { return starpu_data_prefetch_on_node_prio(handle, node, async, 0); } int starpu_data_idle_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio) { return _starpu_prefetch_data_on_node_with_mode(handle, node, async, STARPU_R, STARPU_IDLEFETCH, prio); } int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) { return starpu_data_idle_prefetch_on_node_prio(handle, node, async, 0); } static void _starpu_data_wont_use(void *data) { unsigned node; starpu_data_handle_t handle = data; _STARPU_TRACE_DATA_DOING_WONT_USE(handle); _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_NO_NODE_LOCK_ALL); if (handle->home_node != -1) starpu_data_idle_prefetch_on_node(handle, handle->home_node, 1); else { if (handle->ooc) { /* Try to push it to some disk */ unsigned i; unsigned nnodes = starpu_memory_nodes_get_count(); for (i = 0; i < nnodes; i++) { if (starpu_node_get_kind(i) == STARPU_DISK_RAM) starpu_data_idle_prefetch_on_node(handle, i, 1); } } } } void starpu_data_wont_use(starpu_data_handle_t handle) { if (!handle->initialized) /* No value atm actually */ return; _STARPU_TRACE_DATA_WONT_USE(handle); starpu_data_acquire_on_node_cb_sequential_consistency_quick(handle, STARPU_ACQUIRE_NO_NODE_LOCK_ALL, STARPU_R, _starpu_data_wont_use, handle, 1, 1); } /* * 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; } void starpu_data_set_ooc_flag(starpu_data_handle_t handle, unsigned flag) { handle->ooc = flag; } unsigned starpu_data_get_ooc_flag(starpu_data_handle_t handle) { return handle->ooc; } /* 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].request[node]) { requested = 1; break; } } *is_requested = requested; } // _starpu_spin_unlock(&handle->header_lock); } starpu-1.3.9+dfsg/src/datawizard/write_back.c000066400000000000000000000055521413463044200211700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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(1, 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, STARPU_IDLEFETCH, 1, wt_callback, handle, 0, "_starpu_write_through_data"); /* 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.3.9+dfsg/src/datawizard/write_back.h000066400000000000000000000021771413463044200211750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/debug/000077500000000000000000000000001413463044200156375ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/debug/latency.c000066400000000000000000000035611413463044200174470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, STARPU_FETCH, 0, NULL, NULL, 0, "_starpu_benchmark_ping_pong"); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, 0, 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, STARPU_FETCH, 0, NULL, NULL, 0, "_starpu_benchmark_ping_pong"); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, 0, replicate_1); } } starpu-1.3.9+dfsg/src/debug/starpu_debug_helpers.h000066400000000000000000000023201413463044200222130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/debug/structures_size.c000066400000000000000000000034011413463044200212560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/debug/traces/000077500000000000000000000000001413463044200171205ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/debug/traces/anim.c000066400000000000000000000470321413463044200202160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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=NULL, *tmp=NULL; 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 (to_p) { 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 (from_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.3.9+dfsg/src/debug/traces/starpu_fxt.c000066400000000000000000004420251413463044200214720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Joris Pablo * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2017-2021 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_POTI #include #define STARPU_POTI_STR_LEN 200 #endif #define STARPU_TRACE_STR_LEN 200 #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 MPI_MS_WORKER_COLORS_NB 9 #define OTHER_WORKER_COLORS_NB 4 /* How many times longer an idle period has to be before the smoothing * heuristics avoids averaging codelet gflops */ #define IDLE_FACTOR 2 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 *mpi_ms_worker_colors[MPI_MS_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 mpi_ms_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; static FILE *trace_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; int show; unsigned type; unsigned long job_id; unsigned long submit_order; long priority; int color; 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; char **dep_labels; unsigned long ndata; struct data_parameter_info *data; int mpi_rank; }; static struct task_info *tasks_info; static struct task_info *get_task(unsigned long job_id, int mpi_rank) { struct task_info *task; HASH_FIND(hh, tasks_info, &job_id, sizeof(job_id), task); if (!task) { unsigned i; _STARPU_MALLOC(task, sizeof(*task)); task->model_name = NULL; task->name = NULL; task->exclude_from_dag = 0; task->show = 0; task->type = 0; task->job_id = job_id; task->submit_order = 0; task->priority = 0; task->color = 0; 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->dep_labels = 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; } /* Return whether to show this task in the DAG or not */ static int show_task(struct task_info *task, struct starpu_fxt_options *options) { if (task->show) return 1; if (task->type & STARPU_TASK_TYPE_INTERNAL && !options->internal) return 0; if (task->type & STARPU_TASK_TYPE_DATA_ACQUIRE && options->no_acquire) return 0; return 1; } static void task_dump(struct task_info *task, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; 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->model_name); fprintf(tasks_file, "JobId: %s%lu\n", prefix, task->job_id); if (task->submit_order) fprintf(tasks_file, "SubmitOrder: %lu\n", task->submit_order); fprintf(tasks_file, "Priority: %ld\n", task->priority); if (task->dependencies) { fprintf(tasks_file, "DependsOn:"); for (i = 0; i < task->ndeps; i++) fprintf(tasks_file, " %s%lu", prefix, task->dependencies[i]); fprintf(tasks_file, "\n"); } if (task->dep_labels) { fprintf(tasks_file, "DepLabels:"); for (i = 0; i < task->ndeps; i++) fprintf(tasks_file, " %s", task->dep_labels[i]); fprintf(tasks_file, "\n"); } 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); 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: free(task->name); free(task->model_name); free(task->dependencies); if (task->dep_labels) { for (i = 0; i < task->ndeps; i++) free(task->dep_labels[i]); free(task->dep_labels); } free(task->parameters); free(task->data); 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; long mpi_tag; }; static 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; data->mpi_tag = -1; 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); fprintf(data_file, "Size: %lu\n", (unsigned long) data->size); if (data->description) fprintf(data_file, "Description: %s\n", 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); if (data->mpi_tag >= 0) fprintf(data_file, "MPITag: %ld\n", data->mpi_tag); fprintf(data_file, "\n"); out: free(data->description); free(data->name); 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_mpi_ms_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) return; worker_colors[workerid] = mpi_ms_worker_colors[mpi_ms_index++]; if (mpi_ms_index == MPI_MS_WORKER_COLORS_NB) mpi_ms_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_color_symbol_red(char *name) { /* choose some color ... 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_color_symbol_green(char *name) { /* choose some color ... 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_color_symbol_blue(char *name) { /* choose some color ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("blue", hash_symbol) % 1024; } /* Start time of last codelet for this worker */ static double last_codelet_start[STARPU_NMAXWORKERS]; /* End time of last codelet for this worker */ static double last_codelet_end[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; unsigned long size; const char *type; unsigned long handle; 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; ) /* List of ongoing computations */ static struct _starpu_computation_list computation_list; /* Last computation for each worker */ static struct _starpu_computation *ongoing_computation[STARPU_NMAXWORKERS]; /* Current total GFlops */ static double current_computation; /* Time of last update of current total GFlops */ static double current_computation_time; /* * Generic tools */ #define WORKER_STATE (1 << 0) #define THREAD_STATE (1 << 1) #define COMM_THREAD_STATE (1 << 2) #define USER_THREAD_STATE (1 << 3) static struct { const char *short_name; const char *long_name; uint8_t flags; } states_list[] = { { "Fi", "FetchingInput", WORKER_STATE | THREAD_STATE }, { "Po", "PushingOutput", WORKER_STATE | THREAD_STATE }, { "P", "Progressing", WORKER_STATE | THREAD_STATE }, { "U", "Unpartitioning", WORKER_STATE | THREAD_STATE }, { "B", "Overhead", WORKER_STATE | THREAD_STATE }, { "In", "Initializing", WORKER_STATE | THREAD_STATE }, { "D", "Deinitializing", WORKER_STATE | THREAD_STATE }, { "E", "Executing", WORKER_STATE | THREAD_STATE }, { "C", "Callback", WORKER_STATE | THREAD_STATE | USER_THREAD_STATE }, { "H", "Hypervisor", WORKER_STATE | THREAD_STATE }, { "Sc", "Scheduling", WORKER_STATE | THREAD_STATE | USER_THREAD_STATE }, { "I", "Idle", WORKER_STATE | THREAD_STATE }, { "Sl", "Sleeping", WORKER_STATE | THREAD_STATE | COMM_THREAD_STATE }, { "Bu", "Building task", THREAD_STATE | COMM_THREAD_STATE | USER_THREAD_STATE }, { "Su", "Submitting task", THREAD_STATE | COMM_THREAD_STATE | USER_THREAD_STATE }, { "Th", "Throttling task submission", THREAD_STATE | COMM_THREAD_STATE | USER_THREAD_STATE }, { "MD", "Decoding task for MPI", THREAD_STATE | USER_THREAD_STATE }, { "MPr", "Preparing task for MPI", THREAD_STATE | USER_THREAD_STATE }, { "MPo", "Post-processing task for MPI", THREAD_STATE | USER_THREAD_STATE }, { "P", "Processing", COMM_THREAD_STATE }, { "UT", "UserTesting", COMM_THREAD_STATE }, { "UW", "UserWaiting", COMM_THREAD_STATE }, { "SdS", "SendSubmitted", COMM_THREAD_STATE }, { "RvS", "ReceiveSubmitted", COMM_THREAD_STATE }, { "SdC", "SendCompleted", COMM_THREAD_STATE }, { "RvC", "ReceiveCompleted", COMM_THREAD_STATE }, { "W", "Waiting task", THREAD_STATE | USER_THREAD_STATE }, { "WA", "Waiting all tasks", THREAD_STATE | USER_THREAD_STATE }, { "No", "Nothing", THREAD_STATE | USER_THREAD_STATE }, }; static const char *get_state_name(const char *short_name, uint32_t states) { unsigned i; for (i = 0; i < sizeof(states_list) / sizeof(states_list[0]); i++) if ((states_list[i].flags & states) && !strcmp(states_list[i].short_name, short_name)) return states_list[i].long_name; return short_name; } 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; static struct worker_entry { UT_hash_handle hh; unsigned long tid; int workerid; int sync; /* Set only for workers which are part of the same set, i.e. on thread drivers several workers */ } *worker_ids; static int register_thread(unsigned long nodeid, unsigned long tid, int workerid, int sync) { struct worker_entry *entry = NULL; tid = nodeid*tid+tid; 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 nodeid, 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(nodeid, tid, workerid, sync); } static int prefixTOnodeid (const char *prefix) { //if we are a single-node trace, prefix is empty, so return 0 if (strcmp(prefix, "")==0) return 0; char *str = strdup(prefix); str[strlen(prefix)-1] = '\0'; unsigned long nodeid = atoi(str); free(str); return nodeid; } /* Register user threads if not done already */ static void register_user_thread(double timestamp, unsigned long tid, const char *prefix) { if (register_thread(prefixTOnodeid(prefix), 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, sizeof(new_thread_container_name), "%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 nodeid, unsigned long tid) { int ret = register_thread(nodeid, tid, -2, 0); STARPU_ASSERT(ret == 1); } static int find_worker_id(unsigned long nodeid, unsigned long tid) { struct worker_entry *entry; tid = nodeid*tid+tid; 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 nodeid, unsigned long tid) { struct worker_entry *entry; tid = nodeid*tid+tid; 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 memnode_event(double time, const char *prefix, unsigned int memnodeid, const char *name, unsigned long handle, unsigned long info, unsigned long size, unsigned int dest, struct starpu_fxt_options *options) { if (!options->memory_states) return; #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; char p_handle[STARPU_POTI_STR_LEN]; memmanager_container_alias(container, STARPU_POTI_STR_LEN, prefix, memnodeid); snprintf(p_handle, sizeof(p_handle), "%lx", handle); #ifdef HAVE_POTI_USER_NEWEVENT char p_dest[STARPU_POTI_STR_LEN]; char p_info[STARPU_POTI_STR_LEN]; char p_size[STARPU_POTI_STR_LEN]; memmanager_container_alias(p_dest, STARPU_POTI_STR_LEN, prefix, dest); snprintf(p_info, sizeof(p_info), "%lu", info); snprintf(p_size, sizeof(p_size), "%lu", size); poti_user_NewEvent(_starpu_poti_MemoryEvent, time, container, name, "0", 4, p_handle, p_info, p_size, p_dest); #else poti_NewEvent(time, container, name, p_handle); #endif #else fprintf(out_paje_file, "22 %.9f %s %smm%u 0 %lx %lu %lu %smm%u\n", time, name, prefix, memnodeid, handle, info, size, prefix, dest); #endif } static void worker_set_state(double time, const char *prefix, long unsigned int workerid, const char *name) { if (fut_keymask == FUT_KEYMASK0) return; if (!out_paje_file) 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; if (!out_paje_file) 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; if (!out_paje_file) 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(prefixTOnodeid(prefix), threadid)) /* Unless using worker sets, collapse thread and worker */ return worker_set_state(time, prefix, find_worker_id(prefixTOnodeid(prefix), threadid), name); if (!out_paje_file) return; #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); if (!out_paje_file) return; #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(prefixTOnodeid(prefix), threadid)) /* Unless using worker sets, collapse thread and worker */ return worker_push_state(time, prefix, find_worker_id(prefixTOnodeid(prefix), threadid), name); if (!out_paje_file) return; #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(prefixTOnodeid(prefix), threadid)) /* Unless using worker sets, collapse thread and worker */ return worker_pop_state(time, prefix, find_worker_id(prefixTOnodeid(prefix), threadid)); if (!out_paje_file) return; #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 STARPU_ATTRIBUTE_UNUSED, long iteration, long subiteration, struct starpu_fxt_options *options) { struct task_info *task = get_task(job_id, options->file_rank); #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); char size_str[STARPU_POTI_STR_LEN]; char parameters_str[STARPU_POTI_STR_LEN]; char footprint_str[STARPU_POTI_STR_LEN]; char tag_str[STARPU_POTI_STR_LEN]; char jobid_str[STARPU_POTI_STR_LEN]; char submitorder_str[STARPU_POTI_STR_LEN]; char gflop_str[STARPU_POTI_STR_LEN]; char X_str[STARPU_POTI_STR_LEN], Y_str[STARPU_POTI_STR_LEN], Z_str[STARPU_POTI_STR_LEN]; char iteration_str[STARPU_POTI_STR_LEN], subiteration_str[STARPU_POTI_STR_LEN]; snprintf(size_str, sizeof(size_str), "%lu", size); snprintf(parameters_str, sizeof(parameters_str), "%s", parameters); snprintf(footprint_str, sizeof(footprint_str), "%08lx", footprint); snprintf(tag_str, sizeof(tag_str), "%016llx", tag); snprintf(jobid_str, sizeof(jobid_str), "%s%lu", prefix, job_id); snprintf(submitorder_str, sizeof(submitorder_str), "%s%lu", prefix, task->submit_order); snprintf(gflop_str, sizeof(gflop_str), "%f", gflop); snprintf(X_str, sizeof(X_str), "%u", X); snprintf(Y_str, sizeof(Y_str), "%u", Y); snprintf(Z_str, sizeof(Z_str), "%u", Z); snprintf(iteration_str, sizeof(iteration_str), "%ld", iteration); snprintf(subiteration_str, sizeof(subiteration_str), "%ld", subiteration); #ifdef HAVE_POTI_INIT_CUSTOM poti_user_SetState(_starpu_poti_extendedSetState, time, container, "WS", name, 11, size_str, parameters_str, footprint_str, tag_str, jobid_str, submitorder_str, gflop_str, X_str, Y_str, /* Z_str, */ iteration_str, subiteration_str); #else poti_SetState(time, container, "WS", name); #endif #else fprintf(out_paje_file, "20 %.9f %sw%lu WS %s %lu %s %08lx %016llx %s%lu %s%lu %f %u %u "/*"%u "*/"%ld %ld\n", time, prefix, workerid, name, size, parameters, footprint, tag, prefix, job_id, prefix, task->submit_order, 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 } static void recfmt_dump_state(double time, const char *event, int workerid, long int threadid, const char *name, const char *type) { fprintf(trace_file, "E: %s\n", event); if (name) fprintf(trace_file, "N: %s\n", name); if (type) fprintf(trace_file, "C: %s\n", type); fprintf(trace_file, "W: %d\n", workerid); if (threadid == -1) fprintf(trace_file, "T: -1\n"); else fprintf(trace_file, "T: %ld\n", threadid); fprintf(trace_file, "S: %f\n", time); fprintf(trace_file, "\n"); } static void recfmt_set_state(double time, int workerid, long int threadid, const char *name, const char *type) { recfmt_dump_state(time, "SetState", workerid, threadid, name, type); } static void recfmt_push_state(double time, int workerid, long unsigned int threadid, const char *name, const char *type) { recfmt_dump_state(time, "PushState", workerid, threadid, name, type); } static void recfmt_pop_state(double time, int workerid, long unsigned int threadid) { recfmt_dump_state(time, "PopState", workerid, threadid, NULL, NULL); } static void recfmt_worker_set_state(double time, int workerid, const char *name, const char *type) { const char *state_name; /* Special case for task events. */ if (!strcmp(type, "Task")) state_name = name; else state_name = get_state_name(name, WORKER_STATE); recfmt_set_state(time, workerid, -1, state_name, type); } static void recfmt_thread_set_state(double time, unsigned long nodeid, long unsigned int threadid, const char *name, const char *type) { const char *state_name; /* Special case for the end event which is somehow a fake. */ if (!strcmp(name, "End") && !type) state_name = name; else state_name = get_state_name(name, THREAD_STATE); recfmt_set_state(time, find_worker_id(nodeid, threadid), threadid, state_name, type); } static void recfmt_thread_push_state(double time, unsigned long nodeid, long unsigned int threadid, const char *name, const char *type) { const char *state_name = get_state_name(name, THREAD_STATE); recfmt_push_state(time, find_worker_id(nodeid, threadid), threadid, state_name, type); } static void recfmt_thread_pop_state(double time, unsigned long nodeid, long unsigned int threadid) { recfmt_pop_state(time, find_worker_id(nodeid, threadid), threadid); } static void recfmt_mpicommthread_set_state(double time, const char *name) { const char *state_name = get_state_name(name, COMM_THREAD_STATE); recfmt_set_state(time, -1, 0, state_name, "MPI"); /* XXX */ } static void recfmt_mpicommthread_push_state(double time, const char *name) { const char *state_name = get_state_name(name, COMM_THREAD_STATE); recfmt_push_state(time, -1, 0, state_name, "MPI"); /* XXX */ } static void recfmt_mpicommthread_pop_state(double time) { recfmt_pop_state(time, -1, 0); } static void recfmt_user_thread_push_state(double time, long unsigned threadid, const char *name, const char *type) { const char *state_name = get_state_name(name, USER_THREAD_STATE); recfmt_push_state(time, -1, threadid, state_name, type); } static void recfmt_user_thread_pop_state(double time, long unsigned threadid) { recfmt_pop_state(time, -1, threadid); } /* * 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) { double now = get_event_time_stamp(ev, options); #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, sizeof(new_memnode_container_name), "%sMEMNODE%"PRIu64"", prefix, ev->param[0]); poti_CreateContainer(now, 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, sizeof(new_memmanager_container_name), "%sMEMMANAGER%"PRIu64"", prefix, ev->param[0]); poti_CreateContainer(now, 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", now, 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", now, 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(now, new_memmanager_container_alias, "use", 0.0); poti_SetVariable(now, new_memmanager_container_alias, "bwi_mm", 0.0); poti_SetVariable(now, new_memmanager_container_alias, "bwo_mm", 0.0); #else fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" use 0.0\n", now, prefix, ev->param[0]); fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" bwi_mm 0.0\n", now, prefix, ev->param[0]); fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" bwo_mm 0.0\n", now, prefix, ev->param[0]); #endif } } } /* * Function that creates a synthetic stream id based on the order they appear from the trace */ static int create_ordered_stream_id (int nodeid, int devid) { static int stable[MAX_MPI_NODES][STARPU_MAXCUDADEVS]; STARPU_ASSERT(nodeid < MAX_MPI_NODES); STARPU_ASSERT(devid < STARPU_MAXCUDADEVS); return stable[nodeid][devid]++; } 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(prefixTOnodeid(prefix), 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_MPI_KEY: set_next_mpi_ms_worker_color(workerid); kindstr = "mpi_ms"; arch.devices[0].type = STARPU_MPI_MS_WORKER; arch.devices[0].devid = devid; arch.devices[0].ncores = 1; break; default: STARPU_ABORT(); } double now = get_event_time_stamp(ev, options); if (out_paje_file) { char new_worker_container_name[STARPU_TRACE_STR_LEN]; if (arch.devices[0].type == STARPU_CUDA_WORKER) { // If CUDA, workers might be streams, so create an unique name for each of them int streamid = create_ordered_stream_id (prefixTOnodeid(prefix), devid); snprintf(new_worker_container_name, sizeof(new_worker_container_name), "%s%s%d_%d", prefix, kindstr, devid, streamid); } else { // If not CUDA, we suppose worker name is the prefix, the kindstr, and the devid snprintf(new_worker_container_name, sizeof(new_worker_container_name), "%s%s%d", prefix, kindstr, devid); } #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, sizeof(new_thread_container_name), "%sT%d", prefix, bindid); if (new_thread) poti_CreateContainer(now, new_thread_container_alias, "T", memnode_container, new_thread_container_name); poti_CreateContainer(now, new_worker_container_alias, "W", new_thread_container_alias, new_worker_container_name); if (!options->no_flops) poti_SetVariable(now, new_worker_container_alias, "gf", 0.0); #else if (new_thread) fprintf(out_paje_file, "7 %.9f %st%lu T %smn%d %sT%d\n", now, prefix, threadid, prefix, nodeid, prefix, bindid); fprintf(out_paje_file, "7 %.9f %sw%d W %st%lu %s\n", now, prefix, workerid, prefix, threadid, new_worker_container_name); if (!options->no_flops) fprintf(out_paje_file, "13 %.9f %sw%d gf 0.0\n", now, prefix, workerid); #endif } /* start initialization */ thread_set_state(now, prefix, threadid, "In"); if (trace_file) recfmt_thread_set_state(now, prefixTOnodeid(prefix), threadid, "In", "Runtime"); 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 (ev->nb_params < 2) { worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); STARPU_ASSERT(worker >= 0); } else worker = ev->param[1]; thread_set_state(get_event_time_stamp(ev, options), prefix, ev->param[0], "B"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "B", "Runtime"); worker_set_state(get_event_time_stamp(ev, options), prefix, worker, "I"); if (trace_file) recfmt_worker_set_state(get_event_time_stamp(ev, options), worker, "I", "Other"); /* 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; long unsigned int threadid = ev->param[0]; thread_set_state(get_event_time_stamp(ev, options), prefix, threadid, "D"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), threadid, "D", "Runtime"); } 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 } if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[1], "End", NULL); } #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, unsigned color, 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 color ... that's disguting yes */ unsigned hash_symbol_red = get_color_symbol_red(name); unsigned hash_symbol_green = get_color_symbol_green(name); unsigned hash_symbol_blue = get_color_symbol_blue(name); uint32_t hash_sum = hash_symbol_red + hash_symbol_green + hash_symbol_blue; float red, green, blue; if (color != 0) { red = color / 0x100 / 0x100; green = (color / 0x100) & 0xff; blue = color & 0xff; } else 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]), "%.*s", (int) sizeof(_starpu_last_codelet_symbol[worker])-1, 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); double last_start_codelet_time = last_codelet_start[worker]; last_codelet_start[worker] = start_codelet_time; struct task_info *task = get_task(ev->param[0], options->file_rank); create_paje_state_if_not_found(name, task->color, options); 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 (trace_file) recfmt_worker_set_state(start_codelet_time, ev->param[2], name, "Task"); struct _starpu_computation *comp = ongoing_computation[worker]; if (!comp) { /* First task for this worker */ comp = ongoing_computation[worker] = _starpu_computation_new(); comp->peer = NULL; comp->comp_start = start_codelet_time; if (!options->no_flops) _starpu_computation_list_push_back(&computation_list, comp); } else if (options->no_smooth || (start_codelet_time - last_codelet_end[worker]) >= IDLE_FACTOR * (last_codelet_end[worker] - last_start_codelet_time)) { /* Long idle period, move previously-allocated comp to now */ comp->comp_start = start_codelet_time; if (!options->no_flops) { _starpu_computation_list_erase(&computation_list, 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]), "%.*s", (int) sizeof(last_codelet_parameter_description[worker][num])-1, 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]; /* Paje won't like spaces or tabs, replace with underscores */ char *c; for (c = parameters; *c; c++) if ((*c == ' ') || (*c == '\t')) *c = '_'; 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], options); if (sched_ctx != 0) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; char typectx[STARPU_POTI_STR_LEN]; snprintf(typectx, sizeof(typectx), "Ctx%u", sched_ctx); worker_container_alias(container, sizeof(container), prefix, worker); poti_SetState(last_codelet_start[worker], container, typectx, _starpu_last_codelet_symbol[worker]); char name[STARPU_POTI_STR_LEN]; snprintf(name, sizeof(name), "%s", _starpu_last_codelet_symbol[worker]); char size_str[STARPU_POTI_STR_LEN]; char parameters_str[STARPU_POTI_STR_LEN]; char footprint_str[STARPU_POTI_STR_LEN]; char tag_str[STARPU_POTI_STR_LEN]; char jobid_str[STARPU_POTI_STR_LEN]; char submitorder_str[STARPU_POTI_STR_LEN]; snprintf(size_str, sizeof(size_str), "%ld", ev->param[1]); snprintf(parameters_str, sizeof(parameters_str), "%s", parameters); snprintf(footprint_str, sizeof(footprint_str), "%08lx", ev->param[2]); snprintf(tag_str, sizeof(tag_str), "%016lx", ev->param[4]); snprintf(jobid_str, sizeof(jobid_str), "%s%lu", prefix, job_id); snprintf(submitorder_str, sizeof(submitorder_str), "%s%lu", prefix, task->submit_order); #ifdef HAVE_POTI_INIT_CUSTOM poti_user_SetState(_starpu_poti_semiExtendedSetState, last_codelet_start[worker], container, typectx, name, 6, size_str, parameters_str, footprint_str, tag_str, jobid_str, submitorder_str); #else poti_SetState(last_codelet_start[worker], container, typectx, name); #endif #else fprintf(out_paje_file, "21 %.9f %sw%d Ctx%u \"%s\" %ld %s %08lx %016lx %s%lu %s%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], prefix, job_id, prefix, task->submit_order); #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); double last_end_codelet_time = last_codelet_end[worker]; last_codelet_end[worker] = end_codelet_time; 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, 5); const char *state = "I"; if (find_sync(prefixTOnodeid(prefix), threadid)) state = "B"; worker_set_state(end_codelet_time, prefix, worker, state); if (trace_file) recfmt_worker_set_state(end_codelet_time, worker, state, "Other"); struct task_info *task = get_task(ev->param[0], options->file_rank); get_task(ev->param[0], options->file_rank)->end_time = end_codelet_time; update_accumulated_time(worker, 0.0, end_codelet_time - task->start_time, end_codelet_time, 0); struct _starpu_computation *peer = ongoing_computation[worker]; double gflops_start = peer->comp_start; double codelet_length; double gflops; struct _starpu_computation *comp; codelet_length = end_codelet_time - gflops_start; gflops = (((double)task->kflops) / 1000000) / (codelet_length / 1000); if (options->no_flops) { _starpu_computation_delete(peer); } else { if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, worker); if (gflops_start != last_end_codelet_time) { if (last_end_codelet_time != 0) { poti_SetVariable(last_end_codelet_time, container, "gf", 0.); } } poti_SetVariable(gflops_start, container, "gf", gflops); #else if (gflops_start != last_end_codelet_time) { if (last_end_codelet_time != 0) { fprintf(out_paje_file, "13 %.9f %sw%d gf %f\n", last_end_codelet_time, prefix, worker, 0.); } } fprintf(out_paje_file, "13 %.9f %sw%d gf %f\n", gflops_start, prefix, worker, gflops); #endif } comp = _starpu_computation_new(); comp->comp_start = end_codelet_time; comp->gflops = -gflops; peer->gflops = +gflops; comp->peer = peer; peer->peer = comp; _starpu_computation_list_push_back(&computation_list, comp); } /* Prepare comp for next codelet */ comp = _starpu_computation_new(); comp->comp_start = end_codelet_time; comp->peer = NULL; if (!options->no_flops) _starpu_computation_list_push_back(&computation_list, comp); ongoing_computation[worker] = 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), "%.*s", (int) sizeof(dumped_codelets[dumped_codelets_count - 1].perfmodel_archname)-1, 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(prefixTOnodeid(prefix), threadid)) thread_set_state(get_event_time_stamp(ev, options), prefix, threadid, "E"); if (trace_file && !find_sync(prefixTOnodeid(prefix), threadid)) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), threadid, "E", "Runtime"); } 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(prefixTOnodeid(prefix), threadid)) thread_set_state(get_event_time_stamp(ev, options), prefix, threadid, "B"); if (trace_file && !find_sync(prefixTOnodeid(prefix), threadid)) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), threadid, "B", "Runtime"); } 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, sizeof(paje_value), "%lu", code); #endif char *prefix = options->file_prefix; double now = get_event_time_stamp(ev, options); worker = find_worker_id(prefixTOnodeid(prefix), 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", now, 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", now, prefix, ev->param[1], code); #endif } #ifdef STARPU_HAVE_POTI if (out_paje_file) poti_NewEvent(now, container, "user_event", paje_value); #endif } static void handle_start_callback(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[1]); if (worker >= 0) { thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "C"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[1], "C", "Runtime"); } else if (worker == -2) { /* MPI thread */ mpicommthread_push_state(get_event_time_stamp(ev, options), options->file_prefix, "C"); recfmt_mpicommthread_push_state(get_event_time_stamp(ev, options), "C"); } else { user_thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "C"); recfmt_user_thread_push_state(get_event_time_stamp(ev, options), ev->param[1], "C", "UNK"); /* XXX */ } } static void handle_end_callback(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[1]); if (worker >= 0) { thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "B"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[1], "B", "Runtime"); } else if (worker == -2) { /* MPI thread */ mpicommthread_pop_state(get_event_time_stamp(ev, options), options->file_prefix); recfmt_mpicommthread_pop_state(get_event_time_stamp(ev, options)); } else { user_thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1]); recfmt_user_thread_pop_state(get_event_time_stamp(ev, options), ev->param[1]); } } static void handle_hypervisor_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker >= 0) { thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "H"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "H", "Runtime"); } else if (worker == -2) { /* MPI thread */ mpicommthread_push_state(get_event_time_stamp(ev, options), options->file_prefix, "H"); recfmt_mpicommthread_push_state(get_event_time_stamp(ev, options), "H"); } else { user_thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "H"); recfmt_user_thread_push_state(get_event_time_stamp(ev, options), ev->param[1], "H", "UNK"); /* XXX */ } } static void handle_hypervisor_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker >= 0) { thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "B"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "B", "Runtime"); } else if (worker == -2) { /* MPI thread */ mpicommthread_pop_state(get_event_time_stamp(ev, options), options->file_prefix); recfmt_mpicommthread_pop_state(get_event_time_stamp(ev, options)); } else { user_thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1]); recfmt_user_thread_pop_state(get_event_time_stamp(ev, options), 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; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[1]); if (worker < 0) return; thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], newstatus); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[1], newstatus, "Runtime"); } static void handle_worker_status(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *newstatus) { int worker; worker = ev->param[1]; if (worker < 0) return; worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], newstatus); if (trace_file) recfmt_worker_set_state(get_event_time_stamp(ev, options), ev->param[1], newstatus, "Runtime"); } 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; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker < 0) return; thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "Sc", "Runtime"); } static void handle_worker_scheduling_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker < 0) return; thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "B"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "B", "Runtime"); } static void handle_worker_scheduling_push(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker >= 0) { thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); if (trace_file) recfmt_thread_push_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "Sc", "Runtime"); } else { user_thread_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); if (trace_file) recfmt_user_thread_push_state(get_event_time_stamp(ev, options), ev->param[0], "Sc", "User"); } } static void handle_worker_scheduling_pop(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker >= 0) { thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0]); if (trace_file) recfmt_thread_pop_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0]); } else { user_thread_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0]); if (trace_file) recfmt_user_thread_pop_state(get_event_time_stamp(ev, options), ev->param[0]); } } static void handle_worker_sleep_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker < 0) return; double start_sleep_time = get_event_time_stamp(ev, options); last_sleep_start[worker] = start_sleep_time; thread_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sl"); if (trace_file) recfmt_thread_set_state(get_event_time_stamp(ev, options), prefixTOnodeid(prefix), ev->param[0], "Sl", "Other"); } static void handle_worker_sleep_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; char *prefix = options->file_prefix; worker = find_worker_id(prefixTOnodeid(prefix), ev->param[0]); if (worker < 0) return; double end_sleep_timestamp = get_event_time_stamp(ev, options); thread_set_state(end_sleep_timestamp, options->file_prefix, ev->param[0], "B"); if (trace_file) recfmt_thread_set_state(end_sleep_timestamp, prefixTOnodeid(prefix), ev->param[0], "B", "Runtime"); 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, sizeof(paje_value), "%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, sizeof(paje_value), "%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_state(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *state) { 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, sizeof(paje_value), "%lx", handle); poti_NewEvent(get_event_time_stamp(ev, options), memnode_container, state, paje_value); #else fprintf(out_paje_file, "9 %.9f %s %smm%u %lx\n", get_event_time_stamp(ev, options), state, 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_data_wont_use(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; unsigned long submit_order = ev->param[1]; unsigned long job_id = ev->param[2]; fprintf(tasks_file, "Control: WontUse\n"); fprintf(tasks_file, "JobId: %lu\n", job_id); fprintf(tasks_file, "SubmitOrder: %lu\n", submit_order); fprintf(tasks_file, "SubmitTime: %f\n", get_event_time_stamp(ev, options)); fprintf(tasks_file, "Handles: %lx\n", handle); fprintf(tasks_file, "MPIRank: %d\n", options->file_rank); fprintf(tasks_file, "\n"); } static void handle_data_doing_wont_use(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; char *prefix = options->file_prefix; unsigned node = STARPU_MAIN_RAM; const char *event = "WU"; 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, sizeof(paje_value), "%lx", handle); poti_NewEvent(get_event_time_stamp(ev, options), memnode_container, event, paje_value); #else fprintf(out_paje_file, "9 %.9f %s %smm%u %lx\n", get_event_time_stamp(ev, options), event, prefix, node, handle); #endif } } 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 void handle_mpi_data_set_tag(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long handle = ev->param[0]; long tag = ev->param[1]; struct data_info *data = get_data(handle, options->file_rank); data->mpi_tag = tag; } static const char *copy_link_type(enum _starpu_is_prefetch prefetch) { switch (prefetch) { case STARPU_FETCH: return "F"; case STARPU_PREFETCH: return "PF"; case STARPU_IDLEFETCH: 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]; enum _starpu_is_prefetch prefetch = ev->param[4]; unsigned long handle = ev->param[5]; 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"); memnode_event(get_event_time_stamp(ev, options), options->file_prefix, dst, "DCo", handle, comid, size, src, options); #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, sizeof(paje_value), "%u", size); snprintf(paje_key, sizeof(paje_key), "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->size = size; com->src_node = src; com->dst_node = dst; com->type = link_type; com->peer = NULL; com->handle = handle; _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, sizeof(paje_value), "%u", size); snprintf(paje_key, sizeof(paje_key), "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) { int src = -1; unsigned long handle = 0; unsigned dst = ev->param[1]; unsigned long size = ev->param[2]; unsigned comid = ev->param[3]; enum _starpu_is_prefetch 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 */ #ifdef STARPU_DEVEL #warning FIXME: use hash table instead #endif 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->size = size; src = com->src_node = itor->src_node; com->dst_node = itor->dst_node; com->type = itor->type; link_type = itor->type; handle = itor->handle; 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); memnode_event(get_event_time_stamp(ev, options), options->file_prefix, dst, "DCoE", handle, comid, size, src, options); #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, sizeof(paje_value), "%lu", size); snprintf(paje_key, sizeof(paje_key), "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 %lu %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 src = ev->param[0]; 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"); memnode_event(get_event_time_stamp(ev, options), options->file_prefix, dst, "DCoA", 0, 0, 0, src, options); } } static void handle_end_driver_copy_async(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned src = ev->param[0]; 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); memnode_event(get_event_time_stamp(ev, options), options->file_prefix, dst, "DCoAE", 0, 0, 0, src, options); } } /* Currently unused */ STARPU_ATTRIBUTE_UNUSED 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_memnode_event_start_3(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; unsigned size = ev->param[2]; unsigned long handle = ev->param[3]; memnode_event(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr, handle, 0, size, memnode, options); } static void handle_memnode_event_start_4(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; unsigned dest = ev->param[1]; if(strcmp(eventstr, "rc")==0) { //If it is a Request Create, use dest normally } else { dest = memnode; } unsigned size = ev->param[2]; unsigned long handle = ev->param[3]; unsigned prefe = ev->param[4]; memnode_event(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr, handle, prefe, size, dest, options); } static void handle_memnode_event_end_3(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; unsigned long handle = ev->param[2]; unsigned info = ev->param[3]; memnode_event(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr, handle, info, 0, memnode, options); } static void handle_memnode_event_start_2(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; unsigned long handle = ev->param[2]; memnode_event(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr, handle, 0, 0, memnode, options); } static void handle_memnode_event_end_2(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *eventstr) { unsigned memnode = ev->param[0]; unsigned long handle = ev->param[2]; memnode_event(get_event_time_stamp(ev, options), options->file_prefix, memnode, eventstr, handle, 0, 0, memnode, options); } 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) { char *prefix = options->file_prefix; int workerid = find_worker_id(prefixTOnodeid(prefix), tid); double timestamp = get_event_time_stamp(ev, options); if (workerid >= 0) { /* Normal worker */ if (eventstr) { thread_push_state(timestamp, prefix, tid, eventstr); recfmt_thread_push_state(timestamp, prefixTOnodeid(prefix), tid, eventstr, "Runtime"); } else { thread_pop_state(timestamp, prefix, tid); recfmt_thread_pop_state(timestamp, prefixTOnodeid(prefix), tid); } } else if (workerid == -2) { /* MPI thread */ if (eventstr) { mpicommthread_push_state(timestamp, prefix, eventstr); recfmt_mpicommthread_push_state(get_event_time_stamp(ev, options), eventstr); } else { mpicommthread_pop_state(timestamp, prefix); recfmt_mpicommthread_pop_state(get_event_time_stamp(ev, options)); } } else { if (eventstr) { user_thread_push_state(timestamp, prefix, tid, eventstr); recfmt_user_thread_push_state(timestamp, tid, eventstr, "User"); } else { user_thread_pop_state(timestamp, prefix, tid); recfmt_user_thread_pop_state(timestamp, 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); unsigned task = ev->param[0]; 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); char paje_value[STARPU_POTI_STR_LEN]; snprintf(paje_value, sizeof(paje_value), "%u", task); snprintf(container, sizeof(container), "%sp", options->file_prefix); if (!options->no_events) poti_NewEvent(get_event_time_stamp(ev, options), container, "pu", paje_value); #else fprintf(out_paje_file, "13 %.9f %ssched nready %f\n", current_timestamp, options->file_prefix, (float)curq_size); if (!options->no_events) fprintf(out_paje_file, "9 %.9f %s %sp %u\n", get_event_time_stamp(ev, options), "pu", options->file_prefix, task); #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); unsigned task = ev->param[0]; 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); char paje_value[STARPU_POTI_STR_LEN]; snprintf(paje_value, sizeof(paje_value), "%u", task); snprintf(container, sizeof(container), "%sp", options->file_prefix); if (!options->no_events) poti_NewEvent(get_event_time_stamp(ev, options), container, "po", paje_value); #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); if (!options->no_events) fprintf(out_paje_file, "9 %.9f %s %sp %u\n", get_event_time_stamp(ev, options), "po", options->file_prefix, task); #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) { char *prefix = options->file_prefix; double current_timestamp = get_event_time_stamp(ev, options); int workerid = find_worker_id(prefixTOnodeid(prefix), 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) { char *prefix = options->file_prefix; double current_timestamp = get_event_time_stamp(ev, options); int workerid = find_worker_id(prefixTOnodeid(prefix), 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]; if (options->label_deps) _starpu_fxt_dag_add_tag(options->file_prefix, tag, job, "tag"); else _starpu_fxt_dag_add_tag(options->file_prefix, tag, job, NULL); } 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]; if (options->label_deps) _starpu_fxt_dag_add_tag_deps(options->file_prefix, child, father, "tag"); else _starpu_fxt_dag_add_tag_deps(options->file_prefix, child, father, NULL); } 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]; unsigned dep_succ_type = ev->param[2]; char *name = get_fxt_string(ev,4); struct task_info *task = get_task(dep_succ, options->file_rank); struct task_info *prev_task = get_task(dep_prev, options->file_rank); unsigned alloc = 0; task->type = dep_succ_type; 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); _STARPU_REALLOC(task->dep_labels, sizeof(*task->dep_labels) * alloc); } task->dependencies[task->ndeps] = dep_prev; task->dep_labels[task->ndeps] = strdup(name); task->ndeps++; /* There is a dependency between both job id : dep_prev -> dep_succ */ if (show_task(task, options) && show_task(prev_task, options)) { if (!options->label_deps) name = NULL; /* We should show the name of the predecessor, then. */ prev_task->show = 1; _starpu_fxt_dag_add_task_deps(options->file_prefix, dep_prev, dep_succ, name); } } 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]; unsigned long submit_order = ev->param[3]; long priority = (long) ev->param[4]; unsigned type = ev->param[5]; struct task_info *task = get_task(job_id, options->file_rank); task->submit_time = get_event_time_stamp(ev, options); task->submit_order = submit_order; task->priority = priority; task->iterations[0] = iteration; task->iterations[1] = subiteration; task->type = type; } static void handle_task_color(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id = ev->param[0]; struct task_info *task = get_task(job_id, options->file_rank); int color = (long) ev->param[1]; task->color = color; } static void handle_task_exclude_from_dag(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id = ev->param[0]; unsigned exclude_from_dag = ev->param[1]; struct task_info *task = get_task(job_id, options->file_rank); task->exclude_from_dag = exclude_from_dag; } static void handle_task_name(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id = ev->param[0]; char *name = get_fxt_string(ev,1); char *prefix = options->file_prefix; struct task_info *task = get_task(job_id, options->file_rank); int worker = find_worker_id(prefixTOnodeid(prefix), ev->param[1]); const char *color; char buffer[32]; if (task->color != 0) { snprintf(buffer, sizeof(buffer), "#%06x", task->color); color = &buffer[0]; } else if (options->per_task_colour) { snprintf(buffer, sizeof(buffer), "#%x%x%x", get_color_symbol_red(name)/4, get_color_symbol_green(name)/4, get_color_symbol_blue(name)/4); color = &buffer[0]; } else { color= (worker < 0)?"#aaaaaa":get_worker_color(worker); } if (!task->name) task->name = strdup(name); if (!task->exclude_from_dag && show_task(task, options)) _starpu_fxt_dag_set_task_name(options->file_prefix, job_id, task->name, color); } static void handle_task_done(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { /* Ideally, we would be able to dump tasks as they terminate, to save * memory. * We however may have to change their state later, e.g. the show field, * due to dependencies added way later. */ #if 0 unsigned long job_id; job_id = ev->param[0]; struct task_info *task = get_task(job_id, options->file_rank); task_dump(task, options); #else (void) ev; (void) options; #endif } static void handle_tag_done(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; 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(prefixTOnodeid(prefix), ev->param[1]); const char *color; char buffer[32]; if (options->per_task_colour) { snprintf(buffer, sizeof(buffer), "%.4f,%.4f,%.4f", get_color_symbol_red(name)/1024.0, get_color_symbol_green(name)/1024.0, get_color_symbol_blue(name)/1024.0); color = &buffer[0]; } else { color= (worker < 0)?"white":get_worker_color(worker); } _starpu_fxt_dag_set_tag_done(options->file_prefix, tag_id, color); } 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, sizeof(container), "%sp", options->file_prefix); snprintf(paje_value, sizeof(paje_value), "%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(prefixTOnodeid(prefix), 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]; 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_alias); //set bandwidth variables to zero when they start poti_SetVariable(date, new_mpicommthread_container_alias, "bwi_mpi", 0.); poti_SetVariable(date, new_mpicommthread_container_alias, "bwo_mpi", 0.); #else fprintf(out_paje_file, "7 %.9f %smpict MPICt %sp %smpict\n", date, prefix, prefix, prefix); //set bandwidth variables to zero when they start fprintf(out_paje_file, "13 %.9f %smpict bwi_mpi 0.0\n", date, prefix); fprintf(out_paje_file, "13 %.9f %smpict bwo_mpi 0.0\n", date, prefix); #endif mpicommthread_set_state(date, prefix, "Sl"); } if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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 (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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, "Pl"); if (trace_file) recfmt_mpicommthread_set_state(date, "Pl"); } 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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_set_state(date, "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"); if (trace_file) recfmt_mpicommthread_push_state(date, "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); if (trace_file) recfmt_mpicommthread_pop_state(date); } 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"); if (trace_file) recfmt_mpicommthread_push_state(date, "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); if (trace_file) recfmt_mpicommthread_pop_state(date); } static void handle_mpi_polling_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, "Pl"); } static void handle_mpi_polling_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_driver_run_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, "Dr"); } static void handle_mpi_driver_run_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, "Pl"); } 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, sizeof(container), "%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 } if (trace_file) recfmt_dump_state(get_event_time_stamp(ev, options), "ProgEvent", -1, 0, event, "Program"); } 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; struct _starpu_communication *itor, *next; /* Loop through completed communications */ for (itor = _starpu_communication_list_begin(&communication_list); itor != _starpu_communication_list_end(&communication_list); itor = next) { next = _starpu_communication_list_next(itor); if (!itor->peer) continue; /* This communication is complete */ _starpu_communication_list_erase(&communication_list, itor); 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_mm", current_bandwidth_out_per_node[itor->src_node]); #else fprintf(out_paje_file, "13 %.9f %smm%u bwo_mm %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_mm", current_bandwidth_in_per_node[itor->dst_node]); #else fprintf(out_paje_file, "13 %.9f %smm%u bwi_mm %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); if (out_paje_file && itor->comp_start != current_computation_time) { /* flush last value */ #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, prefix); poti_SetVariable(current_computation_time, container, "gft", (double)current_computation); #else fprintf(out_paje_file, "13 %.9f %ssched gft %f\n", current_computation_time, prefix, (float)current_computation); #endif } current_computation += itor->gflops; current_computation_time = itor->comp_start; _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) { STARPU_ABORT_MSG("Failed to open '%s' (err %s)", filename_in, strerror(errno)); } 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 */ current_computation = 0.0; current_computation_time = 0.0; 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, sizeof(new_program_container_name), "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, sizeof(new_scheduler_container_name), "%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 0.0 %ssched Sc %sp %sscheduler\n", 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_ON_TID: handle_worker_status_on_tid(&ev, options, "Fi"); break; case _STARPU_FUT_START_PUSH_OUTPUT_ON_TID: handle_worker_status_on_tid(&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_ON_TID: handle_worker_status_on_tid(&ev, options, "U"); break; case _STARPU_FUT_END_FETCH_INPUT_ON_TID: case _STARPU_FUT_END_PROGRESS_ON_TID: case _STARPU_FUT_END_PUSH_OUTPUT_ON_TID: case _STARPU_FUT_END_UNPARTITION_ON_TID: handle_worker_status_on_tid(&ev, options, "B"); break; case _STARPU_FUT_START_FETCH_INPUT: handle_worker_status(&ev, options, "Fi"); break; case _STARPU_FUT_END_FETCH_INPUT: 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_EXCLUDE_FROM_DAG: handle_task_exclude_from_dag(&ev, options); break; case _STARPU_FUT_TASK_NAME: handle_task_name(&ev, options); break; case _STARPU_FUT_TASK_COLOR: handle_task_color(&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_STATE_INVALID: if (options->memory_states) handle_data_state(&ev, options, "SI"); break; case _STARPU_FUT_DATA_STATE_OWNER: if (options->memory_states) handle_data_state(&ev, options, "SO"); break; case _STARPU_FUT_DATA_STATE_SHARED: if (options->memory_states) handle_data_state(&ev, options, "SS"); break; case _STARPU_FUT_DATA_REQUEST_CREATED: if (!options->no_bus && options->memory_states) { handle_memnode_event_start_4(&ev, options, "rc"); } 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_DATA_WONT_USE: handle_data_wont_use(&ev, options); break; case _STARPU_FUT_DATA_DOING_WONT_USE: if (options->memory_states) handle_data_doing_wont_use(&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"); handle_memnode_event_start_4(&ev, options, "Al"); } break; case _STARPU_FUT_START_ALLOC_REUSE: if (!options->no_bus) { handle_push_memnode_event(&ev, options, "Ar"); handle_memnode_event_start_4(&ev, options, "Alr"); } break; case _STARPU_FUT_END_ALLOC: if (!options->no_bus) { handle_pop_memnode_event(&ev, options); handle_memnode_event_end_3(&ev, options, "AlE"); } break; case _STARPU_FUT_END_ALLOC_REUSE: if (!options->no_bus) { handle_pop_memnode_event(&ev, options); handle_memnode_event_end_3(&ev, options, "AlrE"); } break; case _STARPU_FUT_START_FREE: if (!options->no_bus) { handle_push_memnode_event(&ev, options, "F"); handle_memnode_event_start_3(&ev, options, "Fe"); } break; case _STARPU_FUT_END_FREE: if (!options->no_bus) { handle_pop_memnode_event(&ev, options); handle_memnode_event_end_2(&ev, options, "FeE"); } break; case _STARPU_FUT_START_WRITEBACK: if (!options->no_bus) { handle_push_memnode_event(&ev, options, "W"); handle_memnode_event_start_2(&ev, options, "Wb"); } break; case _STARPU_FUT_END_WRITEBACK: if (!options->no_bus) { handle_pop_memnode_event(&ev, options); handle_memnode_event_start_2(&ev, options, "WbE"); } 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_DATA_SET_TAG: handle_mpi_data_set_tag(&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_MPI_FUT_POLLING_BEGIN: handle_mpi_polling_begin(&ev, options); break; case _STARPU_MPI_FUT_POLLING_END: handle_mpi_polling_end(&ev, options); break; case _STARPU_MPI_FUT_DRIVER_RUN_BEGIN: handle_mpi_driver_run_begin(&ev, options); break; case _STARPU_MPI_FUT_DRIVER_RUN_END: handle_mpi_driver_run_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); } unsigned i; if (!options->no_flops) { /* computations are supposed to be over, unref any pending comp */ for (i = 0; i < STARPU_NMAXWORKERS; i++) { struct _starpu_computation *comp = ongoing_computation[i]; if (comp) { STARPU_ASSERT(!comp->peer); _starpu_computation_list_erase(&computation_list, comp); } } /* And flush completed computations */ _starpu_fxt_process_computations(options); } for (i = 0; i < STARPU_NMAXWORKERS; i++) { struct _starpu_computation *comp = ongoing_computation[i]; if (comp) { STARPU_ASSERT(!comp->peer); _starpu_computation_delete(comp); ongoing_computation[i] = 0; } } if (!options->no_bus) { while (!_starpu_communication_list_empty(&communication_list)) { struct _starpu_communication*itor; itor = _starpu_communication_list_pop_front(&communication_list); if (out_paje_file) { /* Trace finished with this communication uncompleted, fake its termination */ unsigned comid = itor->comid; unsigned long size = itor->size; unsigned dst = itor->dst_node; double time = current_computation_time; const char *link_type = itor->type; #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, sizeof(paje_value), "%lu", size); snprintf(paje_key, sizeof(paje_key), "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 %lu %smm%u com_%u\n", time, link_type, prefix, size, prefix, dst, comid); #endif } _starpu_communication_delete(itor); } } if (out_paje_file && !options->no_flops) { for (i = 0; i < STARPU_NMAXWORKERS; i++) { if (last_codelet_end[i] != 0.0) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; worker_container_alias(container, STARPU_POTI_STR_LEN, prefix, i); poti_SetVariable(last_codelet_end[i], container, "gf", 0.); #else fprintf(out_paje_file, "13 %.9f %sw%u gf %f\n", last_codelet_end[i], prefix, i, 0.); #endif last_codelet_end[i] = 0.0; } } /* flush last value */ #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, prefix); poti_SetVariable(current_computation_time, container, "gft", (double)current_computation); #else fprintf(out_paje_file, "13 %.9f %ssched gft %f\n", current_computation_time, prefix, (float)current_computation); #endif } { struct data_info *data=NULL, *tmp=NULL; HASH_ITER(hh, data_info, data, tmp) { data_dump(data); } } { struct task_info *task=NULL, *tmp=NULL; HASH_ITER(hh, tasks_info, task, tmp) { task_dump(task, options); } } for (i = 0; i < STARPU_NMAXWORKERS; i++) free(options->worker_archtypes[i].devices); /* 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->no_smooth = 0; options->no_acquire = 0; options->memory_states = 0; options->internal = 0; options->label_deps = 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->states_path = "trace.rec"; options->distrib_time_path = "distrib.data"; options->dumped_codelets = NULL; options->activity_path = "activity.data"; } static void _set_dir(char *dir, char **option) { if (*option) { char *tmp = strdup(*option); _STARPU_MALLOC(*option, 256); snprintf(*option, 256, "%s/%s", dir, tmp); free(tmp); } } void starpu_fxt_options_set_dir(struct starpu_fxt_options *options) { if (!options->dir) return; _starpu_mkpath_and_check(options->dir, S_IRWXU); _set_dir(options->dir, &options->out_paje_path); _set_dir(options->dir, &options->dag_path); _set_dir(options->dir, &options->tasks_path); _set_dir(options->dir, &options->data_path); _set_dir(options->dir, &options->anim_path); _set_dir(options->dir, &options->states_path); _set_dir(options->dir, &options->distrib_time_path); _set_dir(options->dir, &options->activity_path); } void starpu_fxt_options_shutdown(struct starpu_fxt_options *options) { if (options->dir) { free(options->out_paje_path); free(options->dag_path); free(options->tasks_path); free(options->data_path); free(options->anim_path); free(options->states_path); free(options->distrib_time_path); free(options->activity_path); } } 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+"); if (distrib_time == NULL) STARPU_ABORT_MSG("Failed to open '%s' (err %s)", options->distrib_time_path, strerror(errno)); } 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+"); if (activity_file == NULL) STARPU_ABORT_MSG("Failed to open '%s' (err %s)", options->activity_path, strerror(errno)); } 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+"); if (anim_file == NULL) STARPU_ABORT_MSG("Failed to open '%s' (err %s)", options->anim_path, strerror(errno)); _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+"); if (tasks_file == NULL) STARPU_ABORT_MSG("Failed to open '%s' (err %s)", options->tasks_path, strerror(errno)); } 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+"); if (data_file == NULL) STARPU_ABORT_MSG("Failed to open '%s' (err %s)", options->data_path, strerror(errno)); } else data_file = NULL; } static void _starpu_fxt_write_trace_header(FILE *f) { fprintf(f, "#\n"); fprintf(f, "# E: Event type\n"); fprintf(f, "# N: Event name\n"); fprintf(f, "# C: Event category\n"); fprintf(f, "# W: Worker ID\n"); fprintf(f, "# T: Thread ID\n"); fprintf(f, "# S: Start time\n"); fprintf(f, "#\n"); fprintf(f, "\n"); } static void _starpu_fxt_trace_file_init(struct starpu_fxt_options *options) { if (options->states_path) { trace_file = fopen(options->states_path, "w+"); if (trace_file == NULL) STARPU_ABORT_MSG("Failed to open '%s' (err %s)", options->states_path, strerror(errno)); } else trace_file = NULL; if (trace_file) _starpu_fxt_write_trace_header(trace_file); } 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); if (anim_file) { _starpu_fxt_component_finish(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); } static void _starpu_fxt_trace_file_close(void) { if (trace_file) fclose(trace_file); } static 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, options); } 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) { STARPU_ABORT_MSG("Failed to open '%s' (err %s)", filename_in, strerror(errno)); } 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_trace_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_trace_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; unsigned workerid; char *codelet_name; }; static struct parse_task tasks[STARPU_NMAXWORKERS]; static 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) { STARPU_ABORT_MSG("Failed to open '%s' (err %s)", codelet_name, strerror(errno)); } 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 %u\n", time, pt.data_total, pt.workerid); } void starpu_fxt_write_data_trace(char *filename_in) { int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { STARPU_ABORT_MSG("Failed to open '%s' (err %s)", filename_in, strerror(errno)); } 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) { STARPU_ABORT_MSG("Failed to open '%s' (err %s)", "codelet_list", strerror(errno)); } 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(0 /* TODO: Add nodeid here instead */, ev.param[6], ev.param[1], ev.param[5]); break; case _STARPU_FUT_START_CODELET_BODY: workerid = ev.param[2]; tasks[workerid].workerid = (unsigned)workerid; 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; } } #ifdef HAVE_FXT_CLOSE fxt_close(fut); #else if (close(fd_in)) { perror("close failed :"); exit(-1); } #endif if(fclose(codelet_list)) { perror("close failed :"); exit(-1); } struct starpu_data_trace_kernel *kernel=NULL, *tmp=NULL; 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.3.9+dfsg/src/debug/traces/starpu_fxt.h000066400000000000000000000071511413463044200214740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2018,2019 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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" #define MAX_MPI_NODES 64 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, const char *label); void _starpu_fxt_dag_add_tag_deps(const char *prefix, uint64_t child, uint64_t father, const char *label); 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, const char *label); 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, long mpi_tag, size_t size, float date, long jobid); void _starpu_fxt_mpi_add_recv_transfer(int src, int dst, long 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, struct starpu_fxt_options *options); extern int _starpu_poti_extendedSetState; extern int _starpu_poti_semiExtendedSetState; extern int _starpu_poti_MemoryEvent; extern int _starpu_poti_MpiLinkStart; /* * 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.3.9+dfsg/src/debug/traces/starpu_fxt_dag.c000066400000000000000000000101011413463044200222670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, const char *label) { if (out_file) { if (label) fprintf(out_file, "\t \"tag_%s%llx\"->\"task_%s%lu\"->\"tag_%s%llx\" [style=dashed] [label=\"%s\"]\n", prefix, (unsigned long long)tag, prefix, (unsigned long)job_id, prefix, (unsigned long long) tag, label); else 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, const char *label) { if (out_file) { if (label) fprintf(out_file, "\t \"tag_%s%llx\"->\"tag_%s%llx\" [label=\"%s\"]\n", prefix, (unsigned long long)father, prefix, (unsigned long long)child, label); else 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, const char *label) { if (out_file) { if (label) fprintf(out_file, "\t \"task_%s%lu\"->\"task_%s%lu\" [label=\"%s\"]\n", prefix, dep_prev, prefix, dep_succ, label); else 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.3.9+dfsg/src/debug/traces/starpu_fxt_mpi.c000066400000000000000000000251641413463044200223400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017,2019 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 LIST_TYPE(mpi_transfer, unsigned matched; int src; int dst; long mpi_tag; size_t size; float date; long jobid; double bandwidth; ); /* 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 */ static unsigned mpi_sends_list_size[MAX_MPI_NODES] = {0}; static unsigned mpi_recvs_list_size[MAX_MPI_NODES] = {0}; /* number of slots actually used in the list */ static unsigned mpi_sends_used[MAX_MPI_NODES] = {0}; static 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. */ static unsigned mpi_recvs_matched[MAX_MPI_NODES][MAX_MPI_NODES] = { {0} }; static unsigned mpi_sends_matched[MAX_MPI_NODES][MAX_MPI_NODES] = { {0} }; void _starpu_fxt_mpi_add_send_transfer(int src, int dst STARPU_ATTRIBUTE_UNUSED, long mpi_tag, size_t size, float date, long jobid) { STARPU_ASSERT(src >= 0); 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].src = src; mpi_sends[src][slot].dst = 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, long 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].src = src; mpi_recvs[dst][slot].dst = 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, long 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, unsigned n) { unsigned slot[MAX_MPI_NODES] = { 0 }, node; struct mpi_transfer_list pending_receives; /* Sorted list of matches which have not happened yet */ double current_out_bandwidth[MAX_MPI_NODES] = { 0. }; double current_in_bandwidth[MAX_MPI_NODES] = { 0. }; #ifdef STARPU_HAVE_POTI char mpi_container[STARPU_POTI_STR_LEN]; #endif //bwi_mpi and bwo_mpi are set to zero when MPI thread containers are created mpi_transfer_list_init(&pending_receives); while (1) { float start_date; struct mpi_transfer *cur, *match; int src; /* Find out which event comes first: a pending receive, or a new send */ if (mpi_transfer_list_empty(&pending_receives)) start_date = INFINITY; else start_date = mpi_transfer_list_front(&pending_receives)->date; src = MAX_MPI_NODES; for (node = 0; node < n; node++) { if (slot[node] < mpi_sends_used[node] && mpi_sends[node][slot[node]].date < start_date) { /* next send for node is earlier than others */ src = node; start_date = mpi_sends[src][slot[src]].date; } } if (start_date == INFINITY) /* No event any more, we're finished! */ break; if (src == MAX_MPI_NODES) { /* Pending match is earlier than all new sends, finish its communication */ match = mpi_transfer_list_pop_front(&pending_receives); current_out_bandwidth[match->src] -= match->bandwidth; current_in_bandwidth[match->dst] -= match->bandwidth; #ifdef STARPU_HAVE_POTI snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", match->src); poti_SetVariable(match->date, mpi_container, "bwo_mpi", current_out_bandwidth[match->src]); snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", match->dst); poti_SetVariable(match->date, mpi_container, "bwi_mpi", current_in_bandwidth[match->dst]); #else fprintf(out_paje_file, "13 %.9f %d_mpict bwo_mpi %f\n", match->date, match->src, current_out_bandwidth[match->src]); fprintf(out_paje_file, "13 %.9f %d_mpict bwi_mpi %f\n", match->date, match->dst, current_in_bandwidth[match->dst]); #endif continue; } cur = &mpi_sends[src][slot[src]]; int dst = cur->dst; long mpi_tag = cur->mpi_tag; size_t size = cur->size; 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; struct mpi_transfer *prev; match->bandwidth = (0.001*size)/(end_date - start_date); current_out_bandwidth[src] += match->bandwidth; current_in_bandwidth[dst] += match->bandwidth; /* Insert in sorted list, most probably at the end so let's use a mere insertion sort */ for (prev = mpi_transfer_list_last(&pending_receives); prev != mpi_transfer_list_alpha(&pending_receives); prev = mpi_transfer_list_prev(prev)) if (prev->date <= end_date) { /* Found its place */ mpi_transfer_list_insert_after(&pending_receives, match, prev); break; } if (prev == mpi_transfer_list_alpha(&pending_receives)) { /* No element earlier than this one, put it at the head */ mpi_transfer_list_push_front(&pending_receives, match); } unsigned long id = mpi_com_id++; if (cur->jobid != -1) _starpu_fxt_dag_add_send(src, cur->jobid, mpi_tag, id); if (match->jobid != -1) _starpu_fxt_dag_add_receive(dst, match->jobid, mpi_tag, id); #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN]; snprintf(paje_value, sizeof(paje_value), "%lu", (long unsigned) size); snprintf(paje_key, sizeof(paje_key), "mpicom_%lu", id); snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", src); char str_mpi_tag[STARPU_POTI_STR_LEN]; snprintf(str_mpi_tag, sizeof(str_mpi_tag), "%ld", mpi_tag); poti_user_StartLink(_starpu_poti_MpiLinkStart, start_date, "MPIroot", "MPIL", mpi_container, paje_value, paje_key, 1, str_mpi_tag); poti_SetVariable(start_date, mpi_container, "bwo_mpi", current_out_bandwidth[src]); snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", dst); poti_EndLink(end_date, "MPIroot", "MPIL", mpi_container, paje_value, paje_key); poti_SetVariable(start_date, mpi_container, "bwo_mpi", current_in_bandwidth[dst]); #else fprintf(out_paje_file, "13 %.9f %d_mpict bwo_mpi %f\n", start_date, src, current_out_bandwidth[src]); fprintf(out_paje_file, "13 %.9f %d_mpict bwi_mpi %f\n", start_date, dst, current_in_bandwidth[dst]); fprintf(out_paje_file, "23 %.9f MPIL MPIroot %lu %d_mpict mpicom_%lu %ld\n", start_date, (unsigned long)size, src, id, mpi_tag); fprintf(out_paje_file, "19 %.9f MPIL MPIroot %lu %d_mpict mpicom_%lu\n", end_date, (unsigned long)size, dst, id); #endif } else { _STARPU_DISP("Warning, could not match MPI transfer from %d to %d (tag %lx) starting at %f\n", src, dst, mpi_tag, start_date); } slot[src]++; } } void _starpu_fxt_display_mpi_transfers(struct starpu_fxt_options *options, int *ranks STARPU_ATTRIBUTE_UNUSED, FILE *out_paje_file) { 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 */ if (out_paje_file) display_all_transfers_from_trace(out_paje_file, options->ninputfiles); } #endif // STARPU_USE_FXT starpu-1.3.9+dfsg/src/debug/traces/starpu_paje.c000066400000000000000000000657111413463044200216130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017-2019 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 #ifdef STARPU_HAVE_POTI #ifdef HAVE_POTI_INIT_CUSTOM int _starpu_poti_extendedSetState = -1; int _starpu_poti_semiExtendedSetState = -1; int _starpu_poti_MemoryEvent = -1; int _starpu_poti_MpiLinkStart = -1; #endif #endif void _starpu_fxt_write_paje_header(FILE *file STARPU_ATTRIBUTE_UNUSED, struct starpu_fxt_options *options) { unsigned i; #ifdef STARPU_HAVE_POTI #ifdef HAVE_POTI_INIT_CUSTOM poti_header(); /* see poti_init_custom to customize the header */ _starpu_poti_extendedSetState = poti_header_DeclareEvent (PAJE_SetState, 11, "Size string", "Params string", "Footprint string", "Tag string", "JobId string", "SubmitOrder string", "GFlop string", "X string", "Y string", /* "Z string", */ "Iteration string", "Subiteration string"); _starpu_poti_semiExtendedSetState = poti_header_DeclareEvent (PAJE_SetState, 6, "Size string", "Params string", "Footprint string", "Tag string", "JobId string", "SubmitOrder string" ); #ifdef HAVE_POTI_USER_NEWEVENT if (options->memory_states) { _starpu_poti_MemoryEvent = poti_header_DeclareEvent (PAJE_NewEvent, 4, "Handle string", "Info string", "Size string", "Dest string"); } _starpu_poti_MpiLinkStart = poti_header_DeclareEvent(PAJE_StartLink, 1, "MPITAG string"); #endif #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"); 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, "%% SubmitOrder 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"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeSetState 21\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Value string\n"); 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, "%% SubmitOrder string\n"); fprintf(file, "%%EndEventDef\n"); if (options->memory_states) { fprintf(file, "%%EventDef PajeNewEvent 22\n"); fprintf(file, "%% Time date\n"); fprintf(file, "%% Type string\n"); fprintf(file, "%% Container string\n"); fprintf(file, "%% Value string\n"); fprintf(file, "%% Handle string\n"); fprintf(file, "%% Info string\n"); fprintf(file, "%% Size string\n"); fprintf(file, "%% Tid string\n"); fprintf(file, "%%EndEventDef\n"); } fprintf(file, "%%EventDef PajeStartLink 23\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, "%% MPITAG string\n"); fprintf(file, "%%EndEventDef\n"); fprintf(file, "%%EventDef PajeEndLink 24\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, "%% MPITAG string\n"); 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("pu", "P", "task push"); poti_DefineEventType("po", "P", "task pop"); poti_DefineEventType("register", "P", "data registration"); poti_DefineEventType("unregister", "P", "data unregistration"); /* Types for the memory node */ poti_DefineEventType("SI", "Mm", "data state invalid"); poti_DefineEventType("SS", "Mm", "data state shared"); poti_DefineEventType("SO", "Mm", "data state owner"); poti_DefineEventType("WU", "Mm", "data wont use"); poti_DefineEventType("Al", "Mm", "Allocating Start"); poti_DefineEventType("rc", "Mm", "Request Created"); poti_DefineEventType("AlE", "Mm", "Allocating End"); poti_DefineEventType("Alr", "Mm", "Allocating Async Start"); poti_DefineEventType("AlrE", "Mm", "Allocating Async End"); poti_DefineEventType("Fe", "Mm", "Free Start"); poti_DefineEventType("FeE", "Mm", "Free End"); poti_DefineEventType("Wb", "Mm", "WritingBack Start"); poti_DefineEventType("WbE", "Mm", "WritingBack End"); poti_DefineEventType("DCo", "Mm", "DriverCopy Start"); poti_DefineEventType("DCoE", "Mm", "DriverCopy End"); poti_DefineEventType("DCoA", "Mm", "DriverCopyAsync Start"); poti_DefineEventType("DCoAE", "Mm", "DriverCopyAsync End"); poti_DefineVariableType("use", "Mm", "Used (MB)", "0 0 0"); poti_DefineVariableType("bwi_mm", "Mm", "Bandwidth In (MB/s)", "0 0 0"); poti_DefineVariableType("bwo_mm", "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", "P", "user event type"); poti_DefineEventType("thread_event", "T", "thread event type"); poti_DefineVariableType("gf", "W", "GFlop/s", "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", "Submitting 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", "Submitting 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_DefineVariableType("bwi_mpi", "MPICt", "Bandwidth In (MB/s)", "0 0 0"); poti_DefineVariableType("bwo_mpi", "MPICt", "Bandwidth Out (MB/s)", "0 0 0"); poti_DefineStateType("CtS", "MPICt", "Communication Thread State"); poti_DefineEntityValue("P", "CtS", "Processing", "0 0 0"); poti_DefineEntityValue("Pl", "CtS", "Polling", "1.0 .5 0"); poti_DefineEntityValue("Dr", "CtS", "DriverRun", ".1 .1 1.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", "ReceiveSubmitted", "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", "Submitting 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", "Submitting task", ".3 .09 .0"); poti_DefineEntityValue("C", "US", "Callback", ".0 .3 .8"); poti_DefineEntityValue("Sc", "US", "Scheduling", ".7 .36 .0"); 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[64]; int current, age, revision; if (argc != 7) { fprintf(stderr, "[dolib] bad number of arguments, expected %d, got %d\n", 7, argc); 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) { fprintf(stderr, "version not formatted as current:revision:age (%s)\n", version); exit(EXIT_FAILURE); } _snprintf(name, sizeof(name), "libstarpu-%s-%d", effective_version, current - age); name[sizeof(name) - 1] = '\0'; fprintf(stdout, "[dolib] using soname '%s'\n", name); _snprintf(s, sizeof(s), "\"%s\" /machine:%s /def:%s /name:%s /out:%s", prog, arch, def, name, lib); s[sizeof(s) - 1] = '\0'; if (system(s)) { fprintf(stderr, "%s failed\n", s); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } starpu-1.3.9+dfsg/src/drivers/000077500000000000000000000000001413463044200162275ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/cpu/000077500000000000000000000000001413463044200170165ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/cpu/driver_cpu.c000066400000000000000000000420751413463044200213340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #include #include #include #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #if HWLOC_API_VERSION < 0x00010b00 #define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE #endif #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef STARPU_USE_CPU /* 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 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; STARPU_ASSERT(cl); 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(_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 if (cl->flags & STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT) { _SIMGRID_TIMER_BEGIN(1); func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); _SIMGRID_TIMER_END; } else _starpu_simgrid_submit_job(cpu_args->workerid, j, perf_arch, NAN, 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->bindid, cpu_args->workerid, NULL); } else { _STARPU_TRACE_START_EXECUTING(); } if (is_parallel_task) { STARPU_PTHREAD_BARRIER_WAIT(&j->after_work_barrier); if (rank != 0) _STARPU_TRACE_END_EXECUTING(); } _starpu_driver_end_job(cpu_args, j, perf_arch, rank, profiling); if (is_parallel_task) { #ifdef STARPU_SIMGRID if (rank == 0) { /* Wait for other threads to exit barrier_wait so we * can safely drop the job structure */ starpu_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; } 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); 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); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&cpu_worker->sched_mutex); cpu_worker->status = STATUS_UNKNOWN; STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&cpu_worker->sched_mutex); /* tell the main thread that we are ready */ STARPU_PTHREAD_MUTEX_LOCK(&cpu_worker->mutex); cpu_worker->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&cpu_worker->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&cpu_worker->mutex); return 0; } static int _starpu_cpu_driver_execute_task(struct _starpu_worker *cpu_worker, struct starpu_task *task, struct _starpu_job *j) { int res; int rank; int is_parallel_task = (j->task_size > 1); struct starpu_perfmodel_arch* perf_arch; rank = cpu_worker->current_rank; /* Get the rank in case it is a parallel task */ if (is_parallel_task) { 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; 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; struct _starpu_sched_ctx *sched_ctx = _starpu_sched_ctx_get_sched_ctx_for_worker_and_job(cpu_worker, j); if (sched_ctx && !sched_ctx->sched_policy && !sched_ctx->awake_workers && sched_ctx->main_master == cpu_worker->workerid) perf_arch = &sched_ctx->perf_arch; else 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); 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); return 0; } int _starpu_cpu_driver_run_once(struct _starpu_worker *cpu_worker) { unsigned memnode = cpu_worker->memory_node; int workerid = cpu_worker->workerid; int res; struct _starpu_job *j; struct starpu_task *task = NULL, *pending_task; int rank = 0; #ifdef STARPU_SIMGRID starpu_pthread_wait_reset(&cpu_worker->wait); #endif /* Test if async transfers are completed */ pending_task = cpu_worker->task_transferring; if (pending_task != NULL && cpu_worker->nb_buffers_transferred == cpu_worker->nb_buffers_totransfer) { int ret; STARPU_RMB(); _STARPU_TRACE_END_PROGRESS(memnode); j = _starpu_get_job_associated_to_task(pending_task); _starpu_fetch_task_input_tail(pending_task, j, cpu_worker); _starpu_set_worker_status(cpu_worker, STATUS_UNKNOWN); /* Reset it */ cpu_worker->task_transferring = NULL; ret = _starpu_cpu_driver_execute_task(cpu_worker, pending_task, j); _STARPU_TRACE_START_PROGRESS(memnode); return ret; } res = __starpu_datawizard_progress(1, 1); if (!pending_task) task = _starpu_get_worker_task(cpu_worker, workerid, memnode); #ifdef STARPU_SIMGRID #ifndef STARPU_OPENMP if (!res && !task) /* No progress, wait */ starpu_pthread_wait_wait(&cpu_worker->wait); #else #if SIMGRID_VERSION >= 31800 if (!res && !task) { /* No progress, wait (but at most 1s for OpenMP support) */ /* TODO: ideally, make OpenMP wake worker when run_once should return */ struct timespec abstime; _starpu_clock_gettime(&abstime); abstime.tv_sec++; starpu_pthread_wait_timedwait(&cpu_worker->wait, &abstime); } #else /* Previous simgrid versions don't really permit to use wait_timedwait in C */ starpu_sleep(0.001); #endif #endif #endif if (!task) { /* No task or task still pending transfers */ _starpu_execute_registered_idle_hooks(); return 0; } j = _starpu_get_job_associated_to_task(task); /* NOTE: j->task is != task for parallel tasks, which share the same * job. */ /* 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; } _STARPU_TRACE_END_PROGRESS(memnode); /* Get the rank in case it is a parallel task */ if (j->task_size > 1) { STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); rank = j->active_task_alias_count++; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); } else { rank = 0; } cpu_worker->current_rank = rank; #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 if (rank == 0 && !continuation_wake_up) { res = _starpu_fetch_task_input(task, j, 1); STARPU_ASSERT(res == 0); } else { int ret = _starpu_cpu_driver_execute_task(cpu_worker, task, j); _STARPU_TRACE_END_PROGRESS(memnode); return ret; } _STARPU_TRACE_END_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 *worker = arg; _starpu_cpu_driver_init(worker); _STARPU_TRACE_START_PROGRESS(worker->memory_node); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_cpu_driver_run_once(worker); } _STARPU_TRACE_END_PROGRESS(worker->memory_node); _starpu_cpu_driver_deinit(worker); return NULL; } int _starpu_cpu_driver_run(struct _starpu_worker *worker) { worker->set = NULL; worker->worker_is_initialized = 0; _starpu_cpu_worker(worker); return 0; } struct _starpu_driver_ops _starpu_driver_cpu_ops = { .init = _starpu_cpu_driver_init, .run = _starpu_cpu_driver_run, .run_once = _starpu_cpu_driver_run_once, .deinit = _starpu_cpu_driver_deinit }; #endif /* STARPU_USE_CPU */ int _starpu_cpu_copy_interface(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_CPU_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; 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); return ret; } int _starpu_cpu_copy_data(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_CPU_RAM); (void) async_channel; memcpy((void *) (dst + dst_offset), (void *) (src + src_offset), size); return 0; } int _starpu_cpu_is_direct_access_supported(unsigned node, unsigned handling_node) { (void) node; (void) handling_node; return 1; } uintptr_t _starpu_cpu_malloc_on_node(unsigned dst_node, size_t size, int flags) { uintptr_t addr = 0; _starpu_malloc_flags_on_node(dst_node, (void**) &addr, size, #if defined(STARPU_USE_CUDA) && !defined(STARPU_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 ); return addr; } void _starpu_cpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags) { _starpu_free_flags_on_node(dst_node, (void*)addr, size, #if defined(STARPU_USE_CUDA) && !defined(STARPU_HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) flags & ~STARPU_MALLOC_PINNED #else flags #endif ); } struct _starpu_node_ops _starpu_driver_cpu_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = _starpu_cpu_copy_interface, #ifdef STARPU_USE_CUDA .copy_interface_to[STARPU_CUDA_RAM] = _starpu_cuda_copy_interface_from_cpu_to_cuda, #else .copy_interface_to[STARPU_CUDA_RAM] = NULL, #endif #ifdef STARPU_USE_OPENCL .copy_interface_to[STARPU_OPENCL_RAM] = _starpu_opencl_copy_interface_from_cpu_to_opencl, #else .copy_interface_to[STARPU_OPENCL_RAM] = NULL, #endif .copy_interface_to[STARPU_DISK_RAM] = _starpu_disk_copy_interface_from_cpu_to_disk, #ifdef STARPU_USE_MIC .copy_interface_to[STARPU_MIC_RAM] = _starpu_mic_copy_interface_from_cpu_to_mic, #else .copy_interface_to[STARPU_MIC_RAM] = NULL, #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE .copy_interface_to[STARPU_MPI_MS_RAM] = _starpu_mpi_copy_interface_from_cpu_to_mpi, #else .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, #endif .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = _starpu_cpu_copy_data, #ifdef STARPU_USE_CUDA .copy_data_to[STARPU_CUDA_RAM] = _starpu_cuda_copy_data_from_cpu_to_cuda, #else .copy_data_to[STARPU_CUDA_RAM] = NULL, #endif #ifdef STARPU_USE_OPENCL .copy_data_to[STARPU_OPENCL_RAM] = _starpu_opencl_copy_data_from_cpu_to_opencl, #else .copy_data_to[STARPU_OPENCL_RAM] = NULL, #endif .copy_data_to[STARPU_DISK_RAM] = _starpu_disk_copy_data_from_cpu_to_disk, #ifdef STARPU_USE_MIC .copy_data_to[STARPU_MIC_RAM] = _starpu_mic_copy_data_from_cpu_to_mic, #else .copy_data_to[STARPU_MIC_RAM] = NULL, #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE .copy_data_to[STARPU_MPI_MS_RAM] = _starpu_mpi_copy_data_from_cpu_to_mpi, #else .copy_data_to[STARPU_MPI_MS_RAM] = NULL, #endif .copy2d_data_to[STARPU_UNUSED] = NULL, .copy2d_data_to[STARPU_CPU_RAM] = NULL, #ifdef STARPU_USE_CUDA .copy2d_data_to[STARPU_CUDA_RAM] = _starpu_cuda_copy2d_data_from_cpu_to_cuda, #else .copy2d_data_to[STARPU_CUDA_RAM] = NULL, #endif .copy2d_data_to[STARPU_OPENCL_RAM] = NULL, .copy2d_data_to[STARPU_DISK_RAM] = NULL, .copy2d_data_to[STARPU_MIC_RAM] = NULL, .copy2d_data_to[STARPU_MPI_MS_RAM] = NULL, .copy3d_data_to[STARPU_UNUSED] = NULL, .copy3d_data_to[STARPU_CPU_RAM] = NULL, #if 0 #ifdef STARPU_USE_CUDA .copy3d_data_to[STARPU_CUDA_RAM] = _starpu_cuda_copy3d_data_from_cpu_to_cuda, #else .copy3d_data_to[STARPU_CUDA_RAM] = NULL, #endif #else .copy3d_data_to[STARPU_CUDA_RAM] = NULL, #endif .copy3d_data_to[STARPU_OPENCL_RAM] = NULL, .copy3d_data_to[STARPU_DISK_RAM] = NULL, .copy3d_data_to[STARPU_MIC_RAM] = NULL, .copy3d_data_to[STARPU_MPI_MS_RAM] = NULL, .wait_request_completion = NULL, .test_request_completion = NULL, .is_direct_access_supported = _starpu_cpu_is_direct_access_supported, .malloc_on_node = _starpu_cpu_malloc_on_node, .free_on_node = _starpu_cpu_free_on_node, .name = "cpu driver" }; starpu-1.3.9+dfsg/src/drivers/cpu/driver_cpu.h000066400000000000000000000031321413463044200213300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include extern struct _starpu_driver_ops _starpu_driver_cpu_ops; extern struct _starpu_node_ops _starpu_driver_cpu_node_ops; void *_starpu_cpu_worker(void *); int _starpu_cpu_copy_interface(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_cpu_copy_data(uintptr_t src_ptr, size_t src_offset, unsigned src_node, uintptr_t dst_ptr, size_t dst_offset, unsigned dst_node, size_t ssize, struct _starpu_async_channel *async_channel); int _starpu_cpu_is_direct_access_supported(unsigned node, unsigned handling_node); uintptr_t _starpu_cpu_malloc_on_node(unsigned dst_node, size_t size, int flags); void _starpu_cpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags); #endif // __DRIVER_CPU_H__ starpu-1.3.9+dfsg/src/drivers/cuda/000077500000000000000000000000001413463044200171435ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/cuda/driver_cuda.c000066400000000000000000001673311413463044200216110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_cuda.h" #include #ifdef HAVE_CUDA_GL_INTEROP_H #include #endif #ifdef STARPU_HAVE_LIBNVIDIA_ML #include #endif #include #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 /* At least CUDA 4.2 still didn't have working memcpy3D */ #if CUDART_VERSION < 5000 #define BUGGED_MEMCPY3D #endif #endif /* Consider a rough 10% overhead cost */ #define FREE_MARGIN 0.9 /* the number of CUDA devices */ static int ncudagpus = -1; static size_t global_mem[STARPU_MAXCUDADEVS]; #ifdef STARPU_HAVE_LIBNVIDIA_ML static nvmlDevice_t nvmlDev[STARPU_MAXCUDADEVS]; #endif int _starpu_cuda_bus_ids[STARPU_MAXCUDADEVS+STARPU_MAXNUMANODES][STARPU_MAXCUDADEVS+STARPU_MAXNUMANODES]; #ifdef STARPU_USE_CUDA static cudaStream_t streams[STARPU_NMAXWORKERS]; static char used_stream[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 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 cuda_alloc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; #endif /* STARPU_SIMGRID */ static enum initialization cuda_device_init[STARPU_MAXCUDADEVS]; static int cuda_device_users[STARPU_MAXCUDADEVS]; static starpu_pthread_mutex_t cuda_device_init_mutex[STARPU_MAXCUDADEVS]; static starpu_pthread_cond_t cuda_device_init_cond[STARPU_MAXCUDADEVS]; void _starpu_cuda_init(void) { unsigned i; for (i = 0; i < STARPU_MAXCUDADEVS; i++) { STARPU_PTHREAD_MUTEX_INIT(&cuda_device_init_mutex[i], NULL); STARPU_PTHREAD_COND_INIT(&cuda_device_init_cond[i], NULL); } } static size_t _starpu_cuda_get_global_mem_size(unsigned devid) { return global_mem[devid]; } #ifdef STARPU_HAVE_LIBNVIDIA_ML nvmlDevice_t _starpu_cuda_get_nvmldev(struct cudaDeviceProp *props) { char busid[13]; nvmlDevice_t ret; snprintf(busid, sizeof(busid), "%04x:%02x:%02x.0", props->pciDomainID, props->pciBusID, props->pciDeviceID); if (nvmlDeviceGetHandleByPciBusId(busid, &ret) != NVML_SUCCESS) ret = NULL; return ret; } nvmlDevice_t starpu_cuda_get_nvmldev(unsigned devid) { return nvmlDev[devid]; } #endif 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; #ifdef STARPU_HAVE_LIBNVIDIA_ML nvmlInit(); #endif #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]; snprintf(name, sizeof(name), "STARPU_LIMIT_CUDA_%u_MEM", devid); limit = starpu_get_env_number(name); } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (limit == -1) { limit = totalGlobalMem / (1024*1024) * FREE_MARGIN; } #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_check(); 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_in_transfer_stream(unsigned dst_node) { int dst_devid = starpu_memory_node_get_devid(dst_node); cudaStream_t stream; stream = in_transfer_streams[dst_devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_local_out_transfer_stream() { int worker = starpu_worker_get_id_check(); 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_out_transfer_stream(unsigned src_node) { int src_devid = starpu_memory_node_get_devid(src_node); cudaStream_t stream; stream = out_transfer_streams[src_devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_peer_transfer_stream(unsigned src_node, unsigned dst_node) { int src_devid = starpu_memory_node_get_devid(src_node); int dst_devid = starpu_memory_node_get_devid(dst_node); cudaStream_t stream; stream = in_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_check(); used_stream[worker] = 1; 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(STARPU_HAVE_CUDA_MEMCPY_PEER) && defined(HAVE_CUDA_GL_INTEROP_H) unsigned i; #endif #ifdef STARPU_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(STARPU_HAVE_CUDA_MEMCPY_PEER) && defined(HAVE_CUDA_GL_INTEROP_H) done: #endif #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. */ if (STARPU_UNLIKELY(cures && cures != cudaErrorCudartUnloading)) STARPU_CUDA_REPORT_ERROR(cures); #else if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); #endif /* STARPU_OPENMP */ #endif } static void init_device_context(unsigned devid, unsigned memnode) { #ifndef STARPU_SIMGRID cudaError_t cures; /* TODO: cudaSetDeviceFlag(cudaDeviceMapHost) */ starpu_cuda_set_device(devid); #endif /* !STARPU_SIMGRID */ STARPU_PTHREAD_MUTEX_LOCK(&cuda_device_init_mutex[devid]); cuda_device_users[devid]++; if (cuda_device_init[devid] == UNINITIALIZED) /* Nobody started initialization yet, do it */ cuda_device_init[devid] = CHANGING; else { /* Somebody else is doing initialization, wait for it */ while (cuda_device_init[devid] != INITIALIZED) STARPU_PTHREAD_COND_WAIT(&cuda_device_init_cond[devid], &cuda_device_init_mutex[devid]); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_device_init_mutex[devid]); return; } STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_device_init_mutex[devid]); #ifndef STARPU_SIMGRID #ifdef STARPU_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); (void) cudaGetLastError(); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(worker->devid, 0); (void) cudaGetLastError(); if (!cures) { _STARPU_DEBUG("Enabled GPU-Direct %d -> %d\n", worker->devid, devid); /* direct copies are made from the destination, see link_supports_direct_transfers */ starpu_bus_set_direct(_starpu_cuda_bus_ids[worker->devid+STARPU_MAXNUMANODES][devid+STARPU_MAXNUMANODES], 1); } } } } } #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 STARPU_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); int 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); } #endif /* !STARPU_SIMGRID */ STARPU_PTHREAD_MUTEX_LOCK(&cuda_device_init_mutex[devid]); cuda_device_init[devid] = INITIALIZED; STARPU_PTHREAD_COND_BROADCAST(&cuda_device_init_cond[devid]); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_device_init_mutex[devid]); _starpu_cuda_limit_gpu_mem_if_needed(devid); _starpu_memory_manager_set_global_memory_size(memnode, _starpu_cuda_get_global_mem_size(devid)); } static void init_worker_context(unsigned workerid, unsigned devid STARPU_ATTRIBUTE_UNUSED) { int j; #ifdef STARPU_SIMGRID for (j = 0; j < STARPU_MAX_PIPELINE; j++) task_finished[workerid][j] = 0; #else /* !STARPU_SIMGRID */ cudaError_t cures; starpu_cuda_set_device(devid); 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) { int i; starpu_cuda_set_device(devid); cudaStreamDestroy(in_transfer_streams[devid]); cudaStreamDestroy(out_transfer_streams[devid]); for (i = 0; i < ncudagpus; i++) { cudaStreamDestroy(in_peer_transfer_streams[i][devid]); } } #endif /* !STARPU_SIMGRID */ static void deinit_worker_context(unsigned workerid, unsigned devid STARPU_ATTRIBUTE_UNUSED) { unsigned j; #ifdef STARPU_SIMGRID for (j = 0; j < STARPU_MAX_PIPELINE; j++) task_finished[workerid][j] = 0; #else /* STARPU_SIMGRID */ starpu_cuda_set_device(devid); for (j = 0; j < STARPU_MAX_PIPELINE; j++) cudaEventDestroy(task_events[workerid][j]); cudaStreamDestroy(streams[workerid]); #endif /* STARPU_SIMGRID */ } /* 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; } /* This is run from initialize to determine the number of CUDA devices */ 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) { 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_local_worker_key(worker); _starpu_set_current_task(task); 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(STARPU_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 if (cl->flags & STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT && !async) { _SIMGRID_TIMER_BEGIN(1); func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); _SIMGRID_TIMER_END; } else _starpu_simgrid_submit_job(workerid, j, &worker->perf_arch, NAN, async ? &task_finished[workerid][pipeline_idx] : NULL); #else #ifdef HAVE_NVMLDEVICEGETTOTALENERGYCONSUMPTION unsigned long long energy_start = 0; nvmlReturn_t nvmlRet = -1; if (profiling && task->profiling_info) { nvmlRet = nvmlDeviceGetTotalEnergyConsumption(nvmlDev[worker->devid], &energy_start); if (nvmlRet == NVML_SUCCESS) task->profiling_info->energy_consumed = energy_start / 1000.; } #endif 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(); #ifdef HAVE_NVMLDEVICEGETTOTALENERGYCONSUMPTION if (profiling && j->task->profiling_info && j->task->profiling_info->energy_consumed) { unsigned long long energy_end; nvmlReturn_t nvmlRet; nvmlRet = nvmlDeviceGetTotalEnergyConsumption(nvmlDev[worker->devid], &energy_end); #ifdef STARPU_DEVEL #warning TODO: measure idle consumption to subtract it #endif if (nvmlRet == NVML_SUCCESS) j->task->profiling_info->energy_consumed = (energy_end / 1000. - j->task->profiling_info->energy_consumed); } #endif _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(); } } #ifndef STARPU_SIMGRID if (!used_stream[workerid]) { used_stream[workerid] = 1; _STARPU_DISP("Warning: starpu_cuda_get_local_stream() was not used to submit kernel to CUDA on worker %d. CUDA will thus introduce a lot of useless synchronizations, which will prevent proper overlapping of data transfers and kernel execution. See the CUDA-specific part of the 'Check List When Performance Are Not There' of the StarPU handbook\n", workerid); } #endif 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 */ cudaError_t cures = cudaEventRecord(task_events[workerid][pipeline_idx], starpu_cuda_get_local_stream()); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); #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); } } /* This is run from the driver to initialize the driver CUDA context */ 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) { #ifdef STARPU_SIMGRID STARPU_ASSERT_MSG(0, "Simgrid mode does not support concurrent kernel execution yet\n"); #endif /* !STARPU_SIMGRID */ /* Already initialized */ continue; } lastdevid = devid; init_device_context(devid, memnode); #ifndef STARPU_SIMGRID if (worker->config->topology.nworkerpercuda > 1 && props[devid].concurrentKernels == 0) _STARPU_DISP("Warning: STARPU_NWORKER_PER_CUDA is %u, but CUDA device %u does not support concurrent kernel execution!\n", worker_set->nworkers, devid); #endif /* !STARPU_SIMGRID */ } /* one more time to avoid hacks from third party lib :) */ _starpu_bind_thread_on_cpu(worker0->bindid, worker0->workerid, NULL); for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; unsigned devid = worker->devid; unsigned workerid = worker->workerid; unsigned subdev = i % _starpu_get_machine_config()->topology.nworkerpercuda; float size = (float) global_mem[devid] / (1<<30); #ifdef STARPU_SIMGRID const char *devname = "Simgrid"; #else /* get the device's name */ char devname[64]; strncpy(devname, props[devid].name, 63); devname[63] = 0; #endif #if defined(STARPU_HAVE_BUSID) && !defined(STARPU_SIMGRID) #if defined(STARPU_HAVE_DOMAINID) && !defined(STARPU_SIMGRID) #ifdef STARPU_HAVE_LIBNVIDIA_ML nvmlDev[devid] = _starpu_cuda_get_nvmldev(&props[devid]); #endif if (props[devid].pciDomainID) snprintf(worker->name, sizeof(worker->name), "CUDA %u.%u (%s %.1f GiB %04x:%02x:%02x.0)", devid, subdev, 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, subdev, devname, size, props[devid].pciBusID, props[devid].pciDeviceID); #else snprintf(worker->name, sizeof(worker->name), "CUDA %u.%u (%s %.1f GiB)", devid, subdev, devname, size); #endif snprintf(worker->short_name, sizeof(worker->short_name), "CUDA %u.%u", devid, subdev); _STARPU_DEBUG("cuda (%s) dev id %u worker %u thread is ready to run on CPU %d !\n", devname, devid, subdev, 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 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, worker->devid); _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]; struct starpu_task *tasks[worker_set->nworkers], *task; struct _starpu_job *j; int i, res; int idle_tasks, idle_transfers; #ifdef STARPU_SIMGRID starpu_pthread_wait_reset(&worker0->wait); #endif _starpu_set_local_worker_key(worker0); /* First poll for completed jobs */ idle_tasks = 0; idle_transfers = 0; for (i = 0; i < (int) worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; int workerid = worker->workerid; unsigned memnode = worker->memory_node; if (!worker->ntasks) idle_tasks++; if (!worker->task_transferring) idle_transfers++; if (!worker->ntasks && !worker->task_transferring) { /* Even nothing to test */ continue; } /* First test for transfers pending for next task */ task = worker->task_transferring; if (task && worker->nb_buffers_transferred == worker->nb_buffers_totransfer) { STARPU_RMB(); _STARPU_TRACE_END_PROGRESS(memnode); j = _starpu_get_job_associated_to_task(task); _starpu_set_local_worker_key(worker); _starpu_fetch_task_input_tail(task, j, worker); _starpu_set_worker_status(worker, STATUS_UNKNOWN); /* Reset it */ worker->task_transferring = NULL; 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; } else { execute_job_on_cuda(task, worker); } _STARPU_TRACE_START_PROGRESS(memnode); } /* Then test for termination of queued tasks */ if (!worker->ntasks) /* No queued task */ continue; if (worker->pipeline_length) task = worker->current_tasks[worker->first_task]; else task = worker->current_task; if (task == worker->task_transferring) /* Next task is still pending transfer */ continue; /* 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) { if (worker->current_tasks[worker->first_task] != worker->task_transferring) { 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; } } else /* Data for next task didn't have time to finish transferring :/ */ _STARPU_TRACE_WORKER_START_FETCH_INPUT(NULL, workerid); } #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_tasks++; } #if defined(STARPU_NON_BLOCKING_DRIVERS) && !defined(STARPU_SIMGRID) if (!idle_tasks) { /* No task ready yet, no better thing to do than waiting */ __starpu_datawizard_progress(1, !idle_transfers); return 0; } #endif /* Something done, make some progress */ res = !idle_tasks || !idle_transfers; res |= __starpu_datawizard_progress(1, 1); /* And pull tasks */ res |= _starpu_get_multi_worker_task(worker_set->workers, tasks, worker_set->nworkers, worker0->memory_node); #ifdef STARPU_SIMGRID if (!res) starpu_pthread_wait_wait(&worker0->wait); #else if (!res) return 0; #endif for (i = 0; i < (int) worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; unsigned memnode STARPU_ATTRIBUTE_UNUSED = worker->memory_node; 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 */ _starpu_worker_refuse_task(worker, task); #if 0 if (worker->pipeline_length) { int j; for (j = 0; j < worker->ntasks; j++) { const int j_mod = (j+worker->first_task)%STARPU_MAX_PIPELINE; if (task == worker->current_tasks[j_mod]) { worker->current_tasks[j_mod] = NULL; if (j == 0) { worker->first_task = (worker->first_task + 1) % STARPU_MAX_PIPELINE; _starpu_set_current_task(NULL); } break; } } STARPU_ASSERT(jntasks); } else { worker->current_task = NULL; _starpu_set_current_task(NULL); } worker->ntasks--; int res = _starpu_push_task_to_workers(task); STARPU_ASSERT_MSG(res == 0, "_starpu_push_task_to_workers() unexpectedly returned = %d\n", res); #endif continue; } /* Fetch data asynchronously */ _STARPU_TRACE_END_PROGRESS(memnode); _starpu_set_local_worker_key(worker); res = _starpu_fetch_task_input(task, j, 1); STARPU_ASSERT(res == 0); _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; unsigned usersleft; if ((int) devid == lastdevid) /* Already initialized */ continue; lastdevid = devid; STARPU_PTHREAD_MUTEX_LOCK(&cuda_device_init_mutex[devid]); usersleft = --cuda_device_users[devid]; STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_device_init_mutex[devid]); if (!usersleft) { /* I'm last, deinitialize device */ _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 */ } STARPU_PTHREAD_MUTEX_LOCK(&cuda_device_init_mutex[devid]); cuda_device_init[devid] = UNINITIALIZED; STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_device_init_mutex[devid]); } for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; unsigned workerid = worker->workerid; deinit_worker_context(workerid, worker->devid); } 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); _STARPU_ERROR("oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); } #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 STARPU_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 STARPU_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) { double start; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); #ifdef STARPU_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); } (void) cudaGetLastError(); starpu_interface_end_driver_copy_async(src_node, dst_node, start); } /* 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 STARPU_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); } (void) cudaGetLastError(); if (!cures) cures = cudaDeviceSynchronize(); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } return -EAGAIN; } int starpu_cuda_copy2d_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, cudaStream_t stream, enum cudaMemcpyKind kind) { #ifdef STARPU_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 STARPU_HAVE_CUDA_MEMCPY_PEER # ifdef BUGGED_MEMCPY3D STARPU_ABORT_MSG("CUDA memcpy 3D peer buggy, but core triggered one?!"); # endif peer_copy = 1; src_dev = starpu_memory_node_get_devid(src_node); dst_dev = starpu_memory_node_get_devid(dst_node); #else STARPU_ABORT_MSG("CUDA memcpy 3D peer not available, but core triggered one ?!"); #endif } #ifdef STARPU_HAVE_CUDA_MEMCPY_PEER if (peer_copy) { struct cudaMemcpy3DPeerParms p; memset(&p, 0, sizeof(p)); p.srcDevice = src_dev; p.dstDevice = dst_dev; p.srcPtr = make_cudaPitchedPtr((char *)src_ptr, ld_src, blocksize, numblocks); p.dstPtr = make_cudaPitchedPtr((char *)dst_ptr, ld_dst, blocksize, numblocks); p.extent = make_cudaExtent(blocksize, numblocks, 1); if (stream) { double start; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cures = cudaMemcpy3DPeerAsync(&p, stream); (void) cudaGetLastError(); } /* Test if the asynchronous copy has failed or if the caller only asked for a synchronous copy */ if (stream == NULL || cures) { cures = cudaMemcpy3DPeer(&p); (void) cudaGetLastError(); if (!cures) cures = cudaDeviceSynchronize(); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } } else #endif { if (stream) { double start; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cures = cudaMemcpy2DAsync((char *)dst_ptr, ld_dst, (char *)src_ptr, ld_src, blocksize, numblocks, kind, stream); starpu_interface_end_driver_copy_async(src_node, dst_node, start); } /* Test if the asynchronous copy has failed or if the caller only asked for a synchronous copy */ if (stream == NULL || cures) { cures = cudaMemcpy2D((char *)dst_ptr, ld_dst, (char *)src_ptr, ld_src, blocksize, numblocks, kind); if (!cures) cures = cudaDeviceSynchronize(); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } } return -EAGAIN; } #if 0 /* CUDA doesn't seem to be providing a way to set ld2?? */ int starpu_cuda_copy3d_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, cudaStream_t stream, enum cudaMemcpyKind kind) { #ifdef STARPU_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 STARPU_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_MSG("CUDA memcpy 3D peer not available, but core triggered one ?!"); #endif } #ifdef STARPU_HAVE_CUDA_MEMCPY_PEER if (peer_copy) { struct cudaMemcpy3DPeerParms p; memset(&p, 0, sizeof(p)); p.srcDevice = src_dev; p.dstDevice = dst_dev; p.srcPtr = make_cudaPitchedPtr((char *)src_ptr, ld1_src, blocksize, numblocks); p.dstPtr = make_cudaPitchedPtr((char *)dst_ptr, ld1_dst, blocksize, numblocks); // FIXME: how to pass ld2_src / ld2_dst ?? p.extent = make_cudaExtent(blocksize, numblocks_1, numblocks_2); if (stream) { double start; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cures = cudaMemcpy3DPeerAsync(&p, stream); } /* Test if the asynchronous copy has failed or if the caller only asked for a synchronous copy */ if (stream == NULL || cures) { cures = cudaMemcpy3DPeer(&p); (void) cudaGetLastError(); if (!cures) cures = cudaDeviceSynchronize(); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } } else #endif { struct cudaMemcpy3DParms p; memset(&p, 0, sizeof(p)); p.srcPtr = make_cudaPitchedPtr((char *)src_ptr, ld1_src, blocksize, numblocks); p.dstPtr = make_cudaPitchedPtr((char *)dst_ptr, ld1_dst, blocksize, numblocks); // FIXME: how to pass ld2_src / ld2_dst ?? p.extent = make_cudaExtent(blocksize, numblocks, 1); p.kind = kind; if (stream) { double start; starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cures = cudaMemcpy3DAsync(&p, stream); starpu_interface_end_driver_copy_async(src_node, dst_node, start); } /* Test if the asynchronous copy has failed or if the caller only asked for a synchronous copy */ if (stream == NULL || cures) { cures = cudaMemcpy3D(&p); if (!cures) cures = cudaDeviceSynchronize(); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } } return -EAGAIN; } #endif #endif /* STARPU_USE_CUDA */ int _starpu_run_cuda(struct _starpu_worker_set *workerarg) { /* Let's go ! */ _starpu_cuda_worker(workerarg); return 0; } int _starpu_cuda_driver_init_from_worker(struct _starpu_worker *worker) { return _starpu_cuda_driver_init(worker->set); } int _starpu_cuda_run_from_worker(struct _starpu_worker *worker) { return _starpu_run_cuda(worker->set); } int _starpu_cuda_driver_run_once_from_worker(struct _starpu_worker *worker) { return _starpu_cuda_driver_run_once(worker->set); } int _starpu_cuda_driver_deinit_from_worker(struct _starpu_worker *worker) { return _starpu_cuda_driver_deinit(worker->set); } #ifdef STARPU_USE_CUDA unsigned _starpu_cuda_test_request_completion(struct _starpu_async_channel *async_channel) { cudaEvent_t event; cudaError_t cures; unsigned success; event = (*async_channel).event.cuda_event; cures = cudaEventQuery(event); success = (cures == cudaSuccess); if (success) cudaEventDestroy(event); else if (cures != cudaErrorNotReady) STARPU_CUDA_REPORT_ERROR(cures); return success; } void _starpu_cuda_wait_request_completion(struct _starpu_async_channel *async_channel) { cudaEvent_t event; cudaError_t cures; 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); } int _starpu_cuda_copy_interface_from_cuda_to_cuda(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CUDA_RAM && dst_kind == STARPU_CUDA_RAM); int ret = 1; cudaError_t cures; cudaStream_t stream; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* 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.node_ops = &_starpu_driver_cuda_node_ops; 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); } return ret; } int _starpu_cuda_copy_interface_from_cuda_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CUDA_RAM && dst_kind == STARPU_CPU_RAM); int ret = 1; cudaError_t cures; cudaStream_t stream; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* only the proper CUBLAS thread can initiate this directly ! */ #if !defined(STARPU_HAVE_CUDA_MEMCPY_PEER) STARPU_ASSERT(starpu_worker_get_local_memory_node() == 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.node_ops = &_starpu_driver_cuda_node_ops; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_out_transfer_stream(src_node); 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); } return ret; } int _starpu_cuda_copy_interface_from_cpu_to_cuda(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_CUDA_RAM); int ret = 1; cudaError_t cures; cudaStream_t stream; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* STARPU_CPU_RAM -> CUBLAS_RAM */ /* only the proper CUBLAS thread can initiate this ! */ #if !defined(STARPU_HAVE_CUDA_MEMCPY_PEER) STARPU_ASSERT(starpu_worker_get_local_memory_node() == 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.node_ops = &_starpu_driver_cuda_node_ops; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_in_transfer_stream(dst_node); 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); } return ret; } int _starpu_cuda_copy_data_from_cuda_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CUDA_RAM && dst_kind == 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_out_transfer_stream(src_node):NULL, cudaMemcpyDeviceToHost); } int _starpu_cuda_copy_data_from_cuda_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CUDA_RAM && dst_kind == 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); } int _starpu_cuda_copy_data_from_cpu_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == 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_in_transfer_stream(dst_node):NULL, cudaMemcpyHostToDevice); } int _starpu_cuda_copy2d_data_from_cuda_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CUDA_RAM && dst_kind == STARPU_CPU_RAM); return starpu_cuda_copy2d_async_sync((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, blocksize, numblocks, ld_src, ld_dst, async_channel?starpu_cuda_get_out_transfer_stream(src_node):NULL, cudaMemcpyDeviceToHost); } int _starpu_cuda_copy2d_data_from_cuda_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CUDA_RAM && dst_kind == STARPU_CUDA_RAM); return starpu_cuda_copy2d_async_sync((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, blocksize, numblocks, ld_src, ld_dst, async_channel?starpu_cuda_get_peer_transfer_stream(src_node, dst_node):NULL, cudaMemcpyDeviceToDevice); } int _starpu_cuda_copy2d_data_from_cpu_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_CUDA_RAM); return starpu_cuda_copy2d_async_sync((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, blocksize, numblocks, ld_src, ld_dst, async_channel?starpu_cuda_get_in_transfer_stream(dst_node):NULL, cudaMemcpyHostToDevice); } #endif /* STARPU_USE_CUDA */ int _starpu_cuda_is_direct_access_supported(unsigned node, unsigned handling_node) { /* GPUs not always allow direct remote access: if CUDA4 * is enabled, we allow two CUDA devices to communicate. */ #ifdef STARPU_SIMGRID (void) node; if (starpu_node_get_kind(handling_node) == STARPU_CUDA_RAM) { starpu_sg_host_t host = _starpu_simgrid_get_memnode_host(handling_node); # ifdef STARPU_HAVE_SIMGRID_ACTOR_H const char* cuda_memcpy_peer = sg_host_get_property_value(host, "memcpy_peer"); # else const char* cuda_memcpy_peer = MSG_host_get_property_value(host, "memcpy_peer"); # endif return cuda_memcpy_peer && atoll(cuda_memcpy_peer); } else return 0; #elif defined(STARPU_HAVE_CUDA_MEMCPY_PEER) (void) node; enum starpu_node_kind kind = starpu_node_get_kind(handling_node); return kind == STARPU_CUDA_RAM; #else /* STARPU_HAVE_CUDA_MEMCPY_PEER */ /* Direct GPU-GPU transfers are not allowed in general */ (void) node; (void) handling_node; return 0; #endif /* STARPU_HAVE_CUDA_MEMCPY_PEER */ } uintptr_t _starpu_cuda_malloc_on_node(unsigned dst_node, size_t size, int flags) { uintptr_t addr = 0; (void) flags; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) #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()) starpu_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 unsigned devid = starpu_memory_node_get_devid(dst_node); #if defined(STARPU_HAVE_CUDA_MEMCPY_PEER) starpu_cuda_set_device(devid); #else struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (!worker || worker->arch != STARPU_CUDA_WORKER || worker->devid != devid) STARPU_ASSERT_MSG(0, "CUDA peer access is not available with this version of CUDA"); #endif /* Check if there is free memory */ size_t cuda_mem_free, cuda_mem_total; cudaError_t status; status = cudaMemGetInfo(&cuda_mem_free, &cuda_mem_total); if (status == cudaSuccess && cuda_mem_free * FREE_MARGIN < size) { addr = 0; } else { status = cudaMalloc((void **)&addr, size); if (!addr || (status != cudaSuccess)) { if (STARPU_UNLIKELY(status != cudaErrorMemoryAllocation)) STARPU_CUDA_REPORT_ERROR(status); addr = 0; } } #endif #endif return addr; } void _starpu_cuda_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags) { (void) size; (void) flags; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&cuda_alloc_mutex); /* Sleep for the free */ if (_starpu_simgrid_cuda_malloc_cost()) starpu_sleep(0.000750); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_alloc_mutex); /* CUDA also synchronizes roughly everything on cudaFree */ _starpu_simgrid_sync_gpus(); #else cudaError_t err; unsigned devid = starpu_memory_node_get_devid(dst_node); #if defined(STARPU_HAVE_CUDA_MEMCPY_PEER) starpu_cuda_set_device(devid); #else struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (!worker || worker->arch != STARPU_CUDA_WORKER || worker->devid != devid) STARPU_ASSERT_MSG(0, "CUDA peer access is not available with this version of CUDA"); #endif /* STARPU_HAVE_CUDA_MEMCPY_PEER */ err = cudaFree((void*)addr); #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. */ if (STARPU_UNLIKELY(err != cudaSuccess && err != cudaErrorCudartUnloading)) STARPU_CUDA_REPORT_ERROR(err); #else if (STARPU_UNLIKELY(err != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(err); #endif /* STARPU_OPENMP */ #endif /* STARPU_SIMGRID */ #endif } struct _starpu_driver_ops _starpu_driver_cuda_ops = { .init = _starpu_cuda_driver_init_from_worker, .run = _starpu_cuda_run_from_worker, .run_once = _starpu_cuda_driver_run_once_from_worker, .deinit = _starpu_cuda_driver_deinit_from_worker }; #ifdef STARPU_SIMGRID struct _starpu_node_ops _starpu_driver_cuda_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = NULL, .copy_interface_to[STARPU_CUDA_RAM] = NULL, .copy_interface_to[STARPU_OPENCL_RAM] = NULL, .copy_interface_to[STARPU_DISK_RAM] = NULL, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = NULL, .copy_data_to[STARPU_CUDA_RAM] = NULL, .copy_data_to[STARPU_OPENCL_RAM] = NULL, .copy_data_to[STARPU_DISK_RAM] = NULL, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = NULL, .copy2d_data_to[STARPU_UNUSED] = NULL, .copy2d_data_to[STARPU_CPU_RAM] = NULL, .copy2d_data_to[STARPU_CUDA_RAM] = NULL, .copy2d_data_to[STARPU_OPENCL_RAM] = NULL, .copy2d_data_to[STARPU_DISK_RAM] = NULL, .copy2d_data_to[STARPU_MIC_RAM] = NULL, .copy2d_data_to[STARPU_MPI_MS_RAM] = NULL, .copy3d_data_to[STARPU_UNUSED] = NULL, .copy3d_data_to[STARPU_CPU_RAM] = NULL, .copy3d_data_to[STARPU_CUDA_RAM] = NULL, .copy3d_data_to[STARPU_OPENCL_RAM] = NULL, .copy3d_data_to[STARPU_DISK_RAM] = NULL, .copy3d_data_to[STARPU_MIC_RAM] = NULL, .copy3d_data_to[STARPU_MPI_MS_RAM] = NULL, .wait_request_completion = NULL, .test_request_completion = NULL, .is_direct_access_supported = _starpu_cuda_is_direct_access_supported, .malloc_on_node = _starpu_cuda_malloc_on_node, .free_on_node = _starpu_cuda_free_on_node, .name = "cuda driver" }; #else struct _starpu_node_ops _starpu_driver_cuda_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = _starpu_cuda_copy_interface_from_cuda_to_cpu, .copy_interface_to[STARPU_CUDA_RAM] = _starpu_cuda_copy_interface_from_cuda_to_cuda, .copy_interface_to[STARPU_OPENCL_RAM] = NULL, .copy_interface_to[STARPU_DISK_RAM] = NULL, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = _starpu_cuda_copy_data_from_cuda_to_cpu, .copy_data_to[STARPU_CUDA_RAM] = _starpu_cuda_copy_data_from_cuda_to_cuda, .copy_data_to[STARPU_OPENCL_RAM] = NULL, .copy_data_to[STARPU_DISK_RAM] = NULL, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = NULL, .copy2d_data_to[STARPU_UNUSED] = NULL, .copy2d_data_to[STARPU_CPU_RAM] = _starpu_cuda_copy2d_data_from_cuda_to_cpu, .copy2d_data_to[STARPU_CUDA_RAM] = _starpu_cuda_copy2d_data_from_cuda_to_cuda, .copy2d_data_to[STARPU_OPENCL_RAM] = NULL, .copy2d_data_to[STARPU_DISK_RAM] = NULL, .copy2d_data_to[STARPU_MIC_RAM] = NULL, .copy2d_data_to[STARPU_MPI_MS_RAM] = NULL, .copy3d_data_to[STARPU_UNUSED] = NULL, #if 0 .copy3d_data_to[STARPU_CPU_RAM] = _starpu_cuda_copy3d_data_from_cuda_to_cpu, .copy3d_data_to[STARPU_CUDA_RAM] = _starpu_cuda_copy3d_data_from_cuda_to_cuda, #else .copy3d_data_to[STARPU_CPU_RAM] = NULL, .copy3d_data_to[STARPU_CUDA_RAM] = NULL, #endif .copy3d_data_to[STARPU_OPENCL_RAM] = NULL, .copy3d_data_to[STARPU_DISK_RAM] = NULL, .copy3d_data_to[STARPU_MIC_RAM] = NULL, .copy3d_data_to[STARPU_MPI_MS_RAM] = NULL, .wait_request_completion = _starpu_cuda_wait_request_completion, .test_request_completion = _starpu_cuda_test_request_completion, .is_direct_access_supported = _starpu_cuda_is_direct_access_supported, .malloc_on_node = _starpu_cuda_malloc_on_node, .free_on_node = _starpu_cuda_free_on_node, .name = "cuda driver" }; #endif starpu-1.3.9+dfsg/src/drivers/cuda/driver_cuda.h000066400000000000000000000126741413463044200216150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2015 Mathieu Lirzin * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #ifdef STARPU_USE_CUDA #include #include #include #ifdef STARPU_HAVE_LIBNVIDIA_ML #include #endif #endif #include #include #include extern struct _starpu_driver_ops _starpu_driver_cuda_ops; extern struct _starpu_node_ops _starpu_driver_cuda_node_ops; void _starpu_cuda_init(void); unsigned _starpu_get_cuda_device_count(void); extern int _starpu_cuda_bus_ids[STARPU_MAXCUDADEVS+STARPU_MAXNUMANODES][STARPU_MAXCUDADEVS+STARPU_MAXNUMANODES]; #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 *); #ifdef STARPU_HAVE_LIBNVIDIA_ML nvmlDevice_t _starpu_cuda_get_nvmldev(struct cudaDeviceProp *props); #endif #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_in_transfer_stream(unsigned dst_node); cudaStream_t starpu_cuda_get_local_out_transfer_stream(void); cudaStream_t starpu_cuda_get_out_transfer_stream(unsigned src_node); cudaStream_t starpu_cuda_get_peer_transfer_stream(unsigned src_node, unsigned dst_node); #endif unsigned _starpu_cuda_test_request_completion(struct _starpu_async_channel *async_channel); void _starpu_cuda_wait_request_completion(struct _starpu_async_channel *async_channel); int _starpu_cuda_copy_interface_from_cpu_to_cuda(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_cuda_copy_interface_from_cuda_to_cuda(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_cuda_copy_interface_from_cuda_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_cuda_copy_data_from_cuda_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy_data_from_cuda_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy_data_from_cpu_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy2d_data_from_cuda_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy2d_data_from_cuda_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy2d_data_from_cpu_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks, size_t ld_src, size_t ld_dst, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy3d_data_from_cuda_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy3d_data_from_cuda_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, struct _starpu_async_channel *async_channel); int _starpu_cuda_copy3d_data_from_cpu_to_cuda(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t blocksize, size_t numblocks_1, size_t ld1_src, size_t ld1_dst, size_t numblocks_2, size_t ld2_src, size_t ld2_dst, struct _starpu_async_channel *async_channel); int _starpu_cuda_is_direct_access_supported(unsigned node, unsigned handling_node); uintptr_t _starpu_cuda_malloc_on_node(unsigned dst_node, size_t size, int flags); void _starpu_cuda_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags); #endif // __DRIVER_CUDA_H__ starpu-1.3.9+dfsg/src/drivers/cuda/starpu_cublas.c000066400000000000000000000064621413463044200221660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #include static int cublas_initialized[STARPU_NMAXWORKERS]; static cublasHandle_t cublas_handles[STARPU_NMAXWORKERS]; static cublasHandle_t main_handle; static starpu_pthread_mutex_t mutex; static unsigned get_idx(void) { unsigned workerid = starpu_worker_get_id_check(); unsigned th_per_dev = _starpu_get_machine_config()->topology.cuda_th_per_dev; unsigned th_per_stream = _starpu_get_machine_config()->topology.cuda_th_per_stream; if (th_per_dev) return starpu_worker_get_devid(workerid); else if (th_per_stream) return workerid; else /* same thread for all devices */ return 0; } static void init_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED) { unsigned idx = get_idx(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!(cublas_initialized[idx]++)) { cublasStatus cublasst = cublasInit(); if (STARPU_UNLIKELY(cublasst)) STARPU_CUBLAS_REPORT_ERROR(cublasst); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); cublasCreate(&cublas_handles[starpu_worker_get_id_check()]); cublasSetStream(cublas_handles[starpu_worker_get_id_check()], starpu_cuda_get_local_stream()); } static void set_cublas_stream_func(void *args STARPU_ATTRIBUTE_UNUSED) { cublasSetKernelStream(starpu_cuda_get_local_stream()); } static void shutdown_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED) { unsigned idx = get_idx(); STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!--cublas_initialized[idx]) cublasShutdown(); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); 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); starpu_execute_on_each_worker(set_cublas_stream_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 } void starpu_cublas_set_stream(void) { #ifdef STARPU_USE_CUDA if (!_starpu_get_machine_config()->topology.cuda_th_per_dev || (!_starpu_get_machine_config()->topology.cuda_th_per_stream && _starpu_get_machine_config()->topology.nworkerpercuda > 1)) cublasSetKernelStream(starpu_cuda_get_local_stream()); #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.3.9+dfsg/src/drivers/cuda/starpu_cusparse.c000066400000000000000000000040771413463044200225420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/drivers/disk/000077500000000000000000000000001413463044200171615ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/disk/driver_disk.c000066400000000000000000000256671413463044200216520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 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); } unsigned _starpu_disk_test_request_completion(struct _starpu_async_channel *async_channel) { unsigned success = starpu_disk_test_request(async_channel); if (async_channel->event.disk_event.ptr != NULL && success) { if (async_channel->event.disk_event.handle != NULL) { /* read is finished, we can already unpack */ async_channel->event.disk_event.handle->ops->unpack_data(async_channel->event.disk_event.handle, async_channel->event.disk_event.node, async_channel->event.disk_event.ptr, async_channel->event.disk_event.size); } else { /* write is finished, ptr was allocated in pack_data */ _starpu_free_flags_on_node(async_channel->event.disk_event.node, async_channel->event.disk_event.ptr, async_channel->event.disk_event.size, 0); } } return success; } void _starpu_disk_wait_request_completion(struct _starpu_async_channel *async_channel) { starpu_disk_wait_request(async_channel); if (async_channel->event.disk_event.ptr != NULL) { if (async_channel->event.disk_event.handle != NULL) { /* read is finished, we can already unpack */ async_channel->event.disk_event.handle->ops->unpack_data(async_channel->event.disk_event.handle, async_channel->event.disk_event.node, async_channel->event.disk_event.ptr, async_channel->event.disk_event.size); } else { /* write is finished, ptr was allocated in pack_data */ _starpu_free_flags_on_node(async_channel->event.disk_event.node, async_channel->event.disk_event.ptr, async_channel->event.disk_event.size, 0); } } } int _starpu_disk_copy_interface_from_disk_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_DISK_RAM && dst_kind == STARPU_CPU_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (req && !starpu_asynchronous_copy_disabled()) { req->async_channel.node_ops = &_starpu_driver_disk_node_ops; req->async_channel.event.disk_event.requests = NULL; req->async_channel.event.disk_event.ptr = NULL; req->async_channel.event.disk_event.handle = NULL; } 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); } else if (ret == -EAGAIN) { STARPU_ASSERT(req); req->async_channel.event.disk_event.ptr = ptr; req->async_channel.event.disk_event.node = dst_node; req->async_channel.event.disk_event.size = size; req->async_channel.event.disk_event.handle = handle; } STARPU_ASSERT(ret == 0 || ret == -EAGAIN); } return ret; } int _starpu_disk_copy_interface_from_disk_to_disk(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_DISK_RAM && dst_kind == STARPU_DISK_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (req && !starpu_asynchronous_copy_disabled()) { req->async_channel.node_ops = &_starpu_driver_disk_node_ops; req->async_channel.event.disk_event.requests = NULL; req->async_channel.event.disk_event.ptr = NULL; req->async_channel.event.disk_event.handle = NULL; } ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, req && !starpu_asynchronous_copy_disabled() ? &req->async_channel : NULL); return ret; } int _starpu_disk_copy_interface_from_cpu_to_disk(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_DISK_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (req && !starpu_asynchronous_copy_disabled()) { req->async_channel.node_ops = &_starpu_driver_disk_node_ops; req->async_channel.event.disk_event.requests = NULL; req->async_channel.event.disk_event.ptr = NULL; req->async_channel.event.disk_event.handle = NULL; } 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 */ _starpu_free_flags_on_node(src_node, ptr, size, 0); } else if (ret == -EAGAIN) { STARPU_ASSERT(req); req->async_channel.event.disk_event.ptr = ptr; req->async_channel.event.disk_event.node = src_node; req->async_channel.event.disk_event.size = size; } STARPU_ASSERT(ret == 0 || ret == -EAGAIN); } return ret; } int _starpu_disk_copy_data_from_disk_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_DISK_RAM && dst_kind == 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); } int _starpu_disk_copy_data_from_disk_to_disk(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_DISK_RAM && dst_kind == 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); } int _starpu_disk_copy_data_from_cpu_to_disk(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == 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); } int _starpu_disk_is_direct_access_supported(unsigned node, unsigned handling_node) { /* Each worker can manage disks but disk <-> disk is not always allowed */ switch (starpu_node_get_kind(handling_node)) { case STARPU_CPU_RAM: return 1; case STARPU_DISK_RAM: return _starpu_disk_can_copy(node, handling_node); default: return 0; } } uintptr_t _starpu_disk_malloc_on_node(unsigned dst_node, size_t size, int flags) { (void) flags; uintptr_t addr = 0; addr = (uintptr_t) _starpu_disk_alloc(dst_node, size); return addr; } void _starpu_disk_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags) { (void) flags; _starpu_disk_free(dst_node, (void *) addr , size); } struct _starpu_node_ops _starpu_driver_disk_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = _starpu_disk_copy_interface_from_disk_to_cpu, .copy_interface_to[STARPU_CUDA_RAM] = NULL, .copy_interface_to[STARPU_OPENCL_RAM] = NULL, .copy_interface_to[STARPU_DISK_RAM] = _starpu_disk_copy_interface_from_disk_to_disk, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = _starpu_disk_copy_data_from_disk_to_cpu, .copy_data_to[STARPU_CUDA_RAM] = NULL, .copy_data_to[STARPU_OPENCL_RAM] = NULL, .copy_data_to[STARPU_DISK_RAM] = _starpu_disk_copy_data_from_disk_to_disk, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = NULL, /* TODO: copy2D/3D? */ .wait_request_completion = _starpu_disk_wait_request_completion, .test_request_completion = _starpu_disk_test_request_completion, .is_direct_access_supported = _starpu_disk_is_direct_access_supported, .malloc_on_node = _starpu_disk_malloc_on_node, .free_on_node = _starpu_disk_free_on_node, .name = "disk driver" }; starpu-1.3.9+dfsg/src/drivers/disk/driver_disk.h000066400000000000000000000057241413463044200216470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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__ /** @file */ #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); 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); unsigned _starpu_disk_test_request_completion(struct _starpu_async_channel *async_channel); void _starpu_disk_wait_request_completion(struct _starpu_async_channel *async_channel); int _starpu_disk_copy_interface_from_disk_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_disk_copy_interface_from_disk_to_disk(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_disk_copy_interface_from_cpu_to_disk(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_disk_copy_data_from_disk_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_disk_copy_data_from_disk_to_disk(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_disk_copy_data_from_cpu_to_disk(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); extern struct _starpu_node_ops _starpu_driver_disk_node_ops; int _starpu_disk_is_direct_access_supported(unsigned node, unsigned handling_node); uintptr_t _starpu_disk_malloc_on_node(unsigned dst_node, size_t size, int flags); void _starpu_disk_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags); #endif starpu-1.3.9+dfsg/src/drivers/driver_common/000077500000000000000000000000001413463044200210725ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/driver_common/driver_common.c000066400000000000000000000505671413463044200241160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 void _starpu_driver_start_job(struct _starpu_worker *worker, struct _starpu_job *j, struct starpu_perfmodel_arch* perf_arch, int rank, int profiling) { struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; 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 && rank == 0) _starpu_sched_pre_exec_hook(task); _starpu_set_worker_status(worker, STATUS_EXECUTING); if (rank == 0) { STARPU_ASSERT(task->status == STARPU_TASK_READY); task->status = STARPU_TASK_RUNNING; 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_clock_gettime(&worker->cl_start); _starpu_worker_register_executing_start_date(workerid, &worker->cl_start); } _starpu_job_notify_start(j, perf_arch); } // 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); _starpu_sched_ctx_lock_read(sched_ctx->id); 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; int new_rank = 0; 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) { new_rank++; struct _starpu_worker *_worker = _starpu_get_worker_struct(_workerid); _starpu_driver_start_job(_worker, j, &_worker->perf_arch, new_rank, profiling); } } } _STARPU_TRACE_TASK_COLOR(j); _STARPU_TRACE_START_CODELET_BODY(j, j->nimpl, &sched_ctx->perf_arch, workerid); } else { _STARPU_TRACE_TASK_COLOR(j); _STARPU_TRACE_START_CODELET_BODY(j, j->nimpl, perf_arch, workerid); } _starpu_sched_ctx_unlock_read(sched_ctx->id); _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 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_clock_gettime(&worker->cl_end); _starpu_worker_register_executing_end(workerid); } STARPU_AYU_POSTRUNTASK(j->job_id); } _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; int new_rank = 0; 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) { new_rank++; struct _starpu_worker *_worker = _starpu_get_worker_struct(_workerid); _starpu_driver_end_job(_worker, j, &_worker->perf_arch, new_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); STARPU_ASSERT_MSG(measured >= 0, "measured=%lf\n", measured); 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, j->task->flops); 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, 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_set_status(workerid, STATUS_SLEEPING_SCHEDULING); } else if (_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_SLEEPING_SCHEDULING) { _starpu_worker_set_status(workerid, STATUS_SLEEPING); } else 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_SLEEPING) { if (_starpu_worker_get_status(workerid) != STATUS_SLEEPING_SCHEDULING) { _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_TRACE_WORKER_SLEEP_END; _starpu_worker_stop_sleeping(workerid); _starpu_worker_set_status(workerid, STATUS_UNKNOWN); } } #if !defined(STARPU_SIMGRID) static void _starpu_exponential_backoff(struct _starpu_worker *worker) { int delay = worker->spinning_backoff; if (worker->spinning_backoff < worker->config->conf.driver_spinning_backoff_max) worker->spinning_backoff<<=1; while(delay--) STARPU_UYIELD(); } #endif /* 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) { struct starpu_task *task; #if !defined(STARPU_SIMGRID) unsigned keep_awake = 0; #endif STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); _starpu_worker_enter_sched_op(worker); _starpu_worker_set_status_scheduling(workerid); #if !defined(STARPU_SIMGRID) if ((worker->pipeline_length == 0 && worker->current_task) || (worker->pipeline_length != 0 && worker->ntasks)) /* This worker is executing something */ keep_awake = 1; #endif /*if the worker is already executing a task then */ if (worker->pipeline_length && (worker->ntasks == worker->pipeline_length || worker->pipeline_stuck)) task = NULL; /* don't push a task if we are already transferring one */ else if (worker->task_transferring != NULL) task = NULL; /*else try to pop a task*/ else { STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); task = _starpu_pop_task(worker); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex); #if !defined(STARPU_SIMGRID) if (worker->state_keep_awake) { keep_awake = 1; worker->state_keep_awake = 0; } #endif } #if !defined(STARPU_SIMGRID) if (task == NULL && !keep_awake) { /* 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); _starpu_worker_leave_sched_op(worker); STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); #ifndef STARPU_NON_BLOCKING_DRIVERS if (_starpu_worker_can_block(memnode, worker) && !worker->state_block_in_parallel_req && !worker->state_unblock_in_parallel_req && !_starpu_sched_ctx_last_worker_awake(worker)) { #ifdef STARPU_WORKER_CALLBACKS if (_starpu_config.conf.callback_worker_going_to_sleep != NULL) { _starpu_config.conf.callback_worker_going_to_sleep(workerid); } #endif do { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); if (!worker->state_keep_awake && _starpu_worker_can_block(memnode, worker) && !worker->state_block_in_parallel_req && !worker->state_unblock_in_parallel_req) { _starpu_worker_set_status_sleeping(workerid); if (_starpu_sched_ctx_last_worker_awake(worker)) { break; } } else { break; } } while (1); worker->state_keep_awake = 0; _starpu_worker_set_status_scheduling_done(workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); #ifdef STARPU_WORKER_CALLBACKS if (_starpu_config.conf.callback_worker_waking_up != NULL) { /* the wake up callback should be called once the sched_mutex has been unlocked, * so that an external resource manager can potentially defer the wake-up momentarily if * the corresponding computing unit is still in use by another runtime system */ _starpu_config.conf.callback_worker_waking_up(workerid); } #endif } else #endif { _starpu_worker_set_status_scheduling_done(workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); if (_starpu_machine_is_running()) _starpu_exponential_backoff(worker); } return NULL; } #endif 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 = worker->config->conf.driver_spinning_backoff_min; _starpu_worker_leave_sched_op(worker); STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); 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; #if !defined(STARPU_NON_BLOCKING_DRIVERS) && !defined(STARPU_SIMGRID) int executing = 0; #endif /*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_set_local_worker_key(&workers[0]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&workers[0].sched_mutex); _starpu_worker_enter_sched_op(&workers[0]); #endif for (i = 0; i < nworkers; i++) { unsigned keep_awake = 0; #if !defined(STARPU_NON_BLOCKING_DRIVERS) && !defined(STARPU_SIMGRID) 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; #endif /*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; } /* don't push a task if we are already transferring one */ else if (workers[i].task_transferring != NULL) { tasks[i] = NULL; } /*else try to pop a task*/ else { #ifdef STARPU_NON_BLOCKING_DRIVERS _starpu_set_local_worker_key(&workers[i]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&workers[i].sched_mutex); _starpu_worker_enter_sched_op(&workers[i]); #endif _starpu_worker_set_status_scheduling(workers[i].workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&workers[i].sched_mutex); tasks[i] = _starpu_pop_task(&workers[i]); STARPU_PTHREAD_MUTEX_LOCK_SCHED(&workers[i].sched_mutex); if (workers[i].state_keep_awake) { keep_awake = workers[i].state_keep_awake; workers[i].state_keep_awake = 0; } if(tasks[i] != NULL || keep_awake) { _starpu_worker_set_status_scheduling_done(workers[i].workerid); _starpu_worker_set_status_wakeup(workers[i].workerid); STARPU_PTHREAD_COND_BROADCAST(&workers[i].sched_cond); #ifdef STARPU_NON_BLOCKING_DRIVERS _starpu_worker_leave_sched_op(&workers[i]); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&workers[i].sched_mutex); #endif count ++; if (tasks[i] == NULL) /* no task, but keep_awake */ continue; 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_worker_leave_sched_op(&workers[i]); #endif STARPU_PTHREAD_COND_BROADCAST(&workers[i].sched_cond); #ifdef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&workers[i].sched_mutex); #endif } } } #if !defined(STARPU_NON_BLOCKING_DRIVERS) #if !defined(STARPU_SIMGRID) /* 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); _starpu_worker_leave_sched_op(worker); if (_starpu_worker_can_block(memnode, worker) && !worker->state_block_in_parallel_req && !worker->state_unblock_in_parallel_req && !_starpu_sched_ctx_last_worker_awake(worker)) { #ifdef STARPU_WORKER_CALLBACKS if (_starpu_config.conf.callback_worker_going_to_sleep != NULL) { _starpu_config.conf.callback_worker_going_to_sleep(workerid); } #endif do { STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex); if (!worker->state_keep_awake && _starpu_worker_can_block(memnode, worker) && !worker->state_block_in_parallel_req && !worker->state_unblock_in_parallel_req) { _starpu_worker_set_status_sleeping(workerid); if (_starpu_sched_ctx_last_worker_awake(worker)) { break; } } else { break; } } while (1); worker->state_keep_awake = 0; _starpu_worker_set_status_scheduling_done(workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); #ifdef STARPU_WORKER_CALLBACKS if (_starpu_config.conf.callback_worker_waking_up != NULL) { /* the wake up callback should be called once the sched_mutex has been unlocked, * so that an external resource manager can potentially defer the wake-up momentarily if * the corresponding computing unit is still in use by another runtime system */ _starpu_config.conf.callback_worker_waking_up(workerid); } #endif } else { _starpu_worker_set_status_scheduling_done(workerid); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex); if (_starpu_machine_is_running()) _starpu_exponential_backoff(worker); } return 0; } _starpu_worker_set_status_wakeup(workerid); worker->spinning_backoff = worker->config->conf.driver_spinning_backoff_min; #endif /* !STARPU_SIMGRID */ _starpu_worker_leave_sched_op(&workers[0]); STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&workers[0].sched_mutex); #endif /* !STARPU_NON_BLOCKING_DRIVERS */ return count; } starpu-1.3.9+dfsg/src/drivers/driver_common/driver_common.h000066400000000000000000000031431413463044200241070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/drivers/mic/000077500000000000000000000000001413463044200167775ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/mic/driver_mic_common.c000066400000000000000000000122471413463044200226440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2015 Mathieu Lirzin * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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); _STARPU_ERROR("Common: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); } /* 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, void * event) { 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, void * event) { 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.3.9+dfsg/src/drivers/mic/driver_mic_common.h000066400000000000000000000055201413463044200226450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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 * event); void _starpu_mic_common_dt_recv(const struct _starpu_mp_node *node, void *msg, int len, void * event); 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.3.9+dfsg/src/drivers/mic/driver_mic_sink.c000066400000000000000000000156711413463044200223240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 = starpu_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; STARPU_PTHREAD_CREATE(&thread, &attr, _starpu_sink_thread, arg); ((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); _STARPU_ERROR("SINK: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); } /* 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_MP_COMMAND_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_MP_COMMAND_ERROR_ALLOCATE, NULL, 0); } #endif _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_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.3.9+dfsg/src/drivers/mic/driver_mic_sink.h000066400000000000000000000036031413463044200223210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/drivers/mic/driver_mic_source.c000066400000000000000000000561411413463044200226550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 *_starpu_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 _starpu_mic_nodes[devid]; } 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 _starpu_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=NULL, *tmp=NULL; 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 = _starpu_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); _STARPU_ERROR("SRC: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); } /* 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); _STARPU_ERROR("SRC: oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); } /* 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. */ const 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. */ const 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_MP_COMMAND_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) { 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_sync(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) { 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_sync(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; } /* Test if a asynchronous request is end. * Return 1 if is end, 0 else. */ unsigned _starpu_mic_test_request_completion(struct _starpu_async_channel *async_channel) { struct _starpu_mic_async_event *event = &async_channel->event.mic_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; } /* Wait the end of the asynchronous request */ void _starpu_mic_wait_request_completion(struct _starpu_async_channel *async_channel) { struct _starpu_mic_async_event *event = &async_channel->event.mic_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; } } 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, _starpu_mic_nodes[devid]); return NULL; } int _starpu_mic_copy_interface_from_mic_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_MIC_RAM && dst_kind == STARPU_CPU_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* 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) ret = copy_methods->mic_to_ram(src_interface, src_node, dst_interface, dst_node); else ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.node_ops = &_starpu_driver_mic_node_ops; 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); } return ret; } int _starpu_mic_copy_interface_from_cpu_to_mic(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_MIC_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* 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) ret = copy_methods->ram_to_mic(src_interface, src_node, dst_interface, dst_node); else ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.node_ops = &_starpu_driver_mic_node_ops; 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); } return ret; } int _starpu_mic_copy_data_from_mic_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_MIC_RAM && dst_kind == STARPU_CPU_RAM); if (async_channel) 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); } int _starpu_mic_copy_data_from_cpu_to_mic(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_MIC_RAM); if (async_channel) 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); } int _starpu_mic_is_direct_access_supported(unsigned node, unsigned handling_node) { (void) node; (void) handling_node; /* TODO: We don't handle direct MIC-MIC transfers yet */ return 0; } uintptr_t _starpu_mic_malloc_on_node(unsigned dst_node, size_t size, int flags) { (void) flags; uintptr_t addr = 0; if (_starpu_mic_allocate_memory((void **)(&addr), size, dst_node)) addr = 0; return addr; } void _starpu_mic_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags) { (void) flags; _starpu_mic_free_memory((void*) addr, size, dst_node); } /* TODO: MIC -> MIC */ struct _starpu_node_ops _starpu_driver_mic_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = _starpu_mic_copy_interface_from_mic_to_cpu, .copy_interface_to[STARPU_CUDA_RAM] = NULL, .copy_interface_to[STARPU_OPENCL_RAM] = NULL, .copy_interface_to[STARPU_DISK_RAM] = NULL, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = _starpu_mic_copy_data_from_mic_to_cpu, .copy_data_to[STARPU_CUDA_RAM] = NULL, .copy_data_to[STARPU_OPENCL_RAM] = NULL, .copy_data_to[STARPU_DISK_RAM] = NULL, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = NULL, /* TODO: copy2D/3D? */ .wait_request_completion = _starpu_mic_wait_request_completion, .test_request_completion = _starpu_mic_test_request_completion, .is_direct_access_supported = _starpu_mic_is_direct_access_supported, .malloc_on_node = _starpu_mic_malloc_on_node, .free_on_node = _starpu_mic_free_on_node, .name = "mic driver" }; starpu-1.3.9+dfsg/src/drivers/mic/driver_mic_source.h000066400000000000000000000114001413463044200226470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #include #ifdef STARPU_USE_MIC #include #include #include #include #include extern struct _starpu_node_ops _starpu_driver_mic_node_ops; /** Array of structures containing all the informations useful to send * and receive informations with devices */ extern struct _starpu_mp_node *_starpu_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(); 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_src_worker(void *arg); #endif /* STARPU_USE_MIC */ unsigned _starpu_mic_test_request_completion(struct _starpu_async_channel *async_channel); void _starpu_mic_wait_request_completion(struct _starpu_async_channel *async_channel); int _starpu_mic_copy_data_from_mic_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_mic_copy_data_from_cpu_to_mic(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_mic_copy_interface_from_mic_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_mic_copy_interface_from_cpu_to_mic(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_mic_is_direct_access_supported(unsigned node, unsigned handling_node); uintptr_t _starpu_mic_malloc_on_node(unsigned dst_node, size_t size, int flags); void _starpu_mic_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags); #endif /* __DRIVER_MIC_SOURCE_H__ */ starpu-1.3.9+dfsg/src/drivers/mic/driver_mic_utils.c000066400000000000000000000030411413463044200225040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/drivers/mp_common/000077500000000000000000000000001413463044200202135ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/mp_common/mp_common.c000066400000000000000000000304441413463044200223500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 const char *_starpu_mp_common_command_to_string(const int command) { switch(command) { case STARPU_MP_COMMAND_EXIT: return "EXIT"; case STARPU_MP_COMMAND_EXECUTE: return "EXECUTE"; case STARPU_MP_COMMAND_EXECUTE_DETACHED: return "EXECUTE_DETACHED"; case STARPU_MP_COMMAND_ERROR_EXECUTE: return "ERROR_EXECUTE"; case STARPU_MP_COMMAND_ERROR_EXECUTE_DETACHED: return "ERROR_EXECUTE_DETACHED"; case STARPU_MP_COMMAND_LOOKUP: return "LOOKUP"; case STARPU_MP_COMMAND_ANSWER_LOOKUP: return "ANSWER_LOOKUP"; case STARPU_MP_COMMAND_ERROR_LOOKUP: return "ERROR_LOOKUP"; case STARPU_MP_COMMAND_ALLOCATE: return "ALLOCATE"; case STARPU_MP_COMMAND_ANSWER_ALLOCATE: return "ANSWER_ALLOCATE"; case STARPU_MP_COMMAND_ERROR_ALLOCATE: return "ERROR_ALLOCATE"; case STARPU_MP_COMMAND_FREE: return "FREE"; /* Synchronous send */ case STARPU_MP_COMMAND_RECV_FROM_HOST: return "RECV_FROM_HOST"; case STARPU_MP_COMMAND_SEND_TO_HOST: return "SEND_TO_HOST"; case STARPU_MP_COMMAND_RECV_FROM_SINK: return "RECV_FROM_SINK"; case STARPU_MP_COMMAND_SEND_TO_SINK: return "SEND_TO_SINK"; /* Asynchronous send */ case STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC: return "RECV_FROM_HOST_ASYNC"; case STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC_COMPLETED: return "RECV_FROM_HOST_ASYNC_COMPLETED"; case STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC: return "SEND_TO_HOST_ASYNC"; case STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC_COMPLETED: return "SEND_TO_HOST_ASYNC_COMPLETED"; case STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC: return "RECV_FROM_SINK_ASYNC"; case STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC_COMPLETED: return "RECV_FROM_SINK_ASYNC_COMPLETED"; case STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC: return "SEND_TO_SINK_ASYNC"; case STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC_COMPLETED: return "SEND_TO_SINK_ASYNC_COMPLETED"; case STARPU_MP_COMMAND_TRANSFER_COMPLETE: return "TRANSFER_COMPLETE"; case STARPU_MP_COMMAND_SINK_NBCORES: return "SINK_NBCORES"; case STARPU_MP_COMMAND_ANSWER_SINK_NBCORES: return "ANSWER_SINK_NBCORES"; case STARPU_MP_COMMAND_EXECUTION_SUBMITTED: return "EXECUTION_SUBMITTED"; case STARPU_MP_COMMAND_EXECUTION_COMPLETED: return "EXECUTION_COMPLETED"; case STARPU_MP_COMMAND_EXECUTION_DETACHED_SUBMITTED: return "EXECUTION_SUBMITTED_DETACHED"; case STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED: return "EXECUTION_DETACHED_COMPLETED"; case STARPU_MP_COMMAND_PRE_EXECUTION: return "PRE_EXECUTION"; case STARPU_MP_COMMAND_SYNC_WORKERS: return "SYNC_WORKERS"; default: return ""; } } const char *_starpu_mp_common_node_kind_to_string(const int kind) { switch(kind) { case STARPU_NODE_MIC_SINK: return "MIC_SINK"; case STARPU_NODE_MIC_SOURCE: return "MIC_SOURCE"; case STARPU_NODE_MPI_SINK: return "MPI_SINK"; case STARPU_NODE_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_NODE_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_NODE_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->dt_test = NULL; /* Not used now */ 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_MPI_MASTER_SLAVE case STARPU_NODE_MPI_SOURCE: { /* node->nb_mp_sinks = node->devid = */ node->peer_id = (_starpu_mpi_common_get_src_node() <= peer_id ? peer_id+1 : peer_id); node->mp_connection.mpi_remote_nodeid = node->peer_id; node->init = _starpu_mpi_source_init; node->launch_workers = NULL; node->deinit = _starpu_mpi_source_deinit; /* node->report_error = */ node->mp_recv_is_ready = _starpu_mpi_common_recv_is_ready; node->mp_send = _starpu_mpi_common_mp_send; node->mp_recv = _starpu_mpi_common_mp_recv; node->dt_send = _starpu_mpi_common_send; node->dt_recv = _starpu_mpi_common_recv; node->dt_send_to_device = _starpu_mpi_common_send_to_device; node->dt_recv_from_device = _starpu_mpi_common_recv_from_device; node->get_kernel_from_job = _starpu_mpi_ms_src_get_kernel_from_job; node->lookup = NULL; node->bind_thread = NULL; node->execute = NULL; node->allocate = NULL; node->free = NULL; } break; case STARPU_NODE_MPI_SINK: { /* node->nb_mp_sinks = node->devid = */ node->mp_connection.mpi_remote_nodeid = _starpu_mpi_common_get_src_node(); node->init = _starpu_mpi_sink_init; node->launch_workers = _starpu_mpi_sink_launch_workers; node->deinit = _starpu_mpi_sink_deinit; /* node->report_error = */ node->mp_recv_is_ready = _starpu_mpi_common_recv_is_ready; node->mp_send = _starpu_mpi_common_mp_send; node->mp_recv = _starpu_mpi_common_mp_recv; node->dt_send = _starpu_mpi_common_send; node->dt_recv = _starpu_mpi_common_recv; node->dt_send_to_device = _starpu_mpi_common_send_to_device; node->dt_recv_from_device = _starpu_mpi_common_recv_from_device; node->dt_test = _starpu_mpi_common_test_event; node->get_kernel_from_job = NULL; node->lookup = _starpu_mpi_sink_lookup; node->bind_thread = _starpu_mpi_sink_bind_thread; node->execute = _starpu_sink_common_execute; node->allocate = _starpu_sink_common_allocate; node->free = _starpu_sink_common_free; } break; #endif /* STARPU_USE_MPI_MASTER_SLAVE */ 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); STARPU_PTHREAD_MUTEX_INIT(&node->connection_mutex, NULL); _starpu_mp_event_list_init(&node->event_list); /* If the node is a sink then we must initialize some field */ if(node->kind == STARPU_NODE_MIC_SINK || node->kind == STARPU_NODE_MPI_SINK) { int i; node->is_running = 1; _STARPU_MALLOC(node->run_table, sizeof(struct mp_task *)*node->nb_cores); _STARPU_MALLOC(node->run_table_detached, 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; node->run_table_detached[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_NODE_MIC_SINK || node->kind == STARPU_NODE_MPI_SINK) { int i; for(i=0; inb_cores; i++) { sem_destroy(&node->sem_run_table[i]); } free(node->run_table); free(node->run_table_detached); 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); //printf("SEND CMD : %d - arg_size %d by %lu \n", command, arg_size, starpu_pthread_self()); /* 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)); //printf("RECV command : %d - arg_size %d by %lu \n", command, *arg_size, starpu_pthread_self()); /* 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.3.9+dfsg/src/drivers/mp_common/mp_common.h000066400000000000000000000210401413463044200223450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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_MP_COMMAND_EXIT, STARPU_MP_COMMAND_EXECUTE, STARPU_MP_COMMAND_EXECUTE_DETACHED, STARPU_MP_COMMAND_ERROR_EXECUTE, STARPU_MP_COMMAND_ERROR_EXECUTE_DETACHED, STARPU_MP_COMMAND_LOOKUP, STARPU_MP_COMMAND_ANSWER_LOOKUP, STARPU_MP_COMMAND_ERROR_LOOKUP, STARPU_MP_COMMAND_ALLOCATE, STARPU_MP_COMMAND_ANSWER_ALLOCATE, STARPU_MP_COMMAND_ERROR_ALLOCATE, STARPU_MP_COMMAND_FREE, /** Synchronous send */ STARPU_MP_COMMAND_RECV_FROM_HOST, STARPU_MP_COMMAND_SEND_TO_HOST, STARPU_MP_COMMAND_RECV_FROM_SINK, STARPU_MP_COMMAND_SEND_TO_SINK, /** Asynchronous send */ STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC, STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC_COMPLETED, STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC, STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC_COMPLETED, STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC, STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC_COMPLETED, STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC, STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC_COMPLETED, STARPU_MP_COMMAND_TRANSFER_COMPLETE, STARPU_MP_COMMAND_SINK_NBCORES, STARPU_MP_COMMAND_ANSWER_SINK_NBCORES, STARPU_MP_COMMAND_EXECUTION_SUBMITTED, STARPU_MP_COMMAND_EXECUTION_COMPLETED, STARPU_MP_COMMAND_EXECUTION_DETACHED_SUBMITTED, STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED, STARPU_MP_COMMAND_PRE_EXECUTION, STARPU_MP_COMMAND_SYNC_WORKERS, }; const char *_starpu_mp_common_command_to_string(const int command); enum _starpu_mp_node_kind { STARPU_NODE_MIC_SINK, STARPU_NODE_MIC_SOURCE, STARPU_NODE_MPI_SINK, STARPU_NODE_MPI_SOURCE, STARPU_NODE_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_MPI_MASTER_SLAVE int mpi_remote_nodeid; #endif }; struct _starpu_mp_transfer_command { size_t size; void *addr; void *event; }; struct _starpu_mp_transfer_command_to_device { int devid; size_t size; void *addr; void *event; }; 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; unsigned nb_interfaces; void *cl_arg; unsigned coreid; enum starpu_codelet_type type; int is_parallel_task; int combined_workerid; int detached; struct mp_barrier* mp_barrier; }; LIST_TYPE(_starpu_mp_event, struct _starpu_async_channel event; void * remote_event; enum _starpu_mp_command answer_cmd; ); /** 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; /** Mutex to protect the interleaving of communications when using one thread per node, * for instance, when a thread transfers piece of data and an other wants to use * a sink_to_sink communication */ starpu_pthread_mutex_t connection_mutex; /** 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; /** This list contains events * about asynchronous request */ struct _starpu_mp_event_list event_list; /** */ 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; struct mp_task ** run_table_detached; 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 *); void (*dt_recv) (const struct _starpu_mp_node *, void *, int, void *); void (*dt_send_to_device) (const struct _starpu_mp_node *, int, void *, int, void *); void (*dt_recv_from_device) (const struct _starpu_mp_node *, int, void *, int, void *); /** Test async transfers */ int (*dt_test) (struct _starpu_async_channel *); 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.3.9+dfsg/src/drivers/mp_common/sink_common.c000066400000000000000000000654351413463044200227100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #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_NODE_MIC_SINK; else if (!strcmp(node_kind, "STARPU_MPI_MS")) return STARPU_NODE_MPI_SINK; else return STARPU_NODE_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_MP_COMMAND_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_MP_COMMAND_ANSWER_LOOKUP, &func, sizeof(func)); else _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_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; _STARPU_MALLOC(addr, *(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_MP_COMMAND_ANSWER_ALLOCATE, &addr, sizeof(addr)); else _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_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_sync(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, NULL); } static void _starpu_sink_common_copy_from_host_async(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; /* For asynchronous transfers, we store events to test them later when they are finished */ struct _starpu_mp_event * sink_event = _starpu_mp_event_new(); /* Save the command to send */ sink_event->answer_cmd = STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC_COMPLETED; sink_event->remote_event = cmd->event; /* Set the sender (host) ready because we don't want to wait its ack */ struct _starpu_async_channel * async_channel = &sink_event->event; async_channel->node_ops = NULL; async_channel->starpu_mp_common_finished_sender = -1; async_channel->starpu_mp_common_finished_receiver = 0; async_channel->polling_node_receiver = NULL; async_channel->polling_node_sender = NULL; mp_node->dt_recv(mp_node, cmd->addr, cmd->size, &sink_event->event); /* Push event on the list */ _starpu_mp_event_list_push_back(&mp_node->event_list, sink_event); } static void _starpu_sink_common_copy_to_host_sync(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; /* Save values before sending command to prevent the overwriting */ size_t size = cmd->size; void * addr = cmd->addr; _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_SEND_TO_HOST, NULL, 0); mp_node->dt_send(mp_node, addr, size, NULL); } static void _starpu_sink_common_copy_to_host_async(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; /* For asynchronous transfers, we need to say dt_send that we are in async mode * but we don't push event on list because we don't need to know if it's finished */ struct _starpu_mp_event * sink_event = _starpu_mp_event_new(); /* Save the command to send */ sink_event->answer_cmd = STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC_COMPLETED; sink_event->remote_event = cmd->event; /* Set the receiver (host) ready because we don't want to wait its ack */ struct _starpu_async_channel * async_channel = &sink_event->event; async_channel->node_ops = NULL; async_channel->starpu_mp_common_finished_sender = 0; async_channel->starpu_mp_common_finished_receiver = -1; async_channel->polling_node_receiver = NULL; async_channel->polling_node_sender = NULL; mp_node->dt_send(mp_node, cmd->addr, cmd->size, &sink_event->event); /* Push event on the list */ _starpu_mp_event_list_push_back(&mp_node->event_list, sink_event); } static void _starpu_sink_common_copy_from_sink_sync(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, NULL); _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_TRANSFER_COMPLETE, NULL, 0); } static void _starpu_sink_common_copy_from_sink_async(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; /* For asynchronous transfers, we store events to test them later when they are finished */ struct _starpu_mp_event * sink_event = _starpu_mp_event_new(); /* Save the command to send */ sink_event->answer_cmd = STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC_COMPLETED; sink_event->remote_event = cmd->event; /* Set the sender ready because we don't want to wait its ack */ struct _starpu_async_channel * async_channel = &sink_event->event; async_channel->node_ops = NULL; async_channel->starpu_mp_common_finished_sender = -1; async_channel->starpu_mp_common_finished_receiver = 0; async_channel->polling_node_receiver = NULL; async_channel->polling_node_sender = NULL; mp_node->dt_recv_from_device(mp_node, cmd->devid, cmd->addr, cmd->size, &sink_event->event); /* Push event on the list */ _starpu_mp_event_list_push_back(&mp_node->event_list, sink_event); } static void _starpu_sink_common_copy_to_sink_sync(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, NULL); } static void _starpu_sink_common_copy_to_sink_async(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; /* For asynchronous transfers, we need to say dt_send that we are in async mode * but we don't push event on list because we don't need to know if it's finished */ struct _starpu_mp_event * sink_event = _starpu_mp_event_new(); /* Save the command to send */ sink_event->answer_cmd = STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC_COMPLETED; sink_event->remote_event = cmd->event; /* Set the receiver ready because we don't want to wait its ack */ struct _starpu_async_channel * async_channel = &sink_event->event; async_channel->node_ops = NULL; async_channel->starpu_mp_common_finished_sender = 0; async_channel->starpu_mp_common_finished_receiver = -1; async_channel->polling_node_receiver = NULL; async_channel->polling_node_sender = NULL; mp_node->dt_send_to_device(mp_node, cmd->devid, cmd->addr, cmd->size, &sink_event->event); /* Push event on the list */ _starpu_mp_event_list_push_back(&mp_node->event_list, sink_event); } /* 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, NULL); /* Update workers to have coherent field */ for(i=0; icombined_workers; node->dt_recv(node, combined_workers, combined_worker_size, NULL); 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_MP_COMMAND_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_NODE_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_MP_COMMAND_EXIT: exit_starpu = 1; break; case STARPU_MP_COMMAND_EXECUTE_DETACHED: case STARPU_MP_COMMAND_EXECUTE: node->execute(node, arg, arg_size); break; case STARPU_MP_COMMAND_SINK_NBCORES: _starpu_sink_common_get_nb_cores(node); break; case STARPU_MP_COMMAND_LOOKUP: _starpu_sink_common_lookup(node, (char *) arg); break; case STARPU_MP_COMMAND_ALLOCATE: node->allocate(node, arg, arg_size); break; case STARPU_MP_COMMAND_FREE: node->free(node, arg, arg_size); break; case STARPU_MP_COMMAND_RECV_FROM_HOST: _starpu_sink_common_copy_from_host_sync(node, arg, arg_size); break; case STARPU_MP_COMMAND_SEND_TO_HOST: _starpu_sink_common_copy_to_host_sync(node, arg, arg_size); break; case STARPU_MP_COMMAND_RECV_FROM_SINK: _starpu_sink_common_copy_from_sink_sync(node, arg, arg_size); break; case STARPU_MP_COMMAND_SEND_TO_SINK: _starpu_sink_common_copy_to_sink_sync(node, arg, arg_size); break; case STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC: _starpu_sink_common_copy_from_host_async(node, arg, arg_size); break; case STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC: _starpu_sink_common_copy_to_host_async(node, arg, arg_size); break; case STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC: _starpu_sink_common_copy_from_sink_async(node, arg, arg_size); break; case STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC: _starpu_sink_common_copy_to_sink_async(node, arg, arg_size); break; case STARPU_MP_COMMAND_SYNC_WORKERS: _starpu_sink_common_recv_workers(node, arg, arg_size); break; default: _STARPU_MSG("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); } if(!_starpu_mp_event_list_empty(&node->event_list)) { struct _starpu_mp_event * sink_event = _starpu_mp_event_list_pop_front(&node->event_list); if (node->dt_test(&sink_event->event)) { /* send ACK to host */ _starpu_mp_common_send_command(node, sink_event->answer_cmd , &sink_event->remote_event, sizeof(sink_event->remote_event)); _starpu_mp_event_delete(sink_event); } else { /* try later */ _starpu_mp_event_list_push_back(&node->event_list, sink_event); } } } STARPU_PTHREAD_KEY_DELETE(worker_key); /* Deinitialize the node and release it */ _starpu_mp_common_node_destroy(node); #ifdef STARPU_USE_MPI_MASTER_SLAVE _starpu_mpi_common_mp_deinit(); #endif 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_MP_COMMAND_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(); if (task->detached) message->type = STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED; else message->type = STARPU_MP_COMMAND_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); return -1; } /* Execute the task */ static void _starpu_sink_common_execute_kernel(struct _starpu_mp_node *node, int coreid, struct _starpu_worker * worker, int detached) { struct _starpu_combined_worker * combined_worker = NULL; struct mp_task* task; if (detached) task = node->run_table_detached[coreid]; else 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); } } if (detached) node->run_table_detached[coreid] = NULL; else 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]); free(task->interfaces); 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_detached[coreid] != NULL) _starpu_sink_common_execute_kernel(node, coreid, worker, 1); if (node->run_table[coreid] != NULL) _starpu_sink_common_execute_kernel(node, coreid, worker, 0); } 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) { int detached = task->detached; /* Add the task to the specific thread */ if (detached) node->run_table_detached[task->coreid] = task; else 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); task->detached = *(int *) arg_ptr; arg_ptr += sizeof(task->detached); _STARPU_MALLOC(task->interfaces, task->nb_interfaces * sizeof(*task->interfaces)); #ifdef STARPU_DEVEL #warning TODO: use pack/unpack for user-defined interfaces #endif /* 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); if (task->detached) _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTION_DETACHED_SUBMITTED, NULL, 0); else _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTION_SUBMITTED, NULL, 0); //_STARPU_DEBUG("executing the task %p\n", task->kernel); _starpu_sink_common_execute_thread(node, task); } starpu-1.3.9+dfsg/src/drivers/mp_common/sink_common.h000066400000000000000000000030741413463044200227040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/drivers/mp_common/source_common.c000066400000000000000000001136561413463044200232430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #if defined(STARPU_USE_MPI_MASTER_SLAVE) && !defined(STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD) struct starpu_save_thread_env { struct starpu_task * current_task; struct _starpu_worker * current_worker; struct _starpu_worker_set * current_worker_set; #ifdef STARPU_OPENMP struct starpu_omp_thread * current_omp_thread; struct starpu_omp_task * current_omp_task; #endif }; struct starpu_save_thread_env save_thread_env[STARPU_MAXMPIDEVS]; #endif 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_mp_node *node, struct _starpu_worker_set *workerset, void * arg, int arg_size, int stored) { 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(); /* if arg is not copied we release the mutex */ if (!stored) STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); _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(struct _starpu_mp_node *node, void * arg, int arg_size, int stored) { 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); /* if arg is not copied we release the mutex */ if (!stored) STARPU_PTHREAD_MUTEX_LOCK(&node->connection_mutex); 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(struct _starpu_mp_node *node, void * arg, int arg_size, enum _starpu_mp_command answer, int stored) { struct _starpu_worker_set * worker_set = NULL; switch(answer) { case STARPU_MP_COMMAND_EXECUTION_COMPLETED: { worker_set = _starpu_get_worker_struct(starpu_worker_get_id())->set; _starpu_src_common_process_completed_job(node, worker_set, arg, arg_size, stored); break; } case STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED: { _STARPU_ERROR("Detached execution completed should not arrive here... \n"); break; } case STARPU_MP_COMMAND_PRE_EXECUTION: { _starpu_src_common_pre_exec(node, arg,arg_size, stored); break; } case STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC_COMPLETED: case STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC_COMPLETED: { struct _starpu_async_channel * event = *((struct _starpu_async_channel **) arg); event->starpu_mp_common_finished_receiver--; if (!stored) STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); break; } case STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC_COMPLETED: case STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC_COMPLETED: { struct _starpu_async_channel * event = *((struct _starpu_async_channel **) arg); event->starpu_mp_common_finished_sender--; if (!stored) STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); 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); /* Release mutex during handle */ stopped_progress = 1; _STARPU_TRACE_END_PROGRESS(mp_node_memory_node(node)); STARPU_PTHREAD_MUTEX_UNLOCK(&node->message_queue_mutex); _starpu_src_common_handle_async(node, message->buffer, message->size, message->type, 1); free(message->buffer); mp_message_delete(message); /* Take it again */ STARPU_PTHREAD_MUTEX_LOCK(&node->message_queue_mutex); } 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_MP_COMMAND_EXECUTION_COMPLETED: case STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED: case STARPU_MP_COMMAND_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; } /* For ASYNC commands don't store them, update event */ case STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC_COMPLETED: case STARPU_MP_COMMAND_RECV_FROM_SINK_ASYNC_COMPLETED: { struct _starpu_async_channel * event = *((struct _starpu_async_channel **) arg); event->starpu_mp_common_finished_receiver--; return 1; } case STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC_COMPLETED: case STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC_COMPLETED: { struct _starpu_async_channel * event = *((struct _starpu_async_channel **) arg); event->starpu_mp_common_finished_sender--; return 1; } default: return 0; } } /* 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, 0)) { _STARPU_ERROR("incorrect command: unknown command or sync command"); } } /* 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_MP_COMMAND_EXECUTION_DETACHED_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 (struct _starpu_mp_node *node, int *buf) { enum _starpu_mp_command answer; void *arg; int arg_size = sizeof (int); STARPU_PTHREAD_MUTEX_LOCK(&node->connection_mutex); _starpu_mp_common_send_command (node, STARPU_MP_COMMAND_SINK_NBCORES, NULL, 0); answer = _starpu_mp_common_recv_command (node, &arg, &arg_size); STARPU_ASSERT(answer == STARPU_MP_COMMAND_ANSWER_SINK_NBCORES && arg_size == sizeof (int)); memcpy (buf, arg, arg_size); STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); 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_PTHREAD_MUTEX_LOCK(&node->connection_mutex); //_STARPU_DEBUG("Looking up %s\n", func_name); _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_LOOKUP, (void *) func_name, arg_size); answer = _starpu_src_common_wait_command_sync(node, (void **) &arg, &arg_size); if (answer == STARPU_MP_COMMAND_ERROR_LOOKUP) { _STARPU_DISP("Error looking up symbol %s\n", func_name); STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); return -ESPIPE; } /* We have to be sure the device answered the right question and the * answer has the right size */ STARPU_ASSERT(answer == STARPU_MP_COMMAND_ANSWER_LOOKUP); STARPU_ASSERT(arg_size == sizeof(*func_ptr)); memcpy(func_ptr, arg, arg_size); STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); //_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, int detached) { 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(detached) + 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); *(int *) buffer_ptr = detached; buffer_ptr += sizeof(detached); /* 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]; enum starpu_data_interface_id id = starpu_data_get_interface_id(handle); /* Check that the interface exists in _starpu_interface */ STARPU_ASSERT_MSG(id == STARPU_VOID_INTERFACE_ID || id == STARPU_VARIABLE_INTERFACE_ID || id == STARPU_VECTOR_INTERFACE_ID || id == STARPU_MATRIX_INTERFACE_ID || id == STARPU_BLOCK_INTERFACE_ID || id == STARPU_CSR_INTERFACE_ID || id == STARPU_BCSR_INTERFACE_ID || id == STARPU_COO_INTERFACE_ID, "MPI-MS currently cannot work with interface type %d", id); 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_PTHREAD_MUTEX_LOCK(&node->connection_mutex); if (detached) _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTE_DETACHED, buffer, buffer_size); else _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTE, buffer, buffer_size); enum _starpu_mp_command answer = _starpu_src_common_wait_command_sync(node, &arg, &arg_size); if (answer == STARPU_MP_COMMAND_ERROR_EXECUTE_DETACHED) { STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); return -EINVAL; } if (detached) STARPU_ASSERT(answer == STARPU_MP_COMMAND_EXECUTION_DETACHED_SUBMITTED); else STARPU_ASSERT(answer == STARPU_MP_COMMAND_EXECUTION_SUBMITTED); STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); 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); 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, 0); 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_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_ALLOCATE, &size, sizeof(size)); answer = _starpu_src_common_wait_command_sync(mp_node, &arg, &arg_size); if (answer == STARPU_MP_COMMAND_ERROR_ALLOCATE) { STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); return 1; } STARPU_ASSERT(answer == STARPU_MP_COMMAND_ANSWER_ALLOCATE && arg_size == sizeof(*addr)); memcpy(addr, arg, arg_size); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); 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(struct _starpu_mp_node *mp_node, void *addr) { STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_FREE, &addr, sizeof(addr)); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); } /* Send SIZE bytes pointed by SRC to DST on the sink linked to the MP_NODE with a * synchronous mode. */ int _starpu_src_common_copy_host_to_sink_sync(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size) { struct _starpu_mp_transfer_command cmd = {size, dst, NULL}; STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_RECV_FROM_HOST, &cmd, sizeof(cmd)); mp_node->dt_send(mp_node, src, size, NULL); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); return 0; } /* Send SIZE bytes pointed by SRC to DST on the sink linked to the MP_NODE with an * asynchronous mode. */ int _starpu_src_common_copy_host_to_sink_async(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size, void * event) { struct _starpu_mp_transfer_command cmd = {size, dst, event}; STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); /* For asynchronous transfers, we save informations * to test is they are finished */ struct _starpu_async_channel * async_channel = event; async_channel->polling_node_receiver = mp_node; _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_RECV_FROM_HOST_ASYNC, &cmd, sizeof(cmd)); mp_node->dt_send(mp_node, src, size, event); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); return -EAGAIN; } /* Receive SIZE bytes pointed by SRC on the sink linked to the MP_NODE and store them in DST * with a synchronous mode. */ int _starpu_src_common_copy_sink_to_host_sync(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size) { enum _starpu_mp_command answer; void *arg; int arg_size; struct _starpu_mp_transfer_command cmd = {size, src, NULL}; STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_SEND_TO_HOST, &cmd, sizeof(cmd)); answer = _starpu_src_common_wait_command_sync(mp_node, &arg, &arg_size); STARPU_ASSERT(answer == STARPU_MP_COMMAND_SEND_TO_HOST); mp_node->dt_recv(mp_node, dst, size, NULL); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); return 0; } /* Receive SIZE bytes pointed by SRC on the sink linked to the MP_NODE and store them in DST * with an asynchronous mode. */ int _starpu_src_common_copy_sink_to_host_async(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size, void * event) { struct _starpu_mp_transfer_command cmd = {size, src, event}; STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); /* For asynchronous transfers, we save informations * to test is they are finished */ struct _starpu_async_channel * async_channel = event; async_channel->polling_node_sender = mp_node; _starpu_mp_common_send_command(mp_node, STARPU_MP_COMMAND_SEND_TO_HOST_ASYNC, &cmd, sizeof(cmd)); mp_node->dt_recv(mp_node, dst, size, event); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); return -EAGAIN; } /* 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 with a synchronous * mode. */ int _starpu_src_common_copy_sink_to_sink_sync(struct _starpu_mp_node *src_node, 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, NULL}; /* lock the node with the little peer_id first to prevent deadlock */ if (src_node->peer_id > dst_node->peer_id) { STARPU_PTHREAD_MUTEX_LOCK(&dst_node->connection_mutex); STARPU_PTHREAD_MUTEX_LOCK(&src_node->connection_mutex); } else { STARPU_PTHREAD_MUTEX_LOCK(&src_node->connection_mutex); STARPU_PTHREAD_MUTEX_LOCK(&dst_node->connection_mutex); } /* Tell source to send data to dest. */ _starpu_mp_common_send_command(src_node, STARPU_MP_COMMAND_SEND_TO_SINK, &cmd, sizeof(cmd)); /* Release the source as fast as possible */ STARPU_PTHREAD_MUTEX_UNLOCK(&src_node->connection_mutex); 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_MP_COMMAND_RECV_FROM_SINK, &cmd, sizeof(cmd)); /* Wait for answer from dest to know wether transfer is finished. */ answer = _starpu_src_common_wait_command_sync(dst_node, &arg, &arg_size); STARPU_ASSERT(answer == STARPU_MP_COMMAND_TRANSFER_COMPLETE); /* Release the receiver when we received the acknowlegment */ STARPU_PTHREAD_MUTEX_UNLOCK(&dst_node->connection_mutex); 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 with an asynchronous * mode. */ int _starpu_src_common_copy_sink_to_sink_async(struct _starpu_mp_node *src_node, struct _starpu_mp_node *dst_node, void *src, void *dst, size_t size, void * event) { struct _starpu_mp_transfer_command_to_device cmd = {dst_node->peer_id, size, src, event}; /* lock the node with the little peer_id first to prevent deadlock */ if (src_node->peer_id > dst_node->peer_id) { STARPU_PTHREAD_MUTEX_LOCK(&dst_node->connection_mutex); STARPU_PTHREAD_MUTEX_LOCK(&src_node->connection_mutex); } else { STARPU_PTHREAD_MUTEX_LOCK(&src_node->connection_mutex); STARPU_PTHREAD_MUTEX_LOCK(&dst_node->connection_mutex); } /* For asynchronous transfers, we save informations * to test is they are finished */ struct _starpu_async_channel * async_channel = event; async_channel->polling_node_sender = src_node; async_channel->polling_node_receiver = dst_node; /* Increase number of ack waited */ async_channel->starpu_mp_common_finished_receiver++; async_channel->starpu_mp_common_finished_sender++; /* Tell source to send data to dest. */ _starpu_mp_common_send_command(src_node, STARPU_MP_COMMAND_SEND_TO_SINK_ASYNC, &cmd, sizeof(cmd)); STARPU_PTHREAD_MUTEX_UNLOCK(&src_node->connection_mutex); 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_MP_COMMAND_RECV_FROM_SINK_ASYNC, &cmd, sizeof(cmd)); STARPU_PTHREAD_MUTEX_UNLOCK(&dst_node->connection_mutex); return -EAGAIN; } /* 5 functions to determine the executable to run on the device (MIC, 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; } #if defined(STARPU_USE_MPI_MASTER_SLAVE) && !defined(STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD) void _starpu_src_common_init_switch_env(unsigned this) { save_thread_env[this].current_task = starpu_task_get_current(); save_thread_env[this].current_worker = STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_key); save_thread_env[this].current_worker_set = STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_set_key); #ifdef STARPU_OPENMP save_thread_env[this].current_omp_thread = STARPU_PTHREAD_GETSPECIFIC(_starpu_omp_thread_key); save_thread_env[this].current_omp_task = STARPU_PTHREAD_GETSPECIFIC(_starpu_omp_task_key); #endif } static void _starpu_src_common_switch_env(unsigned old, unsigned new) { save_thread_env[old].current_task = starpu_task_get_current(); save_thread_env[old].current_worker = STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_key); save_thread_env[old].current_worker_set = STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_set_key); #ifdef STARPU_OPENMP save_thread_env[old].current_omp_thread = STARPU_PTHREAD_GETSPECIFIC(_starpu_omp_thread_key); save_thread_env[old].current_omp_task = STARPU_PTHREAD_GETSPECIFIC(_starpu_omp_task_key); #endif _starpu_set_current_task(save_thread_env[new].current_task); STARPU_PTHREAD_SETSPECIFIC(_starpu_worker_key, save_thread_env[new].current_worker); STARPU_PTHREAD_SETSPECIFIC(_starpu_worker_set_key, save_thread_env[new].current_worker_set); #ifdef STARPU_OPENMP STARPU_PTHREAD_SETSPECIFIC(_starpu_omp_thread_key, save_thread_env[new].current_omp_thread); STARPU_PTHREAD_SETSPECIFIC(_starpu_omp_task_key, save_thread_env[new].current_omp_task); #endif } #endif /* 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(); STARPU_PTHREAD_MUTEX_LOCK(&node->connection_mutex); /* tell the sink node that we will send him all workers */ _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_SYNC_WORKERS, &msg, sizeof(msg)); /* Send all worker to the sink node */ node->dt_send(node,&config->workers[baseworkerid],worker_size, NULL); /* Send all combined workers to the sink node */ node->dt_send(node, &config->combined_workers,combined_worker_size, NULL); STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); } static void _starpu_src_common_worker_internal_work(struct _starpu_worker_set * worker_set, struct _starpu_mp_node * mp_node, struct starpu_task **tasks, unsigned memnode) { int res = 0; unsigned i; _starpu_may_pause(); #ifdef STARPU_SIMGRID starpu_pthread_wait_reset(&worker_set->workers[0].wait); #endif /* Test if async transfers are completed */ for (i = 0; i < worker_set->nworkers; i++) { struct starpu_task *task = worker_set->workers[i].task_transferring; /* We send all buffers to execute the task */ if (task != NULL && worker_set->workers[i].nb_buffers_transferred == worker_set->workers[i].nb_buffers_totransfer) { STARPU_RMB(); struct _starpu_job * j = _starpu_get_job_associated_to_task(task); _STARPU_TRACE_END_PROGRESS(memnode); _starpu_set_local_worker_key(&worker_set->workers[i]); _starpu_fetch_task_input_tail(task, j, &worker_set->workers[i]); _starpu_set_worker_status(&worker_set->workers[i], STATUS_UNKNOWN); /* Reset it */ worker_set->workers[i].task_transferring = NULL; /* Execute the task */ res = _starpu_src_common_execute(j, &worker_set->workers[i], 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(worker_set->workers[i].task_transferring); STARPU_ABORT(); continue; break; default: STARPU_ASSERT(0); } _STARPU_TRACE_START_PROGRESS(memnode); } } res |= __starpu_datawizard_progress(1, 1); /* Handle message which have been store */ _starpu_src_common_handle_stored_async(mp_node); STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); 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(mp_node_memory_node(mp_node)); _starpu_src_common_recv_async(mp_node); /* Mutex is unlock in _starpu_src_common_recv_async */ STARPU_PTHREAD_MUTEX_LOCK(&mp_node->connection_mutex); } if (stopped_progress) _STARPU_TRACE_START_PROGRESS(mp_node_memory_node(mp_node)); STARPU_PTHREAD_MUTEX_UNLOCK(&mp_node->connection_mutex); /* get task for each worker*/ res |= _starpu_get_multi_worker_task(worker_set->workers, tasks, worker_set->nworkers, memnode); #ifdef STARPU_SIMGRID if (!res) starpu_pthread_wait_wait(&worker_set->workers[0].wait); #endif /*if at least one worker have pop a task*/ if(res != 0) { for(i=0; inworkers; i++) { if(tasks[i] != NULL) { struct _starpu_worker *worker = &worker_set->workers[i]; _STARPU_TRACE_END_PROGRESS(worker->memory_node); _starpu_set_local_worker_key(worker); int ret = _starpu_fetch_task_input(tasks[i], _starpu_get_job_associated_to_task(tasks[i]), 1); STARPU_ASSERT(!ret); _STARPU_TRACE_START_PROGRESS(worker->memory_node); } } /* Handle message which have been store */ _starpu_src_common_handle_stored_async(mp_node); } } #if defined(STARPU_USE_MPI_MASTER_SLAVE) && !defined(STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD) /* Function looping on the source node */ void _starpu_src_common_workers_set(struct _starpu_worker_set * worker_set, int ndevices, struct _starpu_mp_node ** mp_node) { unsigned memnode[ndevices]; unsigned offsetmemnode[ndevices]; memset(offsetmemnode, 0, ndevices*sizeof(unsigned)); int device; int nbworkers = 0; for (device = 0; device < ndevices; device++) { memnode[device] = worker_set[device].workers[0].memory_node; nbworkers += worker_set[device].nworkers; if (device != 0) offsetmemnode[device] += offsetmemnode[device-1]; if (device != ndevices -1) offsetmemnode[device+1] += worker_set[device].nworkers; } struct starpu_task **tasks; _STARPU_MALLOC(tasks, sizeof(struct starpu_task *)*nbworkers); for (device = 0; device < ndevices; device++) { struct _starpu_worker *baseworker = &worker_set[device].workers[0]; struct _starpu_machine_config *config = baseworker->config; unsigned baseworkerid = baseworker - config->workers; _starpu_src_common_send_workers(mp_node[device], baseworkerid, worker_set[device].nworkers); _STARPU_TRACE_START_PROGRESS(memnode[device]); } /*main loop*/ while (_starpu_machine_is_running()) { for (device = 0; device < ndevices ; device++) { _starpu_src_common_switch_env(((device-1)+ndevices)%ndevices, device); _starpu_src_common_worker_internal_work(&worker_set[device], mp_node[device], tasks+offsetmemnode[device], memnode[device]); } } free(tasks); for (device = 0; device < ndevices; device++) { _STARPU_TRACE_END_PROGRESS(memnode[device]); _starpu_handle_all_pending_node_data_requests(memnode[device]); } /* 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 ! */ for (device = 0; device < ndevices; device++) _starpu_free_all_automatically_allocated_buffers(memnode[device]); } #endif /* 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()) { _starpu_src_common_worker_internal_work(worker_set, mp_node, tasks, memnode); } free(tasks); _STARPU_TRACE_END_PROGRESS(memnode); _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.3.9+dfsg/src/drivers/mp_common/source_common.h000066400000000000000000000067601413463044200232450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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); 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(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(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 detached); int _starpu_src_common_copy_host_to_sink_sync(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size); int _starpu_src_common_copy_sink_to_host_sync(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size); int _starpu_src_common_copy_sink_to_sink_sync(struct _starpu_mp_node *src_node, struct _starpu_mp_node *dst_node, void *src, void *dst, size_t size); int _starpu_src_common_copy_host_to_sink_async(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size, void *event); int _starpu_src_common_copy_sink_to_host_async(struct _starpu_mp_node *mp_node, void *src, void *dst, size_t size, void *event); int _starpu_src_common_copy_sink_to_sink_async(struct _starpu_mp_node *src_node, struct _starpu_mp_node *dst_node, void *src, void *dst, size_t size, void *event); 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); #if defined(STARPU_USE_MPI_MASTER_SLAVE) && !defined(STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD) void _starpu_src_common_init_switch_env(unsigned this); void _starpu_src_common_workers_set(struct _starpu_worker_set * worker_set, int ndevices, struct _starpu_mp_node ** mp_node); #endif #endif /* STARPU_USE_MP */ #endif /* __SOURCE_COMMON_H__ */ starpu-1.3.9+dfsg/src/drivers/mpi/000077500000000000000000000000001413463044200170145ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/mpi/driver_mpi_common.c000066400000000000000000000536431413463044200227030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 NITER 32 #define SIZE_BANDWIDTH (1024*1024) #define DRIVER_MPI_MASTER_NODE_DEFAULT 0 static int mpi_initialized = 0; static int extern_initialized = 0; static int src_node_id; static void _starpu_mpi_set_src_node_id() { int node_id = starpu_get_env_number("STARPU_MPI_MASTER_NODE"); if (node_id != -1) { int nb_proc, id_proc; MPI_Comm_size(MPI_COMM_WORLD, &nb_proc); MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); if (node_id < nb_proc) { src_node_id = node_id; return; } else if (id_proc == DRIVER_MPI_MASTER_NODE_DEFAULT) { /* Only one node prints the error message. */ _STARPU_MSG("The node (%d) you specify to be the master is " "greater than the total number of nodes (%d). " "StarPU will use node %d.\n", node_id, nb_proc, DRIVER_MPI_MASTER_NODE_DEFAULT); } } /* Node by default. */ src_node_id = DRIVER_MPI_MASTER_NODE_DEFAULT; } int _starpu_mpi_common_mp_init() { //Here we supposed the programmer called two times starpu_init. if (mpi_initialized) return -ENODEV; mpi_initialized = 1; if (MPI_Initialized(&extern_initialized) != MPI_SUCCESS) STARPU_ABORT_MSG("Cannot check if MPI is initialized or not !"); //Here MPI_Init or MPI_Init_thread is already called if (!extern_initialized) { #if defined(STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD) int required = MPI_THREAD_MULTIPLE; #else int required = MPI_THREAD_FUNNELED; #endif int thread_support; if (MPI_Init_thread(_starpu_get_argc(), _starpu_get_argv(), required, &thread_support) != MPI_SUCCESS) { STARPU_ABORT_MSG("Cannot Initialize MPI !"); } if (thread_support != required) { if (required == MPI_THREAD_MULTIPLE) _STARPU_DISP("MPI doesn't support MPI_THREAD_MULTIPLE option. MPI Master-Slave can have problems if multiple slaves are launched. \n"); if (required == MPI_THREAD_FUNNELED) _STARPU_DISP("MPI doesn't support MPI_THREAD_FUNNELED option. Many errors can occur. \n"); } } /* Find which node is the master */ _starpu_mpi_set_src_node_id(); return 1; } void _starpu_mpi_common_mp_deinit() { if (!extern_initialized) MPI_Finalize(); } int _starpu_mpi_common_is_src_node() { int id_proc; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); return id_proc == src_node_id; } int _starpu_mpi_common_get_src_node() { return src_node_id; } int _starpu_mpi_common_is_mp_initialized() { return mpi_initialized; } /* common parts to initialize a source or a sink node */ void _starpu_mpi_common_mp_initialize_src_sink(struct _starpu_mp_node *node) { struct _starpu_machine_topology *topology = &_starpu_get_machine_config()->topology; node->nb_cores = topology->nhwcpus; } int _starpu_mpi_common_recv_is_ready(const struct _starpu_mp_node *mp_node) { int res, source; int flag = 0; int id_proc; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); if (id_proc == src_node_id) { /* Source has mp_node defined */ source = mp_node->mp_connection.mpi_remote_nodeid; } else { /* Sink can have sink to sink message */ source = MPI_ANY_SOURCE; } res = MPI_Iprobe(source, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, MPI_STATUS_IGNORE); STARPU_ASSERT_MSG(res == MPI_SUCCESS, "MPI Master/Slave cannot test if we received a message !"); return flag; } /* SEND to source node */ void _starpu_mpi_common_send(const struct _starpu_mp_node *node, void *msg, int len, void * event) { int res; int id_proc; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); //_STARPU_MSG("envoi %d B to %d\n", len, node->mp_connection.mpi_remote_nodeid); if (event) { /* Asynchronous send */ struct _starpu_async_channel * channel = event; channel->event.mpi_ms_event.is_sender = 1; /* call by sink, we need to initialize some parts, for host it's done in data_request.c */ if (channel->node_ops == NULL) channel->event.mpi_ms_event.requests = NULL; /* Initialize the list */ if (channel->event.mpi_ms_event.requests == NULL) channel->event.mpi_ms_event.requests = _starpu_mpi_ms_event_request_list_new(); struct _starpu_mpi_ms_event_request * req = _starpu_mpi_ms_event_request_new(); res = MPI_Isend(msg, len, MPI_BYTE, node->mp_connection.mpi_remote_nodeid, ASYNC_TAG, MPI_COMM_WORLD, &req->request); channel->starpu_mp_common_finished_receiver++; channel->starpu_mp_common_finished_sender++; _starpu_mpi_ms_event_request_list_push_back(channel->event.mpi_ms_event.requests, req); } else { /* Synchronous send */ res = MPI_Send(msg, len, MPI_BYTE, node->mp_connection.mpi_remote_nodeid, SYNC_TAG, MPI_COMM_WORLD); } STARPU_ASSERT_MSG(res == MPI_SUCCESS, "MPI Master/Slave cannot receive a msg with a size of %d Bytes !", len); } void _starpu_mpi_common_mp_send(const struct _starpu_mp_node *node, void *msg, int len) { _starpu_mpi_common_send(node, msg, len, NULL); } /* RECV to source node */ void _starpu_mpi_common_recv(const struct _starpu_mp_node *node, void *msg, int len, void * event) { int res; int id_proc; MPI_Status s; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); //_STARPU_MSG("recv %d B from %d in %p\n", len, node->mp_connection.mpi_remote_nodeid, msg); if (event) { /* Asynchronous recv */ struct _starpu_async_channel * channel = event; channel->event.mpi_ms_event.is_sender = 0; /* call by sink, we need to initialize some parts, for host it's done in data_request.c */ if (channel->node_ops == NULL) channel->event.mpi_ms_event.requests = NULL; /* Initialize the list */ if (channel->event.mpi_ms_event.requests == NULL) channel->event.mpi_ms_event.requests = _starpu_mpi_ms_event_request_list_new(); struct _starpu_mpi_ms_event_request * req = _starpu_mpi_ms_event_request_new(); res = MPI_Irecv(msg, len, MPI_BYTE, node->mp_connection.mpi_remote_nodeid, ASYNC_TAG, MPI_COMM_WORLD, &req->request); channel->starpu_mp_common_finished_receiver++; channel->starpu_mp_common_finished_sender++; _starpu_mpi_ms_event_request_list_push_back(channel->event.mpi_ms_event.requests, req); } else { /* Synchronous recv */ res = MPI_Recv(msg, len, MPI_BYTE, node->mp_connection.mpi_remote_nodeid, SYNC_TAG, MPI_COMM_WORLD, &s); int num_expected; MPI_Get_count(&s, MPI_BYTE, &num_expected); STARPU_ASSERT_MSG(num_expected == len, "MPI Master/Slave received a msg with a size of %d Bytes (expected %d Bytes) !", num_expected, len); } STARPU_ASSERT_MSG(res == MPI_SUCCESS, "MPI Master/Slave cannot receive a msg with a size of %d Bytes !", len); } void _starpu_mpi_common_mp_recv(const struct _starpu_mp_node *node, void *msg, int len) { _starpu_mpi_common_recv(node, msg, len, NULL); } /* SEND to any node */ void _starpu_mpi_common_send_to_device(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, int dst_devid, void *msg, int len, void * event) { int res; int id_proc; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); //_STARPU_MSG("S_to_D send %d bytes from %d from %p\n", len, dst_devid, msg); if (event) { /* Asynchronous send */ struct _starpu_async_channel * channel = event; channel->event.mpi_ms_event.is_sender = 1; /* call by sink, we need to initialize some parts, for host it's done in data_request.c */ if (channel->node_ops == NULL) channel->event.mpi_ms_event.requests = NULL; /* Initialize the list */ if (channel->event.mpi_ms_event.requests == NULL) channel->event.mpi_ms_event.requests = _starpu_mpi_ms_event_request_list_new(); struct _starpu_mpi_ms_event_request * req = _starpu_mpi_ms_event_request_new(); res = MPI_Isend(msg, len, MPI_BYTE, dst_devid, ASYNC_TAG, MPI_COMM_WORLD, &req->request); channel->starpu_mp_common_finished_receiver++; channel->starpu_mp_common_finished_sender++; _starpu_mpi_ms_event_request_list_push_back(channel->event.mpi_ms_event.requests, req); } else { /* Synchronous send */ res = MPI_Send(msg, len, MPI_BYTE, dst_devid, SYNC_TAG, MPI_COMM_WORLD); } STARPU_ASSERT_MSG(res == MPI_SUCCESS, "MPI Master/Slave cannot receive a msg with a size of %d Bytes !", len); } /* RECV to any node */ void _starpu_mpi_common_recv_from_device(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, int src_devid, void *msg, int len, void * event) { int res; int id_proc; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); //_STARPU_MSG("R_to_D nop recv %d bytes from %d\n", len, src_devid); if (event) { /* Asynchronous recv */ struct _starpu_async_channel * channel = event; channel->event.mpi_ms_event.is_sender = 0; /* call by sink, we need to initialize some parts, for host it's done in data_request.c */ if (channel->node_ops == NULL) channel->event.mpi_ms_event.requests = NULL; /* Initialize the list */ if (channel->event.mpi_ms_event.requests == NULL) channel->event.mpi_ms_event.requests = _starpu_mpi_ms_event_request_list_new(); struct _starpu_mpi_ms_event_request * req = _starpu_mpi_ms_event_request_new(); res = MPI_Irecv(msg, len, MPI_BYTE, src_devid, ASYNC_TAG, MPI_COMM_WORLD, &req->request); channel->starpu_mp_common_finished_receiver++; channel->starpu_mp_common_finished_sender++; _starpu_mpi_ms_event_request_list_push_back(channel->event.mpi_ms_event.requests, req); } else { /* Synchronous recv */ MPI_Status s; res = MPI_Recv(msg, len, MPI_BYTE, src_devid, SYNC_TAG, MPI_COMM_WORLD, &s); int num_expected; MPI_Get_count(&s, MPI_BYTE, &num_expected); STARPU_ASSERT_MSG(num_expected == len, "MPI Master/Slave received a msg with a size of %d Bytes (expected %d Bytes) !", num_expected, len); STARPU_ASSERT_MSG(res == MPI_SUCCESS, "MPI Master/Slave cannot receive a msg with a size of %d Bytes !", len); } } static void _starpu_mpi_common_polling_node(struct _starpu_mp_node * node) { /* poll the asynchronous messages.*/ if (node != NULL) { STARPU_PTHREAD_MUTEX_LOCK(&node->connection_mutex); while(node->mp_recv_is_ready(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_store_message(node,arg,arg_size,answer)) { _STARPU_ERROR("incorrect command: unknown command or sync command"); } } STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex); } } /* - In device to device communications, the first ack received by host * is considered as the sender (but it cannot be, in fact, the sender) */ unsigned _starpu_mpi_common_test_event(struct _starpu_async_channel * event) { if (event->event.mpi_ms_event.requests != NULL && !_starpu_mpi_ms_event_request_list_empty(event->event.mpi_ms_event.requests)) { struct _starpu_mpi_ms_event_request * req = _starpu_mpi_ms_event_request_list_begin(event->event.mpi_ms_event.requests); struct _starpu_mpi_ms_event_request * req_next; while (req != _starpu_mpi_ms_event_request_list_end(event->event.mpi_ms_event.requests)) { req_next = _starpu_mpi_ms_event_request_list_next(req); int flag = 0; MPI_Test(&req->request, &flag, MPI_STATUS_IGNORE); if (flag) { _starpu_mpi_ms_event_request_list_erase(event->event.mpi_ms_event.requests, req); _starpu_mpi_ms_event_request_delete(req); if (event->event.mpi_ms_event.is_sender) event->starpu_mp_common_finished_sender--; else event->starpu_mp_common_finished_receiver--; } req = req_next; } /* When the list is empty, we finished to wait each request */ if (_starpu_mpi_ms_event_request_list_empty(event->event.mpi_ms_event.requests)) { /* Destroy the list */ _starpu_mpi_ms_event_request_list_delete(event->event.mpi_ms_event.requests); event->event.mpi_ms_event.requests = NULL; } } _starpu_mpi_common_polling_node(event->polling_node_sender); _starpu_mpi_common_polling_node(event->polling_node_receiver); return !event->starpu_mp_common_finished_sender && !event->starpu_mp_common_finished_receiver; } /* - In device to device communications, the first ack received by host * is considered as the sender (but it cannot be, in fact, the sender) */ void _starpu_mpi_common_wait_request_completion(struct _starpu_async_channel * event) { if (event->event.mpi_ms_event.requests != NULL && !_starpu_mpi_ms_event_request_list_empty(event->event.mpi_ms_event.requests)) { struct _starpu_mpi_ms_event_request * req = _starpu_mpi_ms_event_request_list_begin(event->event.mpi_ms_event.requests); struct _starpu_mpi_ms_event_request * req_next; while (req != _starpu_mpi_ms_event_request_list_end(event->event.mpi_ms_event.requests)) { req_next = _starpu_mpi_ms_event_request_list_next(req); MPI_Wait(&req->request, MPI_STATUS_IGNORE); _starpu_mpi_ms_event_request_list_erase(event->event.mpi_ms_event.requests, req); _starpu_mpi_ms_event_request_delete(req); req = req_next; if (event->event.mpi_ms_event.is_sender) event->starpu_mp_common_finished_sender--; else event->starpu_mp_common_finished_receiver--; } STARPU_ASSERT_MSG(_starpu_mpi_ms_event_request_list_empty(event->event.mpi_ms_event.requests), "MPI Request list is not empty after a wait_event !"); /* Destroy the list */ _starpu_mpi_ms_event_request_list_delete(event->event.mpi_ms_event.requests); event->event.mpi_ms_event.requests = NULL; } //incoming ack from devices while(event->starpu_mp_common_finished_sender > 0 || event->starpu_mp_common_finished_receiver > 0) { _starpu_mpi_common_polling_node(event->polling_node_sender); _starpu_mpi_common_polling_node(event->polling_node_receiver); } } void _starpu_mpi_common_barrier(void) { int ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Barrier failed"); } /* Compute bandwidth and latency between source and sink nodes * Source node has to have the entire set of times at the end */ void _starpu_mpi_common_measure_bandwidth_latency(double timing_dtod[STARPU_MAXMPIDEVS][STARPU_MAXMPIDEVS], double latency_dtod[STARPU_MAXMPIDEVS][STARPU_MAXMPIDEVS]) { int ret; unsigned iter; int nb_proc, id_proc; MPI_Comm_rank(MPI_COMM_WORLD, &id_proc); MPI_Comm_size(MPI_COMM_WORLD, &nb_proc); char * buf; _STARPU_MALLOC(buf, SIZE_BANDWIDTH); memset(buf, 0, SIZE_BANDWIDTH); int sender, receiver; for(sender = 0; sender < nb_proc; sender++) { for(receiver = 0; receiver < nb_proc; receiver++) { //Node can't be a sender and a receiver if(sender == receiver) continue; ret = MPI_Barrier(MPI_COMM_WORLD); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Barrier failed"); if(id_proc == sender) { double start, end; /* measure bandwidth sender to receiver */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { ret = MPI_Send(buf, SIZE_BANDWIDTH, MPI_BYTE, receiver, 42, MPI_COMM_WORLD); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "Bandwidth of MPI Master/Slave cannot be measured !"); } end = starpu_timing_now(); timing_dtod[sender][receiver] = (end - start)/NITER/SIZE_BANDWIDTH; /* measure latency sender to receiver */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { ret = MPI_Send(buf, 1, MPI_BYTE, receiver, 42, MPI_COMM_WORLD); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "Latency of MPI Master/Slave cannot be measured !"); } end = starpu_timing_now(); latency_dtod[sender][receiver] = (end - start)/NITER; } if (id_proc == receiver) { /* measure bandwidth sender to receiver*/ for (iter = 0; iter < NITER; iter++) { ret = MPI_Recv(buf, SIZE_BANDWIDTH, MPI_BYTE, sender, 42, MPI_COMM_WORLD, MPI_STATUS_IGNORE); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "Bandwidth of MPI Master/Slave cannot be measured !"); } /* measure latency sender to receiver */ for (iter = 0; iter < NITER; iter++) { ret = MPI_Recv(buf, 1, MPI_BYTE, sender, 42, MPI_COMM_WORLD, MPI_STATUS_IGNORE); STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "Bandwidth of MPI Master/Slave cannot be measured !"); } } } /* When a sender finished its work, it has to send its results to the master */ /* Sender doesn't need to send to itself its data */ if (sender == src_node_id) continue; /* if we are the sender, we send the data */ if (sender == id_proc) { MPI_Send(timing_dtod[sender], STARPU_MAXMPIDEVS, MPI_DOUBLE, src_node_id, 42, MPI_COMM_WORLD); MPI_Send(latency_dtod[sender], STARPU_MAXMPIDEVS, MPI_DOUBLE, src_node_id, 42, MPI_COMM_WORLD); } /* the master node receives the data */ if (src_node_id == id_proc) { MPI_Recv(timing_dtod[sender], STARPU_MAXMPIDEVS, MPI_DOUBLE, sender, 42, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(latency_dtod[sender], STARPU_MAXMPIDEVS, MPI_DOUBLE, sender, 42, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } } free(buf); } starpu-1.3.9+dfsg/src/drivers/mpi/driver_mpi_common.h000066400000000000000000000045041413463044200227000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_MPI_COMMON_H__ #define __DRIVER_MPI_COMMON_H__ /** @file */ #include #include #ifdef STARPU_USE_MPI_MASTER_SLAVE #define SYNC_TAG 44 #define ASYNC_TAG 45 int _starpu_mpi_common_mp_init(); void _starpu_mpi_common_mp_deinit(); int _starpu_mpi_common_is_src_node(); int _starpu_mpi_common_get_src_node(); int _starpu_mpi_common_is_mp_initialized(); int _starpu_mpi_common_recv_is_ready(const struct _starpu_mp_node *mp_node); void _starpu_mpi_common_mp_initialize_src_sink(struct _starpu_mp_node *node); void _starpu_mpi_common_send(const struct _starpu_mp_node *node, void *msg, int len, void * event); void _starpu_mpi_common_recv(const struct _starpu_mp_node *node, void *msg, int len, void * event); void _starpu_mpi_common_mp_send(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_mpi_common_mp_recv(const struct _starpu_mp_node *node, void *msg, int len); void _starpu_mpi_common_recv_from_device(const struct _starpu_mp_node *node, int src_devid, void *msg, int len, void * event); void _starpu_mpi_common_send_to_device(const struct _starpu_mp_node *node, int dst_devid, void *msg, int len, void * event); unsigned _starpu_mpi_common_test_event(struct _starpu_async_channel * event); void _starpu_mpi_common_wait_request_completion(struct _starpu_async_channel * event); void _starpu_mpi_common_barrier(void); void _starpu_mpi_common_measure_bandwidth_latency(double bandwidth_dtod[STARPU_MAXMPIDEVS][STARPU_MAXMPIDEVS], double latency_dtod[STARPU_MAXMPIDEVS][STARPU_MAXMPIDEVS]); #endif /* STARPU_USE_MPI_MASTER_SLAVE */ #endif /* __DRIVER_MPI_COMMON_H__ */ starpu-1.3.9+dfsg/src/drivers/mpi/driver_mpi_sink.c000066400000000000000000000051611413463044200223470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "driver_mpi_sink.h" #include "driver_mpi_source.h" #include "driver_mpi_common.h" void _starpu_mpi_sink_init(struct _starpu_mp_node *node) { _starpu_mpi_common_mp_initialize_src_sink(node); _STARPU_MALLOC(node->thread_table, sizeof(starpu_pthread_t)*node->nb_cores); //TODO } void _starpu_mpi_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); } void (*_starpu_mpi_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); } void _starpu_mpi_sink_launch_workers(struct _starpu_mp_node *node) { //TODO int i; struct arg_sink_thread * arg; cpu_set_t cpuset; starpu_pthread_attr_t attr; starpu_pthread_t thread; for(i=0; i < node->nb_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; STARPU_PTHREAD_CREATE(&thread, &attr, _starpu_sink_thread, arg); ((starpu_pthread_t *)node->thread_table)[i] = thread; } } void _starpu_mpi_sink_bind_thread(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, int coreid, int * core_table, int nb_core) { //TODO } starpu-1.3.9+dfsg/src/drivers/mpi/driver_mpi_sink.h000066400000000000000000000025271413463044200223570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_MPI_SINK_H__ #define __DRIVER_MPI_SINK_H__ /** @file */ #include #ifdef STARPU_USE_MPI_MASTER_SLAVE void _starpu_mpi_sink_init(struct _starpu_mp_node *node); void _starpu_mpi_sink_deinit(struct _starpu_mp_node *node); void _starpu_mpi_sink_launch_workers(struct _starpu_mp_node *node); void _starpu_mpi_sink_bind_thread(const struct _starpu_mp_node *mp_node STARPU_ATTRIBUTE_UNUSED, int coreid, int * core_table, int nb_core); void (*_starpu_mpi_sink_lookup (const struct _starpu_mp_node * node STARPU_ATTRIBUTE_UNUSED, char* func_name))(void); #endif /* STARPU_USE_MPI_MASTER_SLAVE */ #endif /* __DRIVER_MPI_SINK_H__ */ starpu-1.3.9+dfsg/src/drivers/mpi/driver_mpi_source.c000066400000000000000000000525241413463044200227100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* Mutex for concurrent access to the table. */ starpu_pthread_mutex_t htbl_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; /* Structure used by host to store informations about a kernel executable on * a MPI MS 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_mpi_ms_kernel { UT_hash_handle hh; char *name; starpu_mpi_ms_kernel_t func[STARPU_MAXMPIDEVS]; } *kernels; /* Array of structures containing all the informations useful to send * and receive informations with devices */ struct _starpu_mp_node *_starpu_mpi_ms_nodes[STARPU_MAXMPIDEVS]; struct _starpu_mp_node *_starpu_mpi_ms_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_MAXMPIDEVS); return _starpu_mpi_ms_nodes[devid]; } void _starpu_mpi_source_init(struct _starpu_mp_node *node) { _starpu_mpi_common_mp_initialize_src_sink(node); //TODO } void _starpu_mpi_source_deinit(struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED) { } struct _starpu_mp_node *_starpu_mpi_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_MAXMPIDEVS, "bogus devid %d for memory node %d\n", devid, memory_node); return _starpu_mpi_ms_nodes[devid]; } int _starpu_mpi_src_allocate_memory(void ** addr, size_t size, unsigned memory_node) { const struct _starpu_mp_node *mp_node = _starpu_mpi_src_get_mp_node_from_memory_node(memory_node); return _starpu_src_common_allocate(mp_node, addr, size); } void _starpu_mpi_source_free_memory(void *addr, unsigned memory_node) { struct _starpu_mp_node *mp_node = _starpu_mpi_src_get_mp_node_from_memory_node(memory_node); _starpu_src_common_free(mp_node, 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_mpi_copy_ram_to_mpi_sync(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size) { struct _starpu_mp_node *mp_node = _starpu_mpi_src_get_mp_node_from_memory_node(dst_node); return _starpu_src_common_copy_host_to_sink_sync(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_mpi_copy_mpi_to_ram_sync(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size) { struct _starpu_mp_node *mp_node = _starpu_mpi_src_get_mp_node_from_memory_node(src_node); return _starpu_src_common_copy_sink_to_host_sync(mp_node, src, dst, size); } int _starpu_mpi_copy_sink_to_sink_sync(void *src, unsigned src_node, void *dst, unsigned dst_node, size_t size) { return _starpu_src_common_copy_sink_to_sink_sync(_starpu_mpi_src_get_mp_node_from_memory_node(src_node), _starpu_mpi_src_get_mp_node_from_memory_node(dst_node), src, dst, size); } int _starpu_mpi_copy_mpi_to_ram_async(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size, void * event) { struct _starpu_mp_node *mp_node = _starpu_mpi_src_get_mp_node_from_memory_node(src_node); return _starpu_src_common_copy_sink_to_host_async(mp_node, src, dst, size, event); } int _starpu_mpi_copy_ram_to_mpi_async(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size, void * event) { struct _starpu_mp_node *mp_node = _starpu_mpi_src_get_mp_node_from_memory_node(dst_node); return _starpu_src_common_copy_host_to_sink_async(mp_node, src, dst, size, event); } int _starpu_mpi_copy_sink_to_sink_async(void *src, unsigned src_node, void *dst, unsigned dst_node, size_t size, void * event) { return _starpu_src_common_copy_sink_to_sink_async(_starpu_mpi_src_get_mp_node_from_memory_node(src_node), _starpu_mpi_src_get_mp_node_from_memory_node(dst_node), src, dst, size, event); } int starpu_mpi_ms_register_kernel(starpu_mpi_ms_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_mpi_ms_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_mpi_devices = _starpu_mpi_src_get_device_count(); unsigned int i; for (i = 0; i < nb_mpi_devices; ++i) kernel->func[i] = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&htbl_mutex); *symbol = kernel; return 0; } starpu_mpi_ms_kernel_t starpu_mpi_ms_get_kernel(starpu_mpi_ms_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_mpi_ms_kernel *kernel = symbol; if (kernel->func[devid] == NULL) { struct _starpu_mp_node *node = _starpu_mpi_ms_nodes[devid]; int ret = _starpu_src_common_lookup(node, (void (**)(void))&kernel->func[devid], kernel->name); if (ret) return NULL; } return kernel->func[devid]; } starpu_mpi_ms_kernel_t _starpu_mpi_ms_src_get_kernel_from_codelet(struct starpu_codelet *cl, unsigned nimpl) { starpu_mpi_ms_kernel_t kernel = NULL; starpu_mpi_ms_func_t func = _starpu_task_get_mpi_ms_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. */ const char *func_name = _starpu_task_get_cpu_name_nth_implementation(cl, nimpl); if (func_name) { starpu_mpi_ms_func_symbol_t symbol; starpu_mpi_ms_register_kernel(&symbol, func_name); kernel = starpu_mpi_ms_get_kernel(symbol); } } STARPU_ASSERT_MSG(kernel, "when STARPU_MPI_MS is defined in 'where', mpi_ms_funcs or cpu_funcs_name has to be defined and the function be non-static"); return kernel; } void(* _starpu_mpi_ms_src_get_kernel_from_job(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, struct _starpu_job *j))(void) { starpu_mpi_ms_kernel_t kernel = NULL; starpu_mpi_ms_func_t func = _starpu_task_get_mpi_ms_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_mpi_ms_get_func(). */ kernel = func(); } else { /* If user dont define any starpu_mpi_ms_fun_t in cl->mpi_ms_func we try to use * cpu_func_name. */ const char *func_name = _starpu_task_get_cpu_name_nth_implementation(j->task->cl, j->nimpl); if (func_name) { starpu_mpi_ms_func_symbol_t symbol; starpu_mpi_ms_register_kernel(&symbol, func_name); kernel = starpu_mpi_ms_get_kernel(symbol); } } STARPU_ASSERT(kernel); return (void (*)(void))kernel; } unsigned _starpu_mpi_src_get_device_count() { int nb_mpi_devices; if (!_starpu_mpi_common_is_mp_initialized()) return 0; MPI_Comm_size(MPI_COMM_WORLD, &nb_mpi_devices); //Remove one for master nb_mpi_devices = nb_mpi_devices - 1; return nb_mpi_devices; } void *_starpu_mpi_src_worker(void *arg) { #ifndef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD struct _starpu_worker_set *worker_set_mpi = (struct _starpu_worker_set *) arg; int nbsinknodes = _starpu_mpi_src_get_device_count(); int workersetnum; for (workersetnum = 0; workersetnum < nbsinknodes; workersetnum++) { struct _starpu_worker_set * worker_set = &worker_set_mpi[workersetnum]; #else struct _starpu_worker_set *worker_set = arg; #endif /* 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_MPI_KEY, 0); #ifdef STARPU_USE_FXT for (i = 1; i < worker_set->nworkers; i++) _starpu_worker_start(&worker_set->workers[i], _STARPU_FUT_MPI_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.nmpicores[devid]; i++) { struct _starpu_worker *worker = &config->workers[baseworkerid+i]; snprintf(worker->name, sizeof(worker->name), "MPI_MS %u core %u", devid, i); snprintf(worker->short_name, sizeof(worker->short_name), "MPI_MS %u.%u", devid, i); } #ifndef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD { char thread_name[16]; snprintf(thread_name, sizeof(thread_name), "MPI_MS"); starpu_pthread_setname(thread_name); } #else { char thread_name[16]; snprintf(thread_name, sizeof(thread_name), "MPI_MS %u", devid); starpu_pthread_setname(thread_name); } #endif for (i = 0; i < worker_set->nworkers; i++) { struct _starpu_worker *worker = &worker_set->workers[i]; _STARPU_TRACE_WORKER_INIT_END(worker->workerid); } #ifndef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD _starpu_src_common_init_switch_env(workersetnum); } /* for */ /* set the worker zero for the main thread */ for (workersetnum = 0; workersetnum < nbsinknodes; workersetnum++) { struct _starpu_worker_set * worker_set = &worker_set_mpi[workersetnum]; struct _starpu_worker *baseworker = &worker_set->workers[0]; #endif /* 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); #ifndef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD } #endif #ifndef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD _starpu_src_common_workers_set(worker_set_mpi, nbsinknodes, _starpu_mpi_ms_nodes); #else _starpu_src_common_worker(worker_set, baseworkerid, _starpu_mpi_ms_nodes[devid]); #endif return NULL; } int _starpu_mpi_copy_interface_from_mpi_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_MPI_MS_RAM && dst_kind == STARPU_CPU_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_mpi_ms_copy_disabled() || !(copy_methods->mpi_ms_to_ram_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->mpi_ms_to_ram || copy_methods->any_to_any); if (copy_methods->mpi_ms_to_ram) copy_methods->mpi_ms_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.node_ops = &_starpu_driver_mpi_node_ops; if(copy_methods->mpi_ms_to_ram_async) ret = copy_methods->mpi_ms_to_ram_async(src_interface, src_node, dst_interface, dst_node, &req->async_channel); 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); } } return ret; } int _starpu_mpi_copy_interface_from_mpi_to_mpi(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_MPI_MS_RAM && dst_kind == STARPU_MPI_MS_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_mpi_ms_copy_disabled() || !(copy_methods->mpi_ms_to_mpi_ms_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->mpi_ms_to_mpi_ms || copy_methods->any_to_any); if (copy_methods->mpi_ms_to_mpi_ms) copy_methods->mpi_ms_to_mpi_ms(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.node_ops = &_starpu_driver_mpi_node_ops; if(copy_methods->mpi_ms_to_mpi_ms_async) ret = copy_methods->mpi_ms_to_mpi_ms_async(src_interface, src_node, dst_interface, dst_node, &req->async_channel); 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); } } return ret; } int _starpu_mpi_copy_interface_from_cpu_to_mpi(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_MPI_MS_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_mpi_ms_copy_disabled() || !(copy_methods->ram_to_mpi_ms_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->ram_to_mpi_ms || copy_methods->any_to_any); if (copy_methods->ram_to_mpi_ms) copy_methods->ram_to_mpi_ms(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.node_ops = &_starpu_driver_mpi_node_ops; if(copy_methods->ram_to_mpi_ms_async) ret = copy_methods->ram_to_mpi_ms_async(src_interface, src_node, dst_interface, dst_node, &req->async_channel); 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); } } return ret; } int _starpu_mpi_copy_data_from_mpi_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_MPI_MS_RAM && dst_kind == STARPU_CPU_RAM); if (async_channel) return _starpu_mpi_copy_mpi_to_ram_async((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel); else return _starpu_mpi_copy_mpi_to_ram_sync((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); } int _starpu_mpi_copy_data_from_mpi_to_mpi(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_MPI_MS_RAM && dst_kind == STARPU_MPI_MS_RAM); if (async_channel) return _starpu_mpi_copy_sink_to_sink_async((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel); else return _starpu_mpi_copy_sink_to_sink_sync((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); } int _starpu_mpi_copy_data_from_cpu_to_mpi(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_MPI_MS_RAM); if (async_channel) return _starpu_mpi_copy_ram_to_mpi_async((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel); else return _starpu_mpi_copy_ram_to_mpi_sync((void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size); } int _starpu_mpi_is_direct_access_supported(unsigned node, unsigned handling_node) { (void) node; enum starpu_node_kind kind = starpu_node_get_kind(handling_node); return (kind == STARPU_MPI_MS_RAM); } uintptr_t _starpu_mpi_malloc_on_node(unsigned dst_node, size_t size, int flags) { (void) flags; uintptr_t addr = 0; if (_starpu_mpi_src_allocate_memory((void **)(&addr), size, dst_node)) addr = 0; return addr; } void _starpu_mpi_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags) { (void) flags; (void) size; _starpu_mpi_source_free_memory((void*) addr, dst_node); } struct _starpu_node_ops _starpu_driver_mpi_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = _starpu_mpi_copy_interface_from_mpi_to_cpu, .copy_interface_to[STARPU_CUDA_RAM] = NULL, .copy_interface_to[STARPU_OPENCL_RAM] = NULL, .copy_interface_to[STARPU_DISK_RAM] = NULL, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = _starpu_mpi_copy_interface_from_mpi_to_mpi, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = _starpu_mpi_copy_data_from_mpi_to_cpu, .copy_data_to[STARPU_CUDA_RAM] = NULL, .copy_data_to[STARPU_OPENCL_RAM] = NULL, .copy_data_to[STARPU_DISK_RAM] = NULL, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = _starpu_mpi_copy_data_from_mpi_to_mpi, /* TODO: copy2D/3D? */ .wait_request_completion = _starpu_mpi_common_wait_request_completion, .test_request_completion = _starpu_mpi_common_test_event, .is_direct_access_supported = _starpu_mpi_is_direct_access_supported, .malloc_on_node = _starpu_mpi_malloc_on_node, .free_on_node = _starpu_mpi_free_on_node, .name = "mpi driver" }; starpu-1.3.9+dfsg/src/drivers/mpi/driver_mpi_source.h000066400000000000000000000102601413463044200227040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_MPI_SOURCE_H__ #define __DRIVER_MPI_SOURCE_H__ /** @file */ #include #include #include #ifdef STARPU_USE_MPI_MASTER_SLAVE extern struct _starpu_node_ops _starpu_driver_mpi_node_ops; /** Array of structures containing all the informations useful to send * and receive informations with devices */ extern struct _starpu_mp_node *_starpu_mpi_ms_nodes[STARPU_MAXMPIDEVS]; struct _starpu_mp_node *_starpu_mpi_src_get_mp_node_from_memory_node(int memory_node); struct _starpu_mp_node *_starpu_mpi_ms_src_get_actual_thread_mp_node(); unsigned _starpu_mpi_src_get_device_count(); void *_starpu_mpi_src_worker(void *arg); void _starpu_mpi_source_init(struct _starpu_mp_node *node); void _starpu_mpi_source_deinit(struct _starpu_mp_node *node); int _starpu_mpi_src_allocate_memory(void ** addr, size_t size, unsigned memory_node); void _starpu_mpi_source_free_memory(void *addr, unsigned memory_node); int _starpu_mpi_copy_mpi_to_ram_sync(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size); int _starpu_mpi_copy_ram_to_mpi_sync(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size); int _starpu_mpi_copy_sink_to_sink_sync(void *src, unsigned src_node, void *dst, unsigned dst_node, size_t size); int _starpu_mpi_copy_mpi_to_ram_async(void *src, unsigned src_node, void *dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size, void * event); int _starpu_mpi_copy_ram_to_mpi_async(void *src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst, unsigned dst_node, size_t size, void * event); int _starpu_mpi_copy_sink_to_sink_async(void *src, unsigned src_node, void *dst, unsigned dst_node, size_t size, void * event); int _starpu_mpi_copy_interface_from_mpi_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_mpi_copy_interface_from_mpi_to_mpi(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_mpi_copy_interface_from_cpu_to_mpi(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_mpi_copy_data_from_mpi_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_mpi_copy_data_from_mpi_to_mpi(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_mpi_copy_data_from_cpu_to_mpi(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_mpi_is_direct_access_supported(unsigned node, unsigned handling_node); uintptr_t _starpu_mpi_malloc_on_node(unsigned dst_node, size_t size, int flags); void _starpu_mpi_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags); starpu_mpi_ms_kernel_t _starpu_mpi_ms_src_get_kernel_from_codelet(struct starpu_codelet *cl, unsigned nimpl); void(* _starpu_mpi_ms_src_get_kernel_from_job(const struct _starpu_mp_node *node STARPU_ATTRIBUTE_UNUSED, struct _starpu_job *j))(void); #endif /* STARPU_USE_MPI_MASTER_SLAVE */ #endif /* __DRIVER_MPI_SOURCE_H__ */ starpu-1.3.9+dfsg/src/drivers/opencl/000077500000000000000000000000001413463044200175075ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/drivers/opencl/driver_opencl.c000066400000000000000000001333371413463044200225200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #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 opencl_alloc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; #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]; snprintf(name, sizeof(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; #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; #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(); double start = 0.; if (event) starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cl_event ev; err = clEnqueueWriteBuffer(in_transfer_queues[worker->devid], buffer, CL_FALSE, offset, size, ptr, 0, NULL, &ev); if (event) starpu_interface_end_driver_copy_async(src_node, dst_node, start); 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 { clFlush(in_transfer_queues[worker->devid]); *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(); double start = 0.; if (event) starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cl_event ev; err = clEnqueueReadBuffer(out_transfer_queues[worker->devid], buffer, CL_FALSE, offset, size, ptr, 0, NULL, &ev); if (event) starpu_interface_end_driver_copy_async(src_node, dst_node, start); 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 { clFlush(out_transfer_queues[worker->devid]); *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(); double start = 0.; if (event) starpu_interface_start_driver_copy_async(src_node, dst_node, &start); cl_event ev; err = clEnqueueCopyBuffer(peer_transfer_queues[worker->devid], src, dst, src_offset, dst_offset, size, 0, NULL, &ev); if (event) starpu_interface_end_driver_copy_async(src_node, dst_node, start); 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 { clFlush(peer_transfer_queues[worker->devid]); *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; if (src_kind == STARPU_OPENCL_RAM && dst_kind == 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; } if (src_kind == STARPU_CPU_RAM && dst_kind == 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; } if (src_kind == STARPU_OPENCL_RAM && (dst_kind == STARPU_CPU_RAM || dst_kind == 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; } STARPU_ABORT(); } #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; double start = 0.; blocking = (event == NULL) ? CL_TRUE : CL_FALSE; if (event) starpu_interface_start_driver_copy_async(src_node, dst_node, &start); 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); clFlush(out_transfer_queues[worker->devid]); if (event) starpu_interface_end_driver_copy_async(src_node, dst_node, start); _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; double start = 0.; blocking = (event == NULL) ? CL_TRUE : CL_FALSE; if (event) starpu_interface_start_driver_copy_async(src_node, dst_node, &start); 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); clFlush(in_transfer_queues[worker->devid]); if (event) starpu_interface_end_driver_copy_async(src_node, dst_node, start); _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->bindid, worker->workerid, NULL); _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[64]; _starpu_opencl_get_device_name(devid, devname, 64); #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 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; int res; int idle_tasks, idle_transfers; #ifdef STARPU_SIMGRID starpu_pthread_wait_reset(&worker->wait); #endif idle_tasks = 0; idle_transfers = 0; /* First test for transfers pending for next task */ task = worker->task_transferring; if (!task) idle_transfers++; if (task && worker->nb_buffers_transferred == worker->nb_buffers_totransfer) { STARPU_RMB(); _STARPU_TRACE_END_PROGRESS(memnode); j = _starpu_get_job_associated_to_task(task); _starpu_fetch_task_input_tail(task, j, worker); _starpu_set_worker_status(worker, STATUS_UNKNOWN); /* Reset it */ worker->task_transferring = NULL; 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); } /* Then poll for completed jobs */ if (worker->ntasks && worker->current_tasks[worker->first_task] != worker->task_transferring) { #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_OPENCL_CHECK_AND_REPORT_ERROR(err); STARPU_ASSERT(size == sizeof(cl_int)); if (status != CL_COMPLETE) #endif /* !STARPU_SIMGRID */ { } 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 && worker->current_tasks[worker->first_task] != worker->task_transferring) { 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); } } if (!worker->pipeline_length || worker->ntasks < worker->pipeline_length) idle_tasks++; #if defined(STARPU_NON_BLOCKING_DRIVERS) && !defined(STARPU_SIMGRID) if (!idle_tasks) { /* No task ready yet, no better thing to do than waiting */ __starpu_datawizard_progress(1, !idle_transfers); return 0; } #endif res = !idle_tasks || !idle_transfers; res |= __starpu_datawizard_progress(1, 1); task = _starpu_get_worker_task(worker, workerid, memnode); #ifdef STARPU_SIMGRID if (!res && !task) starpu_pthread_wait_wait(&worker->wait); #endif if (task == NULL) return 0; j = _starpu_get_job_associated_to_task(task); worker->current_tasks[(worker->first_task + worker->ntasks)%STARPU_MAX_PIPELINE] = task; worker->ntasks++; if (worker->pipeline_length == 0) /* _starpu_get_worker_task checks .current_task field if pipeline_length == 0 * * TODO: update driver to not use current_tasks[] when pipeline_length == 0, * as for cuda driver */ worker->current_task = task; /* can OpenCL do that task ? */ if (!_STARPU_OPENCL_MAY_PERFORM(j)) { /* this is not a OpenCL task */ _starpu_worker_refuse_task(worker, task); return 0; } _STARPU_TRACE_END_PROGRESS(memnode); /* Fetch data asynchronously */ res = _starpu_fetch_task_input(task, j, 1); STARPU_ASSERT(res == 0); _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) { 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); 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"); #if defined(HAVE_SG_HOST_SPEED) || defined(sg_host_speed) # if defined(HAVE_SG_HOST_SELF) || defined(sg_host_self) length = ((double) profiling_info->used_cycles)/sg_host_speed(sg_host_self()); # else length = ((double) profiling_info->used_cycles)/sg_host_speed(MSG_host_self()); # endif #elif defined HAVE_MSG_HOST_GET_SPEED || defined(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 } else if (cl->flags & STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT && !async) { _SIMGRID_TIMER_BEGIN(1); func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); _SIMGRID_TIMER_END; simulate=0; } if (simulate) _starpu_simgrid_submit_job(worker->workerid, j, &worker->perf_arch, length, async ? &task_finished[worker->devid][pipeline_idx] : NULL); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); cl_command_queue queue; starpu_opencl_get_queue(worker->devid, &queue); #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); clFlush(queue); #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; } struct _starpu_driver_ops _starpu_driver_opencl_ops = { .init = _starpu_opencl_driver_init, .run = _starpu_run_opencl, .run_once = _starpu_opencl_driver_run_once, .deinit = _starpu_opencl_driver_deinit }; #endif #if defined(STARPU_USE_OPENCL) unsigned _starpu_opencl_test_request_completion(struct _starpu_async_channel *async_channel) { 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); } return (event_status == CL_COMPLETE); } void _starpu_opencl_wait_request_completion(struct _starpu_async_channel *async_channel) { 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); } int _starpu_opencl_copy_interface_from_opencl_to_opencl(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_OPENCL_RAM && dst_kind == STARPU_OPENCL_RAM); int ret = 1; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* STARPU_OPENCL_RAM -> STARPU_OPENCL_RAM */ STARPU_ASSERT(starpu_worker_get_local_memory_node() == dst_node || starpu_worker_get_local_memory_node() == 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.node_ops = &_starpu_driver_opencl_node_ops; 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); } } return ret; } int _starpu_opencl_copy_interface_from_opencl_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_OPENCL_RAM && dst_kind == STARPU_CPU_RAM); int ret = 1; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* OpenCL -> RAM */ STARPU_ASSERT(starpu_worker_get_local_memory_node() == 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.node_ops = &_starpu_driver_opencl_node_ops; 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); } } return ret; } int _starpu_opencl_copy_interface_from_cpu_to_opencl(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_OPENCL_RAM); int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; /* STARPU_CPU_RAM -> STARPU_OPENCL_RAM */ STARPU_ASSERT(starpu_worker_get_local_memory_node() == 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.node_ops = &_starpu_driver_opencl_node_ops; 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); } } return ret; } int _starpu_opencl_copy_data_from_opencl_to_opencl(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_OPENCL_RAM && dst_kind == 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); } int _starpu_opencl_copy_data_from_opencl_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_OPENCL_RAM && dst_kind == STARPU_CPU_RAM); return starpu_opencl_copy_async_sync(src, src_offset, src_node, dst, dst_offset, dst_node, size, &async_channel->event.opencl_event); } int _starpu_opencl_copy_data_from_cpu_to_opencl(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel) { int src_kind = starpu_node_get_kind(src_node); int dst_kind = starpu_node_get_kind(dst_node); STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == 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 uintptr_t _starpu_opencl_malloc_on_node(unsigned dst_node, size_t size, int flags) { (void)flags; uintptr_t addr = 0; #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()) starpu_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 return addr; } void _starpu_opencl_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags) { (void)flags; (void)size; (void)dst_node; #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&opencl_alloc_mutex); /* Sleep for the free */ if (_starpu_simgrid_cuda_malloc_cost()) starpu_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 } int _starpu_opencl_is_direct_access_supported(unsigned node, unsigned handling_node) { (void)node; (void)handling_node; return 0; } #ifdef STARPU_SIMGRID struct _starpu_node_ops _starpu_driver_opencl_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = NULL, .copy_interface_to[STARPU_CUDA_RAM] = NULL, .copy_interface_to[STARPU_OPENCL_RAM] = NULL, .copy_interface_to[STARPU_DISK_RAM] = NULL, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = NULL, .copy_data_to[STARPU_CUDA_RAM] = NULL, .copy_data_to[STARPU_OPENCL_RAM] = NULL, .copy_data_to[STARPU_DISK_RAM] = NULL, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = NULL, .wait_request_completion = NULL, .test_request_completion = NULL, .is_direct_access_supported = _starpu_opencl_is_direct_access_supported, .malloc_on_node = _starpu_opencl_malloc_on_node, .free_on_node = _starpu_opencl_free_on_node, .name = "opencl driver" }; #else struct _starpu_node_ops _starpu_driver_opencl_node_ops = { .copy_interface_to[STARPU_UNUSED] = NULL, .copy_interface_to[STARPU_CPU_RAM] = _starpu_opencl_copy_interface_from_opencl_to_cpu, .copy_interface_to[STARPU_CUDA_RAM] = NULL, .copy_interface_to[STARPU_OPENCL_RAM] = _starpu_opencl_copy_interface_from_opencl_to_opencl, .copy_interface_to[STARPU_DISK_RAM] = NULL, .copy_interface_to[STARPU_MIC_RAM] = NULL, .copy_interface_to[STARPU_MPI_MS_RAM] = NULL, .copy_data_to[STARPU_UNUSED] = NULL, .copy_data_to[STARPU_CPU_RAM] = _starpu_opencl_copy_data_from_opencl_to_cpu, .copy_data_to[STARPU_CUDA_RAM] = NULL, .copy_data_to[STARPU_OPENCL_RAM] = _starpu_opencl_copy_data_from_opencl_to_opencl, .copy_data_to[STARPU_DISK_RAM] = NULL, .copy_data_to[STARPU_MIC_RAM] = NULL, .copy_data_to[STARPU_MPI_MS_RAM] = NULL, /* TODO: copy2D/3D? */ .wait_request_completion = _starpu_opencl_wait_request_completion, .test_request_completion = _starpu_opencl_test_request_completion, .is_direct_access_supported = _starpu_opencl_is_direct_access_supported, .malloc_on_node = _starpu_opencl_malloc_on_node, .free_on_node = _starpu_opencl_free_on_node, .name = "opencl driver" }; #endif starpu-1.3.9+dfsg/src/drivers/opencl/driver_opencl.h000066400000000000000000000106121413463044200225130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif #ifdef STARPU_USE_OPENCL #define CL_TARGET_OPENCL_VERSION 100 #ifdef __APPLE__ #include #else #include #endif #endif #include #include #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) struct _starpu_machine_config; void _starpu_opencl_discover_devices(struct _starpu_machine_config *config); unsigned _starpu_opencl_get_device_count(void); void _starpu_opencl_init(void); void *_starpu_opencl_worker(void *); extern struct _starpu_node_ops _starpu_driver_opencl_node_ops; #else #define _starpu_opencl_discover_devices(config) ((void) (config)) #endif #ifdef STARPU_USE_OPENCL extern struct _starpu_driver_ops _starpu_driver_opencl_ops; extern char *_starpu_opencl_program_dir; int _starpu_run_opencl(struct _starpu_worker *); int _starpu_opencl_driver_init(struct _starpu_worker *); int _starpu_opencl_driver_run_once(struct _starpu_worker *); int _starpu_opencl_driver_deinit(struct _starpu_worker *); int _starpu_opencl_init_context(int devid); int _starpu_opencl_deinit_context(int devid); cl_device_type _starpu_opencl_get_device_type(int devid); #endif #if 0 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); 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 unsigned _starpu_opencl_test_request_completion(struct _starpu_async_channel *async_channel); void _starpu_opencl_wait_request_completion(struct _starpu_async_channel *async_channel); int _starpu_opencl_copy_interface_from_opencl_to_opencl(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_opencl_copy_interface_from_opencl_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_opencl_copy_interface_from_cpu_to_opencl(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req); int _starpu_opencl_copy_data_from_opencl_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_opencl_copy_data_from_opencl_to_opencl(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_opencl_copy_data_from_cpu_to_opencl(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, struct _starpu_async_channel *async_channel); int _starpu_opencl_is_direct_access_supported(unsigned node, unsigned handling_node); uintptr_t _starpu_opencl_malloc_on_node(unsigned dst_node, size_t size, int flags); void _starpu_opencl_free_on_node(unsigned dst_node, uintptr_t addr, size_t size, int flags); #endif // __DRIVER_OPENCL_H__ starpu-1.3.9+dfsg/src/drivers/opencl/driver_opencl_utils.c000066400000000000000000000552371413463044200237420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 STARPU_DEVEL #include #endif #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); snprintf(*located_file_name, strlen(source_file_name)+1, "%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); snprintf(*located_file_name, strlen(_starpu_opencl_program_dir)+1+strlen(source_file_name)+1, "%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; } #ifdef STARPU_DEVEL if (ret == EXIT_FAILURE) { _STARPU_CALLOC(*located_file_name, 1, strlen(STARPU_SRC_DIR)+1+strlen(source_file_name)+1); snprintf(*located_file_name, strlen(STARPU_SRC_DIR)+1+strlen(source_file_name)+1, "%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; } #endif if (ret == EXIT_FAILURE) { _STARPU_CALLOC(*located_file_name, 1, strlen(_STARPU_STRINGIFY(STARPU_OPENCL_DATADIR))+1+strlen(source_file_name)+1); snprintf(*located_file_name, strlen(_STARPU_STRINGIFY(STARPU_OPENCL_DATADIR))+1+strlen(source_file_name)+1, "%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)); snprintf(*located_dir_name, 2, "%s", ""); } else { _STARPU_CALLOC(*located_dir_name, 1, 1+strlen(*located_file_name)); snprintf(*located_dir_name, 1+strlen(*located_file_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; int err; fh = fopen(filename, "r"); if (!fh) return NULL; err = stat(filename, &statbuf); STARPU_ASSERT_MSG(err == 0, "could not open file %s\n", filename); _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; int err; fh = fopen(filename, "r"); if (fh == 0) return NULL; err = stat(filename, &statbuf); STARPU_ASSERT_MSG(err == 0, "could not open file %s\n", filename); binary = (char *) malloc(statbuf.st_size); if (!binary) { fclose(fh); return binary; } err = fread(binary, statbuf.st_size, 1, fh); STARPU_ASSERT_MSG(err == 1, "could not read from file %s\n", filename); 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, sizeof(binary_directory)); 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[2048]; char *binary; size_t binary_len; FILE *fh; err = _starpu_opencl_get_binary_name(binary_file_name, sizeof(binary_file_name), 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); snprintf(*opencl_program_source, strlen(source)+1, "%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, "")) { snprintf(new_build_options, sizeof(new_build_options), "%s", build_options); } else { snprintf(new_build_options, sizeof(new_build_options), "-I %s %s", located_dir_name, build_options); } _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, sizeof(binary_file_name), 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) { _STARPU_MSG("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.3.9+dfsg/src/drivers/opencl/driver_opencl_utils.h000066400000000000000000000016121413463044200237330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ char *_starpu_opencl_get_device_type_as_string(int id); #define _STARPU_OPENCL_PLATFORM_MAX 4 #endif /* __STARPU_OPENCL_UTILS_H__ */ starpu-1.3.9+dfsg/src/profiling/000077500000000000000000000000001413463044200165425ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/profiling/bound.c000066400000000000000000001007331413463044200200210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; static void _starpu_bound_clear(int record, 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 = record; 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; unsigned i,j; for (i = 0; i < STARPU_NARCH; i++) { if (t->duration[i]) { for (j = 0; t->duration[i][j]; j++) free(t->duration[i][j]); free(t->duration[i]); } } free(t->deps); free(t); t = next; } while (td != NULL) { struct bound_tag_dep *next = td->next; free(td); td = next; } } void starpu_bound_clear(void) { _starpu_bound_clear(0, 0, 0); } /* Initialization */ void starpu_bound_start(int deps, int prio) { _starpu_bound_clear(1, deps, prio); } /* 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); } 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_CALLOC(t, 1, 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_size(size_t size, 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 += size; 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 = size; } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } void _starpu_bound_job_id_dep(starpu_data_handle_t handle, struct _starpu_job *j, unsigned long id) { if (!_starpu_bound_recording || !recorddeps) return; if (!good_job(j)) return; _starpu_bound_job_id_dep_size(_starpu_data_get_size(handle), j, id); } 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) { #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 */ (void) integer; 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, int integer) { #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 */ (void) integer_res; (void) integer; *res = 0.; #endif /* STARPU_HAVE_GLPK_H */ } starpu-1.3.9+dfsg/src/profiling/bound.h000066400000000000000000000027221413463044200200250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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); /** Clear recording */ extern void starpu_bound_clear(void); #endif // __BOUND_H__ starpu-1.3.9+dfsg/src/profiling/profiling.c000066400000000000000000000345331413463044200207070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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]; /* TODO: rather use rwlock */ 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 char bus_direct[STARPU_MAXNODES*STARPU_MAXNODES]; static int bus_ngpus[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) { unsigned worker; for (worker = 0; worker < starpu_worker_get_count(); worker++) { struct _starpu_worker *worker_struct = _starpu_get_worker_struct(worker); STARPU_PTHREAD_MUTEX_LOCK(&worker_struct->sched_mutex); 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_worker_get_count(); worker++) { struct _starpu_worker *worker_struct = _starpu_get_worker_struct(worker); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[worker]); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_struct->sched_mutex); } 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); } } 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) { int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { STARPU_PTHREAD_MUTEX_DESTROY(&worker_info_mutex[worker]); } } /* * 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; worker_info[workerid].flops = 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_SLEEPING_SCHEDULING) { 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]); if (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, double flops) { 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; worker_info[workerid].flops += flops; 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(&_starpu_get_worker_struct(workerid)->sched_mutex); 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]); STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_get_worker_struct(workerid)->sched_mutex); 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 (starpu_bus_get_id(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; } void starpu_bus_set_direct(int busid, int direct) { bus_direct[busid] = direct; } int starpu_bus_get_direct(int busid) { return bus_direct[busid]; } void starpu_bus_set_ngpus(int busid, int ngpus) { bus_ngpus[busid] = ngpus; } int starpu_bus_get_ngpus(int busid) { struct _starpu_machine_topology *topology = &_starpu_get_machine_config()->topology; int ngpus = bus_ngpus[busid]; if (!ngpus) /* Unknown number of GPUs, assume it's shared by all GPUs */ ngpus = topology->ncudagpus+topology->nopenclgpus; return ngpus; } int starpu_bus_get_profiling_info(int busid, struct starpu_profiling_bus_info *bus_info) { int src_node = starpu_bus_get_src(busid); int dst_node = starpu_bus_get_dst(busid); /* 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.3.9+dfsg/src/profiling/profiling.h000066400000000000000000000066331413463044200207140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2020 Federal University of Rio Grande do Sul (UFRGS) * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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, double flops); /** 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.3.9+dfsg/src/profiling/profiling_helpers.c000066400000000000000000000127231413463044200224260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 double convert_to_GB(float d) { const double divisor = 1024; return d = (((d / divisor) / divisor) / divisor); } void _starpu_profiling_bus_helper_display_summary(FILE *stream) { int long long sum_transferred = 0; fprintf(stream, "\n#---------------------\n"); fprintf(stream, "Data transfer stats:\n"); int busid; int bus_cnt = starpu_bus_get_count(); for (busid = 0; busid < bus_cnt; busid++) { char src_name[128], dst_name[128]; 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) / 1e6; double d = convert_to_GB(transferred); starpu_memory_node_get_name(src, src_name, sizeof(src_name)); starpu_memory_node_get_name(dst, dst_name, sizeof(dst_name)); fprintf(stream, "\t%s -> %s", src_name, dst_name); fprintf(stream, "\t%.4lf %s", d, "GB"); fprintf(stream, "\t%.4lf %s/s", (d * 1024) / elapsed_time, "MB"); fprintf(stream, "\t(transfers : %lld - avg %.4lf %s)\n", transfer_cnt, (d * 1024) / transfer_cnt, "MB"); sum_transferred += transferred; } double d = convert_to_GB(sum_transferred); fprintf(stream, "Total transfers: %.4lf %s\n", d, "GB"); fprintf(stream, "#---------------------\n"); } void starpu_profiling_bus_helper_display_summary(void) { const char *stats; if (!((stats = starpu_getenv("STARPU_BUS_STATS")) && atoi(stats))) return; const char *filename = starpu_getenv("STARPU_BUS_STATS_FILE"); if (filename==NULL) _starpu_profiling_bus_helper_display_summary(stderr); else { FILE *sfile = fopen(filename, "w+"); STARPU_ASSERT_MSG(sfile, "Could not open file %s for displaying bus stats (%s). You can specify another file destination with the STARPU_BUS_STATS_FILE environment variable", filename, strerror(errno)); _starpu_profiling_bus_helper_display_summary(sfile); fclose(sfile); } } 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, "\n#---------------------\n"); fprintf(stream, "Worker stats:\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)); fprintf(stream, "%-32s\n", name); fprintf(stream, "\t%d task(s)\n", info.executed_tasks); 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, "\ttotal: %.2lf ms executing: %.2lf ms sleeping: %.2lf ms overhead %.2lf ms\n", 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); if (info.flops) fprintf(stream, "\t%f GFlop/s\n\n", info.flops / total_time / 1000000); } 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); fprintf(stream, "Total energy: %.2lf J\n", sum_consumed + idle_energy); } } fprintf(stream, "#---------------------\n"); } void starpu_profiling_worker_helper_display_summary(void) { const char *stats; if (!((stats = starpu_getenv("STARPU_WORKER_STATS")) && atoi(stats))) return; const char *filename = starpu_getenv("STARPU_WORKER_STATS_FILE"); if (filename==NULL) _starpu_profiling_worker_helper_display_summary(stderr); else { FILE *sfile = fopen(filename, "w+"); STARPU_ASSERT_MSG(sfile, "Could not open file %s for displaying worker stats (%s). You can specify another file destination with the STARPU_WORKER_STATS_FILE environment variable", filename, strerror(errno)); _starpu_profiling_worker_helper_display_summary(sfile); fclose(sfile); } } starpu-1.3.9+dfsg/src/sched_policies/000077500000000000000000000000001413463044200175265ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/sched_policies/component_best_implementation.c000066400000000000000000000076171413463044200260310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 /* 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; unsigned impl; if (!task->cl->model) { /* No perfmodel, first available will be fine */ starpu_worker_can_execute_task_first_impl(workerid, task, &impl); best_impl = impl; len = 0.0; } else { struct starpu_perfmodel_arch* archtype = starpu_worker_get_perf_archtype(workerid, sched_ctx_id); for(impl = 0; impl < STARPU_MAXIMPLEMENTATIONS; impl++) { if(starpu_worker_can_execute_task(workerid, task, impl)) { 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; task->predicted = len; task->predicted_transfer = starpu_task_expected_data_transfer_time_for(task, workerid); 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_sched_component * from STARPU_ATTRIBUTE_UNUSED) { struct starpu_task * task = NULL; unsigned 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) { (void)arg; 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.3.9+dfsg/src/sched_policies/component_composed.c000066400000000000000000000174471413463044200236020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 */ static 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); } static struct starpu_task * composed_component_pull_task(struct starpu_sched_component *component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { struct composed_component *c = component->data; struct starpu_task *task; task = starpu_sched_component_pull_task(c->bottom,component); if(task) return task; unsigned 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; } static 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; } } static 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; struct starpu_sched_component * next = c->top; do { component = next; 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.3.9+dfsg/src/sched_policies/component_eager.c000066400000000000000000000121261413463044200230410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include struct _starpu_eager_data { struct starpu_sched_component *target; starpu_pthread_mutex_t scheduling_mutex; int ntasks; }; 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)); struct _starpu_eager_data *d = component->data; struct starpu_sched_component *target; if (d->ntasks == 0) /* We have already pushed a task down */ return 1; if (d->ntasks > 0) d->ntasks--; if ((target = d->target)) { /* target told us we could push to it, try to */ int idworker; for(idworker = starpu_bitmap_first(target->workers); idworker != -1; idworker = starpu_bitmap_next(target->workers, idworker)) { int nimpl; for(nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if(starpu_worker_can_execute_task(idworker,task,nimpl) || starpu_combined_worker_can_execute_task(idworker, task, nimpl)) { ret = starpu_sched_component_push_task(component,target,task); if (!ret) return 0; } } } } /* FIXME: should rather just loop over children before looping over its workers */ 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++) { /* FIXME: use starpu_worker_can_execute_task_first_impl instead */ if(starpu_worker_can_execute_task(workerid,task,nimpl) || starpu_combined_worker_can_execute_task(workerid, task, nimpl)) { unsigned 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])) { if (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; } /* Note: we can't use starpu_sched_component_pump_to ourself because if a fifo below * refuses a task, we have no way to push it back to a fifo above. */ static int eager_can_push(struct starpu_sched_component * component, struct starpu_sched_component * to) { int success; struct _starpu_eager_data *d = component->data; STARPU_COMPONENT_MUTEX_LOCK(&d->scheduling_mutex); /* Target flow of tasks to this child */ d->target = to; /* But make pump above push only one task */ d->ntasks = 1; success = starpu_sched_component_can_push(component, to); d->target = NULL; d->ntasks = -1; STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); return success; } static struct starpu_task *eager_pull_task(struct starpu_sched_component * component, struct starpu_sched_component * to) { /* We can't directly pull (in case the obtained task does not match * the constraints of `to'), but we can try to push, and components * below will cope with it */ eager_can_push(component, to); return NULL; } static void eager_deinit_data(struct starpu_sched_component *component) { STARPU_ASSERT(starpu_sched_component_is_eager(component)); struct _starpu_eager_data *d = component->data; STARPU_PTHREAD_MUTEX_DESTROY(&d->scheduling_mutex); free(d); } 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) { (void)arg; struct starpu_sched_component * component = starpu_sched_component_create(tree, "eager"); struct _starpu_eager_data *data; _STARPU_MALLOC(data, sizeof(*data)); data->target = NULL; data->ntasks = -1; STARPU_PTHREAD_MUTEX_INIT(&data->scheduling_mutex, NULL); component->data = data; component->push_task = eager_push_task; component->pull_task = eager_pull_task; component->can_push = eager_can_push; component->can_pull = starpu_sched_component_can_pull_all; component->deinit_data = eager_deinit_data; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_eager_calibration.c000066400000000000000000000052361413463044200254140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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)) { unsigned 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) { 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) { (void)arg; struct starpu_sched_component * component = starpu_sched_component_create(tree, "eager_calibration"); component->push_task = eager_calibration_push_task; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_eager_prio.c000066400000000000000000000116571413463044200241020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ /* eager component which has its own priority queue. It can thus eagerly push * tasks to lower queues without having to wait for being pulled from. */ #include #include "prio_deque.h" #include #include #include #include struct _starpu_eager_prio_data { struct _starpu_prio_deque prio; starpu_pthread_mutex_t mutex; }; static int eager_prio_progress_one(struct starpu_sched_component *component) { struct _starpu_eager_prio_data * data = component->data; starpu_pthread_mutex_t * mutex = &data->mutex; struct _starpu_prio_deque * prio = &data->prio; struct starpu_task *task; int ret; STARPU_COMPONENT_MUTEX_LOCK(mutex); task = _starpu_prio_deque_pop_task(prio); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); if (!task) { return 1; } /* FIXME: should rather just loop over children before looping over its workers */ 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++) { /* FIXME: use starpu_worker_can_execute_task_first_impl instead */ if(starpu_worker_can_execute_task(workerid,task,nimpl) || starpu_combined_worker_can_execute_task(workerid, task, nimpl)) { unsigned 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) { STARPU_ASSERT(!starpu_sched_component_is_worker(component->children[i])); ret = starpu_sched_component_push_task(component,component->children[i],task); if (!ret) return 0; } } } } } } /* Could not push to child actually, push that one back too */ STARPU_COMPONENT_MUTEX_LOCK(mutex); _starpu_prio_deque_push_front_task(prio, task); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); return 1; } /* Try to push some tasks below */ static void eager_prio_progress(struct starpu_sched_component *component) { STARPU_ASSERT(component && starpu_sched_component_is_eager_prio(component)); while (!eager_prio_progress_one(component)) ; } static int eager_prio_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && task && starpu_sched_component_is_eager_prio(component)); struct _starpu_eager_prio_data * data = component->data; struct _starpu_prio_deque * prio = &data->prio; starpu_pthread_mutex_t * mutex = &data->mutex; STARPU_COMPONENT_MUTEX_LOCK(mutex); _starpu_prio_deque_push_back_task(prio,task); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); eager_prio_progress(component); return 0; } static int eager_prio_can_push(struct starpu_sched_component *component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { eager_prio_progress(component); int ret = 0; unsigned j; for(j=0; j < component->nparents; j++) { if(component->parents[j] == NULL) continue; else { ret = component->parents[j]->can_push(component->parents[j], component); if(ret) break; } } return ret; } static void eager_prio_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_eager_prio(component)); struct _starpu_eager_prio_data * d = component->data; _starpu_prio_deque_destroy(&d->prio); free(d); } int starpu_sched_component_is_eager_prio(struct starpu_sched_component * component) { return component->push_task == eager_prio_push_task; } struct starpu_sched_component * starpu_sched_component_eager_prio_create(struct starpu_sched_tree *tree, void *arg) { (void)arg; struct starpu_sched_component * component = starpu_sched_component_create(tree, "eager_prio"); struct _starpu_eager_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->push_task = eager_prio_push_task; component->can_push = eager_prio_can_push; component->deinit_data = eager_prio_component_deinit_data; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_fifo.c000066400000000000000000000212301413463044200226750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 "fifo_queues.h" struct _starpu_fifo_data { struct _starpu_fifo_taskq * fifo; starpu_pthread_mutex_t mutex; unsigned ntasks_threshold; double exp_len_threshold; int ready; }; 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; return starpu_sched_component_estimated_end_min_add(component, fifo->exp_len); } 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_COMPONENT_MUTEX_LOCK(mutex); load += fifo->ntasks / relative_speedup; STARPU_COMPONENT_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_COMPONENT_MUTEX_LOCK(mutex); load += fifo->ntasks / relative_speedup; STARPU_COMPONENT_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; const double now = starpu_timing_now(); STARPU_COMPONENT_MUTEX_LOCK(mutex); double exp_len; if(!isnan(task->predicted)) exp_len = fifo->exp_len + task->predicted; else exp_len = fifo->exp_len; if (!is_pushback && ((data->ntasks_threshold != 0 && fifo->ntasks >= data->ntasks_threshold) || (data->exp_len_threshold != 0.0 && exp_len >= data->exp_len_threshold))) { static int warned; if(data->exp_len_threshold != 0.0 && 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_COMPONENT_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_transfer)) { double end = fifo_estimated_end(component); double tfer_end = now + task->predicted_transfer; if(tfer_end < end) task->predicted_transfer = 0.0; else task->predicted_transfer = tfer_end - end; exp_len += task->predicted_transfer; } 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)); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); if(!is_pushback) component->can_pull(component); } 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, struct starpu_sched_component * to) { 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; const double now = starpu_timing_now(); STARPU_COMPONENT_MUTEX_LOCK(mutex); struct starpu_task * task; if (data->ready && to->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE) task = _starpu_fifo_pop_first_ready_task(fifo, starpu_bitmap_first(to->workers_in_ctx), -1); else task = _starpu_fifo_pop_task(fifo, starpu_worker_get_id_check()); if(task) { if(!isnan(task->predicted)) { const double exp_len = fifo->exp_len - task->predicted; fifo->exp_start = now + task->predicted; if (exp_len >= 0.0) { fifo->exp_len = exp_len; } else { /* exp_len can become negative due to rounding errors */ fifo->exp_len = 0.0; } } STARPU_ASSERT_MSG(fifo->exp_len>=0, "fifo->exp_len=%lf\n",fifo->exp_len); if(!isnan(task->predicted_transfer)) { if (fifo->exp_len > task->predicted_transfer) { fifo->exp_start += task->predicted_transfer; fifo->exp_len -= task->predicted_transfer; } else { fifo->exp_start += fifo->exp_len; fifo->exp_len = 0; } } 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_COMPONENT_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. starpu_sched_component_send_can_push_to_parents(component); 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, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { STARPU_ASSERT(component && starpu_sched_component_is_fifo(component)); int res = 0; struct starpu_task * task; task = starpu_sched_component_pump_downstream(component, &res); if(task) { int ret = fifo_push_local_task(component,task,1); STARPU_ASSERT(!ret); } 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; data->ready=params->ready; } else { data->ntasks_threshold=0; data->exp_len_threshold=0.0; data->ready=0; } return component; } starpu-1.3.9+dfsg/src/sched_policies/component_heft.c000066400000000000000000000162521413463044200227100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 #include "helper_mct.h" #include #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 = 0; STARPU_COMPONENT_MUTEX_LOCK(mutex); tasks[0] = _starpu_prio_deque_pop_task(prio); if (tasks[0]) { int priority = tasks[0]->priority; /* Try to look at NTASKS from the queue */ for (ntasks = 1; ntasks < NTASKS; ntasks++) { tasks[ntasks] = _starpu_prio_deque_highest_task(prio); if (!tasks[ntasks] || tasks[ntasks]->priority < priority) break; _starpu_prio_deque_pop_task(prio); } } STARPU_COMPONENT_MUTEX_UNLOCK(mutex); if (!ntasks) { return 1; } { struct _starpu_mct_data * d = data->mct_data; struct starpu_sched_component * best_component; unsigned n; /* 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]; unsigned suitable_components[component->nchildren * ntasks]; unsigned nsuitable_components[ntasks]; /* Estimate durations */ for (n = 0; n < ntasks; n++) { unsigned offset = component->nchildren * n; nsuitable_components[n] = starpu_mct_compute_execution_times(component, tasks[n], estimated_lengths + offset, estimated_transfer_length + offset, suitable_components + offset); 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, nsuitable_components[n]); } /* best_task is the task that will finish first among the ntasks, while best_benefit is its expected execution time*/ int best_task = 0; double best_benefit = min_exp_end_with_task[0]; /* Find the task which provides the most computation time benefit */ for (n = 1; n < ntasks; n++) { if (best_benefit > min_exp_end_with_task[n]) { best_benefit = min_exp_end_with_task[n]; best_task = n; } } STARPU_ASSERT(best_task >= 0); /* Push back the other tasks */ STARPU_COMPONENT_MUTEX_LOCK(mutex); for (n = ntasks - 1; n < ntasks; n--) if ((int) n != best_task) _starpu_prio_deque_push_front_task(prio, tasks[n]); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); unsigned offset = component->nchildren * best_task; int best_icomponent = starpu_mct_get_best_component(d, tasks[best_task], estimated_lengths + offset, estimated_transfer_length + offset, estimated_ends_with_task + offset, min_exp_end_with_task[best_task], max_exp_end_with_task[best_task], suitable_components + offset, nsuitable_components[best_task]); STARPU_ASSERT(best_icomponent != -1); best_component = component->children[best_icomponent]; if(starpu_sched_component_is_worker(best_component)) { best_component->can_pull(best_component); return 1; } starpu_sched_task_break(tasks[best_task]); 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_COMPONENT_MUTEX_LOCK(mutex); _starpu_prio_deque_push_front_task(prio, tasks[best_task]); STARPU_COMPONENT_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_COMPONENT_MUTEX_LOCK(mutex); _starpu_prio_deque_push_back_task(prio,task); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); heft_progress(component); return 0; } static int heft_can_push(struct starpu_sched_component *component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { heft_progress(component); int ret = 0; unsigned j; for(j=0; j < component->nparents; j++) { if(component->parents[j] == NULL) continue; else { ret = component->parents[j]->can_push(component->parents[j], component); 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.3.9+dfsg/src/sched_policies/component_heteroprio.c000066400000000000000000000410601413463044200241350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ /* Heteroprio, which sorts tasks by acceleration factor into buckets, and makes * GPUs take accelerated tasks first and CPUs take non-accelerated tasks first */ #include #include "prio_deque.h" #include #include "helper_mct.h" #include #include #include /* Approximation ratio for acceleration factor bucketing * We will put tasks with +-10% similar acceleration into the same bucket. */ #define APPROX 0.10 struct _starpu_heteroprio_data { /* This is an array of priority queues. * The array is sorted by acceleration factor, most accelerated first */ struct _starpu_prio_deque **bucket; float *accel; unsigned naccel; /* This contains tasks which are not supported on all archs. */ struct _starpu_prio_deque no_accel; /* This protects all queues */ starpu_pthread_mutex_t mutex; struct _starpu_mct_data *mct_data; unsigned batch; }; static int heteroprio_progress_accel(struct starpu_sched_component *component, struct _starpu_heteroprio_data *data, enum starpu_worker_archtype archtype, int front) { struct starpu_task *task = NULL; starpu_pthread_mutex_t * mutex = &data->mutex; int j, ret = 1; double acceleration = INFINITY; struct _starpu_mct_data * d = data->mct_data; STARPU_COMPONENT_MUTEX_LOCK(mutex); if (front) /* Pick up accelerated tasks first */ for (j = 0; j < (int) data->naccel; j++) { task = _starpu_prio_deque_pop_task(data->bucket[j]); if (task) break; } else /* Pick up accelerated tasks last */ for (j = (int) data->naccel-1; j >= 0; j--) { if (data->batch && 0) task = _starpu_prio_deque_pop_back_task(data->bucket[j]); else task = _starpu_prio_deque_pop_task(data->bucket[j]); if (task) break; } if (task) { acceleration = data->accel[j]; //fprintf(stderr, "for %s thus %s, found task %p in bucket %d: %f\n", starpu_worker_get_type_as_string(archtype), front?"front":"back", task, j, acceleration); } STARPU_COMPONENT_MUTEX_UNLOCK(mutex); if (!task) return 1; if (data->batch) /* In batch mode the fifos below do not use priorities. Do not * leak a priority for the data prefetches either */ task->priority = INT_MAX; /* TODO: we might want to prefer to pick up a task whose data is already on some GPU */ struct starpu_sched_component * best_component; /* 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]; /* Minimum transfer+task termination on all children */ double min_exp_end_with_task; /* Maximum transfer+task termination on all children */ double max_exp_end_with_task; unsigned suitable_components[component->nchildren]; unsigned nsuitable_components; nsuitable_components = starpu_mct_compute_execution_times(component, task, estimated_lengths, estimated_transfer_length, suitable_components); if (data->batch && 0) { /* In batch mode, we may want to insist on filling workers with tasks * by ignoring when other workers would finish this. */ unsigned 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 (starpu_worker_get_type(idworker) == archtype) break; } if (idworker == -1) { /* Not the targetted arch, avoid it */ /* XXX: INFINITY doesn't seem to be working properly */ estimated_lengths[i] = 1000000000; estimated_transfer_length[i] = 1000000000; } } } /* Entering critical section to make sure no two workers make scheduling decisions at the same time */ STARPU_COMPONENT_MUTEX_LOCK(&d->scheduling_mutex); 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, nsuitable_components); /* And now find out which worker suits best for this task, * including data transfer */ int best_icomponent = starpu_mct_get_best_component(d, task, estimated_lengths, estimated_transfer_length, estimated_ends_with_task, min_exp_end_with_task, max_exp_end_with_task, suitable_components, nsuitable_components); if (best_icomponent == -1) goto out; best_component = component->children[best_icomponent]; int idworker; for(idworker = starpu_bitmap_first(best_component->workers); idworker != -1; idworker = starpu_bitmap_next(best_component->workers, idworker)) { if (starpu_worker_get_type(idworker) == archtype) break; } if (idworker == -1) goto out; /* Ok, we do have a worker there of that type, try to push it there. */ STARPU_ASSERT(!starpu_sched_component_is_worker(best_component)); starpu_sched_task_break(task); ret = starpu_sched_component_push_task(component,best_component,task); /* I can now exit the critical section: Pushing the task above ensures that its execution time will be taken into account for subsequent scheduling decisions */ if (!ret) { STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); //fprintf(stderr, "pushed %p to %d\n", task, best_icomponent); /* Great! */ return 0; } out: STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); /* No such kind of worker there, or it refused our task, abort */ //fprintf(stderr, "could not push %p to %d actually\n", task, best_icomponent); /* Could not push to child actually, push that one back */ STARPU_COMPONENT_MUTEX_LOCK(mutex); for (j = 0; j < (int) data->naccel; j++) { if (acceleration == data->accel[j]) { _starpu_prio_deque_push_front_task(data->bucket[j], task); break; } } STARPU_ASSERT(j != (int) data->naccel); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); //fprintf(stderr, "finished pushing to %d\n", archtype); return 1; } static int heteroprio_progress_noaccel(struct starpu_sched_component *component, struct _starpu_heteroprio_data *data, struct starpu_task *task) { struct _starpu_mct_data * d = data->mct_data; int ret; struct starpu_sched_component * best_component; /* 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]; /* Minimum transfer+task termination on all children */ double min_exp_end_with_task; /* Maximum transfer+task termination on all children */ double max_exp_end_with_task; unsigned suitable_components[component->nchildren]; unsigned nsuitable_components; nsuitable_components = starpu_mct_compute_execution_times(component, task, estimated_lengths, estimated_transfer_length, 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; /* Entering critical section to make sure no two workers make scheduling decisions at the same time */ STARPU_COMPONENT_MUTEX_LOCK(&d->scheduling_mutex); 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, nsuitable_components); /* And now find out which worker suits best for this task, * including data transfer */ int best_icomponent = starpu_mct_get_best_component(d, task, estimated_lengths, estimated_transfer_length, estimated_ends_with_task, min_exp_end_with_task, max_exp_end_with_task, suitable_components, nsuitable_components); /* 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) { STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); return 1; } best_component = component->children[best_icomponent]; STARPU_ASSERT(!starpu_sched_component_is_worker(best_component)); ret = starpu_sched_component_push_task(component,best_component,task); STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); return ret; } static int heteroprio_progress_one(struct starpu_sched_component *component) { struct _starpu_heteroprio_data * data = component->data; starpu_pthread_mutex_t * mutex = &data->mutex; struct starpu_task *task; struct _starpu_prio_deque * no_accel = &data->no_accel; STARPU_COMPONENT_MUTEX_LOCK(mutex); task = _starpu_prio_deque_pop_task(no_accel); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); if (task) { if (heteroprio_progress_noaccel(component, data, task)) { /* Could not push to child actually, push that one back */ STARPU_COMPONENT_MUTEX_LOCK(mutex); _starpu_prio_deque_push_front_task(no_accel, task); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); } } /* Note: this hardcodes acceleration order */ if (!heteroprio_progress_accel(component, data, STARPU_CUDA_WORKER, 1)) return 0; if (!heteroprio_progress_accel(component, data, STARPU_OPENCL_WORKER, 1)) return 0; if (!heteroprio_progress_accel(component, data, STARPU_MIC_WORKER, 1)) return 0; if (!heteroprio_progress_accel(component, data, STARPU_MPI_MS_WORKER, 0)) return 0; if (!heteroprio_progress_accel(component, data, STARPU_CPU_WORKER, 0)) return 0; return 1; } /* Try to push some tasks below */ static void heteroprio_progress(struct starpu_sched_component *component) { STARPU_ASSERT(component && starpu_sched_component_is_heteroprio(component)); while (!heteroprio_progress_one(component)) ; } static int heteroprio_push_task(struct starpu_sched_component * component, struct starpu_task * task) { STARPU_ASSERT(component && task && starpu_sched_component_is_heteroprio(component)); struct _starpu_heteroprio_data * data = component->data; starpu_pthread_mutex_t * mutex = &data->mutex; unsigned nimpl; double min_expected = INFINITY, max_expected = -INFINITY; double acceleration; if (data->batch && 0) /* Batch mode, we may want to ignore priorities completely */ task->priority = INT_MAX; /* Compute acceleration between best-performing arch and least-performing arch */ int workerid; for(workerid = starpu_bitmap_first(component->workers_in_ctx); workerid != -1; workerid = starpu_bitmap_next(component->workers_in_ctx, workerid)) { unsigned impl_mask; if (!starpu_worker_can_execute_task_impl(workerid, task, &impl_mask)) break; struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(workerid, task->sched_ctx); double min_arch = INFINITY; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!(impl_mask & (1U << nimpl))) continue; double expected = starpu_task_expected_length(task, perf_arch, nimpl); if (isnan(expected) || expected == 0.) { min_arch = expected; break; } if (expected < min_arch) min_arch = expected; } if (isnan(min_arch) || min_arch == 0.) /* No known execution time, can't do anything here */ break; STARPU_ASSERT(min_arch != INFINITY); if (min_arch < min_expected) min_expected = min_arch; if (min_arch > max_expected) max_expected = min_arch; } if (workerid == -1) { /* All archs can run it */ STARPU_ASSERT(!isnan(min_expected)); STARPU_ASSERT(!isnan(max_expected)); STARPU_ASSERT(min_expected != INFINITY); STARPU_ASSERT(max_expected != -INFINITY); acceleration = max_expected / min_expected; STARPU_ASSERT(!isnan(acceleration)); //fprintf(stderr,"%s: acceleration %f\n", starpu_task_get_name(task), acceleration); STARPU_COMPONENT_MUTEX_LOCK(mutex); unsigned i, j; /* Try to find a bucket with similar acceleration */ for (i = 0; i < data->naccel; i++) { if (acceleration >= data->accel[i] * (1 - APPROX) && acceleration <= data->accel[i] * (1 + APPROX)) break; } if (i == data->naccel) { /* Didn't find it, add one */ data->naccel++; float *newaccel = malloc(data->naccel * sizeof(*newaccel)); struct _starpu_prio_deque **newbuckets = malloc(data->naccel * sizeof(*newbuckets)); struct _starpu_prio_deque *newbucket = malloc(sizeof(*newbucket)); _starpu_prio_deque_init(newbucket); int inserted = 0; for (j = 0; j < data->naccel-1; j++) { if (!inserted && acceleration > data->accel[j]) { /* Insert the new bucket here */ i = j; newbuckets[j] = newbucket; newaccel[j] = acceleration; inserted = 1; } newbuckets[j+inserted] = data->bucket[j]; newaccel[j+inserted] = data->accel[j]; } if (!inserted) { /* Insert it last */ newbuckets[data->naccel-1] = newbucket; newaccel[data->naccel-1] = acceleration; } free(data->bucket); free(data->accel); data->bucket = newbuckets; data->accel = newaccel; } #if 0 fprintf(stderr,"buckets:"); for (j = 0; j < data->naccel; j++) { fprintf(stderr, " %f", data->accel[j]); } fprintf(stderr,"\ninserting %p %f to %d\n", task, acceleration, i); #endif _starpu_prio_deque_push_back_task(data->bucket[i],task); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); } else { /* Not all archs can run it, will resort to HEFT strategy */ acceleration = INFINITY; //fprintf(stderr,"%s: some archs can't do it\n", starpu_task_get_name(task)); struct _starpu_prio_deque * no_accel = &data->no_accel; STARPU_COMPONENT_MUTEX_LOCK(mutex); _starpu_prio_deque_push_back_task(no_accel,task); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); } heteroprio_progress(component); return 0; } static int heteroprio_can_push(struct starpu_sched_component *component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { heteroprio_progress(component); int ret = 0; unsigned j; for(j=0; j < component->nparents; j++) { if(component->parents[j] == NULL) continue; else { ret = component->parents[j]->can_push(component->parents[j], component); if(ret) break; } } return ret; } static void heteroprio_component_deinit_data(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_heteroprio(component)); struct _starpu_heteroprio_data * d = component->data; struct _starpu_mct_data * mct_d = d->mct_data; unsigned i; for (i = 0; i < d->naccel; i++) { _starpu_prio_deque_destroy(d->bucket[i]); free(d->bucket[i]); } free(d->bucket); free(d->accel); _starpu_prio_deque_destroy(&d->no_accel); STARPU_PTHREAD_MUTEX_DESTROY(&d->mutex); STARPU_PTHREAD_MUTEX_DESTROY(&mct_d->scheduling_mutex); free(mct_d); free(d); } int starpu_sched_component_is_heteroprio(struct starpu_sched_component * component) { return component->push_task == heteroprio_push_task; } struct starpu_sched_component * starpu_sched_component_heteroprio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_heteroprio_data * params) { struct starpu_sched_component * component = starpu_sched_component_create(tree, "heteroprio"); struct _starpu_mct_data *mct_data = starpu_mct_init_parameters(params ? params->mct : NULL); struct _starpu_heteroprio_data *data; _STARPU_MALLOC(data, sizeof(*data)); data->bucket = NULL; data->accel = NULL; data->naccel = 0; _starpu_prio_deque_init(&data->no_accel); STARPU_PTHREAD_MUTEX_INIT(&data->mutex,NULL); data->mct_data = mct_data; STARPU_PTHREAD_MUTEX_INIT(&mct_data->scheduling_mutex,NULL); if (params) data->batch = params->batch; else data->batch = 1; component->data = data; component->push_task = heteroprio_push_task; component->can_push = heteroprio_can_push; component->deinit_data = heteroprio_component_deinit_data; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_mct.c000066400000000000000000000110671413463044200225440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 "helper_mct.h" #include #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; /* 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]; /* Minimum transfer+task termination on all children */ double min_exp_end_with_task; /* Maximum transfer+task termination on all children */ double max_exp_end_with_task; unsigned suitable_components[component->nchildren]; unsigned nsuitable_components; nsuitable_components = starpu_mct_compute_execution_times(component, task, estimated_lengths, estimated_transfer_length, 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; /* Entering critical section to make sure no two workers make scheduling decisions at the same time */ STARPU_COMPONENT_MUTEX_LOCK(&d->scheduling_mutex); 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, nsuitable_components); int best_icomponent = starpu_mct_get_best_component(d, task, estimated_lengths, estimated_transfer_length, estimated_ends_with_task, min_exp_end_with_task, max_exp_end_with_task, suitable_components, nsuitable_components); /* 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) { STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); return 1; } best_component = component->children[best_icomponent]; if(starpu_sched_component_is_worker(best_component)) { best_component->can_pull(best_component); STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); return 1; } starpu_sched_task_break(task); int ret = starpu_sched_component_push_task(component, best_component, task); /* I can now exit the critical section: Pushing the task below ensures that its execution time will be taken into account for subsequent scheduling decisions */ STARPU_COMPONENT_MUTEX_UNLOCK(&d->scheduling_mutex); 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; STARPU_PTHREAD_MUTEX_DESTROY(&d->scheduling_mutex); 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; STARPU_PTHREAD_MUTEX_INIT(&data->scheduling_mutex, NULL); component->push_task = mct_push_task; component->deinit_data = mct_component_deinit_data; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_perfmodel_select.c000066400000000000000000000101531413463044200252700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; STARPU_HG_DISABLE_CHECKING(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 struct starpu_task * perfmodel_select_pull_task(struct starpu_sched_component * component STARPU_ATTRIBUTE_UNUSED, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { /* We don't want to pull tasks blindly, only let them go through push, so we push to the right component. */ return NULL; } 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->can_pull = starpu_sched_component_send_can_push_to_parents; component->push_task = perfmodel_select_push_task; component->pull_task = perfmodel_select_pull_task; component->deinit_data = perfmodel_select_component_deinit_data; component->estimated_end = starpu_sched_component_estimated_end_min; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_prio.c000066400000000000000000000234721413463044200227350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "prio_deque.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; int ready; }; 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; return starpu_sched_component_estimated_end_min_add(component, prio->exp_len); } 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_COMPONENT_MUTEX_LOCK(mutex); load += prio->ntasks / relative_speedup; STARPU_COMPONENT_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_COMPONENT_MUTEX_LOCK(mutex); load += prio->ntasks / relative_speedup; STARPU_COMPONENT_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; const double now = starpu_timing_now(); STARPU_COMPONENT_MUTEX_LOCK(mutex); double exp_len; if(!isnan(task->predicted)) exp_len = prio->exp_len + task->predicted; else exp_len = prio->exp_len; if (!is_pushback && ((data->ntasks_threshold != 0 && prio->ntasks >= data->ntasks_threshold) || (data->exp_len_threshold != 0.0 && exp_len >= data->exp_len_threshold))) { static int warned; if(data->exp_len_threshold != 0.0 && 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_COMPONENT_MUTEX_UNLOCK(mutex); } else { if(is_pushback) ret = _starpu_prio_deque_push_front_task(prio,task); else { ret = _starpu_prio_deque_push_back_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_transfer)) { double end = prio_estimated_end(component); double tfer_end = now + task->predicted_transfer; if(tfer_end < end) task->predicted_transfer = 0.0; else task->predicted_transfer = tfer_end - end; exp_len += task->predicted_transfer; } 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)); STARPU_COMPONENT_MUTEX_UNLOCK(mutex); if(!is_pushback) component->can_pull(component); } 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, struct starpu_sched_component * to) { 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; const double now = starpu_timing_now(); STARPU_COMPONENT_MUTEX_LOCK(mutex); struct starpu_task * task; if (data->ready && to->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE) task = _starpu_prio_deque_deque_first_ready_task(prio, starpu_bitmap_first(to->workers_in_ctx)); else task = _starpu_prio_deque_pop_task(prio); if(task) { if(!isnan(task->predicted)) { const double exp_len = prio->exp_len - task->predicted; prio->exp_start = now + task->predicted; if (exp_len >= 0.0) { prio->exp_len = exp_len; } else { /* exp_len can become negative due to rounding errors */ prio->exp_len = 0.0; } } STARPU_ASSERT_MSG(prio->exp_len>=0, "prio->exp_len=%lf\n",prio->exp_len); if(!isnan(task->predicted_transfer)) { if (prio->exp_len > task->predicted_transfer) { prio->exp_start += task->predicted_transfer; prio->exp_len -= task->predicted_transfer; } else { prio->exp_start += prio->exp_len; prio->exp_len = 0; } } 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_COMPONENT_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. starpu_sched_component_send_can_push_to_parents(component); 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, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { STARPU_ASSERT(component && starpu_sched_component_is_prio(component)); int res = 0; struct starpu_task * task; task = starpu_sched_component_pump_downstream(component, &res); if(task) { int ret = prio_push_local_task(component,task,1); STARPU_ASSERT(!ret); } 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; data->ready=params->ready; } else { data->ntasks_threshold=0; data->exp_len_threshold=0.0; data->ready=0; } return component; } starpu-1.3.9+dfsg/src/sched_policies/component_random.c000066400000000000000000000066621413463044200232460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 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]; unsigned 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; unsigned 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_sched_task_break(task); int ret_val = starpu_sched_component_push_task(component,select,task); return ret_val; } static struct starpu_task *random_pull_task(struct starpu_sched_component * from, struct starpu_sched_component *to) { starpu_sched_component_can_push(from, to); return NULL; } 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) { (void)arg; struct starpu_sched_component * component = starpu_sched_component_create(tree, "random"); component->push_task = random_push_task; component->pull_task = random_pull_task; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_sched.c000066400000000000000000000577001413463044200230530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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; } STARPU_ASSERT_MSG(d >= 0, "workerid=%d, nimpl=%d, bundle=%p, d=%lf\n", workerid, nimpl, bundle, d); 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); unsigned 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; unsigned 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); } static 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; if (starpu_worker_is_combined_worker(worker)) 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(starpu_worker_is_combined_worker(worker)) continue; 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); unsigned 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); /* worker components are shared among sched_ctxs, thus we do not apply the sched_ctx worker mask to them. * per-ctx filtering is performed higher in the tree */ 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); unsigned i,j; for(i = starpu_worker_get_count(); i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { if (starpu_bitmap_get(component->workers, i)) { /* Component has this combined worker, check whether the * context has all the corresponding workers */ int worker_size; int *combined_workerid; starpu_combined_worker_get_description(i, &worker_size, &combined_workerid); for (j = 0; j < (unsigned) worker_size; j++) if (!starpu_bitmap_get(workers_in_ctx, combined_workerid[j])) goto nocombined; /* We have all workers, add it */ starpu_bitmap_set(component->workers_in_ctx, i); } nocombined: (void)0; } 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); } 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); if (t->root) _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); if (t->root) _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); /* Modular schedulers are not supposed to refuse tasks */ STARPU_ASSERT(!ret_val); return 0; } int starpu_sched_component_push_task(struct starpu_sched_component *from STARPU_ATTRIBUTE_UNUSED, struct starpu_sched_component *to, struct starpu_task *task) { int pushback; int priority = task->priority; pushback = to->push_task(to, task); if (!pushback) _STARPU_TRACE_SCHED_COMPONENT_PUSH(from, to, task, priority); return pushback; } 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) { struct starpu_task *task = from->pull_task(from, to); if (task) _STARPU_TRACE_SCHED_COMPONENT_PULL(from, to, task); return task; } /* Pump mechanic to get the task flow rolling. Takes tasks from component and send them to the child. To be used by components with only one child */ struct starpu_task* starpu_sched_component_pump_to(struct starpu_sched_component *component, struct starpu_sched_component *child, int* success) { int ret = 0; struct starpu_task * task; while (1) { task = component->pull_task(component,child); if (!task) break; ret = starpu_sched_component_push_task(component,child,task); if (ret) break; if(success) * success = 1; } if(task && ret) /* Return the task which couldn't actually be pushed */ return task; return NULL; } struct starpu_task* starpu_sched_component_pump_downstream(struct starpu_sched_component *component, int* success) { STARPU_ASSERT(component->nchildren == 1); return starpu_sched_component_pump_to(component, component->children[0], success); } 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_COMPONENT_MUTEX_LOCK(&t->lock); _starpu_sched_component_lock_all_workers(); 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(); STARPU_COMPONENT_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_COMPONENT_MUTEX_LOCK(&t->lock); _starpu_sched_component_lock_all_workers(); 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(); STARPU_COMPONENT_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_CALLOC(t, 1, 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]; } void starpu_sched_tree_deinitialize(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); } /****************************************************************************** * 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_simple_worker(component)); unsigned 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_simple_worker(component)); unsigned 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); unsigned 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); unsigned 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 */ struct starpu_task * starpu_sched_component_parents_pull_task(struct starpu_sched_component * component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { STARPU_ASSERT(component); struct starpu_task * task = NULL; unsigned 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. */ int starpu_sched_component_can_push(struct starpu_sched_component * component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { STARPU_ASSERT(component); int ret = 0; if(component->nparents > 0) { unsigned i; for(i=0; i < component->nparents; i++) { struct starpu_sched_component * parent = component->parents[i]; if(parent != NULL) ret = parent->can_push(parent, component); 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. */ int starpu_sched_component_can_pull(struct starpu_sched_component * component) { STARPU_ASSERT(component); STARPU_ASSERT(!starpu_sched_component_is_worker(component)); unsigned i; for(i = 0; i < component->nchildren; i++) { if (component->children[i]->can_pull(component->children[i])) return 1; } return 0; } /* 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. */ int starpu_sched_component_can_pull_all(struct starpu_sched_component * component) { STARPU_ASSERT(component); STARPU_ASSERT(!starpu_sched_component_is_worker(component)); unsigned i; for(i = 0; i < component->nchildren; i++) component->children[i]->can_pull(component->children[i]); return 0; } /* Alternative can_pull which says that this component does not want to pull but prefers that you push. It can be used by decision components, in which decisions are usually taken in their push() functions */ int starpu_sched_component_send_can_push_to_parents(struct starpu_sched_component * component) { STARPU_ASSERT(component); STARPU_ASSERT(!starpu_sched_component_is_worker(component)); unsigned i; int ret = 0; for(i=0; i < component->nparents; i++) { if(component->parents[i] == NULL) continue; else { ret = component->parents[i]->can_push(component->parents[i], component); if(ret) break; } } return ret != 0; } double starpu_sched_component_estimated_load(struct starpu_sched_component * component) { double sum = 0.0; unsigned 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_add(struct starpu_sched_component * component, double exp_len) { STARPU_ASSERT(component); double min = DBL_MAX; unsigned i; double ends[component->nchildren]; for(i = 0; i < component->nchildren; i++) { double tmp = ends[i] = component->children[i]->estimated_end(component->children[i]); if(tmp < min) min = tmp; } if (exp_len > 0) { /* We don't know which workers will do this, assume it will be * evenly distributed to existing work */ int card = starpu_bitmap_cardinal(component->workers_in_ctx); if (card == 0) /* Oops, no resources to compute our tasks. Let's just hope that * we will be given one at some point */ card = 1; for(i = 0; i < component->nchildren; i++) { exp_len += ends[i] - min; } min += exp_len / card; } return min; } double starpu_sched_component_estimated_end_min(struct starpu_sched_component * component) { return starpu_sched_component_estimated_end_min_add(component, 0.); } double starpu_sched_component_estimated_end_average(struct starpu_sched_component * component) { STARPU_ASSERT(component); double sum = 0.0; unsigned 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_CALLOC(component, 1, 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_min; 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.3.9+dfsg/src/sched_policies/component_stage.c000066400000000000000000000045351413463044200230660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 component takes tasks from its parents in the parent order. * It can be useful to make scheduling stages, pushing tasks of different stages * to different schedulers, and this component will pick them up in the right * order. */ #include #include static int stage_push_task(struct starpu_sched_component * component, struct starpu_task * task) { _STARPU_DISP("stage component is not supposed to be pushed to...\n"); STARPU_ASSERT(component->nchildren == 1); return starpu_sched_component_push_task(component, component->children[0], task); } static int stage_can_push(struct starpu_sched_component * component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { _STARPU_DISP("stage component is not supposed to be pushed to...\n"); return starpu_sched_component_can_push(component, to); } static struct starpu_task * stage_pull_task(struct starpu_sched_component * component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task; task = starpu_sched_component_parents_pull_task(component, to); return task; } int starpu_sched_component_is_stage(struct starpu_sched_component * component) { return component->push_task == stage_push_task; } struct starpu_sched_component * starpu_sched_component_stage_create(struct starpu_sched_tree *tree, void *args STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component *component = starpu_sched_component_create(tree, "stage"); component->push_task = stage_push_task; /* The default implementation happens to be doing staged pull from parents */ component->pull_task = stage_pull_task; component->can_push = stage_can_push; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_userchoice.c000066400000000000000000000043401413463044200241060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 component uses (uintptr_t) tasks->sched_data as the child number it * should push its tasks to. It can thus be used to let the user choose which * scheduler a task should go to. */ #include #include static int userchoice_push_task(struct starpu_sched_component * component, struct starpu_task * task) { unsigned target = (uintptr_t) task->sched_data; STARPU_ASSERT(target < component->nchildren); return starpu_sched_component_push_task(component, component->children[target], task); } static struct starpu_task * userchoice_pull_task(struct starpu_sched_component * component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { _STARPU_DISP("stage component is not supposed to be pull from...\n"); return starpu_sched_component_parents_pull_task(component, to); } static int userchoice_can_pull(struct starpu_sched_component * component) { _STARPU_DISP("stage component is not supposed to be pull from...\n"); return starpu_sched_component_can_pull(component); } int starpu_sched_component_is_userchoice(struct starpu_sched_component * component) { return component->push_task == userchoice_push_task; } struct starpu_sched_component * starpu_sched_component_userchoice_create(struct starpu_sched_tree *tree, void *args STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component *component = starpu_sched_component_create(tree, "userchoice"); component->push_task = userchoice_push_task; component->pull_task = userchoice_pull_task; component->can_pull = userchoice_can_pull; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_work_stealing.c000066400000000000000000000303141413463044200246250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 #include #include "prio_deque.h" #ifdef STARPU_DEVEL #warning TODO: locality work-stealing #endif struct _starpu_component_work_stealing_data_per_worker { struct _starpu_prio_deque fifo; unsigned last_pop_child; }; struct _starpu_component_work_stealing_data { /* keep track of the work performed from the beginning of the algorithm to make * better decisions about which queue to child when stealing or deferring work */ struct _starpu_component_work_stealing_data_per_worker *per_worker; unsigned performed_total, last_push_child; starpu_pthread_mutex_t ** mutexes; unsigned size; }; /** * steal a task in a round robin way * return NULL if none available */ static struct starpu_task * steal_task_round_robin(struct starpu_sched_component *component, int workerid) { struct _starpu_component_work_stealing_data *wsd = component->data; unsigned i = wsd->per_worker[workerid].last_pop_child; wsd->per_worker[workerid].last_pop_child = (i + 1) % component->nchildren; /* If the worker's queue have no suitable tasks, let's try * the next ones */ struct starpu_task * task = NULL; while (1) { struct _starpu_prio_deque * fifo = &wsd->per_worker[i].fifo; STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); task = _starpu_prio_deque_deque_task_for_worker(fifo, workerid, NULL); if(task && !isnan(task->predicted)) { fifo->exp_len -= task->predicted; fifo->nprocessed--; } STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); if(task) { starpu_sched_task_break(task); break; } if (i == wsd->per_worker[workerid].last_pop_child) { /* We got back to the first worker, * don't go in infinite loop */ return NULL; } i = (i + 1) % component->nchildren; } return task; } /** * 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_sched_component * component) { struct _starpu_component_work_stealing_data *ws = (struct _starpu_component_work_stealing_data*)component->data; unsigned i = (ws->last_push_child + 1) % component->nchildren ; ws->last_push_child = i; return i; } /** * 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 struct starpu_task * steal_task(struct starpu_sched_component * component, int workerid) { return steal_task_round_robin(component, workerid); } /** * 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_sched_component * component) { return select_worker_round_robin(component); } static int is_worker_of_component(struct starpu_sched_component * component, int workerid) { return starpu_bitmap_get(component->workers, workerid); } static struct starpu_task * pull_task(struct starpu_sched_component * component, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { unsigned workerid = starpu_worker_get_id_check(); unsigned i; for(i = 0; i < component->nchildren; i++) { if(is_worker_of_component(component->children[i], workerid)) break; } STARPU_ASSERT(i < component->nchildren); struct _starpu_component_work_stealing_data * wsd = component->data; const double now = starpu_timing_now(); STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); struct starpu_task * task = _starpu_prio_deque_pop_task(&wsd->per_worker[i].fifo); if(task) { if(!isnan(task->predicted)) { wsd->per_worker[i].fifo.exp_len -= task->predicted; wsd->per_worker[i].fifo.exp_start = now + task->predicted; } } else wsd->per_worker[i].fifo.exp_len = 0.0; STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); if(task) { return task; } task = steal_task(component, workerid); if(task) { STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); wsd->per_worker[i].fifo.nprocessed++; STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); return task; } 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) return task; else return NULL; } static double _ws_estimated_end(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_work_stealing(component)); struct _starpu_component_work_stealing_data * wsd = component->data; double sum_len = 0.0; double sum_start = 0.0; unsigned i; const double now = starpu_timing_now(); for(i = 0; i < component->nchildren; i++) { STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); sum_len += wsd->per_worker[i].fifo.exp_len; wsd->per_worker[i].fifo.exp_start = STARPU_MAX(now, wsd->per_worker[i].fifo.exp_start); sum_start += wsd->per_worker[i].fifo.exp_start; STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); } int nb_workers = starpu_bitmap_cardinal(component->workers_in_ctx); return (sum_start + sum_len) / nb_workers; } static double _ws_estimated_load(struct starpu_sched_component * component) { STARPU_ASSERT(starpu_sched_component_is_work_stealing(component)); struct _starpu_component_work_stealing_data * wsd = component->data; int ntasks = 0; unsigned i; for(i = 0; i < component->nchildren; i++) { STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); ntasks += wsd->per_worker[i].fifo.ntasks; STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); } double speedup = 0.0; int workerid; for(workerid = starpu_bitmap_first(component->workers_in_ctx); -1 != workerid; workerid = starpu_bitmap_next(component->workers_in_ctx, workerid)) { speedup += starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(workerid, component->tree->sched_ctx_id)); } return ntasks / speedup; } static int push_task(struct starpu_sched_component * component, struct starpu_task * task) { struct _starpu_component_work_stealing_data * wsd = component->data; int ret; unsigned i = wsd->last_push_child; int found = 0; /* Find a child component that can execute this task */ i = (i+1)%component->nchildren; while(1) { int workerid; for(workerid = starpu_bitmap_first(component->children[i]->workers_in_ctx); -1 != workerid; workerid = starpu_bitmap_next(component->children[i]->workers_in_ctx, workerid)) { unsigned impl; int can_execute = starpu_worker_can_execute_task_first_impl(workerid, task, &impl); if (can_execute) { /* Found one, set the implementation by the way */ starpu_task_set_implementation(task, impl); found = 1; break; } } if (found) break; STARPU_ASSERT_MSG(i != wsd->last_push_child, "Could not find child able to execute this task"); i = (i+1)%component->nchildren; } STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); starpu_sched_task_break(task); ret = _starpu_prio_deque_push_front_task(&wsd->per_worker[i].fifo, task); STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); wsd->last_push_child = i; starpu_sched_component_can_pull_all(component); return ret; } //this function is special, when a worker call it, we want to push the task in his fifo int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task) { int workerid = starpu_worker_get_id(); if(workerid == -1) return starpu_sched_tree_push_task(task); /* Check that we can execute it */ unsigned impl; int can_execute = starpu_worker_can_execute_task_first_impl(workerid, task, &impl); if (!can_execute) return starpu_sched_tree_push_task(task); /* Ok, use that implementation */ starpu_task_set_implementation(task, impl); unsigned sched_ctx_id = task->sched_ctx; struct starpu_sched_component * component =starpu_sched_component_worker_get(sched_ctx_id, workerid); while(sched_ctx_id < component->nparents && component->parents[sched_ctx_id] != NULL) { component = component->parents[sched_ctx_id]; if(starpu_sched_component_is_work_stealing(component)) { if(!starpu_sched_component_can_execute_task(component, task)) return starpu_sched_tree_push_task(task); unsigned i; for(i = 0; i < component->nchildren; i++) if(is_worker_of_component(component->children[i], workerid)) break; STARPU_ASSERT(i < component->nchildren); struct _starpu_component_work_stealing_data * wsd = component->data; STARPU_COMPONENT_MUTEX_LOCK(wsd->mutexes[i]); int ret = _starpu_prio_deque_push_front_task(&wsd->per_worker[i].fifo , task); if(ret == 0 && !isnan(task->predicted)) wsd->per_worker[i].fifo.exp_len += task->predicted; STARPU_COMPONENT_MUTEX_UNLOCK(wsd->mutexes[i]); component->can_pull(component); return ret; } } return starpu_sched_tree_push_task(task); } static void _ws_add_child(struct starpu_sched_component * component, struct starpu_sched_component * child) { struct _starpu_component_work_stealing_data * wsd = component->data; starpu_sched_component_add_child(component, child); if(wsd->size < component->nchildren) { STARPU_ASSERT(wsd->size == component->nchildren - 1); _STARPU_REALLOC(wsd->per_worker, component->nchildren * sizeof(*wsd->per_worker)); _STARPU_REALLOC(wsd->mutexes, component->nchildren * sizeof(*wsd->mutexes)); wsd->size = component->nchildren; } wsd->per_worker[component->nchildren - 1].last_pop_child = 0; _starpu_prio_deque_init(&wsd->per_worker[component->nchildren - 1].fifo); starpu_pthread_mutex_t *mutex; _STARPU_MALLOC(mutex, sizeof(*mutex)); STARPU_PTHREAD_MUTEX_INIT(mutex,NULL); wsd->mutexes[component->nchildren - 1] = mutex; } static void _ws_remove_child(struct starpu_sched_component * component, struct starpu_sched_component * child) { struct _starpu_component_work_stealing_data * wsd = component->data; STARPU_PTHREAD_MUTEX_DESTROY(wsd->mutexes[component->nchildren - 1]); free(wsd->mutexes[component->nchildren - 1]); unsigned i_component; for(i_component = 0; i_component < component->nchildren; i_component++) { if(component->children[i_component] == child) break; } STARPU_ASSERT(i_component != component->nchildren); struct _starpu_prio_deque tmp_fifo = wsd->per_worker[i_component].fifo; wsd->per_worker[i_component].fifo = wsd->per_worker[component->nchildren - 1].fifo; component->children[i_component] = component->children[component->nchildren - 1]; component->nchildren--; struct starpu_task * task; while ((task = _starpu_prio_deque_pop_task(&tmp_fifo))) { starpu_sched_component_push_task(NULL, component, task); } } static void _work_stealing_component_deinit_data(struct starpu_sched_component * component) { struct _starpu_component_work_stealing_data * wsd = component->data; free(wsd->per_worker); free(wsd->mutexes); free(wsd); } int starpu_sched_component_is_work_stealing(struct starpu_sched_component * component) { return component->push_task == push_task; } struct starpu_sched_component * starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg) { (void)arg; struct starpu_sched_component *component = starpu_sched_component_create(tree, "work_stealing"); struct _starpu_component_work_stealing_data *wsd; _STARPU_CALLOC(wsd, 1, sizeof(*wsd)); component->pull_task = pull_task; component->push_task = push_task; component->add_child = _ws_add_child; component->remove_child = _ws_remove_child; component->estimated_end = _ws_estimated_end; component->estimated_load = _ws_estimated_load; component->deinit_data = _work_stealing_component_deinit_data; component->data = wsd; return component; } starpu-1.3.9+dfsg/src/sched_policies/component_worker.c000066400000000000000000000670361413463044200233010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * 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; }; /* This is called when a transfer request is actually pushed to the worker */ static void _starpu_worker_task_list_transfer_started(struct _starpu_worker_task_list *l, struct starpu_task *task) { double transfer_model = task->predicted_transfer; if (isnan(transfer_model)) return; /* We now start the transfer, move it from predicted to pipelined */ l->exp_len -= transfer_model; l->pipeline_len += transfer_model; l->exp_start = starpu_timing_now() + l->pipeline_len; l->exp_end = l->exp_start + l->exp_len; } #ifdef STARPU_DEVEL #warning FIXME: merge with deque_modeling_policy_data_aware #endif /* This is called when a task is actually pushed to the worker (i.e. the transfer finished */ static void _starpu_worker_task_list_started(struct _starpu_worker_task_list *l, struct starpu_task *task) { double model = task->predicted; double transfer_model = task->predicted_transfer; if(!isnan(transfer_model)) /* The transfer is over, remove it from pipelined */ l->pipeline_len -= transfer_model; if(!isnan(model)) { /* We now start the computation, move it from predicted to pipelined */ l->exp_len -= model; l->pipeline_len += model; l->exp_start = starpu_timing_now() + l->pipeline_len; l->exp_end= l->exp_start + l->exp_len; } } /* This is called when a task is actually finished */ static void _starpu_worker_task_list_finished(struct _starpu_worker_task_list *l, struct starpu_task *task) { if(!isnan(task->predicted)) /* The execution is over, remove it from pipelined */ l->pipeline_len -= task->predicted; l->exp_start = STARPU_MAX(starpu_timing_now() + l->pipeline_len, l->exp_start); l->exp_end = l->exp_start + l->exp_len; } struct _starpu_worker_component_data { union { struct _starpu_worker * worker; struct { unsigned worker_size; unsigned workerids[STARPU_NMAXWORKERS]; } parallel_worker; }; struct _starpu_worker_task_list * list; }; /* 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(); /* These are only for statistics */ STARPU_HG_DISABLE_CHECKING(l->exp_end); STARPU_HG_DISABLE_CHECKING(l->exp_start); STARPU_HG_DISABLE_CHECKING(l->exp_len); STARPU_HG_DISABLE_CHECKING(l->pipeline_len); 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_add(struct _starpu_worker_task_list * l, struct starpu_task *task) { double predicted = task->predicted; double predicted_transfer = task->predicted_transfer; double end = l->exp_end; const double now = starpu_timing_now(); /* Sometimes workers didn't take the tasks as early as we expected */ l->exp_start = STARPU_MAX(l->exp_start, now); if (now + predicted_transfer < 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 = (now + predicted_transfer) - end; } if(!isnan(predicted_transfer)) l->exp_len += predicted_transfer; if(!isnan(predicted)) l->exp_len += predicted; l->exp_end = l->exp_start + l->exp_len; task->predicted = predicted; task->predicted_transfer = predicted_transfer; } 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++; _starpu_worker_task_list_add(l, t->task); } /* 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_len = l->pipeline_len = 0.0; l->exp_start = l->exp_end = starpu_timing_now(); 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; } /****************************************************************************** * Worker Components' Private Helper Functions * *****************************************************************************/ #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 int simple_worker_can_pull(struct starpu_sched_component * worker_component) { struct _starpu_worker * worker = _starpu_sched_component_worker_get_worker(worker_component); int workerid = worker->workerid; return starpu_wake_worker_relax_light(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) starpu_prefetch_task_input_for(task, task->workerid); #endif struct _starpu_worker_task_list * list = data->list; STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); _starpu_worker_task_list_push(list, t); STARPU_COMPONENT_MUTEX_UNLOCK(&list->mutex); simple_worker_can_pull(component); return 0; } static struct starpu_task * simple_worker_pull_task(struct starpu_sched_component *component, struct starpu_sched_component * to) { unsigned workerid = starpu_worker_get_id_check(); struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_worker_component_data * data = component->data; struct _starpu_worker_task_list * list = data->list; struct starpu_task * task; unsigned i; int n_tries = 0; do { const double now = starpu_timing_now(); /* do not reset state_keep_awake here has it may hide tasks in worker->local_tasks */ n_tries++; STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); /* Take the opportunity to update start time */ data->list->exp_start = STARPU_MAX(now, data->list->exp_start); data->list->exp_end = data->list->exp_start + data->list->exp_len; task = _starpu_worker_task_list_pop(list); if(task) { _starpu_worker_task_list_transfer_started(list, task); starpu_push_task_end(task); STARPU_COMPONENT_MUTEX_UNLOCK(&list->mutex); goto ret; } STARPU_COMPONENT_MUTEX_UNLOCK(&list->mutex); 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; } } } while((!task) && worker->state_keep_awake && n_tries < 2); if(!task) goto ret; if(task->cl->type == STARPU_SPMD) { if(!starpu_worker_is_combined_worker(workerid)) { STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); _starpu_worker_task_list_add(list, task); _starpu_worker_task_list_transfer_started(list, task); starpu_push_task_end(task); STARPU_COMPONENT_MUTEX_UNLOCK(&list->mutex); goto ret; } 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 */ task = simple_worker_pull_task(component, to); goto ret; } if(task) { STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); _starpu_worker_task_list_add(list, task); _starpu_worker_task_list_transfer_started(list, task); starpu_push_task_end(task); STARPU_COMPONENT_MUTEX_UNLOCK(&list->mutex); } ret: return task; } static double simple_worker_estimated_end(struct starpu_sched_component * component) { struct _starpu_worker_component_data * data = component->data; double now = starpu_timing_now(); if (now + data->list->pipeline_len > data->list->exp_start ) { data->list->exp_start = now + data->list->pipeline_len; data->list->exp_end = data->list->exp_start + data->list->exp_len; } return data->list->exp_end; } 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_COMPONENT_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_COMPONENT_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); 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; 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->pu_depth, worker->bindid); STARPU_ASSERT(obj); component->obj = obj; #endif */ return component; } /****************************************************************************** * Combined Worker Components' Interface Functions * *****************************************************************************/ static int 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; int workerid = starpu_worker_get_id(); unsigned i; for(i = 0; i < data->parallel_worker.worker_size; i++) { int target = data->parallel_worker.workerids[i]; if(target == workerid) continue; if (starpu_wake_worker_relax_light(target)) return 1; } return 0; } 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->parallel_worker.worker_size >= 1); struct _starpu_task_grid * task_alias[data->parallel_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 = data->parallel_worker.workerids[0]; task_alias[0]->task->destroy = 1; task_alias[0]->left = NULL; task_alias[0]->ntasks = data->parallel_worker.worker_size; _STARPU_TRACE_JOB_PUSH(task_alias[0]->task, task_alias[0]->task->priority > 0); unsigned i; for(i = 1; i < data->parallel_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 = data->parallel_worker.workerids[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_TRACE_JOB_PUSH(task_alias[i]->task, task_alias[i]->task->priority > 0); } 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, data->parallel_worker.workerids[i]); struct _starpu_worker_component_data * worker_data = worker_component->data; struct _starpu_worker_task_list * list = worker_data->list; STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); if(mutex_to_unlock) STARPU_COMPONENT_MUTEX_UNLOCK(mutex_to_unlock); mutex_to_unlock = &list->mutex; _starpu_worker_task_list_push(list, task_alias[i]); i++; } while(i < data->parallel_worker.worker_size); STARPU_COMPONENT_MUTEX_UNLOCK(mutex_to_unlock); int workerid = starpu_worker_get_id(); if(-1 == workerid) { combined_worker_can_pull(component); } else { /* wake up all other workers of combined worker */ for(i = 0; i < data->parallel_worker.worker_size; i++) { struct starpu_sched_component * worker_component = starpu_sched_component_worker_get(component->tree->sched_ctx_id, data->parallel_worker.workerids[i]); simple_worker_can_pull(worker_component); } combined_worker_can_pull(component); } return 0; } static struct starpu_task *combined_worker_pull_task(struct starpu_sched_component * from STARPU_ATTRIBUTE_UNUSED, struct starpu_sched_component * to STARPU_ATTRIBUTE_UNUSED) { return NULL; } 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 * d = component->data; double max = 0.0; unsigned i; for(i = 0; i < d->parallel_worker.worker_size; i++) { struct _starpu_worker_component_data * data; data = _worker_components[component->tree->sched_ctx_id][d->parallel_worker.workerids[i]]->data; double tmp = data->list->exp_end; 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; double load = 0; unsigned i; for(i = 0; i < d->parallel_worker.worker_size; i++) { struct starpu_sched_component * n = starpu_sched_component_worker_get(component->tree->sched_ctx_id, d->parallel_worker.workerids[i]); load += n->estimated_load(n); } return load; } struct starpu_sched_component *starpu_sched_component_parallel_worker_create(struct starpu_sched_tree *tree, unsigned nworkers, unsigned *workers) { 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)); STARPU_ASSERT(nworkers <= STARPU_NMAXWORKERS); STARPU_ASSERT(nworkers <= starpu_worker_get_count()); data->parallel_worker.worker_size = nworkers; memcpy(data->parallel_worker.workerids, workers, nworkers * sizeof(unsigned)); component->data = data; component->push_task = combined_worker_push_task; component->pull_task = combined_worker_pull_task; 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; unsigned i; for (i = 0; i < nworkers; i++) starpu_sched_component_connect(component, starpu_sched_component_worker_get(tree->sched_ctx_id, workers[i])); return component; } 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_parallel_worker_create(tree, combined_worker->worker_size, (unsigned *) combined_worker->combined_workerid); 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_worker_component_data * data = component->data; struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; struct _starpu_worker *worker = _starpu_get_worker_struct(data->parallel_worker.workerids[0]); hwloc_obj_t obj = hwloc_get_obj_by_depth(topology->hwtopology, config->pu_depth, worker->bindid); STARPU_ASSERT(obj); component->obj = obj; #endif */ return component; } /****************************************************************************** * Worker Components' Public Helper Functions (Part 2) * *****************************************************************************/ void _starpu_sched_component_lock_all_workers(void) { unsigned i; for(i = 0; i < starpu_worker_get_count(); i++) starpu_worker_lock(i); } void _starpu_sched_component_unlock_all_workers(void) { unsigned i; for(i = 0; i < starpu_worker_get_count(); i++) starpu_worker_unlock(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, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { struct _starpu_worker_task_list * list = _worker_get_list(sched_ctx_id); const double now = starpu_timing_now(); STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); _starpu_worker_task_list_started(list, task); /* Take the opportunity to update start time */ list->exp_start = STARPU_MAX(now + list->pipeline_len, list->exp_start); STARPU_COMPONENT_MUTEX_UNLOCK(&list->mutex); } void starpu_sched_component_worker_post_exec_hook(struct starpu_task * task, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { if(task->execute_on_a_specific_worker) return; struct _starpu_worker_task_list * list = _worker_get_list(sched_ctx_id); STARPU_COMPONENT_MUTEX_LOCK(&list->mutex); _starpu_worker_task_list_finished(list, task); STARPU_COMPONENT_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 starpu_sched_component_worker_new(sched_ctx, workerid); return _worker_components[sched_ctx][workerid]; } struct starpu_sched_component * starpu_sched_component_worker_new(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]; 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.3.9+dfsg/src/sched_policies/deque_modeling_policy_data_aware.c000066400000000000000000001074371413463044200264160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Joris Pablo * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2013 Thibaut Lambert * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include #ifndef DBL_MIN #define DBL_MIN __DBL_MIN__ #endif #ifndef DBL_MAX #define DBL_MAX __DBL_MAX__ #endif //#define NOTIFY_READY_SOON 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 /* This is called when a transfer request is actually pushed to the worker */ static void _starpu_fifo_task_transfer_started(struct _starpu_fifo_taskq *fifo, struct starpu_task *task, int num_priorities) { double transfer_model = task->predicted_transfer; if (isnan(transfer_model)) return; /* We now start the transfer, move it from predicted to pipelined */ fifo->exp_len -= transfer_model; fifo->pipeline_len += transfer_model; fifo->exp_start = starpu_timing_now() + fifo->pipeline_len; fifo->exp_end = fifo->exp_start + fifo->exp_len; if(num_priorities != -1) { int i; int task_prio = _starpu_normalize_prio(task->priority, num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] -= transfer_model; } } /* This is called when a task is actually pushed to the worker (i.e. the transfer finished */ static void _starpu_fifo_task_started(struct _starpu_fifo_taskq *fifo, struct starpu_task *task, int num_priorities) { double model = task->predicted; double transfer_model = task->predicted_transfer; if(!isnan(transfer_model)) /* The transfer is over, remove it from pipelined */ fifo->pipeline_len -= transfer_model; if(!isnan(model)) { /* We now start the computation, move it from predicted to pipelined */ fifo->exp_len -= model; fifo->pipeline_len += model; fifo->exp_start = starpu_timing_now() + fifo->pipeline_len; fifo->exp_end= fifo->exp_start + fifo->exp_len; if(num_priorities != -1) { int i; int task_prio = _starpu_normalize_prio(task->priority, num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] -= model; } } } /* This is called when a task is actually finished */ static void _starpu_fifo_task_finished(struct _starpu_fifo_taskq *fifo, struct starpu_task *task, int num_priorities STARPU_ATTRIBUTE_UNUSED) { if(!isnan(task->predicted)) /* The execution is over, remove it from pipelined */ fifo->pipeline_len -= task->predicted; fifo->exp_start = STARPU_MAX(starpu_timing_now() + fifo->pipeline_len, fifo->exp_start); fifo->exp_end = fifo->exp_start + fifo->exp_len; } 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]; /* 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, workerid, dt->num_priorities); if (task) { _starpu_fifo_task_transfer_started(fifo, task, dt->num_priorities); starpu_sched_ctx_list_task_counters_decrement(sched_ctx_id, workerid); #ifdef STARPU_VERBOSE if (task->cl) { int non_ready = _starpu_count_non_ready_buffers(task, workerid); 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) { _starpu_fifo_task_transfer_started(fifo, task, dt->num_priorities); starpu_sched_ctx_list_task_counters_decrement(sched_ctx_id, workerid); #ifdef STARPU_VERBOSE if (task->cl) { int non_ready = _starpu_count_non_ready_buffers(task, 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, *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_worker_lock_self(); new_list = _starpu_fifo_pop_every_task(fifo, workerid); starpu_worker_unlock_self(); starpu_sched_ctx_list_task_counters_reset(sched_ctx_id, workerid); for (task = new_list; task; task = task->next) _starpu_fifo_task_transfer_started(fifo, task, dt->num_priorities); 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 could execute that task ! */ STARPU_ASSERT(best_workerid != -1); if (_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); if (_starpu_sched_ctx_worker_is_master_for_child_ctx(sched_ctx_id, best_workerid, task)) task = NULL; _starpu_sched_ctx_unlock_write(sched_ctx_id); if (!task) return 0; } struct _starpu_fifo_taskq *fifo = dt->queue_array[best_workerid]; double now = starpu_timing_now(); #ifdef STARPU_USE_SC_HYPERVISOR starpu_sched_ctx_call_pushed_task_cb(best_workerid, sched_ctx_id); #endif //STARPU_USE_SC_HYPERVISOR starpu_worker_lock(best_workerid); /* Sometimes workers didn't take the tasks as early as we expected */ fifo->exp_start = isnan(fifo->exp_start) ? now + fifo->pipeline_len : STARPU_MAX(fifo->exp_start, now); fifo->exp_end = fifo->exp_start + fifo->exp_len; if ((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 = (now + predicted_transfer) - fifo->exp_end; } if(!isnan(predicted_transfer)) { fifo->exp_len += predicted_transfer; if(dt->num_priorities != -1) { int i; int task_prio = _starpu_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_len += predicted; if(dt->num_priorities != -1) { int i; int task_prio = _starpu_normalize_prio(task->priority, dt->num_priorities, task->sched_ctx); for(i = 0; i <= task_prio; i++) fifo->exp_len_per_priority[i] += predicted; } } fifo->exp_end = fifo->exp_start + fifo->exp_len; starpu_worker_unlock(best_workerid); task->predicted = predicted; task->predicted_transfer = predicted_transfer; if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_for(task, best_workerid); STARPU_AYU_ADDTOTASKQUEUE(starpu_task_get_job_id(task), best_workerid); if (_starpu_get_nsched_ctxs() > 1) { unsigned stream_ctx_id = starpu_worker_get_sched_ctx_id_stream(best_workerid); if(stream_ctx_id != STARPU_NMAX_SCHED_CTXS) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); starpu_sched_ctx_move_task_to_ctx_locked(task, stream_ctx_id, 0); starpu_sched_ctx_revert_task_counters_ctx_locked(sched_ctx_id, task->flops); _starpu_sched_ctx_unlock_write(sched_ctx_id); } } int ret = 0; if (prio) { starpu_worker_lock(best_workerid); ret =_starpu_fifo_push_sorted_task(dt->queue_array[best_workerid], task); if(dt->num_priorities != -1) { int i; int task_prio = _starpu_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_wake_worker_locked(best_workerid); #endif starpu_push_task_end(task); starpu_worker_unlock(best_workerid); } else { starpu_worker_lock(best_workerid); 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_wake_worker_locked(best_workerid); #endif starpu_push_task_end(task); starpu_worker_unlock(best_workerid); } starpu_sched_ctx_list_task_counters_increment(sched_ctx_id, best_workerid); return ret; } /* 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_ctx = 0; 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 = _starpu_normalize_prio(task->priority, dt->num_priorities, sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); double now = starpu_timing_now(); struct starpu_sched_ctx_iterator it; workers->init_iterator_for_parallel_tasks(workers, &it, task); while(worker_ctxhas_next(workers, &it)) { unsigned nimpl; unsigned impl_mask; unsigned workerid = workers->get_next(workers, &it); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; struct starpu_perfmodel_arch* perf_arch = starpu_worker_get_perf_archtype(workerid, sched_ctx_id); unsigned memory_node = starpu_worker_get_memory_node(workerid); STARPU_ASSERT_MSG(fifo != NULL, "workerid %u ctx %u\n", workerid, sched_ctx_id); /* Sometimes workers didn't take the tasks as early as we expected */ double exp_start = isnan(fifo->exp_start) ? now + fifo->pipeline_len : STARPU_MAX(fifo->exp_start, now); if (!starpu_worker_can_execute_task_impl(workerid, 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 workerid 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_worker_lock(workerid); prev_exp_len = _starpu_fifo_get_exp_len_prev_task_list(fifo, task, workerid, nimpl, &fifo_ntasks); starpu_worker_unlock(workerid); } } 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) workerid (%u) kernel (%u) \n", local_task_length[workerid][nimpl],workerid,nimpl); if (bundle) { /* TODO : conversion time */ local_task_length[worker_ctx][nimpl] = starpu_task_bundle_expected_length(bundle, perf_arch, nimpl); if (local_data_penalty) local_data_penalty[worker_ctx][nimpl] = starpu_task_bundle_expected_data_transfer_time(bundle, memory_node); if (local_energy) 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); if (local_data_penalty) local_data_penalty[worker_ctx][nimpl] = starpu_task_expected_data_transfer_time_for(task, workerid); if (local_energy) 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 workerid, 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 workerid 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 = workerid; 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; double task_starting_time = exp_start + prev_exp_len; if (local_data_penalty) task_starting_time = STARPU_MAX(task_starting_time, now + local_data_penalty[worker_ctx][nimpl]); exp_end[worker_ctx][nimpl] = task_starting_time + 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 (local_energy) 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 da, unsigned simulate, unsigned sorted_decision) { /* find the queue */ 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, da ? local_data_penalty : NULL, da ? local_energy : NULL, &forced_best, &forced_impl, sched_ctx_id, sorted_decision); if (forced_best == -1) { double best_fitness = -1; unsigned worker_ctx = 0; struct starpu_sched_ctx_iterator it; workers->init_iterator_for_parallel_tasks(workers, &it, task); while(worker_ctx < nworkers_ctx && workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); unsigned nimpl; unsigned impl_mask; 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; } if (da) 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]); else fitness[worker_ctx][nimpl] = exp_end[worker_ctx][nimpl] - best_exp_end; if (da && 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); if (da) transfer_model_best = starpu_task_expected_data_transfer_time(memory_node, task); } else { model_best = local_task_length[best_in_ctx][selected_impl]; if (da) transfer_model_best = local_data_penalty[best_in_ctx][selected_impl]; } //_STARPU_DEBUG("Scheduler dmda: kernel (%u)\n", selected_impl); starpu_task_set_implementation(task, selected_impl); starpu_sched_task_break(task); 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 { 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, 1, 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, 1, 0, 0); } static int dm_push_task(struct starpu_task *task) { return _dmda_push_task(task, 0, task->sched_ctx, 0, 0, 0); } static double dm_simulate_push_task(struct starpu_task *task) { return _dmda_push_task(task, 0, task->sched_ctx, 0, 1, 0); } static int dmda_push_task(struct starpu_task *task) { STARPU_ASSERT(task); return _dmda_push_task(task, 0, task->sched_ctx, 1, 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, 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, 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, 1); } #ifdef NOTIFY_READY_SOON static void dmda_notify_ready_soon(void *data STARPU_ATTRIBUTE_UNUSED, struct starpu_task *task, double delay) { if (!task->cl) return; /* fprintf(stderr, "task %lu %p %p %s %s will be ready within %f\n", starpu_task_get_job_id(task), task, task->cl, task->cl->name, task->cl->model?task->cl->model->symbol : NULL, delay); */ /* TODO: do something with it */ } #endif 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); unsigned i; for (i = 0; i < nworkers; i++) { int 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) { 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); /* data->_gamma: cost of one Joule in us. If gamma is set to 10^6, then one Joule cost 1s */ #ifdef STARPU_NON_BLOCKING_DRIVERS if (starpu_getenv("STARPU_SCHED_GAMMA")) _STARPU_DISP("Warning: STARPU_SCHED_GAMMA was used, but --enable-blocking-drivers configuration was not set, CPU cores will not actually be sleeping\n"); #endif 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 NOTIFY_READY_SOON starpu_task_notify_ready_soon_register(dmda_notify_ready_soon, dt); #endif } 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); } /* 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) { 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]; const double now = starpu_timing_now(); /* Once the task is executing, we can update the predicted amount * of work. */ starpu_worker_lock_self(); _starpu_fifo_task_started(fifo, task, dt->num_priorities); /* Take the opportunity to update start time */ fifo->exp_start = STARPU_MAX(now + fifo->pipeline_len, fifo->exp_start); fifo->exp_end = fifo->exp_start + fifo->exp_len; starpu_worker_unlock_self(); } static void _dm_push_task_notify(struct starpu_task *task, int workerid, int perf_workerid, unsigned sched_ctx_id, int da) { 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); double predicted = starpu_task_expected_length(task, perf_arch, starpu_task_get_implementation(task)); double predicted_transfer = NAN; if (da) predicted_transfer = starpu_task_expected_data_transfer_time_for(task, workerid); double now = starpu_timing_now(); /* Update the predictions */ starpu_worker_lock(workerid); /* Sometimes workers didn't take the tasks as early as we expected */ fifo->exp_start = isnan(fifo->exp_start) ? now + fifo->pipeline_len : STARPU_MAX(fifo->exp_start, now); fifo->exp_end = fifo->exp_start + fifo->exp_len; if (da) { /* If there is no prediction available, we consider the task has a null length */ if (!isnan(predicted_transfer)) { if (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 = (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 = _starpu_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 = _starpu_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 = _starpu_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_worker_unlock(workerid); } static void dm_push_task_notify(struct starpu_task *task, int workerid, int perf_workerid, unsigned sched_ctx_id) { _dm_push_task_notify(task, workerid, perf_workerid, sched_ctx_id, 0); } static void dmda_push_task_notify(struct starpu_task *task, int workerid, int perf_workerid, unsigned sched_ctx_id) { _dm_push_task_notify(task, workerid, perf_workerid, sched_ctx_id, 1); } static void dmda_post_exec_hook(struct starpu_task * task, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned workerid = starpu_worker_get_id_check(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; starpu_worker_lock_self(); _starpu_fifo_task_finished(fifo, task, dt->num_priorities); starpu_worker_unlock_self(); } 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 = dm_simulate_push_task, .push_task_notify = dm_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 = "dm", .policy_description = "performance model", .worker_type = STARPU_WORKER_LIST, }; 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", .worker_type = STARPU_WORKER_LIST, }; struct starpu_sched_policy _starpu_sched_dmda_prio_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_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmdap", .policy_description = "data-aware performance model (priority)", .worker_type = STARPU_WORKER_LIST, }; 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)", .worker_type = STARPU_WORKER_LIST, }; 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)", .worker_type = STARPU_WORKER_LIST, }; 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)", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/eager_central_policy.c000066400000000000000000000164051413463044200240520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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) { struct _starpu_eager_center_policy_data *data; _STARPU_MALLOC(data, sizeof(struct _starpu_eager_center_policy_data)); /* 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) { struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_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_bitmap_destroy(data->waiters); 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); starpu_task_list_push_back(&data->fifo->taskq,task); data->fifo->ntasks++; data->fifo->nprocessed++; if (_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); starpu_sched_ctx_list_task_counters_increment_all_ctx_locked(task, sched_ctx_id); _starpu_sched_ctx_unlock_write(sched_ctx_id); } 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_for_parallel_tasks(workers, &it, task); 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); #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_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); if (dowake[worker]) if (starpu_wake_worker_relax_light(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); starpu_sched_ctx_list_task_counters_reset_all(task, sched_ctx_id); 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); /* 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); 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 &&_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); starpu_sched_ctx_list_task_counters_decrement_all_ctx_locked(chosen_task, sched_ctx_id); if (_starpu_sched_ctx_worker_is_master_for_child_ctx(sched_ctx_id, workerid, chosen_task)) chosen_task = NULL; _starpu_sched_ctx_unlock_write(sched_ctx_id); } return chosen_task; } static void eager_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_locked(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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/eager_central_priority_policy.c000066400000000000000000000174451413463044200260200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 * * TODO: merge with eager, after checking the scalability */ #include #include #include #include "prio_deque.h" #include #include #include struct _starpu_eager_central_prio_data { struct _starpu_prio_deque taskq; starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; }; /* * Centralized queue with priorities */ static void initialize_eager_center_priority_policy(unsigned sched_ctx_id) { struct _starpu_eager_central_prio_data *data; _STARPU_MALLOC(data, sizeof(struct _starpu_eager_central_prio_data)); /* only a single queue (even though there are several internaly) */ _starpu_prio_deque_init(&data->taskq); 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.ntasks); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); /* 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_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_prio_deque_destroy(&data->taskq); starpu_bitmap_destroy(data->waiters); 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_prio_deque *taskq = &data->taskq; starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); _starpu_prio_deque_push_back_task(taskq, task); if (_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); starpu_sched_ctx_list_task_counters_increment_all_ctx_locked(task, sched_ctx_id); _starpu_sched_ctx_unlock_write(sched_ctx_id); } 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_for_parallel_tasks(workers, &it, task); 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); #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)) { unsigned worker = workers->get_next(workers, &it); if (dowake[worker]) if (starpu_wake_worker_relax_light(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; 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_prio_deque *taskq = &data->taskq; /* 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(taskq)) { 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); chosen_task = _starpu_prio_deque_pop_task_for_worker(taskq, workerid, &skipped); 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_relax_light(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); if(chosen_task &&_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); starpu_sched_ctx_list_task_counters_decrement_all_ctx_locked(chosen_task, sched_ctx_id); if (_starpu_sched_ctx_worker_is_master_for_child_ctx(sched_ctx_id, workerid, chosen_task)) chosen_task = NULL; _starpu_sched_ctx_unlock_write(sched_ctx_id); } 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_locked(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)", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/fifo_queues.c000066400000000000000000000244121413463044200222070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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; fifo->pipeline_len = 0.0; STARPU_HG_DISABLE_CHECKING(fifo->exp_start); STARPU_HG_DISABLE_CHECKING(fifo->exp_len); STARPU_HG_DISABLE_CHECKING(fifo->exp_end); 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; } int _starpu_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); } size_t _starpu_size_non_ready_buffers(struct starpu_task *task, unsigned worker) { size_t cnt = 0; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle; unsigned buffer_node = _starpu_task_data_get_node_on_worker(task, index, worker); enum starpu_data_access_mode mode; handle = STARPU_TASK_GET_HANDLE(task, index); mode = STARPU_TASK_GET_MODE(task, index); int is_valid; starpu_data_query_status(handle, buffer_node, NULL, &is_valid, NULL); if (mode & STARPU_R && !is_valid) cnt+=starpu_data_get_size(handle); } return cnt; } int _starpu_count_non_ready_buffers(struct starpu_task *task, unsigned worker) { int cnt = 0; unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle; unsigned buffer_node = _starpu_task_data_get_node_on_worker(task, index, worker); handle = STARPU_TASK_GET_HANDLE(task, index); int is_valid; starpu_data_query_status(handle, buffer_node, NULL, &is_valid, NULL); if (!is_valid) cnt++; } return cnt; } struct starpu_task *_starpu_fifo_pop_first_ready_task(struct _starpu_fifo_taskq *fifo_queue, unsigned workerid, 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; size_t non_ready_best = SIZE_MAX; for (current = task; current; current = current->next) { int priority = current->priority; if (priority >= first_task_priority) { size_t non_ready = _starpu_size_non_ready_buffers(current, workerid); if (non_ready < non_ready_best) { non_ready_best = non_ready; task = current; if (non_ready == 0) break; } } } if(num_priorities != -1) { int i; int task_prio = _starpu_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; } starpu-1.3.9+dfsg/src/sched_policies/fifo_queues.h000066400000000000000000000062741413463044200222220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #include #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 */ double pipeline_len; /** the expected duration of what is already pushed to the worker */ }; 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); int _starpu_normalize_prio(int priority, int num_priorities, unsigned sched_ctx_id); int _starpu_count_non_ready_buffers(struct starpu_task *task, unsigned worker); size_t _starpu_size_non_ready_buffers(struct starpu_task *task, unsigned worker); struct starpu_task *_starpu_fifo_pop_first_ready_task(struct _starpu_fifo_taskq *fifo_queue, unsigned workerid, int num_priorities); #endif // __FIFO_QUEUES_H__ starpu-1.3.9+dfsg/src/sched_policies/graph_test_policy.c000066400000000000000000000276031413463044200234210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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) { 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_graph_record = 0; 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 */ 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 (!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.) { if (!task->cl || task->cl->model == NULL) { static unsigned _warned; STARPU_HG_DISABLE_CHECKING(_warned); if (STARPU_ATOMIC_ADD(&_warned, 1) == 1) { _STARPU_DISP("Warning: graph_test needs performance models for all tasks, including %s\n", starpu_task_get_name(task)); } else { (void)STARPU_ATOMIC_ADD(&_warned, -1); } } 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&node->mutex); starpu_worker_relax_off(); 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); if (data->descendants) _starpu_graph_compute_descendants(); else _starpu_graph_compute_depths(); if (data->computed == 0) { data->computed = 1; /* FIXME: if data->computed already == 1, some tasks may already have been pushed to priority stage '0' in * push_task_graph_test_policy, then if we change the priority here, the stage lookup to remove the task * will get the wrong stage */ _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! */ 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 */ unsigned 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 */ unsigned worker = workers->get_next(workers, &it); starpu_wake_worker_relax_light(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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); 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 */ 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_for_parallel_tasks(workers, &it, task); 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 (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_for_parallel_tasks(workers, &it, task); while(workers->has_next(workers, &it)) { unsigned worker = workers->get_next(workers, &it); if (dowake[worker]) { if (starpu_wake_worker_relax_light(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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); if (!data->computed) { STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return NULL; } chosen_task = _starpu_prio_deque_pop_task_for_worker(prio, workerid, NULL); 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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/helper_mct.c000066400000000000000000000162061413463044200220210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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" #include /* 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 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); #ifdef STARPU_NON_BLOCKING_DRIVERS if (starpu_getenv("STARPU_SCHED_GAMMA")) _STARPU_DISP("Warning: STARPU_SCHED_GAMMA was used, but --enable-blocking-drivers configuration was not set, CPU cores will not actually be sleeping\n"); #endif 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); } 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_MSG(now >= 0.0 && predicted_end >= 0.0 && predicted_length >= 0.0 && predicted_transfer >= 0.0, "now=%lf, predicted_end=%lf, predicted_length=%lf, predicted_transfer=%lf\n", now, predicted_end, predicted_length, predicted_transfer); /* TODO: actually schedule transfers */ /* Compute the transfer time which will not be overlapped */ /* However, no modification in calling function so that the whole transfer time is counted as a penalty */ 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) { if(isnan(local_energy)) /* Energy not calibrated yet, but we cannot do this * automatically anyway, so ignoring this for now */ local_energy = 0.; /* 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); } unsigned starpu_mct_compute_execution_times(struct starpu_sched_component *component, struct starpu_task *task, double *estimated_lengths, double *estimated_transfer_length, unsigned *suitable_components) { unsigned nsuitable_components = 0; unsigned i; for(i = 0; i < component->nchildren; i++) { struct starpu_sched_component * c = component->children[i]; /* Silence static analysis warnings */ estimated_lengths[i] = NAN; estimated_transfer_length[i] = NAN; 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; STARPU_ASSERT_MSG(estimated_lengths[i]>=0, "component=%p, child[%u]=%p, estimated_lengths[%u]=%lf\n", component, i, c, i, estimated_lengths[i]); estimated_transfer_length[i] = starpu_sched_component_transfer_length(c, task); suitable_components[nsuitable_components++] = i; } } return nsuitable_components; } void starpu_mct_compute_expected_times(struct starpu_sched_component *component, struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, double *estimated_lengths, double *estimated_transfer_length, double *estimated_ends_with_task, double *min_exp_end_with_task, double *max_exp_end_with_task, unsigned *suitable_components, unsigned nsuitable_components) { unsigned i; double now = starpu_timing_now(); *min_exp_end_with_task = DBL_MAX; *max_exp_end_with_task = 0.0; for(i = 0; i < nsuitable_components; i++) { unsigned icomponent = suitable_components[i]; struct starpu_sched_component * c = component->children[icomponent]; /* Estimated availability of worker */ double estimated_end = c->estimated_end(c); if (estimated_end < now) estimated_end = now; estimated_ends_with_task[icomponent] = compute_expected_time(now, estimated_end, estimated_lengths[icomponent], estimated_transfer_length[icomponent]); if(estimated_ends_with_task[icomponent] < *min_exp_end_with_task) *min_exp_end_with_task = estimated_ends_with_task[icomponent]; if(estimated_ends_with_task[icomponent] > *max_exp_end_with_task) *max_exp_end_with_task = estimated_ends_with_task[icomponent]; } } int starpu_mct_get_best_component(struct _starpu_mct_data *d, 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, unsigned *suitable_components, unsigned nsuitable_components) { double best_fitness = DBL_MAX; int best_icomponent = -1; unsigned i; 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], 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 (best_icomponent != -1) { task->predicted = estimated_lengths[best_icomponent]; task->predicted_transfer = estimated_transfer_length[best_icomponent]; } return best_icomponent; } starpu-1.3.9+dfsg/src/sched_policies/helper_mct.h000066400000000000000000000041461413463044200220260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /** @file */ struct _starpu_mct_data { double alpha; double beta; double _gamma; double idle_power; starpu_pthread_mutex_t scheduling_mutex; }; struct _starpu_mct_data *starpu_mct_init_parameters(struct starpu_sched_component_mct_data *params); unsigned starpu_mct_compute_execution_times(struct starpu_sched_component *component, struct starpu_task *task, double *estimated_lengths, double *estimated_transfer_length, unsigned *suitable_components); void 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, unsigned *suitable_components, unsigned nsuitable_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); int starpu_mct_get_best_component(struct _starpu_mct_data *d, 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, unsigned *suitable_components, unsigned nsuitable_components); starpu-1.3.9+dfsg/src/sched_policies/heteroprio.c000066400000000000000000000566451413463044200220720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Uppsala University * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include #ifndef DBL_MIN #define DBL_MIN __DBL_MIN__ #endif #ifndef DBL_MAX #define DBL_MAX __DBL_MAX__ #endif /* A bucket corresponds to a Pair of priorities * When a task is pushed with a priority X, it will be stored * into the bucket X. * All the tasks stored in the fifo should be computable by the arch * in valid_archs. * For example if valid_archs = (STARPU_CPU|STARPU_CUDA) * Then task->task->where should be at least (STARPU_CPU|STARPU_CUDA) */ struct _heteroprio_bucket { /* The task of the current bucket */ struct _starpu_prio_deque tasks_queue; /* The correct arch for the current bucket */ unsigned valid_archs; /* The slow factors for any archs */ float slow_factors_per_index[STARPU_NB_TYPES]; /* The base arch for the slow factor (the fatest arch for the current task in the bucket */ unsigned factor_base_arch_index; }; /* Init a bucket */ static void _heteroprio_bucket_init(struct _heteroprio_bucket* bucket) { memset(bucket, 0, sizeof(*bucket)); _starpu_prio_deque_init(&bucket->tasks_queue); } /* Release a bucket */ static void _heteroprio_bucket_release(struct _heteroprio_bucket* bucket) { STARPU_ASSERT(_starpu_prio_deque_is_empty(&bucket->tasks_queue) != 0); _starpu_prio_deque_destroy(&bucket->tasks_queue); } /* A worker is mainly composed of a fifo for the tasks * and some direct access to worker properties. * The fifo is implemented with any array, * to read a task, access tasks_queue[tasks_queue_index] * to write a task, access tasks_queue[(tasks_queue_index+tasks_queue_size)%HETEROPRIO_MAX_PREFETCH] */ /* ANDRA_MODIF: can use starpu fifo + starpu sched_mutex*/ struct _heteroprio_worker_wrapper { unsigned arch_type; unsigned arch_index; struct _starpu_prio_deque tasks_queue; }; struct _starpu_heteroprio_data { starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; /* The bucket to store the tasks */ struct _heteroprio_bucket buckets[STARPU_HETEROPRIO_MAX_PRIO]; /* The number of buckets for each arch */ unsigned nb_prio_per_arch_index[STARPU_NB_TYPES]; /* The mapping to the corresponding buckets */ unsigned prio_mapping_per_arch_index[STARPU_NB_TYPES][STARPU_HETEROPRIO_MAX_PRIO]; /* The number of available tasks for a given arch (not prefetched) */ unsigned nb_remaining_tasks_per_arch_index[STARPU_NB_TYPES]; /* The total number of tasks in the bucket (not prefetched) */ unsigned total_tasks_in_buckets; /* The total number of prefetched tasks for a given arch */ unsigned nb_prefetched_tasks_per_arch_index[STARPU_NB_TYPES]; /* The information for all the workers */ struct _heteroprio_worker_wrapper workers_heteroprio[STARPU_NMAXWORKERS]; /* The number of workers for a given arch */ unsigned nb_workers_per_arch_index[STARPU_NB_TYPES]; }; /** Tell how many prio there are for a given arch */ void starpu_heteroprio_set_nb_prios(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned max_prio) { struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_ASSERT(max_prio < STARPU_HETEROPRIO_MAX_PRIO); hp->nb_prio_per_arch_index[arch] = max_prio; } /** Set the mapping for a given arch prio=>bucket */ inline void starpu_heteroprio_set_mapping(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned source_prio, unsigned dest_bucket_id) { STARPU_ASSERT(dest_bucket_id < STARPU_HETEROPRIO_MAX_PRIO); struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); hp->prio_mapping_per_arch_index[arch][source_prio] = dest_bucket_id; hp->buckets[dest_bucket_id].valid_archs |= starpu_heteroprio_types_to_arch[arch]; _STARPU_DEBUG("Adding arch %d to bucket %u\n", arch, dest_bucket_id); } /** Tell which arch is the faster for the tasks of a bucket (optional) */ inline void starpu_heteroprio_set_faster_arch(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned bucket_id) { STARPU_ASSERT(bucket_id < STARPU_HETEROPRIO_MAX_PRIO); struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); hp->buckets[bucket_id].factor_base_arch_index = arch; hp->buckets[bucket_id].slow_factors_per_index[arch] = 0; } /** Tell how slow is a arch for the tasks of a bucket (optional) */ inline void starpu_heteroprio_set_arch_slow_factor(unsigned sched_ctx_id, enum starpu_heteroprio_types arch, unsigned bucket_id, float slow_factor) { STARPU_ASSERT(bucket_id < STARPU_HETEROPRIO_MAX_PRIO); struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); hp->buckets[bucket_id].slow_factors_per_index[arch] = slow_factor; } /** If the user does not provide an init callback we create a single bucket for all architectures */ static inline void default_init_sched(unsigned sched_ctx_id) { int min_prio = starpu_sched_ctx_get_min_priority(sched_ctx_id); int max_prio = starpu_sched_ctx_get_max_priority(sched_ctx_id); STARPU_ASSERT(min_prio >= 0); STARPU_ASSERT(max_prio >= 0); // By default each type of devices uses 1 bucket and no slow factor #ifdef STARPU_USE_CPU if (starpu_cpu_worker_get_count() > 0) starpu_heteroprio_set_nb_prios(sched_ctx_id, STARPU_CPU_IDX, max_prio-min_prio+1); #endif #ifdef STARPU_USE_CUDA if (starpu_cuda_worker_get_count() > 0) starpu_heteroprio_set_nb_prios(sched_ctx_id, STARPU_CUDA_IDX, max_prio-min_prio+1); #endif #ifdef STARPU_USE_OPENCL if (starpu_opencl_worker_get_count() > 0) starpu_heteroprio_set_nb_prios(sched_ctx_id, STARPU_OPENCL_IDX, max_prio-min_prio+1); #endif #ifdef STARPU_USE_MIC if (starpu_mic_worker_get_count() > 0) starpu_heteroprio_set_nb_prios(sched_ctx_id, STARPU_MIC_IDX, max_prio-min_prio+1); #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE if (starpu_mpi_ms_worker_get_count() > 0) starpu_heteroprio_set_nb_prios(sched_ctx_id, STARPU_MPI_MS_IDX, max_prio-min_prio+1); #endif // Direct mapping int prio; for(prio=min_prio ; prio<=max_prio ; prio++) { #ifdef STARPU_USE_CPU if (starpu_cpu_worker_get_count() > 0) starpu_heteroprio_set_mapping(sched_ctx_id, STARPU_CPU_IDX, prio, prio); #endif #ifdef STARPU_USE_CUDA if (starpu_cuda_worker_get_count() > 0) starpu_heteroprio_set_mapping(sched_ctx_id, STARPU_CUDA_IDX, prio, prio); #endif #ifdef STARPU_USE_OPENCL if (starpu_opencl_worker_get_count() > 0) starpu_heteroprio_set_mapping(sched_ctx_id, STARPU_OPENCL_IDX, prio, prio); #endif #ifdef STARPU_USE_MIC if (starpu_mic_worker_get_count() > 0) starpu_heteroprio_set_mapping(sched_ctx_id, STARPU_MIC_IDX, prio, prio); #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE if (starpu_mpi_ms_worker_get_count() > 0) starpu_heteroprio_set_mapping(sched_ctx_id, STARPU_MPI_MS_IDX, prio, prio); #endif } } static void initialize_heteroprio_policy(unsigned sched_ctx_id) { /* Alloc the scheduler data */ struct _starpu_heteroprio_data *hp; _STARPU_MALLOC(hp, sizeof(struct _starpu_heteroprio_data)); memset(hp, 0, sizeof(*hp)); hp->waiters = starpu_bitmap_create(); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)hp); STARPU_PTHREAD_MUTEX_INIT(&hp->policy_mutex, NULL); unsigned idx_prio; for(idx_prio = 0; idx_prio < STARPU_HETEROPRIO_MAX_PRIO; ++idx_prio) _heteroprio_bucket_init(&hp->buckets[idx_prio]); void (*init_sched)(unsigned) = starpu_sched_ctx_get_sched_policy_init(sched_ctx_id); if(init_sched) init_sched(sched_ctx_id); else default_init_sched(sched_ctx_id); /* Ensure that information have been correctly filled */ unsigned check_all_archs[STARPU_HETEROPRIO_MAX_PRIO]; memset(check_all_archs, 0, sizeof(unsigned)*STARPU_HETEROPRIO_MAX_PRIO); unsigned arch_index; for(arch_index = 0; arch_index < STARPU_NB_TYPES; ++arch_index) { STARPU_ASSERT(hp->nb_prio_per_arch_index[arch_index] <= STARPU_HETEROPRIO_MAX_PRIO); unsigned check_archs[STARPU_HETEROPRIO_MAX_PRIO]; memset(check_archs, 0, sizeof(unsigned)*STARPU_HETEROPRIO_MAX_PRIO); for(idx_prio = 0; idx_prio < hp->nb_prio_per_arch_index[arch_index]; ++idx_prio) { const unsigned mapped_prio = hp->prio_mapping_per_arch_index[arch_index][idx_prio]; STARPU_ASSERT(mapped_prio <= STARPU_HETEROPRIO_MAX_PRIO); STARPU_ASSERT(hp->buckets[mapped_prio].slow_factors_per_index[arch_index] >= 0.0); STARPU_ASSERT(hp->buckets[mapped_prio].valid_archs & starpu_heteroprio_types_to_arch[arch_index]); check_archs[mapped_prio] = 1; check_all_archs[mapped_prio] += 1; } for(idx_prio = 0; idx_prio < STARPU_HETEROPRIO_MAX_PRIO; ++idx_prio) { /* Ensure the current arch use a bucket or someone else can use it */ STARPU_ASSERT(check_archs[idx_prio] == 1 || hp->buckets[idx_prio].valid_archs == 0 || (hp->buckets[idx_prio].valid_archs & ~starpu_heteroprio_types_to_arch[arch_index]) != 0); } } /* Ensure that if a valid_archs = (STARPU_CPU|STARPU_CUDA) then check_all_archs[] = 2 for example */ for(idx_prio = 0; idx_prio < STARPU_HETEROPRIO_MAX_PRIO; ++idx_prio) { unsigned nb_arch_on_bucket = 0; for(arch_index = 0; arch_index < STARPU_NB_TYPES; ++arch_index) { if(hp->buckets[idx_prio].valid_archs & starpu_heteroprio_types_to_arch[arch_index]) { nb_arch_on_bucket += 1; } } STARPU_ASSERT_MSG(check_all_archs[idx_prio] == nb_arch_on_bucket, "check_all_archs[idx_prio(%u)] = %u != nb_arch_on_bucket = %u\n", idx_prio, check_all_archs[idx_prio], nb_arch_on_bucket); } } static void deinitialize_heteroprio_policy(unsigned sched_ctx_id) { struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* Ensure there are no more tasks */ STARPU_ASSERT(hp->total_tasks_in_buckets == 0); unsigned arch_index; for(arch_index = 0; arch_index < STARPU_NB_TYPES; ++arch_index) { STARPU_ASSERT(hp->nb_remaining_tasks_per_arch_index[arch_index] == 0); STARPU_ASSERT(hp->nb_prefetched_tasks_per_arch_index[arch_index] == 0); } unsigned idx_prio; for(idx_prio = 0; idx_prio < STARPU_HETEROPRIO_MAX_PRIO; ++idx_prio) { _heteroprio_bucket_release(&hp->buckets[idx_prio]); } starpu_bitmap_destroy(hp->waiters); STARPU_PTHREAD_MUTEX_DESTROY(&hp->policy_mutex); free(hp); } static void add_workers_heteroprio_policy(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; for (i = 0; i < nworkers; i++) { int workerid = workerids[i]; memset(&hp->workers_heteroprio[workerid], 0, sizeof(hp->workers_heteroprio[workerid])); /* if the worker has already belonged to this context the queue and the synchronization variables have been already initialized */ _starpu_prio_deque_init(&hp->workers_heteroprio[workerid].tasks_queue); switch(starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: hp->workers_heteroprio[workerid].arch_type = STARPU_CPU; hp->workers_heteroprio[workerid].arch_index = STARPU_CPU_IDX; break; case STARPU_CUDA_WORKER: hp->workers_heteroprio[workerid].arch_type = STARPU_CUDA; hp->workers_heteroprio[workerid].arch_index = STARPU_CUDA_IDX; break; case STARPU_OPENCL_WORKER: hp->workers_heteroprio[workerid].arch_type = STARPU_OPENCL; hp->workers_heteroprio[workerid].arch_index = STARPU_OPENCL_IDX; break; case STARPU_MIC_WORKER: hp->workers_heteroprio[workerid].arch_type = STARPU_MIC; hp->workers_heteroprio[workerid].arch_index = STARPU_MIC_IDX; break; case STARPU_MPI_MS_WORKER: hp->workers_heteroprio[workerid].arch_type = STARPU_MPI_MS; hp->workers_heteroprio[workerid].arch_index = STARPU_MPI_MS_IDX; break; default: STARPU_ASSERT(0); } hp->nb_workers_per_arch_index[hp->workers_heteroprio[workerid].arch_index]++; } } static void remove_workers_heteroprio_policy(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; for (i = 0; i < nworkers; i++) { int workerid = workerids[i]; _starpu_prio_deque_destroy(&hp->workers_heteroprio[workerid].tasks_queue); } } /* Push a new task (simply store it and update counters) */ static int push_task_heteroprio_policy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* One worker at a time use heteroprio */ starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&hp->policy_mutex); starpu_worker_relax_off(); /* Retrieve the correct bucket */ STARPU_ASSERT(task->priority < STARPU_HETEROPRIO_MAX_PRIO); struct _heteroprio_bucket* bucket = &hp->buckets[task->priority]; /* Ensure that any worker that check that list can compute the task */ STARPU_ASSERT_MSG(bucket->valid_archs, "The bucket %d does not have any archs\n", task->priority); STARPU_ASSERT(((bucket->valid_archs ^ task->where) & bucket->valid_archs) == 0); /* save the task */ _starpu_prio_deque_push_back_task(&bucket->tasks_queue,task); /* Inc counters */ unsigned arch_index; for(arch_index = 0; arch_index < STARPU_NB_TYPES; ++arch_index) { /* We test the archs on the bucket and not on task->where since it is restrictive */ if(bucket->valid_archs & starpu_heteroprio_types_to_arch[arch_index]) hp->nb_remaining_tasks_per_arch_index[arch_index] += 1; } hp->total_tasks_in_buckets += 1; starpu_push_task_end(task); /*if there are no tasks_queue 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(hp->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(hp->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(&hp->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_relax_light(worker)) break; // wake up a single worker } #endif return 0; } static struct starpu_task *pop_task_heteroprio_policy(unsigned sched_ctx_id) { const unsigned workerid = starpu_worker_get_id_check(); struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _heteroprio_worker_wrapper* worker = &hp->workers_heteroprio[workerid]; #ifdef STARPU_NON_BLOCKING_DRIVERS /* If no tasks available, no tasks in worker queue or some arch worker queue just return NULL */ if (!STARPU_RUNNING_ON_VALGRIND && (hp->total_tasks_in_buckets == 0 || hp->nb_remaining_tasks_per_arch_index[worker->arch_index] == 0) && worker->tasks_queue.ntasks == 0 && hp->nb_prefetched_tasks_per_arch_index[worker->arch_index] == 0) { return NULL; } if (!STARPU_RUNNING_ON_VALGRIND && starpu_bitmap_get(hp->waiters, workerid)) { /* Nobody woke us, avoid bothering the mutex */ return NULL; } #endif starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&hp->policy_mutex); starpu_worker_relax_off(); /* keep track of the new added task to perfom real prefetch on node */ unsigned nb_added_tasks = 0; /* Check that some tasks are available for the current worker arch */ if( hp->nb_remaining_tasks_per_arch_index[worker->arch_index] != 0 ) { /* Ideally we would like to fill the prefetch array */ unsigned nb_tasks_to_prefetch = (STARPU_HETEROPRIO_MAX_PREFETCH-worker->tasks_queue.ntasks); /* But there are maybe less tasks than that! */ if(nb_tasks_to_prefetch > hp->nb_remaining_tasks_per_arch_index[worker->arch_index]) { nb_tasks_to_prefetch = hp->nb_remaining_tasks_per_arch_index[worker->arch_index]; } /* But in case there are less tasks than worker we take the minimum */ if(hp->nb_remaining_tasks_per_arch_index[worker->arch_index] < starpu_sched_ctx_get_nworkers(sched_ctx_id)) { if(worker->tasks_queue.ntasks == 0) nb_tasks_to_prefetch = 1; else nb_tasks_to_prefetch = 0; } unsigned idx_prio, arch_index; /* We iterate until we found all the tasks we need */ for(idx_prio = 0; nb_tasks_to_prefetch && idx_prio < hp->nb_prio_per_arch_index[worker->arch_index]; ++idx_prio) { /* Retrieve the bucket using the mapping */ struct _heteroprio_bucket* bucket = &hp->buckets[hp->prio_mapping_per_arch_index[worker->arch_index][idx_prio]]; /* Ensure we can compute task from this bucket */ STARPU_ASSERT(bucket->valid_archs & worker->arch_type); /* Take nb_tasks_to_prefetch tasks if possible */ while(!_starpu_prio_deque_is_empty(&bucket->tasks_queue) && nb_tasks_to_prefetch && (bucket->factor_base_arch_index == 0 || worker->arch_index == bucket->factor_base_arch_index || (((float)bucket->tasks_queue.ntasks)/((float)hp->nb_workers_per_arch_index[bucket->factor_base_arch_index])) >= bucket->slow_factors_per_index[worker->arch_index])) { struct starpu_task* task = _starpu_prio_deque_pop_task(&bucket->tasks_queue); STARPU_ASSERT(starpu_worker_can_execute_task(workerid, task, 0)); /* Save the task */ STARPU_AYU_ADDTOTASKQUEUE(starpu_task_get_job_id(task), workerid); _starpu_prio_deque_push_front_task(&worker->tasks_queue, task); /* Update general counter */ hp->nb_prefetched_tasks_per_arch_index[worker->arch_index] += 1; hp->total_tasks_in_buckets -= 1; for(arch_index = 0; arch_index < STARPU_NB_TYPES; ++arch_index) { /* We test the archs on the bucket and not on task->where since it is restrictive */ if(bucket->valid_archs & starpu_heteroprio_types_to_arch[arch_index]) { hp->nb_remaining_tasks_per_arch_index[arch_index] -= 1; } } /* Decrease the number of tasks to found */ nb_tasks_to_prefetch -= 1; nb_added_tasks += 1; // TODO starpu_prefetch_task_input_for(task, workerid); } } } struct starpu_task* task = NULL; /* The worker has some tasks in its queue */ if(worker->tasks_queue.ntasks) { int skipped; task = _starpu_prio_deque_pop_task_for_worker(&worker->tasks_queue, workerid, &skipped); hp->nb_prefetched_tasks_per_arch_index[worker->arch_index] -= 1; } /* Otherwise look if we can steal some work */ else if(hp->nb_prefetched_tasks_per_arch_index[worker->arch_index]) { /* If HETEROPRIO_MAX_PREFETCH==1 it should not be possible to steal work */ STARPU_ASSERT(STARPU_HETEROPRIO_MAX_PREFETCH != 1); 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); unsigned victim; unsigned current_worker; /* Start stealing from just after ourself */ while(workers->has_next(workers, &it)) { current_worker = workers->get_next(workers, &it); if(current_worker == workerid) break; } /* circular loop */ while (1) { if (!workers->has_next(workers, &it)) { /* End of the list, restart from the beginning */ workers->init_iterator(workers, &it); } while(workers->has_next(workers, &it)) { victim = workers->get_next(workers, &it); /* When getting on ourself again, we're done trying to find work */ if(victim == workerid) goto done; /* If it is the same arch and there is a task to steal */ if(hp->workers_heteroprio[victim].arch_index == worker->arch_index && hp->workers_heteroprio[victim].tasks_queue.ntasks) { /* ensure the worker is not currently prefetching its data */ starpu_worker_lock(victim); if(hp->workers_heteroprio[victim].arch_index == worker->arch_index && hp->workers_heteroprio[victim].tasks_queue.ntasks) { int skipped; /* steal the last added task */ task = _starpu_prio_deque_pop_task_for_worker(&hp->workers_heteroprio[victim].tasks_queue, workerid, &skipped); /* we steal a task update global counter */ hp->nb_prefetched_tasks_per_arch_index[hp->workers_heteroprio[victim].arch_index] -= 1; starpu_worker_unlock(victim); goto done; } starpu_worker_unlock(victim); } } } done: ; } if (!task) { /* Tell pushers that we are waiting for tasks_queue for us */ starpu_bitmap_set(hp->waiters, workerid); } STARPU_PTHREAD_MUTEX_UNLOCK(&hp->policy_mutex); if(task &&_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); if (_starpu_sched_ctx_worker_is_master_for_child_ctx(sched_ctx_id, workerid, task)) task = NULL; _starpu_sched_ctx_unlock_write(sched_ctx_id); } /* if we have task (task) me way have some in the queue (worker->tasks_queue_size) that was freshly addeed (nb_added_tasks) */ if(task && worker->tasks_queue.ntasks && nb_added_tasks && starpu_get_prefetch_flag()) { /* TOTO berenger: iterate in the other sense */ struct starpu_task *task_to_prefetch = NULL; for (task_to_prefetch = starpu_task_prio_list_begin(&worker->tasks_queue.list); (task_to_prefetch != starpu_task_prio_list_end(&worker->tasks_queue.list) && nb_added_tasks && hp->nb_remaining_tasks_per_arch_index[worker->arch_index] != 0); task_to_prefetch = starpu_task_prio_list_next(&worker->tasks_queue.list, task_to_prefetch)) { /* prefetch from closest to end task */ starpu_prefetch_task_input_for(task_to_prefetch, workerid); nb_added_tasks -= 1; } } return task; } struct starpu_sched_policy _starpu_sched_heteroprio_policy = { .init_sched = initialize_heteroprio_policy, .deinit_sched = deinitialize_heteroprio_policy, .add_workers = add_workers_heteroprio_policy, .remove_workers = remove_workers_heteroprio_policy, .push_task = push_task_heteroprio_policy, .simulate_push_task = NULL, .push_task_notify = NULL, .pop_task = pop_task_heteroprio_policy, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "heteroprio", .policy_description = "heteroprio", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/hierarchical_heft.c000066400000000000000000000065421413463044200233250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 struct starpu_sched_component_composed_recipe * recipe_for_worker(enum starpu_worker_archtype a STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component_composed_recipe * r = starpu_sched_component_composed_recipe_create(); starpu_sched_component_composed_recipe_add(r, (starpu_sched_component_create_t) starpu_sched_component_best_implementation_create, NULL); starpu_sched_component_composed_recipe_add(r, (starpu_sched_component_create_t) starpu_sched_component_fifo_create, NULL); return r; } static void initialize_heft_center_policy(unsigned sched_ctx_id) { struct starpu_sched_component_specs specs; memset(&specs,0,sizeof(specs)); struct starpu_sched_component_mct_data heft_data = { .alpha = 1.0, .beta = 1.0, ._gamma = 0.0, .idle_power = 0.0, /* .no_perf_model_component_create = starpu_sched_component_random_create, .arg_no_perf_model = NULL, .calibrating_component_create = starpu_sched_component_random_create, .arg_calibrating_component = NULL, */ }; struct starpu_sched_component_composed_recipe * r = starpu_sched_component_composed_recipe_create(); /* FIXME: add perfmodel_select component */ starpu_sched_component_composed_recipe_add(r, (starpu_sched_component_create_t) starpu_sched_component_heft_create,&heft_data); specs.hwloc_machine_composed_sched_component = r; r = starpu_sched_component_composed_recipe_create(); starpu_sched_component_composed_recipe_add(r, (starpu_sched_component_create_t) starpu_sched_component_best_implementation_create, NULL); starpu_sched_component_composed_recipe_add(r, (starpu_sched_component_create_t) starpu_sched_component_fifo_create ,NULL); specs.hwloc_component_composed_sched_component = r; specs.worker_composed_sched_component = recipe_for_worker; struct starpu_sched_tree *t = starpu_sched_component_make_scheduler(sched_ctx_id, specs); starpu_sched_component_composed_recipe_destroy(specs.hwloc_machine_composed_sched_component); starpu_sched_tree_update_workers(t); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); } struct starpu_sched_policy _starpu_sched_tree_heft_hierarchical_policy = { .init_sched = initialize_heft_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-heft-hierarchical", .policy_description = "hierarchical heft tree policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_eager.c000066400000000000000000000033111413463044200224760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_eager_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_eager_policy = { .init_sched = initialize_eager_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_eager_prefetching.c000066400000000000000000000035321413463044200250610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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_prefetching_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_eager_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_eager_prefetching_policy = { .init_sched = initialize_eager_prefetching_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_eager_prio.c000066400000000000000000000035441413463044200235370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 static void initialize_eager_prio_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_eager_prio_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_eager_prio_policy = { .init_sched = initialize_eager_prio_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-prio", .policy_description = "eager-prio modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_ez.c000066400000000000000000000365611413463044200220460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 /* The scheduling strategy may look like this : * * | * fifo_above * | * decision_component <--push-- perfmodel_select_component --push--> eager_component * | | | | * fifo fifo fifo | * | | | | * eager eager eager | * | | | | * >--------------------------------------------------------------< * | | * best_impl_component best_impl_component * | | * worker_component worker_component */ /* The two thresolds concerns the fifo components below, 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_HEFT 30 #define _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT 2 #define _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT 1000000000.0 void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id, unsigned ndecisions, ...) { struct starpu_sched_tree * t; struct starpu_sched_component *last = NULL; /* Stores the last created component, from top to bottom */ unsigned i, j, n; struct starpu_sched_component *userchoice_component = NULL; struct starpu_sched_component *pre_decision_component = NULL; struct starpu_sched_component *last_pre_decision_component = NULL; struct starpu_sched_component *decision_component = NULL; struct starpu_sched_component *no_perfmodel_component = NULL; struct starpu_sched_component *calibrator_component = NULL; unsigned sched; va_list varg_list; unsigned decide_flags; unsigned flags; /* Start building the tree */ t = starpu_sched_tree_create(sched_ctx_id); t->root = NULL; starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t); STARPU_ASSERT(ndecisions >= 1); if (ndecisions != 1) { /* Take choice between schedulers from user */ userchoice_component = starpu_sched_component_userchoice_create(t, NULL); t->root = userchoice_component; } unsigned nbelow; unsigned nummaxids; va_start(varg_list, ndecisions); for (sched = 0; sched < ndecisions; sched++) { last = userchoice_component; starpu_sched_component_create_t create_decision_component = va_arg(varg_list, starpu_sched_component_create_t); void *data = va_arg(varg_list, void *); flags = va_arg(varg_list, unsigned); (void) create_decision_component; (void) data; while ((flags & STARPU_SCHED_SIMPLE_PRE_DECISION) == STARPU_SCHED_SIMPLE_PRE_DECISION) { STARPU_ASSERT(flags == STARPU_SCHED_SIMPLE_PRE_DECISION); (void) va_arg(varg_list, starpu_sched_component_create_t); (void) va_arg(varg_list, void *); flags = va_arg(varg_list, unsigned); } int above_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_ABOVE", (flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO) ? 1 : 0); int below_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_BELOW", (flags & STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO) ? 1 : 0); /* Create combined workers if requested */ if (flags & STARPU_SCHED_SIMPLE_COMBINED_WORKERS) starpu_sched_find_all_worker_combinations(); /* Components parameters */ if (above_prio || below_prio) { /* 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); } /* See what the component will decide */ nummaxids = starpu_worker_get_count() + starpu_combined_worker_get_count(); if (starpu_memory_nodes_get_count() > nummaxids) nummaxids = starpu_memory_nodes_get_count(); if (STARPU_ANY_WORKER > nummaxids) nummaxids = STARPU_ANY_WORKER; if (sched == 0) decide_flags = flags & STARPU_SCHED_SIMPLE_DECIDE_MASK; else STARPU_ASSERT(decide_flags == (flags & STARPU_SCHED_SIMPLE_DECIDE_MASK)); } va_end(varg_list); unsigned below_id[nummaxids]; switch (decide_flags) { case STARPU_SCHED_SIMPLE_DECIDE_WORKERS: /* Count workers */ nbelow = starpu_worker_get_count() + starpu_combined_worker_get_count(); /* and no need for IDs */ break; case STARPU_SCHED_SIMPLE_DECIDE_MEMNODES: { /* Count memory nodes */ n = starpu_memory_nodes_get_count(); nbelow = 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 string for this memory node with no worker */ continue; below_id[nbelow] = i; nbelow++; } break; } case STARPU_SCHED_SIMPLE_DECIDE_ARCHS: { /* Count available architecture types */ enum starpu_worker_archtype type; nbelow = 0; for (type = STARPU_CPU_WORKER; type < STARPU_ANY_WORKER; type++) { if (starpu_worker_get_count_by_type(type)) { below_id[nbelow] = type; nbelow++; } } break; } default: STARPU_ABORT(); } STARPU_ASSERT(nbelow > 0); struct starpu_sched_component *last_below[nbelow]; memset(&last_below, 0, sizeof(last_below)); if (ndecisions != 1) { /* Will need to stage pulls, create one per choice */ for (i = 0; i < nbelow; i++) last_below[i] = starpu_sched_component_stage_create(t, NULL); } va_start(varg_list, ndecisions); for (sched = 0; sched < ndecisions; sched++) { last = userchoice_component; starpu_sched_component_create_t create_decision_component = va_arg(varg_list, starpu_sched_component_create_t); void *data = va_arg(varg_list, void *); flags = va_arg(varg_list, unsigned); while ((flags & STARPU_SCHED_SIMPLE_PRE_DECISION) == STARPU_SCHED_SIMPLE_PRE_DECISION) { starpu_sched_component_create_t create_pre_decision_component = va_arg(varg_list, starpu_sched_component_create_t); void *pre_data = va_arg(varg_list, void *); flags = va_arg(varg_list, unsigned); struct starpu_sched_component *component; component = create_pre_decision_component(t, pre_data); if (pre_decision_component) /* Connect after previous pre-decision component */ starpu_sched_component_connect(pre_decision_component, component); else /* We are the first pre-decision component */ pre_decision_component = component; last_pre_decision_component = component; } int above_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_ABOVE", (flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO) ? 1 : 0); int below_prio = starpu_get_env_number_default("STARPU_SCHED_SORTED_BELOW", (flags & STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO) ? 1 : 0); if (nbelow == 1 && !(flags & STARPU_SCHED_SIMPLE_DECIDE_ALWAYS)) { /* Oh, no choice, we don't actually need to decide, just * use an eager scheduler */ decision_component = starpu_sched_component_eager_create(t, NULL); /* But make sure we have a fifo above it, fifos below it would * possibly refuse tasks out of available room */ flags |= STARPU_SCHED_SIMPLE_FIFO_ABOVE; } else { decision_component = create_decision_component(t, data); } if (last_pre_decision_component) starpu_sched_component_connect(last_pre_decision_component, decision_component); else pre_decision_component = decision_component; /* First, a fifo if requested */ if (flags & STARPU_SCHED_SIMPLE_FIFO_ABOVE) { struct starpu_sched_component *fifo_above; if (above_prio) { fifo_above = starpu_sched_component_prio_create(t, NULL); } else { fifo_above = starpu_sched_component_fifo_create(t, NULL); } if (!last) last = t->root = fifo_above; else { starpu_sched_component_connect(last, fifo_above); last = fifo_above; } } /* Then, perfmodel calibration if requested, and plug the scheduling decision-making component to it */ if (flags & STARPU_SCHED_SIMPLE_PERFMODEL) { no_perfmodel_component = starpu_sched_component_eager_create(t, NULL); 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 = pre_decision_component, }; struct starpu_sched_component * perfmodel_select_component = starpu_sched_component_perfmodel_select_create(t, &perfmodel_select_data); if (!last) last = t->root = perfmodel_select_component; else starpu_sched_component_connect(last, perfmodel_select_component); starpu_sched_component_connect(perfmodel_select_component, pre_decision_component); starpu_sched_component_connect(perfmodel_select_component, calibrator_component); starpu_sched_component_connect(perfmodel_select_component, no_perfmodel_component); } else { /* No perfmodel calibration */ if (!last) /* Plug decision_component directly */ t->root = pre_decision_component; else /* Plug decision components to fifo */ starpu_sched_component_connect(last, pre_decision_component); } /* Take default ntasks_threshold */ unsigned ntasks_threshold; if (starpu_sched_component_is_heft(decision_component) || starpu_sched_component_is_mct(decision_component) || starpu_sched_component_is_heteroprio(decision_component)) { /* These need more queueing to allow CPUs to take some share of the work */ ntasks_threshold = _STARPU_SCHED_NTASKS_THRESHOLD_HEFT; } else { ntasks_threshold = _STARPU_SCHED_NTASKS_THRESHOLD_DEFAULT; } /* But let user tune it */ ntasks_threshold = starpu_get_env_number_default("STARPU_NTASKS_THRESHOLD", ntasks_threshold); double exp_len_threshold = _STARPU_SCHED_EXP_LEN_THRESHOLD_DEFAULT; exp_len_threshold = starpu_get_env_float_default("STARPU_EXP_LEN_THRESHOLD", exp_len_threshold); int ready = starpu_get_env_number_default("STARPU_SCHED_READY", (flags & STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY) ? 1 : 0); struct starpu_sched_component_prio_data prio_data = { .ntasks_threshold = ntasks_threshold, .exp_len_threshold = exp_len_threshold, .ready = ready, }; struct starpu_sched_component_fifo_data fifo_data = { .ntasks_threshold = ntasks_threshold, .exp_len_threshold = exp_len_threshold, .ready = ready, }; /* Create one fifo+eager component pair per choice, below scheduling decision */ for(i = 0; i < nbelow; i++) { last = decision_component; if (flags & STARPU_SCHED_SIMPLE_FIFOS_BELOW && !(decide_flags == STARPU_SCHED_SIMPLE_DECIDE_WORKERS && i >= starpu_worker_get_count())) { struct starpu_sched_component *fifo_below; if (below_prio) { fifo_below = starpu_sched_component_prio_create(t, &prio_data); } else { fifo_below = starpu_sched_component_fifo_create(t, &fifo_data); } starpu_sched_component_connect(last, fifo_below); last = fifo_below; } switch (decide_flags) { case STARPU_SCHED_SIMPLE_DECIDE_WORKERS: /* 1-1 mapping between choice and worker, no need for an eager component */ n = 1; break; case STARPU_SCHED_SIMPLE_DECIDE_MEMNODES: n = 0; for (j = 0; j < starpu_worker_get_count() + starpu_combined_worker_get_count(); j++) if (starpu_worker_get_memory_node(j) == below_id[i]) n++; break; case STARPU_SCHED_SIMPLE_DECIDE_ARCHS: n = starpu_worker_get_count_by_type(i); break; default: STARPU_ABORT(); } STARPU_ASSERT(n >= 1); if (n > 1) { /* Several workers for this choice, need to introduce * a component to distribute the work */ struct starpu_sched_component *distribute; if (flags & STARPU_SCHED_SIMPLE_WS_BELOW) { distribute = starpu_sched_component_work_stealing_create(t, NULL); } else { distribute = starpu_sched_component_eager_create(t, NULL); } starpu_sched_component_connect(last, distribute); last = distribute; } if (ndecisions != 1) /* Connect to stage component */ starpu_sched_component_connect(last, last_below[i]); else /* Directly let it connected to worker */ last_below[i] = last; } } va_end(varg_list); /* Finish by creating components per worker */ for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++) { /* Start from the bottom */ struct starpu_sched_component * worker_component = starpu_sched_component_worker_new(sched_ctx_id, i); struct starpu_sched_component * worker = worker_component; unsigned id; /* Create implementation chooser if requested */ if (flags & STARPU_SCHED_SIMPLE_IMPL) { struct starpu_sched_component * impl_component = starpu_sched_component_best_implementation_create(t, NULL); starpu_sched_component_connect(impl_component, worker_component); /* Reroute components above through it */ worker = impl_component; } switch (decide_flags) { case STARPU_SCHED_SIMPLE_DECIDE_WORKERS: id = i; break; case STARPU_SCHED_SIMPLE_DECIDE_MEMNODES: for (id = 0; id < nbelow; id++) if (below_id[id] == starpu_worker_get_memory_node(i)) break; break; case STARPU_SCHED_SIMPLE_DECIDE_ARCHS: for (id = 0; id < nbelow; id++) if (below_id[id] == starpu_worker_get_type(i)) break; break; default: STARPU_ABORT(); } STARPU_ASSERT(id < nbelow); last = last_below[id]; if (!last) last = decision_component; starpu_sched_component_connect(last, worker); /* Plug perfmodel calibrator if requested */ /* FIXME: this won't work with several scheduling decisions */ if (flags & STARPU_SCHED_SIMPLE_PERFMODEL) { starpu_sched_component_connect(no_perfmodel_component, worker); /* Calibrator needs to choose the implementation */ starpu_sched_component_connect(calibrator_component, worker_component); } } starpu_sched_tree_update_workers(t); starpu_sched_tree_update_workers_in_ctx(t); } void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_schedulers(sched_ctx_id, 1, create_decision_component, data, flags); } starpu-1.3.9+dfsg/src/sched_policies/modular_gemm.c000066400000000000000000000136231413463044200223470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ /* This scheduler runs only GEMMs on GPUs, and tries to feed them with as many * GEMMs as possible. */ #include #include /* Optionally, it can take memory affinity into account, to avoid too many GPU * data transfers */ #define MEMORY_AFFINITY struct child_data { double expected_start; double predicted; double predicted_transfer; double expected_end; unsigned child; }; static int compar(const void *_a, const void *_b) { const struct child_data *a = _a; const struct child_data *b = _b; if (a->expected_end < b->expected_end) return -1; if (a->expected_end == b->expected_end) return 0; return 1; } static int gemm_push_task(struct starpu_sched_component * component, struct starpu_task * task) { unsigned n = component->nchildren; unsigned i; /* See if it's a GEMM task */ const char *name = starpu_task_get_model_name(task); //fprintf(stderr, "it's %s\n", name); if (name && (!strcmp(name, "gemm") || !strcmp(name, "dgemm") || !strcmp(name, "sgemm") || !strcmp(name, "chol_model_22") || !strcmp(name, "starpu_dlu_lu_model_22") || !strcmp(name, "starpu_slu_lu_model_22"))) { /* It's a GEMM, try to push to GPUs */ struct child_data child_data[n]; for (i = 0; i < n; i++) { child_data[i].expected_end = -1; child_data[i].child = i; } /* Look at GPU availability time */ for (i = 0; i < n; i++) { struct starpu_sched_component *child = component->children[i]; double predicted; if (starpu_sched_component_execute_preds(child, task, &predicted)) { double expected_start; child_data[i].expected_start = expected_start = child->estimated_end(child); child_data[i].predicted = predicted; child_data[i].expected_end = expected_start + predicted; #ifdef MEMORY_AFFINITY double predicted_transfer; child_data[i].predicted_transfer = predicted_transfer = starpu_sched_component_transfer_length(child, task); child_data[i].expected_end += predicted_transfer; #endif } } /* Sort by increasing expected end */ qsort(child_data, n, sizeof(*child_data), compar); /* Try to push to the GPU with minimum availability time, to balance the load. */ for (i = 0; i < n; i++) { if (child_data[i].expected_end != -1) { struct starpu_sched_component *child = component->children[child_data[i].child]; /* Note it in the task so that estimated_end() has it */ task->predicted = child_data[i].predicted; task->predicted_transfer = child_data[i].predicted_transfer; int ret = starpu_sched_component_push_task(component,child,task); if (!ret) /* Ok, this GPU took it */ return 0; } } } int workerid; /* It's not a GEMM, or no GPU wanted to take it, find somebody else */ 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)) { for (i = 0; i < n; i++) { struct starpu_sched_component *child = component->children[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_cpu_worker_get_count() == 0 || starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) && (starpu_worker_can_execute_task(workerid,task,nimpl) || starpu_combined_worker_can_execute_task(workerid, task, nimpl))) { int ret = starpu_sched_component_push_task(component,child,task); if (!ret) return 0; } } } } } } } /* FIFOs are full */ return 1; } struct starpu_sched_component *starpu_sched_component_gemm_create(struct starpu_sched_tree *tree, void *params STARPU_ATTRIBUTE_UNUSED) { struct starpu_sched_component *component = starpu_sched_component_create(tree, "gemm"); component->push_task = gemm_push_task; return component; } static void initialize_gemm_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_gemm_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_MEMNODES | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_gemm_policy = { .init_sched = initialize_gemm_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-gemm", .policy_description = "gemm modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_heft.c000066400000000000000000000067031413463044200223510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 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. */ static void initialize_heft_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_mct_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_PERFMODEL | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heft_policy = { .init_sched = initialize_heft_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_heft2.c000066400000000000000000000067121413463044200224330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 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. */ static void initialize_heft2_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_heft_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_PERFMODEL | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heft2_policy = { .init_sched = initialize_heft2_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_heft_prio.c000066400000000000000000000070361413463044200234020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 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. */ static void initialize_heft_prio_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_mct_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_MEMNODES | STARPU_SCHED_SIMPLE_PERFMODEL | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heft_prio_policy = { .init_sched = initialize_heft_prio_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_heteroprio.c000066400000000000000000000037241413463044200236030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 static void initialize_heteroprio_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_heteroprio_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_PERFMODEL | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_heteroprio_policy = { .init_sched = initialize_heteroprio_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-heteroprio", .policy_description = "heteroprio modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_heteroprio_heft.c000066400000000000000000000044461413463044200246130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 static void initialize_heteroprio_heft_center_policy(unsigned sched_ctx_id) { struct starpu_sched_component_heteroprio_data heteroprio_data = { .mct = NULL, .batch = 1, }; starpu_sched_component_initialize_simple_schedulers(sched_ctx_id, 2, (starpu_sched_component_create_t) starpu_sched_component_heteroprio_create, &heteroprio_data, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, (starpu_sched_component_create_t) starpu_sched_component_heft_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL); } struct starpu_sched_policy _starpu_sched_modular_heteroprio_heft_policy = { .init_sched = initialize_heteroprio_heft_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-heteroprio-heft", .policy_description = "heteroprio+heft modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_parallel_heft.c000066400000000000000000000072611413463044200242250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 /* 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. */ static void initialize_parallel_heft_center_policy(unsigned sched_ctx_id) { _STARPU_DISP("Warning: the modular-pheft scheduler is mostly a proof of concept and not really very optimized\n"); starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_mct_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_COMBINED_WORKERS | STARPU_SCHED_SIMPLE_PERFMODEL | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_parallel_heft_policy = { .init_sched = initialize_parallel_heft_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-pheft", .policy_description = "parallel heft modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_parallel_random.c000066400000000000000000000056471413463044200245650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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_parallel_random_fifo_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_random_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_COMBINED_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_parallel_random_policy = { .init_sched = initialize_parallel_random_fifo_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-prandom", .policy_description = "prandom modular policy", .worker_type = STARPU_WORKER_LIST, }; /* Random scheduler with a priority queue for its scheduling window */ static void initialize_parallel_random_prio_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_random_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_COMBINED_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_parallel_random_prio_policy = { .init_sched = initialize_parallel_random_prio_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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-prandom-prio", .policy_description = "prandom-prio modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_prio.c000066400000000000000000000033341413463044200223710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_eager_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_prio_policy = { .init_sched = starpu_initialize_prio_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_prio_prefetching.c000066400000000000000000000070371413463044200247530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* Just as documentation example, here is the detailed equivalent of the * starpu_sched_component_initialize_simple_scheduler call below */ #if 0 static void initialize_prio_prefetching_center_policy(unsigned sched_ctx_id) { struct starpu_sched_tree *t; struct starpu_sched_component * eager_component; 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_new(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); } #endif static void initialize_prio_prefetching_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_eager_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_prio_prefetching_policy = { .init_sched = initialize_prio_prefetching_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_random.c000066400000000000000000000053161413463044200227020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_random_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_policy = { .init_sched = initialize_random_fifo_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; /* Random scheduler with a priority queue for its scheduling window */ static void initialize_random_prio_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_random_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_prio_policy = { .init_sched = initialize_random_prio_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_random_prefetching.c000066400000000000000000000062371413463044200252630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_random_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_prefetching_policy = { .init_sched = initialize_random_fifo_prefetching_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; /* Random scheduler with priority queues for its scheduling window and its workers. */ static void initialize_random_prio_prefetching_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_random_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_FIFO_ABOVE | STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW | STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO | STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_random_prio_prefetching_policy = { .init_sched = initialize_random_prio_prefetching_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/modular_ws.c000066400000000000000000000032141413463044200220460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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_ws_center_policy(unsigned sched_ctx_id) { starpu_sched_component_initialize_simple_scheduler((starpu_sched_component_create_t) starpu_sched_component_work_stealing_create, NULL, STARPU_SCHED_SIMPLE_DECIDE_WORKERS | STARPU_SCHED_SIMPLE_WS_BELOW | STARPU_SCHED_SIMPLE_IMPL, sched_ctx_id); } struct starpu_sched_policy _starpu_sched_modular_ws_policy = { .init_sched = initialize_ws_center_policy, .deinit_sched = starpu_sched_tree_deinitialize, .add_workers = starpu_sched_tree_add_workers, .remove_workers = starpu_sched_tree_remove_workers, .push_task = starpu_sched_tree_work_stealing_push_task, .pop_task = starpu_sched_tree_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "modular-ws", .policy_description = "work stealing modular policy", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/parallel_eager.c000066400000000000000000000301371413463044200226350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_common_data { int possible_combinations_cnt[STARPU_NMAXWORKERS]; int *possible_combinations[STARPU_NMAXWORKERS]; int *possible_combinations_size[STARPU_NMAXWORKERS]; int max_combination_size[STARPU_NMAXWORKERS]; int no_combined_workers; int ref_count; }; static struct _starpu_peager_common_data *_peager_common_data = NULL; struct _starpu_peager_data { starpu_pthread_mutex_t policy_mutex; struct _starpu_fifo_taskq *fifo; struct _starpu_fifo_taskq *local_fifo[STARPU_NMAXWORKERS]; }; static void initialize_peager_common(void) { if (_peager_common_data == NULL) { struct _starpu_peager_common_data *common_data = NULL; _STARPU_CALLOC(common_data, 1, sizeof(struct _starpu_peager_common_data)); common_data->ref_count = 1; _peager_common_data = common_data; const unsigned nbasic_workers = starpu_worker_get_count(); unsigned i; starpu_sched_find_all_worker_combinations(); const unsigned ncombined_workers = starpu_combined_worker_get_count(); common_data->no_combined_workers = ncombined_workers == 0; for(i = 0; i < nbasic_workers; i++) { common_data->possible_combinations_cnt[i] = 0; int cnt = common_data->possible_combinations_cnt[i]++; /* Allocate ncombined_workers + 1 for the singleton worker itself */ _STARPU_CALLOC(common_data->possible_combinations[i], 1+ncombined_workers, sizeof(int)); _STARPU_CALLOC(common_data->possible_combinations_size[i], 1+ncombined_workers, sizeof(int)); common_data->possible_combinations[i][cnt] = i; common_data->possible_combinations_size[i][cnt] = 1; common_data->max_combination_size[i] = 1; } for (i = 0; i < ncombined_workers; i++) { unsigned combined_workerid = nbasic_workers + i; int *workers; int size; starpu_combined_worker_get_description(combined_workerid, &size, &workers); int master = workers[0]; if (size > common_data->max_combination_size[master]) { common_data->max_combination_size[master] = size; } int cnt = common_data->possible_combinations_cnt[master]++; common_data->possible_combinations[master][cnt] = combined_workerid; common_data->possible_combinations_size[master][cnt] = size; } } else { _peager_common_data->ref_count++; } } static void deinitialize_peager_common(void) { STARPU_ASSERT(_peager_common_data != NULL); _peager_common_data->ref_count--; if (_peager_common_data->ref_count == 0) { const unsigned nbasic_workers = starpu_worker_get_count(); unsigned i; for(i = 0; i < nbasic_workers; i++) { free(_peager_common_data->possible_combinations[i]); _peager_common_data->possible_combinations[i] = NULL; free(_peager_common_data->possible_combinations_size[i]); _peager_common_data->possible_combinations_size[i] = NULL; } free(_peager_common_data); _peager_common_data = NULL; } } static void peager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { if (sched_ctx_id == 0) { /* FIXME Fix scheduling contexts initialization or combined * worker management, to make the initialize_peager_common() * call to work right from initialize_peager_policy. For now, * this fails because it causes combined workers to be generated * too early. */ initialize_peager_common(); } 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++) { unsigned workerid = workerids[i]; if(starpu_worker_is_combined_worker(workerid)) { continue; } starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); /* 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(); } } 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]); } } if (sched_ctx_id == 0) { deinitialize_peager_common(); } } static void initialize_peager_policy(unsigned sched_ctx_id) { struct _starpu_peager_data *data; _STARPU_CALLOC(data, 1, sizeof(struct _starpu_peager_data)); _STARPU_DISP("Warning: the peager scheduler is mostly a proof of concept and not really very optimized\n"); /* 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_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); #ifndef STARPU_NON_BLOCKING_DRIVERS int is_parallel_task = task->cl && task->cl->max_parallelism > 1; #endif starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS struct _starpu_peager_common_data *common_data = _peager_common_data; /* 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 workerid = workers->get_next(workers, &it); /* If this is not a CPU or a MIC, then the workerid simply grabs tasks from the fifo */ if (starpu_worker_is_combined_worker(workerid)) { continue; } if (starpu_worker_get_type(workerid) != STARPU_MIC_WORKER && starpu_worker_get_type(workerid) != STARPU_CPU_WORKER) { starpu_wake_worker_relax_light(workerid); continue; } if ((!is_parallel_task) /* This is not a parallel task, can wake any workerid */ || (common_data->no_combined_workers) /* There is no combined workerid */ || (common_data->max_combination_size[workerid] > 1) /* This is a combined workerid master and the task is parallel */ ) { starpu_wake_worker_relax_light(workerid); } } #endif return ret_val; } static struct starpu_task *pop_task_peager_policy(unsigned sched_ctx_id) { struct _starpu_peager_common_data *common_data = _peager_common_data; 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; starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); task = _starpu_fifo_pop_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } struct starpu_task *task; int slave_task = 0; starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_worker_relax_off(); /* check if a slave task is available in the local queue */ task = _starpu_fifo_pop_task(data->local_fifo[workerid], workerid); if (!task) { /* no slave task, try to pop a task as master */ task = _starpu_fifo_pop_task(data->fifo, workerid); if (task) { _STARPU_DEBUG("poping master task %p\n", task); } #if 1 /* Optional heuristic to filter out purely slave workers for parallel tasks */ if (task && task->cl && task->cl->max_parallelism > 1 && common_data->max_combination_size[workerid] == 1 && !common_data->no_combined_workers) { /* task is potentially parallel, leave it for a combined worker master */ _STARPU_DEBUG("pushing back master task %p\n", task); _starpu_fifo_push_back_task(data->fifo, task); task = NULL; } #endif } else { slave_task = 1; _STARPU_DEBUG("poping slave task %p\n", task); } if (!task || slave_task) { STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); goto ret; } /* Find the largest compatible worker combination */ int best_size = -1; int best_workerid = -1; int i; for (i = 0; i < common_data->possible_combinations_cnt[workerid]; i++) { if (common_data->possible_combinations_size[workerid][i] > best_size) { int combined_worker = common_data->possible_combinations[workerid][i]; if (starpu_combined_worker_can_execute_task(combined_worker, task, 0)) { best_size = common_data->possible_combinations_size[workerid][i]; best_workerid = combined_worker; } } } _STARPU_DEBUG("task %p, best_workerid=%d, best_size=%d\n", task, best_workerid, best_size); /* 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) { STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); goto ret; } /* Is this a basic worker or a combined worker ? */ if (best_workerid < (int) starpu_worker_get_count()) { STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); /* The master is alone */ goto ret; } 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); _STARPU_DEBUG("dispatching task %p on combined worker %d of size %d\n", task, best_workerid, worker_size); /* 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_TRACE_JOB_PUSH(alias, alias->priority > 0); _starpu_fifo_push_task(data->local_fifo[local_worker], alias); } /* The master also manipulated an alias */ struct starpu_task *master_alias = starpu_task_dup(task); master_alias->destroy = 1; task = master_alias; STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); _STARPU_TRACE_JOB_PUSH(master_alias, master_alias->priority > 0); for (i = 1; i < worker_size; i++) { int local_worker = combined_workerid[i]; starpu_worker_lock(local_worker); #if !defined(STARPU_NON_BLOCKING_DRIVERS) || defined(STARPU_SIMGRID) starpu_wake_worker_locked(local_worker); #endif starpu_worker_unlock(local_worker); } ret: return task; } 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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/parallel_heft.c000066400000000000000000000476551413463044200225150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /* 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, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { 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; const double now = starpu_timing_now(); if (isnan(model)) model = 0.0; if (isnan(transfer_model)) transfer_model = 0.0; /* Once we have started the task, we can update the predicted amount * of work. */ starpu_worker_lock_self(); worker_exp_len[workerid] -= model + transfer_model; worker_exp_start[workerid] = now + model; worker_exp_end[workerid] = worker_exp_start[workerid] + worker_exp_len[workerid]; ntasks[workerid]--; starpu_worker_unlock_self(); } static void parallel_heft_post_exec_hook(struct starpu_task *task STARPU_ATTRIBUTE_UNUSED, unsigned sched_ctx_id STARPU_ATTRIBUTE_UNUSED) { unsigned workerid = starpu_worker_get_id_check(); const double now = starpu_timing_now(); /* Once we have executed the task, we can update the predicted amount * of work. */ starpu_worker_lock_self(); worker_exp_start[workerid] = now; worker_exp_end[workerid] = worker_exp_start[workerid] + worker_exp_len[workerid]; starpu_worker_unlock_self(); } static int push_task_on_best_worker(struct starpu_task *task, int best_workerid, double exp_start_predicted, 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); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_for(task, best_workerid); int ret = 0; if (!starpu_worker_is_combined_worker(best_workerid)) { starpu_worker_lock(best_workerid); task->predicted = exp_end_predicted - exp_start_predicted; /* 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_worker_unlock(best_workerid); /* We don't want it to interlace its task with a combined * worker's one */ starpu_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&hd->global_push_mutex); starpu_worker_relax_off(); 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_worker_relax_on(); STARPU_PTHREAD_MUTEX_LOCK(&hd->global_push_mutex); starpu_worker_relax_off(); /* 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_combined_workerid = combined_workerid[i]; alias->predicted = exp_end_predicted - worker_exp_end[local_combined_workerid]; /* TODO */ alias->predicted_transfer = 0; alias->destroy = 1; starpu_worker_lock(local_combined_workerid); worker_exp_len[local_combined_workerid] += alias->predicted; worker_exp_end[local_combined_workerid] = exp_end_predicted; worker_exp_start[local_combined_workerid] = exp_end_predicted - worker_exp_len[local_combined_workerid]; ntasks[local_combined_workerid]++; starpu_worker_unlock(local_combined_workerid); _STARPU_TRACE_JOB_PUSH(alias, alias->priority > 0); ret |= starpu_push_local_task(local_combined_workerid, alias, prio); } STARPU_PTHREAD_MUTEX_UNLOCK(&hd->global_push_mutex); } return ret; } static double compute_expected_end(double *_worker_exp_end, int workerid, double length) { if (!starpu_worker_is_combined_worker(workerid)) { double res; /* This is a basic worker */ res = _worker_exp_end[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; int i; for (i = 0; i < worker_size; i++) { double local_exp_end = _worker_exp_end[combined_workerid[i]] + 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); 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 workerid, worker_ctx = 0; int best = -1, best_id_ctx = -1; /* this flag is set if the corresponding workerid 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_start; 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; double now = starpu_timing_now(); double _worker_exp_end[nworkers_ctx]; memset(skip_worker, 0, nworkers_ctx*STARPU_MAXIMPLEMENTATIONS*sizeof(int)); workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { workerid = workers->get_next(workers, &it); if(!starpu_worker_is_combined_worker(workerid)) { /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ /* Sometimes workers didn't take the tasks as early as we expected */ double exp_start = STARPU_MAX(worker_exp_start[workerid], now); _worker_exp_end[workerid] = exp_start + worker_exp_len[workerid]; if (_worker_exp_end[workerid] > max_exp_end) max_exp_end = _worker_exp_end[workerid]; } } unsigned nimpl; worker_ctx = 0; while(workers->has_next(workers, &it)) { workerid = workers->get_next(workers, &it); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!starpu_combined_worker_can_execute_task(workerid, 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(workerid, sched_ctx_id); 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_for(task, workerid); double ntasks_end = compute_ntasks_end(workerid, 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 workerid is being calibrated */ || (calibrating && isnan(local_task_length[worker_ctx][nimpl]) && ntasks_end < ntasks_best_end) /* Calibrating, compete this workerid with other non-calibrated */ ) { ntasks_best_end = ntasks_end; ntasks_best = workerid; ntasks_best_ctx = worker_ctx; nimpl_best = nimpl; } if (isnan(local_task_length[worker_ctx][nimpl])) { static int warned; STARPU_HG_DISABLE_CHECKING(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), workerid); } /* 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_exp_end, workerid, local_task_length[worker_ctx][nimpl]); //fprintf(stderr, "WORKER %d -> length %e end %e\n", workerid, local_task_length[worker_ctx][nimpl], local_exp_end[workerid][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) workerid (%u) kernel (%u) \n", local_task_length[workerid],local_energy[workerid],workerid,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)) { workerid = 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 = workerid; best_id_ctx = worker_ctx; nimpl_best = nimpl; } // fprintf(stderr, "FITNESS workerid %d -> %e local_exp_end %e - local_data_penalty %e\n", workerid, fitness[workerid][nimpl], local_exp_end[workerid][nimpl] - best_exp_end, local_data_penalty[workerid][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(_worker_exp_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]; } best_exp_start = _worker_exp_end[best]; //_STARPU_DEBUG("Scheduler parallel heft: kernel (%u)\n", nimpl_best); starpu_task_set_implementation(task, nimpl_best); /* we should now have the best workerid in variable "best" */ starpu_sched_task_break(task); return push_task_on_best_worker(task, best, best_exp_start, 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; double now = starpu_timing_now(); 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] = 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) { struct _starpu_pheft_data *hd; _STARPU_MALLOC(hd, sizeof(struct _starpu_pheft_data)); _STARPU_DISP("Warning: the pheft scheduler is mostly a proof of concept and not really very optimized\n"); 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); #ifdef STARPU_NON_BLOCKING_DRIVERS if (starpu_getenv("STARPU_SCHED_GAMMA")) _STARPU_DISP("Warning: STARPU_SCHED_GAMMA was used, but --enable-blocking-drivers configuration was not set, CPU cores will not actually be sleeping\n"); #endif 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_PTHREAD_MUTEX_DESTROY(&hd->global_push_mutex); free(hd); } 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 = parallel_heft_post_exec_hook, .pop_every_task = NULL, .policy_name = "pheft", .policy_description = "parallel HEFT", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/prio_deque.c000066400000000000000000000070661413463044200220370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 "prio_deque.h" #include "fifo_queues.h" /* 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)) { starpu_task_set_implementation(t, i); return 1; } return 0; } #define REMOVE_TASK(pdeque, first_task_field, next_task_field, predicate, parg) \ { \ struct starpu_task * t; \ for (t = starpu_task_prio_list_begin(&pdeque->list); \ t != starpu_task_prio_list_end(&pdeque->list); \ t = starpu_task_prio_list_next(&pdeque->list, t)) \ { \ if (predicate(t, parg)) \ { \ starpu_task_prio_list_erase(&pdeque->list, t); \ pdeque->ntasks--; \ return t; \ } \ else \ if (skipped) \ *skipped = 1; \ } \ 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_for_worker(struct _starpu_prio_deque * pdeque, int workerid, int *skipped) { 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_for_worker(struct _starpu_prio_deque * pdeque, int workerid, int *skipped) { STARPU_ASSERT(pdeque); STARPU_ASSERT(workerid >= 0 && (unsigned) workerid < starpu_worker_get_count()); REMOVE_TASK(pdeque, _tail, next, pred_can_execute, &workerid); } struct starpu_task *_starpu_prio_deque_deque_first_ready_task(struct _starpu_prio_deque * pdeque, unsigned workerid) { struct starpu_task *task = NULL, *current; if (starpu_task_prio_list_empty(&pdeque->list)) return NULL; if (pdeque->ntasks > 0) { pdeque->ntasks--; task = starpu_task_prio_list_front_highest(&pdeque->list); if (STARPU_UNLIKELY(!task)) return NULL; int first_task_priority = task->priority; size_t non_ready_best = SIZE_MAX; for (current = starpu_task_prio_list_begin(&pdeque->list); current != starpu_task_prio_list_end(&pdeque->list); current = starpu_task_prio_list_next(&pdeque->list, current)) { int priority = current->priority; if (priority >= first_task_priority) { size_t non_ready = _starpu_size_non_ready_buffers(current, workerid); if (non_ready < non_ready_best) { non_ready_best = non_ready; task = current; if (non_ready == 0) break; } } } starpu_task_prio_list_erase(&pdeque->list, task); } return task; } starpu-1.3.9+dfsg/src/sched_policies/prio_deque.h000066400000000000000000000107321413463044200220360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ #ifndef __PRIO_DEQUE_H__ #define __PRIO_DEQUE_H__ #include #include #include /** @file */ struct _starpu_prio_deque { struct starpu_task_prio_list list; unsigned ntasks; unsigned nprocessed; // Assumptions: // exp_len is the sum of predicted_length + predicted_tansfer of all tasks in list // exp_start is the time at which the first task of list can start // exp_end = exp_start + exp_end // Careful: those are NOT maintained by the prio_queue operations double exp_start, exp_end, exp_len; }; static inline void _starpu_prio_deque_init(struct _starpu_prio_deque *pdeque) { memset(pdeque,0,sizeof(*pdeque)); starpu_task_prio_list_init(&pdeque->list); STARPU_HG_DISABLE_CHECKING(pdeque->exp_start); STARPU_HG_DISABLE_CHECKING(pdeque->exp_end); STARPU_HG_DISABLE_CHECKING(pdeque->exp_len); } static inline void _starpu_prio_deque_destroy(struct _starpu_prio_deque *pdeque) { starpu_task_prio_list_deinit(&pdeque->list); } /** return 0 iff the struct _starpu_prio_deque is not empty */ static inline int _starpu_prio_deque_is_empty(struct _starpu_prio_deque *pdeque) { return pdeque->ntasks == 0; } static inline void _starpu_prio_deque_erase(struct _starpu_prio_deque *pdeque, struct starpu_task *task) { starpu_task_prio_list_erase(&pdeque->list, task); } /** push a task in O(lg(nb priorities)) */ static inline int _starpu_prio_deque_push_front_task(struct _starpu_prio_deque *pdeque, struct starpu_task *task) { starpu_task_prio_list_push_front(&pdeque->list, task); pdeque->ntasks++; return 0; } static inline int _starpu_prio_deque_push_back_task(struct _starpu_prio_deque *pdeque, struct starpu_task *task) { starpu_task_prio_list_push_back(&pdeque->list, task); pdeque->ntasks++; return 0; } int _starpu_prio_deque_push_back_task(struct _starpu_prio_deque *, struct starpu_task *); static inline struct starpu_task * _starpu_prio_deque_highest_task(struct _starpu_prio_deque *pdeque) { struct starpu_task *task; if (starpu_task_prio_list_empty(&pdeque->list)) return NULL; task = starpu_task_prio_list_front_highest(&pdeque->list); return task; } /** all _starpu_prio_deque_pop/deque_task function return a task or a NULL pointer if none are available * in O(lg(nb priorities)) */ static inline struct starpu_task * _starpu_prio_deque_pop_task(struct _starpu_prio_deque *pdeque) { struct starpu_task *task; if (starpu_task_prio_list_empty(&pdeque->list)) return NULL; task = starpu_task_prio_list_pop_front_highest(&pdeque->list); pdeque->ntasks--; return task; } static inline struct starpu_task * _starpu_prio_deque_pop_back_task(struct _starpu_prio_deque *pdeque) { struct starpu_task *task; if (starpu_task_prio_list_empty(&pdeque->list)) return NULL; task = starpu_task_prio_list_pop_back_lowest(&pdeque->list); pdeque->ntasks--; return task; } static inline int _starpu_prio_deque_pop_this_task(struct _starpu_prio_deque *pdeque, int workerid, struct starpu_task *task) { unsigned nimpl = 0; #ifdef STARPU_DEBUG STARPU_ASSERT(starpu_task_prio_list_ismember(&pdeque->list, task)); #endif if (workerid < 0 || starpu_worker_can_execute_task_first_impl(workerid, task, &nimpl)) { starpu_task_set_implementation(task, nimpl); starpu_task_prio_list_erase(&pdeque->list, task); pdeque->ntasks--; return 1; } return 0; } /** 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, int *skipped); /** 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, int *skipped); struct starpu_task *_starpu_prio_deque_deque_first_ready_task(struct _starpu_prio_deque *, unsigned workerid); #endif /* __PRIO_DEQUE_H__ */ starpu-1.3.9+dfsg/src/sched_policies/random_policy.c000066400000000000000000000064061413463044200225370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Simon Archipoff * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #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_sched_task_break(task); 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) { (void) sched_ctx_id; starpu_srand48(time(NULL)); } static void deinitialize_random_policy(unsigned sched_ctx_id) { (void) 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", .worker_type = STARPU_WORKER_LIST, }; starpu-1.3.9+dfsg/src/sched_policies/sched_component.h000066400000000000000000000023331413463044200230500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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. */ #ifndef __SCHED_COMPONENT_H__ #define __SCHED_COMPONENT_H__ /** @file */ #include /** lock and unlock drivers for modifying schedulers */ void _starpu_sched_component_lock_all_workers(void); void _starpu_sched_component_unlock_all_workers(void); void _starpu_sched_component_workers_destroy(void); struct _starpu_worker * _starpu_sched_component_worker_get_worker(struct starpu_sched_component *); struct starpu_bitmap * _starpu_get_worker_mask(unsigned sched_ctx_id); #endif starpu-1.3.9+dfsg/src/sched_policies/scheduler_maker.c000066400000000000000000000234401413463044200230320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #if HWLOC_API_VERSION < 0x00010b00 #define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE #endif #endif #include "sched_component.h" /* The scheduler is built by a recursive function called on the hwloc topology with a starpu_sched_specs structure, * each call return a set of starpu_sched_component, not a single one, because you may have a topology like that : * MACHINE -- MEMORY NODE -- SOCKET * \- SOCKET * and you have defined a component for MACHINE, and a component for SOCKET, but not for MEMORY NODE then the recursive call * on MEMORY NODE will return 2 starpu_sched_component for those 2 sockets * * */ struct sched_component_list { struct starpu_sched_component ** arr; unsigned size; }; static void init_list(struct sched_component_list * list) { memset(list,0,sizeof(*list)); } static void destroy_list(struct sched_component_list * list) { free(list->arr); } static void add_component(struct sched_component_list *list, struct starpu_sched_component * component) { _STARPU_REALLOC(list->arr, sizeof(*list->arr) * (list->size + 1)); list->arr[list->size] = component; list->size++; } /* this is the function that actualy built the scheduler, but without workers */ static struct sched_component_list helper_make_scheduler(struct starpu_sched_tree *tree, hwloc_obj_t obj, struct starpu_sched_component_specs specs, unsigned sched_ctx_id) { STARPU_ASSERT(obj); struct starpu_sched_component * component = NULL; /*set components for this obj */ #define CASE(ENUM,spec_member) \ case ENUM: \ if(specs.spec_member) \ component = starpu_sched_component_composed_component_create(tree, specs.spec_member); \ break switch(obj->type) { CASE(HWLOC_OBJ_MACHINE,hwloc_machine_composed_sched_component); CASE(HWLOC_OBJ_GROUP,hwloc_component_composed_sched_component); CASE(HWLOC_OBJ_NUMANODE,hwloc_component_composed_sched_component); CASE(HWLOC_OBJ_SOCKET,hwloc_socket_composed_sched_component); #ifdef HWLOC_OBJ_CACHE CASE(HWLOC_OBJ_CACHE,hwloc_cache_composed_sched_component); #endif #ifdef HWLOC_OBJ_L1CACHE CASE(HWLOC_OBJ_L1CACHE,hwloc_cache_composed_sched_component); CASE(HWLOC_OBJ_L2CACHE,hwloc_cache_composed_sched_component); CASE(HWLOC_OBJ_L3CACHE,hwloc_cache_composed_sched_component); CASE(HWLOC_OBJ_L4CACHE,hwloc_cache_composed_sched_component); CASE(HWLOC_OBJ_L5CACHE,hwloc_cache_composed_sched_component); #endif default: break; } struct sched_component_list l; init_list(&l); unsigned i; /* collect childs component's */ for(i = 0; i < obj->arity; i++) { struct sched_component_list lc = helper_make_scheduler(tree, obj->children[i],specs, sched_ctx_id); unsigned j; for(j = 0; j < lc.size; j++) add_component(&l, lc.arr[j]); destroy_list(&lc); } if(!component) return l; for(i = 0; i < l.size; i++) starpu_sched_component_connect(component, l.arr[i]); destroy_list(&l); init_list(&l); component->obj = obj; add_component(&l, component); return l; } /* return the firt component in prefix order such as component->obj == obj, or NULL */ static struct starpu_sched_component * _find_sched_component_with_obj(struct starpu_sched_component * component, hwloc_obj_t obj) { if(component == NULL) return NULL; if(component->obj == obj) return component; unsigned i; for(i = 0; i < component->nchildren; i++) { struct starpu_sched_component * tmp = _find_sched_component_with_obj(component->children[i], obj); if(tmp) return tmp; } return NULL; } /* return true if all workers in the tree have the same perf_arch as w_ref, * if there is no worker it return true */ static int is_same_kind_of_all(struct starpu_sched_component * root, struct _starpu_worker * w_ref) { if(starpu_sched_component_is_worker(root)) { struct _starpu_worker * w = root->data; STARPU_ASSERT(w->perf_arch.ndevices == 1); return w->perf_arch.devices[0].type == w_ref->perf_arch.devices[0].type; } unsigned i; for(i = 0;i < root->nchildren; i++) if(!is_same_kind_of_all(root->children[i], w_ref)) return 0; return 1; } /* buggy function * return the starpu_sched_component linked to the supposed memory component of worker_component */ static struct starpu_sched_component * find_mem_component(struct starpu_sched_component * root, struct starpu_sched_component * worker_component) { struct starpu_sched_component * component = worker_component; while(component->obj->type != HWLOC_OBJ_NUMANODE && component->obj->type != HWLOC_OBJ_GROUP && component->obj->type != HWLOC_OBJ_MACHINE) { hwloc_obj_t tmp = component->obj; do { component = _find_sched_component_with_obj(root,tmp); tmp = tmp->parent; } while(!component); } return component; } static struct starpu_sched_component * where_should_we_plug_this(struct starpu_sched_component *root, struct starpu_sched_component * worker_component, struct starpu_sched_component_specs specs, unsigned sched_ctx_id) { struct starpu_sched_component * mem = find_mem_component(root ,worker_component); if(specs.mix_heterogeneous_workers || mem->parents[sched_ctx_id] == NULL) return mem; hwloc_obj_t obj = mem->obj; struct starpu_sched_component * parent = mem->parents[sched_ctx_id]; unsigned i; for(i = 0; i < parent->nchildren; i++) { if(parent->children[i]->obj == obj && is_same_kind_of_all(parent->children[i], worker_component->data)) return parent->children[i]; } if(obj->type == HWLOC_OBJ_NUMANODE || obj->type == HWLOC_OBJ_GROUP) { struct starpu_sched_component * component = starpu_sched_component_composed_component_create(root->tree, specs.hwloc_component_composed_sched_component); component->obj = obj; starpu_sched_component_connect(parent, component); return component; } return parent; } static void set_worker_leaf(struct starpu_sched_component * root, struct starpu_sched_component * worker_component, unsigned sched_ctx_id, struct starpu_sched_component_specs specs) { struct _starpu_worker * worker = worker_component->data; struct starpu_sched_component * component = where_should_we_plug_this(root,worker_component,specs, sched_ctx_id); struct starpu_sched_component_composed_recipe * recipe = specs.worker_composed_sched_component ? specs.worker_composed_sched_component(worker->arch):NULL; STARPU_ASSERT(component); if(recipe) { struct starpu_sched_component * tmp = starpu_sched_component_composed_component_create(root->tree, recipe); #ifdef STARPU_DEVEL #warning FIXME component->obj is set to worker_component->obj even for accelerators workers #endif tmp->obj = worker_component->obj; starpu_sched_component_connect(component, tmp); component = tmp; } starpu_sched_component_composed_recipe_destroy(recipe); starpu_sched_component_connect(component, worker_component); } #ifdef STARPU_DEVEL static const char * name_hwloc_component(struct starpu_sched_component * component) { return hwloc_obj_type_string(component->obj->type); } static const char * name_sched_component(struct starpu_sched_component * component) { if(starpu_sched_component_is_fifo(component)) return "fifo component"; if(starpu_sched_component_is_heft(component)) return "heft component"; if(starpu_sched_component_is_random(component)) return "random component"; if(starpu_sched_component_is_worker(component)) { struct _starpu_worker * w = _starpu_sched_component_worker_get_worker(component); #define SIZE 256 static char output[SIZE]; snprintf(output, SIZE,"component worker %d %s",w->workerid,w->name); return output; } if(starpu_sched_component_is_work_stealing(component)) return "work stealing component"; return "unknown"; } static void helper_display_scheduler(FILE* out, unsigned depth, struct starpu_sched_component * component) { if(!component) return; fprintf(out,"%*s-> %s : %s\n", depth * 2 , "", name_sched_component(component), name_hwloc_component(component)); unsigned i; for(i = 0; i < component->nchildren; i++) helper_display_scheduler(out, depth + 1, component->children[i]); } #endif //STARPU_DEVEL struct starpu_sched_tree * starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs specs) { struct starpu_sched_tree * tree = starpu_sched_tree_create(sched_ctx_id); struct _starpu_machine_config *config = _starpu_get_machine_config(); hwloc_topology_t topology = config->topology.hwtopology; struct sched_component_list list = helper_make_scheduler(tree, hwloc_get_root_obj(topology), specs, sched_ctx_id); STARPU_ASSERT(list.size == 1); tree->root = list.arr[0]; destroy_list(&list); unsigned i; for(i = 0; i < starpu_worker_get_count(); i++) { struct _starpu_worker *worker = _starpu_get_worker_struct(i); struct starpu_sched_component *worker_component = starpu_sched_component_worker_new(sched_ctx_id, i); STARPU_ASSERT(worker); set_worker_leaf(tree->root,worker_component, sched_ctx_id, specs); } starpu_sched_tree_update_workers(tree); #ifdef STARPU_DEVEL _STARPU_MSG("scheduler created :\n"); helper_display_scheduler(stderr, 0, tree->root); #endif return tree; } starpu-1.3.9+dfsg/src/sched_policies/work_stealing_policy.c000066400000000000000000000723431413463044200241320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #include /* Experimental (dead) code which needs to be tested, fixed... */ /* #define USE_OVERLOAD */ /* * 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 */ #ifdef USE_LOCALITY_TASKS struct locality_entry { UT_hash_handle hh; starpu_data_handle_t data; struct starpu_task *task; }; #endif struct _starpu_work_stealing_data_per_worker { char fill1[STARPU_CACHELINE_SIZE]; /* This is read-mostly, only updated when the queue becomes empty or * becomes non-empty, to make it generally cheap to check */ unsigned notask; /* whether the queue is empty */ char fill2[STARPU_CACHELINE_SIZE]; struct _starpu_prio_deque queue; int running; int *proxlist; int busy; /* Whether this worker is working on a task */ /* keep track of the work performed from the beginning of the algorithm to make * better decisions about which queue to select when deferring work */ unsigned last_pop_worker; #ifdef USE_LOCALITY_TASKS /* This records the same as queue, 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 { int (*select_victim)(struct _starpu_work_stealing_data *, unsigned, int); struct _starpu_work_stealing_data_per_worker *per_worker; /* keep track of the work performed from the beginning of the algorithm to make * better decisions about which queue to select when deferring work */ 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(struct _starpu_work_stealing_data *ws, unsigned sched_ctx_id) { unsigned workerid = starpu_worker_get_id_check(); unsigned worker = ws->per_worker[workerid].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 */ if (!ws->per_worker[workerids[worker]].notask) { if (ws->per_worker[workerids[worker]].busy || starpu_worker_is_blocked_in_parallel(workerids[worker])) { ntasks = 1; break; } } worker = (worker + 1) % nworkers; if (worker == ws->per_worker[workerid].last_pop_worker) { /* We got back to the first worker, * don't go in infinite loop */ ntasks = 0; break; } } ws->per_worker[workerid].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_work_stealing_data *ws, struct starpu_task *task, unsigned 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 (!ws->per_worker[workerids[worker]].running || !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_work_stealing_data *ws, struct starpu_task *task, unsigned 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; 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; unsigned best_ndata = 0; 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].running && 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_work_stealing_data *ws, 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_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_work_stealing_data *ws, struct starpu_task *task, int workerid, unsigned 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 = NULL; 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_prio_deque_pop_this_task(&data_source->queue, target, best_task)) { if (!data_source->queue.ntasks) { STARPU_ASSERT(ws->per_worker[source].notask == 0); ws->per_worker[source].notask = 1; } return best_task; } } /* Didn't find an interesting task, or couldn't run it :( */ int skipped; struct starpu_task *task; if (source != target) task = _starpu_prio_deque_deque_task_for_worker(&data_source->queue, target, &skipped); else task = _starpu_prio_deque_pop_task_for_worker(&data_source->queue, target, &skipped); if (task && !data_source->queue.ntasks) { STARPU_ASSERT(ws->per_worker[source].notask == 0); ws->per_worker[source].notask = 1; } return task; } /* Called when popping a task from a queue */ static void locality_popped_task(struct _starpu_work_stealing_data *ws, struct starpu_task *task, int workerid, unsigned 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_work_stealing_data *ws STARPU_ATTRIBUTE_UNUSED, 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_work_stealing_data *ws STARPU_ATTRIBUTE_UNUSED, 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) { int skipped; struct starpu_task *task; if (source != target) task = _starpu_prio_deque_deque_task_for_worker(&ws->per_worker[source].queue, target, &skipped); else task = _starpu_prio_deque_pop_task_for_worker(&ws->per_worker[source].queue, target, &skipped); if (task && !ws->per_worker[source].queue.ntasks) { STARPU_ASSERT(ws->per_worker[source].notask == 0); ws->per_worker[source].notask = 1; } return task; } /* Called when popping a task from a queue */ static void locality_popped_task(struct _starpu_work_stealing_data *ws STARPU_ATTRIBUTE_UNUSED, 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(struct _starpu_work_stealing_data *ws, unsigned sched_ctx_id, unsigned id) { float execution_ratio = 0.0f; float current_ratio = 0.0f; int nprocessed = _starpu_get_deque_nprocessed(ws->per_worker[id].queue); unsigned njobs = _starpu_get_deque_njobs(ws->per_worker[id].queue); /* 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(struct _starpu_work_stealing_data *ws, unsigned sched_ctx_id) { 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(ws, 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)) { unsigned worker = workers->get_next(workers, &it); float worker_ratio = overload_metric(ws, sched_ctx_id, worker); if (worker_ratio > best_ratio && ws->per_worker[worker].running && 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_work_stealing_data *ws, 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 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)) { unsigned worker = workers->get_next(workers, &it); float worker_ratio = overload_metric(ws, sched_ctx_id, worker); if (worker_ratio < best_ratio && ws->per_worker[worker].running && 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(struct _starpu_work_stealing_data *ws, unsigned sched_ctx_id, int workerid STARPU_ATTRIBUTE_UNUSED) { #ifdef USE_OVERLOAD return select_victim_overload(ws, sched_ctx_id); #else return select_victim_round_robin(ws, 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_work_stealing_data *ws, struct starpu_task *task, unsigned sched_ctx_id) { #ifdef USE_OVERLOAD return select_worker_overload(ws, task, sched_ctx_id); #else return select_worker_round_robin(ws, 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(); if (ws->per_worker[workerid].busy) ws->per_worker[workerid].busy = 0; #ifdef STARPU_NON_BLOCKING_DRIVERS if (STARPU_RUNNING_ON_VALGRIND || !_starpu_prio_deque_is_empty(&ws->per_worker[workerid].queue)) #endif { task = ws_pick_task(ws, workerid, workerid); if (task) locality_popped_task(ws, task, workerid, sched_ctx_id); } if(task) { /* there was a local task */ ws->per_worker[workerid].busy = 1; if (_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); starpu_sched_ctx_list_task_counters_decrement(sched_ctx_id, workerid); if (_starpu_sched_ctx_worker_is_master_for_child_ctx(sched_ctx_id, workerid, task)) task = NULL; _starpu_sched_ctx_unlock_write(sched_ctx_id); } return task; } /* we need to steal someone's job */ starpu_worker_relax_on(); int victim = ws->select_victim(ws, sched_ctx_id, workerid); starpu_worker_relax_off(); if (victim == -1) { return NULL; } if (_starpu_worker_trylock(victim)) { /* victim is busy, don't bother it, come back later */ return NULL; } if (ws->per_worker[victim].running && ws->per_worker[victim].queue.ntasks > 0) { task = ws_pick_task(ws, victim, workerid); } if (task) { _STARPU_TRACE_WORK_STEALING(workerid, victim); starpu_sched_task_break(task); starpu_sched_ctx_list_task_counters_decrement(sched_ctx_id, victim); record_data_locality(task, workerid); record_worker_locality(ws, task, workerid, sched_ctx_id); locality_popped_task(ws, task, victim, sched_ctx_id); } starpu_worker_unlock(victim); #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. */ { struct _starpu_worker *worker = _starpu_get_worker_struct(starpu_worker_get_id()); if (!task && worker->state_keep_awake) { task = ws_pick_task(ws, workerid, workerid); if (task) { /* keep_awake notice taken into account here, clear flag */ worker->state_keep_awake = 0; locality_popped_task(ws, task, workerid, sched_ctx_id); } } } #endif if (task &&_starpu_get_nsched_ctxs() > 1) { starpu_worker_relax_on(); _starpu_sched_ctx_lock_write(sched_ctx_id); starpu_worker_relax_off(); if (_starpu_sched_ctx_worker_is_master_for_child_ctx(sched_ctx_id, workerid, task)) task = NULL; _starpu_sched_ctx_unlock_write(sched_ctx_id); if (!task) return NULL; } if (ws->per_worker[workerid].busy != !!task) 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; #ifdef USE_LOCALITY workerid = select_worker_locality(ws, 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(ws, task, sched_ctx_id); starpu_worker_lock(workerid); STARPU_AYU_ADDTOTASKQUEUE(starpu_task_get_job_id(task), workerid); starpu_sched_task_break(task); record_data_locality(task, workerid); STARPU_ASSERT_MSG(ws->per_worker[workerid].running, "workerid=%d, ws=%p\n", workerid, ws); _starpu_prio_deque_push_back_task(&ws->per_worker[workerid].queue, task); if (ws->per_worker[workerid].queue.ntasks == 1) { STARPU_ASSERT(ws->per_worker[workerid].notask == 1); ws->per_worker[workerid].notask = 0; } locality_pushed_task(ws, task, workerid, sched_ctx_id); starpu_push_task_end(task); starpu_worker_unlock(workerid); starpu_sched_ctx_list_task_counters_increment(sched_ctx_id, workerid); #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_relax_light(workers->get_next(workers, &it)); #endif return 0; } static void ws_push_task_notify(struct starpu_task *task, int workerid, int perf_workerid, unsigned sched_ctx_id) { (void)task; (void)perf_workerid; struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); ws->per_worker[workerid].busy = 1; } 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; for (i = 0; i < nworkers; i++) { int workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); _starpu_prio_deque_init(&ws->per_worker[workerid].queue); ws->per_worker[workerid].notask = 1; ws->per_worker[workerid].running = 1; /* Tell helgrind that we are fine with getting outdated values, * this is just an estimation */ STARPU_HG_DISABLE_CHECKING(ws->per_worker[workerid].notask); STARPU_HG_DISABLE_CHECKING(ws->per_worker[workerid].queue.ntasks); 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; for (i = 0; i < nworkers; i++) { int workerid = workerids[i]; _starpu_prio_deque_destroy(&ws->per_worker[workerid].queue); ws->per_worker[workerid].running = 0; free(ws->per_worker[workerid].proxlist); ws->per_worker[workerid].proxlist = NULL; } } static void initialize_ws_policy(unsigned sched_ctx_id) { 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_push_worker = 0; STARPU_HG_DISABLE_CHECKING(ws->last_push_worker); ws->select_victim = select_victim; unsigned nw = starpu_worker_get_count(); _STARPU_CALLOC(ws->per_worker, nw, sizeof(struct _starpu_work_stealing_data_per_worker)); /* 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 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); } 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, .push_task_notify = ws_push_task_notify, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "ws", .policy_description = "work stealing", .worker_type = STARPU_WORKER_LIST, }; /* local work stealing policy */ /* 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 */ #ifdef STARPU_HAVE_HWLOC static int lws_select_victim(struct _starpu_work_stealing_data *ws, unsigned sched_ctx_id, int workerid) { int nworkers = starpu_sched_ctx_get_nworkers(sched_ctx_id); int i; for (i = 0; i < nworkers; i++) { int neighbor = ws->per_worker[workerid].proxlist[i]; if (ws->per_worker[neighbor].notask) continue; /* FIXME: do not keep looking again and again at some worker * which has tasks, but that can't execute on me */ if (ws->per_worker[neighbor].busy || starpu_worker_is_blocked_in_parallel(neighbor)) return neighbor; } return -1; } #endif static void lws_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { ws_add_workers(sched_ctx_id, workerids, nworkers); #ifdef STARPU_HAVE_HWLOC struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* 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; unsigned i; /* 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 workerid = workerids[i]; if (ws->per_worker[workerid].proxlist == NULL) _STARPU_CALLOC(ws->per_worker[workerid].proxlist, STARPU_NMAXWORKERS, sizeof(int)); int bindid; struct starpu_sched_ctx_iterator it; workers->init_iterator(workers, &it); bindid = starpu_worker_get_bindid(workerid); it.value = starpu_tree_get(tree, bindid); int cnt = 0; for(;;) { struct starpu_tree *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 initialize_lws_policy(unsigned sched_ctx_id) { /* lws is loosely based on ws, except that it might use hwloc. */ initialize_ws_policy(sched_ctx_id); if (starpu_worker_get_count() != starpu_cpu_worker_get_count() || starpu_memory_nodes_get_numa_count() > 1 ) { _STARPU_DISP("Warning: you are running the default lws scheduler, which is not a very smart scheduler, while the system has GPUs or several memory nodes. 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"); } #ifdef STARPU_HAVE_HWLOC struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data *)starpu_sched_ctx_get_policy_data(sched_ctx_id); ws->select_victim = lws_select_victim; #endif } struct starpu_sched_policy _starpu_sched_lws_policy = { .init_sched = initialize_lws_policy, .deinit_sched = deinit_ws_policy, .add_workers = lws_add_workers, .remove_workers = ws_remove_workers, .push_task = ws_push_task, .pop_task = ws_pop_task, .push_task_notify = ws_push_task_notify, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "lws", .policy_description = "locality work stealing", #ifdef STARPU_HAVE_HWLOC .worker_type = STARPU_WORKER_TREE, #else .worker_type = STARPU_WORKER_LIST, #endif }; starpu-1.3.9+dfsg/src/starpu_parameters.h000066400000000000000000000022571413463044200204710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 /** @file */ /* 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_MPI_MS_ALPHA 1.0f #endif /* _STARPU_PARAMETERS_H */ starpu-1.3.9+dfsg/src/util/000077500000000000000000000000001413463044200155265ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/util/execute_on_all.c000066400000000000000000000101751413463044200206640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/util/file.c000066400000000000000000000020511413463044200166070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/src/util/fstarpu.c000066400000000000000000000636431413463044200173720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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_cl_args_nfree = STARPU_CL_ARGS_NFREE; static const intptr_t fstarpu_task_deps_array = STARPU_TASK_DEPS_ARRAY; static const intptr_t fstarpu_task_end_deps_array = STARPU_TASK_END_DEPS_ARRAY; 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_with_arg_nfree = STARPU_CALLBACK_WITH_ARG_NFREE; static const intptr_t fstarpu_callback_arg = STARPU_CALLBACK_ARG; static const intptr_t fstarpu_callback_arg_nfree= STARPU_CALLBACK_ARG_NFREE; 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_arg_nfree = STARPU_PROLOGUE_CALLBACK_ARG_NFREE; 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_prologue_callback_pop_arg_nfree = STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE; 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_where = STARPU_EXECUTE_WHERE; 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_task_color = STARPU_TASK_COLOR; static const intptr_t fstarpu_handles_sequential_consistency = STARPU_HANDLES_SEQUENTIAL_CONSISTENCY; static const intptr_t fstarpu_task_end_dep = STARPU_TASK_END_DEP; static const intptr_t fstarpu_task_synchronous = STARPU_TASK_SYNCHRONOUS; static const intptr_t fstarpu_node_selection_policy = STARPU_NODE_SELECTION_POLICY; static const intptr_t fstarpu_task_workerids = STARPU_TASK_WORKERIDS; static const intptr_t fstarpu_sequential_consistency = STARPU_SEQUENTIAL_CONSISTENCY; static const intptr_t fstarpu_task_profiling_info = STARPU_TASK_PROFILING_INFO; static const intptr_t fstarpu_task_no_submitorder = STARPU_TASK_NO_SUBMITORDER; static const intptr_t fstarpu_task_sched_data = STARPU_TASK_SCHED_DATA; 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_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_sched_ctx_policy_init = STARPU_SCHED_CTX_POLICY_INIT; static const intptr_t fstarpu_sched_ctx_user_data = STARPU_SCHED_CTX_USER_DATA; 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_codelet_simgrid_execute = STARPU_CODELET_SIMGRID_EXECUTE; static const intptr_t fstarpu_starpu_codelet_simgrid_execute_and_inject = STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT; static const intptr_t fstarpu_starpu_cuda_async = STARPU_CUDA_ASYNC; static const intptr_t fstarpu_starpu_opencl_async = STARPU_OPENCL_ASYNC; //static const intptr_t fstarpu_per_worker = STARPU_PER_WORKER; //static const intptr_t fstarpu_per_arch = STARPU_PER_ARCH; //static const intptr_t fstarpu_per_common = STARPU_COMMON; static const intptr_t fstarpu_history_based = STARPU_HISTORY_BASED; static const intptr_t fstarpu_regression_based = STARPU_REGRESSION_BASED; static const intptr_t fstarpu_nl_regression_based = STARPU_NL_REGRESSION_BASED; static const intptr_t fstarpu_multiple_regression_based = STARPU_MULTIPLE_REGRESSION_BASED; 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_CL_ARGS_NFREE")) { return fstarpu_cl_args_nfree; } else if (!strcmp(s, "FSTARPU_TASK_DEPS_ARRAY")) { return fstarpu_task_deps_array; } else if (!strcmp(s, "FSTARPU_TASK_END_DEPS_ARRAY")) { return fstarpu_task_end_deps_array; } 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_WITH_ARG_NFREE")) { return fstarpu_callback_with_arg_nfree; } else if (!strcmp(s, "FSTARPU_CALLBACK_ARG")) { return fstarpu_callback_arg; } else if (!strcmp(s, "FSTARPU_CALLBACK_ARG_NFREE")) { return fstarpu_callback_arg_nfree; } 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_ARG_NFREE")) { return fstarpu_prologue_callback_arg_nfree; } 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_PROLOGUE_CALLBACK_POP_ARG_NFREE")) { return fstarpu_prologue_callback_pop_arg_nfree; } 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_WHERE")) { return fstarpu_execute_where; } 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_TASK_COLOR")) { return fstarpu_task_color; } else if (!strcmp(s, "FSTARPU_HANDLES_SEQUENTIAL_CONSISTENCY")) { return fstarpu_handles_sequential_consistency; } else if (!strcmp(s, "FSTARPU_TASK_END_DEP")) { return fstarpu_task_end_dep; } else if (!strcmp(s, "FSTARPU_TASK_WORKERIDS")) { return fstarpu_task_workerids; } else if (!strcmp(s, "FSTARPU_TASK_SYNCHRONOUS")) { return fstarpu_task_synchronous; } else if (!strcmp(s, "FSTARPU_SEQUENTIAL_CONSISTENCY")) { return fstarpu_sequential_consistency; } else if (!strcmp(s, "FSTARPU_TASK_PROFILING_INFO")) { return fstarpu_task_profiling_info; } else if (!strcmp(s, "FSTARPU_TASK_NO_SUBMITORDER")) { return fstarpu_task_no_submitorder; } else if (!strcmp(s, "FSTARPU_TASK_SCHED_DATA")) { return fstarpu_task_sched_data; } 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_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_SCHED_CTX_POLICY_INIT")) { return fstarpu_sched_ctx_policy_init; } else if (!strcmp(s, "FSTARPU_SCHED_CTX_USER_DATA")) { return fstarpu_sched_ctx_user_data; } 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_CODELET_SIMGRID_EXECUTE")) { return fstarpu_starpu_codelet_simgrid_execute; } else if (!strcmp(s, "FSTARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT")) { return fstarpu_starpu_codelet_simgrid_execute_and_inject; } 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 if (!strcmp(s, "FSTARPU_PER_WORKER")) { return fstarpu_per_worker; } // else if (!strcmp(s, "FSTARPU_PER_ARCH")) { return fstarpu_per_arch; } // else if (!strcmp(s, "FSTARPU_COMMON")) { return fstarpu_per_common; } else if (!strcmp(s, "FSTARPU_HISTORY_BASED")) { return fstarpu_history_based; } else if (!strcmp(s, "FSTARPU_REGRESSION_BASED")) { return fstarpu_regression_based; } else if (!strcmp(s, "FSTARPU_NL_REGRESSION_BASED")) { return fstarpu_nl_regression_based; } else if (!strcmp(s, "FSTARPU_MULTIPLE_REGRESSION_BASED")) { return fstarpu_multiple_regression_based; } else { _STARPU_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_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_set_model(struct starpu_codelet *cl, struct starpu_perfmodel *cl_perfmodel) { cl->model = cl_perfmodel; } void fstarpu_codelet_set_energy_model(struct starpu_codelet *cl, struct starpu_perfmodel *cl_perfmodel) { cl->energy_model = cl_perfmodel; } 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; } } _STARPU_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; } } _STARPU_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; } } _STARPU_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; } } _STARPU_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; } } _STARPU_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; } } _STARPU_ERROR("fstarpu: too many mic 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) { _STARPU_ERROR("fstarpu: invalid data mode"); } if (cl->nbuffers < (int) max_modes) { cl->modes[cl->nbuffers] = (unsigned int)mode; cl->nbuffers++; } else { _STARPU_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 { _STARPU_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; } STARPU_ATTRIBUTE_MALLOC struct starpu_perfmodel *fstarpu_perfmodel_allocate(void) { struct starpu_perfmodel *model; _STARPU_CALLOC(model, 1, sizeof(*model)); return model; } void fstarpu_perfmodel_free(struct starpu_perfmodel *model) { memset(model, 0, sizeof(*model)); free(model); } void fstarpu_perfmodel_set_symbol(struct starpu_perfmodel *model, const char *model_symbol) { model->symbol = model_symbol; } void fstarpu_perfmodel_set_type(struct starpu_perfmodel *model, intptr_t type) { STARPU_ASSERT(type == fstarpu_history_based || type == fstarpu_regression_based || type == fstarpu_nl_regression_based || type == fstarpu_multiple_regression_based); model->type = type; } 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); } unsigned fstarpu_worker_get_ids_by_type(intptr_t type, int *workerids, unsigned 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) { void *ptr; _STARPU_CALLOC(ptr, (size_t)nb, sizeof(starpu_data_handle_t)); return ptr; } 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) { void *ptr; _STARPU_CALLOC(ptr, (size_t)nb, sizeof(struct starpu_data_descr)); return ptr; } 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.3.9+dfsg/src/util/misc.c000066400000000000000000000033211413463044200166240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/src/util/openmp_runtime_support.c000066400000000000000000002353531413463044200225420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; starpu_pthread_key_t _starpu_omp_thread_key; starpu_pthread_key_t _starpu_omp_task_key; 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(_starpu_omp_thread_key); return thread; } static inline void _starpu_omp_set_thread(struct starpu_omp_thread *thread) { STARPU_PTHREAD_SETSPECIFIC(_starpu_omp_thread_key, thread); } struct starpu_omp_task *_starpu_omp_get_task(void) { struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(_starpu_omp_task_key); return task; } static inline void _starpu_omp_set_task(struct starpu_omp_task *task) { STARPU_PTHREAD_SETSPECIFIC(_starpu_omp_task_key, task); } struct starpu_omp_region *_starpu_omp_get_region_at_level(int level) { const struct starpu_omp_task *task = _starpu_omp_get_task(); struct starpu_omp_region *parallel_region; if (!task) return NULL; parallel_region = task->owner_region; if (level < 0 || level > parallel_region->icvs.levels_var) return NULL; while (level < parallel_region->icvs.levels_var) { parallel_region = parallel_region->parent_region; } return parallel_region; } 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; int tid = starpu_omp_thread_list_member(®ion->thread_list, thread); if (tid >= 0) return tid+1; _STARPU_ERROR("unrecognized omp thread\n"); } 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, enum starpu_omp_task_wait_on flag) { struct starpu_omp_task *task = _starpu_omp_get_task(); struct starpu_omp_task_link link; _starpu_spin_lock(&task->lock); task->wait_on |= flag; 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, enum starpu_omp_task_wait_on flag) { 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 & flag); next_task->wait_on &= ~flag; 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_omp_get_thread(); if (thread == NULL) { struct _starpu_worker *starpu_worker = _starpu_get_local_worker_key(); STARPU_ASSERT(starpu_worker != NULL); thread = get_worker_thread(starpu_worker); if ( #ifdef STARPU_USE_CUDA (starpu_worker->arch != STARPU_CUDA_WORKER) && #endif #ifdef STARPU_USE_OPENCL (starpu_worker->arch != STARPU_OPENCL_WORKER) && #endif 1 ) { STARPU_ASSERT(thread != NULL); } if (thread != NULL) { _starpu_omp_set_thread(thread); } } return thread; } static struct starpu_omp_thread * __attribute__ ((noinline)) _get_local_thread_noinline(void) { return get_local_thread(); } static struct starpu_omp_critical *create_omp_critical_struct(void) { struct starpu_omp_critical *critical; _STARPU_CALLOC(critical, 1, 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_CALLOC(device, 1, 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_CALLOC(region, 1, 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_omp_set_task(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->flags & STARPU_OMP_TASK_FLAGS_IMPLICIT)); struct _starpu_worker *starpu_worker = _starpu_get_local_worker_key(); /* XXX on work */ if (task->is_loop) { starpu_omp_for_inline_first_alt(task->nb_iterations, task->chunk, starpu_omp_sched_static, 1, &task->begin_i, &task->end_i); } if (starpu_worker->arch == STARPU_CPU_WORKER) { task->cpu_f(task->starpu_buffers, task->starpu_cl_arg); } #ifdef STARPU_USE_CUDA else if (starpu_worker->arch == STARPU_CUDA_WORKER) { task->cuda_f(task->starpu_buffers, task->starpu_cl_arg); } #endif #ifdef 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_omp_get_thread(); /* * 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_omp_get_thread(); STARPU_ASSERT(task->flags & STARPU_OMP_TASK_FLAGS_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_omp_get_task(); struct starpu_omp_thread *thread = _starpu_omp_get_thread(); 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->flags & STARPU_OMP_TASK_FLAGS_IMPLICIT); _starpu_omp_set_task(task); /* get_local_thread() inlining triggers a clobbering warning with some * versions of GCC, thus we explicitly call the noinline variant */ struct starpu_omp_thread *thread = _get_local_thread_noinline(); 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_omp_set_task(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->flags & STARPU_OMP_TASK_FLAGS_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->flags & STARPU_OMP_TASK_FLAGS_IMPLICIT)); _starpu_omp_set_task(task); /* get_local_thread() inlining triggers a clobbering warning with some * versions of GCC, thus we explicitly call the noinline variant */ struct starpu_omp_thread *thread = _get_local_thread_noinline(); 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 ( #ifdef STARPU_USE_CUDA (starpu_worker->arch != STARPU_CUDA_WORKER) && #endif #ifdef 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->flags & STARPU_OMP_TASK_FLAGS_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_omp_set_task(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; if (is_implicit) { task->flags |= STARPU_OMP_TASK_FLAGS_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 int 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); if (initial_thread->initial_thread_stack == NULL) _STARPU_ERROR("memory allocation failed"); /* .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 */ struct starpu_conf omp_starpu_conf; 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); int check = _starpu_omp_environment_check(); if (check == 0) { STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_driver_init(&initial_thread->starpu_driver); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_init"); _starpu_omp_set_task(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)); if (_global_state.starpu_cpu_worker_ids == NULL) _STARPU_ERROR("memory allocation failed"); unsigned n = starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, _global_state.starpu_cpu_worker_ids, _global_state.nb_starpu_cpu_workers); STARPU_ASSERT(n == _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_omp_set_thread(initial_thread); register_thread_worker(initial_thread); } return check; } 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 int omp_initial_region_setup(void) { int ret = omp_initial_thread_setup(); if (ret != 0) return ret; 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->icvs.max_task_priority_var = _starpu_omp_initial_icv_values->max_task_priority_var; _global_state.initial_region->implicit_task_array = &_global_state.initial_task; return 0; } 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(&_starpu_omp_thread_key, NULL); STARPU_PTHREAD_KEY_CREATE(&_starpu_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(_starpu_omp_thread_key); STARPU_PTHREAD_KEY_DELETE(_starpu_omp_task_key); } } /* * Entry point to be called by the OpenMP runtime constructor */ int starpu_omp_init(void) { #ifdef STARPU_SIMGRID /* XXX: ideally we'd pass the real argc/argv. */ /* We have to tell simgrid to avoid cleaning up at exit, since that's before our destructor :/ */ # if SIMGRID_VERSION >= 32300 char *argv[] = { "program", "--cfg=debug/clean-atexit:0", NULL }; # else char *argv[] = { "program", "--cfg=clean-atexit:0", NULL }; # endif int argc = sizeof(argv) / sizeof(argv[0]) - 1; char **_argv = argv; /* Initialize simgrid before anything else. */ _starpu_simgrid_init_early(&argc, &_argv); #endif _starpu_omp_global_state = &_global_state; STARPU_PTHREAD_KEY_CREATE(&_starpu_omp_thread_key, NULL); STARPU_PTHREAD_KEY_CREATE(&_starpu_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; _global_state.environment_valid = omp_initial_region_setup(); /* init clock reference for starpu_omp_get_wtick */ _starpu_omp_clock_ref = starpu_timing_now(); return _global_state.environment_valid; } void starpu_omp_shutdown(void) { if (_global_state.environment_valid != 0) return; 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=NULL, *tmp=NULL; 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=NULL, *tmp=NULL; 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(_starpu_omp_task_key); STARPU_PTHREAD_KEY_DELETE(_starpu_omp_thread_key); #ifdef STARPU_SIMGRID _starpu_simgrid_deinit_late(); #endif } 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_omp_get_thread(); struct starpu_omp_task *task = _starpu_omp_get_task(); 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; new_region->icvs.max_task_priority_var = generating_region->icvs.max_task_priority_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_omp_get_task(); 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_omp_get_task(); /* Assume barriers are performed in by the implicit tasks of a parallel_region */ STARPU_ASSERT(task->flags & STARPU_OMP_TASK_FLAGS_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) { if (starpu_omp_master_inline()) 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_omp_get_task(); struct starpu_omp_thread *thread = _starpu_omp_get_thread(); /* Assume master is performed in by the implicit tasks of a region */ STARPU_ASSERT(task->flags & STARPU_OMP_TASK_FLAGS_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) { if (starpu_omp_single_inline()) 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_omp_get_task(); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->flags & STARPU_OMP_TASK_FLAGS_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_omp_get_task(); struct starpu_omp_region *region = task->owner_region; int first = starpu_omp_single_inline(); 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_omp_get_task(); struct starpu_omp_region *region = task->owner_region; int first = starpu_omp_single_inline(); if (first) { task->single_first = 1; region->copy_private_data = data; return NULL; } starpu_omp_barrier(); return region->copy_private_data; } void starpu_omp_single_copyprivate_inline_end(void) { struct starpu_omp_task *task = _starpu_omp_get_task(); /* Assume singles are performed in by the implicit tasks of a region */ STARPU_ASSERT(task->flags & STARPU_OMP_TASK_FLAGS_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_omp_get_task(); 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->flags & STARPU_OMP_TASK_FLAGS_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_omp_get_task(); 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 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->flags & STARPU_OMP_TASK_FLAGS_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) { generated_task->flags |= STARPU_OMP_TASK_FLAGS_UNTIED; } if (is_final) { generated_task->flags |= STARPU_OMP_TASK_FLAGS_FINAL; } if (is_undeferred) { generated_task->flags |= STARPU_OMP_TASK_FLAGS_UNDEFERRED; } // XXX taskgroup exist if (!attr->nogroup_clause) { generated_task->task_group = generating_task->task_group; } generated_task->rank = -1; /* XXX taskloop attributes */ generated_task->is_loop = attr->is_loop; generated_task->nb_iterations = attr->nb_iterations; generated_task->grainsize = attr->grainsize; generated_task->chunk = attr->chunk; generated_task->begin_i = attr->begin_i; generated_task->end_i = attr->end_i; /* * 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; } #ifdef 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 #ifdef 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_omp_get_task(); _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_omp_get_task(); 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_omp_get_task(); 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_omp_get_task(); _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); } // XXX on work void starpu_omp_taskloop_inline_begin(struct starpu_omp_task_region_attr *attr) { if (!attr->nogroup_clause) { starpu_omp_taskgroup_inline_begin(); } int nb_subloop; if (attr->num_tasks) { nb_subloop = attr->num_tasks; } else if (attr->grainsize) { nb_subloop = attr->nb_iterations / attr->grainsize; } else { nb_subloop = 4; } attr->is_loop = 1; int i; int nb_iter_i = attr->nb_iterations / nb_subloop; for (i = 0; i < nb_subloop; i++) { attr->begin_i = nb_iter_i * i; attr->end_i = attr->begin_i + nb_iter_i; attr->end_i += (i+1 != nb_subloop) ? 0 : (attr->nb_iterations % nb_subloop); attr->chunk = attr->end_i - attr->begin_i; starpu_omp_task_region(attr); } } // XXX on work void starpu_omp_taskloop_inline_end(const struct starpu_omp_task_region_attr *attr) { if (!attr->nogroup_clause) { starpu_omp_taskgroup_inline_end(); } } 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_omp_get_task(); 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_omp_get_task(); 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) { starpu_omp_ordered_inline_begin(); f(arg); starpu_omp_ordered_inline_end(); } void starpu_omp_ordered_inline_begin(void) { struct starpu_omp_task *task = _starpu_omp_get_task(); 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, starpu_omp_task_wait_on_ordered); } } void starpu_omp_ordered_inline_end(void) { struct starpu_omp_task *task = _starpu_omp_get_task(); 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_omp_task_wait_on_ordered); _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_omp_get_task(); 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_omp_get_task(); 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_CALLOC(_lock, 1, 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, starpu_omp_task_wait_on_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_omp_task_wait_on_lock); _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_CALLOC(_nest_lock, 1, 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_omp_task_wait_on_nest_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_omp_task_wait_on_nest_lock); } _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) { /* FIXME Oli: rather iterate over all nodes? */ int node = starpu_data_get_home_node(handle); if (node < 0 || (starpu_node_get_kind(node) != STARPU_CPU_RAM)) node = STARPU_MAIN_RAM; struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); 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.3.9+dfsg/src/util/openmp_runtime_support.h000066400000000000000000000243701413463044200225420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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 extern starpu_pthread_key_t omp_thread_key; extern starpu_pthread_key_t omp_task_key; /** * 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; int max_task_priority_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; int max_task_priority_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_ordered = 1 << 5, starpu_omp_task_wait_on_lock = 1 << 6, starpu_omp_task_wait_on_nest_lock = 1 << 7, }; enum starpu_omp_task_flags { STARPU_OMP_TASK_FLAGS_IMPLICIT = 1 << 0, STARPU_OMP_TASK_FLAGS_UNDEFERRED = 1 << 1, STARPU_OMP_TASK_FLAGS_FINAL = 1 << 2, STARPU_OMP_TASK_FLAGS_UNTIED = 1 << 3, }; 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 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; enum starpu_omp_task_flags flags; /* * 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; /* * taskloop attribute * */ int is_loop; unsigned long long nb_iterations; unsigned long long grainsize; unsigned long long chunk; unsigned long long begin_i; unsigned long long end_i; ) 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; unsigned nb_starpu_cpu_workers; int *starpu_cpu_worker_ids; int environment_valid; }; /* * 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); int _starpu_omp_environment_check(void); struct starpu_omp_thread *_starpu_omp_get_thread(void); struct starpu_omp_region *_starpu_omp_get_region_at_level(int level); struct starpu_omp_task *_starpu_omp_get_task(void); int _starpu_omp_get_region_thread_num(const struct starpu_omp_region *const region); void _starpu_omp_dummy_init(void); void _starpu_omp_dummy_shutdown(void); #endif // STARPU_OPENMP #endif // __OPENMP_RUNTIME_SUPPORT_H__ starpu-1.3.9+dfsg/src/util/openmp_runtime_support_environment.c000066400000000000000000000520601413463044200251560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 #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, .max_task_priority_var = 0 }; struct starpu_omp_initial_icv_values *_starpu_omp_initial_icv_values = NULL; 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]; } } 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; } static int read_int_var(const char *str, int *dst) { char *endptr; int val; if (!str) return 0; errno = 0; /* To distinguish success/failure after call */ val = (int)strtol(str, &endptr, 10); /* Check for various possible errors */ if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) return 0; /* No digits were found. */ if (str == endptr) return 0; *dst = val; return 1; } static int _strings_cmp(const char *strings[], const char *str) { int mode = 0; while (strings[mode]) { if (strncasecmp(str, strings[mode], strlen(strings[mode])) == 0) break; mode++; } if (strings[mode] == NULL) return -1; return mode; } 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[] = { "undefined", "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 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 int _get_env_string_var(const char *str, const char *strings[], int *dst) { int val; if (!str) return 0; val = _strings_cmp(strings, str); if (val < 0) return 0; *dst = val; return 1; } static void read_proc_bind_var() { const int max_levels = _initial_icv_values.max_active_levels_var + 1; int *bind_list = NULL; char *env; _STARPU_CALLOC(bind_list, max_levels, sizeof(*bind_list)); env = starpu_getenv("OMP_PROC_BIND"); if (env) { static const char *strings[] = { "false", "true", "master", "close", "spread", NULL }; char *saveptr, *token; int level = 0; token = strtok_r(env, ",", &saveptr); for (; token != NULL; token = strtok_r(NULL, ",", &saveptr)) { int value; if (!_get_env_string_var(token, strings, &value)) { _STARPU_MSG("StarPU: Invalid value for environment variable OMP_PROC_BIND\n"); break; } bind_list[level++] = value; } } _initial_icv_values.bind_var = bind_list; } static void read_num_threads_var() { const int max_levels = _initial_icv_values.max_active_levels_var + 1; int *num_threads_list = NULL; char *env; _STARPU_CALLOC(num_threads_list, max_levels, sizeof(*num_threads_list)); env = starpu_getenv("OMP_NUM_THREADS"); if (env) { char *saveptr, *token; int level = 0; token = strtok_r(env, ",", &saveptr); for (; token != NULL; token = strtok_r(NULL, ",", &saveptr)) { int value; if (!read_int_var(token, &value)) { _STARPU_MSG("StarPU: Invalid value for environment variable OMP_NUM_THREADS\n"); break; } num_threads_list[level++] = value; } } _initial_icv_values.nthreads_var = num_threads_list; } static void read_omp_environment(void) { const char *boolean_strings[] = { "false", "true", NULL }; _initial_icv_values.dyn_var = starpu_get_env_string_var_default("OMP_DYNAMIC", boolean_strings, _initial_icv_values.dyn_var); _initial_icv_values.nest_var = starpu_get_env_string_var_default("OMP_NESTED", boolean_strings, _initial_icv_values.nest_var); read_sched_var("OMP_SCHEDULE", &_initial_icv_values.run_sched_var, &_initial_icv_values.run_sched_chunk_var); _initial_icv_values.stacksize_var = starpu_get_env_size_default("OMP_STACKSIZE", _initial_icv_values.stacksize_var); { const char *strings[] = { "passive", "active", NULL }; _initial_icv_values.wait_policy_var = starpu_get_env_string_var_default("OMP_WAIT_POLICY", strings, _initial_icv_values.wait_policy_var); } _initial_icv_values.thread_limit_var = starpu_get_env_number_default("OMP_THREAD_LIMIT", _initial_icv_values.thread_limit_var); _initial_icv_values.max_active_levels_var = starpu_get_env_number_default("OMP_MAX_ACTIVE_LEVELS", _initial_icv_values.max_active_levels_var); _initial_icv_values.cancel_var = starpu_get_env_string_var_default("OMP_CANCELLATION", boolean_strings, _initial_icv_values.cancel_var); _initial_icv_values.default_device_var = starpu_get_env_number_default("OMP_DEFAULT_DEVICE", _initial_icv_values.default_device_var); _initial_icv_values.max_task_priority_var = starpu_get_env_number_default("OMP_MAX_TASK_PRIORITY", _initial_icv_values.max_task_priority_var); /* Avoid overflow e.g. in num_threads_list allocation */ STARPU_ASSERT_MSG(_initial_icv_values.max_active_levels_var > 0 && _initial_icv_values.max_active_levels_var < 1000000, "OMP_MAX_ACTIVE_LEVELS should have a reasonable value"); /* TODO: check others */ read_proc_bind_var(); read_num_threads_var(); /* 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_MAX_TASK_PRIORITY */ /* 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; case starpu_omp_sched_undefined: default: 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_MAX_TASK_PRIORITY = '%d'\n", _starpu_omp_initial_icv_values->max_task_priority_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: 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_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; case starpu_omp_place_undefined: default: break; } if (places->abstract_length) { printf("(%d)", places->abstract_length); } } } printf("'\n"); printf(" [host] OMP_THREAD_LIMIT = '%d'\n", _initial_icv_values.thread_limit_var); if (verbosity_level > 1) { /* no vendor specific runtime variable */ } printf("OPENMP DISPLAY ENVIRONMENT END\n"); } } void _starpu_omp_environment_init(void) { read_omp_environment(); const char *strings[] = { "false", "true", "verbose", NULL }; int display_env = starpu_get_env_string_var_default("OMP_DISPLAY_ENV", strings, 0); if (display_env > 0) { display_omp_environment(display_env); } } int _starpu_omp_environment_check(void) { if (starpu_cpu_worker_get_count() == 0) { _STARPU_DISP("OpenMP support needs at least 1 CPU worker\n"); return -EINVAL; } int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct starpu_sched_policy *sched_policy = starpu_sched_ctx_get_sched_policy(i); if (sched_policy && (strcmp(sched_policy->policy_name, _starpu_sched_graph_test_policy.policy_name) == 0)) { _STARPU_DISP("OpenMP support is not compatible with scheduler '%s' ('%s')\n", _starpu_sched_graph_test_policy.policy_name, _starpu_sched_graph_test_policy.policy_description); return -EINVAL; } } return 0; } void _starpu_omp_environment_exit(void) { free_omp_environment(); } #endif /* STARPU_OPENMP */ starpu-1.3.9+dfsg/src/util/openmp_runtime_support_omp_api.c000066400000000000000000000167471413463044200242520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 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; } 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) { struct starpu_omp_region *parallel_region; if (level == 0) return 0; parallel_region = _starpu_omp_get_region_at_level(level); if (!parallel_region) return -1; return _starpu_omp_get_region_thread_num(parallel_region); } int starpu_omp_get_team_size (int level) { struct starpu_omp_region *parallel_region; if (level == 0) return 1; parallel_region = _starpu_omp_get_region_at_level(level); if (!parallel_region) return -1; 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->flags & STARPU_OMP_TASK_FLAGS_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; } int starpu_omp_get_num_places(void) { struct starpu_omp_place *places = &_starpu_omp_initial_icv_values->places; return places->nb_numeric_places; } int starpu_omp_get_place_num_procs(int place_num) { (void) place_num; /* TODO */ return 0; } void starpu_omp_get_place_proc_ids(int place_num, int *ids) { (void) place_num; (void) ids; /* TODO */ } int starpu_omp_get_place_num(void) { /* TODO */ return -1; } int starpu_omp_get_partition_num_places(void) { /* TODO */ return 0; } void starpu_omp_get_partition_place_nums(int *place_nums) { (void) place_nums; /* TODO */ } 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) { struct starpu_omp_task *task = _starpu_omp_get_task(); if (!task) return 0; const struct starpu_omp_device * const device = task->owner_region->owner_device; return device == _starpu_omp_global_state->initial_device; } int starpu_omp_get_initial_device(void) { /* Assume only one device for now. */ return 0; } int starpu_omp_get_max_task_priority(void) { const struct starpu_omp_region * const parallel_region = _starpu_omp_get_task()->owner_region; return parallel_region->icvs.max_task_priority_var; } 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.3.9+dfsg/src/util/starpu_clusters_create.c000066400000000000000000000544231413463044200224670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 creates an interface to manage clustering resources and make use * of parallel tasks. It entirely depends on the hwloc software. */ #include #ifdef STARPU_CLUSTER starpu_binding_function _starpu_cluster_type_get_func(enum starpu_cluster_types type) { starpu_binding_function prologue_func; switch (type) { case STARPU_CLUSTER_OPENMP: prologue_func = &starpu_openmp_prologue; break; case STARPU_CLUSTER_INTEL_OPENMP_MKL: prologue_func = &starpu_intel_openmp_mkl_prologue; break; #ifdef STARPU_MKL case STARPU_CLUSTER_GNU_OPENMP_MKL: prologue_func = &starpu_gnu_openmp_mkl_prologue; break; #endif default: prologue_func = NULL; } return prologue_func; } void starpu_openmp_prologue(void* arg) { (void) arg; int workerid = starpu_worker_get_id_check(); if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) { struct starpu_task *task = starpu_task_get_current(); int sched_ctx = task->sched_ctx; struct _starpu_sched_ctx *ctx_struct = _starpu_get_sched_ctx_struct(sched_ctx); /* If the view of the worker doesn't correspond to the view of the task, adapt the thread team */ if (ctx_struct->parallel_view != task->possibly_parallel) { int *cpuids = NULL; int ncpuids = 0; starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); if (!task->possibly_parallel) ncpuids=1; omp_set_num_threads(ncpuids); #pragma omp parallel { starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); } free(cpuids); ctx_struct->parallel_view = !ctx_struct->parallel_view; } } return; } #ifdef STARPU_MKL void starpu_gnu_openmp_mkl_prologue(void* arg) { int workerid = starpu_worker_get_id(); if (starpu_worker_get_type(workerid) == STARPU_CPU_WORKER) { struct starpu_task *task = starpu_task_get_current(); int sched_ctx = task->sched_ctx; struct _starpu_sched_ctx *ctx_struct = _starpu_get_sched_ctx_struct(sched_ctx); /* If the view of the worker doesn't correspond to the view of the task, adapt the thread team */ if (ctx_struct->parallel_view != task->possibly_parallel) { int *cpuids = NULL; int ncpuids = 0; starpu_sched_ctx_get_available_cpuids(sched_ctx, &cpuids, &ncpuids); if (!task->possibly_parallel) ncpuids=1; omp_set_num_threads(ncpuids); mkl_set_num_threads(ncpuids); mkl_set_dynamic(0); #pragma omp parallel { starpu_sched_ctx_bind_current_thread_to_cpuid(cpuids[omp_get_thread_num()]); } free(cpuids); ctx_struct->parallel_view = !ctx_struct->parallel_view; } } return; } #endif /* Main interface function to create a cluster view of the machine. * Its job is to capture what the user wants and store it in a standard view. */ struct starpu_cluster_machine *starpu_cluster_machine(hwloc_obj_type_t cluster_level, ...) { va_list varg_list; int arg_type; struct _starpu_cluster_parameters *params; struct starpu_cluster_machine *machine; _STARPU_MALLOC(machine, sizeof(struct starpu_cluster_machine)); _STARPU_MALLOC(machine->params, sizeof(struct _starpu_cluster_parameters)); machine->id = STARPU_NMAX_SCHED_CTXS; machine->groups = _starpu_cluster_group_list_new(); machine->nclusters = 0; machine->ngroups = 0; machine->topology = NULL; _starpu_cluster_init_parameters(machine->params); params = machine->params; va_start(varg_list, cluster_level); while ((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type == STARPU_CLUSTER_MIN_NB) { params->min_nb = va_arg(varg_list, int); if (params->min_nb <= 0) _STARPU_DISP("Caution min number of contexts shouldn't be negative or null\n"); } else if (arg_type == STARPU_CLUSTER_MAX_NB) { params->max_nb = va_arg(varg_list, int); if (params->max_nb <= 0) _STARPU_DISP("Caution max number of contexts shouldn't be negative or null\n"); } else if (arg_type == STARPU_CLUSTER_NB) { params->nb = va_arg(varg_list, int); if (params->nb <= 0) _STARPU_DISP("Caution number of contexts shouldn't be negative or null\n"); } else if (arg_type == STARPU_CLUSTER_POLICY_NAME) { params->sched_policy_name = va_arg(varg_list, char*); } else if (arg_type == STARPU_CLUSTER_POLICY_STRUCT) { params->sched_policy_struct = va_arg(varg_list, struct starpu_sched_policy*); } else if (arg_type == STARPU_CLUSTER_KEEP_HOMOGENEOUS) { params->keep_homogeneous = va_arg(varg_list, int); /* 0=off, other=on */ } else if (arg_type == STARPU_CLUSTER_PREFERE_MIN) { params->prefere_min = va_arg(varg_list, int); /* 0=off, other=on */ } else if (arg_type == STARPU_CLUSTER_CREATE_FUNC) { params->create_func = va_arg(varg_list, void (*)(void*)); } else if (arg_type == STARPU_CLUSTER_CREATE_FUNC_ARG) { params->create_func_arg = va_arg(varg_list, void*); } else if (arg_type == STARPU_CLUSTER_TYPE) { params->type = va_arg(varg_list, enum starpu_cluster_types); } else if (arg_type == STARPU_CLUSTER_AWAKE_WORKERS) { params->awake_workers = va_arg(varg_list, unsigned); } else if (arg_type == STARPU_CLUSTER_PARTITION_ONE) { struct _starpu_cluster_group *group = _starpu_cluster_group_new(); _starpu_cluster_group_init(group, machine); _starpu_cluster_group_list_push_back(machine->groups, group); params = group->params; } else if (arg_type == STARPU_CLUSTER_NEW) { struct _starpu_cluster *cluster = _starpu_cluster_new(); struct _starpu_cluster_group *group = _starpu_cluster_group_list_back(machine->groups); if (group == NULL) { group = _starpu_cluster_group_new(); _starpu_cluster_group_init(group, machine); _starpu_cluster_group_list_push_back(machine->groups, group); } _starpu_cluster_init(cluster, group); _starpu_cluster_list_push_back(group->clusters, cluster); params = cluster->params; } else if (arg_type == STARPU_CLUSTER_NCORES) { struct _starpu_cluster_group *group = _starpu_cluster_group_list_back(machine->groups); if (group == NULL) { group = _starpu_cluster_group_new(); _starpu_cluster_group_init(group, machine); _starpu_cluster_group_list_push_back(machine->groups, group); } struct _starpu_cluster *cluster =_starpu_cluster_list_back(group->clusters); cluster->ncores = va_arg(varg_list, unsigned); } else { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } va_end(varg_list); switch(cluster_level) { case HWLOC_OBJ_MISC: case HWLOC_OBJ_BRIDGE: case HWLOC_OBJ_PCI_DEVICE: case HWLOC_OBJ_OS_DEVICE: STARPU_ABORT_MSG("Cluster aggregation isn't supported for level %s\n", hwloc_obj_type_string(cluster_level)); break; default: /* others can pass */ break; } if (_starpu_cluster_machine(cluster_level, machine) == -ENODEV) { starpu_uncluster_machine(machine); machine = NULL; } return machine; } int starpu_uncluster_machine(struct starpu_cluster_machine *machine) { if (machine == NULL) return -1; struct _starpu_cluster_group *g; struct _starpu_cluster_group_list *group_list = machine->groups; if (machine->id != STARPU_NMAX_SCHED_CTXS) starpu_sched_ctx_delete(machine->id); g = _starpu_cluster_group_list_begin(group_list); while (g != _starpu_cluster_group_list_end(group_list)) { struct _starpu_cluster_group *tmp = g; g = _starpu_cluster_group_list_next(g); _starpu_cluster_group_remove(group_list, tmp); } _starpu_cluster_group_list_delete(group_list); if (machine->topology != NULL) hwloc_topology_destroy(machine->topology); free(machine->params); free(machine); starpu_sched_ctx_set_context(0); return 0; } int starpu_cluster_print(struct starpu_cluster_machine *clusters) { if (clusters == NULL) return -1; int cnt, w; struct _starpu_cluster_group *group; struct _starpu_cluster *cluster; printf("Number of clusters created: %u\n", clusters->nclusters); cnt=0; if (clusters->nclusters) { for (group = _starpu_cluster_group_list_begin(clusters->groups); group != _starpu_cluster_group_list_end(clusters->groups); group = _starpu_cluster_group_list_next(group)) { for (cluster = _starpu_cluster_list_begin(group->clusters); cluster != _starpu_cluster_list_end(group->clusters); cluster = _starpu_cluster_list_next(cluster)) { printf("Cluster %d contains the following logical indexes:\n\t", cnt); for (w=0; w < cluster->ncores; w++) printf("%d ", cluster->cores[w]); printf("\n"); cnt++; } } } return 0; } void _starpu_cluster_create(struct _starpu_cluster *cluster) { if (cluster->params->awake_workers) cluster->id = starpu_sched_ctx_create(cluster->workerids, cluster->ncores, "clusters", STARPU_SCHED_CTX_AWAKE_WORKERS, 0); else cluster->id = starpu_sched_ctx_create(cluster->workerids, cluster->ncores, "clusters", 0); /* cluster priority can be the lowest, so let's enforce it */ starpu_sched_ctx_set_priority(cluster->workerids, cluster->ncores, cluster->id, 0); return; } void _starpu_cluster_group_create(struct _starpu_cluster_group *group) { struct _starpu_cluster *c; for (c = _starpu_cluster_list_begin(group->clusters) ; c != _starpu_cluster_list_end(group->clusters) ; c = _starpu_cluster_list_next(c)) { if (c->ncores == 0) continue; _starpu_cluster_create(c); if (!c->params->awake_workers) _starpu_cluster_bind(c); } return; } void _starpu_clusters_set_nesting(struct starpu_cluster_machine *m) { struct _starpu_cluster_group *g; struct _starpu_cluster *c; for (g = _starpu_cluster_group_list_begin(m->groups) ; g != _starpu_cluster_group_list_end(m->groups) ; g = _starpu_cluster_group_list_next(g)) { for (c = _starpu_cluster_list_begin(g->clusters) ; c != _starpu_cluster_list_end(g->clusters) ; c = _starpu_cluster_list_next(c)) _starpu_get_sched_ctx_struct(c->id)->nesting_sched_ctx = m->id; } } int _starpu_cluster_bind(struct _starpu_cluster *cluster) { starpu_binding_function func; void *func_arg; if (cluster->params->create_func) { func = cluster->params->create_func; func_arg = (void*) cluster->params->create_func_arg; } else { func = _starpu_cluster_type_get_func(cluster->params->type); func_arg = NULL; } return starpu_task_insert(&_starpu_cluster_bind_cl, STARPU_SCHED_CTX, cluster->id, STARPU_POSSIBLY_PARALLEL, 1, STARPU_PROLOGUE_CALLBACK_POP, func, STARPU_PROLOGUE_CALLBACK_POP_ARG, func_arg, 0); } void _starpu_cluster_group_init(struct _starpu_cluster_group *group, struct starpu_cluster_machine *father) { group->id = 0; group->nclusters = 0; group->clusters = _starpu_cluster_list_new(); group->father = father; _STARPU_MALLOC(group->params, sizeof(struct _starpu_cluster_parameters)); _starpu_cluster_copy_parameters(father->params, group->params); return; } void _starpu_cluster_init(struct _starpu_cluster *cluster, struct _starpu_cluster_group *father) { cluster->id = STARPU_NMAX_SCHED_CTXS; cluster->cpuset = hwloc_bitmap_alloc(); cluster->ncores = 0; cluster->cores = NULL; cluster->workerids = NULL; cluster->father = father; _STARPU_MALLOC(cluster->params, sizeof(struct _starpu_cluster_parameters)); _starpu_cluster_copy_parameters(father->params, cluster->params); } int _starpu_cluster_remove(struct _starpu_cluster_list *cluster_list, struct _starpu_cluster *cluster) { if (cluster && cluster->id != STARPU_NMAX_SCHED_CTXS) starpu_sched_ctx_delete(cluster->id); else return -1; if (cluster->cores != NULL) free(cluster->cores); if (cluster->workerids != NULL) free(cluster->workerids); hwloc_bitmap_free(cluster->cpuset); free(cluster->params); _starpu_cluster_list_erase(cluster_list, cluster); _starpu_cluster_delete(cluster); return 0; } int _starpu_cluster_group_remove(struct _starpu_cluster_group_list *group_list, struct _starpu_cluster_group *group) { struct _starpu_cluster_list *cluster_list = group->clusters; struct _starpu_cluster *c = _starpu_cluster_list_begin(cluster_list); while (c != _starpu_cluster_list_end(cluster_list)) { struct _starpu_cluster *tmp = c; c = _starpu_cluster_list_next(c); _starpu_cluster_remove(cluster_list, tmp); } _starpu_cluster_list_delete(cluster_list); free(group->params); _starpu_cluster_group_list_erase(group_list, group); _starpu_cluster_group_delete(group); return 0; } void _starpu_cluster_init_parameters(struct _starpu_cluster_parameters *params) { params->min_nb = 0; params->max_nb = 0; params->nb = 0; params->sched_policy_name = NULL; params->sched_policy_struct = NULL; params->keep_homogeneous = 0; params->prefere_min = 0; params->create_func = NULL; params->create_func_arg = NULL; params->type = STARPU_CLUSTER_OPENMP; params->awake_workers = 0; return; } void _starpu_cluster_copy_parameters(struct _starpu_cluster_parameters *src, struct _starpu_cluster_parameters *dst) { dst->min_nb = src->min_nb; dst->max_nb = src->max_nb; dst->nb = src->nb; dst->sched_policy_name = src->sched_policy_name; dst->sched_policy_struct = src->sched_policy_struct; dst->keep_homogeneous = src->keep_homogeneous; dst->prefere_min = src->prefere_min; dst->create_func = src->create_func; dst->create_func_arg = src->create_func_arg; dst->type = src->type; dst->awake_workers = src->awake_workers; return; } /* Considering the resources and parameters, how many clusters should we take? */ int _starpu_cluster_analyze_parameters(struct _starpu_cluster_parameters *params, int npus) { int nb_clusters = 1, j; if (params->nb) { nb_clusters = params->nb <= npus?params->nb : npus; } else if (params->min_nb && params->max_nb) { if (!params->keep_homogeneous) { if (params->prefere_min) nb_clusters = params->min_nb <= npus? params->min_nb : npus; else nb_clusters = params->max_nb <= npus? params->max_nb : npus; } else { int begin = params->prefere_min? params->min_nb:params->max_nb; int end = params->prefere_min? params->max_nb+1:params->min_nb-1; j=begin; int best = 0, second_best = 0, cpu_loss = INT_MAX; while (j != end) { if (npus%j == 0) { best = j; break; } if (npus%j < cpu_loss) { cpu_loss = npus%j; second_best = j; } j = params->prefere_min? j+1:j-1; } if (best) nb_clusters = best; else if (second_best) nb_clusters = second_best; } } return nb_clusters; } int _starpu_cluster_machine(hwloc_obj_type_t cluster_level, struct starpu_cluster_machine *machine) { struct _starpu_cluster_group *g; int ret; ret = _starpu_cluster_topology(cluster_level, machine); if (ret) return ret; for (g = _starpu_cluster_group_list_begin(machine->groups) ; g != _starpu_cluster_group_list_end(machine->groups) ; g = _starpu_cluster_group_list_next(g)) _starpu_cluster_group_create(g); starpu_task_wait_for_all(); /* Create containing context */ if (machine->params->sched_policy_struct != NULL) { machine->id = starpu_sched_ctx_create(NULL, -1, "main sched ctx", STARPU_SCHED_CTX_POLICY_STRUCT, machine->params->sched_policy_struct, 0); } else if (machine->params->sched_policy_name != NULL) { machine->id = starpu_sched_ctx_create(NULL, -1, "main sched ctx", STARPU_SCHED_CTX_POLICY_NAME, machine->params->sched_policy_name, 0); } else { struct starpu_sched_policy *sched_policy; struct _starpu_sched_ctx *global_ctx =_starpu_get_sched_ctx_struct(STARPU_GLOBAL_SCHED_CTX); sched_policy = _starpu_get_sched_policy(global_ctx); machine->id = starpu_sched_ctx_create(NULL, -1, "main sched ctx", STARPU_SCHED_CTX_POLICY_STRUCT, sched_policy, 0); } _starpu_clusters_set_nesting(machine); starpu_sched_ctx_set_context(&machine->id); return ret; } int _starpu_cluster_topology(hwloc_obj_type_t cluster_level, struct starpu_cluster_machine *machine) { int w; hwloc_topology_t topology; hwloc_cpuset_t avail_cpus; int nworkers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); if (nworkers == 0) return -ENODEV; int *workers; _STARPU_MALLOC(workers, sizeof(int) * nworkers); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, workers, nworkers); struct _starpu_machine_config *config = _starpu_get_machine_config(); STARPU_ASSERT_MSG(config->topology.hwtopology != NULL, "STARPU_CLUSTER: You " "need to call starpu_init() or make sure to activate hwloc."); hwloc_topology_dup(&topology, config->topology.hwtopology); avail_cpus = hwloc_bitmap_alloc(); hwloc_bitmap_zero(avail_cpus); for (w = 0; w < nworkers ; w++) { struct _starpu_worker *worker_str = _starpu_get_worker_struct(workers[w]); hwloc_bitmap_or(avail_cpus, avail_cpus, worker_str->hwloc_cpu_set); } hwloc_topology_restrict(topology, avail_cpus, 0); free(workers); /* Use new topology to fill in the cluster list */ machine->topology = topology; _starpu_cluster_group(cluster_level, machine); hwloc_bitmap_free(avail_cpus); return 0; } void _starpu_cluster_group(hwloc_obj_type_t cluster_level, struct starpu_cluster_machine *machine) { int nb_objects; int i; struct _starpu_cluster_group *group = NULL; if (machine->groups == NULL) machine->groups = _starpu_cluster_group_list_new(); nb_objects = hwloc_get_nbobjs_by_type(machine->topology, cluster_level); if (nb_objects <= 0) return; /* XXX: handle nb_objects == -1 */ group = _starpu_cluster_group_list_begin(machine->groups); for (i = 0 ; i < nb_objects ; i++) { hwloc_obj_t cluster_obj = hwloc_get_obj_by_type(machine->topology, cluster_level, i); if (group == NULL) { group = _starpu_cluster_group_new(); _starpu_cluster_group_init(group, machine); _starpu_cluster_group_list_push_back(machine->groups, group); } group->group_obj = cluster_obj; _starpu_cluster(group); machine->ngroups++; machine->nclusters += group->nclusters; group = _starpu_cluster_group_list_next(group); } return; } void _starpu_cluster(struct _starpu_cluster_group *group) { int i, avail_pus, npus, npreset=0; struct _starpu_cluster *cluster; npus = hwloc_get_nbobjs_inside_cpuset_by_type(group->father->topology, group->group_obj->cpuset, HWLOC_OBJ_PU); /* Preset clusters */ avail_pus = npus; for (cluster=_starpu_cluster_list_begin(group->clusters); cluster!=_starpu_cluster_list_end(group->clusters); cluster=_starpu_cluster_list_next(cluster)) { if (cluster->ncores > avail_pus) cluster->ncores = avail_pus; else if (avail_pus == 0) cluster->ncores = 0; if (cluster->ncores > 0) { _STARPU_MALLOC(cluster->cores, sizeof(int)*cluster->ncores); _STARPU_MALLOC(cluster->workerids, sizeof(int)*cluster->ncores); avail_pus -= cluster->ncores; npreset++; } } /* Automatic clusters */ group->nclusters = _starpu_cluster_analyze_parameters(group->params, avail_pus); for (i=0 ; inclusters && avail_pus>0 ; i++) { if (cluster == NULL) { cluster = _starpu_cluster_new(); _starpu_cluster_init(cluster, group); _starpu_cluster_list_push_back(group->clusters, cluster); } if (cluster->ncores != 0 && cluster->ncores > avail_pus) { cluster->ncores = avail_pus; } else { if (cluster->params->keep_homogeneous) cluster->ncores = avail_pus/(group->nclusters-i); else cluster->ncores = i==group->nclusters-1? avail_pus: avail_pus/(group->nclusters-i); } avail_pus -= cluster->ncores; _STARPU_MALLOC(cluster->cores, sizeof(int)*cluster->ncores); _STARPU_MALLOC(cluster->workerids, sizeof(int)*cluster->ncores); cluster = _starpu_cluster_list_next(cluster); } group->nclusters += npreset; cluster = _starpu_cluster_list_begin(group->clusters); int count = 0; static int starpu_cluster_warned = 0; for (i=0 ; ifather->topology, group->group_obj->cpuset, HWLOC_OBJ_PU, i); /* If we have more than one worker on this resource, let's add them too -- even if it's bad (they'll all be boud on the same PU) */ int size = 0, j; struct _starpu_hwloc_userdata *data = pu->userdata; struct _starpu_worker_list *list = data->worker_list; struct _starpu_worker *worker_str; for (worker_str = _starpu_worker_list_begin(list); worker_str != _starpu_worker_list_end(list); worker_str = _starpu_worker_list_next(worker_str)) { if (worker_str->arch == STARPU_CPU_WORKER) size++; } if (size > 1) { STARPU_HG_DISABLE_CHECKING(starpu_cluster_warned); if (!starpu_cluster_warned) { _STARPU_DISP("STARPU CLUSTERS: Caution! It seems that you have" " multiple workers bound to the same PU. If you have" " multithreading on your cores it is greatly adviced" " to export STARPU_NTHREADS_PER_CORE=nb."); starpu_cluster_warned = 1; } cluster->ncores += size-1; _STARPU_REALLOC(cluster->cores, sizeof(int)*cluster->ncores); _STARPU_REALLOC(cluster->workerids, sizeof(int)*cluster->ncores); } /* grab workerid list and return first cpu */ worker_str = _starpu_worker_list_begin(list); if (worker_str) hwloc_bitmap_or(cluster->cpuset, cluster->cpuset, worker_str->hwloc_cpu_set); j = 0; while (worker_str != _starpu_worker_list_end(list)) { if (worker_str->arch == STARPU_CPU_WORKER) { cluster->cores[count+j] = worker_str->bindid; cluster->workerids[count+j] = worker_str->workerid; j++; } worker_str = _starpu_worker_list_next(worker_str); } count+=size; if (cluster->ncores == count) { count = 0; cluster = _starpu_cluster_list_next(cluster); } } return; } #endif starpu-1.3.9+dfsg/src/util/starpu_clusters_create.h000066400000000000000000000074031413463044200224700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_CLUSTERS_CREATE_H__ #define __STARPU_CLUSTERS_CREATE_H__ /** @file */ #include #include #include #include #include #ifdef STARPU_MKL #include #endif #ifdef STARPU_CLUSTER #ifdef __cplusplus extern #endif struct starpu_cluster_machine { unsigned id; hwloc_topology_t topology; unsigned nclusters; unsigned ngroups; struct _starpu_cluster_group_list* groups; struct _starpu_cluster_parameters* params; }; struct _starpu_cluster_parameters { int min_nb; int max_nb; int nb; char* sched_policy_name; struct starpu_sched_policy* sched_policy_struct; unsigned keep_homogeneous; unsigned prefere_min; void (*create_func)(void*); void* create_func_arg; int type; unsigned awake_workers; }; LIST_TYPE(_starpu_cluster_group, unsigned id; hwloc_obj_t group_obj; int nclusters; struct _starpu_cluster_list* clusters; struct starpu_cluster_machine* father; struct _starpu_cluster_parameters* params; ) LIST_TYPE(_starpu_cluster, unsigned id; hwloc_cpuset_t cpuset; int ncores; int* cores; int* workerids; struct _starpu_cluster_group* father; struct _starpu_cluster_parameters* params; ) /** Machine discovery and cluster creation main funcitons */ int _starpu_cluster_machine(hwloc_obj_type_t cluster_level, struct starpu_cluster_machine* machine); int _starpu_cluster_topology(hwloc_obj_type_t cluster_level, struct starpu_cluster_machine* machine); void _starpu_cluster_group(hwloc_obj_type_t cluster_level, struct starpu_cluster_machine* machine); void _starpu_cluster(struct _starpu_cluster_group* group); /** Parameter functions */ void _starpu_cluster_init_parameters(struct _starpu_cluster_parameters* globals); void _starpu_cluster_copy_parameters(struct _starpu_cluster_parameters* src, struct _starpu_cluster_parameters* dst); int _starpu_cluster_analyze_parameters(struct _starpu_cluster_parameters* params, int npus); /** Cluster helper functions */ void _starpu_cluster_init(struct _starpu_cluster* cluster, struct _starpu_cluster_group* father); void _starpu_cluster_create(struct _starpu_cluster* cluster); int _starpu_cluster_bind(struct _starpu_cluster* cluster); int _starpu_cluster_remove(struct _starpu_cluster_list* cluster_list, struct _starpu_cluster* cluster); /** Cluster group helper function */ void _starpu_cluster_group_init(struct _starpu_cluster_group* group, struct starpu_cluster_machine* father); void _starpu_cluster_group_create(struct _starpu_cluster_group* group); int _starpu_cluster_group_remove(struct _starpu_cluster_group_list* group_list, struct _starpu_cluster_group* group); /** Binding helpers */ void _starpu_cluster_noop(void* buffers[], void* cl_arg) { (void) buffers; (void) cl_arg; } static struct starpu_codelet _starpu_cluster_bind_cl= { .cpu_funcs = {_starpu_cluster_noop}, .nbuffers = 0, .name = "cluster_internal_runtime_init" }; typedef void (*starpu_binding_function)(void*); starpu_binding_function _starpu_cluster_type_get_func(enum starpu_cluster_types type); #endif #endif /* __STARPU_CLUSTERS_CREATE_H__ */ starpu-1.3.9+dfsg/src/util/starpu_create_sync_task.c000066400000000000000000000033571413463044200226210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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); } void starpu_create_callback_task(void (*callback)(void *), void *callback_arg) { /* We create an empty task */ struct starpu_task *empty_task = starpu_task_create(); empty_task->name = "empty_task"; empty_task->callback_func = callback; empty_task->callback_arg = callback_arg; /* This task does nothing */ empty_task->cl = NULL; int ret = _starpu_task_submit_internally(empty_task); STARPU_ASSERT(!ret); } starpu-1.3.9+dfsg/src/util/starpu_data_cpy.c000066400000000000000000000121261413463044200210560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_check(); 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; #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: { cudaStream_t stream = starpu_cuda_get_local_stream(); if (copy_methods->cuda_to_cuda_async) { copy_methods->cuda_to_cuda_async(src_interface, memory_node, dst_interface, memory_node, stream); return; } else if (copy_methods->cuda_to_cuda) { copy_methods->cuda_to_cuda(src_interface, memory_node, dst_interface, memory_node); return; } break; } #endif 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); } static 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 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, .cpu_funcs = {common_data_cpy_func}, .cuda_funcs = {common_data_cpy_func}, .opencl_funcs = {common_data_cpy_func}, .mic_funcs = {mic_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; /* FIXME: priority!! */ 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.3.9+dfsg/src/util/starpu_data_cpy.h000066400000000000000000000020131413463044200210550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/util/starpu_task_insert.c000066400000000000000000000124451413463044200216240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_task *ptask, 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 = ptask ? ptask : starpu_task_create(); task->name = task_name ? 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; } int _starpu_task_insert_v(struct starpu_codelet *cl, va_list varg_list) { struct starpu_task *task; int ret; task = _starpu_task_build_v(NULL, cl, NULL, 1, varg_list); ret = starpu_task_submit(task); if (STARPU_UNLIKELY(ret == -ENODEV)) { _STARPU_MSG("submission of task %p with 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_set(struct starpu_task *task, struct starpu_codelet *cl, ...) { va_list varg_list; va_start(varg_list, cl); _starpu_task_build_v(task, cl, NULL, 1, varg_list); va_end(varg_list); return 0; } 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(NULL, cl, "task_build", 0, varg_list); if (task && task->cl_arg) { task->cl_arg_free = 1; } va_end(varg_list); return task; } starpu-1.3.9+dfsg/src/util/starpu_task_insert_utils.c000066400000000000000000000712471413463044200230510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_codelet_pack_arg_init(struct starpu_codelet_pack_arg_data *state) { state->arg_buffer = NULL; state->arg_buffer_size = 0; state->current_offset = sizeof(int); state->nargs = 0; } void starpu_codelet_pack_arg(struct starpu_codelet_pack_arg_data *state, const void *ptr, size_t ptr_size) { STARPU_ASSERT_MSG(state->current_offset >= sizeof(int), "struct starpu_codelet_pack_arg has to be initialized with starpu_codelet_pack_arg_init"); if (state->current_offset + sizeof(ptr_size) + ptr_size > state->arg_buffer_size) { if (state->arg_buffer_size == 0) state->arg_buffer_size = 128 + sizeof(ptr_size) + ptr_size; else state->arg_buffer_size = 2 * state->arg_buffer_size + sizeof(ptr_size) + ptr_size; _STARPU_REALLOC(state->arg_buffer, state->arg_buffer_size); } memcpy(state->arg_buffer+state->current_offset, (void *)&ptr_size, sizeof(ptr_size)); state->current_offset += sizeof(ptr_size); memcpy(state->arg_buffer+state->current_offset, ptr, ptr_size); state->current_offset += ptr_size; STARPU_ASSERT(state->current_offset <= state->arg_buffer_size); state->nargs++; } void starpu_codelet_pack_arg_fini(struct starpu_codelet_pack_arg_data *state, void **cl_arg, size_t *cl_arg_size) { if (state->nargs) { memcpy(state->arg_buffer, &state->nargs, sizeof(state->nargs)); } else { free(state->arg_buffer); state->arg_buffer = NULL; } *cl_arg = state->arg_buffer; *cl_arg_size = state->arg_buffer_size; } int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_list varg_list) { int arg_type; struct starpu_codelet_pack_arg_data state; starpu_codelet_pack_arg_init(&state); 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); starpu_codelet_pack_arg(&state, 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_CL_ARGS_NFREE) { (void)va_arg(varg_list, void *); (void)va_arg(varg_list, size_t); } else if (arg_type==STARPU_TASK_DEPS_ARRAY) { (void)va_arg(varg_list, unsigned); (void)va_arg(varg_list, struct starpu_task **); } else if (arg_type==STARPU_TASK_END_DEPS_ARRAY) { (void)va_arg(varg_list, unsigned); (void)va_arg(varg_list, struct starpu_task **); } 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_WITH_ARG_NFREE) { 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_CALLBACK_ARG_NFREE) { (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_ARG_NFREE) { (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_PROLOGUE_CALLBACK_POP_ARG_NFREE) { (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_WHERE) { (void)va_arg(varg_list, unsigned long long); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { (void)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 if (arg_type==STARPU_TASK_COLOR) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_TASK_SYNCHRONOUS) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_HANDLES_SEQUENTIAL_CONSISTENCY) { (void)va_arg(varg_list, unsigned char *); } else if (arg_type==STARPU_TASK_END_DEP) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_TASK_WORKERIDS) { (void)va_arg(varg_list, unsigned); (void)va_arg(varg_list, uint32_t*); } else if (arg_type==STARPU_SEQUENTIAL_CONSISTENCY) { (void)va_arg(varg_list, unsigned); } else if (arg_type==STARPU_TASK_PROFILING_INFO) { (void)va_arg(varg_list, struct starpu_profiling_task_info *); } else if (arg_type==STARPU_TASK_NO_SUBMITORDER) { (void)va_arg(varg_list, unsigned); } else if (arg_type==STARPU_TASK_SCHED_DATA) { (void)va_arg(varg_list, void *); } else { STARPU_ABORT_MSG("Unrecognized argument %d, did you perhaps forget to end arguments with 0?\n", arg_type); } } starpu_codelet_pack_arg_fini(&state, arg_buffer, arg_buffer_size); return 0; } void starpu_task_insert_data_make_room(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int current_buffer, int room) { if (current_buffer + room > STARPU_NMAXBUFS) { if (*allocated_buffers == 0) { int i; struct starpu_codelet *cl2 = task->cl; *allocated_buffers = (current_buffer + room) * 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 + room > *allocated_buffers) { *allocated_buffers = (current_buffer + room) * 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)); } } } } void starpu_task_insert_data_process_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int arg_type, starpu_data_handle_t handle) { 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_data_make_room(cl, task, allocated_buffers, *current_buffer, 1); 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)++; } void starpu_task_insert_data_process_array_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int nb_handles, starpu_data_handle_t *handles) { STARPU_ASSERT(cl != NULL); starpu_task_insert_data_make_room(cl, task, allocated_buffers, *current_buffer, nb_handles); int i; for(i=0 ; inbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert"); 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; int current_buffer; int allocated_buffers = 0; unsigned ndeps = 0; unsigned nend_deps = 0; struct starpu_task **task_deps_array = NULL; struct starpu_task **task_end_deps_array = NULL; _STARPU_TRACE_TASK_BUILD_START(); task->cl = cl; current_buffer = 0; struct starpu_codelet_pack_arg_data state; starpu_codelet_pack_arg_init(&state); 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_data_process_arg(cl, task, &allocated_buffers, ¤t_buffer, arg_type, handle); } 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_data_process_array_arg(cl, task, &allocated_buffers, ¤t_buffer, nb_handles, handles); } 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_data_process_mode_array_arg(cl, task, &allocated_buffers, ¤t_buffer, nb_descrs, descrs); } else if (arg_type==STARPU_VALUE) { void *ptr = va_arg(varg_list, void *); size_t ptr_size = va_arg(varg_list, size_t); starpu_codelet_pack_arg(&state, 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_CL_ARGS_NFREE) { task->cl_arg = va_arg(varg_list, void *); task->cl_arg_size = va_arg(varg_list, size_t); task->cl_arg_free = 0; } else if (arg_type==STARPU_TASK_DEPS_ARRAY) { STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' passed twice not supported yet"); ndeps = va_arg(varg_list, unsigned); task_deps_array = va_arg(varg_list, struct starpu_task **); } else if (arg_type==STARPU_TASK_END_DEPS_ARRAY) { STARPU_ASSERT_MSG(task_end_deps_array == NULL, "Parameter 'STARPU_TASK_END_DEPS_ARRAY' passed twice not supported yet"); nend_deps = va_arg(varg_list, unsigned); task_end_deps_array = va_arg(varg_list, struct starpu_task **); } 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 *); task->callback_arg_free = 1; } else if (arg_type==STARPU_CALLBACK_WITH_ARG_NFREE) { task->callback_func = va_arg(varg_list, _starpu_callback_func_t); task->callback_arg = va_arg(varg_list, void *); task->callback_arg_free = 0; } else if (arg_type==STARPU_CALLBACK_ARG) { task->callback_arg = va_arg(varg_list, void *); task->callback_arg_free = 1; } else if (arg_type==STARPU_CALLBACK_ARG_NFREE) { task->callback_arg = va_arg(varg_list, void *); task->callback_arg_free = 0; } 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 *); task->prologue_callback_arg_free = 1; } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG_NFREE) { task->prologue_callback_arg = va_arg(varg_list, void *); task->prologue_callback_arg_free = 0; } 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 *); task->prologue_callback_pop_arg_free = 1; } else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE) { task->prologue_callback_pop_arg = va_arg(varg_list, void *); task->prologue_callback_pop_arg_free = 0; } 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_WHERE) { task->where = va_arg(varg_list, unsigned long long); } 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 if (arg_type==STARPU_TASK_COLOR) { task->color = va_arg(varg_list, int); } else if (arg_type==STARPU_TASK_SYNCHRONOUS) { task->synchronous = va_arg(varg_list, int); } else if (arg_type==STARPU_HANDLES_SEQUENTIAL_CONSISTENCY) { task->handles_sequential_consistency = va_arg(varg_list, unsigned char *); } else if (arg_type==STARPU_TASK_END_DEP) { int end_dep = va_arg(varg_list, int); starpu_task_end_dep_add(task, end_dep); } else if (arg_type==STARPU_TASK_WORKERIDS) { task->workerids_len = va_arg(varg_list, unsigned); task->workerids = va_arg(varg_list, uint32_t*); } else if (arg_type==STARPU_SEQUENTIAL_CONSISTENCY) { task->sequential_consistency = va_arg(varg_list, unsigned); } else if (arg_type==STARPU_TASK_PROFILING_INFO) { task->profiling_info = va_arg(varg_list, struct starpu_profiling_task_info *); } else if (arg_type==STARPU_TASK_NO_SUBMITORDER) { task->no_submitorder = va_arg(varg_list, unsigned); } else if (arg_type==STARPU_TASK_SCHED_DATA) { task->sched_data = va_arg(varg_list, void *); } 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 (state.nargs) { if (task->cl_arg != NULL) { _STARPU_DISP("Parameters STARPU_CL_ARGS and STARPU_VALUE cannot be used in the same call\n"); free(state.arg_buffer); return -EINVAL; } starpu_codelet_pack_arg_fini(&state, &task->cl_arg, &task->cl_arg_size); } if (task_deps_array) { starpu_task_declare_deps_array(task, ndeps, task_deps_array); } if (task_end_deps_array) { starpu_task_declare_end_deps_array(task, nend_deps, task_end_deps_array); } _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; int current_buffer = 0; int allocated_buffers = 0; unsigned ndeps = 0; unsigned nend_deps = 0; struct starpu_task **task_deps_array = NULL; struct starpu_task **task_end_deps_array = NULL; _STARPU_TRACE_TASK_BUILD_START(); struct starpu_codelet_pack_arg_data state; starpu_codelet_pack_arg_init(&state); 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_data_process_arg(cl, task, &allocated_buffers, ¤t_buffer, arg_type, handle); } 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_data_process_array_arg(cl, task, &allocated_buffers, ¤t_buffer, nb_handles, handles); } 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_data_process_mode_array_arg(cl, task, &allocated_buffers, ¤t_buffer, nb_descrs, descrs); } 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]; starpu_codelet_pack_arg(&state, 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_CL_ARGS_NFREE) { 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 = 0; } else if (arg_type==STARPU_TASK_DEPS_ARRAY) { STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' passed twice not supported yet"); arg_i++; ndeps = *(unsigned *)arglist[arg_i]; arg_i++; task_deps_array = arglist[arg_i]; } else if (arg_type==STARPU_TASK_END_DEPS_ARRAY) { STARPU_ASSERT_MSG(task_end_deps_array == NULL, "Parameter 'STARPU_TASK_END_DEPS_ARRAY' passed twice not supported yet"); arg_i++; nend_deps = *(unsigned *)arglist[arg_i]; arg_i++; task_end_deps_array = arglist[arg_i]; } 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]; task->callback_arg_free = 1; } else if (arg_type == STARPU_CALLBACK_WITH_ARG_NFREE) { arg_i++; task->callback_func = (_starpu_callback_func_t)arglist[arg_i]; arg_i++; task->callback_arg = arglist[arg_i]; task->callback_arg_free = 0; } else if (arg_type == STARPU_CALLBACK_ARG) { arg_i++; task->callback_arg = arglist[arg_i]; task->callback_arg_free = 1; } else if (arg_type == STARPU_CALLBACK_ARG_NFREE) { arg_i++; task->callback_arg = arglist[arg_i]; task->callback_arg_free = 0; } 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]; task->prologue_callback_arg_free = 1; } else if (arg_type == STARPU_PROLOGUE_CALLBACK_ARG_NFREE) { arg_i++; task->prologue_callback_arg = arglist[arg_i]; task->prologue_callback_arg_free = 0; } 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]; task->prologue_callback_pop_arg_free = 1; } else if (arg_type == STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE) { arg_i++; task->prologue_callback_pop_arg = arglist[arg_i]; task->prologue_callback_pop_arg_free = 0; } 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_WHERE) { assert(0); arg_i++; unsigned long long where = *(unsigned long long *)arglist[arg_i]; task->where = where; } 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 if (arg_type == STARPU_TASK_COLOR) { arg_i++; task->color = *(int *)arglist[arg_i]; } else if (arg_type == STARPU_TASK_SYNCHRONOUS) { arg_i++; task->synchronous = *(int *)arglist[arg_i]; } else if (arg_type==STARPU_HANDLES_SEQUENTIAL_CONSISTENCY) { task->handles_sequential_consistency = (unsigned char *)arglist[arg_i]; } else if (arg_type==STARPU_TASK_END_DEP) { arg_i++; starpu_task_end_dep_add(task, *(int*)arglist[arg_i]); } else if (arg_type==STARPU_TASK_WORKERIDS) { arg_i++; task->workerids_len = *(unsigned *)arglist[arg_i]; arg_i++; task->workerids = (uint32_t *)arglist[arg_i]; } else if (arg_type==STARPU_SEQUENTIAL_CONSISTENCY) { arg_i++; task->sequential_consistency = *(unsigned *)arglist[arg_i]; } else if (arg_type==STARPU_TASK_PROFILING_INFO) { arg_i++; task->profiling_info = (struct starpu_profiling_task_info *)arglist[arg_i]; } else if (arg_type==STARPU_TASK_NO_SUBMITORDER) { arg_i++; task->no_submitorder = *(unsigned *)arglist[arg_i]; } else if (arg_type == STARPU_TASK_SCHED_DATA) { arg_i++; task->sched_data = (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 (state.nargs) { if (task->cl_arg != NULL) { _STARPU_DISP("Parameters STARPU_CL_ARGS and STARPU_VALUE cannot be used in the same call\n"); free(state.arg_buffer); return -EINVAL; } starpu_codelet_pack_arg_fini(&state, &task->cl_arg, &task->cl_arg_size); } if (task_deps_array) { starpu_task_declare_deps_array(task, ndeps, task_deps_array); } if (task_end_deps_array) { starpu_task_declare_end_deps_array(task, nend_deps, task_end_deps_array); } _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.3.9+dfsg/src/util/starpu_task_insert_utils.h000066400000000000000000000023231413463044200230430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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__ /** @file */ #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.3.9+dfsg/src/worker_collection/000077500000000000000000000000001413463044200202755ustar00rootroot00000000000000starpu-1.3.9+dfsg/src/worker_collection/worker_list.c000066400000000000000000000174141413463044200230140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" static unsigned list_has_next_unblocked_worker(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int nworkers = workers->nunblocked_workers; STARPU_ASSERT(it != NULL); unsigned ret = it->cursor < nworkers ; if(!ret) it->cursor = 0; return ret; } static int list_get_next_unblocked_worker(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int *workerids = (int *)workers->unblocked_workers; int nworkers = (int)workers->nunblocked_workers; 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 list_has_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { if(it->possibly_parallel == 1) return list_has_next_master(workers, it); else if(it->possibly_parallel == 0) return list_has_next_unblocked_worker(workers, 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) { if(it->possibly_parallel == 1) return list_get_next_master(workers, it); else if(it->possibly_parallel == 0) return list_get_next_unblocked_worker(workers, 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 _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 *unblocked_workers = (int *)workers->unblocked_workers; unsigned nunblocked_workers = workers->nunblocked_workers; 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_unblocked = -1; for(i = 0; i < nunblocked_workers; i++) { if(unblocked_workers[i] == worker) { unblocked_workers[i] = -1; found_unblocked = worker; break; } } _rearange_workerids(unblocked_workers, nunblocked_workers); if(found_unblocked != -1) workers->nunblocked_workers--; 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 *unblocked_workers; int *masters; _STARPU_MALLOC(workerids, (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS) * sizeof(int)); _STARPU_MALLOC(unblocked_workers, (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS) * sizeof(int)); _STARPU_MALLOC(masters, (STARPU_NMAXWORKERS+STARPU_NMAX_COMBINEDWORKERS) * sizeof(int)); _init_workers(workerids); _init_workers(unblocked_workers); _init_workers(masters); workers->workerids = (void*)workerids; workers->nworkers = 0; workers->unblocked_workers = (void*)unblocked_workers; workers->nunblocked_workers = 0; workers->masters = (void*)masters; workers->nmasters = 0; return; } static void list_deinit(struct starpu_worker_collection *workers) { free(workers->workerids); free(workers->unblocked_workers); free(workers->masters); } static void list_init_iterator(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { (void) workers; it->cursor = 0; it->possibly_parallel = -1; /* -1 => we don't care about this field */ } static void list_init_iterator_for_parallel_tasks(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it, struct starpu_task *task) { list_init_iterator(workers, it); if (_starpu_get_nsched_ctxs() <= 1) return; it->possibly_parallel = task->possibly_parallel; /* 0/1 => this field indicates if we consider masters only or slaves not blocked too */ int *workerids = (int *)workers->workerids; unsigned nworkers = workers->nworkers; unsigned i; int nm = 0, nub = 0; for(i = 0; i < nworkers; i++) { if(!starpu_worker_is_blocked_in_parallel(workerids[i])) { ((int*)workers->unblocked_workers)[nub++] = workerids[i]; if(!it->possibly_parallel) /* don't bother filling the table with masters we won't use it anyway */ continue; if(!starpu_worker_is_slave_somewhere(workerids[i])) ((int*)workers->masters)[nm++] = workerids[i]; } } workers->nmasters = nm; workers->nunblocked_workers = nub; } struct starpu_worker_collection starpu_worker_list = { .has_next = list_has_next, .get_next = list_get_next, .add = list_add, .remove = list_remove, .init = list_init, .deinit = list_deinit, .init_iterator = list_init_iterator, .init_iterator_for_parallel_tasks = list_init_iterator_for_parallel_tasks, .type = STARPU_WORKER_LIST }; starpu-1.3.9+dfsg/src/worker_collection/worker_tree.c000066400000000000000000000235401413463044200227750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_unblocked_worker(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->present); 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->present[workerids[w]]) { if(workers->is_unblocked[workerids[w]]) { id = workerids[w]; it->possible_value = neighbour; break; } else { it->visited[workerids[w]] = 1; it->value = neighbour; return tree_has_next_unblocked_worker(workers, it); } } } STARPU_ASSERT_MSG(id != -1, "bind id (%d) for workerid (%d) not correct", neighbour->id, id); return 1; } static int tree_get_next_unblocked_worker(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]] && workers->is_unblocked[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 unsigned tree_has_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { if(it->possibly_parallel == 1) return tree_has_next_master(workers, it); else if(it->possibly_parallel == 0) return tree_has_next_unblocked_worker(workers, 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) { if(it->possibly_parallel == 1) return tree_get_next_master(workers, it); else if(it->possibly_parallel == 0) return tree_get_next_unblocked_worker(workers, 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 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_unblocked[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_unblocked[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; it->possibly_parallel = -1; int nworkers = starpu_worker_get_count(); memset(&it->visited, 0, nworkers * sizeof(it->visited[0])); } static void tree_init_iterator_for_parallel_tasks(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it, struct starpu_task *task) { if (_starpu_get_nsched_ctxs() <= 1) { tree_init_iterator(workers, it); return; } tree_init_iterator(workers, it); it->possibly_parallel = task->possibly_parallel; int i; int nworkers = starpu_worker_get_count(); for(i = 0; i < nworkers; i++) { workers->is_unblocked[i] = (workers->present[i] && !starpu_worker_is_blocked_in_parallel(i)); if(!it->possibly_parallel) /* don't bother filling the table with masters we won't use it anyway */ continue; workers->is_master[i] = (workers->present[i] && !starpu_worker_is_blocked_in_parallel(i) && !starpu_worker_is_slave_somewhere(i)); } } struct starpu_worker_collection starpu_worker_tree = { .has_next = tree_has_next, .get_next = tree_get_next, .add = tree_add, .remove = tree_remove, .init = tree_init, .deinit = tree_deinit, .init_iterator = tree_init_iterator, .init_iterator_for_parallel_tasks = tree_init_iterator_for_parallel_tasks, .type = STARPU_WORKER_TREE }; #endif// STARPU_HAVE_HWLOC starpu-1.3.9+dfsg/starpu-1.0.pc.in000066400000000000000000000024421413463044200165270ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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. 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_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.3.9+dfsg/starpu-1.1.pc.in000066400000000000000000000022411413463044200165250ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ 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_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.3.9+dfsg/starpu-1.2.pc.in000066400000000000000000000022411413463044200165260ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ 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_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.3.9+dfsg/starpu-1.3.pc.in000066400000000000000000000022411413463044200165270ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ 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_SC_HYPERVISOR@ @STARPU_EXPORTED_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.3.9+dfsg/starpu-mynvcc.mk000066400000000000000000000022011413463044200171210ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) V_mynvcc_0 = @echo " myNVCC " $@; V_mynvcc_1 = V_mynvcc = $(V_mynvcc_$(V)) .cu.o: @$(MKDIR_P) `dirname $@` $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c starpu-1.3.9+dfsg/starpu-notests.mk000066400000000000000000000014161413463044200173300ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -cat /dev/null starpu-1.3.9+dfsg/starpu-subdirtests.mk000066400000000000000000000021251413463044200202020ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET showfailed: @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET showsuite: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || RET=1 ; \ done ; \ exit $$RET starpu-1.3.9+dfsg/starpu.mk000066400000000000000000000065261413463044200156420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 STARPU_USE_MPI_MASTER_SLAVE MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 endif V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || RET=1 ; \ done ; \ exit $$RET 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_ env: @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) endif if STARPU_SIMGRID STARPU_SIMGRID=1 export STARPU_SIMGRID endif if STARPU_QUICK_CHECK STARPU_QUICK_CHECK=1 export STARPU_QUICK_CHECK endif if STARPU_LONG_CHECK STARPU_LONG_CHECK=1 export STARPU_LONG_CHECK endif starpu-1.3.9+dfsg/starpufft/000077500000000000000000000000001413463044200160005ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpufft/Makefile.am000066400000000000000000000022131413463044200200320ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 SUBDIRS=src if STARPU_BUILD_STARPUFFT_EXAMPLES if STARPU_BUILD_TESTS SUBDIRS += tests endif 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 starpufft-1.3.pc recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET starpu-1.3.9+dfsg/starpufft/Makefile.in000066400000000000000000001006271413463044200200530ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_BUILD_STARPUFFT_EXAMPLES_TRUE@@STARPU_BUILD_TESTS_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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = libstarpufft.pc starpufft-1.0.pc starpufft-1.1.pc \ starpufft-1.2.pc starpufft-1.3.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 distdir-am 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 $(srcdir)/starpufft-1.3.pc.in \ $(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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 $(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 starpufft-1.3.pc all: all-recursive .SUFFIXES: $(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/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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): 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)/$@ starpufft-1.3.pc: $(top_builddir)/config.status $(srcdir)/starpufft-1.3.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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || 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.3.9+dfsg/starpufft/include/000077500000000000000000000000001413463044200174235ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpufft/include/starpufft.h000066400000000000000000000051511413463044200216140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ // The documentation for this file is in doc/doxygen/chapters/api/fft_support.doxy #ifndef __STARPU_FFT_H__ #define __STARPU_FFT_H__ #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_3d)(int n, int m, int p, 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; #endif // __STARPU_FFT_H__ starpu-1.3.9+dfsg/starpufft/libstarpufft.pc.in000066400000000000000000000021301413463044200214320ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/starpufft/src/000077500000000000000000000000001413463044200165675ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpufft/src/Makefile.am000066400000000000000000000047431413463044200206330ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-notests.mk AM_CFLAGS = $(GLOBAL_AM_CFLAGS) $(HWLOC_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/starpufft/include/ -I$(top_builddir)/include -I$(top_builddir)/src -I$(top_srcdir)/src/ $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) lib_LTLIBRARIES = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la EXTRA_DIST = \ starpufft-float.h \ starpufft-double.h \ cudax_kernels.h \ starpufftx.c \ starpufftx1d.c \ starpufftx2d.c \ starpufftx3d.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 if STARPU_COVERITY include $(top_srcdir)/starpu-mynvcc.mk else NVCCFLAGS += -Xcompiler -fPIC -Xlinker -fPIC cudaf_kernels.o: cudaf_kernels.cu $(V_nvcc) $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD += cudaf_kernels.o if STARPU_HAVE_CUFFTDOUBLECOMPLEX cuda_kernels.o: cuda_kernels.cu $(V_nvcc) $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD += cuda_kernels.o endif libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_LIBADD += $(STARPU_CUDA_LDFLAGS) endif endif starpu-1.3.9+dfsg/starpufft/src/Makefile.in000066400000000000000000001050721413463044200206410ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_1 = -Xcompiler -fPIC -Xlinker -fPIC @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_2 = cudaf_kernels.o @STARPU_COVERITY_FALSE@@STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@am__append_3 = cuda_kernels.o @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_4 = $(STARPU_CUDA_LDFLAGS) subdir = starpufft/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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_COVERITY_FALSE@@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__append_2) $(am__append_3) \ $(am__DEPENDENCIES_2) am_libstarpufft_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.lo \ libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.lo \ libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.lo 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Plo \ ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Plo \ ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Plo 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 = $(libstarpufft_@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 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp $(top_srcdir)/starpu-mynvcc.mk \ $(top_srcdir)/starpu-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 -I$(top_builddir)/src -I$(top_srcdir)/src/ $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(HWLOC_CFLAGS) lib_LTLIBRARIES = libstarpufft-@STARPU_EFFECTIVE_VERSION@.la EXTRA_DIST = \ starpufft-float.h \ starpufft-double.h \ cudax_kernels.h \ starpufftx.c \ starpufftx1d.c \ starpufftx2d.c \ starpufftx3d.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) $(am__append_2) \ $(am__append_3) $(am__append_4) 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 --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_0 = @echo " myNVCC " $@; @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_1 = @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc = $(V_mynvcc_$(V)) all: all-am .SUFFIXES: .SUFFIXES: .c .cu .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-notests.mk $(top_srcdir)/starpu-mynvcc.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.mk $(top_srcdir)/starpu-mynvcc.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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Plo -rm -f ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Plo -rm -f ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Plo -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 -f ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft.Plo -rm -f ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufft_common.Plo -rm -f ./$(DEPDIR)/libstarpufft_@STARPU_EFFECTIVE_VERSION@_la-starpufftf.Plo -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 am--depfiles 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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -cat /dev/null @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ @$(MKDIR_P) `dirname $@` @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@cudaf_kernels.o: cudaf_kernels.cu @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) @STARPU_COVERITY_FALSE@@STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@cuda_kernels.o: cuda_kernels.cu @STARPU_COVERITY_FALSE@@STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) $(AM_CPPFLAGS) $< -c -o $@ --compiler-options -fno-strict-aliasing $(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.3.9+dfsg/starpufft/src/cuda_kernels.cu000066400000000000000000000013521413463044200215600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/src/cudaf_kernels.cu000066400000000000000000000013511413463044200217250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/src/cudax_kernels.cu000066400000000000000000000126561413463044200217610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; \ cudaError_t status = cudaGetLastError(); \ if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); \ } \ else \ { \ dim3 dimGrid(n / threads_per_block); \ dim3 dimBlock(threads_per_block); \ func <<>> args; \ cudaError_t status = cudaGetLastError(); \ if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); \ } \ 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; \ cudaError_t status = cudaGetLastError(); \ if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); \ } \ else \ { \ dim3 dimGrid(1, m / threads_per_dim); \ dim3 dimBlock(n, threads_per_dim); \ func <<>> args; \ cudaError_t status = cudaGetLastError(); \ if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); \ } \ } \ else \ { \ if (m < threads_per_dim) \ { \ dim3 dimGrid(n / threads_per_dim, 1); \ dim3 dimBlock(threads_per_dim, m); \ func <<>> args; \ cudaError_t status = cudaGetLastError(); \ if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); \ } \ else \ { \ dim3 dimGrid(n / threads_per_dim, m / threads_per_dim); \ dim3 dimBlock(threads_per_dim, threads_per_dim); \ func <<>> args; \ cudaError_t status = cudaGetLastError(); \ if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); \ } \ } \ 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.3.9+dfsg/starpufft/src/cudax_kernels.h000066400000000000000000000024351413463044200215730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/starpufft/src/starpufft-double.h000066400000000000000000000031511413463044200222260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 STARPUFFT_FLOAT #define STARPUFFT_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.3.9+dfsg/starpufft/src/starpufft-float.h000066400000000000000000000031421413463044200220610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 STARPUFFT_DOUBLE #define STARPUFFT_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.3.9+dfsg/starpufft/src/starpufft.c000066400000000000000000000013461413463044200207550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/src/starpufft_common.c000066400000000000000000000014611413463044200223230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/src/starpufftf.c000066400000000000000000000013451413463044200211220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/src/starpufftx.c000066400000000000000000000315021413463044200211420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(STARPUFFT_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 STARPUFFT_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" #include "starpufftx3d.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; case 3: 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(start3dC2C)(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]; if (!total) return; 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; #if defined(MAX_CUFFT_ERROR) && (MAX_CUFFT_ERROR >= 0xE) case CUFFT_INCOMPLETE_PARAMETER_LIST: errormsg = "incomplete parameter list"; break; case CUFFT_INVALID_DEVICE: errormsg = "invalid device"; break; case CUFFT_PARSE_ERROR: errormsg = "parse error"; break; case CUFFT_NO_WORKSPACE: errormsg = "no workspace"; break; #endif /* MAX_CUFFT_ERROR >= 0xE */ 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.3.9+dfsg/starpufft/src/starpufftx1d.c000066400000000000000000000626071413463044200214010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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((unsigned long long) 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((unsigned long long) 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.3.9+dfsg/starpufft/src/starpufftx2d.c000066400000000000000000000615111413463044200213730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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((unsigned long long) 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((unsigned long long) 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((unsigned long long) 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.3.9+dfsg/starpufft/src/starpufftx3d.c000066400000000000000000000114051413463044200213710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * * Sequential version * */ #ifdef __STARPU_USE_CUDA /* Perform one fft of size n,m */ static void STARPUFFT(fft_3d_plan_gpu)(void *args) { STARPUFFT(plan) plan = args; cufftResult cures; int n = plan->n[0]; int m = plan->n[1]; int p = plan->n[2]; int workerid = starpu_worker_get_id_check(); cures = cufftPlan3d(&plan->plans[workerid].plan_cuda, n, m, p, _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_3d_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_3d_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_3d_model) = { .type = STARPU_HISTORY_BASED, .symbol = TYPE"fft_3d" }; static struct starpu_codelet STARPUFFT(fft_3d_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_3d_kernel_gpu)}, #endif #ifdef STARPU_HAVE_FFTW .cpu_funcs = {STARPUFFT(fft_3d_kernel_cpu)}, #endif CAN_EXECUTE .model = &STARPUFFT(fft_3d_model), .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, .name = "fft_3d_codelet" }; STARPUFFT(plan) STARPUFFT(plan_dft_3d)(int n, int m, int p, int sign, unsigned flags) { unsigned workerid; if (PARALLEL) { /* TODO */ STARPU_ASSERT(0); } /* TODO: flags? Automatically set FFTW_MEASURE on calibration? */ STARPU_ASSERT(flags == 0); STARPUFFT(plan) plan = malloc(sizeof(*plan)); memset(plan, 0, sizeof(*plan)); plan->dim = 3; plan->n = malloc(plan->dim * sizeof(*plan->n)); plan->n[0] = n; plan->n[1] = m; plan->n[2] = p; plan->totsize = n * m; plan->type = C2C; plan->sign = sign; /* 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 /* fft plan: one fft of size n, m. */ plan->plans[workerid].plan_cpu = _FFTW(plan_dft_3d)(n, m, p, 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 starpu_execute_on_each_worker(STARPUFFT(fft_3d_plan_gpu), plan, STARPU_CUDA); #endif return plan; } /* Actually submit all the tasks. */ static struct starpu_task * STARPUFFT(start3dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out) { STARPU_ASSERT(plan->type == C2C); int ret; if (PARALLEL) { /* TODO */ STARPU_ASSERT(0); } else /* !PARALLEL */ { struct starpu_task *task; /* Create FFT task */ task = starpu_task_create(); task->detach = 0; task->cl = &STARPUFFT(fft_3d_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; } } starpu-1.3.9+dfsg/starpufft/starpufft-1.0.pc.in000066400000000000000000000020741413463044200212460ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/starpufft/starpufft-1.1.pc.in000066400000000000000000000020741413463044200212470ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/starpufft/starpufft-1.2.pc.in000066400000000000000000000020741413463044200212500ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/starpufft/starpufft-1.3.pc.in000066400000000000000000000020741413463044200212510ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/starpufft/tests/000077500000000000000000000000001413463044200171425ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpufft/tests/Makefile.am000066400000000000000000000056071413463044200212060ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 noinst_PROGRAMS = check_PROGRAMS = $(STARPU_FFT_EXAMPLES) 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 noinst_PROGRAMS += loader 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 = examplebin_PROGRAMS += \ testf \ test 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.3.9+dfsg/starpufft/tests/Makefile.in000066400000000000000000001425201413463044200212130ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(am__EXEEXT_4) check_PROGRAMS = $(am__EXEEXT_3) @STARPU_HAVE_WINDOWS_FALSE@am__append_1 = loader examplebin_PROGRAMS = testf$(EXEEXT) test$(EXEEXT) # 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_3) subdir = starpufft/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_USE_CUDA_FALSE@am__EXEEXT_1 = test$(EXEEXT) @STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE@@STARPU_USE_CUDA_TRUE@am__EXEEXT_2 = test$(EXEEXT) am__EXEEXT_3 = testf$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) am__installdirs = "$(DESTDIR)$(examplebindir)" @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_4 = loader$(EXEEXT) PROGRAMS = $(examplebin_PROGRAMS) $(noinst_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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/loader-loader.Po ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/testf.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testf.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/testf.Po -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 -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/testf.Po -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 am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK #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.3.9+dfsg/starpufft/tests/test.c000066400000000000000000000013411413463044200202640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/tests/test_threads.c000066400000000000000000000013511413463044200217770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/tests/testf.c000066400000000000000000000013401413463044200204310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/tests/testf_threads.c000066400000000000000000000013501413463044200221440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/starpufft/tests/testx.c000066400000000000000000000177551413463044200204740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, p = 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 struct starpu_conf conf; starpu_conf_init(&conf); /* FIXME: the testcase needs to be updated to properly support cuFFT */ conf.ncuda = 0; ret = starpu_init(&conf); 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 if (argc == 4) { n = atoi(argv[1]); m = atoi(argv[2]); p = atoi(argv[3]); /* 3D */ size = n * m * p; } else { assert(0); } #if defined(STARPU_HAVE_FFTW) || defined(STARPU_USE_CUDA) bytes = size * sizeof(STARPUFFT(complex)); #endif STARPUFFT(complex) *in_orig = STARPUFFT(malloc)(size * sizeof(*in_orig)); starpu_srand48(0); for (i = 0; i < size; i++) in_orig[i] = starpu_drand48() + I * starpu_drand48(); STARPUFFT(complex) *in = STARPUFFT(malloc)(size * sizeof(*in)); 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 if (argc == 4) { plan = STARPUFFT(plan_dft_3d)(n, m, p, SIGN, 0); #ifdef STARPU_HAVE_FFTW fftw_plan = _FFTW(plan_dft_3d)(n, m, p, NULL, (void*) 1, SIGN, FFTW_ESTIMATE); #endif #ifdef STARPU_USE_CUDA STARPU_ASSERT(cufftPlan3d(&cuda_plan, n, m, p, _CUFFT_C2C) == CUFFT_SUCCESS); #endif } else { assert(0); } #ifdef STARPU_HAVE_FFTW memcpy(in, in_orig, size * sizeof(*in)); 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 memcpy(in, in_orig, size * sizeof(*in)); gettimeofday(&begin, NULL); if (cufftExecC2C(cuda_plan, (cufftComplex*) in, (cufftComplex*) out_cuda, CUFFT_FORWARD) != CUFFT_SUCCESS) printf("erf2\n"); if ((cures = cudaDeviceSynchronize()) != 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 memcpy(in, in_orig, size * sizeof(*in)); 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 memcpy(in, in_orig, size * sizeof(*in)); 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_orig); 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.3.9+dfsg/starpufft/tests/testx_threads.c000066400000000000000000000045711413463044200221760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/starpurm/000077500000000000000000000000001413463044200156375ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpurm/Makefile.am000066400000000000000000000020121413463044200176660ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-subdirtests.mk SUBDIRS=src if STARPU_BUILD_STARPURM_EXAMPLES SUBDIRS += examples endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = starpurm-1.3.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpurm.h nodist_versinclude_HEADERS = \ include/starpurm_config.h starpu-1.3.9+dfsg/starpurm/Makefile.in000066400000000000000000000742261413463044200177170ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_BUILD_STARPURM_EXAMPLES_TRUE@am__append_1 = examples subdir = starpurm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = starpurm-1.3.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)" "$(DESTDIR)$(versincludedir)" DATA = $(pkgconfig_DATA) HEADERS = $(nodist_versinclude_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 distdir-am 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 examples am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/starpurm-1.3.pc.in \ $(top_srcdir)/starpu-subdirtests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = starpurm-1.3.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpurm.h nodist_versinclude_HEADERS = \ include/starpurm_config.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-subdirtests.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 starpurm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign starpurm/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-subdirtests.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): starpurm-1.3.pc: $(top_builddir)/config.status $(srcdir)/starpurm-1.3.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-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" 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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)" "$(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-nodist_versincludeHEADERS \ 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-nodist_versincludeHEADERS \ 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-nodist_versincludeHEADERS 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-nodist_versincludeHEADERS \ uninstall-pkgconfigDATA uninstall-versincludeHEADERS .PRECIOUS: Makefile # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i recheck || RET=1 ; \ done ; \ exit $$RET showfailed: @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET showsuite: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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.3.9+dfsg/starpurm/examples/000077500000000000000000000000001413463044200174555ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpurm/examples/01_init_exit.c000066400000000000000000000016061413463044200221200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 tests the proper initialization and shutdown of StarPURM. */ #include #include int main(int argc, char *argv[]) { starpurm_initialize(); starpurm_shutdown(); return 0; } starpu-1.3.9+dfsg/starpurm/examples/02_list_units.c000066400000000000000000000031441413463044200223210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 lists the CPU and device units detected and managed by * StarPURM. */ #include #include int main(int argc, char *argv[]) { int ids[4]; int i; starpurm_initialize(); ids[0] = starpurm_get_device_type_id("cpu"); ids[1] = starpurm_get_device_type_id("opencl"); ids[2] = starpurm_get_device_type_id("cuda"); ids[3] = starpurm_get_device_type_id("mic"); for (i=0; i<4; i++) { const int id = ids[i]; if (id == -1) continue; const int nb_units = starpurm_get_nb_devices_by_type(id); printf("%s: %d units\n", starpurm_get_device_type_name(id), nb_units); int j; for (j=0; j #include #include static void disp_cpuset(const char * name, hwloc_cpuset_t cpuset) { int strl = hwloc_bitmap_snprintf(NULL, 0, cpuset); char str[strl+1]; hwloc_bitmap_snprintf(str, strl+1, cpuset); printf(". %s: %s\n", name, str); } int main(int argc, char *argv[]) { starpurm_initialize(); int cpu_id = starpurm_get_device_type_id("cpu"); const int nb_cpu_units = starpurm_get_nb_devices_by_type(cpu_id); if (nb_cpu_units < 1) { starpurm_shutdown(); return 77; } hwloc_cpuset_t cpuset; cpuset = starpurm_get_device_worker_cpuset(cpu_id, 0); disp_cpuset("worker cpuset", cpuset); hwloc_bitmap_free(cpuset); cpuset = starpurm_get_global_cpuset(); disp_cpuset("global cpuset", cpuset); hwloc_bitmap_free(cpuset); cpuset = starpurm_get_selected_cpuset(); disp_cpuset("selected cpuset", cpuset); hwloc_bitmap_free(cpuset); cpuset = starpurm_get_all_cpu_workers_cpuset(); disp_cpuset("all cpu workers cpuset", cpuset); hwloc_bitmap_free(cpuset); cpuset = starpurm_get_all_device_workers_cpuset(); disp_cpuset("all device workers cpuset", cpuset); hwloc_bitmap_free(cpuset); starpurm_shutdown(); return 0; } starpu-1.3.9+dfsg/starpurm/examples/04_drs_enable.c000066400000000000000000000024131413463044200222220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 tests the proper initialization and shutdown of StarPURM. */ #include #include int main(int argc, char *argv[]) { int drs_enabled; starpurm_initialize(); drs_enabled = starpurm_drs_enabled_p(); printf("drs enabled at startup: %d\n", drs_enabled); starpurm_set_drs_enable(NULL); drs_enabled = starpurm_drs_enabled_p(); printf("drs state after explicit enable: %d\n", drs_enabled); starpurm_set_drs_disable(NULL); drs_enabled = starpurm_drs_enabled_p(); printf("drs state after explicit disable: %d\n", drs_enabled); starpurm_shutdown(); return 0; } starpu-1.3.9+dfsg/starpurm/examples/05_vector_scale.c000066400000000000000000000136271413463044200226070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 basic StarPU vector scale app on top of StarPURM */ #include #include #include #include #include static int rm_cpu_type_id = -1; static int rm_nb_cpu_units = 0; static void usage(void); static void test1(const int N); static void test2(const int N, const int task_mult); static void init_rm_infos(void); /* vector scale codelet */ static void vector_scale_func(void *cl_buffers[], void *cl_arg) { double scalar = -1.0; int n = STARPU_VECTOR_GET_NX(cl_buffers[0]); double *vector = (double *)STARPU_VECTOR_GET_PTR(cl_buffers[0]); int i; starpu_codelet_unpack_args(cl_arg, &scalar); int workerid = starpu_worker_get_id(); hwloc_cpuset_t worker_cpuset = starpu_worker_get_hwloc_cpuset(workerid); hwloc_cpuset_t check_cpuset = starpurm_get_selected_cpuset(); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, worker_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, worker_cpuset); int strl2 = hwloc_bitmap_snprintf(NULL, 0, check_cpuset); char str2[strl2+1]; hwloc_bitmap_snprintf(str2, strl2+1, check_cpuset); printf("worker[%03d] - task: vector=%p, n=%d, scalar=%lf, worker cpuset = %s, selected cpuset = %s\n", workerid, vector, n, scalar, str1, str2); } hwloc_bitmap_and(check_cpuset, check_cpuset, worker_cpuset); assert(!hwloc_bitmap_iszero(check_cpuset)); hwloc_bitmap_free(check_cpuset); hwloc_bitmap_free(worker_cpuset); for (i = 0; i < n; i++) { vector[i] *= scalar; } } static struct starpu_codelet vector_scale_cl = { .cpu_funcs = {vector_scale_func}, .nbuffers = 1 }; /* main routines */ static void usage(void) { fprintf(stderr, "usage: 05_vector_scale [VECTOR_SIZE]\n"); exit(1); } static void test1(const int N) { double *vector = NULL; const double scalar = 2.0; starpu_data_handle_t vector_handle; int ret; vector = malloc(N * sizeof(*vector)); { int i; for (i = 0; i < N; i++) { vector[i] = i; } } starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, N, sizeof(*vector)); ret = starpu_task_insert(&vector_scale_cl, STARPU_RW, vector_handle, STARPU_VALUE, &scalar, sizeof(scalar), 0); assert(ret == 0); starpu_task_wait_for_all(); starpu_data_unregister(vector_handle); { int i; for (i = 0; i < N; i++) { double d_i = i; if (vector[i] != d_i*scalar) { fprintf(stderr, "%s: check_failed\n", __func__); exit(1); } } } free(vector); } static void test2(const int N, const int task_mult) { double *vector = NULL; const double scalar = 3.0; starpu_data_handle_t vector_handle; int ret; vector = malloc(N * sizeof(*vector)); { int i; for (i = 0; i < N; i++) { vector[i] = i; } } starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, N, sizeof(*vector)); struct starpu_data_filter partition_filter = { .filter_func = starpu_vector_filter_block, .nchildren = rm_nb_cpu_units * task_mult }; starpu_data_partition(vector_handle, &partition_filter); { int i; for (i = 0; i < rm_nb_cpu_units*task_mult; i++) { starpu_data_handle_t sub_vector_handle = starpu_data_get_sub_data(vector_handle, 1, i); ret = starpu_task_insert(&vector_scale_cl, STARPU_RW, sub_vector_handle, STARPU_VALUE, &scalar, sizeof(scalar), 0); assert(ret == 0); } } starpu_task_wait_for_all(); starpu_data_unpartition(vector_handle, STARPU_MAIN_RAM); starpu_data_unregister(vector_handle); { int i; for (i = 0; i < N; i++) { double d_i = i; if (vector[i] != d_i*scalar) { fprintf(stderr, "%s: check_failed\n", __func__); exit(1); } } } free(vector); } static void init_rm_infos(void) { int cpu_type = starpurm_get_device_type_id("cpu"); int nb_cpu_units = starpurm_get_nb_devices_by_type(cpu_type); if (nb_cpu_units < 1) { /* No CPU unit available. */ exit(77); } rm_cpu_type_id = cpu_type; rm_nb_cpu_units = nb_cpu_units; } int main(int argc, char *argv[]) { int param_N = 1000000; int drs_enabled; if (argc > 1) { param_N = atoi(argv[1]); if (param_N < 1) { usage(); } } starpurm_initialize(); init_rm_infos(); test1(param_N); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); if (rm_nb_cpu_units > 1) { const int half_nb_cpus = rm_nb_cpu_units/2; starpurm_set_drs_enable(NULL); drs_enabled = starpurm_drs_enabled_p(); assert(drs_enabled != 0); printf("withdrawing %d cpus from StarPU\n", half_nb_cpus); starpurm_withdraw_cpus_from_starpu(NULL, half_nb_cpus); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); printf("assigning %d cpus to StarPU\n", half_nb_cpus); starpurm_assign_cpus_to_starpu(NULL, half_nb_cpus); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); int i; for (i = rm_nb_cpu_units-1; i > 0; i--) { starpurm_set_max_parallelism(NULL, i); test2(param_N, 10); } printf("withdrawing all cpus from StarPU\n"); starpurm_withdraw_all_cpus_from_starpu(NULL); printf("assigning %d cpus to StarPU\n", rm_nb_cpu_units); starpurm_assign_cpus_to_starpu(NULL, rm_nb_cpu_units); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); starpurm_set_drs_disable(NULL); drs_enabled = starpurm_drs_enabled_p(); assert(drs_enabled == 0); } starpurm_shutdown(); return 0; } starpu-1.3.9+dfsg/starpurm/examples/06_spawn.c000066400000000000000000000146471413463044200212720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 basic StarPU vector scale app on top of StarPURM, * making use of both the main RM API and the spawn_kernel_on_cpus API func */ #include #include #include #include #include static int rm_cpu_type_id = -1; static int rm_nb_cpu_units = 0; static void usage(void); static void test1(const int N); static void test2(const int N, const int task_mult); static void init_rm_infos(void); /* vector scale codelet */ static void vector_scale_func(void *cl_buffers[], void *cl_arg) { double scalar = -1.0; int n = STARPU_VECTOR_GET_NX(cl_buffers[0]); double *vector = (double *)STARPU_VECTOR_GET_PTR(cl_buffers[0]); int i; starpu_codelet_unpack_args(cl_arg, &scalar); int workerid = starpu_worker_get_id(); hwloc_cpuset_t worker_cpuset = starpu_worker_get_hwloc_cpuset(workerid); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, worker_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, worker_cpuset); printf("worker[%03d] - task: vector=%p, n=%d, scalar=%lf, worker cpuset = %s\n", workerid, vector, n, scalar, str1); } hwloc_bitmap_free(worker_cpuset); for (i = 0; i < n; i++) { vector[i] *= scalar; } } static struct starpu_codelet vector_scale_cl = { .cpu_funcs = {vector_scale_func}, .nbuffers = 1 }; /* main routines */ static void usage(void) { fprintf(stderr, "usage: 05_vector_scale [VECTOR_SIZE]\n"); exit(1); } static void test1(const int N) { double *vector = NULL; const double scalar = 2.0; starpu_data_handle_t vector_handle; int ret; vector = malloc(N * sizeof(*vector)); { int i; for (i = 0; i < N; i++) { vector[i] = i; } } starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, N, sizeof(*vector)); ret = starpu_task_insert(&vector_scale_cl, STARPU_RW, vector_handle, STARPU_VALUE, &scalar, sizeof(scalar), 0); assert(ret == 0); starpu_task_wait_for_all(); starpu_data_unregister(vector_handle); { int i; for (i = 0; i < N; i++) { double d_i = i; if (vector[i] != d_i*scalar) { fprintf(stderr, "%s: check_failed\n", __func__); exit(1); } } } free(vector); } static void test2(const int N, const int task_mult) { double *vector = NULL; const double scalar = 3.0; starpu_data_handle_t vector_handle; int ret; vector = malloc(N * sizeof(*vector)); { int i; for (i = 0; i < N; i++) { vector[i] = i; } } starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, N, sizeof(*vector)); struct starpu_data_filter partition_filter = { .filter_func = starpu_vector_filter_block, .nchildren = rm_nb_cpu_units * task_mult }; starpu_data_partition(vector_handle, &partition_filter); { int i; for (i = 0; i < rm_nb_cpu_units*task_mult; i++) { starpu_data_handle_t sub_vector_handle = starpu_data_get_sub_data(vector_handle, 1, i); ret = starpu_task_insert(&vector_scale_cl, STARPU_RW, sub_vector_handle, STARPU_VALUE, &scalar, sizeof(scalar), 0); assert(ret == 0); } } starpu_task_wait_for_all(); starpu_data_unpartition(vector_handle, STARPU_MAIN_RAM); starpu_data_unregister(vector_handle); { int i; for (i = 0; i < N; i++) { double d_i = i; if (vector[i] != d_i*scalar) { fprintf(stderr, "%s: check_failed\n", __func__); exit(1); } } } free(vector); } static void init_rm_infos(void) { int cpu_type = starpurm_get_device_type_id("cpu"); int nb_cpu_units = starpurm_get_nb_devices_by_type(cpu_type); if (nb_cpu_units < 1) { /* No CPU unit available. */ exit(77); } rm_cpu_type_id = cpu_type; rm_nb_cpu_units = nb_cpu_units; } static void kernel_to_spawn(void *args) { int param_N = *(int*)args; test1(param_N); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); } int main(int argc, char *argv[]) { int param_N = 1000000; int drs_enabled; if (argc > 1) { param_N = atoi(argv[1]); if (param_N < 1) { usage(); } } starpurm_initialize(); init_rm_infos(); if (rm_nb_cpu_units > 1) { const int half_nb_cpus = rm_nb_cpu_units/2; starpurm_set_drs_enable(NULL); drs_enabled = starpurm_drs_enabled_p(); assert(drs_enabled != 0); { hwloc_cpuset_t cpu_cpuset = starpurm_get_all_cpu_workers_cpuset(); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, cpu_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, cpu_cpuset); printf("all cpus cpuset = %s\n", str1); } int first_idx = hwloc_bitmap_first(cpu_cpuset); int last_idx = hwloc_bitmap_last(cpu_cpuset); hwloc_cpuset_t sel_cpuset = hwloc_bitmap_alloc(); assert(sel_cpuset != NULL); int count = 0; int idx = first_idx; while (idx != -1 && idx <= last_idx && count < half_nb_cpus) { if (hwloc_bitmap_isset(cpu_cpuset, idx)) { hwloc_bitmap_set(sel_cpuset, idx); count ++; } idx = hwloc_bitmap_next(cpu_cpuset, idx); } assert(count == half_nb_cpus); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, sel_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, sel_cpuset); printf("spawning a kernel on cpuset = %s\n", str1); } starpurm_spawn_kernel_on_cpus(NULL, kernel_to_spawn, ¶m_N, sel_cpuset); hwloc_bitmap_free(sel_cpuset); hwloc_bitmap_free(cpu_cpuset); } printf("withdrawing %d cpus from StarPU\n", half_nb_cpus); starpurm_withdraw_cpus_from_starpu(NULL, half_nb_cpus); test1(param_N); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); printf("assigning %d cpus to StarPU\n", half_nb_cpus); starpurm_assign_cpus_to_starpu(NULL, half_nb_cpus); test1(param_N); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); starpurm_set_drs_disable(NULL); drs_enabled = starpurm_drs_enabled_p(); assert(drs_enabled == 0); } starpurm_shutdown(); return 0; } starpu-1.3.9+dfsg/starpurm/examples/07_async_spawn.c000066400000000000000000000173521413463044200224640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 basic StarPU vector scale app on top of StarPURM, * making use of both the main RM API and the spawn_kernel_on_cpus API func */ #include #include #include #include #include #include #include static int rm_cpu_type_id = -1; static int rm_nb_cpu_units = 0; static void usage(void); static void test1(const int N); static void test2(const int N, const int task_mult); static void init_rm_infos(void); static unsigned spawn_pending = 0; static pthread_mutex_t spawn_pending_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t spawn_pending_cond; static void _inc_spawn_pending(void) { pthread_mutex_lock(&spawn_pending_mutex); assert(spawn_pending < UINT_MAX); spawn_pending++; pthread_mutex_unlock(&spawn_pending_mutex); } static void _dec_spawn_pending(void) { pthread_mutex_lock(&spawn_pending_mutex); assert(spawn_pending > 0); spawn_pending--; if (spawn_pending == 0) pthread_cond_broadcast(&spawn_pending_cond); pthread_mutex_unlock(&spawn_pending_mutex); } static void _wait_pending_spawns(void) { pthread_mutex_lock(&spawn_pending_mutex); while (spawn_pending > 0) pthread_cond_wait(&spawn_pending_cond, &spawn_pending_mutex); pthread_mutex_unlock(&spawn_pending_mutex); } static void spawn_callback(void *_arg) { assert(42 == (uintptr_t)_arg); _dec_spawn_pending(); } /* vector scale codelet */ static void vector_scale_func(void *cl_buffers[], void *cl_arg) { double scalar = -1.0; int n = STARPU_VECTOR_GET_NX(cl_buffers[0]); double *vector = (double *)STARPU_VECTOR_GET_PTR(cl_buffers[0]); int i; starpu_codelet_unpack_args(cl_arg, &scalar); int workerid = starpu_worker_get_id(); hwloc_cpuset_t worker_cpuset = starpu_worker_get_hwloc_cpuset(workerid); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, worker_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, worker_cpuset); printf("worker[%03d] - task: vector=%p, n=%d, scalar=%lf, worker cpuset = %s\n", workerid, vector, n, scalar, str1); } hwloc_bitmap_free(worker_cpuset); for (i = 0; i < n; i++) { vector[i] *= scalar; } } static struct starpu_codelet vector_scale_cl = { .cpu_funcs = {vector_scale_func}, .nbuffers = 1 }; /* main routines */ static void usage(void) { fprintf(stderr, "usage: 05_vector_scale [VECTOR_SIZE]\n"); exit(1); } static void test1(const int N) { double *vector = NULL; const double scalar = 2.0; starpu_data_handle_t vector_handle; int ret; vector = malloc(N * sizeof(*vector)); { int i; for (i = 0; i < N; i++) { vector[i] = i; } } starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, N, sizeof(*vector)); ret = starpu_task_insert(&vector_scale_cl, STARPU_RW, vector_handle, STARPU_VALUE, &scalar, sizeof(scalar), 0); assert(ret == 0); starpu_task_wait_for_all(); starpu_data_unregister(vector_handle); { int i; for (i = 0; i < N; i++) { double d_i = i; if (vector[i] != d_i*scalar) { fprintf(stderr, "%s: check_failed\n", __func__); exit(1); } } } free(vector); } static void test2(const int N, const int task_mult) { double *vector = NULL; const double scalar = 3.0; starpu_data_handle_t vector_handle; int ret; vector = malloc(N * sizeof(*vector)); { int i; for (i = 0; i < N; i++) { vector[i] = i; } } starpu_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, N, sizeof(*vector)); struct starpu_data_filter partition_filter = { .filter_func = starpu_vector_filter_block, .nchildren = rm_nb_cpu_units * task_mult }; starpu_data_partition(vector_handle, &partition_filter); { int i; for (i = 0; i < rm_nb_cpu_units*task_mult; i++) { starpu_data_handle_t sub_vector_handle = starpu_data_get_sub_data(vector_handle, 1, i); ret = starpu_task_insert(&vector_scale_cl, STARPU_RW, sub_vector_handle, STARPU_VALUE, &scalar, sizeof(scalar), 0); assert(ret == 0); } } starpu_task_wait_for_all(); starpu_data_unpartition(vector_handle, STARPU_MAIN_RAM); starpu_data_unregister(vector_handle); { int i; for (i = 0; i < N; i++) { double d_i = i; if (vector[i] != d_i*scalar) { fprintf(stderr, "%s: check_failed\n", __func__); exit(1); } } } free(vector); } static void init_rm_infos(void) { int cpu_type = starpurm_get_device_type_id("cpu"); int nb_cpu_units = starpurm_get_nb_devices_by_type(cpu_type); if (nb_cpu_units < 1) { /* No CPU unit available. */ exit(77); } rm_cpu_type_id = cpu_type; rm_nb_cpu_units = nb_cpu_units; } static void kernel_to_spawn(void *args) { int param_N = *(int*)args; //test1(param_N); test2(param_N, 1); //test2(param_N, 10); //test2(param_N, 100); } int main(int argc, char *argv[]) { pthread_cond_init(&spawn_pending_cond, NULL); int param_N = 1000000; int drs_enabled; if (argc > 1) { param_N = atoi(argv[1]); if (param_N < 1) { usage(); } } hwloc_cpuset_t init_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_set_range(init_cpuset, 0, 7); starpurm_initialize_with_cpuset(init_cpuset); hwloc_bitmap_free(init_cpuset); init_rm_infos(); if (rm_nb_cpu_units > 1) { const int half_nb_cpus = rm_nb_cpu_units/2; starpurm_set_drs_enable(NULL); drs_enabled = starpurm_drs_enabled_p(); assert(drs_enabled != 0); int repeat; for (repeat=0; repeat < 20; repeat++) { hwloc_cpuset_t cpu_cpuset = starpurm_get_all_cpu_workers_cpuset(); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, cpu_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, cpu_cpuset); printf("all cpus cpuset = %s\n", str1); } int first_idx = hwloc_bitmap_first(cpu_cpuset); int last_idx = hwloc_bitmap_last(cpu_cpuset); hwloc_cpuset_t sel_cpuset = hwloc_bitmap_alloc(); assert(sel_cpuset != NULL); int count = 0; int idx = first_idx; while (idx != -1 && idx <= last_idx && count < half_nb_cpus) { if (hwloc_bitmap_isset(cpu_cpuset, idx)) { hwloc_bitmap_set(sel_cpuset, idx); count ++; } idx = hwloc_bitmap_next(cpu_cpuset, idx); } assert(count == half_nb_cpus); { int strl1 = hwloc_bitmap_snprintf(NULL, 0, sel_cpuset); char str1[strl1+1]; hwloc_bitmap_snprintf(str1, strl1+1, sel_cpuset); printf("spawning a kernel on cpuset = %s\n", str1); } _inc_spawn_pending(); starpurm_spawn_kernel_on_cpus_callback(NULL, kernel_to_spawn, ¶m_N, sel_cpuset, spawn_callback, (void*)(uintptr_t)42); hwloc_bitmap_free(sel_cpuset); hwloc_bitmap_free(cpu_cpuset); } _wait_pending_spawns(); printf("withdrawing %d cpus from StarPU\n", half_nb_cpus); starpurm_withdraw_cpus_from_starpu(NULL, half_nb_cpus); test1(param_N); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); printf("assigning %d cpus to StarPU\n", half_nb_cpus); starpurm_assign_cpus_to_starpu(NULL, half_nb_cpus); test1(param_N); test2(param_N, 1); test2(param_N, 10); test2(param_N, 100); starpurm_set_drs_disable(NULL); drs_enabled = starpurm_drs_enabled_p(); assert(drs_enabled == 0); } starpurm_shutdown(); pthread_cond_destroy(&spawn_pending_cond); return 0; } starpu-1.3.9+dfsg/starpurm/examples/Makefile.am000066400000000000000000000034061413463044200215140ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 SUBDIRS = CLEANFILES = *.gcno *.gcda *.linkinfo AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_builddir)/include AM_CPPFLAGS += -I$(top_srcdir)/starpurm/include -I$(top_srcdir)/starpurm/src -I$(top_builddir)/starpurm/src -I$(top_builddir)/starpurm/include AM_CFLAGS = -Wall -g $(HWLOC_CFLAGS) $(DLB_CFLAGS) LDADD = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) $(DLB_LIBS) examplebindir = $(libdir)/starpu/examples/starpurm examplebin_PROGRAMS = examplebin_PROGRAMS += 01_init_exit examplebin_PROGRAMS += 02_list_units examplebin_PROGRAMS += 03_cpusets examplebin_PROGRAMS += 04_drs_enable examplebin_PROGRAMS += 05_vector_scale examplebin_PROGRAMS += 06_spawn examplebin_PROGRAMS += 07_async_spawn 01_init_exit_SOURCES = 01_init_exit.c 02_list_units_SOURCES = 02_list_units.c 03_cpusets_SOURCES = 03_cpusets.c 04_drs_enable_SOURCES = 04_drs_enable.c 05_vector_scale_SOURCES = 05_vector_scale.c 06_spawn_SOURCES = 06_spawn.c 07_async_spawn_SOURCES = 07_async_spawn.c starpu-1.3.9+dfsg/starpurm/examples/Makefile.in000066400000000000000000001163171413463044200215330ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ examplebin_PROGRAMS = 01_init_exit$(EXEEXT) 02_list_units$(EXEEXT) \ 03_cpusets$(EXEEXT) 04_drs_enable$(EXEEXT) \ 05_vector_scale$(EXEEXT) 06_spawn$(EXEEXT) \ 07_async_spawn$(EXEEXT) subdir = starpurm/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(examplebindir)" PROGRAMS = $(examplebin_PROGRAMS) am_01_init_exit_OBJECTS = 01_init_exit.$(OBJEXT) 01_init_exit_OBJECTS = $(am_01_init_exit_OBJECTS) 01_init_exit_LDADD = $(LDADD) am__DEPENDENCIES_1 = 01_init_exit_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(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_02_list_units_OBJECTS = 02_list_units.$(OBJEXT) 02_list_units_OBJECTS = $(am_02_list_units_OBJECTS) 02_list_units_LDADD = $(LDADD) 02_list_units_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_03_cpusets_OBJECTS = 03_cpusets.$(OBJEXT) 03_cpusets_OBJECTS = $(am_03_cpusets_OBJECTS) 03_cpusets_LDADD = $(LDADD) 03_cpusets_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_04_drs_enable_OBJECTS = 04_drs_enable.$(OBJEXT) 04_drs_enable_OBJECTS = $(am_04_drs_enable_OBJECTS) 04_drs_enable_LDADD = $(LDADD) 04_drs_enable_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_05_vector_scale_OBJECTS = 05_vector_scale.$(OBJEXT) 05_vector_scale_OBJECTS = $(am_05_vector_scale_OBJECTS) 05_vector_scale_LDADD = $(LDADD) 05_vector_scale_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_06_spawn_OBJECTS = 06_spawn.$(OBJEXT) 06_spawn_OBJECTS = $(am_06_spawn_OBJECTS) 06_spawn_LDADD = $(LDADD) 06_spawn_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_07_async_spawn_OBJECTS = 07_async_spawn.$(OBJEXT) 07_async_spawn_OBJECTS = $(am_07_async_spawn_OBJECTS) 07_async_spawn_LDADD = $(LDADD) 07_async_spawn_DEPENDENCIES = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/01_init_exit.Po \ ./$(DEPDIR)/02_list_units.Po ./$(DEPDIR)/03_cpusets.Po \ ./$(DEPDIR)/04_drs_enable.Po ./$(DEPDIR)/05_vector_scale.Po \ ./$(DEPDIR)/06_spawn.Po ./$(DEPDIR)/07_async_spawn.Po 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 = $(01_init_exit_SOURCES) $(02_list_units_SOURCES) \ $(03_cpusets_SOURCES) $(04_drs_enable_SOURCES) \ $(05_vector_scale_SOURCES) $(06_spawn_SOURCES) \ $(07_async_spawn_SOURCES) DIST_SOURCES = $(01_init_exit_SOURCES) $(02_list_units_SOURCES) \ $(03_cpusets_SOURCES) $(04_drs_enable_SOURCES) \ $(05_vector_scale_SOURCES) $(06_spawn_SOURCES) \ $(07_async_spawn_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 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 distdir-am 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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = CLEANFILES = *.gcno *.gcda *.linkinfo AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src \ -I$(top_builddir)/src -I$(top_builddir)/include \ -I$(top_srcdir)/starpurm/include -I$(top_srcdir)/starpurm/src \ -I$(top_builddir)/starpurm/src \ -I$(top_builddir)/starpurm/include AM_CFLAGS = -Wall -g $(HWLOC_CFLAGS) $(DLB_CFLAGS) LDADD = $(top_builddir)/starpurm/src/libstarpurm-@STARPU_EFFECTIVE_VERSION@.la $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) $(DLB_LIBS) examplebindir = $(libdir)/starpu/examples/starpurm 01_init_exit_SOURCES = 01_init_exit.c 02_list_units_SOURCES = 02_list_units.c 03_cpusets_SOURCES = 03_cpusets.c 04_drs_enable_SOURCES = 04_drs_enable.c 05_vector_scale_SOURCES = 05_vector_scale.c 06_spawn_SOURCES = 06_spawn.c 07_async_spawn_SOURCES = 07_async_spawn.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 starpurm/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign starpurm/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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-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 01_init_exit$(EXEEXT): $(01_init_exit_OBJECTS) $(01_init_exit_DEPENDENCIES) $(EXTRA_01_init_exit_DEPENDENCIES) @rm -f 01_init_exit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(01_init_exit_OBJECTS) $(01_init_exit_LDADD) $(LIBS) 02_list_units$(EXEEXT): $(02_list_units_OBJECTS) $(02_list_units_DEPENDENCIES) $(EXTRA_02_list_units_DEPENDENCIES) @rm -f 02_list_units$(EXEEXT) $(AM_V_CCLD)$(LINK) $(02_list_units_OBJECTS) $(02_list_units_LDADD) $(LIBS) 03_cpusets$(EXEEXT): $(03_cpusets_OBJECTS) $(03_cpusets_DEPENDENCIES) $(EXTRA_03_cpusets_DEPENDENCIES) @rm -f 03_cpusets$(EXEEXT) $(AM_V_CCLD)$(LINK) $(03_cpusets_OBJECTS) $(03_cpusets_LDADD) $(LIBS) 04_drs_enable$(EXEEXT): $(04_drs_enable_OBJECTS) $(04_drs_enable_DEPENDENCIES) $(EXTRA_04_drs_enable_DEPENDENCIES) @rm -f 04_drs_enable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(04_drs_enable_OBJECTS) $(04_drs_enable_LDADD) $(LIBS) 05_vector_scale$(EXEEXT): $(05_vector_scale_OBJECTS) $(05_vector_scale_DEPENDENCIES) $(EXTRA_05_vector_scale_DEPENDENCIES) @rm -f 05_vector_scale$(EXEEXT) $(AM_V_CCLD)$(LINK) $(05_vector_scale_OBJECTS) $(05_vector_scale_LDADD) $(LIBS) 06_spawn$(EXEEXT): $(06_spawn_OBJECTS) $(06_spawn_DEPENDENCIES) $(EXTRA_06_spawn_DEPENDENCIES) @rm -f 06_spawn$(EXEEXT) $(AM_V_CCLD)$(LINK) $(06_spawn_OBJECTS) $(06_spawn_LDADD) $(LIBS) 07_async_spawn$(EXEEXT): $(07_async_spawn_OBJECTS) $(07_async_spawn_DEPENDENCIES) $(EXTRA_07_async_spawn_DEPENDENCIES) @rm -f 07_async_spawn$(EXEEXT) $(AM_V_CCLD)$(LINK) $(07_async_spawn_OBJECTS) $(07_async_spawn_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/01_init_exit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/02_list_units.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/03_cpusets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/04_drs_enable.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/05_vector_scale.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/06_spawn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/07_async_spawn.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(examplebindir)"; 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-examplebinPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/01_init_exit.Po -rm -f ./$(DEPDIR)/02_list_units.Po -rm -f ./$(DEPDIR)/03_cpusets.Po -rm -f ./$(DEPDIR)/04_drs_enable.Po -rm -f ./$(DEPDIR)/05_vector_scale.Po -rm -f ./$(DEPDIR)/06_spawn.Po -rm -f ./$(DEPDIR)/07_async_spawn.Po -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-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 ./$(DEPDIR)/01_init_exit.Po -rm -f ./$(DEPDIR)/02_list_units.Po -rm -f ./$(DEPDIR)/03_cpusets.Po -rm -f ./$(DEPDIR)/04_drs_enable.Po -rm -f ./$(DEPDIR)/05_vector_scale.Po -rm -f ./$(DEPDIR)/06_spawn.Po -rm -f ./$(DEPDIR)/07_async_spawn.Po -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 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-am clean 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 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-examplebinPROGRAMS .PRECIOUS: Makefile showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK # 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.3.9+dfsg/starpurm/include/000077500000000000000000000000001413463044200172625ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpurm/include/starpurm.h000066400000000000000000000356221413463044200213200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __STARPURM_H #define __STARPURM_H #include #include #ifdef __cplusplus extern "C" { #endif /** @defgroup API_Interop_Support Interoperability Support @brief This section describes the interface supplied by StarPU to interoperate with other runtime systems. @{ */ /** StarPU Resource Manager return type. */ enum e_starpurm_drs_ret { /** Dynamic resource sharing operation succeeded. */ starpurm_DRS_SUCCESS = 0, /** Dynamic resource sharing is disabled. */ starpurm_DRS_DISABLD = -1, /** Dynamic resource sharing operation is not authorized or implemented. */ starpurm_DRS_PERM = -2, /** Dynamic resource sharing operation has been called with one or more invalid parameters. */ starpurm_DRS_EINVAL = -3 #if 0 /* Unused for now */ starpurm_DRS_NOTED, starpurm_DRS_REQST #endif }; typedef int starpurm_drs_ret_t; typedef void *starpurm_drs_desc_t; typedef void *starpurm_drs_cbs_t; typedef void (*starpurm_drs_cb_t)(void *); typedef void *starpurm_block_cond_t; typedef int (*starpurm_polling_t)(void *); /** @name Initialisation @{ */ /** Resource enforcement */ void starpurm_initialize_with_cpuset(hwloc_cpuset_t initially_owned_cpuset); /** Initialize StarPU and the StarPU-RM resource management module. The starpu_init() function should not have been called before the call to starpurm_initialize(). The starpurm_initialize() function will take care of this */ void starpurm_initialize(void); /** Shutdown StarPU-RM and StarPU. The starpu_shutdown() function should not be called before. The starpurm_shutdown() function will take care of this. */ void starpurm_shutdown(void); /** @} */ /** @name Spawn @{ */ /** Allocate a temporary context spanning the units selected in the cpuset bitmap, set it as the default context for the current thread, and call user function \p f. Upon the return of user function \p f, the temporary context is freed and the previous default context for the current thread is restored. */ void starpurm_spawn_kernel_on_cpus(void *data, void(*f)(void *), void *args, hwloc_cpuset_t cpuset); /** Spawn a POSIX thread and returns immediately. The thread spawned will allocate a temporary context spanning the units selected in the cpuset bitmap, set it as the default context for the current thread, and call user function \p f. Upon the return of user function \p f, the temporary context will be freed and the previous default context for the current thread restored. A user specified callback \p cb_f will be called just before the termination of the thread. */ void starpurm_spawn_kernel_on_cpus_callback(void *data, void(*f)(void *), void *args, hwloc_cpuset_t cpuset, void(*cb_f)(void *), void *cb_args); void starpurm_spawn_kernel_callback(void *data, void(*f)(void *), void *args, void(*cb_f)(void *), void *cb_args); /** @} */ /** @name DynamicResourceSharing @{ */ /** Turn-on dynamic resource sharing support. */ starpurm_drs_ret_t starpurm_set_drs_enable(starpurm_drs_desc_t *spd); /** Turn-off dynamic resource sharing support. */ starpurm_drs_ret_t starpurm_set_drs_disable(starpurm_drs_desc_t *spd); /** Return the state of the dynamic resource sharing support (\p =!0 enabled, \p =0 disabled). */ int starpurm_drs_enabled_p(void); /** Set the maximum number of CPU computing units available for StarPU computations to \p max. This number cannot exceed the maximum number of StarPU's CPU worker allocated at start-up time. */ starpurm_drs_ret_t starpurm_set_max_parallelism(starpurm_drs_desc_t *spd, int max); #if 0 /* Unused for now */ starpurm_drs_ret_t starpurm_callback_set(starpurm_drs_desc_t *spd, starpurm_drs_cbs_t which, starpurm_drs_cb_t callback); starpurm_drs_ret_t starpurm_callback_get(starpurm_drs_desc_t *spd, starpurm_drs_cbs_t which, starpurm_drs_cb_t *callback); #endif /** Extend StarPU's default scheduling context to execute tasks on worker corresponding to logical unit \p cpuid. If StarPU does not have a worker thread initialized for logical unit \p cpuid, do nothing. */ starpurm_drs_ret_t starpurm_assign_cpu_to_starpu(starpurm_drs_desc_t *spd, int cpuid); /** Extend StarPU's default scheduling context to execute tasks on \p ncpus more workers, up to the number of StarPU worker threads initialized. */ starpurm_drs_ret_t starpurm_assign_cpus_to_starpu(starpurm_drs_desc_t *spd, int ncpus); /** Extend StarPU's default scheduling context to execute tasks on the additional logical units selected in \p mask. Logical units of \p mask for which no StarPU worker is initialized are silently ignored. */ starpurm_drs_ret_t starpurm_assign_cpu_mask_to_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Set StarPU's default scheduling context to execute tasks on all available logical units for which a StarPU worker has been initialized. */ starpurm_drs_ret_t starpurm_assign_all_cpus_to_starpu(starpurm_drs_desc_t *spd); /** Shrink StarPU's default scheduling context so as to not execute tasks on worker corresponding to logical unit \p cpuid. If StarPU does not have a worker thread initialized for logical unit \p cpuid, do nothing. */ starpurm_drs_ret_t starpurm_withdraw_cpu_from_starpu(starpurm_drs_desc_t *spd, int cpuid); /** Shrink StarPU's default scheduling context to execute tasks on \p ncpus less workers. */ starpurm_drs_ret_t starpurm_withdraw_cpus_from_starpu(starpurm_drs_desc_t *spd, int ncpus); /** Shrink StarPU's default scheduling context so as to not execute tasks on the logical units selected in \p mask. Logical units of \p mask for which no StarPU worker is initialized are silently ignored. */ starpurm_drs_ret_t starpurm_withdraw_cpu_mask_from_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Shrink StarPU's default scheduling context so as to remove all logical units. */ starpurm_drs_ret_t starpurm_withdraw_all_cpus_from_starpu(starpurm_drs_desc_t *spd); /* --- */ /** Synonym for starpurm_assign_all_cpus_to_starpu(). */ starpurm_drs_ret_t starpurm_lend(starpurm_drs_desc_t *spd); /** Synonym for starpurm_assign_cpu_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_cpu(starpurm_drs_desc_t *spd, int cpuid); /** Synonym for starpurm_assign_cpus_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_cpus(starpurm_drs_desc_t *spd, int ncpus); /** Synonym for starpurm_assign_cpu_mask_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_cpu_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Synonym for starpurm_withdraw_all_cpus_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim(starpurm_drs_desc_t *spd); /** Synonym for starpurm_withdraw_cpu_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_cpu(starpurm_drs_desc_t *spd, int cpuid); /** Synonym for starpurm_withdraw_cpus_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_cpus(starpurm_drs_desc_t *spd, int ncpus); /** Synonym for starpurm_withdraw_cpu_mask_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_cpu_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Synonym for starpurm_withdraw_all_cpus_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire(starpurm_drs_desc_t *spd); /** Synonym for starpurm_withdraw_cpu_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_cpu(starpurm_drs_desc_t *spd, int cpuid); /** Synonym for starpurm_withdraw_cpus_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_cpus(starpurm_drs_desc_t *spd, int ncpus); /** Synonym for starpurm_withdraw_cpu_mask_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_cpu_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Synonym for starpurm_assign_all_cpus_to_starpu(). */ starpurm_drs_ret_t starpurm_return_all(starpurm_drs_desc_t *spd); /** Synonym for starpurm_assign_cpu_to_starpu(). */ starpurm_drs_ret_t starpurm_return_cpu(starpurm_drs_desc_t *spd, int cpuid); #if 0 /* Pause/resume (not implemented) */ starpurm_drs_ret_t starpurm_create_block_condition(starpurm_block_cond_t *cond); void starpurm_block_current_task(starpurm_block_cond_t *cond); void starpurm_signal_block_condition(starpurm_block_cond_t *cond); void starpurm_register_polling_service(const char *service_name, starpurm_polling_t function, void *data); void starpurm_unregister_polling_service(const char *service_name, starpurm_polling_t function, void *data); #endif /** @} */ /** @name Devices @{ */ /** Return the device type ID constant associated to the device type name. Valid names for \p type_str are: - \c "cpu": regular CPU unit; - \c "opencl": OpenCL device unit; - \c "cuda": nVidia CUDA device unit; - \c "mic": Intel KNC type device unit. */ int starpurm_get_device_type_id(const char *type_str); /** Return the device type name associated to the device type ID constant. */ const char *starpurm_get_device_type_name(int type_id); /** Return the number of initialized StarPU worker for the device type \p type_id. */ int starpurm_get_nb_devices_by_type(int type_id); /** Return the unique ID assigned to the \p device_rank nth device of type \p type_id. */ int starpurm_get_device_id(int type_id, int device_rank); /** Extend StarPU's default scheduling context to use \p unit_rank nth device of type \p type_id. */ starpurm_drs_ret_t starpurm_assign_device_to_starpu(starpurm_drs_desc_t *spd, int type_id, int unit_rank); /** Extend StarPU's default scheduling context to use \p ndevices more devices of type \p type_id, up to the number of StarPU workers initialized for such device type. */ starpurm_drs_ret_t starpurm_assign_devices_to_starpu(starpurm_drs_desc_t *spd, int type_id, int ndevices); /** Extend StarPU's default scheduling context to use additional devices as designated by their corresponding StarPU worker thread(s) CPU-set \p mask. */ starpurm_drs_ret_t starpurm_assign_device_mask_to_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Extend StarPU's default scheduling context to use all devices of type \p type_id for which it has a worker thread initialized. */ starpurm_drs_ret_t starpurm_assign_all_devices_to_starpu(starpurm_drs_desc_t *spd, int type_id); /** Shrink StarPU's default scheduling context to not use \p unit_rank nth device of type \p type_id. */ starpurm_drs_ret_t starpurm_withdraw_device_from_starpu(starpurm_drs_desc_t *spd, int type_id, int unit_rank); /** Shrink StarPU's default scheduling context to use \p ndevices less devices of type \p type_id. */ starpurm_drs_ret_t starpurm_withdraw_devices_from_starpu(starpurm_drs_desc_t *spd, int type_id, int ndevices); /** Shrink StarPU's default scheduling context to not use devices designated by their corresponding StarPU worker thread(s) CPU-set \p mask. */ starpurm_drs_ret_t starpurm_withdraw_device_mask_from_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Shrink StarPU's default scheduling context to use no devices of type \p type_id. */ starpurm_drs_ret_t starpurm_withdraw_all_devices_from_starpu(starpurm_drs_desc_t *spd, int type_id); /* --- */ /** Synonym for starpurm_assign_device_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank); /** Synonym for starpurm_assign_devices_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_devices(starpurm_drs_desc_t *spd, int type_id, int ndevices); /** Synonym for starpurm_assign_device_mask_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_device_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Synonym for starpurm_assign_all_devices_to_starpu(). */ starpurm_drs_ret_t starpurm_lend_all_devices(starpurm_drs_desc_t *spd, int type_id); /** Synonym for starpurm_withdraw_device_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank); /** Synonym for starpurm_withdraw_devices_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_devices(starpurm_drs_desc_t *spd, int type_id, int ndevices); /** Synonym for starpurm_withdraw_device_mask_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_device_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Synonym for starpurm_withdraw_all_devices_from_starpu(). */ starpurm_drs_ret_t starpurm_reclaim_all_devices(starpurm_drs_desc_t *spd, int type_id); /** Synonym for starpurm_withdraw_device_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank); /** Synonym for starpurm_withdraw_devices_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_devices(starpurm_drs_desc_t *spd, int type_id, int ndevices); /** Synonym for starpurm_withdraw_device_mask_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_device_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask); /** Synonym for starpurm_withdraw_all_devices_from_starpu(). */ starpurm_drs_ret_t starpurm_acquire_all_devices(starpurm_drs_desc_t *spd, int type_id); /** Synonym for starpurm_assign_all_devices_to_starpu(). */ starpurm_drs_ret_t starpurm_return_all_devices(starpurm_drs_desc_t *spd, int type_id); /** Synonym for starpurm_assign_device_to_starpu(). */ starpurm_drs_ret_t starpurm_return_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank); /** @} */ /** @name CpusetsQueries @{ */ /** Return the CPU-set of the StarPU worker associated to the \p unit_rank nth unit of type \p type_id. */ hwloc_cpuset_t starpurm_get_device_worker_cpuset(int type_id, int unit_rank); /** Return the cumulated CPU-set of all StarPU worker threads. */ hwloc_cpuset_t starpurm_get_global_cpuset(void); /** Return the CPU-set of the StarPU worker threads currently selected in the default StarPU's scheduling context. */ hwloc_cpuset_t starpurm_get_selected_cpuset(void); /** Return the cumulated CPU-set of all CPU StarPU worker threads. */ hwloc_cpuset_t starpurm_get_all_cpu_workers_cpuset(void); /** Return the cumulated CPU-set of all "non-CPU" StarPU worker threads. */ hwloc_cpuset_t starpurm_get_all_device_workers_cpuset(void); /** Return the cumulated CPU-set of all StarPU worker threads for devices of type \p typeid. */ hwloc_cpuset_t starpurm_get_all_device_workers_cpuset_by_type(int typeid); /** @} */ /** @} */ #ifdef __cplusplus } #endif #endif /* __STARPURM_H */ starpu-1.3.9+dfsg/starpurm/include/starpurm_config.h.in000066400000000000000000000017201413463044200232420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __STARPURM_CONFIG_H__ #define __STARPURM_CONFIG_H__ /* Major version number of StarPU RM. */ #undef STARPURM_MAJOR_VERSION /* Minor version number of StarPU RM. */ #undef STARPURM_MINOR_VERSION /* Release version number of StarPU RM. */ #undef STARPURM_RELEASE_VERSION #endif starpu-1.3.9+dfsg/starpurm/src/000077500000000000000000000000001413463044200164265ustar00rootroot00000000000000starpu-1.3.9+dfsg/starpurm/src/Makefile.am000066400000000000000000000040421413463044200204620ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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-notests.mk SUBDIRS = CLEANFILES = *.gcno *.gcda *.linkinfo AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_builddir)/include AM_CPPFLAGS += -I$(top_srcdir)/starpurm/include -I$(top_srcdir)/starpurm/src -I$(top_builddir)/starpurm/src -I$(top_builddir)/starpurm/include AM_CFLAGS = -Wall -g $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) $(NMAD_CFLAGS) AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) $(NMAD_LDFLAGS) AM_LIBADD = libstarpurm_so_version = $(LIBSTARPURM_INTERFACE_CURRENT):$(LIBSTARPURM_INTERFACE_REVISION):$(LIBSTARPURM_INTERFACE_AGE) lib_LTLIBRARIES = libstarpurm-@STARPU_EFFECTIVE_VERSION@.la libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS = $(AM_CPPFLAGS) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS = $(AM_CFLAGS) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined -version-info $(libstarpurm_so_version) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(AM_LIBADD) $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(HWLOC_LIBS) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ starpurm.c if STARPURM_HAVE_DLB libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += \ starpurm_dlb.c endif noinst_HEADERS = \ starpurm_private.h starpu-1.3.9+dfsg/starpurm/src/Makefile.in000066400000000000000000001114401413463044200204740ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ @STARPURM_HAVE_DLB_TRUE@am__append_1 = \ @STARPURM_HAVE_DLB_TRUE@ starpurm_dlb.c subdir = starpurm/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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 = libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(am__DEPENDENCIES_1) \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la \ $(am__DEPENDENCIES_1) am__libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST = \ starpurm.c starpurm_dlb.c @STARPURM_HAVE_DLB_TRUE@am__objects_1 = libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.lo am_libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.lo \ $(am__objects_1) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ $(am_libstarpurm_@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 = libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) \ $(CFLAGS) $(libstarpurm_@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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Plo \ ./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Plo 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 = $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) DIST_SOURCES = \ $(am__libstarpurm_@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 distdir-am 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-notests.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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 AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src \ -I$(top_builddir)/src -I$(top_builddir)/include \ -I$(top_srcdir)/starpurm/include -I$(top_srcdir)/starpurm/src \ -I$(top_builddir)/starpurm/src \ -I$(top_builddir)/starpurm/include AM_CFLAGS = -Wall -g $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) $(NMAD_CFLAGS) AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_COI_LDFLAGS) $(STARPU_SCIF_LDFLAGS) $(NMAD_LDFLAGS) AM_LIBADD = libstarpurm_so_version = $(LIBSTARPURM_INTERFACE_CURRENT):$(LIBSTARPURM_INTERFACE_REVISION):$(LIBSTARPURM_INTERFACE_AGE) lib_LTLIBRARIES = libstarpurm-@STARPU_EFFECTIVE_VERSION@.la libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS = $(AM_CPPFLAGS) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS = $(AM_CFLAGS) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined -version-info $(libstarpurm_so_version) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = $(AM_LIBADD) $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(HWLOC_LIBS) libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = starpurm.c \ $(am__append_1) noinst_HEADERS = \ starpurm_private.h all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/starpu-notests.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 starpurm/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign starpurm/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu-notests.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}; \ } libstarpurm-@STARPU_EFFECTIVE_VERSION@.la: $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(EXTRA_libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(AM_V_CCLD)$(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LINK) -rpath $(libdir) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 $@ $< libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.lo: starpurm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -MT libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.lo -MD -MP -MF $(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Tpo -c -o libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.lo `test -f 'starpurm.c' || echo '$(srcdir)/'`starpurm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Tpo $(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpurm.c' object='libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.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) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.lo `test -f 'starpurm.c' || echo '$(srcdir)/'`starpurm.c libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.lo: starpurm_dlb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -MT libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.lo -MD -MP -MF $(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Tpo -c -o libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.lo `test -f 'starpurm_dlb.c' || echo '$(srcdir)/'`starpurm_dlb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Tpo $(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='starpurm_dlb.c' object='libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.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) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(libstarpurm_@STARPU_EFFECTIVE_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.lo `test -f 'starpurm_dlb.c' || echo '$(srcdir)/'`starpurm_dlb.c 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Plo -rm -f ./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Plo -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 -f ./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm.Plo -rm -f ./$(DEPDIR)/libstarpurm_@STARPU_EFFECTIVE_VERSION@_la-starpurm_dlb.Plo -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 \ am--depfiles 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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # recheck: -cat /dev/null showfailed: @-cat /dev/null showcheck: -cat /dev/null showsuite: -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.3.9+dfsg/starpurm/src/starpurm.c000066400000000000000000001467011413463044200204600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 _DEBUG */ struct s_starpurm_unit { /* Opaque unit id. * * For StarPU-RM, this id is used as an index to array starpurm->units[]. */ int id; /* Id of the unit type. */ int type; /* Boolean indicating whether the device is currently selected for use by the runtime system. */ int selected; /* StarPU id of the worker driving the device. */ int workerid; /* Cpuset of the StarPU worker. */ hwloc_cpuset_t worker_cpuset; /* Condition variable to notify that a unit is now available to driver a worker waking up. */ pthread_cond_t unit_available_cond; }; static struct s_starpurm *_starpurm = NULL; #if 0 static char *bitmap_to_str(hwloc_bitmap_t bitmap) { int strl = hwloc_bitmap_snprintf(NULL, 0, bitmap); char *str = malloc(strl+1); hwloc_bitmap_snprintf(str, strl+1, bitmap); return str; } #endif #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS enum e_starpurm_event { starpurm_event_code_min = 0, starpurm_event_exit = 0, starpurm_event_worker_going_to_sleep = 1, starpurm_event_worker_waking_up = 2, starpurm_event_unit_available = 3, starpurm_event_code_max = 3 }; const char *_starpurm_event_to_str(int event_code) { const char *s = NULL; switch (event_code) { case starpurm_event_exit: s = "starpurm_event_exit"; break; case starpurm_event_worker_going_to_sleep: s = "starpurm_event_worker_going_to_sleep"; break; case starpurm_event_worker_waking_up: s = "starpurm_event_worker_waking_up"; break; case starpurm_event_unit_available: s = "starpurm_event_unit_available"; break; default: s = ""; break; } return s; } struct s_starpurm_event { struct s_starpurm_event *next; struct s_starpurm_event *prev; enum e_starpurm_event code; unsigned int workerid; }; static void _enqueue_event(struct s_starpurm_event *event) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; assert(event->next == NULL); assert(event->prev == NULL); assert(event->code >= starpurm_event_code_min && event->code <= starpurm_event_code_max); pthread_mutex_lock(&rm->event_list_mutex); if (rm->event_processing_ended) { pthread_mutex_unlock(&rm->event_list_mutex); return; } assert((rm->event_list_head == NULL && rm->event_list_tail == NULL) || (rm->event_list_head != NULL && rm->event_list_tail != NULL)); if (rm->event_list_head == NULL) { rm->event_list_tail = event; } else { rm->event_list_head->prev = event; } event->next = rm->event_list_head; rm->event_list_head = event; if (event->code == starpurm_event_exit) { rm->event_processing_ended = 1; int i; for (i=0; inunits; i++) { pthread_cond_broadcast(&rm->units[i].unit_available_cond); } } #ifdef STARPURM_VERBOSE if (event->code != starpurm_event_worker_waking_up) fprintf(stderr, "%s: event->code=%d('%s'), workerid=%u\n", __func__, event->code, _starpurm_event_to_str(event->code), event->workerid); #endif pthread_cond_broadcast(&rm->event_list_cond); #ifdef STARPURM_HAVE_DLB if (event->code == starpurm_event_worker_waking_up) { int unit_id = rm->worker_unit_ids[event->workerid]; /* if DLB is in use, wait for the unit to become available from the point of view of DLB, before using it */ #ifdef STARPURM_VERBOSE fprintf(stderr, "%s: event->code=%d('%s'), workerid=%u - waiting\n", __func__, event->code, _starpurm_event_to_str(event->code), event->workerid); #endif pthread_cond_wait(&rm->units[unit_id].unit_available_cond, &rm->event_list_mutex); #ifdef STARPURM_VERBOSE fprintf(stderr, "%s: event->code=%d('%s'), workerid=%u - wakeup\n", __func__, event->code, _starpurm_event_to_str(event->code), event->workerid); #endif } #endif pthread_mutex_unlock(&rm->event_list_mutex); } static struct s_starpurm_event *_dequeue_event_no_lock(void) { struct s_starpurm *rm = _starpurm; struct s_starpurm_event *event = NULL; if (rm->event_list_tail != NULL) { event = rm->event_list_tail; if (event->prev == NULL) { rm->event_list_head = NULL; rm->event_list_tail = NULL; } else { event->prev->next = NULL; rm->event_list_tail = event->prev; } event->prev = NULL; event->next = NULL; } return event; } static struct s_starpurm_event *_wait_event_no_lock(void) { struct s_starpurm *rm = _starpurm; while (rm->event_list_head == NULL) { pthread_cond_wait(&rm->event_list_cond, &rm->event_list_mutex); } struct s_starpurm_event *event = _dequeue_event_no_lock(); return event; } /* unused */ static struct s_starpurm_event *_dequeue_event(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; pthread_mutex_lock(&rm->event_list_mutex); struct s_starpurm_event *event = _dequeue_event_no_lock(); pthread_mutex_unlock(&rm->event_list_mutex); return event; } /* unused */ static struct s_starpurm_event *_wait_event(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; pthread_mutex_lock(&rm->event_list_mutex); struct s_starpurm_event *event = _wait_event_no_lock(); pthread_mutex_unlock(&rm->event_list_mutex); return event; } static void _enqueue_exit_event(void) { struct s_starpurm_event *event = calloc(1, sizeof(*event)); event->code = starpurm_event_exit; event->workerid = 0; _enqueue_event(event); } static void callback_worker_going_to_sleep(unsigned workerid) { struct s_starpurm_event *event = calloc(1, sizeof(*event)); event->code = starpurm_event_worker_going_to_sleep; event->workerid = workerid; _enqueue_event(event); } static void callback_worker_waking_up(unsigned workerid) { struct s_starpurm_event *event = calloc(1, sizeof(*event)); event->code = starpurm_event_worker_waking_up; event->workerid = workerid; _enqueue_event(event); } void starpurm_enqueue_event_cpu_unit_available(int unit_id) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; assert(unit_id >= 0); /* * unit_id may exceed the number of CPU units actually used by StarPU, * if some CPU cores are not used. * * //assert(unit_id < rm->nunits_by_type[starpurm_unit_cpu]); */ unsigned workerid = rm->units[unit_id].workerid; struct s_starpurm_event *event = calloc(1, sizeof(*event)); event->code = starpurm_event_unit_available; event->workerid = workerid; _enqueue_event(event); } static void *event_thread_func(void *_arg) { (void)_arg; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; int need_refresh = 0; pthread_mutex_lock(&rm->event_list_mutex); while (rm->event_processing_enabled == 0) { pthread_cond_wait(&rm->event_processing_cond, &rm->event_list_mutex); } pthread_mutex_unlock(&rm->event_list_mutex); hwloc_cpuset_t owned_cpuset = hwloc_bitmap_dup(rm->global_cpuset); hwloc_cpuset_t to_reclaim_cpuset = hwloc_bitmap_alloc(); hwloc_cpuset_t to_lend_cpuset = hwloc_bitmap_alloc(); while (1) { struct s_starpurm_event *event = _dequeue_event(); #ifdef STARPURM_HAVE_DLB if ((event == NULL || event->code == starpurm_event_exit) || need_refresh) #else if ((event == NULL || event->code == starpurm_event_exit) && need_refresh) #endif { int did_lend_cpuset = 1; #ifdef STARPURM_HAVE_DLB /* notify DLB about changes */ if (!hwloc_bitmap_iszero(to_reclaim_cpuset)) { starpurm_dlb_notify_starpu_worker_mask_waking_up(to_reclaim_cpuset); } did_lend_cpuset = 0; if (!hwloc_bitmap_iszero(to_lend_cpuset)) { did_lend_cpuset = starpurm_dlb_notify_starpu_worker_mask_going_to_sleep(to_lend_cpuset); } #endif /* if DLB is not initialized, ignore lend operations */ if (did_lend_cpuset) { hwloc_bitmap_andnot(owned_cpuset, owned_cpuset, to_lend_cpuset); } hwloc_bitmap_or(owned_cpuset, owned_cpuset, to_reclaim_cpuset); #if 0 { char *to_lend_str = bitmap_to_str(to_lend_cpuset); char *to_reclaim_str = bitmap_to_str(to_reclaim_cpuset); free(to_lend_str); free(to_reclaim_str); } #endif need_refresh = 0; hwloc_bitmap_zero(to_lend_cpuset); hwloc_bitmap_zero(to_reclaim_cpuset); } if (event == NULL) { event = _wait_event(); } if (event->code == starpurm_event_exit) { free(event); break; } /* TODO: accumulate state change */ switch (event->code) { case starpurm_event_worker_going_to_sleep: { if (event->workerid < rm->nunits) { int unit_id = rm->worker_unit_ids[event->workerid]; hwloc_bitmap_or(to_lend_cpuset, to_lend_cpuset, rm->units[unit_id].worker_cpuset); hwloc_bitmap_andnot(to_reclaim_cpuset, to_reclaim_cpuset, rm->units[unit_id].worker_cpuset); } } break; case starpurm_event_worker_waking_up: { if (event->workerid < rm->nunits) { int unit_id = rm->worker_unit_ids[event->workerid]; hwloc_bitmap_andnot(to_lend_cpuset, to_lend_cpuset, rm->units[unit_id].worker_cpuset); #ifdef STARPURM_HAVE_DLB if (rm->units[unit_id].type == starpurm_unit_cpu && !hwloc_bitmap_intersects(rm->units[unit_id].worker_cpuset, owned_cpuset)) { /* Only reclaim the unit from DLB if StarPU does not own it already. */ hwloc_bitmap_or(to_reclaim_cpuset, to_reclaim_cpuset, rm->units[unit_id].worker_cpuset); } else { pthread_cond_broadcast(&rm->units[unit_id].unit_available_cond); } #else hwloc_bitmap_or(to_reclaim_cpuset, to_reclaim_cpuset, rm->units[unit_id].worker_cpuset); #endif } } break; #ifdef STARPURM_HAVE_DLB case starpurm_event_unit_available: { if (event->workerid < rm->nunits) { /* a reclaimed unit is now available from DLB, unlock the corresponding worker waking up */ int unit_id = rm->worker_unit_ids[event->workerid]; pthread_cond_broadcast(&rm->units[unit_id].unit_available_cond); } } break; #endif default: /* unknown event code */ assert(0); break; } free(event); need_refresh = 1; } pthread_mutex_lock(&rm->event_list_mutex); /* exit event should be last */ assert(rm->event_list_head == NULL); assert(rm->event_list_tail == NULL); hwloc_bitmap_free(owned_cpuset); hwloc_bitmap_free(to_reclaim_cpuset); hwloc_bitmap_free(to_lend_cpuset); pthread_mutex_unlock(&rm->event_list_mutex); return NULL; } #endif /* STARPURM_STARPU_HAVE_WORKER_CALLBACKS */ /* Resource enforcement */ static starpurm_drs_ret_t _starpurm_update_cpuset(hwloc_cpuset_t cpuset) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (hwloc_bitmap_isequal(cpuset, rm->selected_cpuset)) { return starpurm_DRS_SUCCESS; } pthread_mutex_lock(&rm->temporary_ctxs_mutex); if (rm->starpu_in_pause) { starpu_resume(); rm->starpu_in_pause = 0; } int workers_to_remove[_starpurm->nunits]; unsigned nworkers_to_remove = 0; int workers_to_add[_starpurm->nunits]; unsigned nworkers_to_add = 0; int i; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_alloc(); int new_selected_ncpus = 0; for (i=0; inunits; i++) { struct s_starpurm_unit *unit = &rm->units[i]; hwloc_bitmap_and(temp_cpuset, unit->worker_cpuset, cpuset); if (hwloc_bitmap_iszero(temp_cpuset)) { workers_to_remove[nworkers_to_remove] = unit->workerid; unit->selected = 0; nworkers_to_remove++; } else { workers_to_add[nworkers_to_add] = unit->workerid; unit->selected = 1; nworkers_to_add++; if (unit->type == starpurm_unit_cpu) { new_selected_ncpus++; } } } hwloc_bitmap_free(temp_cpuset); rm->selected_nworkers = nworkers_to_add; rm->selected_ncpus = new_selected_ncpus; hwloc_bitmap_free(rm->selected_cpuset); rm->selected_cpuset = hwloc_bitmap_dup(cpuset); if (nworkers_to_add > 0) { #if defined(STARPURM_HAVE_DLB) && !defined(STARPURM_STARPU_HAVE_WORKER_CALLBACKS) { /* if StarPU worker callbacks are not enabled, we still * notify DLB about resource usage changes, but we do * not wait for the formal DLB go to use the units */ hwloc_cpuset_t to_reclaim_cpuset = hwloc_bitmap_alloc(); for (i=0; iworker_unit_ids[workers_to_add[i]]; hwloc_bitmap_or(to_reclaim_cpuset, to_reclaim_cpuset, rm->units[unit_id].worker_cpuset); } starpurm_dlb_notify_starpu_worker_mask_waking_up(to_reclaim_cpuset); hwloc_bitmap_free(to_reclaim_cpuset); } #endif starpu_sched_ctx_add_workers(workers_to_add, nworkers_to_add, rm->sched_ctx_id); } if (nworkers_to_remove > 0) { starpu_sched_ctx_remove_workers(workers_to_remove, nworkers_to_remove, rm->sched_ctx_id); #if defined(STARPURM_HAVE_DLB) && !defined(STARPURM_STARPU_HAVE_WORKER_CALLBACKS) { /* if StarPU worker callbacks are not enabled, we still * notify DLB about resource usage changes, but we do * not wait for the workers to become idle */ hwloc_cpuset_t to_lend_cpuset = hwloc_bitmap_alloc(); for (i=0; iworker_unit_ids[workers_to_remove[i]]; hwloc_bitmap_or(to_lend_cpuset, to_lend_cpuset, rm->units[unit_id].worker_cpuset); } starpurm_dlb_notify_starpu_worker_mask_going_to_sleep(to_lend_cpuset); hwloc_bitmap_free(to_lend_cpuset); } #endif } #ifdef _DEBUG starpu_sched_ctx_display_workers(rm->sched_ctx_id, stderr); #endif /* DEBUG */ if (rm->selected_nworkers == 0 && rm->avail_temporary_ctxs == rm->max_temporary_ctxs) { rm->starpu_in_pause = 1; starpu_pause(); } pthread_mutex_unlock(&rm->temporary_ctxs_mutex); return starpurm_DRS_SUCCESS; } static unsigned _starpurm_temporary_context_alloc(hwloc_cpuset_t cpuset) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); assert(_starpurm->max_temporary_ctxs > 0); struct s_starpurm *rm = _starpurm; pthread_mutex_lock(&rm->temporary_ctxs_mutex); while(rm->avail_temporary_ctxs == 0) { pthread_cond_wait(&rm->temporary_ctxs_cond, &rm->temporary_ctxs_mutex); } assert(rm->avail_temporary_ctxs > 0); rm->avail_temporary_ctxs--; if (rm->starpu_in_pause) { starpu_resume(); rm->starpu_in_pause = 0; } pthread_mutex_unlock(&rm->temporary_ctxs_mutex); unsigned sched_ctx_id = starpu_sched_ctx_create(NULL, -1, "starpurm_temp", STARPU_SCHED_CTX_POLICY_NAME, "eager", 0); assert(sched_ctx_id != STARPU_NMAX_SCHED_CTXS); int workers_to_remove[_starpurm->nunits]; unsigned nworkers_to_remove = 0; int workers_to_add[_starpurm->nunits]; unsigned nworkers_to_add = 0; int i; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_alloc(); for (i=0; inunits; i++) { struct s_starpurm_unit *unit = &rm->units[i]; hwloc_bitmap_and(temp_cpuset, unit->worker_cpuset, cpuset); if (hwloc_bitmap_iszero(temp_cpuset)) { workers_to_remove[nworkers_to_remove] = unit->workerid; nworkers_to_remove++; } else { workers_to_add[nworkers_to_add] = unit->workerid; nworkers_to_add++; } } hwloc_bitmap_free(temp_cpuset); if (nworkers_to_add > 0) starpu_sched_ctx_add_workers(workers_to_add, nworkers_to_add, sched_ctx_id); if (nworkers_to_remove > 0) starpu_sched_ctx_remove_workers(workers_to_remove, nworkers_to_remove, sched_ctx_id); #ifdef _DEBUG starpu_sched_ctx_display_workers(sched_ctx_id, stderr); #endif /* DEBUG */ return sched_ctx_id; } static void _starpurm_temporary_context_free(unsigned ctx) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); assert(_starpurm->max_temporary_ctxs > 0); struct s_starpurm *rm = _starpurm; starpu_sched_ctx_delete(ctx); pthread_mutex_lock(&rm->temporary_ctxs_mutex); rm->avail_temporary_ctxs++; pthread_cond_signal(&rm->temporary_ctxs_cond); if (rm->selected_nworkers == 0 && rm->avail_temporary_ctxs == rm->max_temporary_ctxs) { rm->starpu_in_pause = 1; starpu_pause(); } pthread_mutex_unlock(&rm->temporary_ctxs_mutex); } static starpurm_drs_ret_t _starpurm_set_ncpus(unsigned int ncpus) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; int i; if (ncpus > rm->nunits_by_type[starpurm_unit_cpu]) { ncpus = rm->nunits_by_type[starpurm_unit_cpu]; } if (ncpus == rm->selected_ncpus) { return starpurm_DRS_SUCCESS; } pthread_mutex_lock(&rm->temporary_ctxs_mutex); if (rm->starpu_in_pause) { starpu_resume(); rm->starpu_in_pause = 0; } int workers_to_remove[_starpurm->nunits]; unsigned nworkers_to_remove = 0; int workers_to_add[_starpurm->nunits]; unsigned nworkers_to_add = 0; for (i=0; inunits; i++) { struct s_starpurm_unit *unit = &rm->units[i]; if (unit->type != starpurm_unit_cpu) continue; if (nworkers_to_add < ncpus) { workers_to_add[nworkers_to_add] = unit->workerid; unit->selected = 1; nworkers_to_add++; hwloc_bitmap_or(rm->selected_cpuset, rm->selected_cpuset, unit->worker_cpuset); } else { workers_to_remove[nworkers_to_remove] = unit->workerid; unit->selected = 0; hwloc_bitmap_andnot(rm->selected_cpuset, rm->selected_cpuset, unit->worker_cpuset); nworkers_to_remove++; } } rm->selected_nworkers = nworkers_to_add; rm->selected_ncpus = nworkers_to_add; if (nworkers_to_add > 0) starpu_sched_ctx_add_workers(workers_to_add, nworkers_to_add, rm->sched_ctx_id); if (nworkers_to_remove > 0) starpu_sched_ctx_remove_workers(workers_to_remove, nworkers_to_remove, rm->sched_ctx_id); #if def_DEBUG starpu_sched_ctx_display_workers(rm->sched_ctx_id, stderr); #endif /* DEBUG */ if (rm->selected_nworkers == 0 && rm->avail_temporary_ctxs == rm->max_temporary_ctxs) { rm->starpu_in_pause = 1; starpu_pause(); } pthread_mutex_unlock(&rm->temporary_ctxs_mutex); return starpurm_DRS_SUCCESS; } /* Initialize rm state for StarPU */ void starpurm_initialize_with_cpuset(const hwloc_cpuset_t initially_owned_cpuset) { int ret; assert(_starpurm == NULL); struct s_starpurm *rm = calloc(1, sizeof(*rm)); pthread_mutex_init(&rm->temporary_ctxs_mutex, NULL); pthread_cond_init(&rm->temporary_ctxs_cond, NULL); rm->state = state_init; /* init hwloc objects */ hwloc_topology_init(&rm->topology); hwloc_topology_load(rm->topology); rm->global_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(rm->global_cpuset); rm->initially_owned_cpuset_mask = hwloc_bitmap_dup(initially_owned_cpuset); rm->all_cpu_workers_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(rm->all_cpu_workers_cpuset); rm->all_opencl_device_workers_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(rm->all_opencl_device_workers_cpuset); rm->all_cuda_device_workers_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(rm->all_cuda_device_workers_cpuset); rm->all_mic_device_workers_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(rm->all_mic_device_workers_cpuset); rm->all_device_workers_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(rm->all_device_workers_cpuset); /* init event list, before StarPU is initialized */ pthread_mutex_init(&rm->event_list_mutex, NULL); pthread_cond_init(&rm->event_list_cond, NULL); pthread_cond_init(&rm->event_processing_cond, NULL); pthread_mutex_lock(&rm->event_list_mutex); rm->event_processing_enabled = 0; rm->event_processing_ended = 0; rm->event_list_head = NULL; rm->event_list_tail = NULL; pthread_mutex_unlock(&rm->event_list_mutex); /* set _starpurm here since StarPU's callbacks may reference it once starpu_init is called */ _starpurm = rm; #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS /* launch event thread */ ret = pthread_create(&rm->event_thread, NULL, event_thread_func, rm); assert(ret == 0); #endif /* init StarPU */ struct starpu_conf starpu_conf; ret = starpu_conf_init(&starpu_conf); assert(ret == 0); #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS starpu_conf.callback_worker_going_to_sleep = callback_worker_going_to_sleep; starpu_conf.callback_worker_waking_up = callback_worker_waking_up; #endif ret = starpu_init(&starpu_conf); assert(ret == 0); /* init any worker objects */ rm->nunits = starpu_worker_get_count_by_type(STARPU_ANY_WORKER); /* init device worker objects */ rm->unit_ntypes = starpurm_unit_ntypes; rm->nunits_by_type = calloc(rm->unit_ntypes, sizeof(*rm->nunits_by_type)); rm->unit_offsets_by_type = calloc(rm->unit_ntypes, sizeof(*rm->unit_offsets_by_type)); const int cpu_nunits = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); rm->nunits_by_type[starpurm_unit_cpu] = cpu_nunits; const int opencl_nunits = starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); rm->nunits_by_type[starpurm_unit_opencl] = opencl_nunits; const int cuda_nunits = starpu_worker_get_count_by_type(STARPU_CUDA_WORKER); rm->nunits_by_type[starpurm_unit_cuda] = cuda_nunits; const int mic_nunits = starpu_worker_get_count_by_type(STARPU_MIC_WORKER); rm->nunits_by_type[starpurm_unit_mic] = mic_nunits; const int nunits = cpu_nunits + opencl_nunits + cuda_nunits + mic_nunits; rm->nunits = nunits; rm->units = calloc(nunits, sizeof(*rm->units)); int unitid = 0; int cpu_workerids[cpu_nunits]; starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, cpu_workerids, cpu_nunits); rm->unit_offsets_by_type[starpurm_unit_cpu] = unitid; unsigned int max_worker_id = 0; int i; for (i = 0; i < cpu_nunits; i++) { rm->units[unitid].id = unitid; rm->units[unitid].type = starpurm_unit_cpu; rm->units[unitid].selected = 1; /* enabled by default */ rm->units[unitid].workerid = cpu_workerids[i]; if (max_worker_id < rm->units[unitid].workerid) { max_worker_id = rm->units[unitid].workerid; } rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid); pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL); hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_cpu_workers_cpuset, rm->all_cpu_workers_cpuset, rm->units[unitid].worker_cpuset);; #ifdef STARPURM_VERBOSE { char * s_unit = NULL; hwloc_bitmap_asprintf(&s_unit, rm->units[unitid].worker_cpuset); fprintf(stderr, "%s: 'cpu', unitid=%d, cpuset=0x%s, workerid=%d\n", __func__, unitid, s_unit, rm->units[unitid].workerid); free(s_unit); } #endif unitid++; } int opencl_workerids[opencl_nunits]; starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, opencl_workerids, opencl_nunits); rm->unit_offsets_by_type[starpurm_unit_opencl] = unitid; for (i = 0; i < opencl_nunits; i++) { rm->units[unitid].id = unitid; rm->units[unitid].type = starpurm_unit_opencl; rm->units[unitid].selected = 1; /* enabled by default */ rm->units[unitid].workerid = opencl_workerids[i]; if (max_worker_id < rm->units[unitid].workerid) { max_worker_id = rm->units[unitid].workerid; } rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid); pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL); hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_opencl_device_workers_cpuset, rm->all_opencl_device_workers_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_device_workers_cpuset, rm->all_device_workers_cpuset, rm->units[unitid].worker_cpuset); unitid++; } int cuda_workerids[opencl_nunits]; starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, cuda_workerids, cuda_nunits); rm->unit_offsets_by_type[starpurm_unit_cuda] = unitid; for (i = 0; i < cuda_nunits; i++) { rm->units[unitid].id = unitid; rm->units[unitid].type = starpurm_unit_cuda; rm->units[unitid].selected = 1; /* enabled by default */ rm->units[unitid].workerid = cuda_workerids[i]; if (max_worker_id < rm->units[unitid].workerid) { max_worker_id = rm->units[unitid].workerid; } rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid); pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL); hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_cuda_device_workers_cpuset, rm->all_cuda_device_workers_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_device_workers_cpuset, rm->all_device_workers_cpuset, rm->units[unitid].worker_cpuset); unitid++; } int mic_workerids[mic_nunits]; starpu_worker_get_ids_by_type(STARPU_MIC_WORKER, mic_workerids, mic_nunits); rm->unit_offsets_by_type[starpurm_unit_mic] = unitid; for (i = 0; i < mic_nunits; i++) { rm->units[unitid].id = unitid; rm->units[unitid].type = starpurm_unit_mic; rm->units[unitid].selected = 1; /* enabled by default */ rm->units[unitid].workerid = mic_workerids[i]; if (max_worker_id < rm->units[unitid].workerid) { max_worker_id = rm->units[unitid].workerid; } rm->units[unitid].worker_cpuset = starpu_worker_get_hwloc_cpuset(rm->units[unitid].workerid); pthread_cond_init(&rm->units[unitid].unit_available_cond, NULL); hwloc_bitmap_or(rm->global_cpuset, rm->global_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_mic_device_workers_cpuset, rm->all_mic_device_workers_cpuset, rm->units[unitid].worker_cpuset); hwloc_bitmap_or(rm->all_device_workers_cpuset, rm->all_device_workers_cpuset, rm->units[unitid].worker_cpuset); unitid++; } rm->max_worker_id = max_worker_id; { int *worker_unit_ids = malloc((max_worker_id+1) * sizeof(*worker_unit_ids)); for (i = 0; i < max_worker_id+1; i++) { worker_unit_ids[i] = -1; } for (i=0; inunits; i++) { worker_unit_ids[rm->units[i].workerid] = i; } rm->worker_unit_ids = worker_unit_ids; } /* create StarPU sched_ctx for RM instance */ { int workerids[rm->nunits]; starpu_worker_get_ids_by_type(STARPU_ANY_WORKER, workerids, rm->nunits); /* TODO: make sched_ctx policy configurable */ rm->sched_ctx_id = starpu_sched_ctx_create(workerids, rm->nunits, "starpurm", STARPU_SCHED_CTX_POLICY_NAME, "eager", 0); #ifdef _DEBUG starpu_sched_ctx_display_workers(rm->sched_ctx_id, stderr); #endif /* DEBUG */ } starpu_sched_ctx_set_context(&rm->sched_ctx_id); /* number selected workers (total) */ rm->selected_nworkers = rm->nunits; /* number of selected CPUs workers */ rm->selected_ncpus = rm->nunits_by_type[starpurm_unit_cpu]; /* cpuset of all currently selected workers */ rm->selected_cpuset = hwloc_bitmap_dup(rm->global_cpuset); if (STARPU_NMAX_SCHED_CTXS > 2) { /* account for main ctx (0) and default rm ctx (1) * TODO: check that no other ctxs are allocated by external codes */ rm->max_temporary_ctxs = STARPU_NMAX_SCHED_CTXS - 2; } else { rm->max_temporary_ctxs = 0; } rm->avail_temporary_ctxs = rm->max_temporary_ctxs; if (rm->selected_nworkers == 0) { rm->starpu_in_pause = 1; starpu_pause(); } else { rm->starpu_in_pause = 0; } #ifdef STARPURM_HAVE_DLB starpurm_dlb_init(rm); #endif pthread_mutex_lock(&rm->event_list_mutex); rm->event_processing_enabled = 1; pthread_cond_broadcast(&rm->event_processing_cond); pthread_mutex_unlock(&rm->event_list_mutex); _starpurm = rm; } void starpurm_initialize() { hwloc_cpuset_t full_cpuset = hwloc_bitmap_alloc_full(); starpurm_initialize_with_cpuset(full_cpuset); hwloc_bitmap_free(full_cpuset); } /* Free rm struct for StarPU */ void starpurm_shutdown(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (rm->starpu_in_pause) { starpu_resume(); rm->starpu_in_pause = 0; } starpu_sched_ctx_delete(rm->sched_ctx_id); #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS _enqueue_exit_event(); #endif starpu_shutdown(); #ifdef STARPURM_HAVE_DLB starpurm_dlb_exit(); #endif hwloc_topology_destroy(rm->topology); #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS pthread_join(rm->event_thread, NULL); #endif assert(rm->event_list_head == NULL); assert(rm->event_list_tail == NULL); pthread_cond_destroy(&rm->event_list_cond); pthread_mutex_destroy(&rm->event_list_mutex); rm->state = state_uninitialized; hwloc_bitmap_free(rm->global_cpuset); hwloc_bitmap_free(rm->all_cpu_workers_cpuset); hwloc_bitmap_free(rm->all_opencl_device_workers_cpuset); hwloc_bitmap_free(rm->all_cuda_device_workers_cpuset); hwloc_bitmap_free(rm->all_mic_device_workers_cpuset); hwloc_bitmap_free(rm->all_device_workers_cpuset); hwloc_bitmap_free(rm->selected_cpuset); hwloc_bitmap_free(rm->initially_owned_cpuset_mask); int i; for (i=0; inunits; i++) { pthread_cond_destroy(&rm->units[i].unit_available_cond); } free(rm->units); rm->units = NULL; free(rm->nunits_by_type); rm->nunits_by_type = NULL; free(rm->unit_offsets_by_type); rm->unit_offsets_by_type = NULL; free(rm); _starpurm = NULL; } void starpurm_spawn_kernel_on_cpus(void *data, void(*f)(void *), void *args, hwloc_cpuset_t cpuset) { (void) data; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; unsigned ctx = _starpurm_temporary_context_alloc(cpuset); starpu_sched_ctx_set_context(&ctx); f(args); starpu_sched_ctx_set_context(&rm->sched_ctx_id); _starpurm_temporary_context_free(ctx); } struct s_starpurm__spawn_args { void(*f)(void *); void *args; void(*cb_f)(void *); void *cb_args; hwloc_cpuset_t cpuset; }; static void *_starpurm_spawn_kernel_thread(void *_spawn_args) { struct s_starpurm__spawn_args *spawn_args = _spawn_args; unsigned ctx = _starpurm_temporary_context_alloc(spawn_args->cpuset); starpu_sched_ctx_set_context(&ctx); spawn_args->f(spawn_args->args); struct s_starpurm *rm = _starpurm; starpu_sched_ctx_set_context(&rm->sched_ctx_id); _starpurm_temporary_context_free(ctx); spawn_args->cb_f(spawn_args->cb_args); hwloc_bitmap_free(spawn_args->cpuset); free(spawn_args); return NULL; } void starpurm_spawn_kernel_on_cpus_callback(void *data, void(*f)(void *), void *args, hwloc_cpuset_t cpuset, void(*cb_f)(void *), void *cb_args) { (void) data; struct s_starpurm__spawn_args *spawn_args = calloc(1, sizeof(*spawn_args)); spawn_args->f = f; spawn_args->args = args; spawn_args->cb_f = cb_f; spawn_args->cb_args = cb_args; spawn_args->cpuset = hwloc_bitmap_dup(cpuset); pthread_attr_t attr; int ret; ret = pthread_attr_init(&attr); assert(ret == 0); ret = pthread_attr_setdetachstate(&attr, 1); assert(ret == 0); pthread_t t; ret = pthread_create(&t, &attr, _starpurm_spawn_kernel_thread, spawn_args); assert(ret == 0); } static void *_starpurm_spawn_kernel_in_default_context_thread(void *_spawn_args) { struct s_starpurm__spawn_args *spawn_args = _spawn_args; struct s_starpurm *rm = _starpurm; starpu_sched_ctx_set_context(&rm->sched_ctx_id); spawn_args->f(spawn_args->args); spawn_args->cb_f(spawn_args->cb_args); free(spawn_args); return NULL; } void starpurm_spawn_kernel_callback(void *data, void(*f)(void *), void *args, void(*cb_f)(void *), void *cb_args) { (void) data; struct s_starpurm__spawn_args *spawn_args = calloc(1, sizeof(*spawn_args)); spawn_args->f = f; spawn_args->args = args; spawn_args->cb_f = cb_f; spawn_args->cb_args = cb_args; pthread_attr_t attr; int ret; ret = pthread_attr_init(&attr); assert(ret == 0); ret = pthread_attr_setdetachstate(&attr, 1); assert(ret == 0); pthread_t t; ret = pthread_create(&t, &attr, _starpurm_spawn_kernel_in_default_context_thread, spawn_args); assert(ret == 0); } hwloc_cpuset_t starpurm_get_unit_cpuset(int unitid) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; assert(unitid >= 0 && unitid < rm->nunits); return hwloc_bitmap_dup(rm->units[unitid].worker_cpuset); } hwloc_cpuset_t starpurm_get_cpu_worker_cpuset(int unit_rank) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; assert(unit_rank >= 0 && unit_rank < rm->nunits_by_type[starpurm_unit_cpu]); return hwloc_bitmap_dup(rm->units[rm->unit_offsets_by_type[starpurm_unit_cpu] + unit_rank].worker_cpuset); } /* Dynamic resource sharing */ starpurm_drs_ret_t starpurm_set_drs_enable(starpurm_drs_desc_t *spd) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; rm->dynamic_resource_sharing = 1; return starpurm_DRS_SUCCESS; } starpurm_drs_ret_t starpurm_set_drs_disable(starpurm_drs_desc_t *spd) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; rm->dynamic_resource_sharing = 0; return starpurm_DRS_SUCCESS; } int starpurm_drs_enabled_p(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return rm->dynamic_resource_sharing; } starpurm_drs_ret_t starpurm_set_max_parallelism(starpurm_drs_desc_t *spd, int ncpus) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (ncpus > rm->nunits_by_type[starpurm_unit_cpu]) { ncpus = rm->nunits_by_type[starpurm_unit_cpu]; } rm->max_ncpus = ncpus; if (rm->selected_ncpus > ncpus) { return _starpurm_set_ncpus(ncpus); } return starpurm_DRS_SUCCESS; } starpurm_drs_ret_t starpurm_callback_set(starpurm_drs_desc_t *spd, starpurm_drs_cbs_t which, starpurm_drs_cb_t callback) { (void)spd; (void)which; (void)callback; /* unimplemented */ assert(0); return starpurm_DRS_PERM; } starpurm_drs_ret_t starpurm_callback_get(starpurm_drs_desc_t *spd, starpurm_drs_cbs_t which, starpurm_drs_cb_t *callback) { (void)spd; (void)which; (void)callback; /* unimplemented */ assert(0); return starpurm_DRS_PERM; } starpurm_drs_ret_t starpurm_assign_cpu_to_starpu(starpurm_drs_desc_t *spd, int cpuid) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; starpurm_drs_ret_t ret = 0; assert(hwloc_bitmap_isset(rm->global_cpuset, cpuid)); if (!hwloc_bitmap_isset(rm->selected_cpuset, cpuid)) { hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_set(temp_cpuset, cpuid); ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); } return ret; } starpurm_drs_ret_t starpurm_assign_cpus_to_starpu(starpurm_drs_desc_t *spd, int ncpus) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; /* add ncpus more CPUs to the CPUs pool */ return _starpurm_set_ncpus(rm->selected_ncpus+ncpus); } starpurm_drs_ret_t starpurm_assign_cpu_mask_to_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_or(temp_cpuset, temp_cpuset, mask); starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_assign_all_cpus_to_starpu(starpurm_drs_desc_t *spd) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; return starpurm_assign_cpus_to_starpu(spd, rm->nunits_by_type[starpurm_unit_cpu]); } starpurm_drs_ret_t starpurm_withdraw_cpu_from_starpu(starpurm_drs_desc_t *spd, int cpuid) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; starpurm_drs_ret_t ret = 0; assert(hwloc_bitmap_isset(rm->global_cpuset, cpuid)); if (hwloc_bitmap_isset(rm->selected_cpuset, cpuid)) { hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_clr(temp_cpuset, cpuid); ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); } return ret; } starpurm_drs_ret_t starpurm_withdraw_cpus_from_starpu(starpurm_drs_desc_t *spd, int ncpus) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; /* add ncpus more CPUs to the CPUs pool */ starpurm_drs_ret_t ret = 0; if (ncpus <= rm->nunits_by_type[starpurm_unit_cpu]) { ret = _starpurm_set_ncpus(rm->nunits_by_type[starpurm_unit_cpu]-ncpus); } else { ret = _starpurm_set_ncpus(0); } return ret; } starpurm_drs_ret_t starpurm_withdraw_cpu_mask_from_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_andnot(temp_cpuset, temp_cpuset, mask); starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_withdraw_all_cpus_from_starpu(starpurm_drs_desc_t *spd) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; return starpurm_withdraw_cpus_from_starpu(spd, rm->nunits_by_type[starpurm_unit_cpu]); } /* --- */ starpurm_drs_ret_t starpurm_lend_cpu(starpurm_drs_desc_t *spd, int cpuid) { return starpurm_assign_cpu_to_starpu(spd, cpuid); } starpurm_drs_ret_t starpurm_lend_cpus(starpurm_drs_desc_t *spd, int ncpus) { return starpurm_assign_cpus_to_starpu(spd, ncpus); } starpurm_drs_ret_t starpurm_lend_cpu_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { return starpurm_assign_cpu_mask_to_starpu(spd, mask); } starpurm_drs_ret_t starpurm_lend(starpurm_drs_desc_t *spd) { return starpurm_assign_all_cpus_to_starpu(spd); } starpurm_drs_ret_t starpurm_reclaim_cpu(starpurm_drs_desc_t *spd, int cpuid) { return starpurm_withdraw_cpu_from_starpu(spd, cpuid); } starpurm_drs_ret_t starpurm_reclaim_cpus(starpurm_drs_desc_t *spd, int ncpus) { return starpurm_withdraw_cpus_from_starpu(spd, ncpus); } starpurm_drs_ret_t starpurm_reclaim_cpu_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { return starpurm_withdraw_cpu_mask_from_starpu(spd, mask); } starpurm_drs_ret_t starpurm_reclaim(starpurm_drs_desc_t *spd) { return starpurm_withdraw_all_cpus_from_starpu(spd); } starpurm_drs_ret_t starpurm_acquire(starpurm_drs_desc_t *spd) { return starpurm_withdraw_all_cpus_from_starpu(spd); } starpurm_drs_ret_t starpurm_acquire_cpu(starpurm_drs_desc_t *spd, int cpuid) { return starpurm_withdraw_cpu_from_starpu(spd, cpuid); } starpurm_drs_ret_t starpurm_acquire_cpus(starpurm_drs_desc_t *spd, int ncpus) { return starpurm_withdraw_cpus_from_starpu(spd, ncpus); } starpurm_drs_ret_t starpurm_acquire_cpu_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { return starpurm_withdraw_cpu_mask_from_starpu(spd, mask); } starpurm_drs_ret_t starpurm_return_all(starpurm_drs_desc_t *spd) { return starpurm_assign_all_cpus_to_starpu(spd); } starpurm_drs_ret_t starpurm_return_cpu(starpurm_drs_desc_t *spd, int cpuid) { return starpurm_assign_cpu_to_starpu(spd, cpuid); } /* Pause/resume */ starpurm_drs_ret_t starpurm_create_block_condition(starpurm_block_cond_t *cond) { /* unimplemented */ assert(0); return starpurm_DRS_PERM; } void starpurm_block_current_task(starpurm_block_cond_t *cond) { /* unimplemented */ assert(0); } void starpurm_signal_block_condition(starpurm_block_cond_t *cond) { /* unimplemented */ assert(0); } void starpurm_register_polling_service(const char *service_name, starpurm_polling_t function, void *data) { /* unimplemented */ assert(0); } void starpurm_unregister_polling_service(const char *service_name, starpurm_polling_t function, void *data) { /* unimplemented */ assert(0); } /* devices */ int starpurm_get_device_type_id(const char *type_str) { if (strcmp(type_str, "cpu") == 0) return starpurm_unit_cpu; if (strcmp(type_str, "opencl") == 0) return starpurm_unit_opencl; if (strcmp(type_str, "cuda") == 0) return starpurm_unit_cuda; if (strcmp(type_str, "mic") == 0) return starpurm_unit_mic; return -1; } const char *starpurm_get_device_type_name(int type_id) { if (type_id == starpurm_unit_cpu) return "cpu"; if (type_id == starpurm_unit_opencl) return "opencl"; if (type_id == starpurm_unit_cuda) return "cuda"; if (type_id == starpurm_unit_mic) return "mic"; return NULL; } int starpurm_get_nb_devices_by_type(int type_id) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return -1; return rm->nunits_by_type[type_id]; } int starpurm_get_device_id(int type_id, int unit_rank) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return -1; if (unit_rank < 0 || unit_rank >= rm->nunits_by_type[type_id]) return -1; return rm->units[rm->unit_offsets_by_type[type_id] + unit_rank].id; } starpurm_drs_ret_t starpurm_assign_device_to_starpu(starpurm_drs_desc_t *spd, int type_id, int unit_rank) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return starpurm_DRS_EINVAL; if (unit_rank < 0 || unit_rank >= rm->nunits_by_type[type_id]) return starpurm_DRS_EINVAL; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_or(temp_cpuset, temp_cpuset, rm->units[rm->unit_offsets_by_type[type_id] + unit_rank].worker_cpuset); starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_assign_devices_to_starpu(starpurm_drs_desc_t *spd, int type_id, int ndevices) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return starpurm_DRS_EINVAL; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); if (ndevices > rm->nunits_by_type[type_id]) { ndevices = rm->nunits_by_type[type_id]; } int i; for (i = 0; i < ndevices; i++) { hwloc_bitmap_or(temp_cpuset, temp_cpuset, rm->units[rm->unit_offsets_by_type[type_id] + i].worker_cpuset); } starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_assign_device_mask_to_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_or(temp_cpuset, temp_cpuset, mask); starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_assign_all_devices_to_starpu(starpurm_drs_desc_t *spd, int type_id) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return starpurm_DRS_EINVAL; return starpurm_assign_devices_to_starpu(spd, type_id, rm->nunits_by_type[type_id]); } starpurm_drs_ret_t starpurm_withdraw_device_from_starpu(starpurm_drs_desc_t *spd, int type_id, int unit_rank) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return starpurm_DRS_EINVAL; if (unit_rank < 0 || unit_rank >= rm->nunits_by_type[type_id]) return starpurm_DRS_EINVAL; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_andnot(temp_cpuset, temp_cpuset, rm->units[rm->unit_offsets_by_type[type_id] + unit_rank].worker_cpuset); starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_withdraw_devices_from_starpu(starpurm_drs_desc_t *spd, int type_id, int ndevices) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return starpurm_DRS_EINVAL; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); if (ndevices > rm->nunits_by_type[type_id]) { ndevices = rm->nunits_by_type[type_id]; } int i; for (i = 0; i < ndevices; i++) { hwloc_bitmap_andnot(temp_cpuset, temp_cpuset, rm->units[rm->unit_offsets_by_type[type_id] + i].worker_cpuset); } starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_withdraw_device_mask_from_starpu(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { (void)spd; assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; hwloc_cpuset_t temp_cpuset = hwloc_bitmap_dup(rm->selected_cpuset); hwloc_bitmap_andnot(temp_cpuset, temp_cpuset, mask); starpurm_drs_ret_t ret = _starpurm_update_cpuset(temp_cpuset); hwloc_bitmap_free(temp_cpuset); return ret; } starpurm_drs_ret_t starpurm_withdraw_all_devices_from_starpu(starpurm_drs_desc_t *spd, int type_id) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; if (!rm->dynamic_resource_sharing) return starpurm_DRS_DISABLD; if (type_id < 0 || type_id >= starpurm_unit_ntypes) return starpurm_DRS_EINVAL; return starpurm_withdraw_devices_from_starpu(spd, type_id, rm->nunits_by_type[type_id]); } /* --- */ starpurm_drs_ret_t starpurm_lend_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank) { return starpurm_assign_device_to_starpu(spd, type_id, unit_rank); } starpurm_drs_ret_t starpurm_lend_devices(starpurm_drs_desc_t *spd, int type_id, int ndevices) { return starpurm_assign_devices_to_starpu(spd, type_id, ndevices); } starpurm_drs_ret_t starpurm_lend_device_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { return starpurm_assign_device_mask_to_starpu(spd, mask); } starpurm_drs_ret_t starpurm_lend_all_devices(starpurm_drs_desc_t *spd, int type_id) { return starpurm_assign_all_devices_to_starpu(spd, type_id); } starpurm_drs_ret_t starpurm_reclaim_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank) { return starpurm_withdraw_device_from_starpu(spd, type_id, unit_rank); } starpurm_drs_ret_t starpurm_reclaim_devices(starpurm_drs_desc_t *spd, int type_id, int ndevices) { return starpurm_withdraw_devices_from_starpu(spd, type_id, ndevices); } starpurm_drs_ret_t starpurm_reclaim_device_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { return starpurm_withdraw_device_mask_from_starpu(spd, mask); } starpurm_drs_ret_t starpurm_reclaim_all_devices(starpurm_drs_desc_t *spd, int type_id) { return starpurm_withdraw_all_devices_from_starpu(spd, type_id); } starpurm_drs_ret_t starpurm_acquire_all_devices(starpurm_drs_desc_t *spd, int type_id) { return starpurm_withdraw_all_devices_from_starpu(spd, type_id); } starpurm_drs_ret_t starpurm_acquire_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank) { return starpurm_withdraw_device_from_starpu(spd, type_id, unit_rank); } starpurm_drs_ret_t starpurm_acquire_devices(starpurm_drs_desc_t *spd, int type_id, int ndevices) { return starpurm_withdraw_devices_from_starpu(spd, type_id, ndevices); } starpurm_drs_ret_t starpurm_acquire_device_mask(starpurm_drs_desc_t *spd, const hwloc_cpuset_t mask) { return starpurm_withdraw_device_mask_from_starpu(spd, mask); } starpurm_drs_ret_t starpurm_return_all_devices(starpurm_drs_desc_t *spd, int type_id) { return starpurm_assign_all_devices_to_starpu(spd, type_id); } starpurm_drs_ret_t starpurm_return_device(starpurm_drs_desc_t *spd, int type_id, int unit_rank) { return starpurm_assign_device_to_starpu(spd, type_id, unit_rank); } /* cpusets */ hwloc_cpuset_t starpurm_get_device_worker_cpuset(int type_id, int unit_rank) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; assert(type_id >= 0 && type_id < starpurm_unit_ntypes); assert(unit_rank >= 0 && unit_rank < rm->nunits_by_type[type_id]); return hwloc_bitmap_dup(rm->units[rm->unit_offsets_by_type[type_id] + unit_rank].worker_cpuset); } hwloc_cpuset_t starpurm_get_global_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->global_cpuset); } hwloc_cpuset_t starpurm_get_selected_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->selected_cpuset); } hwloc_cpuset_t starpurm_get_all_cpu_workers_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->all_cpu_workers_cpuset); } static hwloc_cpuset_t starpurm_get_all_opencl_device_workers_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->all_opencl_device_workers_cpuset); } static hwloc_cpuset_t starpurm_get_all_cuda_device_workers_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->all_cuda_device_workers_cpuset); } static hwloc_cpuset_t starpurm_get_all_mic_device_workers_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->all_mic_device_workers_cpuset); } hwloc_cpuset_t starpurm_get_all_device_workers_cpuset(void) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; return hwloc_bitmap_dup(rm->all_device_workers_cpuset); } hwloc_cpuset_t starpurm_get_all_device_workers_cpuset_by_type(int typeid) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); assert(typeid != starpurm_unit_cpu); if (typeid == starpurm_unit_opencl) return starpurm_get_all_opencl_device_workers_cpuset(); if (typeid == starpurm_unit_cuda) return starpurm_get_all_cuda_device_workers_cpuset(); if (typeid == starpurm_unit_mic) return starpurm_get_all_mic_device_workers_cpuset(); hwloc_cpuset_t empty_bitmap = hwloc_bitmap_alloc(); hwloc_bitmap_zero(empty_bitmap); return empty_bitmap; } starpu-1.3.9+dfsg/starpurm/src/starpurm_dlb.c000066400000000000000000000275751413463044200213100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* CPUSET routines */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #ifdef HAVE_HWLOC_GLIBC_SCHED_H #include #endif #include #include #include #include #ifndef STARPURM_HAVE_DLB #error "STARPU-RM DLB support not enabled" #endif #include #include /* * DLB interfacing */ static dlb_handler_t dlb_handle; static cpu_set_t starpurm_process_mask; static hwloc_cpuset_t starpurm_process_cpuset; static struct s_starpurm *_starpurm = NULL; static pthread_mutex_t dlb_handle_mutex = PTHREAD_MUTEX_INITIALIZER; static int glibc_cpuid_to_unitid[CPU_SETSIZE]; static int *unitid_to_glibc_cpuid = NULL; static const char * _dlb_error_str(int error_code) { const char *s = NULL; switch (error_code) { case DLB_NOUPDT: s="DLB_NOUPDT"; break; case DLB_NOTED: s="DLB_NOTED"; break; case DLB_SUCCESS: s="DLB_SUCCESS"; break; case DLB_ERR_UNKNOWN: s="DLB_ERR_UNKNOWN"; break; case DLB_ERR_NOINIT: s="DLB_ERR_NOINIT"; break; case DLB_ERR_INIT: s="DLB_ERR_INIT"; break; case DLB_ERR_DISBLD: s="DLB_ERR_DISBLD"; break; case DLB_ERR_NOSHMEM: s="DLB_ERR_NOSHMEM"; break; case DLB_ERR_NOPROC: s="DLB_ERR_NOPROC"; break; case DLB_ERR_PDIRTY: s="DLB_ERR_PDIRTY"; break; case DLB_ERR_PERM: s="DLB_ERR_PERM"; break; case DLB_ERR_TIMEOUT: s="DLB_ERR_TIMEOUT"; break; case DLB_ERR_NOCBK: s="DLB_ERR_NOCBK"; break; case DLB_ERR_NOENT: s="DLB_ERR_NOENT"; break; case DLB_ERR_NOCOMP: s="DLB_ERR_NOCOMP"; break; case DLB_ERR_REQST: s="DLB_ERR_REQST"; break; case DLB_ERR_NOMEM: s="DLB_ERR_NOMEM"; break; case DLB_ERR_NOPOL: s="DLB_ERR_NOPOL"; break; default: s = ""; break; } return s; } #define _dlb_check(s,r) do { if ((r) != DLB_SUCCESS) {fprintf(stderr, "%s:%d, %s - DLB call '%s' %s %d (%s)\n",__FILE__, __LINE__, __func__, (s), (r)>0?"returned warning code":"failed with error code", (r), _dlb_error_str((r))); assert(dlb_ret >= DLB_SUCCESS); }} while (0) #if 0 /* unused for now */ static void _glibc_cpuset_to_hwloc_cpuset(const cpu_set_t *glibc_cpuset, hwloc_cpuset_t *hwloc_cpuset) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; int status = hwloc_cpuset_from_glibc_sched_affinity(rm->topology, *hwloc_cpuset, glibc_cpuset, sizeof(cpu_set_t)); assert(status == 0); } #endif static void _hwloc_cpuset_to_glibc_cpuset(const hwloc_cpuset_t hwloc_cpuset, cpu_set_t *glibc_cpuset) { assert(_starpurm != NULL); assert(_starpurm->state != state_uninitialized); struct s_starpurm *rm = _starpurm; int status = hwloc_cpuset_to_glibc_sched_affinity(rm->topology, hwloc_cpuset, glibc_cpuset, sizeof(cpu_set_t)); assert(status == 0); } int starpurm_dlb_notify_starpu_worker_mask_going_to_sleep(const hwloc_cpuset_t hwloc_workers_cpuset) { int status = 0; pthread_mutex_lock(&dlb_handle_mutex); if (dlb_handle != NULL) { hwloc_cpuset_t hwloc_to_lend_cpuset = hwloc_bitmap_alloc(); hwloc_cpuset_t hwloc_to_return_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(hwloc_to_lend_cpuset); hwloc_bitmap_zero(hwloc_to_return_cpuset); hwloc_bitmap_and(hwloc_to_lend_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset); hwloc_bitmap_andnot(hwloc_to_return_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset); #ifdef STARPURM_DLB_VERBOSE { char * s_to_lend = NULL; char * s_to_return = NULL; hwloc_bitmap_asprintf(&s_to_lend, hwloc_to_lend_cpuset); hwloc_bitmap_asprintf(&s_to_return, hwloc_to_return_cpuset); fprintf(stderr, "%s: to_lend='%s', to_return='%s'\n", __func__, s_to_lend, s_to_return); free(s_to_lend); free(s_to_return); } #endif if (!hwloc_bitmap_iszero(hwloc_to_lend_cpuset)) { cpu_set_t glibc_to_lend_cpuset; CPU_ZERO(&glibc_to_lend_cpuset); _hwloc_cpuset_to_glibc_cpuset(hwloc_to_lend_cpuset, &glibc_to_lend_cpuset); int dlb_ret = DLB_LendCpuMask_sp(dlb_handle, &glibc_to_lend_cpuset); _dlb_check("DLB_LendCpuMask_sp", dlb_ret); } if (!hwloc_bitmap_iszero(hwloc_to_return_cpuset)) { cpu_set_t glibc_to_return_cpuset; CPU_ZERO(&glibc_to_return_cpuset); _hwloc_cpuset_to_glibc_cpuset(hwloc_to_return_cpuset, &glibc_to_return_cpuset); /* Use DLB_Lend for returning borrowed units. DLB_Return seems to require that * a reclaim has previously been emitted by the unit owning runtime system */ #if 0 int dlb_ret = DLB_ReturnCpuMask_sp(dlb_handle, &glibc_to_return_cpuset); _dlb_check("DLB_ReturnCpuMask_sp", dlb_ret); #else int dlb_ret = DLB_LendCpuMask_sp(dlb_handle, &glibc_to_return_cpuset); _dlb_check("DLB_LendCpuMask_sp", dlb_ret); #endif } hwloc_bitmap_free(hwloc_to_lend_cpuset); hwloc_bitmap_free(hwloc_to_return_cpuset); status = 1; } pthread_mutex_unlock(&dlb_handle_mutex); return status; } int starpurm_dlb_notify_starpu_worker_mask_waking_up(const hwloc_cpuset_t hwloc_workers_cpuset) { int status = 0; pthread_mutex_lock(&dlb_handle_mutex); if (dlb_handle != NULL) { hwloc_cpuset_t hwloc_to_reclaim_cpuset = hwloc_bitmap_alloc(); hwloc_cpuset_t hwloc_to_borrow_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(hwloc_to_reclaim_cpuset); hwloc_bitmap_zero(hwloc_to_borrow_cpuset); hwloc_bitmap_and(hwloc_to_reclaim_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset); hwloc_bitmap_andnot(hwloc_to_borrow_cpuset, hwloc_workers_cpuset, starpurm_process_cpuset); #ifdef STARPURM_DLB_VERBOSE { char * s_to_reclaim = NULL; char * s_to_borrow = NULL; hwloc_bitmap_asprintf(&s_to_reclaim, hwloc_to_reclaim_cpuset); hwloc_bitmap_asprintf(&s_to_borrow, hwloc_to_borrow_cpuset); fprintf(stderr, "%s: to_reclaim='%s', to_borrow='%s'\n", __func__, s_to_reclaim, s_to_borrow); free(s_to_reclaim); free(s_to_borrow); } #endif if (!hwloc_bitmap_iszero(hwloc_to_reclaim_cpuset)) { cpu_set_t glibc_to_reclaim_cpuset; CPU_ZERO(&glibc_to_reclaim_cpuset); _hwloc_cpuset_to_glibc_cpuset(hwloc_to_reclaim_cpuset, &glibc_to_reclaim_cpuset); int dlb_ret = DLB_ReclaimCpuMask_sp(dlb_handle, &glibc_to_reclaim_cpuset); _dlb_check("DLB_ReclaimCpuMask_sp", dlb_ret); } if (!hwloc_bitmap_iszero(hwloc_to_borrow_cpuset)) { cpu_set_t glibc_to_borrow_cpuset; CPU_ZERO(&glibc_to_borrow_cpuset); _hwloc_cpuset_to_glibc_cpuset(hwloc_to_borrow_cpuset, &glibc_to_borrow_cpuset); int dlb_ret = DLB_BorrowCpuMask_sp(dlb_handle, &glibc_to_borrow_cpuset); _dlb_check("DLB_BorrowCpuMask_sp", dlb_ret); } hwloc_bitmap_free(hwloc_to_reclaim_cpuset); hwloc_bitmap_free(hwloc_to_borrow_cpuset); status = 1; } pthread_mutex_unlock(&dlb_handle_mutex); return status; } #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS #ifdef STARPURM_HAVE_DLB_CALLBACK_ARG static void _dlb_callback_enable_cpu(int cpuid, void *arg) #else static void _dlb_callback_enable_cpu(int cpuid) #endif { #ifdef STARPURM_HAVE_DLB_CALLBACK_ARG (void) arg; #endif int unitid = glibc_cpuid_to_unitid[cpuid]; #ifdef STARPURM_DLB_VERBOSE fprintf(stderr, "%s: cpuid=%d, unitid=%d\n", __func__, cpuid, unitid); #endif if (unitid != -1) { starpurm_enqueue_event_cpu_unit_available(unitid); } } #ifdef STARPURM_HAVE_DLB_CALLBACK_ARG static void _dlb_callback_disable_cpu(int cpuid, void *arg) #else static void _dlb_callback_disable_cpu(int cpuid) #endif { #ifdef STARPURM_HAVE_DLB_CALLBACK_ARG (void) arg; #endif int unitid = glibc_cpuid_to_unitid[cpuid]; #ifdef STARPURM_DLB_VERBOSE fprintf(stderr, "%s: cpuid=%d, unitid=%d\n", __func__, cpuid, unitid); #endif if (unitid != -1) { /* nothing */ } } #endif void starpurm_dlb_init(struct s_starpurm *rm) { _starpurm = rm; { int unitid; int cpuid; unitid_to_glibc_cpuid = malloc(rm->nunits * sizeof(*unitid_to_glibc_cpuid)); for (cpuid = 0; cpuidnunits; unitid++) { hwloc_cpuset_t unit_cpuset = starpurm_get_unit_cpuset(unitid); cpu_set_t unit_mask; CPU_ZERO(&unit_mask); _hwloc_cpuset_to_glibc_cpuset(unit_cpuset, &unit_mask); unitid_to_glibc_cpuid[unitid] = -1; for (cpuid = 0; cpuidselected_cpuset); hwloc_bitmap_and(starpurm_process_cpuset, starpurm_process_cpuset, rm->initially_owned_cpuset_mask); _hwloc_cpuset_to_glibc_cpuset(starpurm_process_cpuset, &starpurm_process_mask); #ifdef STARPURM_DLB_VERBOSE { char * s_reachable = NULL; char * s_initially_owned = NULL; hwloc_bitmap_asprintf(&s_reachable, rm->selected_cpuset); hwloc_bitmap_asprintf(&s_initially_owned, starpurm_process_cpuset); fprintf(stderr, "%s: StarPU reachable units='%s', StarPU initially owned units='%s'\n", __func__, s_reachable, s_initially_owned); free(s_reachable); free(s_initially_owned); } #endif pthread_mutex_lock(&dlb_handle_mutex); /* TODO: autodetect DLB policy according to DLB version */ #if 1 dlb_handle = DLB_Init_sp(0, &starpurm_process_mask, "--lewi=yes --drom=no --mode=async"); #else dlb_handle = DLB_Init_sp(0, &starpurm_process_mask, "--policy=new --drom=no --mode=async"); #endif /* cpu-based callbacks are mutually exclusive with mask-based callbacks, * we only register cpu-based callbacks */ int dlb_ret; #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS #ifdef STARPURM_HAVE_DLB_CALLBACK_ARG dlb_ret = DLB_CallbackSet_sp(dlb_handle, dlb_callback_disable_cpu, (dlb_callback_t)_dlb_callback_disable_cpu, NULL); _dlb_check("DLB_CallbackSet_sp", dlb_ret); dlb_ret = DLB_CallbackSet_sp(dlb_handle, dlb_callback_enable_cpu, (dlb_callback_t)_dlb_callback_enable_cpu, NULL); _dlb_check("DLB_CallbackSet_sp", dlb_ret); #else dlb_ret = DLB_CallbackSet_sp(dlb_handle, dlb_callback_disable_cpu, (dlb_callback_t)_dlb_callback_disable_cpu); _dlb_check("DLB_CallbackSet_sp", dlb_ret); dlb_ret = DLB_CallbackSet_sp(dlb_handle, dlb_callback_enable_cpu, (dlb_callback_t)_dlb_callback_enable_cpu); _dlb_check("DLB_CallbackSet_sp", dlb_ret); #endif #endif dlb_ret = DLB_Enable_sp(dlb_handle); _dlb_check("DLB_Enable_sp", dlb_ret); pthread_mutex_unlock(&dlb_handle_mutex); } void starpurm_dlb_exit(void) { pthread_mutex_lock(&dlb_handle_mutex); dlb_handler_t dlb_handle_save = dlb_handle; dlb_handle = 0; pthread_mutex_unlock(&dlb_handle_mutex); /* lend every resources that StarPU may still have */ DLB_Lend_sp(dlb_handle_save); DLB_Return_sp(dlb_handle_save); pthread_mutex_lock(&dlb_handle_mutex); DLB_Disable_sp(dlb_handle_save); DLB_Finalize_sp(dlb_handle_save); hwloc_bitmap_free(starpurm_process_cpuset); free(unitid_to_glibc_cpuid); pthread_mutex_unlock(&dlb_handle_mutex); } starpu-1.3.9+dfsg/starpurm/src/starpurm_private.h000066400000000000000000000075411413463044200222150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __STARPURM_PRIVATE_H #define __STARPURM_PRIVATE_H /** @file */ enum e_state { state_uninitialized = 0, state_init }; enum e_starpurm_unit_type { starpurm_unit_cpu = 0, starpurm_unit_opencl = 1, starpurm_unit_cuda = 2, starpurm_unit_mic = 3, starpurm_unit_ntypes = 4 }; struct s_starpurm { /** Machine topology as detected by hwloc. */ hwloc_topology_t topology; /** Current upper bound on the number of CPU cores selectable for computing with the runtime system. */ unsigned max_ncpus; /** Number of currently selected CPU workers */ unsigned selected_ncpus; /** Number of currently selected workers (CPU+devices) */ unsigned selected_nworkers; /** Initialization state of the RM instance. */ int state; /** Boolean indicating the state of the dynamic resource sharing layer. * * !0 indicates that dynamic resource sharing is enabled. * 0 indicates that dynamic resource sharing is disabled. */ int dynamic_resource_sharing; /** Id of the StarPU's sched_ctx used by the RM instance. */ unsigned sched_ctx_id; /** Number of unit types supported by this RM instance. */ int unit_ntypes; /** Number of unitss available for each type. */ int *nunits_by_type; /** Number of units. */ int nunits; /** Offset of unit numbering for each type. */ int *unit_offsets_by_type; /** Array of units. */ struct s_starpurm_unit *units; /** Cpuset of all the StarPU's workers (CPU+devices. */ hwloc_cpuset_t global_cpuset; /** Cpuset of all StarPU CPU workers. */ hwloc_cpuset_t all_cpu_workers_cpuset; /** Cpuset of all StarPU OpenCL workers. */ hwloc_cpuset_t all_opencl_device_workers_cpuset; /** Cpuset of all StarPU CUDA workers. */ hwloc_cpuset_t all_cuda_device_workers_cpuset; /** Cpuset of all StarPU MIC workers. */ hwloc_cpuset_t all_mic_device_workers_cpuset; /** Cpuset of all StarPU device workers. */ hwloc_cpuset_t all_device_workers_cpuset; /** Cpuset of all selected workers (CPU+devices). */ hwloc_cpuset_t selected_cpuset; /** Cpuset mask of initially owned cpuset or full if not used. */ hwloc_cpuset_t initially_owned_cpuset_mask; /** maximum value among worker ids */ int max_worker_id; /** worker id to unit id table */ int *worker_unit_ids; /** Temporary contexts accounting. */ unsigned int max_temporary_ctxs; unsigned int avail_temporary_ctxs; pthread_mutex_t temporary_ctxs_mutex; pthread_cond_t temporary_ctxs_cond; /** Global StarPU pause state */ int starpu_in_pause; /** Event list. */ pthread_t event_thread; pthread_mutex_t event_list_mutex; pthread_cond_t event_list_cond; pthread_cond_t event_processing_cond; int event_processing_enabled; int event_processing_ended; struct s_starpurm_event *event_list_head; struct s_starpurm_event *event_list_tail; }; #ifdef STARPURM_HAVE_DLB void starpurm_dlb_init(struct s_starpurm *rm); void starpurm_dlb_exit(void); int starpurm_dlb_notify_starpu_worker_mask_going_to_sleep(const hwloc_cpuset_t hwloc_workers_cpuset); int starpurm_dlb_notify_starpu_worker_mask_waking_up(const hwloc_cpuset_t hwloc_workers_cpuset); #ifdef STARPURM_STARPU_HAVE_WORKER_CALLBACKS void starpurm_enqueue_event_cpu_unit_available(int cpuid); #endif #endif #endif /* __STARPURM_PRIVATE_H */ starpu-1.3.9+dfsg/starpurm/starpurm-1.3.pc.in000066400000000000000000000020601413463044200207420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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@ Name: starpurm Description: resource management layer on top of StarPU Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpurm/@STARPU_EFFECTIVE_VERSION@ @DLB_CFLAGS@ Libs: -L${libdir} -lstarpurm-@STARPU_EFFECTIVE_VERSION@ @DLB_LIBS@ Libs.private: @LDFLAGS@ @LIBS@ Requires: starpu-1.3 hwloc starpu-1.3.9+dfsg/tests/000077500000000000000000000000001413463044200151245ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/Makefile.am000066400000000000000000000731111413463044200171630ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CXXFLAGS = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(GLOBAL_AM_CXXFLAGS) -Wno-unused LDADD = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_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 \ main/increment_codelet.h \ overlap/overlap.sh \ datawizard/scal.h \ datawizard/mpi_like.h \ regression/profiles.in \ regression/regression.sh.in \ regression/profiles.build.only.in \ microbenchs/tasks_data_overhead.sh \ microbenchs/sync_tasks_data_overhead.sh \ microbenchs/async_tasks_data_overhead.sh \ microbenchs/tasks_size_overhead.sh \ microbenchs/tasks_size_overhead_sched.sh \ microbenchs/tasks_size_overhead_scheds.sh \ microbenchs/tasks_size_overhead.gp \ microbenchs/parallel_dependent_homogeneous_tasks_data.sh \ microbenchs/parallel_independent_heterogeneous_tasks_data.sh \ microbenchs/parallel_independent_heterogeneous_tasks.sh \ microbenchs/parallel_independent_homogeneous_tasks_data.sh \ microbenchs/parallel_independent_homogeneous_tasks.sh \ microbenchs/bandwidth_scheds.sh \ 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/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 \ model-checking/platform.xml \ model-checking/prio_list.sh \ model-checking/barrier.sh \ model-checking/starpu-mc.sh.in CLEANFILES = \ *.gcno *.gcda *.linkinfo core starpu_idle_microsec.log *.mod *.png *.output tasks.rec perfs.rec */perfs.rec */*/perfs.rec perfs2.rec bandwidth-*.dat bandwidth.gp bandwidth.eps bandwidth.svg BUILT_SOURCES = SUBDIRS = examplebindir = $(libdir)/starpu/examples if STARPU_USE_OPENCL nobase_STARPU_OPENCL_DATA_DATA = endif if STARPU_USE_CUDA if STARPU_COVERITY include $(top_srcdir)/starpu-mynvcc.mk else NVCCFLAGS += --compiler-options -fno-strict-aliasing $(AM_CPPFLAGS) -I$(top_builddir)/include $(HWLOC_CFLAGS) $(SIMGRID_CFLAGS) .cu.cubin: $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) .cu.o: $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) endif endif testbindir = $(libdir)/starpu/tests ##################################### # What to install and what to check # ##################################### noinst_PROGRAMS = if !STARPU_HAVE_WINDOWS ## test loader program if !STARPU_CROSS_COMPILING LOADER = loader LOADER_BIN = $(abs_top_builddir)/tests/$(LOADER) noinst_PROGRAMS += loader else LOADER = LOADER_BIN = $(top_builddir)/tests/loader-cross.sh endif if STARPU_USE_MPI_MASTER_SLAVE LOADER_BIN2 = $(MPI_LAUNCHER) $(LOADER_BIN) else LOADER_BIN2 = $(LOADER_BIN) endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN2) else TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN2) endif endif TESTS = $(SHELL_TESTS) $(myPROGRAMS) SHELL_TESTS = if STARPU_COVERAGE_ENABLED SHELL_TESTS += coverage/coverage.sh endif XFAIL_TESTS = \ errorcheck/invalid_blocking_calls myPROGRAMS = myPROGRAMS += \ main/callback \ main/bind \ 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/deps \ datawizard/user_interaction_implicit \ datawizard/interfaces/copy_interfaces \ datawizard/numa_overflow \ datawizard/locality \ datawizard/variable_size \ 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 \ sched_ctx/sched_ctx_list \ sched_ctx/sched_ctx_policy_data \ 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/task_03 \ openmp/taskloop \ openmp/taskwait_01 \ openmp/taskgroup_01 \ openmp/taskgroup_02 \ openmp/array_slice_01 \ openmp/cuda_task_01 \ perfmodels/value_nan if STARPU_SIMGRID myPROGRAMS += \ datawizard/simgrid-locality endif if !STARPU_SIMGRID myPROGRAMS += \ main/deprecated_func \ main/driver_api/init_run_deinit \ main/driver_api/run_driver \ main/deploop \ main/display_binding \ 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/insert_task_where \ main/job \ 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/subgraph_repeat_regenerate_tag_cycle \ main/empty_task_sync_point \ main/empty_task_sync_point_tasks \ main/tag_wait_api \ main/tag_get_task \ 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 \ main/hwloc_cpuset \ main/task_end_dep \ datawizard/acquire_cb_insert \ datawizard/acquire_release \ datawizard/acquire_release2 \ datawizard/acquire_try \ datawizard/bcsr \ datawizard/cache \ datawizard/commute \ datawizard/commute2 \ datawizard/copy \ datawizard/data_implicit_deps \ datawizard/data_lookup \ datawizard/scratch \ datawizard/scratch_reuse \ 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/vector_interface \ datawizard/interfaces/void/void_interface \ datawizard/in_place_partition \ datawizard/partition_dep \ datawizard/partition_lazy \ datawizard/partition_init \ 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/partitioned_initialization \ datawizard/partitioned_acquire \ datawizard/temporary_partition_implicit \ datawizard/redux_acquire \ disk/disk_copy \ disk/disk_copy_unpack \ disk/disk_copy_to_disk \ disk/disk_compute \ disk/disk_pack \ disk/mem_reclaim \ errorcheck/invalid_blocking_calls \ errorcheck/workers_cpuid \ 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 \ microbenchs/bandwidth \ overlap/gpu_concurrency \ parallel_tasks/explicit_combined_worker \ parallel_tasks/parallel_kernels \ parallel_tasks/parallel_kernels_trivial \ 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 \ sched_ctx/sched_ctx_hierarchy endif MICROBENCHS = \ microbenchs/parallel_independent_homogeneous_tasks \ microbenchs/parallel_independent_heterogeneous_tasks \ microbenchs/parallel_independent_homogeneous_tasks_data \ microbenchs/parallel_independent_heterogeneous_tasks_data \ microbenchs/parallel_redux_homogeneous_tasks_data \ microbenchs/parallel_redux_heterogeneous_tasks_data \ microbenchs/parallel_dependent_homogeneous_tasks_data if STARPU_HAVE_FC if !STARPU_SANITIZE if !STARPU_SIMGRID myPROGRAMS += \ fortran90/init_01 endif endif endif if !STARPU_SIMGRID if STARPU_LONG_CHECK myPROGRAMS += \ main/tag_task_data_deps \ datawizard/reclaim endif endif examplebin_PROGRAMS = \ microbenchs/async_tasks_overhead \ microbenchs/sync_tasks_overhead \ microbenchs/tasks_overhead \ microbenchs/tasks_size_overhead \ microbenchs/local_pingpong examplebin_SCRIPTS = \ microbenchs/tasks_data_overhead.sh \ microbenchs/sync_tasks_data_overhead.sh \ microbenchs/async_tasks_data_overhead.sh \ microbenchs/tasks_size_overhead.gp \ microbenchs/tasks_size_overhead.sh if !STARPU_SIMGRID if !STARPU_USE_MPI_MASTER_SLAVE examplebin_PROGRAMS += \ microbenchs/bandwidth SHELL_TESTS += \ microbenchs/tasks_data_overhead.sh \ microbenchs/sync_tasks_data_overhead.sh \ microbenchs/async_tasks_data_overhead.sh \ microbenchs/tasks_size_overhead_scheds.sh endif endif if STARPU_HAVE_WINDOWS check_PROGRAMS = $(myPROGRAMS) else check_PROGRAMS = $(LOADER) $(myPROGRAMS) endif noinst_PROGRAMS += $(myPROGRAMS) noinst_PROGRAMS += $(MICROBENCHS) if STARPU_SIMGRID SHELL_TESTS += $(MICROBENCHS:=.sh) endif if !STARPU_USE_MPI_MASTER_SLAVE SHELL_TESTS += \ datawizard/locality.sh \ microbenchs/bandwidth_scheds.sh \ overlap/overlap.sh endif ################################ # Simgrid Model Checking tests # ################################ if STARPU_SIMGRID_MC model_checking_prio_list_LDADD = model_checking_prio_list_LDFLAGS = noinst_PROGRAMS += model-checking/prio_list if !STARPU_QUICK_CHECK SHELL_TESTS += model-checking/prio_list.sh endif model_checking_starpu_barrier_LDADD = model_checking_starpu_barrier_LDFLAGS = noinst_PROGRAMS += model-checking/starpu_barrier if !STARPU_QUICK_CHECK #SHELL_TESTS += model-checking/barrier.sh endif endif ####################### # 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_insert_task_where_SOURCES = \ main/insert_task_where.c if STARPU_USE_CUDA main_insert_task_where_SOURCES += \ main/increment.cu endif main_subgraph_repeat_SOURCES = \ main/subgraph_repeat.c \ main/increment_codelet.c if STARPU_USE_CUDA main_subgraph_repeat_SOURCES += \ main/increment.cu endif main_subgraph_repeat_tag_SOURCES = \ main/subgraph_repeat_tag.c \ main/increment_codelet.c if STARPU_USE_CUDA main_subgraph_repeat_tag_SOURCES += \ main/increment.cu endif main_subgraph_repeat_regenerate_SOURCES = \ main/subgraph_repeat_regenerate.c \ main/increment_codelet.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 \ main/increment_codelet.c if STARPU_USE_CUDA main_subgraph_repeat_regenerate_tag_SOURCES += \ main/increment.cu endif main_subgraph_repeat_regenerate_tag_cycle_SOURCES = \ main/subgraph_repeat_regenerate_tag_cycle.c \ main/increment_codelet.c if STARPU_USE_CUDA main_subgraph_repeat_regenerate_tag_cycle_SOURCES += \ main/increment.cu endif sched_ctx_sched_ctx_list_SOURCES = \ sched_ctx/sched_ctx_list.c sched_ctx_sched_ctx_policy_data_SOURCES = \ sched_ctx/sched_ctx_policy_data.c sched_ctx_sched_ctx_hierarchy_SOURCES = \ sched_ctx/sched_ctx_hierarchy.c 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_task_03_SOURCES = \ openmp/task_03.c openmp_taskloop_SOURCES = \ openmp/taskloop.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_vector_interface_SOURCES = \ datawizard/interfaces/vector/vector_interface.c \ datawizard/interfaces/test_interfaces.c if STARPU_USE_CUDA datawizard_interfaces_vector_vector_interface_SOURCES += \ datawizard/interfaces/vector/vector_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_vector_vector_interface_SOURCES += \ datawizard/interfaces/vector/vector_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/vector/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.3.9+dfsg/tests/Makefile.in000066400000000000000000035400461413463044200172050ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@am__append_1 = --compiler-options -fno-strict-aliasing $(AM_CPPFLAGS) -I$(top_builddir)/include $(HWLOC_CFLAGS) $(SIMGRID_CFLAGS) noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_6) $(am__EXEEXT_8) \ $(am__EXEEXT_9) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__append_2 = loader TESTS = $(am__EXEEXT_12) $(am__EXEEXT_6) @STARPU_COVERAGE_ENABLED_TRUE@am__append_3 = coverage/coverage.sh XFAIL_TESTS = errorcheck/invalid_blocking_calls$(EXEEXT) @STARPU_SIMGRID_TRUE@am__append_4 = \ @STARPU_SIMGRID_TRUE@ datawizard/simgrid-locality @STARPU_SIMGRID_FALSE@am__append_5 = \ @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/display_binding \ @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/insert_task_where \ @STARPU_SIMGRID_FALSE@ main/job \ @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/subgraph_repeat_regenerate_tag_cycle \ @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/tag_get_task \ @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@ main/hwloc_cpuset \ @STARPU_SIMGRID_FALSE@ main/task_end_dep \ @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/bcsr \ @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/scratch_reuse \ @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/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/partition_init \ @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/partitioned_initialization \ @STARPU_SIMGRID_FALSE@ datawizard/partitioned_acquire \ @STARPU_SIMGRID_FALSE@ datawizard/temporary_partition_implicit \ @STARPU_SIMGRID_FALSE@ datawizard/redux_acquire \ @STARPU_SIMGRID_FALSE@ disk/disk_copy \ @STARPU_SIMGRID_FALSE@ disk/disk_copy_unpack \ @STARPU_SIMGRID_FALSE@ disk/disk_copy_to_disk \ @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@ errorcheck/workers_cpuid \ @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@ microbenchs/bandwidth \ @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_trivial \ @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_FALSE@ sched_ctx/sched_ctx_hierarchy @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/async_tasks_overhead$(EXEEXT) \ microbenchs/sync_tasks_overhead$(EXEEXT) \ microbenchs/tasks_overhead$(EXEEXT) \ microbenchs/tasks_size_overhead$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) $(am__EXEEXT_7) @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__append_8 = \ @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ microbenchs/bandwidth @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__append_9 = \ @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ microbenchs/tasks_data_overhead.sh \ @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ microbenchs/sync_tasks_data_overhead.sh \ @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ microbenchs/async_tasks_data_overhead.sh \ @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@ microbenchs/tasks_size_overhead_scheds.sh @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_6) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_6) @STARPU_SIMGRID_TRUE@am__append_10 = $(MICROBENCHS:=.sh) @STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__append_11 = \ @STARPU_USE_MPI_MASTER_SLAVE_FALSE@ datawizard/locality.sh \ @STARPU_USE_MPI_MASTER_SLAVE_FALSE@ microbenchs/bandwidth_scheds.sh \ @STARPU_USE_MPI_MASTER_SLAVE_FALSE@ overlap/overlap.sh @STARPU_SIMGRID_MC_TRUE@am__append_12 = model-checking/prio_list \ @STARPU_SIMGRID_MC_TRUE@ model-checking/starpu_barrier @STARPU_QUICK_CHECK_FALSE@@STARPU_SIMGRID_MC_TRUE@am__append_13 = model-checking/prio_list.sh @STARPU_USE_CUDA_TRUE@am__append_14 = \ @STARPU_USE_CUDA_TRUE@ datawizard/acquire_release_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_15 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__append_16 = \ @STARPU_USE_CUDA_TRUE@ datawizard/acquire_release_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_17 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__append_18 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scratch_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_19 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scratch_opencl.c @STARPU_USE_CUDA_TRUE@am__append_20 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_21 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_22 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_23 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_24 = \ @STARPU_USE_CUDA_TRUE@ datawizard/sync_and_notify_data_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_25 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__append_26 = \ @STARPU_USE_CUDA_TRUE@ datawizard/sync_and_notify_data_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_27 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl.c @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/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_33 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_34 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_35 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_36 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_37 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_38 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_39 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_40 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_41 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_42 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_43 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_44 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_45 = \ @STARPU_USE_CUDA_TRUE@ main/increment.cu @STARPU_USE_CUDA_TRUE@am__append_46 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/block/block_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_47 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/block/block_opencl.c @STARPU_USE_CUDA_TRUE@am__append_48 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/bcsr/bcsr_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_49 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/bcsr/bcsr_opencl.c @STARPU_USE_CUDA_TRUE@am__append_50 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/coo/coo_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_51 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/coo/coo_opencl.c @STARPU_USE_CUDA_TRUE@am__append_52 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/csr/csr_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_53 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/csr/csr_opencl.c @STARPU_USE_CUDA_TRUE@am__append_54 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/vector/vector_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_55 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/vector/vector_opencl.c @STARPU_USE_CUDA_TRUE@am__append_56 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/matrix/matrix_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_57 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/matrix/matrix_opencl.c @STARPU_USE_CUDA_TRUE@am__append_58 = \ @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_59 = \ @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_60 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/variable/variable_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_61 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/variable/variable_opencl.c @STARPU_USE_CUDA_TRUE@am__append_62 = \ @STARPU_USE_CUDA_TRUE@ overlap/long_kernel.cu @STARPU_USE_OPENCL_TRUE@am__append_63 = \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset.c @STARPU_USE_OPENCL_TRUE@am__append_64 = \ @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/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_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_TRUE@am__EXEEXT_2 = \ @STARPU_SIMGRID_TRUE@ datawizard/simgrid-locality$(EXEEXT) @STARPU_SIMGRID_FALSE@am__EXEEXT_3 = 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/display_binding$(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/insert_task_where$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/job$(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/subgraph_repeat_regenerate_tag_cycle$(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/tag_get_task$(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@ main/hwloc_cpuset$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ main/task_end_dep$(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/bcsr$(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/scratch_reuse$(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/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/partition_init$(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/partitioned_initialization$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/partitioned_acquire$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/temporary_partition_implicit$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ datawizard/redux_acquire$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/disk_copy$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/disk_copy_unpack$(EXEEXT) \ @STARPU_SIMGRID_FALSE@ disk/disk_copy_to_disk$(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@ errorcheck/workers_cpuid$(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@ microbenchs/bandwidth$(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_trivial$(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) \ @STARPU_SIMGRID_FALSE@ sched_ctx/sched_ctx_hierarchy$(EXEEXT) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@@STARPU_SIMGRID_FALSE@am__EXEEXT_4 = fortran90/init_01$(EXEEXT) @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@am__EXEEXT_5 = main/tag_task_data_deps$(EXEEXT) \ @STARPU_LONG_CHECK_TRUE@@STARPU_SIMGRID_FALSE@ datawizard/reclaim$(EXEEXT) am__EXEEXT_6 = main/callback$(EXEEXT) main/bind$(EXEEXT) \ 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/deps$(EXEEXT) \ datawizard/user_interaction_implicit$(EXEEXT) \ datawizard/interfaces/copy_interfaces$(EXEEXT) \ datawizard/numa_overflow$(EXEEXT) datawizard/locality$(EXEEXT) \ datawizard/variable_size$(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) \ sched_ctx/sched_ctx_list$(EXEEXT) \ sched_ctx/sched_ctx_policy_data$(EXEEXT) \ openmp/init_exit_01$(EXEEXT) openmp/init_exit_02$(EXEEXT) \ openmp/environment$(EXEEXT) openmp/api_01$(EXEEXT) \ openmp/parallel_01$(EXEEXT) openmp/parallel_02$(EXEEXT) \ openmp/parallel_03$(EXEEXT) \ openmp/parallel_barrier_01$(EXEEXT) \ openmp/parallel_master_01$(EXEEXT) \ openmp/parallel_master_inline_01$(EXEEXT) \ openmp/parallel_single_wait_01$(EXEEXT) \ openmp/parallel_single_nowait_01$(EXEEXT) \ openmp/parallel_single_inline_01$(EXEEXT) \ openmp/parallel_single_copyprivate_01$(EXEEXT) \ openmp/parallel_single_copyprivate_inline_01$(EXEEXT) \ openmp/parallel_critical_01$(EXEEXT) \ openmp/parallel_critical_inline_01$(EXEEXT) \ openmp/parallel_critical_named_01$(EXEEXT) \ openmp/parallel_critical_named_inline_01$(EXEEXT) \ openmp/parallel_simple_lock_01$(EXEEXT) \ openmp/parallel_nested_lock_01$(EXEEXT) \ openmp/parallel_for_01$(EXEEXT) \ openmp/parallel_for_02$(EXEEXT) \ openmp/parallel_for_ordered_01$(EXEEXT) \ openmp/parallel_sections_01$(EXEEXT) \ openmp/parallel_sections_combined_01$(EXEEXT) \ openmp/task_01$(EXEEXT) openmp/task_02$(EXEEXT) \ openmp/task_03$(EXEEXT) openmp/taskloop$(EXEEXT) \ openmp/taskwait_01$(EXEEXT) openmp/taskgroup_01$(EXEEXT) \ openmp/taskgroup_02$(EXEEXT) openmp/array_slice_01$(EXEEXT) \ openmp/cuda_task_01$(EXEEXT) perfmodels/value_nan$(EXEEXT) \ $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \ $(am__EXEEXT_5) @STARPU_SIMGRID_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@am__EXEEXT_7 = microbenchs/bandwidth$(EXEEXT) am__installdirs = "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" am__EXEEXT_8 = \ microbenchs/parallel_independent_homogeneous_tasks$(EXEEXT) \ microbenchs/parallel_independent_heterogeneous_tasks$(EXEEXT) \ microbenchs/parallel_independent_homogeneous_tasks_data$(EXEEXT) \ microbenchs/parallel_independent_heterogeneous_tasks_data$(EXEEXT) \ microbenchs/parallel_redux_homogeneous_tasks_data$(EXEEXT) \ microbenchs/parallel_redux_heterogeneous_tasks_data$(EXEEXT) \ microbenchs/parallel_dependent_homogeneous_tasks_data$(EXEEXT) @STARPU_SIMGRID_MC_TRUE@am__EXEEXT_9 = \ @STARPU_SIMGRID_MC_TRUE@ model-checking/prio_list$(EXEEXT) \ @STARPU_SIMGRID_MC_TRUE@ model-checking/starpu_barrier$(EXEEXT) 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__DEPENDENCIES_1 = datawizard_acquire_cb_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(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 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) datawizard_acquire_cb_insert_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_acquire_release_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_release2_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_acquire_try_SOURCES = datawizard/acquire_try.c datawizard_acquire_try_OBJECTS = acquire_try.$(OBJEXT) datawizard_acquire_try_LDADD = $(LDADD) datawizard_acquire_try_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_allocate_SOURCES = datawizard/allocate.c datawizard_allocate_OBJECTS = allocate.$(OBJEXT) datawizard_allocate_LDADD = $(LDADD) datawizard_allocate_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_bcsr_SOURCES = datawizard/bcsr.c datawizard_bcsr_OBJECTS = bcsr.$(OBJEXT) datawizard_bcsr_LDADD = $(LDADD) datawizard_bcsr_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) datawizard_cache_SOURCES = datawizard/cache.c datawizard_cache_OBJECTS = cache.$(OBJEXT) datawizard_cache_LDADD = $(LDADD) datawizard_cache_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) datawizard_commute_SOURCES = datawizard/commute.c datawizard_commute_OBJECTS = commute.$(OBJEXT) datawizard_commute_LDADD = $(LDADD) datawizard_commute_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_commute2_SOURCES = datawizard/commute2.c datawizard_commute2_OBJECTS = commute2.$(OBJEXT) datawizard_commute2_LDADD = $(LDADD) datawizard_commute2_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_copy_SOURCES = datawizard/copy.c datawizard_copy_OBJECTS = copy.$(OBJEXT) datawizard_copy_LDADD = $(LDADD) datawizard_copy_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_critical_section_with_void_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_implicit_deps_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_data_invalidation_SOURCES = datawizard/data_invalidation.c datawizard_data_invalidation_OBJECTS = data_invalidation.$(OBJEXT) datawizard_data_invalidation_LDADD = $(LDADD) datawizard_data_invalidation_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_data_lookup_SOURCES = datawizard/data_lookup.c datawizard_data_lookup_OBJECTS = data_lookup.$(OBJEXT) datawizard_data_lookup_LDADD = $(LDADD) datawizard_data_lookup_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_deps_SOURCES = datawizard/deps.c datawizard_deps_OBJECTS = deps.$(OBJEXT) datawizard_deps_LDADD = $(LDADD) datawizard_deps_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) datawizard_dining_philosophers_SOURCES = \ datawizard/dining_philosophers.c datawizard_dining_philosophers_OBJECTS = \ dining_philosophers.$(OBJEXT) datawizard_dining_philosophers_LDADD = $(LDADD) datawizard_dining_philosophers_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_double_parameter_SOURCES = datawizard/double_parameter.c datawizard_double_parameter_OBJECTS = double_parameter.$(OBJEXT) datawizard_double_parameter_LDADD = $(LDADD) datawizard_double_parameter_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_dsm_stress_SOURCES = datawizard/dsm_stress.c datawizard_dsm_stress_OBJECTS = dsm_stress.$(OBJEXT) datawizard_dsm_stress_LDADD = $(LDADD) datawizard_dsm_stress_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_gpu_ptr_register_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_gpu_register_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_handle_to_pointer_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_in_place_partition_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_increment_init_SOURCES = datawizard/increment_init.c datawizard_increment_init_OBJECTS = increment_init.$(OBJEXT) datawizard_increment_init_LDADD = $(LDADD) datawizard_increment_init_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_increment_redux_SOURCES = datawizard/increment_redux.c datawizard_increment_redux_OBJECTS = increment_redux.$(OBJEXT) datawizard_increment_redux_LDADD = $(LDADD) datawizard_increment_redux_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_lazy_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_increment_redux_v2_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_bcsr_bcsr_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_block_block_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_coo_coo_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_interfaces_copy_interfaces_SOURCES = \ datawizard/interfaces/copy_interfaces.c datawizard_interfaces_copy_interfaces_OBJECTS = \ copy_interfaces.$(OBJEXT) datawizard_interfaces_copy_interfaces_LDADD = $(LDADD) datawizard_interfaces_copy_interfaces_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_csr_csr_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_matrix_matrix_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_multiformat_advanced_multiformat_data_release_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_multiformat_advanced_multiformat_worker_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_multiformat_advanced_same_handle_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_multiformat_multiformat_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_interfaces_variable_variable_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__datawizard_interfaces_vector_vector_interface_SOURCES_DIST = \ datawizard/interfaces/vector/vector_interface.c \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/vector/vector_cuda.cu \ datawizard/interfaces/vector/vector_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_19 = datawizard/interfaces/vector/vector_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_20 = vector_opencl.$(OBJEXT) am_datawizard_interfaces_vector_vector_interface_OBJECTS = \ vector_interface.$(OBJEXT) test_interfaces.$(OBJEXT) \ $(am__objects_19) $(am__objects_20) datawizard_interfaces_vector_vector_interface_OBJECTS = \ $(am_datawizard_interfaces_vector_vector_interface_OBJECTS) datawizard_interfaces_vector_vector_interface_LDADD = $(LDADD) datawizard_interfaces_vector_vector_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_interfaces_void_void_interface_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_invalidate_pending_requests_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_lazy_allocation_SOURCES = datawizard/lazy_allocation.c datawizard_lazy_allocation_OBJECTS = lazy_allocation.$(OBJEXT) datawizard_lazy_allocation_LDADD = $(LDADD) datawizard_lazy_allocation_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_lazy_unregister_SOURCES = datawizard/lazy_unregister.c datawizard_lazy_unregister_OBJECTS = lazy_unregister.$(OBJEXT) datawizard_lazy_unregister_LDADD = $(LDADD) datawizard_lazy_unregister_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_locality_SOURCES = datawizard/locality.c datawizard_locality_OBJECTS = locality.$(OBJEXT) datawizard_locality_LDADD = $(LDADD) datawizard_locality_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_manual_reduction_SOURCES = datawizard/manual_reduction.c datawizard_manual_reduction_OBJECTS = manual_reduction.$(OBJEXT) datawizard_manual_reduction_LDADD = $(LDADD) datawizard_manual_reduction_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_mpi_like_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_mpi_like_async_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_no_unregister_SOURCES = datawizard/no_unregister.c datawizard_no_unregister_OBJECTS = no_unregister.$(OBJEXT) datawizard_no_unregister_LDADD = $(LDADD) datawizard_no_unregister_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_noreclaim_SOURCES = datawizard/noreclaim.c datawizard_noreclaim_OBJECTS = noreclaim.$(OBJEXT) datawizard_noreclaim_LDADD = $(LDADD) datawizard_noreclaim_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_nowhere_SOURCES = datawizard/nowhere.c datawizard_nowhere_OBJECTS = nowhere.$(OBJEXT) datawizard_nowhere_LDADD = $(LDADD) datawizard_nowhere_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_numa_overflow_SOURCES = datawizard/numa_overflow.c datawizard_numa_overflow_OBJECTS = numa_overflow.$(OBJEXT) datawizard_numa_overflow_LDADD = $(LDADD) datawizard_numa_overflow_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_partition_dep_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_partition_init_SOURCES = datawizard/partition_init.c datawizard_partition_init_OBJECTS = partition_init.$(OBJEXT) datawizard_partition_init_LDADD = $(LDADD) datawizard_partition_init_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_partition_lazy_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_partitioned_acquire_SOURCES = \ datawizard/partitioned_acquire.c datawizard_partitioned_acquire_OBJECTS = \ partitioned_acquire.$(OBJEXT) datawizard_partitioned_acquire_LDADD = $(LDADD) datawizard_partitioned_acquire_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_partitioned_initialization_SOURCES = \ datawizard/partitioned_initialization.c datawizard_partitioned_initialization_OBJECTS = \ partitioned_initialization.$(OBJEXT) datawizard_partitioned_initialization_LDADD = $(LDADD) datawizard_partitioned_initialization_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_readers_and_writers_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_readonly_SOURCES = datawizard/readonly.c datawizard_readonly_OBJECTS = readonly.$(OBJEXT) datawizard_readonly_LDADD = $(LDADD) datawizard_readonly_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_reclaim_SOURCES = datawizard/reclaim.c datawizard_reclaim_OBJECTS = reclaim.$(OBJEXT) datawizard_reclaim_LDADD = $(LDADD) datawizard_reclaim_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_redux_acquire_SOURCES = datawizard/redux_acquire.c datawizard_redux_acquire_OBJECTS = redux_acquire.$(OBJEXT) datawizard_redux_acquire_LDADD = $(LDADD) datawizard_redux_acquire_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_scratch_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_scratch_reuse_SOURCES = datawizard/scratch_reuse.c datawizard_scratch_reuse_OBJECTS = scratch_reuse.$(OBJEXT) datawizard_scratch_reuse_LDADD = $(LDADD) datawizard_scratch_reuse_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_simgrid_locality_SOURCES = datawizard/simgrid-locality.c datawizard_simgrid_locality_OBJECTS = simgrid-locality.$(OBJEXT) datawizard_simgrid_locality_LDADD = $(LDADD) datawizard_simgrid_locality_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_specific_node_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_sync_and_notify_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_and_notify_data_implicit_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_sync_with_data_with_mem_non_blocking_implicit_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_task_with_multiple_time_the_same_handle_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_temporary_partition_SOURCES = \ datawizard/temporary_partition.c datawizard_temporary_partition_OBJECTS = \ temporary_partition.$(OBJEXT) datawizard_temporary_partition_LDADD = $(LDADD) datawizard_temporary_partition_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_temporary_partition_implicit_SOURCES = \ datawizard/temporary_partition_implicit.c datawizard_temporary_partition_implicit_OBJECTS = \ temporary_partition_implicit.$(OBJEXT) datawizard_temporary_partition_implicit_LDADD = $(LDADD) datawizard_temporary_partition_implicit_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_datawizard_test_arbiter_OBJECTS = test_arbiter.$(OBJEXT) datawizard_test_arbiter_OBJECTS = \ $(am_datawizard_test_arbiter_OBJECTS) datawizard_test_arbiter_LDADD = $(LDADD) datawizard_test_arbiter_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_unpartition_SOURCES = datawizard/unpartition.c datawizard_unpartition_OBJECTS = unpartition.$(OBJEXT) datawizard_unpartition_LDADD = $(LDADD) datawizard_unpartition_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_user_interaction_implicit_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_variable_parameters_SOURCES = \ datawizard/variable_parameters.c datawizard_variable_parameters_OBJECTS = \ variable_parameters.$(OBJEXT) datawizard_variable_parameters_LDADD = $(LDADD) datawizard_variable_parameters_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) datawizard_variable_size_SOURCES = datawizard/variable_size.c datawizard_variable_size_OBJECTS = variable_size.$(OBJEXT) datawizard_variable_size_LDADD = $(LDADD) datawizard_variable_size_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) datawizard_write_only_tmp_buffer_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_datawizard_wt_broadcast_OBJECTS = wt_broadcast.$(OBJEXT) datawizard_wt_broadcast_OBJECTS = \ $(am_datawizard_wt_broadcast_OBJECTS) datawizard_wt_broadcast_LDADD = $(LDADD) datawizard_wt_broadcast_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_datawizard_wt_host_OBJECTS = wt_host.$(OBJEXT) datawizard_wt_host_OBJECTS = $(am_datawizard_wt_host_OBJECTS) datawizard_wt_host_LDADD = $(LDADD) datawizard_wt_host_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) disk_disk_compute_SOURCES = disk/disk_compute.c disk_disk_compute_OBJECTS = disk_compute.$(OBJEXT) disk_disk_compute_LDADD = $(LDADD) disk_disk_compute_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) disk_disk_copy_SOURCES = disk/disk_copy.c disk_disk_copy_OBJECTS = disk_copy.$(OBJEXT) disk_disk_copy_LDADD = $(LDADD) disk_disk_copy_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) disk_disk_copy_to_disk_SOURCES = disk/disk_copy_to_disk.c disk_disk_copy_to_disk_OBJECTS = disk_copy_to_disk.$(OBJEXT) disk_disk_copy_to_disk_LDADD = $(LDADD) disk_disk_copy_to_disk_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) disk_disk_copy_unpack_SOURCES = disk/disk_copy_unpack.c disk_disk_copy_unpack_OBJECTS = disk_copy_unpack.$(OBJEXT) disk_disk_copy_unpack_LDADD = $(LDADD) disk_disk_copy_unpack_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) disk_disk_pack_SOURCES = disk/disk_pack.c disk_disk_pack_OBJECTS = disk_pack.$(OBJEXT) disk_disk_pack_LDADD = $(LDADD) disk_disk_pack_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) disk_mem_reclaim_SOURCES = disk/mem_reclaim.c disk_mem_reclaim_OBJECTS = mem_reclaim.$(OBJEXT) disk_mem_reclaim_LDADD = $(LDADD) disk_mem_reclaim_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_blocking_calls_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) errorcheck_invalid_tasks_SOURCES = errorcheck/invalid_tasks.c errorcheck_invalid_tasks_OBJECTS = invalid_tasks.$(OBJEXT) errorcheck_invalid_tasks_LDADD = $(LDADD) errorcheck_invalid_tasks_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) errorcheck_starpu_init_noworker_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) errorcheck_workers_cpuid_SOURCES = errorcheck/workers_cpuid.c errorcheck_workers_cpuid_OBJECTS = workers_cpuid.$(OBJEXT) errorcheck_workers_cpuid_LDADD = $(LDADD) errorcheck_workers_cpuid_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) fortran90_init_01_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) helper_cublas_init_SOURCES = helper/cublas_init.c helper_cublas_init_OBJECTS = cublas_init.$(OBJEXT) helper_cublas_init_LDADD = $(LDADD) helper_cublas_init_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) helper_cusparse_init_SOURCES = helper/cusparse_init.c helper_cusparse_init_OBJECTS = cusparse_init.$(OBJEXT) helper_cusparse_init_LDADD = $(LDADD) helper_cusparse_init_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_execute_on_all_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) helper_pinned_memory_SOURCES = helper/pinned_memory.c helper_pinned_memory_OBJECTS = pinned_memory.$(OBJEXT) helper_pinned_memory_LDADD = $(LDADD) helper_pinned_memory_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_create_sync_task_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) helper_starpu_data_cpy_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) loader_SOURCES = loader.c loader_OBJECTS = loader.$(OBJEXT) loader_LDADD = $(LDADD) loader_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_bind_SOURCES = main/bind.c main_bind_OBJECTS = bind.$(OBJEXT) main_bind_LDADD = $(LDADD) main_bind_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_callback_SOURCES = main/callback.c main_callback_OBJECTS = callback.$(OBJEXT) main_callback_LDADD = $(LDADD) main_callback_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_codelet_null_callback_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_after_submission_synchronous_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_declare_deps_in_callback_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_deploop_SOURCES = main/deploop.c main_deploop_OBJECTS = deploop.$(OBJEXT) main_deploop_LDADD = $(LDADD) main_deploop_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_display_binding_SOURCES = main/display_binding.c main_display_binding_OBJECTS = display_binding.$(OBJEXT) main_display_binding_LDADD = $(LDADD) main_display_binding_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_init_run_deinit_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_driver_api_run_driver_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_empty_task_SOURCES = main/empty_task.c main_empty_task_OBJECTS = empty_task.$(OBJEXT) main_empty_task_LDADD = $(LDADD) main_empty_task_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_chain_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_empty_task_sync_point_tasks_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_on_a_specific_worker_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_execute_schedule_SOURCES = main/execute_schedule.c main_execute_schedule_OBJECTS = execute_schedule.$(OBJEXT) main_execute_schedule_LDADD = $(LDADD) main_execute_schedule_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_children_tasks_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_get_current_task_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_hwloc_cpuset_SOURCES = main/hwloc_cpuset.c main_hwloc_cpuset_OBJECTS = hwloc_cpuset.$(OBJEXT) main_hwloc_cpuset_LDADD = $(LDADD) main_hwloc_cpuset_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_insert_task_SOURCES = main/insert_task.c main_insert_task_OBJECTS = insert_task.$(OBJEXT) main_insert_task_LDADD = $(LDADD) main_insert_task_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_array_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_dyn_handles_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_many_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_nullcodelet_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_pack_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_insert_task_value_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__main_insert_task_where_SOURCES_DIST = main/insert_task_where.c \ main/increment.cu @STARPU_USE_CUDA_TRUE@am__objects_27 = main/increment.$(OBJEXT) am_main_insert_task_where_OBJECTS = insert_task_where.$(OBJEXT) \ $(am__objects_27) main_insert_task_where_OBJECTS = $(am_main_insert_task_where_OBJECTS) main_insert_task_where_LDADD = $(LDADD) main_insert_task_where_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_job_SOURCES = main/job.c main_job_OBJECTS = job.$(OBJEXT) main_job_LDADD = $(LDADD) main_job_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_mkdtemp_SOURCES = main/mkdtemp.c main_mkdtemp_OBJECTS = mkdtemp.$(OBJEXT) main_mkdtemp_LDADD = $(LDADD) main_mkdtemp_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_multithreaded_SOURCES = main/multithreaded.c main_multithreaded_OBJECTS = multithreaded.$(OBJEXT) main_multithreaded_LDADD = $(LDADD) main_multithreaded_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_multithreaded_init_SOURCES = main/multithreaded_init.c main_multithreaded_init_OBJECTS = multithreaded_init.$(OBJEXT) main_multithreaded_init_LDADD = $(LDADD) main_multithreaded_init_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_pack_SOURCES = main/pack.c main_pack_OBJECTS = pack.$(OBJEXT) main_pack_LDADD = $(LDADD) main_pack_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_pause_resume_SOURCES = main/pause_resume.c main_pause_resume_OBJECTS = pause_resume.$(OBJEXT) main_pause_resume_LDADD = $(LDADD) main_pause_resume_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_regenerate_SOURCES = main/regenerate.c main_regenerate_OBJECTS = regenerate.$(OBJEXT) main_regenerate_LDADD = $(LDADD) main_regenerate_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_regenerate_pipeline_SOURCES = main/regenerate_pipeline.c main_regenerate_pipeline_OBJECTS = regenerate_pipeline.$(OBJEXT) main_regenerate_pipeline_LDADD = $(LDADD) main_regenerate_pipeline_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_restart_SOURCES = main/restart.c main_restart_OBJECTS = restart.$(OBJEXT) main_restart_LDADD = $(LDADD) main_restart_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_starpu_init_SOURCES = main/starpu_init.c main_starpu_init_OBJECTS = starpu_init.$(OBJEXT) main_starpu_init_LDADD = $(LDADD) main_starpu_init_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_bundle_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_task_wait_for_all_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_starpu_worker_exists_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_static_restartable_SOURCES = main/static_restartable.c main_static_restartable_OBJECTS = static_restartable.$(OBJEXT) main_static_restartable_LDADD = $(LDADD) main_static_restartable_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_tag_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) main_static_restartable_using_initializer_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__main_subgraph_repeat_SOURCES_DIST = main/subgraph_repeat.c \ main/increment_codelet.c main/increment.cu am_main_subgraph_repeat_OBJECTS = subgraph_repeat.$(OBJEXT) \ increment_codelet.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_OBJECTS = $(am_main_subgraph_repeat_OBJECTS) main_subgraph_repeat_LDADD = $(LDADD) main_subgraph_repeat_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__main_subgraph_repeat_regenerate_SOURCES_DIST = \ main/subgraph_repeat_regenerate.c main/increment_codelet.c \ main/increment.cu am_main_subgraph_repeat_regenerate_OBJECTS = \ subgraph_repeat_regenerate.$(OBJEXT) \ increment_codelet.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_regenerate_OBJECTS = \ $(am_main_subgraph_repeat_regenerate_OBJECTS) main_subgraph_repeat_regenerate_LDADD = $(LDADD) main_subgraph_repeat_regenerate_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__main_subgraph_repeat_regenerate_tag_SOURCES_DIST = \ main/subgraph_repeat_regenerate_tag.c main/increment_codelet.c \ main/increment.cu am_main_subgraph_repeat_regenerate_tag_OBJECTS = \ subgraph_repeat_regenerate_tag.$(OBJEXT) \ increment_codelet.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_regenerate_tag_OBJECTS = \ $(am_main_subgraph_repeat_regenerate_tag_OBJECTS) main_subgraph_repeat_regenerate_tag_LDADD = $(LDADD) main_subgraph_repeat_regenerate_tag_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__main_subgraph_repeat_regenerate_tag_cycle_SOURCES_DIST = \ main/subgraph_repeat_regenerate_tag_cycle.c \ main/increment_codelet.c main/increment.cu am_main_subgraph_repeat_regenerate_tag_cycle_OBJECTS = \ subgraph_repeat_regenerate_tag_cycle.$(OBJEXT) \ increment_codelet.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_regenerate_tag_cycle_OBJECTS = \ $(am_main_subgraph_repeat_regenerate_tag_cycle_OBJECTS) main_subgraph_repeat_regenerate_tag_cycle_LDADD = $(LDADD) main_subgraph_repeat_regenerate_tag_cycle_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__main_subgraph_repeat_tag_SOURCES_DIST = \ main/subgraph_repeat_tag.c main/increment_codelet.c \ main/increment.cu am_main_subgraph_repeat_tag_OBJECTS = subgraph_repeat_tag.$(OBJEXT) \ increment_codelet.$(OBJEXT) $(am__objects_27) main_subgraph_repeat_tag_OBJECTS = \ $(am_main_subgraph_repeat_tag_OBJECTS) main_subgraph_repeat_tag_LDADD = $(LDADD) main_subgraph_repeat_tag_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) main_submit_SOURCES = main/submit.c main_submit_OBJECTS = submit.$(OBJEXT) main_submit_LDADD = $(LDADD) main_submit_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_tag_get_task_SOURCES = main/tag_get_task.c main_tag_get_task_OBJECTS = tag_get_task.$(OBJEXT) main_tag_get_task_LDADD = $(LDADD) main_tag_get_task_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_task_data_deps_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_tag_wait_api_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) main_task_end_dep_SOURCES = main/task_end_dep.c main_task_end_dep_OBJECTS = task_end_dep.$(OBJEXT) main_task_end_dep_LDADD = $(LDADD) main_task_end_dep_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_task_wait_api_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) main_wait_all_regenerable_tasks_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_async_tasks_overhead_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_bandwidth_SOURCES = microbenchs/bandwidth.c microbenchs_bandwidth_OBJECTS = bandwidth.$(OBJEXT) microbenchs_bandwidth_LDADD = $(LDADD) microbenchs_bandwidth_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_display_structures_size_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_local_pingpong_SOURCES = microbenchs/local_pingpong.c microbenchs_local_pingpong_OBJECTS = local_pingpong.$(OBJEXT) microbenchs_local_pingpong_LDADD = $(LDADD) microbenchs_local_pingpong_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_matrix_as_vector_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_dependent_homogeneous_tasks_data_SOURCES = \ microbenchs/parallel_dependent_homogeneous_tasks_data.c microbenchs_parallel_dependent_homogeneous_tasks_data_OBJECTS = \ parallel_dependent_homogeneous_tasks_data.$(OBJEXT) microbenchs_parallel_dependent_homogeneous_tasks_data_LDADD = \ $(LDADD) microbenchs_parallel_dependent_homogeneous_tasks_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_independent_heterogeneous_tasks_SOURCES = \ microbenchs/parallel_independent_heterogeneous_tasks.c microbenchs_parallel_independent_heterogeneous_tasks_OBJECTS = \ parallel_independent_heterogeneous_tasks.$(OBJEXT) microbenchs_parallel_independent_heterogeneous_tasks_LDADD = $(LDADD) microbenchs_parallel_independent_heterogeneous_tasks_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_independent_heterogeneous_tasks_data_SOURCES = \ microbenchs/parallel_independent_heterogeneous_tasks_data.c microbenchs_parallel_independent_heterogeneous_tasks_data_OBJECTS = \ parallel_independent_heterogeneous_tasks_data.$(OBJEXT) microbenchs_parallel_independent_heterogeneous_tasks_data_LDADD = \ $(LDADD) microbenchs_parallel_independent_heterogeneous_tasks_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_independent_homogeneous_tasks_SOURCES = \ microbenchs/parallel_independent_homogeneous_tasks.c microbenchs_parallel_independent_homogeneous_tasks_OBJECTS = \ parallel_independent_homogeneous_tasks.$(OBJEXT) microbenchs_parallel_independent_homogeneous_tasks_LDADD = $(LDADD) microbenchs_parallel_independent_homogeneous_tasks_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_independent_homogeneous_tasks_data_SOURCES = \ microbenchs/parallel_independent_homogeneous_tasks_data.c microbenchs_parallel_independent_homogeneous_tasks_data_OBJECTS = \ parallel_independent_homogeneous_tasks_data.$(OBJEXT) microbenchs_parallel_independent_homogeneous_tasks_data_LDADD = \ $(LDADD) microbenchs_parallel_independent_homogeneous_tasks_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_redux_heterogeneous_tasks_data_SOURCES = \ microbenchs/parallel_redux_heterogeneous_tasks_data.c microbenchs_parallel_redux_heterogeneous_tasks_data_OBJECTS = \ parallel_redux_heterogeneous_tasks_data.$(OBJEXT) microbenchs_parallel_redux_heterogeneous_tasks_data_LDADD = $(LDADD) microbenchs_parallel_redux_heterogeneous_tasks_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_parallel_redux_homogeneous_tasks_data_SOURCES = \ microbenchs/parallel_redux_homogeneous_tasks_data.c microbenchs_parallel_redux_homogeneous_tasks_data_OBJECTS = \ parallel_redux_homogeneous_tasks_data.$(OBJEXT) microbenchs_parallel_redux_homogeneous_tasks_data_LDADD = $(LDADD) microbenchs_parallel_redux_homogeneous_tasks_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_prefetch_data_on_node_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_redundant_buffer_SOURCES = microbenchs/redundant_buffer.c microbenchs_redundant_buffer_OBJECTS = redundant_buffer.$(OBJEXT) microbenchs_redundant_buffer_LDADD = $(LDADD) microbenchs_redundant_buffer_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_sync_tasks_overhead_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) microbenchs_tasks_overhead_SOURCES = microbenchs/tasks_overhead.c microbenchs_tasks_overhead_OBJECTS = tasks_overhead.$(OBJEXT) microbenchs_tasks_overhead_LDADD = $(LDADD) microbenchs_tasks_overhead_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) microbenchs_tasks_size_overhead_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) model_checking_prio_list_SOURCES = model-checking/prio_list.c model_checking_prio_list_OBJECTS = prio_list.$(OBJEXT) model_checking_prio_list_DEPENDENCIES = model_checking_prio_list_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(model_checking_prio_list_LDFLAGS) \ $(LDFLAGS) -o $@ model_checking_starpu_barrier_SOURCES = \ model-checking/starpu_barrier.c model_checking_starpu_barrier_OBJECTS = starpu_barrier.$(OBJEXT) model_checking_starpu_barrier_DEPENDENCIES = model_checking_starpu_barrier_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) \ $(model_checking_starpu_barrier_LDFLAGS) $(LDFLAGS) -o $@ am_openmp_api_01_OBJECTS = api_01.$(OBJEXT) openmp_api_01_OBJECTS = $(am_openmp_api_01_OBJECTS) openmp_api_01_LDADD = $(LDADD) openmp_api_01_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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) openmp_array_slice_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_cuda_task_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_environment_OBJECTS = environment.$(OBJEXT) openmp_environment_OBJECTS = $(am_openmp_environment_OBJECTS) openmp_environment_LDADD = $(LDADD) openmp_environment_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_init_exit_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_init_exit_02_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_parallel_01_OBJECTS = parallel_01.$(OBJEXT) openmp_parallel_01_OBJECTS = $(am_openmp_parallel_01_OBJECTS) openmp_parallel_01_LDADD = $(LDADD) openmp_parallel_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_parallel_02_OBJECTS = parallel_02.$(OBJEXT) openmp_parallel_02_OBJECTS = $(am_openmp_parallel_02_OBJECTS) openmp_parallel_02_LDADD = $(LDADD) openmp_parallel_02_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_parallel_03_OBJECTS = parallel_03.$(OBJEXT) openmp_parallel_03_OBJECTS = $(am_openmp_parallel_03_OBJECTS) openmp_parallel_03_LDADD = $(LDADD) openmp_parallel_03_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_barrier_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_critical_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_critical_inline_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_critical_named_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_critical_named_inline_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_for_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_for_02_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_for_ordered_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_master_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_master_inline_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_nested_lock_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_sections_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_sections_combined_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_simple_lock_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_single_copyprivate_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_single_copyprivate_inline_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_single_inline_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_single_nowait_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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) openmp_parallel_single_wait_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_task_01_OBJECTS = task_01.$(OBJEXT) openmp_task_01_OBJECTS = $(am_openmp_task_01_OBJECTS) openmp_task_01_LDADD = $(LDADD) openmp_task_01_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_openmp_task_02_OBJECTS = task_02.$(OBJEXT) openmp_task_02_OBJECTS = $(am_openmp_task_02_OBJECTS) openmp_task_02_LDADD = $(LDADD) openmp_task_02_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_openmp_task_03_OBJECTS = task_03.$(OBJEXT) openmp_task_03_OBJECTS = $(am_openmp_task_03_OBJECTS) openmp_task_03_LDADD = $(LDADD) openmp_task_03_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_openmp_taskgroup_01_OBJECTS = taskgroup_01.$(OBJEXT) openmp_taskgroup_01_OBJECTS = $(am_openmp_taskgroup_01_OBJECTS) openmp_taskgroup_01_LDADD = $(LDADD) openmp_taskgroup_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_taskgroup_02_OBJECTS = taskgroup_02.$(OBJEXT) openmp_taskgroup_02_OBJECTS = $(am_openmp_taskgroup_02_OBJECTS) openmp_taskgroup_02_LDADD = $(LDADD) openmp_taskgroup_02_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openmp_taskloop_OBJECTS = taskloop.$(OBJEXT) openmp_taskloop_OBJECTS = $(am_openmp_taskloop_OBJECTS) openmp_taskloop_LDADD = $(LDADD) openmp_taskloop_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_openmp_taskwait_01_OBJECTS = taskwait_01.$(OBJEXT) openmp_taskwait_01_OBJECTS = $(am_openmp_taskwait_01_OBJECTS) openmp_taskwait_01_LDADD = $(LDADD) openmp_taskwait_01_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_gpu_concurrency_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) overlap_overlap_SOURCES = overlap/overlap.c overlap_overlap_OBJECTS = overlap.$(OBJEXT) overlap_overlap_LDADD = $(LDADD) overlap_overlap_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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_cuda_only_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_explicit_combined_worker_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_parallel_kernels_spmd_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) parallel_tasks_parallel_kernels_trivial_SOURCES = \ parallel_tasks/parallel_kernels_trivial.c parallel_tasks_parallel_kernels_trivial_OBJECTS = \ parallel_kernels_trivial.$(OBJEXT) parallel_tasks_parallel_kernels_trivial_LDADD = $(LDADD) parallel_tasks_parallel_kernels_trivial_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) parallel_tasks_spmd_peager_SOURCES = parallel_tasks/spmd_peager.c parallel_tasks_spmd_peager_OBJECTS = spmd_peager.$(OBJEXT) parallel_tasks_spmd_peager_LDADD = $(LDADD) parallel_tasks_spmd_peager_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_perfmodels_feed_OBJECTS = feed.$(OBJEXT) perfmodels_feed_OBJECTS = $(am_perfmodels_feed_OBJECTS) perfmodels_feed_LDADD = $(LDADD) perfmodels_feed_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) perfmodels_memory_SOURCES = perfmodels/memory.c perfmodels_memory_OBJECTS = memory.$(OBJEXT) perfmodels_memory_LDADD = $(LDADD) perfmodels_memory_DEPENDENCIES = $(top_builddir)/src/@LIBSTARPU_LINK@ \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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) perfmodels_non_linear_regression_based_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_regression_based_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) perfmodels_user_base_SOURCES = perfmodels/user_base.c perfmodels_user_base_OBJECTS = user_base.$(OBJEXT) perfmodels_user_base_LDADD = $(LDADD) perfmodels_user_base_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) perfmodels_valid_model_SOURCES = perfmodels/valid_model.c perfmodels_valid_model_OBJECTS = valid_model.$(OBJEXT) perfmodels_valid_model_LDADD = $(LDADD) perfmodels_valid_model_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) perfmodels_value_nan_SOURCES = perfmodels/value_nan.c perfmodels_value_nan_OBJECTS = value_nan.$(OBJEXT) perfmodels_value_nan_LDADD = $(LDADD) perfmodels_value_nan_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_sched_ctx_sched_ctx_hierarchy_OBJECTS = \ sched_ctx_hierarchy.$(OBJEXT) sched_ctx_sched_ctx_hierarchy_OBJECTS = \ $(am_sched_ctx_sched_ctx_hierarchy_OBJECTS) sched_ctx_sched_ctx_hierarchy_LDADD = $(LDADD) sched_ctx_sched_ctx_hierarchy_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_sched_ctx_sched_ctx_list_OBJECTS = sched_ctx_list.$(OBJEXT) sched_ctx_sched_ctx_list_OBJECTS = \ $(am_sched_ctx_sched_ctx_list_OBJECTS) sched_ctx_sched_ctx_list_LDADD = $(LDADD) sched_ctx_sched_ctx_list_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_sched_ctx_sched_ctx_policy_data_OBJECTS = \ sched_ctx_policy_data.$(OBJEXT) sched_ctx_sched_ctx_policy_data_OBJECTS = \ $(am_sched_ctx_sched_ctx_policy_data_OBJECTS) sched_ctx_sched_ctx_policy_data_LDADD = $(LDADD) sched_ctx_sched_ctx_policy_data_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_data_locality_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_prio_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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_cpu_gpu_sched_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) sched_policies_simple_deps_SOURCES = sched_policies/simple_deps.c sched_policies_simple_deps_OBJECTS = simple_deps.$(OBJEXT) sched_policies_simple_deps_LDADD = $(LDADD) sched_policies_simple_deps_DEPENDENCIES = \ $(top_builddir)/src/@LIBSTARPU_LINK@ $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/acquire_cb.Po \ ./$(DEPDIR)/acquire_cb_insert.Po \ ./$(DEPDIR)/acquire_release.Po ./$(DEPDIR)/acquire_release2.Po \ ./$(DEPDIR)/acquire_release_opencl.Po \ ./$(DEPDIR)/acquire_try.Po ./$(DEPDIR)/allocate.Po \ ./$(DEPDIR)/api_01.Po ./$(DEPDIR)/array_slice_01.Po \ ./$(DEPDIR)/async_tasks_overhead.Po ./$(DEPDIR)/bandwidth.Po \ ./$(DEPDIR)/bcsr.Po ./$(DEPDIR)/bcsr_interface.Po \ ./$(DEPDIR)/bcsr_opencl.Po ./$(DEPDIR)/bind.Po \ ./$(DEPDIR)/block_interface.Po ./$(DEPDIR)/block_opencl.Po \ ./$(DEPDIR)/cache.Po ./$(DEPDIR)/callback.Po \ ./$(DEPDIR)/codelet_null_callback.Po ./$(DEPDIR)/commute.Po \ ./$(DEPDIR)/commute2.Po ./$(DEPDIR)/coo_interface.Po \ ./$(DEPDIR)/coo_opencl.Po ./$(DEPDIR)/copy.Po \ ./$(DEPDIR)/copy_interfaces.Po \ ./$(DEPDIR)/critical_section_with_void_interface.Po \ ./$(DEPDIR)/csr_interface.Po ./$(DEPDIR)/csr_opencl.Po \ ./$(DEPDIR)/cublas_init.Po ./$(DEPDIR)/cuda_only.Po \ ./$(DEPDIR)/cuda_task_01.Po ./$(DEPDIR)/cusparse_init.Po \ ./$(DEPDIR)/data_implicit_deps.Po \ ./$(DEPDIR)/data_invalidation.Po ./$(DEPDIR)/data_locality.Po \ ./$(DEPDIR)/data_lookup.Po \ ./$(DEPDIR)/declare_deps_after_submission.Po \ ./$(DEPDIR)/declare_deps_after_submission_synchronous.Po \ ./$(DEPDIR)/declare_deps_in_callback.Po ./$(DEPDIR)/deploop.Po \ ./$(DEPDIR)/deps.Po ./$(DEPDIR)/dining_philosophers.Po \ ./$(DEPDIR)/disk_compute.Po ./$(DEPDIR)/disk_copy.Po \ ./$(DEPDIR)/disk_copy_to_disk.Po \ ./$(DEPDIR)/disk_copy_unpack.Po ./$(DEPDIR)/disk_pack.Po \ ./$(DEPDIR)/display_binding.Po \ ./$(DEPDIR)/display_structures_size.Po \ ./$(DEPDIR)/double_parameter.Po ./$(DEPDIR)/dsm_stress.Po \ ./$(DEPDIR)/empty_task.Po ./$(DEPDIR)/empty_task_chain.Po \ ./$(DEPDIR)/empty_task_sync_point.Po \ ./$(DEPDIR)/empty_task_sync_point_tasks.Po \ ./$(DEPDIR)/environment.Po ./$(DEPDIR)/execute_all_tasks.Po \ ./$(DEPDIR)/execute_on_a_specific_worker.Po \ ./$(DEPDIR)/execute_on_all.Po ./$(DEPDIR)/execute_schedule.Po \ ./$(DEPDIR)/explicit_combined_worker.Po ./$(DEPDIR)/feed.Po \ ./$(DEPDIR)/generic.Po ./$(DEPDIR)/get_children_tasks.Po \ ./$(DEPDIR)/get_current_task.Po ./$(DEPDIR)/gpu_concurrency.Po \ ./$(DEPDIR)/gpu_ptr_register.Po ./$(DEPDIR)/gpu_register.Po \ ./$(DEPDIR)/handle_to_pointer.Po ./$(DEPDIR)/hwloc_cpuset.Po \ ./$(DEPDIR)/in_place_partition.Po \ ./$(DEPDIR)/increment_codelet.Po ./$(DEPDIR)/increment_init.Po \ ./$(DEPDIR)/increment_redux.Po \ ./$(DEPDIR)/increment_redux_lazy.Po \ ./$(DEPDIR)/increment_redux_v2.Po ./$(DEPDIR)/init_exit_01.Po \ ./$(DEPDIR)/init_exit_02.Po ./$(DEPDIR)/init_run_deinit.Po \ ./$(DEPDIR)/insert_task.Po ./$(DEPDIR)/insert_task_array.Po \ ./$(DEPDIR)/insert_task_dyn_handles.Po \ ./$(DEPDIR)/insert_task_many.Po \ ./$(DEPDIR)/insert_task_nullcodelet.Po \ ./$(DEPDIR)/insert_task_pack.Po \ ./$(DEPDIR)/insert_task_value.Po \ ./$(DEPDIR)/insert_task_where.Po \ ./$(DEPDIR)/invalid_blocking_calls.Po \ ./$(DEPDIR)/invalid_tasks.Po \ ./$(DEPDIR)/invalidate_pending_requests.Po ./$(DEPDIR)/job.Po \ ./$(DEPDIR)/lazy_allocation.Po ./$(DEPDIR)/lazy_unregister.Po \ ./$(DEPDIR)/loader.Po ./$(DEPDIR)/local_pingpong.Po \ ./$(DEPDIR)/locality.Po \ ./$(DEPDIR)/main_deprecated_func-deprecated_func.Po \ ./$(DEPDIR)/manual_reduction.Po \ ./$(DEPDIR)/matrix_as_vector.Po \ ./$(DEPDIR)/matrix_interface.Po ./$(DEPDIR)/matrix_opencl.Po \ ./$(DEPDIR)/mem_reclaim.Po ./$(DEPDIR)/memory.Po \ ./$(DEPDIR)/mkdtemp.Po ./$(DEPDIR)/mpi_like.Po \ ./$(DEPDIR)/mpi_like_async.Po \ ./$(DEPDIR)/multiformat_conversion_codelets.Po \ ./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po \ ./$(DEPDIR)/multiformat_cuda_opencl.Po \ ./$(DEPDIR)/multiformat_data_release.Po \ ./$(DEPDIR)/multiformat_handle_conversion.Po \ ./$(DEPDIR)/multiformat_interface.Po \ ./$(DEPDIR)/multiformat_opencl.Po \ ./$(DEPDIR)/multiformat_worker.Po ./$(DEPDIR)/multithreaded.Po \ ./$(DEPDIR)/multithreaded_init.Po ./$(DEPDIR)/no_unregister.Po \ ./$(DEPDIR)/non_linear_regression_based.Po \ ./$(DEPDIR)/noreclaim.Po ./$(DEPDIR)/nowhere.Po \ ./$(DEPDIR)/numa_overflow.Po \ ./$(DEPDIR)/opencl_codelet_unsigned_inc.Po \ ./$(DEPDIR)/opencl_memset.Po ./$(DEPDIR)/overlap.Po \ ./$(DEPDIR)/pack.Po ./$(DEPDIR)/parallel_01.Po \ ./$(DEPDIR)/parallel_02.Po ./$(DEPDIR)/parallel_03.Po \ ./$(DEPDIR)/parallel_barrier_01.Po \ ./$(DEPDIR)/parallel_critical_01.Po \ ./$(DEPDIR)/parallel_critical_inline_01.Po \ ./$(DEPDIR)/parallel_critical_named_01.Po \ ./$(DEPDIR)/parallel_critical_named_inline_01.Po \ ./$(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Po \ ./$(DEPDIR)/parallel_for_01.Po ./$(DEPDIR)/parallel_for_02.Po \ ./$(DEPDIR)/parallel_for_ordered_01.Po \ ./$(DEPDIR)/parallel_independent_heterogeneous_tasks.Po \ ./$(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Po \ ./$(DEPDIR)/parallel_independent_homogeneous_tasks.Po \ ./$(DEPDIR)/parallel_independent_homogeneous_tasks_data.Po \ ./$(DEPDIR)/parallel_kernels.Po \ ./$(DEPDIR)/parallel_kernels_spmd.Po \ ./$(DEPDIR)/parallel_kernels_trivial.Po \ ./$(DEPDIR)/parallel_master_01.Po \ ./$(DEPDIR)/parallel_master_inline_01.Po \ ./$(DEPDIR)/parallel_nested_lock_01.Po \ ./$(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Po \ ./$(DEPDIR)/parallel_redux_homogeneous_tasks_data.Po \ ./$(DEPDIR)/parallel_sections_01.Po \ ./$(DEPDIR)/parallel_sections_combined_01.Po \ ./$(DEPDIR)/parallel_simple_lock_01.Po \ ./$(DEPDIR)/parallel_single_copyprivate_01.Po \ ./$(DEPDIR)/parallel_single_copyprivate_inline_01.Po \ ./$(DEPDIR)/parallel_single_inline_01.Po \ ./$(DEPDIR)/parallel_single_nowait_01.Po \ ./$(DEPDIR)/parallel_single_wait_01.Po \ ./$(DEPDIR)/partition_dep.Po ./$(DEPDIR)/partition_init.Po \ ./$(DEPDIR)/partition_lazy.Po \ ./$(DEPDIR)/partitioned_acquire.Po \ ./$(DEPDIR)/partitioned_initialization.Po \ ./$(DEPDIR)/pause_resume.Po ./$(DEPDIR)/pinned_memory.Po \ ./$(DEPDIR)/prefetch_data_on_node.Po ./$(DEPDIR)/prio.Po \ ./$(DEPDIR)/prio_list.Po ./$(DEPDIR)/readers_and_writers.Po \ ./$(DEPDIR)/readonly.Po ./$(DEPDIR)/reclaim.Po \ ./$(DEPDIR)/redundant_buffer.Po ./$(DEPDIR)/redux_acquire.Po \ ./$(DEPDIR)/regenerate.Po ./$(DEPDIR)/regenerate_pipeline.Po \ ./$(DEPDIR)/regression_based.Po ./$(DEPDIR)/restart.Po \ ./$(DEPDIR)/run_driver.Po ./$(DEPDIR)/same_handle.Po \ ./$(DEPDIR)/scal.Po ./$(DEPDIR)/sched_ctx_hierarchy.Po \ ./$(DEPDIR)/sched_ctx_list.Po \ ./$(DEPDIR)/sched_ctx_policy_data.Po ./$(DEPDIR)/scratch.Po \ ./$(DEPDIR)/scratch_opencl.Po ./$(DEPDIR)/scratch_reuse.Po \ ./$(DEPDIR)/simgrid-locality.Po \ ./$(DEPDIR)/simple_cpu_gpu_sched.Po ./$(DEPDIR)/simple_deps.Po \ ./$(DEPDIR)/specific_node.Po ./$(DEPDIR)/spmd_peager.Po \ ./$(DEPDIR)/starpu_barrier.Po \ ./$(DEPDIR)/starpu_create_sync_task.Po \ ./$(DEPDIR)/starpu_data_cpy.Po ./$(DEPDIR)/starpu_init.Po \ ./$(DEPDIR)/starpu_init_noworker.Po \ ./$(DEPDIR)/starpu_task_bundle.Po \ ./$(DEPDIR)/starpu_task_wait.Po \ ./$(DEPDIR)/starpu_task_wait_for_all.Po \ ./$(DEPDIR)/starpu_worker_exists.Po \ ./$(DEPDIR)/static_restartable.Po \ ./$(DEPDIR)/static_restartable_tag.Po \ ./$(DEPDIR)/static_restartable_using_initializer.Po \ ./$(DEPDIR)/subgraph_repeat.Po \ ./$(DEPDIR)/subgraph_repeat_regenerate.Po \ ./$(DEPDIR)/subgraph_repeat_regenerate_tag.Po \ ./$(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Po \ ./$(DEPDIR)/subgraph_repeat_tag.Po ./$(DEPDIR)/submit.Po \ ./$(DEPDIR)/sync_and_notify_data.Po \ ./$(DEPDIR)/sync_and_notify_data_implicit.Po \ ./$(DEPDIR)/sync_and_notify_data_opencl.Po \ ./$(DEPDIR)/sync_tasks_overhead.Po \ ./$(DEPDIR)/sync_with_data_with_mem.Po \ ./$(DEPDIR)/sync_with_data_with_mem_non_blocking.Po \ ./$(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po \ ./$(DEPDIR)/tag_get_task.Po ./$(DEPDIR)/tag_task_data_deps.Po \ ./$(DEPDIR)/tag_wait_api.Po ./$(DEPDIR)/task_01.Po \ ./$(DEPDIR)/task_02.Po ./$(DEPDIR)/task_03.Po \ ./$(DEPDIR)/task_end_dep.Po ./$(DEPDIR)/task_wait_api.Po \ ./$(DEPDIR)/task_with_multiple_time_the_same_handle.Po \ ./$(DEPDIR)/taskgroup_01.Po ./$(DEPDIR)/taskgroup_02.Po \ ./$(DEPDIR)/taskloop.Po ./$(DEPDIR)/tasks_overhead.Po \ ./$(DEPDIR)/tasks_size_overhead.Po ./$(DEPDIR)/taskwait_01.Po \ ./$(DEPDIR)/temporary_partition.Po \ ./$(DEPDIR)/temporary_partition_implicit.Po \ ./$(DEPDIR)/test_arbiter.Po ./$(DEPDIR)/test_interfaces.Po \ ./$(DEPDIR)/unpartition.Po ./$(DEPDIR)/user_base.Po \ ./$(DEPDIR)/user_interaction_implicit.Po \ ./$(DEPDIR)/valid_model.Po ./$(DEPDIR)/value_nan.Po \ ./$(DEPDIR)/variable_interface.Po \ ./$(DEPDIR)/variable_opencl.Po \ ./$(DEPDIR)/variable_parameters.Po \ ./$(DEPDIR)/variable_size.Po ./$(DEPDIR)/vector_interface.Po \ ./$(DEPDIR)/vector_opencl.Po ./$(DEPDIR)/void_interface.Po \ ./$(DEPDIR)/wait_all_regenerable_tasks.Po \ ./$(DEPDIR)/workers_cpuid.Po \ ./$(DEPDIR)/write_only_tmp_buffer.Po \ ./$(DEPDIR)/wt_broadcast.Po ./$(DEPDIR)/wt_host.Po 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/bcsr.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/deps.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_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/numa_overflow.c \ $(datawizard_partition_dep_SOURCES) \ datawizard/partition_init.c \ $(datawizard_partition_lazy_SOURCES) \ datawizard/partitioned_acquire.c \ datawizard/partitioned_initialization.c \ datawizard/readers_and_writers.c datawizard/readonly.c \ datawizard/reclaim.c datawizard/redux_acquire.c \ $(datawizard_scratch_SOURCES) datawizard/scratch_reuse.c \ 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/temporary_partition_implicit.c \ $(datawizard_test_arbiter_SOURCES) datawizard/unpartition.c \ datawizard/user_interaction_implicit.c \ datawizard/variable_parameters.c datawizard/variable_size.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_copy_to_disk.c \ disk/disk_copy_unpack.c disk/disk_pack.c disk/mem_reclaim.c \ errorcheck/invalid_blocking_calls.c errorcheck/invalid_tasks.c \ errorcheck/starpu_init_noworker.c errorcheck/workers_cpuid.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/bind.c main/callback.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/display_binding.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/hwloc_cpuset.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_insert_task_where_SOURCES) main/job.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_regenerate_tag_cycle_SOURCES) \ $(main_subgraph_repeat_tag_SOURCES) main/submit.c \ main/tag_get_task.c main/tag_task_data_deps.c \ main/tag_wait_api.c main/task_end_dep.c main/task_wait_api.c \ main/wait_all_regenerable_tasks.c \ microbenchs/async_tasks_overhead.c microbenchs/bandwidth.c \ microbenchs/display_structures_size.c \ microbenchs/local_pingpong.c microbenchs/matrix_as_vector.c \ microbenchs/parallel_dependent_homogeneous_tasks_data.c \ microbenchs/parallel_independent_heterogeneous_tasks.c \ microbenchs/parallel_independent_heterogeneous_tasks_data.c \ microbenchs/parallel_independent_homogeneous_tasks.c \ microbenchs/parallel_independent_homogeneous_tasks_data.c \ microbenchs/parallel_redux_heterogeneous_tasks_data.c \ microbenchs/parallel_redux_homogeneous_tasks_data.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 model-checking/prio_list.c \ model-checking/starpu_barrier.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_task_03_SOURCES) $(openmp_taskgroup_01_SOURCES) \ $(openmp_taskgroup_02_SOURCES) $(openmp_taskloop_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/parallel_kernels_trivial.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_ctx_sched_ctx_hierarchy_SOURCES) \ $(sched_ctx_sched_ctx_list_SOURCES) \ $(sched_ctx_sched_ctx_policy_data_SOURCES) \ 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/bcsr.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/deps.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_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 datawizard/numa_overflow.c \ $(am__datawizard_partition_dep_SOURCES_DIST) \ datawizard/partition_init.c \ $(am__datawizard_partition_lazy_SOURCES_DIST) \ datawizard/partitioned_acquire.c \ datawizard/partitioned_initialization.c \ datawizard/readers_and_writers.c datawizard/readonly.c \ datawizard/reclaim.c datawizard/redux_acquire.c \ $(am__datawizard_scratch_SOURCES_DIST) \ datawizard/scratch_reuse.c 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/temporary_partition_implicit.c \ $(datawizard_test_arbiter_SOURCES) datawizard/unpartition.c \ datawizard/user_interaction_implicit.c \ datawizard/variable_parameters.c datawizard/variable_size.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_copy_to_disk.c \ disk/disk_copy_unpack.c disk/disk_pack.c disk/mem_reclaim.c \ errorcheck/invalid_blocking_calls.c errorcheck/invalid_tasks.c \ errorcheck/starpu_init_noworker.c errorcheck/workers_cpuid.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/bind.c main/callback.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/display_binding.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/hwloc_cpuset.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 \ $(am__main_insert_task_where_SOURCES_DIST) main/job.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_regenerate_tag_cycle_SOURCES_DIST) \ $(am__main_subgraph_repeat_tag_SOURCES_DIST) main/submit.c \ main/tag_get_task.c main/tag_task_data_deps.c \ main/tag_wait_api.c main/task_end_dep.c main/task_wait_api.c \ main/wait_all_regenerable_tasks.c \ microbenchs/async_tasks_overhead.c microbenchs/bandwidth.c \ microbenchs/display_structures_size.c \ microbenchs/local_pingpong.c microbenchs/matrix_as_vector.c \ microbenchs/parallel_dependent_homogeneous_tasks_data.c \ microbenchs/parallel_independent_heterogeneous_tasks.c \ microbenchs/parallel_independent_heterogeneous_tasks_data.c \ microbenchs/parallel_independent_homogeneous_tasks.c \ microbenchs/parallel_independent_homogeneous_tasks_data.c \ microbenchs/parallel_redux_heterogeneous_tasks_data.c \ microbenchs/parallel_redux_homogeneous_tasks_data.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 model-checking/prio_list.c \ model-checking/starpu_barrier.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_task_03_SOURCES) $(openmp_taskgroup_01_SOURCES) \ $(openmp_taskgroup_02_SOURCES) $(openmp_taskloop_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/parallel_kernels_trivial.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_ctx_sched_ctx_hierarchy_SOURCES) \ $(sched_ctx_sched_ctx_list_SOURCES) \ $(sched_ctx_sched_ctx_policy_data_SOURCES) \ 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 distdir-am 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) am__EXEEXT_10 = microbenchs/parallel_independent_homogeneous_tasks.sh \ microbenchs/parallel_independent_heterogeneous_tasks.sh \ microbenchs/parallel_independent_homogeneous_tasks_data.sh \ microbenchs/parallel_independent_heterogeneous_tasks_data.sh \ microbenchs/parallel_redux_homogeneous_tasks_data.sh \ microbenchs/parallel_redux_heterogeneous_tasks_data.sh \ microbenchs/parallel_dependent_homogeneous_tasks_data.sh @STARPU_SIMGRID_TRUE@am__EXEEXT_11 = $(am__EXEEXT_10) am__EXEEXT_12 = $(am__append_3) $(am__append_9) $(am__EXEEXT_11) \ $(am__append_11) $(am__append_13) 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-mynvcc.mk $(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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CXXFLAGS = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(STARPU_COI_CPPFLAGS) $(STARPU_SCIF_CPPFLAGS) $(GLOBAL_AM_CXXFLAGS) -Wno-unused LDADD = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_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 \ main/increment_codelet.h \ overlap/overlap.sh \ datawizard/scal.h \ datawizard/mpi_like.h \ regression/profiles.in \ regression/regression.sh.in \ regression/profiles.build.only.in \ microbenchs/tasks_data_overhead.sh \ microbenchs/sync_tasks_data_overhead.sh \ microbenchs/async_tasks_data_overhead.sh \ microbenchs/tasks_size_overhead.sh \ microbenchs/tasks_size_overhead_sched.sh \ microbenchs/tasks_size_overhead_scheds.sh \ microbenchs/tasks_size_overhead.gp \ microbenchs/parallel_dependent_homogeneous_tasks_data.sh \ microbenchs/parallel_independent_heterogeneous_tasks_data.sh \ microbenchs/parallel_independent_heterogeneous_tasks.sh \ microbenchs/parallel_independent_homogeneous_tasks_data.sh \ microbenchs/parallel_independent_homogeneous_tasks.sh \ microbenchs/bandwidth_scheds.sh \ 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/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 \ model-checking/platform.xml \ model-checking/prio_list.sh \ model-checking/barrier.sh \ model-checking/starpu-mc.sh.in CLEANFILES = \ *.gcno *.gcda *.linkinfo core starpu_idle_microsec.log *.mod *.png *.output tasks.rec perfs.rec */perfs.rec */*/perfs.rec perfs2.rec bandwidth-*.dat bandwidth.gp bandwidth.eps bandwidth.svg 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/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 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # Avoid using nvcc when making a coverity build, nvcc produces millions of # lines of code which we don't want to analyze. Instead, build dumb .o files # containing empty functions. @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_ = $(V_mynvcc_$(AM_DEFAULT_VERBOSITY)) @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_0 = @echo " myNVCC " $@; @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc_1 = @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@V_mynvcc = $(V_mynvcc_$(V)) testbindir = $(libdir)/starpu/tests @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_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@LOADER_BIN2 = $(LOADER_BIN) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_TRUE@LOADER_BIN2 = $(MPI_LAUNCHER) $(LOADER_BIN) @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN2) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN2) SHELL_TESTS = $(am__append_3) $(am__append_9) $(am__append_10) \ $(am__append_11) $(am__append_13) myPROGRAMS = main/callback main/bind 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/deps \ datawizard/user_interaction_implicit \ datawizard/interfaces/copy_interfaces datawizard/numa_overflow \ datawizard/locality datawizard/variable_size \ 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 \ sched_ctx/sched_ctx_list sched_ctx/sched_ctx_policy_data \ 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/task_03 openmp/taskloop \ openmp/taskwait_01 openmp/taskgroup_01 openmp/taskgroup_02 \ openmp/array_slice_01 openmp/cuda_task_01 perfmodels/value_nan \ $(am__append_4) $(am__append_5) $(am__append_6) \ $(am__append_7) MICROBENCHS = \ microbenchs/parallel_independent_homogeneous_tasks \ microbenchs/parallel_independent_heterogeneous_tasks \ microbenchs/parallel_independent_homogeneous_tasks_data \ microbenchs/parallel_independent_heterogeneous_tasks_data \ microbenchs/parallel_redux_homogeneous_tasks_data \ microbenchs/parallel_redux_heterogeneous_tasks_data \ microbenchs/parallel_dependent_homogeneous_tasks_data examplebin_SCRIPTS = \ microbenchs/tasks_data_overhead.sh \ microbenchs/sync_tasks_data_overhead.sh \ microbenchs/async_tasks_data_overhead.sh \ microbenchs/tasks_size_overhead.gp \ microbenchs/tasks_size_overhead.sh ################################ # Simgrid Model Checking tests # ################################ @STARPU_SIMGRID_MC_TRUE@model_checking_prio_list_LDADD = @STARPU_SIMGRID_MC_TRUE@model_checking_prio_list_LDFLAGS = @STARPU_SIMGRID_MC_TRUE@model_checking_starpu_barrier_LDADD = @STARPU_SIMGRID_MC_TRUE@model_checking_starpu_barrier_LDFLAGS = #SHELL_TESTS += model-checking/barrier.sh ####################### # Source files # ####################### datawizard_acquire_release_SOURCES = datawizard/acquire_release.c \ $(am__append_14) $(am__append_15) datawizard_acquire_release2_SOURCES = datawizard/acquire_release2.c \ $(am__append_16) $(am__append_17) datawizard_scratch_SOURCES = datawizard/scratch.c $(am__append_18) \ $(am__append_19) datawizard_mpi_like_SOURCES = datawizard/mpi_like.c $(am__append_20) \ $(am__append_21) datawizard_mpi_like_async_SOURCES = datawizard/mpi_like_async.c \ $(am__append_22) $(am__append_23) datawizard_sync_and_notify_data_SOURCES = \ datawizard/sync_and_notify_data.c $(am__append_24) \ $(am__append_25) datawizard_sync_and_notify_data_implicit_SOURCES = \ datawizard/sync_and_notify_data_implicit.c $(am__append_26) \ $(am__append_27) datawizard_in_place_partition_SOURCES = \ datawizard/in_place_partition.c datawizard/scal.c \ $(am__append_28) $(am__append_29) datawizard_partition_dep_SOURCES = datawizard/partition_dep.c \ datawizard/scal.c $(am__append_30) $(am__append_31) datawizard_partition_lazy_SOURCES = datawizard/partition_lazy.c \ datawizard/scal.c $(am__append_32) $(am__append_33) datawizard_gpu_register_SOURCES = datawizard/gpu_register.c \ datawizard/scal.c $(am__append_34) $(am__append_35) datawizard_gpu_ptr_register_SOURCES = datawizard/gpu_ptr_register.c \ datawizard/scal.c $(am__append_36) $(am__append_37) 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_38) $(am__append_39) datawizard_test_arbiter_SOURCES = \ datawizard/test_arbiter.cpp main_deprecated_func_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations main_insert_task_where_SOURCES = main/insert_task_where.c \ $(am__append_40) main_subgraph_repeat_SOURCES = main/subgraph_repeat.c \ main/increment_codelet.c $(am__append_41) main_subgraph_repeat_tag_SOURCES = main/subgraph_repeat_tag.c \ main/increment_codelet.c $(am__append_42) main_subgraph_repeat_regenerate_SOURCES = \ main/subgraph_repeat_regenerate.c main/increment_codelet.c \ $(am__append_43) main_subgraph_repeat_regenerate_tag_SOURCES = \ main/subgraph_repeat_regenerate_tag.c main/increment_codelet.c \ $(am__append_44) main_subgraph_repeat_regenerate_tag_cycle_SOURCES = \ main/subgraph_repeat_regenerate_tag_cycle.c \ main/increment_codelet.c $(am__append_45) sched_ctx_sched_ctx_list_SOURCES = \ sched_ctx/sched_ctx_list.c sched_ctx_sched_ctx_policy_data_SOURCES = \ sched_ctx/sched_ctx_policy_data.c sched_ctx_sched_ctx_hierarchy_SOURCES = \ sched_ctx/sched_ctx_hierarchy.c 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_task_03_SOURCES = \ openmp/task_03.c openmp_taskloop_SOURCES = \ openmp/taskloop.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_46) \ $(am__append_47) ################## # BSCR interface # ################## datawizard_interfaces_bcsr_bcsr_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c $(am__append_48) \ $(am__append_49) ################# # COO interface # ################# datawizard_interfaces_coo_coo_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c $(am__append_50) \ $(am__append_51) ################# # CSR interface # ################# datawizard_interfaces_csr_csr_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c $(am__append_52) \ $(am__append_53) datawizard_interfaces_vector_vector_interface_SOURCES = \ datawizard/interfaces/vector/vector_interface.c \ datawizard/interfaces/test_interfaces.c $(am__append_54) \ $(am__append_55) #################### # Matrix interface # #################### datawizard_interfaces_matrix_matrix_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c \ $(am__append_56) $(am__append_57) ######################### # 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_58) $(am__append_59) 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_60) $(am__append_61) ################## # 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_62) perfmodels_regression_based_SOURCES = perfmodels/regression_based.c \ $(am__append_63) perfmodels_non_linear_regression_based_SOURCES = \ perfmodels/non_linear_regression_based.c $(am__append_64) 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 $(top_srcdir)/starpu-mynvcc.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/starpu.mk $(top_srcdir)/starpu-mynvcc.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/bcsr$(EXEEXT): $(datawizard_bcsr_OBJECTS) $(datawizard_bcsr_DEPENDENCIES) $(EXTRA_datawizard_bcsr_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/bcsr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_bcsr_OBJECTS) $(datawizard_bcsr_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/deps$(EXEEXT): $(datawizard_deps_OBJECTS) $(datawizard_deps_DEPENDENCIES) $(EXTRA_datawizard_deps_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_deps_OBJECTS) $(datawizard_deps_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/vector_cuda.$(OBJEXT): \ datawizard/interfaces/vector/$(am__dirstamp) \ datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/vector/vector_interface$(EXEEXT): $(datawizard_interfaces_vector_vector_interface_OBJECTS) $(datawizard_interfaces_vector_vector_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_vector_vector_interface_DEPENDENCIES) datawizard/interfaces/vector/$(am__dirstamp) @rm -f datawizard/interfaces/vector/vector_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_vector_vector_interface_OBJECTS) $(datawizard_interfaces_vector_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/numa_overflow$(EXEEXT): $(datawizard_numa_overflow_OBJECTS) $(datawizard_numa_overflow_DEPENDENCIES) $(EXTRA_datawizard_numa_overflow_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/numa_overflow$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_numa_overflow_OBJECTS) $(datawizard_numa_overflow_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_init$(EXEEXT): $(datawizard_partition_init_OBJECTS) $(datawizard_partition_init_DEPENDENCIES) $(EXTRA_datawizard_partition_init_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/partition_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_partition_init_OBJECTS) $(datawizard_partition_init_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/partitioned_acquire$(EXEEXT): $(datawizard_partitioned_acquire_OBJECTS) $(datawizard_partitioned_acquire_DEPENDENCIES) $(EXTRA_datawizard_partitioned_acquire_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/partitioned_acquire$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_partitioned_acquire_OBJECTS) $(datawizard_partitioned_acquire_LDADD) $(LIBS) datawizard/partitioned_initialization$(EXEEXT): $(datawizard_partitioned_initialization_OBJECTS) $(datawizard_partitioned_initialization_DEPENDENCIES) $(EXTRA_datawizard_partitioned_initialization_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/partitioned_initialization$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_partitioned_initialization_OBJECTS) $(datawizard_partitioned_initialization_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/scratch_reuse$(EXEEXT): $(datawizard_scratch_reuse_OBJECTS) $(datawizard_scratch_reuse_DEPENDENCIES) $(EXTRA_datawizard_scratch_reuse_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/scratch_reuse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_scratch_reuse_OBJECTS) $(datawizard_scratch_reuse_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/temporary_partition_implicit$(EXEEXT): $(datawizard_temporary_partition_implicit_OBJECTS) $(datawizard_temporary_partition_implicit_DEPENDENCIES) $(EXTRA_datawizard_temporary_partition_implicit_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/temporary_partition_implicit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_temporary_partition_implicit_OBJECTS) $(datawizard_temporary_partition_implicit_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/variable_size$(EXEEXT): $(datawizard_variable_size_OBJECTS) $(datawizard_variable_size_DEPENDENCIES) $(EXTRA_datawizard_variable_size_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/variable_size$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_variable_size_OBJECTS) $(datawizard_variable_size_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_copy_to_disk$(EXEEXT): $(disk_disk_copy_to_disk_OBJECTS) $(disk_disk_copy_to_disk_DEPENDENCIES) $(EXTRA_disk_disk_copy_to_disk_DEPENDENCIES) disk/$(am__dirstamp) @rm -f disk/disk_copy_to_disk$(EXEEXT) $(AM_V_CCLD)$(LINK) $(disk_disk_copy_to_disk_OBJECTS) $(disk_disk_copy_to_disk_LDADD) $(LIBS) disk/disk_copy_unpack$(EXEEXT): $(disk_disk_copy_unpack_OBJECTS) $(disk_disk_copy_unpack_DEPENDENCIES) $(EXTRA_disk_disk_copy_unpack_DEPENDENCIES) disk/$(am__dirstamp) @rm -f disk/disk_copy_unpack$(EXEEXT) $(AM_V_CCLD)$(LINK) $(disk_disk_copy_unpack_OBJECTS) $(disk_disk_copy_unpack_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) errorcheck/workers_cpuid$(EXEEXT): $(errorcheck_workers_cpuid_OBJECTS) $(errorcheck_workers_cpuid_DEPENDENCIES) $(EXTRA_errorcheck_workers_cpuid_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/workers_cpuid$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_workers_cpuid_OBJECTS) $(errorcheck_workers_cpuid_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/bind$(EXEEXT): $(main_bind_OBJECTS) $(main_bind_DEPENDENCIES) $(EXTRA_main_bind_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/bind$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_bind_OBJECTS) $(main_bind_LDADD) $(LIBS) main/callback$(EXEEXT): $(main_callback_OBJECTS) $(main_callback_DEPENDENCIES) $(EXTRA_main_callback_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/callback$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_callback_OBJECTS) $(main_callback_LDADD) $(LIBS) 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/display_binding$(EXEEXT): $(main_display_binding_OBJECTS) $(main_display_binding_DEPENDENCIES) $(EXTRA_main_display_binding_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/display_binding$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_display_binding_OBJECTS) $(main_display_binding_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/hwloc_cpuset$(EXEEXT): $(main_hwloc_cpuset_OBJECTS) $(main_hwloc_cpuset_DEPENDENCIES) $(EXTRA_main_hwloc_cpuset_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/hwloc_cpuset$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_hwloc_cpuset_OBJECTS) $(main_hwloc_cpuset_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/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) main/$(DEPDIR) @: > main/$(DEPDIR)/$(am__dirstamp) main/increment.$(OBJEXT): main/$(am__dirstamp) \ main/$(DEPDIR)/$(am__dirstamp) main/insert_task_where$(EXEEXT): $(main_insert_task_where_OBJECTS) $(main_insert_task_where_DEPENDENCIES) $(EXTRA_main_insert_task_where_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_where$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_where_OBJECTS) $(main_insert_task_where_LDADD) $(LIBS) main/job$(EXEEXT): $(main_job_OBJECTS) $(main_job_DEPENDENCIES) $(EXTRA_main_job_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/job$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_job_OBJECTS) $(main_job_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/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_regenerate_tag_cycle$(EXEEXT): $(main_subgraph_repeat_regenerate_tag_cycle_OBJECTS) $(main_subgraph_repeat_regenerate_tag_cycle_DEPENDENCIES) $(EXTRA_main_subgraph_repeat_regenerate_tag_cycle_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/subgraph_repeat_regenerate_tag_cycle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_subgraph_repeat_regenerate_tag_cycle_OBJECTS) $(main_subgraph_repeat_regenerate_tag_cycle_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_get_task$(EXEEXT): $(main_tag_get_task_OBJECTS) $(main_tag_get_task_DEPENDENCIES) $(EXTRA_main_tag_get_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/tag_get_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_tag_get_task_OBJECTS) $(main_tag_get_task_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_end_dep$(EXEEXT): $(main_task_end_dep_OBJECTS) $(main_task_end_dep_DEPENDENCIES) $(EXTRA_main_task_end_dep_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/task_end_dep$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_task_end_dep_OBJECTS) $(main_task_end_dep_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/bandwidth$(EXEEXT): $(microbenchs_bandwidth_OBJECTS) $(microbenchs_bandwidth_DEPENDENCIES) $(EXTRA_microbenchs_bandwidth_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/bandwidth$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_bandwidth_OBJECTS) $(microbenchs_bandwidth_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/parallel_dependent_homogeneous_tasks_data$(EXEEXT): $(microbenchs_parallel_dependent_homogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_dependent_homogeneous_tasks_data_DEPENDENCIES) $(EXTRA_microbenchs_parallel_dependent_homogeneous_tasks_data_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_dependent_homogeneous_tasks_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_dependent_homogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_dependent_homogeneous_tasks_data_LDADD) $(LIBS) microbenchs/parallel_independent_heterogeneous_tasks$(EXEEXT): $(microbenchs_parallel_independent_heterogeneous_tasks_OBJECTS) $(microbenchs_parallel_independent_heterogeneous_tasks_DEPENDENCIES) $(EXTRA_microbenchs_parallel_independent_heterogeneous_tasks_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_independent_heterogeneous_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_independent_heterogeneous_tasks_OBJECTS) $(microbenchs_parallel_independent_heterogeneous_tasks_LDADD) $(LIBS) microbenchs/parallel_independent_heterogeneous_tasks_data$(EXEEXT): $(microbenchs_parallel_independent_heterogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_independent_heterogeneous_tasks_data_DEPENDENCIES) $(EXTRA_microbenchs_parallel_independent_heterogeneous_tasks_data_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_independent_heterogeneous_tasks_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_independent_heterogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_independent_heterogeneous_tasks_data_LDADD) $(LIBS) microbenchs/parallel_independent_homogeneous_tasks$(EXEEXT): $(microbenchs_parallel_independent_homogeneous_tasks_OBJECTS) $(microbenchs_parallel_independent_homogeneous_tasks_DEPENDENCIES) $(EXTRA_microbenchs_parallel_independent_homogeneous_tasks_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_independent_homogeneous_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_independent_homogeneous_tasks_OBJECTS) $(microbenchs_parallel_independent_homogeneous_tasks_LDADD) $(LIBS) microbenchs/parallel_independent_homogeneous_tasks_data$(EXEEXT): $(microbenchs_parallel_independent_homogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_independent_homogeneous_tasks_data_DEPENDENCIES) $(EXTRA_microbenchs_parallel_independent_homogeneous_tasks_data_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_independent_homogeneous_tasks_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_independent_homogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_independent_homogeneous_tasks_data_LDADD) $(LIBS) microbenchs/parallel_redux_heterogeneous_tasks_data$(EXEEXT): $(microbenchs_parallel_redux_heterogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_redux_heterogeneous_tasks_data_DEPENDENCIES) $(EXTRA_microbenchs_parallel_redux_heterogeneous_tasks_data_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_redux_heterogeneous_tasks_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_redux_heterogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_redux_heterogeneous_tasks_data_LDADD) $(LIBS) microbenchs/parallel_redux_homogeneous_tasks_data$(EXEEXT): $(microbenchs_parallel_redux_homogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_redux_homogeneous_tasks_data_DEPENDENCIES) $(EXTRA_microbenchs_parallel_redux_homogeneous_tasks_data_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/parallel_redux_homogeneous_tasks_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_parallel_redux_homogeneous_tasks_data_OBJECTS) $(microbenchs_parallel_redux_homogeneous_tasks_data_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) model-checking/$(am__dirstamp): @$(MKDIR_P) model-checking @: > model-checking/$(am__dirstamp) model-checking/prio_list$(EXEEXT): $(model_checking_prio_list_OBJECTS) $(model_checking_prio_list_DEPENDENCIES) $(EXTRA_model_checking_prio_list_DEPENDENCIES) model-checking/$(am__dirstamp) @rm -f model-checking/prio_list$(EXEEXT) $(AM_V_CCLD)$(model_checking_prio_list_LINK) $(model_checking_prio_list_OBJECTS) $(model_checking_prio_list_LDADD) $(LIBS) model-checking/starpu_barrier$(EXEEXT): $(model_checking_starpu_barrier_OBJECTS) $(model_checking_starpu_barrier_DEPENDENCIES) $(EXTRA_model_checking_starpu_barrier_DEPENDENCIES) model-checking/$(am__dirstamp) @rm -f model-checking/starpu_barrier$(EXEEXT) $(AM_V_CCLD)$(model_checking_starpu_barrier_LINK) $(model_checking_starpu_barrier_OBJECTS) $(model_checking_starpu_barrier_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/task_03$(EXEEXT): $(openmp_task_03_OBJECTS) $(openmp_task_03_DEPENDENCIES) $(EXTRA_openmp_task_03_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/task_03$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_task_03_OBJECTS) $(openmp_task_03_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/taskloop$(EXEEXT): $(openmp_taskloop_OBJECTS) $(openmp_taskloop_DEPENDENCIES) $(EXTRA_openmp_taskloop_DEPENDENCIES) openmp/$(am__dirstamp) @rm -f openmp/taskloop$(EXEEXT) $(AM_V_CCLD)$(LINK) $(openmp_taskloop_OBJECTS) $(openmp_taskloop_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/parallel_kernels_trivial$(EXEEXT): $(parallel_tasks_parallel_kernels_trivial_OBJECTS) $(parallel_tasks_parallel_kernels_trivial_DEPENDENCIES) $(EXTRA_parallel_tasks_parallel_kernels_trivial_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/parallel_kernels_trivial$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_parallel_kernels_trivial_OBJECTS) $(parallel_tasks_parallel_kernels_trivial_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_ctx/$(am__dirstamp): @$(MKDIR_P) sched_ctx @: > sched_ctx/$(am__dirstamp) sched_ctx/sched_ctx_hierarchy$(EXEEXT): $(sched_ctx_sched_ctx_hierarchy_OBJECTS) $(sched_ctx_sched_ctx_hierarchy_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_hierarchy_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_hierarchy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_hierarchy_OBJECTS) $(sched_ctx_sched_ctx_hierarchy_LDADD) $(LIBS) sched_ctx/sched_ctx_list$(EXEEXT): $(sched_ctx_sched_ctx_list_OBJECTS) $(sched_ctx_sched_ctx_list_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_list_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_list$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_list_OBJECTS) $(sched_ctx_sched_ctx_list_LDADD) $(LIBS) sched_ctx/sched_ctx_policy_data$(EXEEXT): $(sched_ctx_sched_ctx_policy_data_OBJECTS) $(sched_ctx_sched_ctx_policy_data_DEPENDENCIES) $(EXTRA_sched_ctx_sched_ctx_policy_data_DEPENDENCIES) sched_ctx/$(am__dirstamp) @rm -f sched_ctx/sched_ctx_policy_data$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_ctx_sched_ctx_policy_data_OBJECTS) $(sched_ctx_sched_ctx_policy_data_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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_cb_insert.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_try.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/api_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array_slice_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async_tasks_overhead.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bandwidth.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bind.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codelet_null_callback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commute.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commute2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy_interfaces.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/critical_section_with_void_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cublas_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cuda_only.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cuda_task_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cusparse_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_implicit_deps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_invalidation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_locality.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_lookup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_after_submission.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_after_submission_synchronous.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_in_callback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deploop.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dining_philosophers.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_compute.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_copy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_copy_to_disk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_copy_unpack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_pack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_binding.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_structures_size.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/double_parameter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsm_stress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_chain.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_sync_point.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_sync_point_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/environment.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_all_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_on_a_specific_worker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_on_all.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_schedule.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explicit_combined_worker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feed.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_children_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_current_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_concurrency.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_ptr_register.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_register.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handle_to_pointer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hwloc_cpuset.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/in_place_partition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_codelet.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux_lazy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux_v2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_exit_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_exit_02.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_run_deinit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_array.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_dyn_handles.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_many.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_nullcodelet.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_pack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_value.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_where.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalid_blocking_calls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalid_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalidate_pending_requests.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lazy_allocation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lazy_unregister.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/local_pingpong.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/locality.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_deprecated_func-deprecated_func.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/manual_reduction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_as_vector.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem_reclaim.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdtemp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_like.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_like_async.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_cuda_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_data_release.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_handle_conversion.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_worker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multithreaded.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multithreaded_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/no_unregister.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/non_linear_regression_based.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/noreclaim.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nowhere.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/numa_overflow.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl_codelet_unsigned_inc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl_memset.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overlap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_02.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_03.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_barrier_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_inline_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_named_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_critical_named_inline_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_for_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_for_02.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_for_ordered_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_independent_heterogeneous_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_independent_homogeneous_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_independent_homogeneous_tasks_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels_spmd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels_trivial.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_master_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_master_inline_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_nested_lock_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_redux_homogeneous_tasks_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_sections_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_sections_combined_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_simple_lock_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_copyprivate_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_copyprivate_inline_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_inline_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_nowait_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_single_wait_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_dep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_lazy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partitioned_acquire.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partitioned_initialization.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause_resume.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pinned_memory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefetch_data_on_node.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prio_list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readers_and_writers.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readonly.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reclaim.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redundant_buffer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redux_acquire.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenerate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenerate_pipeline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regression_based.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/restart.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_driver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/same_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scal.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_hierarchy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_policy_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch_reuse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simgrid-locality.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_cpu_gpu_sched.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_deps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/specific_node.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmd_peager.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_barrier.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_create_sync_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_data_cpy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_init_noworker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_bundle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_wait.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_wait_for_all.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_worker_exists.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable_using_initializer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_tag.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_tasks_overhead.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem_non_blocking.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_get_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_task_data_deps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_wait_api.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_02.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_03.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_end_dep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_wait_api.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_with_multiple_time_the_same_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskgroup_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskgroup_02.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskloop.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks_overhead.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks_size_overhead.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taskwait_01.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/temporary_partition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/temporary_partition_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_arbiter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_interfaces.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unpartition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_interaction_implicit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/valid_model.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/value_nan.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_parameters.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_size.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_opencl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/void_interface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait_all_regenerable_tasks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/workers_cpuid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_only_tmp_buffer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wt_broadcast.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wt_host.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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` bcsr.o: datawizard/bcsr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr.o -MD -MP -MF $(DEPDIR)/bcsr.Tpo -c -o bcsr.o `test -f 'datawizard/bcsr.c' || echo '$(srcdir)/'`datawizard/bcsr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr.Tpo $(DEPDIR)/bcsr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/bcsr.c' object='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 bcsr.o `test -f 'datawizard/bcsr.c' || echo '$(srcdir)/'`datawizard/bcsr.c bcsr.obj: datawizard/bcsr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr.obj -MD -MP -MF $(DEPDIR)/bcsr.Tpo -c -o bcsr.obj `if test -f 'datawizard/bcsr.c'; then $(CYGPATH_W) 'datawizard/bcsr.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/bcsr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr.Tpo $(DEPDIR)/bcsr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/bcsr.c' object='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 bcsr.obj `if test -f 'datawizard/bcsr.c'; then $(CYGPATH_W) 'datawizard/bcsr.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/bcsr.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` deps.o: datawizard/deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT deps.o -MD -MP -MF $(DEPDIR)/deps.Tpo -c -o deps.o `test -f 'datawizard/deps.c' || echo '$(srcdir)/'`datawizard/deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/deps.Tpo $(DEPDIR)/deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/deps.c' object='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 deps.o `test -f 'datawizard/deps.c' || echo '$(srcdir)/'`datawizard/deps.c deps.obj: datawizard/deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT deps.obj -MD -MP -MF $(DEPDIR)/deps.Tpo -c -o deps.obj `if test -f 'datawizard/deps.c'; then $(CYGPATH_W) 'datawizard/deps.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/deps.Tpo $(DEPDIR)/deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/deps.c' object='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 deps.obj `if test -f 'datawizard/deps.c'; then $(CYGPATH_W) 'datawizard/deps.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/deps.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` vector_interface.o: datawizard/interfaces/vector/vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_interface.o -MD -MP -MF $(DEPDIR)/vector_interface.Tpo -c -o vector_interface.o `test -f 'datawizard/interfaces/vector/vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_interface.Tpo $(DEPDIR)/vector_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/vector_interface.c' object='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 vector_interface.o `test -f 'datawizard/interfaces/vector/vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/vector_interface.c vector_interface.obj: datawizard/interfaces/vector/vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_interface.obj -MD -MP -MF $(DEPDIR)/vector_interface.Tpo -c -o vector_interface.obj `if test -f 'datawizard/interfaces/vector/vector_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/vector_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/vector_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_interface.Tpo $(DEPDIR)/vector_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/vector_interface.c' object='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 vector_interface.obj `if test -f 'datawizard/interfaces/vector/vector_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/vector_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/vector_interface.c'; fi` vector_opencl.o: datawizard/interfaces/vector/vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_opencl.o -MD -MP -MF $(DEPDIR)/vector_opencl.Tpo -c -o vector_opencl.o `test -f 'datawizard/interfaces/vector/vector_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_opencl.Tpo $(DEPDIR)/vector_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/vector_opencl.c' object='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 vector_opencl.o `test -f 'datawizard/interfaces/vector/vector_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/vector_opencl.c vector_opencl.obj: datawizard/interfaces/vector/vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_opencl.obj -MD -MP -MF $(DEPDIR)/vector_opencl.Tpo -c -o vector_opencl.obj `if test -f 'datawizard/interfaces/vector/vector_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/vector_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/vector_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vector_opencl.Tpo $(DEPDIR)/vector_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/vector_opencl.c' object='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 vector_opencl.obj `if test -f 'datawizard/interfaces/vector/vector_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/vector_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/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` numa_overflow.o: datawizard/numa_overflow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT numa_overflow.o -MD -MP -MF $(DEPDIR)/numa_overflow.Tpo -c -o numa_overflow.o `test -f 'datawizard/numa_overflow.c' || echo '$(srcdir)/'`datawizard/numa_overflow.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/numa_overflow.Tpo $(DEPDIR)/numa_overflow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/numa_overflow.c' object='numa_overflow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o numa_overflow.o `test -f 'datawizard/numa_overflow.c' || echo '$(srcdir)/'`datawizard/numa_overflow.c numa_overflow.obj: datawizard/numa_overflow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT numa_overflow.obj -MD -MP -MF $(DEPDIR)/numa_overflow.Tpo -c -o numa_overflow.obj `if test -f 'datawizard/numa_overflow.c'; then $(CYGPATH_W) 'datawizard/numa_overflow.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/numa_overflow.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/numa_overflow.Tpo $(DEPDIR)/numa_overflow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/numa_overflow.c' object='numa_overflow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o numa_overflow.obj `if test -f 'datawizard/numa_overflow.c'; then $(CYGPATH_W) 'datawizard/numa_overflow.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/numa_overflow.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_init.o: datawizard/partition_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_init.o -MD -MP -MF $(DEPDIR)/partition_init.Tpo -c -o partition_init.o `test -f 'datawizard/partition_init.c' || echo '$(srcdir)/'`datawizard/partition_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_init.Tpo $(DEPDIR)/partition_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_init.c' object='partition_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 partition_init.o `test -f 'datawizard/partition_init.c' || echo '$(srcdir)/'`datawizard/partition_init.c partition_init.obj: datawizard/partition_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_init.obj -MD -MP -MF $(DEPDIR)/partition_init.Tpo -c -o partition_init.obj `if test -f 'datawizard/partition_init.c'; then $(CYGPATH_W) 'datawizard/partition_init.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_init.Tpo $(DEPDIR)/partition_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_init.c' object='partition_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 partition_init.obj `if test -f 'datawizard/partition_init.c'; then $(CYGPATH_W) 'datawizard/partition_init.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_init.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` partitioned_acquire.o: datawizard/partitioned_acquire.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partitioned_acquire.o -MD -MP -MF $(DEPDIR)/partitioned_acquire.Tpo -c -o partitioned_acquire.o `test -f 'datawizard/partitioned_acquire.c' || echo '$(srcdir)/'`datawizard/partitioned_acquire.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partitioned_acquire.Tpo $(DEPDIR)/partitioned_acquire.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partitioned_acquire.c' object='partitioned_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 partitioned_acquire.o `test -f 'datawizard/partitioned_acquire.c' || echo '$(srcdir)/'`datawizard/partitioned_acquire.c partitioned_acquire.obj: datawizard/partitioned_acquire.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partitioned_acquire.obj -MD -MP -MF $(DEPDIR)/partitioned_acquire.Tpo -c -o partitioned_acquire.obj `if test -f 'datawizard/partitioned_acquire.c'; then $(CYGPATH_W) 'datawizard/partitioned_acquire.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partitioned_acquire.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partitioned_acquire.Tpo $(DEPDIR)/partitioned_acquire.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partitioned_acquire.c' object='partitioned_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 partitioned_acquire.obj `if test -f 'datawizard/partitioned_acquire.c'; then $(CYGPATH_W) 'datawizard/partitioned_acquire.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partitioned_acquire.c'; fi` partitioned_initialization.o: datawizard/partitioned_initialization.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partitioned_initialization.o -MD -MP -MF $(DEPDIR)/partitioned_initialization.Tpo -c -o partitioned_initialization.o `test -f 'datawizard/partitioned_initialization.c' || echo '$(srcdir)/'`datawizard/partitioned_initialization.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partitioned_initialization.Tpo $(DEPDIR)/partitioned_initialization.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partitioned_initialization.c' object='partitioned_initialization.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partitioned_initialization.o `test -f 'datawizard/partitioned_initialization.c' || echo '$(srcdir)/'`datawizard/partitioned_initialization.c partitioned_initialization.obj: datawizard/partitioned_initialization.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partitioned_initialization.obj -MD -MP -MF $(DEPDIR)/partitioned_initialization.Tpo -c -o partitioned_initialization.obj `if test -f 'datawizard/partitioned_initialization.c'; then $(CYGPATH_W) 'datawizard/partitioned_initialization.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partitioned_initialization.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partitioned_initialization.Tpo $(DEPDIR)/partitioned_initialization.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partitioned_initialization.c' object='partitioned_initialization.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partitioned_initialization.obj `if test -f 'datawizard/partitioned_initialization.c'; then $(CYGPATH_W) 'datawizard/partitioned_initialization.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partitioned_initialization.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` scratch_reuse.o: datawizard/scratch_reuse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scratch_reuse.o -MD -MP -MF $(DEPDIR)/scratch_reuse.Tpo -c -o scratch_reuse.o `test -f 'datawizard/scratch_reuse.c' || echo '$(srcdir)/'`datawizard/scratch_reuse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scratch_reuse.Tpo $(DEPDIR)/scratch_reuse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scratch_reuse.c' object='scratch_reuse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_reuse.o `test -f 'datawizard/scratch_reuse.c' || echo '$(srcdir)/'`datawizard/scratch_reuse.c scratch_reuse.obj: datawizard/scratch_reuse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scratch_reuse.obj -MD -MP -MF $(DEPDIR)/scratch_reuse.Tpo -c -o scratch_reuse.obj `if test -f 'datawizard/scratch_reuse.c'; then $(CYGPATH_W) 'datawizard/scratch_reuse.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scratch_reuse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scratch_reuse.Tpo $(DEPDIR)/scratch_reuse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scratch_reuse.c' object='scratch_reuse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_reuse.obj `if test -f 'datawizard/scratch_reuse.c'; then $(CYGPATH_W) 'datawizard/scratch_reuse.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scratch_reuse.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` temporary_partition_implicit.o: datawizard/temporary_partition_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT temporary_partition_implicit.o -MD -MP -MF $(DEPDIR)/temporary_partition_implicit.Tpo -c -o temporary_partition_implicit.o `test -f 'datawizard/temporary_partition_implicit.c' || echo '$(srcdir)/'`datawizard/temporary_partition_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/temporary_partition_implicit.Tpo $(DEPDIR)/temporary_partition_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/temporary_partition_implicit.c' object='temporary_partition_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 temporary_partition_implicit.o `test -f 'datawizard/temporary_partition_implicit.c' || echo '$(srcdir)/'`datawizard/temporary_partition_implicit.c temporary_partition_implicit.obj: datawizard/temporary_partition_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT temporary_partition_implicit.obj -MD -MP -MF $(DEPDIR)/temporary_partition_implicit.Tpo -c -o temporary_partition_implicit.obj `if test -f 'datawizard/temporary_partition_implicit.c'; then $(CYGPATH_W) 'datawizard/temporary_partition_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/temporary_partition_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/temporary_partition_implicit.Tpo $(DEPDIR)/temporary_partition_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/temporary_partition_implicit.c' object='temporary_partition_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 temporary_partition_implicit.obj `if test -f 'datawizard/temporary_partition_implicit.c'; then $(CYGPATH_W) 'datawizard/temporary_partition_implicit.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/temporary_partition_implicit.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` variable_size.o: datawizard/variable_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_size.o -MD -MP -MF $(DEPDIR)/variable_size.Tpo -c -o variable_size.o `test -f 'datawizard/variable_size.c' || echo '$(srcdir)/'`datawizard/variable_size.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_size.Tpo $(DEPDIR)/variable_size.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/variable_size.c' object='variable_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 variable_size.o `test -f 'datawizard/variable_size.c' || echo '$(srcdir)/'`datawizard/variable_size.c variable_size.obj: datawizard/variable_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_size.obj -MD -MP -MF $(DEPDIR)/variable_size.Tpo -c -o variable_size.obj `if test -f 'datawizard/variable_size.c'; then $(CYGPATH_W) 'datawizard/variable_size.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/variable_size.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_size.Tpo $(DEPDIR)/variable_size.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/variable_size.c' object='variable_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 variable_size.obj `if test -f 'datawizard/variable_size.c'; then $(CYGPATH_W) 'datawizard/variable_size.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/variable_size.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_copy_to_disk.o: disk/disk_copy_to_disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_copy_to_disk.o -MD -MP -MF $(DEPDIR)/disk_copy_to_disk.Tpo -c -o disk_copy_to_disk.o `test -f 'disk/disk_copy_to_disk.c' || echo '$(srcdir)/'`disk/disk_copy_to_disk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_copy_to_disk.Tpo $(DEPDIR)/disk_copy_to_disk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_copy_to_disk.c' object='disk_copy_to_disk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_to_disk.o `test -f 'disk/disk_copy_to_disk.c' || echo '$(srcdir)/'`disk/disk_copy_to_disk.c disk_copy_to_disk.obj: disk/disk_copy_to_disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_copy_to_disk.obj -MD -MP -MF $(DEPDIR)/disk_copy_to_disk.Tpo -c -o disk_copy_to_disk.obj `if test -f 'disk/disk_copy_to_disk.c'; then $(CYGPATH_W) 'disk/disk_copy_to_disk.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_copy_to_disk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_copy_to_disk.Tpo $(DEPDIR)/disk_copy_to_disk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_copy_to_disk.c' object='disk_copy_to_disk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_to_disk.obj `if test -f 'disk/disk_copy_to_disk.c'; then $(CYGPATH_W) 'disk/disk_copy_to_disk.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_copy_to_disk.c'; fi` disk_copy_unpack.o: disk/disk_copy_unpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_copy_unpack.o -MD -MP -MF $(DEPDIR)/disk_copy_unpack.Tpo -c -o disk_copy_unpack.o `test -f 'disk/disk_copy_unpack.c' || echo '$(srcdir)/'`disk/disk_copy_unpack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_copy_unpack.Tpo $(DEPDIR)/disk_copy_unpack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_copy_unpack.c' object='disk_copy_unpack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_unpack.o `test -f 'disk/disk_copy_unpack.c' || echo '$(srcdir)/'`disk/disk_copy_unpack.c disk_copy_unpack.obj: disk/disk_copy_unpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disk_copy_unpack.obj -MD -MP -MF $(DEPDIR)/disk_copy_unpack.Tpo -c -o disk_copy_unpack.obj `if test -f 'disk/disk_copy_unpack.c'; then $(CYGPATH_W) 'disk/disk_copy_unpack.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_copy_unpack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/disk_copy_unpack.Tpo $(DEPDIR)/disk_copy_unpack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='disk/disk_copy_unpack.c' object='disk_copy_unpack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_unpack.obj `if test -f 'disk/disk_copy_unpack.c'; then $(CYGPATH_W) 'disk/disk_copy_unpack.c'; else $(CYGPATH_W) '$(srcdir)/disk/disk_copy_unpack.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` workers_cpuid.o: errorcheck/workers_cpuid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT workers_cpuid.o -MD -MP -MF $(DEPDIR)/workers_cpuid.Tpo -c -o workers_cpuid.o `test -f 'errorcheck/workers_cpuid.c' || echo '$(srcdir)/'`errorcheck/workers_cpuid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/workers_cpuid.Tpo $(DEPDIR)/workers_cpuid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/workers_cpuid.c' object='workers_cpuid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o workers_cpuid.o `test -f 'errorcheck/workers_cpuid.c' || echo '$(srcdir)/'`errorcheck/workers_cpuid.c workers_cpuid.obj: errorcheck/workers_cpuid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT workers_cpuid.obj -MD -MP -MF $(DEPDIR)/workers_cpuid.Tpo -c -o workers_cpuid.obj `if test -f 'errorcheck/workers_cpuid.c'; then $(CYGPATH_W) 'errorcheck/workers_cpuid.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/workers_cpuid.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/workers_cpuid.Tpo $(DEPDIR)/workers_cpuid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/workers_cpuid.c' object='workers_cpuid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o workers_cpuid.obj `if test -f 'errorcheck/workers_cpuid.c'; then $(CYGPATH_W) 'errorcheck/workers_cpuid.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/workers_cpuid.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` bind.o: main/bind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bind.o -MD -MP -MF $(DEPDIR)/bind.Tpo -c -o bind.o `test -f 'main/bind.c' || echo '$(srcdir)/'`main/bind.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bind.Tpo $(DEPDIR)/bind.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/bind.c' object='bind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bind.o `test -f 'main/bind.c' || echo '$(srcdir)/'`main/bind.c bind.obj: main/bind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bind.obj -MD -MP -MF $(DEPDIR)/bind.Tpo -c -o bind.obj `if test -f 'main/bind.c'; then $(CYGPATH_W) 'main/bind.c'; else $(CYGPATH_W) '$(srcdir)/main/bind.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bind.Tpo $(DEPDIR)/bind.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/bind.c' object='bind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bind.obj `if test -f 'main/bind.c'; then $(CYGPATH_W) 'main/bind.c'; else $(CYGPATH_W) '$(srcdir)/main/bind.c'; fi` callback.o: main/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 'main/callback.c' || echo '$(srcdir)/'`main/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='main/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 'main/callback.c' || echo '$(srcdir)/'`main/callback.c callback.obj: main/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 'main/callback.c'; then $(CYGPATH_W) 'main/callback.c'; else $(CYGPATH_W) '$(srcdir)/main/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='main/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 'main/callback.c'; then $(CYGPATH_W) 'main/callback.c'; else $(CYGPATH_W) '$(srcdir)/main/callback.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` display_binding.o: main/display_binding.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT display_binding.o -MD -MP -MF $(DEPDIR)/display_binding.Tpo -c -o display_binding.o `test -f 'main/display_binding.c' || echo '$(srcdir)/'`main/display_binding.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/display_binding.Tpo $(DEPDIR)/display_binding.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/display_binding.c' object='display_binding.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_binding.o `test -f 'main/display_binding.c' || echo '$(srcdir)/'`main/display_binding.c display_binding.obj: main/display_binding.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT display_binding.obj -MD -MP -MF $(DEPDIR)/display_binding.Tpo -c -o display_binding.obj `if test -f 'main/display_binding.c'; then $(CYGPATH_W) 'main/display_binding.c'; else $(CYGPATH_W) '$(srcdir)/main/display_binding.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/display_binding.Tpo $(DEPDIR)/display_binding.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/display_binding.c' object='display_binding.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_binding.obj `if test -f 'main/display_binding.c'; then $(CYGPATH_W) 'main/display_binding.c'; else $(CYGPATH_W) '$(srcdir)/main/display_binding.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` hwloc_cpuset.o: main/hwloc_cpuset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hwloc_cpuset.o -MD -MP -MF $(DEPDIR)/hwloc_cpuset.Tpo -c -o hwloc_cpuset.o `test -f 'main/hwloc_cpuset.c' || echo '$(srcdir)/'`main/hwloc_cpuset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hwloc_cpuset.Tpo $(DEPDIR)/hwloc_cpuset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/hwloc_cpuset.c' object='hwloc_cpuset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hwloc_cpuset.o `test -f 'main/hwloc_cpuset.c' || echo '$(srcdir)/'`main/hwloc_cpuset.c hwloc_cpuset.obj: main/hwloc_cpuset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hwloc_cpuset.obj -MD -MP -MF $(DEPDIR)/hwloc_cpuset.Tpo -c -o hwloc_cpuset.obj `if test -f 'main/hwloc_cpuset.c'; then $(CYGPATH_W) 'main/hwloc_cpuset.c'; else $(CYGPATH_W) '$(srcdir)/main/hwloc_cpuset.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hwloc_cpuset.Tpo $(DEPDIR)/hwloc_cpuset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/hwloc_cpuset.c' object='hwloc_cpuset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hwloc_cpuset.obj `if test -f 'main/hwloc_cpuset.c'; then $(CYGPATH_W) 'main/hwloc_cpuset.c'; else $(CYGPATH_W) '$(srcdir)/main/hwloc_cpuset.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` insert_task_where.o: main/insert_task_where.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_where.o -MD -MP -MF $(DEPDIR)/insert_task_where.Tpo -c -o insert_task_where.o `test -f 'main/insert_task_where.c' || echo '$(srcdir)/'`main/insert_task_where.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_where.Tpo $(DEPDIR)/insert_task_where.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_where.c' object='insert_task_where.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_where.o `test -f 'main/insert_task_where.c' || echo '$(srcdir)/'`main/insert_task_where.c insert_task_where.obj: main/insert_task_where.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_where.obj -MD -MP -MF $(DEPDIR)/insert_task_where.Tpo -c -o insert_task_where.obj `if test -f 'main/insert_task_where.c'; then $(CYGPATH_W) 'main/insert_task_where.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_where.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_where.Tpo $(DEPDIR)/insert_task_where.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_where.c' object='insert_task_where.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_where.obj `if test -f 'main/insert_task_where.c'; then $(CYGPATH_W) 'main/insert_task_where.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_where.c'; fi` job.o: main/job.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT job.o -MD -MP -MF $(DEPDIR)/job.Tpo -c -o job.o `test -f 'main/job.c' || echo '$(srcdir)/'`main/job.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/job.Tpo $(DEPDIR)/job.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/job.c' object='job.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o job.o `test -f 'main/job.c' || echo '$(srcdir)/'`main/job.c job.obj: main/job.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT job.obj -MD -MP -MF $(DEPDIR)/job.Tpo -c -o job.obj `if test -f 'main/job.c'; then $(CYGPATH_W) 'main/job.c'; else $(CYGPATH_W) '$(srcdir)/main/job.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/job.Tpo $(DEPDIR)/job.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/job.c' object='job.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o job.obj `if test -f 'main/job.c'; then $(CYGPATH_W) 'main/job.c'; else $(CYGPATH_W) '$(srcdir)/main/job.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` increment_codelet.o: main/increment_codelet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_codelet.o -MD -MP -MF $(DEPDIR)/increment_codelet.Tpo -c -o increment_codelet.o `test -f 'main/increment_codelet.c' || echo '$(srcdir)/'`main/increment_codelet.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_codelet.Tpo $(DEPDIR)/increment_codelet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/increment_codelet.c' object='increment_codelet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_codelet.o `test -f 'main/increment_codelet.c' || echo '$(srcdir)/'`main/increment_codelet.c increment_codelet.obj: main/increment_codelet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_codelet.obj -MD -MP -MF $(DEPDIR)/increment_codelet.Tpo -c -o increment_codelet.obj `if test -f 'main/increment_codelet.c'; then $(CYGPATH_W) 'main/increment_codelet.c'; else $(CYGPATH_W) '$(srcdir)/main/increment_codelet.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_codelet.Tpo $(DEPDIR)/increment_codelet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/increment_codelet.c' object='increment_codelet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_codelet.obj `if test -f 'main/increment_codelet.c'; then $(CYGPATH_W) 'main/increment_codelet.c'; else $(CYGPATH_W) '$(srcdir)/main/increment_codelet.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_regenerate_tag_cycle.o: main/subgraph_repeat_regenerate_tag_cycle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate_tag_cycle.o -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Tpo -c -o subgraph_repeat_regenerate_tag_cycle.o `test -f 'main/subgraph_repeat_regenerate_tag_cycle.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate_tag_cycle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Tpo $(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate_tag_cycle.c' object='subgraph_repeat_regenerate_tag_cycle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_cycle.o `test -f 'main/subgraph_repeat_regenerate_tag_cycle.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate_tag_cycle.c subgraph_repeat_regenerate_tag_cycle.obj: main/subgraph_repeat_regenerate_tag_cycle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate_tag_cycle.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Tpo -c -o subgraph_repeat_regenerate_tag_cycle.obj `if test -f 'main/subgraph_repeat_regenerate_tag_cycle.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate_tag_cycle.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate_tag_cycle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Tpo $(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate_tag_cycle.c' object='subgraph_repeat_regenerate_tag_cycle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_cycle.obj `if test -f 'main/subgraph_repeat_regenerate_tag_cycle.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate_tag_cycle.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate_tag_cycle.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_get_task.o: main/tag_get_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_get_task.o -MD -MP -MF $(DEPDIR)/tag_get_task.Tpo -c -o tag_get_task.o `test -f 'main/tag_get_task.c' || echo '$(srcdir)/'`main/tag_get_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_get_task.Tpo $(DEPDIR)/tag_get_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_get_task.c' object='tag_get_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 tag_get_task.o `test -f 'main/tag_get_task.c' || echo '$(srcdir)/'`main/tag_get_task.c tag_get_task.obj: main/tag_get_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_get_task.obj -MD -MP -MF $(DEPDIR)/tag_get_task.Tpo -c -o tag_get_task.obj `if test -f 'main/tag_get_task.c'; then $(CYGPATH_W) 'main/tag_get_task.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_get_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_get_task.Tpo $(DEPDIR)/tag_get_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_get_task.c' object='tag_get_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 tag_get_task.obj `if test -f 'main/tag_get_task.c'; then $(CYGPATH_W) 'main/tag_get_task.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_get_task.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_end_dep.o: main/task_end_dep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_end_dep.o -MD -MP -MF $(DEPDIR)/task_end_dep.Tpo -c -o task_end_dep.o `test -f 'main/task_end_dep.c' || echo '$(srcdir)/'`main/task_end_dep.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_end_dep.Tpo $(DEPDIR)/task_end_dep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/task_end_dep.c' object='task_end_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 task_end_dep.o `test -f 'main/task_end_dep.c' || echo '$(srcdir)/'`main/task_end_dep.c task_end_dep.obj: main/task_end_dep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_end_dep.obj -MD -MP -MF $(DEPDIR)/task_end_dep.Tpo -c -o task_end_dep.obj `if test -f 'main/task_end_dep.c'; then $(CYGPATH_W) 'main/task_end_dep.c'; else $(CYGPATH_W) '$(srcdir)/main/task_end_dep.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_end_dep.Tpo $(DEPDIR)/task_end_dep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/task_end_dep.c' object='task_end_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 task_end_dep.obj `if test -f 'main/task_end_dep.c'; then $(CYGPATH_W) 'main/task_end_dep.c'; else $(CYGPATH_W) '$(srcdir)/main/task_end_dep.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` bandwidth.o: microbenchs/bandwidth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bandwidth.o -MD -MP -MF $(DEPDIR)/bandwidth.Tpo -c -o bandwidth.o `test -f 'microbenchs/bandwidth.c' || echo '$(srcdir)/'`microbenchs/bandwidth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bandwidth.Tpo $(DEPDIR)/bandwidth.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/bandwidth.c' object='bandwidth.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bandwidth.o `test -f 'microbenchs/bandwidth.c' || echo '$(srcdir)/'`microbenchs/bandwidth.c bandwidth.obj: microbenchs/bandwidth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bandwidth.obj -MD -MP -MF $(DEPDIR)/bandwidth.Tpo -c -o bandwidth.obj `if test -f 'microbenchs/bandwidth.c'; then $(CYGPATH_W) 'microbenchs/bandwidth.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/bandwidth.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bandwidth.Tpo $(DEPDIR)/bandwidth.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/bandwidth.c' object='bandwidth.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bandwidth.obj `if test -f 'microbenchs/bandwidth.c'; then $(CYGPATH_W) 'microbenchs/bandwidth.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/bandwidth.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` parallel_dependent_homogeneous_tasks_data.o: microbenchs/parallel_dependent_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_dependent_homogeneous_tasks_data.o -MD -MP -MF $(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Tpo -c -o parallel_dependent_homogeneous_tasks_data.o `test -f 'microbenchs/parallel_dependent_homogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_dependent_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Tpo $(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_dependent_homogeneous_tasks_data.c' object='parallel_dependent_homogeneous_tasks_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 parallel_dependent_homogeneous_tasks_data.o `test -f 'microbenchs/parallel_dependent_homogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_dependent_homogeneous_tasks_data.c parallel_dependent_homogeneous_tasks_data.obj: microbenchs/parallel_dependent_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_dependent_homogeneous_tasks_data.obj -MD -MP -MF $(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Tpo -c -o parallel_dependent_homogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_dependent_homogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_dependent_homogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_dependent_homogeneous_tasks_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Tpo $(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_dependent_homogeneous_tasks_data.c' object='parallel_dependent_homogeneous_tasks_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 parallel_dependent_homogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_dependent_homogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_dependent_homogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_dependent_homogeneous_tasks_data.c'; fi` parallel_independent_heterogeneous_tasks.o: microbenchs/parallel_independent_heterogeneous_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_heterogeneous_tasks.o -MD -MP -MF $(DEPDIR)/parallel_independent_heterogeneous_tasks.Tpo -c -o parallel_independent_heterogeneous_tasks.o `test -f 'microbenchs/parallel_independent_heterogeneous_tasks.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_heterogeneous_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_heterogeneous_tasks.Tpo $(DEPDIR)/parallel_independent_heterogeneous_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_heterogeneous_tasks.c' object='parallel_independent_heterogeneous_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 parallel_independent_heterogeneous_tasks.o `test -f 'microbenchs/parallel_independent_heterogeneous_tasks.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_heterogeneous_tasks.c parallel_independent_heterogeneous_tasks.obj: microbenchs/parallel_independent_heterogeneous_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_heterogeneous_tasks.obj -MD -MP -MF $(DEPDIR)/parallel_independent_heterogeneous_tasks.Tpo -c -o parallel_independent_heterogeneous_tasks.obj `if test -f 'microbenchs/parallel_independent_heterogeneous_tasks.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_heterogeneous_tasks.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_heterogeneous_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_heterogeneous_tasks.Tpo $(DEPDIR)/parallel_independent_heterogeneous_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_heterogeneous_tasks.c' object='parallel_independent_heterogeneous_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 parallel_independent_heterogeneous_tasks.obj `if test -f 'microbenchs/parallel_independent_heterogeneous_tasks.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_heterogeneous_tasks.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_heterogeneous_tasks.c'; fi` parallel_independent_heterogeneous_tasks_data.o: microbenchs/parallel_independent_heterogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_heterogeneous_tasks_data.o -MD -MP -MF $(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Tpo -c -o parallel_independent_heterogeneous_tasks_data.o `test -f 'microbenchs/parallel_independent_heterogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_heterogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Tpo $(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_heterogeneous_tasks_data.c' object='parallel_independent_heterogeneous_tasks_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 parallel_independent_heterogeneous_tasks_data.o `test -f 'microbenchs/parallel_independent_heterogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_heterogeneous_tasks_data.c parallel_independent_heterogeneous_tasks_data.obj: microbenchs/parallel_independent_heterogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_heterogeneous_tasks_data.obj -MD -MP -MF $(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Tpo -c -o parallel_independent_heterogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_independent_heterogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_heterogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_heterogeneous_tasks_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Tpo $(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_heterogeneous_tasks_data.c' object='parallel_independent_heterogeneous_tasks_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 parallel_independent_heterogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_independent_heterogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_heterogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_heterogeneous_tasks_data.c'; fi` parallel_independent_homogeneous_tasks.o: microbenchs/parallel_independent_homogeneous_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_homogeneous_tasks.o -MD -MP -MF $(DEPDIR)/parallel_independent_homogeneous_tasks.Tpo -c -o parallel_independent_homogeneous_tasks.o `test -f 'microbenchs/parallel_independent_homogeneous_tasks.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_homogeneous_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_homogeneous_tasks.Tpo $(DEPDIR)/parallel_independent_homogeneous_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_homogeneous_tasks.c' object='parallel_independent_homogeneous_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 parallel_independent_homogeneous_tasks.o `test -f 'microbenchs/parallel_independent_homogeneous_tasks.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_homogeneous_tasks.c parallel_independent_homogeneous_tasks.obj: microbenchs/parallel_independent_homogeneous_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_homogeneous_tasks.obj -MD -MP -MF $(DEPDIR)/parallel_independent_homogeneous_tasks.Tpo -c -o parallel_independent_homogeneous_tasks.obj `if test -f 'microbenchs/parallel_independent_homogeneous_tasks.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_homogeneous_tasks.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_homogeneous_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_homogeneous_tasks.Tpo $(DEPDIR)/parallel_independent_homogeneous_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_homogeneous_tasks.c' object='parallel_independent_homogeneous_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 parallel_independent_homogeneous_tasks.obj `if test -f 'microbenchs/parallel_independent_homogeneous_tasks.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_homogeneous_tasks.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_homogeneous_tasks.c'; fi` parallel_independent_homogeneous_tasks_data.o: microbenchs/parallel_independent_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_homogeneous_tasks_data.o -MD -MP -MF $(DEPDIR)/parallel_independent_homogeneous_tasks_data.Tpo -c -o parallel_independent_homogeneous_tasks_data.o `test -f 'microbenchs/parallel_independent_homogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_homogeneous_tasks_data.Tpo $(DEPDIR)/parallel_independent_homogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_homogeneous_tasks_data.c' object='parallel_independent_homogeneous_tasks_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 parallel_independent_homogeneous_tasks_data.o `test -f 'microbenchs/parallel_independent_homogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_independent_homogeneous_tasks_data.c parallel_independent_homogeneous_tasks_data.obj: microbenchs/parallel_independent_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_independent_homogeneous_tasks_data.obj -MD -MP -MF $(DEPDIR)/parallel_independent_homogeneous_tasks_data.Tpo -c -o parallel_independent_homogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_independent_homogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_homogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_homogeneous_tasks_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_independent_homogeneous_tasks_data.Tpo $(DEPDIR)/parallel_independent_homogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_independent_homogeneous_tasks_data.c' object='parallel_independent_homogeneous_tasks_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 parallel_independent_homogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_independent_homogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_independent_homogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_independent_homogeneous_tasks_data.c'; fi` parallel_redux_heterogeneous_tasks_data.o: microbenchs/parallel_redux_heterogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_redux_heterogeneous_tasks_data.o -MD -MP -MF $(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Tpo -c -o parallel_redux_heterogeneous_tasks_data.o `test -f 'microbenchs/parallel_redux_heterogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_redux_heterogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Tpo $(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_redux_heterogeneous_tasks_data.c' object='parallel_redux_heterogeneous_tasks_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 parallel_redux_heterogeneous_tasks_data.o `test -f 'microbenchs/parallel_redux_heterogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_redux_heterogeneous_tasks_data.c parallel_redux_heterogeneous_tasks_data.obj: microbenchs/parallel_redux_heterogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_redux_heterogeneous_tasks_data.obj -MD -MP -MF $(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Tpo -c -o parallel_redux_heterogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_redux_heterogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_redux_heterogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_redux_heterogeneous_tasks_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Tpo $(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_redux_heterogeneous_tasks_data.c' object='parallel_redux_heterogeneous_tasks_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 parallel_redux_heterogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_redux_heterogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_redux_heterogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_redux_heterogeneous_tasks_data.c'; fi` parallel_redux_homogeneous_tasks_data.o: microbenchs/parallel_redux_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_redux_homogeneous_tasks_data.o -MD -MP -MF $(DEPDIR)/parallel_redux_homogeneous_tasks_data.Tpo -c -o parallel_redux_homogeneous_tasks_data.o `test -f 'microbenchs/parallel_redux_homogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_redux_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_redux_homogeneous_tasks_data.Tpo $(DEPDIR)/parallel_redux_homogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_redux_homogeneous_tasks_data.c' object='parallel_redux_homogeneous_tasks_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 parallel_redux_homogeneous_tasks_data.o `test -f 'microbenchs/parallel_redux_homogeneous_tasks_data.c' || echo '$(srcdir)/'`microbenchs/parallel_redux_homogeneous_tasks_data.c parallel_redux_homogeneous_tasks_data.obj: microbenchs/parallel_redux_homogeneous_tasks_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_redux_homogeneous_tasks_data.obj -MD -MP -MF $(DEPDIR)/parallel_redux_homogeneous_tasks_data.Tpo -c -o parallel_redux_homogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_redux_homogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_redux_homogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_redux_homogeneous_tasks_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_redux_homogeneous_tasks_data.Tpo $(DEPDIR)/parallel_redux_homogeneous_tasks_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/parallel_redux_homogeneous_tasks_data.c' object='parallel_redux_homogeneous_tasks_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 parallel_redux_homogeneous_tasks_data.obj `if test -f 'microbenchs/parallel_redux_homogeneous_tasks_data.c'; then $(CYGPATH_W) 'microbenchs/parallel_redux_homogeneous_tasks_data.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/parallel_redux_homogeneous_tasks_data.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` prio_list.o: model-checking/prio_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio_list.o -MD -MP -MF $(DEPDIR)/prio_list.Tpo -c -o prio_list.o `test -f 'model-checking/prio_list.c' || echo '$(srcdir)/'`model-checking/prio_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio_list.Tpo $(DEPDIR)/prio_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='model-checking/prio_list.c' object='prio_list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_list.o `test -f 'model-checking/prio_list.c' || echo '$(srcdir)/'`model-checking/prio_list.c prio_list.obj: model-checking/prio_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio_list.obj -MD -MP -MF $(DEPDIR)/prio_list.Tpo -c -o prio_list.obj `if test -f 'model-checking/prio_list.c'; then $(CYGPATH_W) 'model-checking/prio_list.c'; else $(CYGPATH_W) '$(srcdir)/model-checking/prio_list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio_list.Tpo $(DEPDIR)/prio_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='model-checking/prio_list.c' object='prio_list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_list.obj `if test -f 'model-checking/prio_list.c'; then $(CYGPATH_W) 'model-checking/prio_list.c'; else $(CYGPATH_W) '$(srcdir)/model-checking/prio_list.c'; fi` starpu_barrier.o: model-checking/starpu_barrier.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_barrier.o -MD -MP -MF $(DEPDIR)/starpu_barrier.Tpo -c -o starpu_barrier.o `test -f 'model-checking/starpu_barrier.c' || echo '$(srcdir)/'`model-checking/starpu_barrier.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_barrier.Tpo $(DEPDIR)/starpu_barrier.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='model-checking/starpu_barrier.c' object='starpu_barrier.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_barrier.o `test -f 'model-checking/starpu_barrier.c' || echo '$(srcdir)/'`model-checking/starpu_barrier.c starpu_barrier.obj: model-checking/starpu_barrier.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_barrier.obj -MD -MP -MF $(DEPDIR)/starpu_barrier.Tpo -c -o starpu_barrier.obj `if test -f 'model-checking/starpu_barrier.c'; then $(CYGPATH_W) 'model-checking/starpu_barrier.c'; else $(CYGPATH_W) '$(srcdir)/model-checking/starpu_barrier.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_barrier.Tpo $(DEPDIR)/starpu_barrier.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='model-checking/starpu_barrier.c' object='starpu_barrier.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_barrier.obj `if test -f 'model-checking/starpu_barrier.c'; then $(CYGPATH_W) 'model-checking/starpu_barrier.c'; else $(CYGPATH_W) '$(srcdir)/model-checking/starpu_barrier.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` task_03.o: openmp/task_03.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_03.o -MD -MP -MF $(DEPDIR)/task_03.Tpo -c -o task_03.o `test -f 'openmp/task_03.c' || echo '$(srcdir)/'`openmp/task_03.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_03.Tpo $(DEPDIR)/task_03.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/task_03.c' object='task_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 task_03.o `test -f 'openmp/task_03.c' || echo '$(srcdir)/'`openmp/task_03.c task_03.obj: openmp/task_03.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_03.obj -MD -MP -MF $(DEPDIR)/task_03.Tpo -c -o task_03.obj `if test -f 'openmp/task_03.c'; then $(CYGPATH_W) 'openmp/task_03.c'; else $(CYGPATH_W) '$(srcdir)/openmp/task_03.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_03.Tpo $(DEPDIR)/task_03.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/task_03.c' object='task_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 task_03.obj `if test -f 'openmp/task_03.c'; then $(CYGPATH_W) 'openmp/task_03.c'; else $(CYGPATH_W) '$(srcdir)/openmp/task_03.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` taskloop.o: openmp/taskloop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskloop.o -MD -MP -MF $(DEPDIR)/taskloop.Tpo -c -o taskloop.o `test -f 'openmp/taskloop.c' || echo '$(srcdir)/'`openmp/taskloop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskloop.Tpo $(DEPDIR)/taskloop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskloop.c' object='taskloop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskloop.o `test -f 'openmp/taskloop.c' || echo '$(srcdir)/'`openmp/taskloop.c taskloop.obj: openmp/taskloop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT taskloop.obj -MD -MP -MF $(DEPDIR)/taskloop.Tpo -c -o taskloop.obj `if test -f 'openmp/taskloop.c'; then $(CYGPATH_W) 'openmp/taskloop.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskloop.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/taskloop.Tpo $(DEPDIR)/taskloop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp/taskloop.c' object='taskloop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o taskloop.obj `if test -f 'openmp/taskloop.c'; then $(CYGPATH_W) 'openmp/taskloop.c'; else $(CYGPATH_W) '$(srcdir)/openmp/taskloop.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` parallel_kernels_trivial.o: parallel_tasks/parallel_kernels_trivial.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels_trivial.o -MD -MP -MF $(DEPDIR)/parallel_kernels_trivial.Tpo -c -o parallel_kernels_trivial.o `test -f 'parallel_tasks/parallel_kernels_trivial.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels_trivial.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels_trivial.Tpo $(DEPDIR)/parallel_kernels_trivial.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels_trivial.c' object='parallel_kernels_trivial.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_trivial.o `test -f 'parallel_tasks/parallel_kernels_trivial.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels_trivial.c parallel_kernels_trivial.obj: parallel_tasks/parallel_kernels_trivial.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels_trivial.obj -MD -MP -MF $(DEPDIR)/parallel_kernels_trivial.Tpo -c -o parallel_kernels_trivial.obj `if test -f 'parallel_tasks/parallel_kernels_trivial.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels_trivial.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels_trivial.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels_trivial.Tpo $(DEPDIR)/parallel_kernels_trivial.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels_trivial.c' object='parallel_kernels_trivial.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_trivial.obj `if test -f 'parallel_tasks/parallel_kernels_trivial.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels_trivial.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels_trivial.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` sched_ctx_hierarchy.o: sched_ctx/sched_ctx_hierarchy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_hierarchy.o -MD -MP -MF $(DEPDIR)/sched_ctx_hierarchy.Tpo -c -o sched_ctx_hierarchy.o `test -f 'sched_ctx/sched_ctx_hierarchy.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_hierarchy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_hierarchy.Tpo $(DEPDIR)/sched_ctx_hierarchy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_hierarchy.c' object='sched_ctx_hierarchy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_hierarchy.o `test -f 'sched_ctx/sched_ctx_hierarchy.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_hierarchy.c sched_ctx_hierarchy.obj: sched_ctx/sched_ctx_hierarchy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_hierarchy.obj -MD -MP -MF $(DEPDIR)/sched_ctx_hierarchy.Tpo -c -o sched_ctx_hierarchy.obj `if test -f 'sched_ctx/sched_ctx_hierarchy.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_hierarchy.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_hierarchy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_hierarchy.Tpo $(DEPDIR)/sched_ctx_hierarchy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_hierarchy.c' object='sched_ctx_hierarchy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_hierarchy.obj `if test -f 'sched_ctx/sched_ctx_hierarchy.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_hierarchy.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_hierarchy.c'; fi` sched_ctx_list.o: sched_ctx/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_list.o -MD -MP -MF $(DEPDIR)/sched_ctx_list.Tpo -c -o sched_ctx_list.o `test -f 'sched_ctx/sched_ctx_list.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_list.Tpo $(DEPDIR)/sched_ctx_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_list.c' object='sched_ctx_list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_list.o `test -f 'sched_ctx/sched_ctx_list.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_list.c sched_ctx_list.obj: sched_ctx/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_list.obj -MD -MP -MF $(DEPDIR)/sched_ctx_list.Tpo -c -o sched_ctx_list.obj `if test -f 'sched_ctx/sched_ctx_list.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_list.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_list.Tpo $(DEPDIR)/sched_ctx_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_list.c' object='sched_ctx_list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(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_list.obj `if test -f 'sched_ctx/sched_ctx_list.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_list.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_list.c'; fi` sched_ctx_policy_data.o: sched_ctx/sched_ctx_policy_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_policy_data.o -MD -MP -MF $(DEPDIR)/sched_ctx_policy_data.Tpo -c -o sched_ctx_policy_data.o `test -f 'sched_ctx/sched_ctx_policy_data.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_policy_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_policy_data.Tpo $(DEPDIR)/sched_ctx_policy_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_policy_data.c' object='sched_ctx_policy_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 sched_ctx_policy_data.o `test -f 'sched_ctx/sched_ctx_policy_data.c' || echo '$(srcdir)/'`sched_ctx/sched_ctx_policy_data.c sched_ctx_policy_data.obj: sched_ctx/sched_ctx_policy_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_policy_data.obj -MD -MP -MF $(DEPDIR)/sched_ctx_policy_data.Tpo -c -o sched_ctx_policy_data.obj `if test -f 'sched_ctx/sched_ctx_policy_data.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_policy_data.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_policy_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_policy_data.Tpo $(DEPDIR)/sched_ctx_policy_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx/sched_ctx_policy_data.c' object='sched_ctx_policy_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 sched_ctx_policy_data.obj `if test -f 'sched_ctx/sched_ctx_policy_data.c'; then $(CYGPATH_W) 'sched_ctx/sched_ctx_policy_data.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx/sched_ctx_policy_data.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 model-checking/.libs model-checking/_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_ctx/.libs sched_ctx/_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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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 $$? 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) microbenchs/tasks_data_overhead.sh.log: microbenchs/tasks_data_overhead.sh @p='microbenchs/tasks_data_overhead.sh'; \ b='microbenchs/tasks_data_overhead.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) microbenchs/sync_tasks_data_overhead.sh.log: microbenchs/sync_tasks_data_overhead.sh @p='microbenchs/sync_tasks_data_overhead.sh'; \ b='microbenchs/sync_tasks_data_overhead.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) microbenchs/async_tasks_data_overhead.sh.log: microbenchs/async_tasks_data_overhead.sh @p='microbenchs/async_tasks_data_overhead.sh'; \ b='microbenchs/async_tasks_data_overhead.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) microbenchs/tasks_size_overhead_scheds.sh.log: microbenchs/tasks_size_overhead_scheds.sh @p='microbenchs/tasks_size_overhead_scheds.sh'; \ b='microbenchs/tasks_size_overhead_scheds.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) microbenchs/parallel_independent_homogeneous_tasks.sh.log: microbenchs/parallel_independent_homogeneous_tasks.sh @p='microbenchs/parallel_independent_homogeneous_tasks.sh'; \ b='microbenchs/parallel_independent_homogeneous_tasks.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) microbenchs/parallel_independent_heterogeneous_tasks.sh.log: microbenchs/parallel_independent_heterogeneous_tasks.sh @p='microbenchs/parallel_independent_heterogeneous_tasks.sh'; \ b='microbenchs/parallel_independent_heterogeneous_tasks.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) microbenchs/parallel_independent_homogeneous_tasks_data.sh.log: microbenchs/parallel_independent_homogeneous_tasks_data.sh @p='microbenchs/parallel_independent_homogeneous_tasks_data.sh'; \ b='microbenchs/parallel_independent_homogeneous_tasks_data.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) microbenchs/parallel_independent_heterogeneous_tasks_data.sh.log: microbenchs/parallel_independent_heterogeneous_tasks_data.sh @p='microbenchs/parallel_independent_heterogeneous_tasks_data.sh'; \ b='microbenchs/parallel_independent_heterogeneous_tasks_data.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) microbenchs/parallel_redux_homogeneous_tasks_data.sh.log: microbenchs/parallel_redux_homogeneous_tasks_data.sh @p='microbenchs/parallel_redux_homogeneous_tasks_data.sh'; \ b='microbenchs/parallel_redux_homogeneous_tasks_data.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) microbenchs/parallel_redux_heterogeneous_tasks_data.sh.log: microbenchs/parallel_redux_heterogeneous_tasks_data.sh @p='microbenchs/parallel_redux_heterogeneous_tasks_data.sh'; \ b='microbenchs/parallel_redux_heterogeneous_tasks_data.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) microbenchs/parallel_dependent_homogeneous_tasks_data.sh.log: microbenchs/parallel_dependent_homogeneous_tasks_data.sh @p='microbenchs/parallel_dependent_homogeneous_tasks_data.sh'; \ b='microbenchs/parallel_dependent_homogeneous_tasks_data.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) microbenchs/bandwidth_scheds.sh.log: microbenchs/bandwidth_scheds.sh @p='microbenchs/bandwidth_scheds.sh'; \ b='microbenchs/bandwidth_scheds.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) model-checking/prio_list.sh.log: model-checking/prio_list.sh @p='model-checking/prio_list.sh'; \ b='model-checking/prio_list.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) main/callback.log: main/callback$(EXEEXT) @p='main/callback$(EXEEXT)'; \ b='main/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/bind.log: main/bind$(EXEEXT) @p='main/bind$(EXEEXT)'; \ b='main/bind'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/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/deps.log: datawizard/deps$(EXEEXT) @p='datawizard/deps$(EXEEXT)'; \ b='datawizard/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/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/numa_overflow.log: datawizard/numa_overflow$(EXEEXT) @p='datawizard/numa_overflow$(EXEEXT)'; \ b='datawizard/numa_overflow'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/variable_size.log: datawizard/variable_size$(EXEEXT) @p='datawizard/variable_size$(EXEEXT)'; \ b='datawizard/variable_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) 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) sched_ctx/sched_ctx_list.log: sched_ctx/sched_ctx_list$(EXEEXT) @p='sched_ctx/sched_ctx_list$(EXEEXT)'; \ b='sched_ctx/sched_ctx_list'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_policy_data.log: sched_ctx/sched_ctx_policy_data$(EXEEXT) @p='sched_ctx/sched_ctx_policy_data$(EXEEXT)'; \ b='sched_ctx/sched_ctx_policy_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) 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/task_03.log: openmp/task_03$(EXEEXT) @p='openmp/task_03$(EXEEXT)'; \ b='openmp/task_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/taskloop.log: openmp/taskloop$(EXEEXT) @p='openmp/taskloop$(EXEEXT)'; \ b='openmp/taskloop'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) 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) 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) 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/display_binding.log: main/display_binding$(EXEEXT) @p='main/display_binding$(EXEEXT)'; \ b='main/display_binding'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/insert_task_where.log: main/insert_task_where$(EXEEXT) @p='main/insert_task_where$(EXEEXT)'; \ b='main/insert_task_where'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/job.log: main/job$(EXEEXT) @p='main/job$(EXEEXT)'; \ b='main/job'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/subgraph_repeat_regenerate_tag_cycle.log: main/subgraph_repeat_regenerate_tag_cycle$(EXEEXT) @p='main/subgraph_repeat_regenerate_tag_cycle$(EXEEXT)'; \ b='main/subgraph_repeat_regenerate_tag_cycle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/tag_get_task.log: main/tag_get_task$(EXEEXT) @p='main/tag_get_task$(EXEEXT)'; \ b='main/tag_get_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/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) main/hwloc_cpuset.log: main/hwloc_cpuset$(EXEEXT) @p='main/hwloc_cpuset$(EXEEXT)'; \ b='main/hwloc_cpuset'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_end_dep.log: main/task_end_dep$(EXEEXT) @p='main/task_end_dep$(EXEEXT)'; \ b='main/task_end_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/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/bcsr.log: datawizard/bcsr$(EXEEXT) @p='datawizard/bcsr$(EXEEXT)'; \ b='datawizard/bcsr'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/scratch_reuse.log: datawizard/scratch_reuse$(EXEEXT) @p='datawizard/scratch_reuse$(EXEEXT)'; \ b='datawizard/scratch_reuse'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/vector_interface.log: datawizard/interfaces/vector/vector_interface$(EXEEXT) @p='datawizard/interfaces/vector/vector_interface$(EXEEXT)'; \ b='datawizard/interfaces/vector/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/partition_init.log: datawizard/partition_init$(EXEEXT) @p='datawizard/partition_init$(EXEEXT)'; \ b='datawizard/partition_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/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/partitioned_initialization.log: datawizard/partitioned_initialization$(EXEEXT) @p='datawizard/partitioned_initialization$(EXEEXT)'; \ b='datawizard/partitioned_initialization'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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/partitioned_acquire.log: datawizard/partitioned_acquire$(EXEEXT) @p='datawizard/partitioned_acquire$(EXEEXT)'; \ b='datawizard/partitioned_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) datawizard/temporary_partition_implicit.log: datawizard/temporary_partition_implicit$(EXEEXT) @p='datawizard/temporary_partition_implicit$(EXEEXT)'; \ b='datawizard/temporary_partition_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/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_copy_unpack.log: disk/disk_copy_unpack$(EXEEXT) @p='disk/disk_copy_unpack$(EXEEXT)'; \ b='disk/disk_copy_unpack'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_to_disk.log: disk/disk_copy_to_disk$(EXEEXT) @p='disk/disk_copy_to_disk$(EXEEXT)'; \ b='disk/disk_copy_to_disk'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) errorcheck/workers_cpuid.log: errorcheck/workers_cpuid$(EXEEXT) @p='errorcheck/workers_cpuid$(EXEEXT)'; \ b='errorcheck/workers_cpuid'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) microbenchs/bandwidth.log: microbenchs/bandwidth$(EXEEXT) @p='microbenchs/bandwidth$(EXEEXT)'; \ b='microbenchs/bandwidth'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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_trivial.log: parallel_tasks/parallel_kernels_trivial$(EXEEXT) @p='parallel_tasks/parallel_kernels_trivial$(EXEEXT)'; \ b='parallel_tasks/parallel_kernels_trivial'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) sched_ctx/sched_ctx_hierarchy.log: sched_ctx/sched_ctx_hierarchy$(EXEEXT) @p='sched_ctx/sched_ctx_hierarchy$(EXEEXT)'; \ b='sched_ctx/sched_ctx_hierarchy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$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) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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 model-checking/$(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_ctx/$(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 -f ./$(DEPDIR)/acquire_cb.Po -rm -f ./$(DEPDIR)/acquire_cb_insert.Po -rm -f ./$(DEPDIR)/acquire_release.Po -rm -f ./$(DEPDIR)/acquire_release2.Po -rm -f ./$(DEPDIR)/acquire_release_opencl.Po -rm -f ./$(DEPDIR)/acquire_try.Po -rm -f ./$(DEPDIR)/allocate.Po -rm -f ./$(DEPDIR)/api_01.Po -rm -f ./$(DEPDIR)/array_slice_01.Po -rm -f ./$(DEPDIR)/async_tasks_overhead.Po -rm -f ./$(DEPDIR)/bandwidth.Po -rm -f ./$(DEPDIR)/bcsr.Po -rm -f ./$(DEPDIR)/bcsr_interface.Po -rm -f ./$(DEPDIR)/bcsr_opencl.Po -rm -f ./$(DEPDIR)/bind.Po -rm -f ./$(DEPDIR)/block_interface.Po -rm -f ./$(DEPDIR)/block_opencl.Po -rm -f ./$(DEPDIR)/cache.Po -rm -f ./$(DEPDIR)/callback.Po -rm -f ./$(DEPDIR)/codelet_null_callback.Po -rm -f ./$(DEPDIR)/commute.Po -rm -f ./$(DEPDIR)/commute2.Po -rm -f ./$(DEPDIR)/coo_interface.Po -rm -f ./$(DEPDIR)/coo_opencl.Po -rm -f ./$(DEPDIR)/copy.Po -rm -f ./$(DEPDIR)/copy_interfaces.Po -rm -f ./$(DEPDIR)/critical_section_with_void_interface.Po -rm -f ./$(DEPDIR)/csr_interface.Po -rm -f ./$(DEPDIR)/csr_opencl.Po -rm -f ./$(DEPDIR)/cublas_init.Po -rm -f ./$(DEPDIR)/cuda_only.Po -rm -f ./$(DEPDIR)/cuda_task_01.Po -rm -f ./$(DEPDIR)/cusparse_init.Po -rm -f ./$(DEPDIR)/data_implicit_deps.Po -rm -f ./$(DEPDIR)/data_invalidation.Po -rm -f ./$(DEPDIR)/data_locality.Po -rm -f ./$(DEPDIR)/data_lookup.Po -rm -f ./$(DEPDIR)/declare_deps_after_submission.Po -rm -f ./$(DEPDIR)/declare_deps_after_submission_synchronous.Po -rm -f ./$(DEPDIR)/declare_deps_in_callback.Po -rm -f ./$(DEPDIR)/deploop.Po -rm -f ./$(DEPDIR)/deps.Po -rm -f ./$(DEPDIR)/dining_philosophers.Po -rm -f ./$(DEPDIR)/disk_compute.Po -rm -f ./$(DEPDIR)/disk_copy.Po -rm -f ./$(DEPDIR)/disk_copy_to_disk.Po -rm -f ./$(DEPDIR)/disk_copy_unpack.Po -rm -f ./$(DEPDIR)/disk_pack.Po -rm -f ./$(DEPDIR)/display_binding.Po -rm -f ./$(DEPDIR)/display_structures_size.Po -rm -f ./$(DEPDIR)/double_parameter.Po -rm -f ./$(DEPDIR)/dsm_stress.Po -rm -f ./$(DEPDIR)/empty_task.Po -rm -f ./$(DEPDIR)/empty_task_chain.Po -rm -f ./$(DEPDIR)/empty_task_sync_point.Po -rm -f ./$(DEPDIR)/empty_task_sync_point_tasks.Po -rm -f ./$(DEPDIR)/environment.Po -rm -f ./$(DEPDIR)/execute_all_tasks.Po -rm -f ./$(DEPDIR)/execute_on_a_specific_worker.Po -rm -f ./$(DEPDIR)/execute_on_all.Po -rm -f ./$(DEPDIR)/execute_schedule.Po -rm -f ./$(DEPDIR)/explicit_combined_worker.Po -rm -f ./$(DEPDIR)/feed.Po -rm -f ./$(DEPDIR)/generic.Po -rm -f ./$(DEPDIR)/get_children_tasks.Po -rm -f ./$(DEPDIR)/get_current_task.Po -rm -f ./$(DEPDIR)/gpu_concurrency.Po -rm -f ./$(DEPDIR)/gpu_ptr_register.Po -rm -f ./$(DEPDIR)/gpu_register.Po -rm -f ./$(DEPDIR)/handle_to_pointer.Po -rm -f ./$(DEPDIR)/hwloc_cpuset.Po -rm -f ./$(DEPDIR)/in_place_partition.Po -rm -f ./$(DEPDIR)/increment_codelet.Po -rm -f ./$(DEPDIR)/increment_init.Po -rm -f ./$(DEPDIR)/increment_redux.Po -rm -f ./$(DEPDIR)/increment_redux_lazy.Po -rm -f ./$(DEPDIR)/increment_redux_v2.Po -rm -f ./$(DEPDIR)/init_exit_01.Po -rm -f ./$(DEPDIR)/init_exit_02.Po -rm -f ./$(DEPDIR)/init_run_deinit.Po -rm -f ./$(DEPDIR)/insert_task.Po -rm -f ./$(DEPDIR)/insert_task_array.Po -rm -f ./$(DEPDIR)/insert_task_dyn_handles.Po -rm -f ./$(DEPDIR)/insert_task_many.Po -rm -f ./$(DEPDIR)/insert_task_nullcodelet.Po -rm -f ./$(DEPDIR)/insert_task_pack.Po -rm -f ./$(DEPDIR)/insert_task_value.Po -rm -f ./$(DEPDIR)/insert_task_where.Po -rm -f ./$(DEPDIR)/invalid_blocking_calls.Po -rm -f ./$(DEPDIR)/invalid_tasks.Po -rm -f ./$(DEPDIR)/invalidate_pending_requests.Po -rm -f ./$(DEPDIR)/job.Po -rm -f ./$(DEPDIR)/lazy_allocation.Po -rm -f ./$(DEPDIR)/lazy_unregister.Po -rm -f ./$(DEPDIR)/loader.Po -rm -f ./$(DEPDIR)/local_pingpong.Po -rm -f ./$(DEPDIR)/locality.Po -rm -f ./$(DEPDIR)/main_deprecated_func-deprecated_func.Po -rm -f ./$(DEPDIR)/manual_reduction.Po -rm -f ./$(DEPDIR)/matrix_as_vector.Po -rm -f ./$(DEPDIR)/matrix_interface.Po -rm -f ./$(DEPDIR)/matrix_opencl.Po -rm -f ./$(DEPDIR)/mem_reclaim.Po -rm -f ./$(DEPDIR)/memory.Po -rm -f ./$(DEPDIR)/mkdtemp.Po -rm -f ./$(DEPDIR)/mpi_like.Po -rm -f ./$(DEPDIR)/mpi_like_async.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po -rm -f ./$(DEPDIR)/multiformat_cuda_opencl.Po -rm -f ./$(DEPDIR)/multiformat_data_release.Po -rm -f ./$(DEPDIR)/multiformat_handle_conversion.Po -rm -f ./$(DEPDIR)/multiformat_interface.Po -rm -f ./$(DEPDIR)/multiformat_opencl.Po -rm -f ./$(DEPDIR)/multiformat_worker.Po -rm -f ./$(DEPDIR)/multithreaded.Po -rm -f ./$(DEPDIR)/multithreaded_init.Po -rm -f ./$(DEPDIR)/no_unregister.Po -rm -f ./$(DEPDIR)/non_linear_regression_based.Po -rm -f ./$(DEPDIR)/noreclaim.Po -rm -f ./$(DEPDIR)/nowhere.Po -rm -f ./$(DEPDIR)/numa_overflow.Po -rm -f ./$(DEPDIR)/opencl_codelet_unsigned_inc.Po -rm -f ./$(DEPDIR)/opencl_memset.Po -rm -f ./$(DEPDIR)/overlap.Po -rm -f ./$(DEPDIR)/pack.Po -rm -f ./$(DEPDIR)/parallel_01.Po -rm -f ./$(DEPDIR)/parallel_02.Po -rm -f ./$(DEPDIR)/parallel_03.Po -rm -f ./$(DEPDIR)/parallel_barrier_01.Po -rm -f ./$(DEPDIR)/parallel_critical_01.Po -rm -f ./$(DEPDIR)/parallel_critical_inline_01.Po -rm -f ./$(DEPDIR)/parallel_critical_named_01.Po -rm -f ./$(DEPDIR)/parallel_critical_named_inline_01.Po -rm -f ./$(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_for_01.Po -rm -f ./$(DEPDIR)/parallel_for_02.Po -rm -f ./$(DEPDIR)/parallel_for_ordered_01.Po -rm -f ./$(DEPDIR)/parallel_independent_heterogeneous_tasks.Po -rm -f ./$(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_independent_homogeneous_tasks.Po -rm -f ./$(DEPDIR)/parallel_independent_homogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_kernels.Po -rm -f ./$(DEPDIR)/parallel_kernels_spmd.Po -rm -f ./$(DEPDIR)/parallel_kernels_trivial.Po -rm -f ./$(DEPDIR)/parallel_master_01.Po -rm -f ./$(DEPDIR)/parallel_master_inline_01.Po -rm -f ./$(DEPDIR)/parallel_nested_lock_01.Po -rm -f ./$(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_redux_homogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_sections_01.Po -rm -f ./$(DEPDIR)/parallel_sections_combined_01.Po -rm -f ./$(DEPDIR)/parallel_simple_lock_01.Po -rm -f ./$(DEPDIR)/parallel_single_copyprivate_01.Po -rm -f ./$(DEPDIR)/parallel_single_copyprivate_inline_01.Po -rm -f ./$(DEPDIR)/parallel_single_inline_01.Po -rm -f ./$(DEPDIR)/parallel_single_nowait_01.Po -rm -f ./$(DEPDIR)/parallel_single_wait_01.Po -rm -f ./$(DEPDIR)/partition_dep.Po -rm -f ./$(DEPDIR)/partition_init.Po -rm -f ./$(DEPDIR)/partition_lazy.Po -rm -f ./$(DEPDIR)/partitioned_acquire.Po -rm -f ./$(DEPDIR)/partitioned_initialization.Po -rm -f ./$(DEPDIR)/pause_resume.Po -rm -f ./$(DEPDIR)/pinned_memory.Po -rm -f ./$(DEPDIR)/prefetch_data_on_node.Po -rm -f ./$(DEPDIR)/prio.Po -rm -f ./$(DEPDIR)/prio_list.Po -rm -f ./$(DEPDIR)/readers_and_writers.Po -rm -f ./$(DEPDIR)/readonly.Po -rm -f ./$(DEPDIR)/reclaim.Po -rm -f ./$(DEPDIR)/redundant_buffer.Po -rm -f ./$(DEPDIR)/redux_acquire.Po -rm -f ./$(DEPDIR)/regenerate.Po -rm -f ./$(DEPDIR)/regenerate_pipeline.Po -rm -f ./$(DEPDIR)/regression_based.Po -rm -f ./$(DEPDIR)/restart.Po -rm -f ./$(DEPDIR)/run_driver.Po -rm -f ./$(DEPDIR)/same_handle.Po -rm -f ./$(DEPDIR)/scal.Po -rm -f ./$(DEPDIR)/sched_ctx_hierarchy.Po -rm -f ./$(DEPDIR)/sched_ctx_list.Po -rm -f ./$(DEPDIR)/sched_ctx_policy_data.Po -rm -f ./$(DEPDIR)/scratch.Po -rm -f ./$(DEPDIR)/scratch_opencl.Po -rm -f ./$(DEPDIR)/scratch_reuse.Po -rm -f ./$(DEPDIR)/simgrid-locality.Po -rm -f ./$(DEPDIR)/simple_cpu_gpu_sched.Po -rm -f ./$(DEPDIR)/simple_deps.Po -rm -f ./$(DEPDIR)/specific_node.Po -rm -f ./$(DEPDIR)/spmd_peager.Po -rm -f ./$(DEPDIR)/starpu_barrier.Po -rm -f ./$(DEPDIR)/starpu_create_sync_task.Po -rm -f ./$(DEPDIR)/starpu_data_cpy.Po -rm -f ./$(DEPDIR)/starpu_init.Po -rm -f ./$(DEPDIR)/starpu_init_noworker.Po -rm -f ./$(DEPDIR)/starpu_task_bundle.Po -rm -f ./$(DEPDIR)/starpu_task_wait.Po -rm -f ./$(DEPDIR)/starpu_task_wait_for_all.Po -rm -f ./$(DEPDIR)/starpu_worker_exists.Po -rm -f ./$(DEPDIR)/static_restartable.Po -rm -f ./$(DEPDIR)/static_restartable_tag.Po -rm -f ./$(DEPDIR)/static_restartable_using_initializer.Po -rm -f ./$(DEPDIR)/subgraph_repeat.Po -rm -f ./$(DEPDIR)/subgraph_repeat_regenerate.Po -rm -f ./$(DEPDIR)/subgraph_repeat_regenerate_tag.Po -rm -f ./$(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Po -rm -f ./$(DEPDIR)/subgraph_repeat_tag.Po -rm -f ./$(DEPDIR)/submit.Po -rm -f ./$(DEPDIR)/sync_and_notify_data.Po -rm -f ./$(DEPDIR)/sync_and_notify_data_implicit.Po -rm -f ./$(DEPDIR)/sync_and_notify_data_opencl.Po -rm -f ./$(DEPDIR)/sync_tasks_overhead.Po -rm -f ./$(DEPDIR)/sync_with_data_with_mem.Po -rm -f ./$(DEPDIR)/sync_with_data_with_mem_non_blocking.Po -rm -f ./$(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po -rm -f ./$(DEPDIR)/tag_get_task.Po -rm -f ./$(DEPDIR)/tag_task_data_deps.Po -rm -f ./$(DEPDIR)/tag_wait_api.Po -rm -f ./$(DEPDIR)/task_01.Po -rm -f ./$(DEPDIR)/task_02.Po -rm -f ./$(DEPDIR)/task_03.Po -rm -f ./$(DEPDIR)/task_end_dep.Po -rm -f ./$(DEPDIR)/task_wait_api.Po -rm -f ./$(DEPDIR)/task_with_multiple_time_the_same_handle.Po -rm -f ./$(DEPDIR)/taskgroup_01.Po -rm -f ./$(DEPDIR)/taskgroup_02.Po -rm -f ./$(DEPDIR)/taskloop.Po -rm -f ./$(DEPDIR)/tasks_overhead.Po -rm -f ./$(DEPDIR)/tasks_size_overhead.Po -rm -f ./$(DEPDIR)/taskwait_01.Po -rm -f ./$(DEPDIR)/temporary_partition.Po -rm -f ./$(DEPDIR)/temporary_partition_implicit.Po -rm -f ./$(DEPDIR)/test_arbiter.Po -rm -f ./$(DEPDIR)/test_interfaces.Po -rm -f ./$(DEPDIR)/unpartition.Po -rm -f ./$(DEPDIR)/user_base.Po -rm -f ./$(DEPDIR)/user_interaction_implicit.Po -rm -f ./$(DEPDIR)/valid_model.Po -rm -f ./$(DEPDIR)/value_nan.Po -rm -f ./$(DEPDIR)/variable_interface.Po -rm -f ./$(DEPDIR)/variable_opencl.Po -rm -f ./$(DEPDIR)/variable_parameters.Po -rm -f ./$(DEPDIR)/variable_size.Po -rm -f ./$(DEPDIR)/vector_interface.Po -rm -f ./$(DEPDIR)/vector_opencl.Po -rm -f ./$(DEPDIR)/void_interface.Po -rm -f ./$(DEPDIR)/wait_all_regenerable_tasks.Po -rm -f ./$(DEPDIR)/workers_cpuid.Po -rm -f ./$(DEPDIR)/write_only_tmp_buffer.Po -rm -f ./$(DEPDIR)/wt_broadcast.Po -rm -f ./$(DEPDIR)/wt_host.Po -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 -f ./$(DEPDIR)/acquire_cb.Po -rm -f ./$(DEPDIR)/acquire_cb_insert.Po -rm -f ./$(DEPDIR)/acquire_release.Po -rm -f ./$(DEPDIR)/acquire_release2.Po -rm -f ./$(DEPDIR)/acquire_release_opencl.Po -rm -f ./$(DEPDIR)/acquire_try.Po -rm -f ./$(DEPDIR)/allocate.Po -rm -f ./$(DEPDIR)/api_01.Po -rm -f ./$(DEPDIR)/array_slice_01.Po -rm -f ./$(DEPDIR)/async_tasks_overhead.Po -rm -f ./$(DEPDIR)/bandwidth.Po -rm -f ./$(DEPDIR)/bcsr.Po -rm -f ./$(DEPDIR)/bcsr_interface.Po -rm -f ./$(DEPDIR)/bcsr_opencl.Po -rm -f ./$(DEPDIR)/bind.Po -rm -f ./$(DEPDIR)/block_interface.Po -rm -f ./$(DEPDIR)/block_opencl.Po -rm -f ./$(DEPDIR)/cache.Po -rm -f ./$(DEPDIR)/callback.Po -rm -f ./$(DEPDIR)/codelet_null_callback.Po -rm -f ./$(DEPDIR)/commute.Po -rm -f ./$(DEPDIR)/commute2.Po -rm -f ./$(DEPDIR)/coo_interface.Po -rm -f ./$(DEPDIR)/coo_opencl.Po -rm -f ./$(DEPDIR)/copy.Po -rm -f ./$(DEPDIR)/copy_interfaces.Po -rm -f ./$(DEPDIR)/critical_section_with_void_interface.Po -rm -f ./$(DEPDIR)/csr_interface.Po -rm -f ./$(DEPDIR)/csr_opencl.Po -rm -f ./$(DEPDIR)/cublas_init.Po -rm -f ./$(DEPDIR)/cuda_only.Po -rm -f ./$(DEPDIR)/cuda_task_01.Po -rm -f ./$(DEPDIR)/cusparse_init.Po -rm -f ./$(DEPDIR)/data_implicit_deps.Po -rm -f ./$(DEPDIR)/data_invalidation.Po -rm -f ./$(DEPDIR)/data_locality.Po -rm -f ./$(DEPDIR)/data_lookup.Po -rm -f ./$(DEPDIR)/declare_deps_after_submission.Po -rm -f ./$(DEPDIR)/declare_deps_after_submission_synchronous.Po -rm -f ./$(DEPDIR)/declare_deps_in_callback.Po -rm -f ./$(DEPDIR)/deploop.Po -rm -f ./$(DEPDIR)/deps.Po -rm -f ./$(DEPDIR)/dining_philosophers.Po -rm -f ./$(DEPDIR)/disk_compute.Po -rm -f ./$(DEPDIR)/disk_copy.Po -rm -f ./$(DEPDIR)/disk_copy_to_disk.Po -rm -f ./$(DEPDIR)/disk_copy_unpack.Po -rm -f ./$(DEPDIR)/disk_pack.Po -rm -f ./$(DEPDIR)/display_binding.Po -rm -f ./$(DEPDIR)/display_structures_size.Po -rm -f ./$(DEPDIR)/double_parameter.Po -rm -f ./$(DEPDIR)/dsm_stress.Po -rm -f ./$(DEPDIR)/empty_task.Po -rm -f ./$(DEPDIR)/empty_task_chain.Po -rm -f ./$(DEPDIR)/empty_task_sync_point.Po -rm -f ./$(DEPDIR)/empty_task_sync_point_tasks.Po -rm -f ./$(DEPDIR)/environment.Po -rm -f ./$(DEPDIR)/execute_all_tasks.Po -rm -f ./$(DEPDIR)/execute_on_a_specific_worker.Po -rm -f ./$(DEPDIR)/execute_on_all.Po -rm -f ./$(DEPDIR)/execute_schedule.Po -rm -f ./$(DEPDIR)/explicit_combined_worker.Po -rm -f ./$(DEPDIR)/feed.Po -rm -f ./$(DEPDIR)/generic.Po -rm -f ./$(DEPDIR)/get_children_tasks.Po -rm -f ./$(DEPDIR)/get_current_task.Po -rm -f ./$(DEPDIR)/gpu_concurrency.Po -rm -f ./$(DEPDIR)/gpu_ptr_register.Po -rm -f ./$(DEPDIR)/gpu_register.Po -rm -f ./$(DEPDIR)/handle_to_pointer.Po -rm -f ./$(DEPDIR)/hwloc_cpuset.Po -rm -f ./$(DEPDIR)/in_place_partition.Po -rm -f ./$(DEPDIR)/increment_codelet.Po -rm -f ./$(DEPDIR)/increment_init.Po -rm -f ./$(DEPDIR)/increment_redux.Po -rm -f ./$(DEPDIR)/increment_redux_lazy.Po -rm -f ./$(DEPDIR)/increment_redux_v2.Po -rm -f ./$(DEPDIR)/init_exit_01.Po -rm -f ./$(DEPDIR)/init_exit_02.Po -rm -f ./$(DEPDIR)/init_run_deinit.Po -rm -f ./$(DEPDIR)/insert_task.Po -rm -f ./$(DEPDIR)/insert_task_array.Po -rm -f ./$(DEPDIR)/insert_task_dyn_handles.Po -rm -f ./$(DEPDIR)/insert_task_many.Po -rm -f ./$(DEPDIR)/insert_task_nullcodelet.Po -rm -f ./$(DEPDIR)/insert_task_pack.Po -rm -f ./$(DEPDIR)/insert_task_value.Po -rm -f ./$(DEPDIR)/insert_task_where.Po -rm -f ./$(DEPDIR)/invalid_blocking_calls.Po -rm -f ./$(DEPDIR)/invalid_tasks.Po -rm -f ./$(DEPDIR)/invalidate_pending_requests.Po -rm -f ./$(DEPDIR)/job.Po -rm -f ./$(DEPDIR)/lazy_allocation.Po -rm -f ./$(DEPDIR)/lazy_unregister.Po -rm -f ./$(DEPDIR)/loader.Po -rm -f ./$(DEPDIR)/local_pingpong.Po -rm -f ./$(DEPDIR)/locality.Po -rm -f ./$(DEPDIR)/main_deprecated_func-deprecated_func.Po -rm -f ./$(DEPDIR)/manual_reduction.Po -rm -f ./$(DEPDIR)/matrix_as_vector.Po -rm -f ./$(DEPDIR)/matrix_interface.Po -rm -f ./$(DEPDIR)/matrix_opencl.Po -rm -f ./$(DEPDIR)/mem_reclaim.Po -rm -f ./$(DEPDIR)/memory.Po -rm -f ./$(DEPDIR)/mkdtemp.Po -rm -f ./$(DEPDIR)/mpi_like.Po -rm -f ./$(DEPDIR)/mpi_like_async.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets.Po -rm -f ./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po -rm -f ./$(DEPDIR)/multiformat_cuda_opencl.Po -rm -f ./$(DEPDIR)/multiformat_data_release.Po -rm -f ./$(DEPDIR)/multiformat_handle_conversion.Po -rm -f ./$(DEPDIR)/multiformat_interface.Po -rm -f ./$(DEPDIR)/multiformat_opencl.Po -rm -f ./$(DEPDIR)/multiformat_worker.Po -rm -f ./$(DEPDIR)/multithreaded.Po -rm -f ./$(DEPDIR)/multithreaded_init.Po -rm -f ./$(DEPDIR)/no_unregister.Po -rm -f ./$(DEPDIR)/non_linear_regression_based.Po -rm -f ./$(DEPDIR)/noreclaim.Po -rm -f ./$(DEPDIR)/nowhere.Po -rm -f ./$(DEPDIR)/numa_overflow.Po -rm -f ./$(DEPDIR)/opencl_codelet_unsigned_inc.Po -rm -f ./$(DEPDIR)/opencl_memset.Po -rm -f ./$(DEPDIR)/overlap.Po -rm -f ./$(DEPDIR)/pack.Po -rm -f ./$(DEPDIR)/parallel_01.Po -rm -f ./$(DEPDIR)/parallel_02.Po -rm -f ./$(DEPDIR)/parallel_03.Po -rm -f ./$(DEPDIR)/parallel_barrier_01.Po -rm -f ./$(DEPDIR)/parallel_critical_01.Po -rm -f ./$(DEPDIR)/parallel_critical_inline_01.Po -rm -f ./$(DEPDIR)/parallel_critical_named_01.Po -rm -f ./$(DEPDIR)/parallel_critical_named_inline_01.Po -rm -f ./$(DEPDIR)/parallel_dependent_homogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_for_01.Po -rm -f ./$(DEPDIR)/parallel_for_02.Po -rm -f ./$(DEPDIR)/parallel_for_ordered_01.Po -rm -f ./$(DEPDIR)/parallel_independent_heterogeneous_tasks.Po -rm -f ./$(DEPDIR)/parallel_independent_heterogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_independent_homogeneous_tasks.Po -rm -f ./$(DEPDIR)/parallel_independent_homogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_kernels.Po -rm -f ./$(DEPDIR)/parallel_kernels_spmd.Po -rm -f ./$(DEPDIR)/parallel_kernels_trivial.Po -rm -f ./$(DEPDIR)/parallel_master_01.Po -rm -f ./$(DEPDIR)/parallel_master_inline_01.Po -rm -f ./$(DEPDIR)/parallel_nested_lock_01.Po -rm -f ./$(DEPDIR)/parallel_redux_heterogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_redux_homogeneous_tasks_data.Po -rm -f ./$(DEPDIR)/parallel_sections_01.Po -rm -f ./$(DEPDIR)/parallel_sections_combined_01.Po -rm -f ./$(DEPDIR)/parallel_simple_lock_01.Po -rm -f ./$(DEPDIR)/parallel_single_copyprivate_01.Po -rm -f ./$(DEPDIR)/parallel_single_copyprivate_inline_01.Po -rm -f ./$(DEPDIR)/parallel_single_inline_01.Po -rm -f ./$(DEPDIR)/parallel_single_nowait_01.Po -rm -f ./$(DEPDIR)/parallel_single_wait_01.Po -rm -f ./$(DEPDIR)/partition_dep.Po -rm -f ./$(DEPDIR)/partition_init.Po -rm -f ./$(DEPDIR)/partition_lazy.Po -rm -f ./$(DEPDIR)/partitioned_acquire.Po -rm -f ./$(DEPDIR)/partitioned_initialization.Po -rm -f ./$(DEPDIR)/pause_resume.Po -rm -f ./$(DEPDIR)/pinned_memory.Po -rm -f ./$(DEPDIR)/prefetch_data_on_node.Po -rm -f ./$(DEPDIR)/prio.Po -rm -f ./$(DEPDIR)/prio_list.Po -rm -f ./$(DEPDIR)/readers_and_writers.Po -rm -f ./$(DEPDIR)/readonly.Po -rm -f ./$(DEPDIR)/reclaim.Po -rm -f ./$(DEPDIR)/redundant_buffer.Po -rm -f ./$(DEPDIR)/redux_acquire.Po -rm -f ./$(DEPDIR)/regenerate.Po -rm -f ./$(DEPDIR)/regenerate_pipeline.Po -rm -f ./$(DEPDIR)/regression_based.Po -rm -f ./$(DEPDIR)/restart.Po -rm -f ./$(DEPDIR)/run_driver.Po -rm -f ./$(DEPDIR)/same_handle.Po -rm -f ./$(DEPDIR)/scal.Po -rm -f ./$(DEPDIR)/sched_ctx_hierarchy.Po -rm -f ./$(DEPDIR)/sched_ctx_list.Po -rm -f ./$(DEPDIR)/sched_ctx_policy_data.Po -rm -f ./$(DEPDIR)/scratch.Po -rm -f ./$(DEPDIR)/scratch_opencl.Po -rm -f ./$(DEPDIR)/scratch_reuse.Po -rm -f ./$(DEPDIR)/simgrid-locality.Po -rm -f ./$(DEPDIR)/simple_cpu_gpu_sched.Po -rm -f ./$(DEPDIR)/simple_deps.Po -rm -f ./$(DEPDIR)/specific_node.Po -rm -f ./$(DEPDIR)/spmd_peager.Po -rm -f ./$(DEPDIR)/starpu_barrier.Po -rm -f ./$(DEPDIR)/starpu_create_sync_task.Po -rm -f ./$(DEPDIR)/starpu_data_cpy.Po -rm -f ./$(DEPDIR)/starpu_init.Po -rm -f ./$(DEPDIR)/starpu_init_noworker.Po -rm -f ./$(DEPDIR)/starpu_task_bundle.Po -rm -f ./$(DEPDIR)/starpu_task_wait.Po -rm -f ./$(DEPDIR)/starpu_task_wait_for_all.Po -rm -f ./$(DEPDIR)/starpu_worker_exists.Po -rm -f ./$(DEPDIR)/static_restartable.Po -rm -f ./$(DEPDIR)/static_restartable_tag.Po -rm -f ./$(DEPDIR)/static_restartable_using_initializer.Po -rm -f ./$(DEPDIR)/subgraph_repeat.Po -rm -f ./$(DEPDIR)/subgraph_repeat_regenerate.Po -rm -f ./$(DEPDIR)/subgraph_repeat_regenerate_tag.Po -rm -f ./$(DEPDIR)/subgraph_repeat_regenerate_tag_cycle.Po -rm -f ./$(DEPDIR)/subgraph_repeat_tag.Po -rm -f ./$(DEPDIR)/submit.Po -rm -f ./$(DEPDIR)/sync_and_notify_data.Po -rm -f ./$(DEPDIR)/sync_and_notify_data_implicit.Po -rm -f ./$(DEPDIR)/sync_and_notify_data_opencl.Po -rm -f ./$(DEPDIR)/sync_tasks_overhead.Po -rm -f ./$(DEPDIR)/sync_with_data_with_mem.Po -rm -f ./$(DEPDIR)/sync_with_data_with_mem_non_blocking.Po -rm -f ./$(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po -rm -f ./$(DEPDIR)/tag_get_task.Po -rm -f ./$(DEPDIR)/tag_task_data_deps.Po -rm -f ./$(DEPDIR)/tag_wait_api.Po -rm -f ./$(DEPDIR)/task_01.Po -rm -f ./$(DEPDIR)/task_02.Po -rm -f ./$(DEPDIR)/task_03.Po -rm -f ./$(DEPDIR)/task_end_dep.Po -rm -f ./$(DEPDIR)/task_wait_api.Po -rm -f ./$(DEPDIR)/task_with_multiple_time_the_same_handle.Po -rm -f ./$(DEPDIR)/taskgroup_01.Po -rm -f ./$(DEPDIR)/taskgroup_02.Po -rm -f ./$(DEPDIR)/taskloop.Po -rm -f ./$(DEPDIR)/tasks_overhead.Po -rm -f ./$(DEPDIR)/tasks_size_overhead.Po -rm -f ./$(DEPDIR)/taskwait_01.Po -rm -f ./$(DEPDIR)/temporary_partition.Po -rm -f ./$(DEPDIR)/temporary_partition_implicit.Po -rm -f ./$(DEPDIR)/test_arbiter.Po -rm -f ./$(DEPDIR)/test_interfaces.Po -rm -f ./$(DEPDIR)/unpartition.Po -rm -f ./$(DEPDIR)/user_base.Po -rm -f ./$(DEPDIR)/user_interaction_implicit.Po -rm -f ./$(DEPDIR)/valid_model.Po -rm -f ./$(DEPDIR)/value_nan.Po -rm -f ./$(DEPDIR)/variable_interface.Po -rm -f ./$(DEPDIR)/variable_opencl.Po -rm -f ./$(DEPDIR)/variable_parameters.Po -rm -f ./$(DEPDIR)/variable_size.Po -rm -f ./$(DEPDIR)/vector_interface.Po -rm -f ./$(DEPDIR)/vector_opencl.Po -rm -f ./$(DEPDIR)/void_interface.Po -rm -f ./$(DEPDIR)/wait_all_regenerable_tasks.Po -rm -f ./$(DEPDIR)/workers_cpuid.Po -rm -f ./$(DEPDIR)/write_only_tmp_buffer.Po -rm -f ./$(DEPDIR)/wt_broadcast.Po -rm -f ./$(DEPDIR)/wt_host.Po -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-exec install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles 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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ @$(MKDIR_P) `dirname $@` @STARPU_COVERITY_TRUE@@STARPU_USE_CUDA_TRUE@ $(V_mynvcc)grep 'extern *"C" *void *' $< | sed -ne 's/extern *"C" *void *\([a-zA-Z0-9_]*\) *(.*/void \1(void) {}/p' | $(CC) -x c - -o $@ -c @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) -cubin $< -o $@ $(NVCCFLAGS) @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_COVERITY_FALSE@@STARPU_USE_CUDA_TRUE@ $(V_nvcc) $(NVCC) $< -c -o $@ $(NVCCFLAGS) # 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.3.9+dfsg/tests/coverage/000077500000000000000000000000001413463044200167175ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/coverage/coverage.sh000077500000000000000000000107351413463044200210570ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 $STARPU_LAUNCH $exampledir/basic_examples/block check_success $? fi if [ -f $exampledir/basic_examples/variable ] ; then echo "variable opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $STARPU_LAUNCH $exampledir/basic_examples/variable 100 check_success $? echo "variable no worker" STARPU_NCUDA=0 STARPU_NOPENCL=0 STARPU_NCPUS=0 $STARPU_LAUNCH $exampledir/basic_examples/variable check_success $? fi if [ -f $exampledir/incrementer/incrementer ] ; then echo "incrementer opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $STARPU_LAUNCH $exampledir/incrementer/incrementer 10 check_success $? echo "incrementer no worker" STARPU_NCUDA=0 STARPU_NOPENCL=0 STARPU_NCPUS=0 $STARPU_LAUNCH $exampledir/incrementer/incrementer check_success $? fi if [ -f $exampledir/tag_example/tag_example ] ; then echo "tag_example" $STARPU_LAUNCH $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" $STARPU_LAUNCH $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" $STARPU_LAUNCH $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.dmda" STARPU_CALIBRATE=1 STARPU_SCHED="dmda" $STARPU_LAUNCH $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.cpu" STARPU_CALIBRATE=1 STARPU_NCUDA=0 STARPU_SCHED="dm" $STARPU_LAUNCH $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.gpu" STARPU_CALIBRATE=1 STARPU_NCPUS=0 STARPU_SCHED="dm" $STARPU_LAUNCH $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" $STARPU_LAUNCH $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" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -v2 -pin check_success $? echo "heat.dm.8k.no.pin.v2" STARPU_SCHED="dm" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -v2 check_success $? # echo "heat.dm.8k.v2.no.prio" # STARPU_SCHED="no-prio" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 # check_success $? echo "heat.dm.8k.v2.random" STARPU_SCHED="random" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.dm.8k.v2" STARPU_SCHED="dm" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.greedy.8k.v2" STARPU_SCHED="greedy" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.8k.cg" $STARPU_LAUNCH $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 -cg check_success $? echo "heat.dm.8k.cg" STARPU_SCHED="dm" $STARPU_LAUNCH $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" $STARPU_LAUNCH $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" $STARPU_LAUNCH $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" $STARPU_LAUNCH $exampledir/mult/dw_mult_no_stride -nblocks 8 -x 4096 -y 4096 -z 4096 -pin check_success $? fi } apps; starpu-1.3.9+dfsg/tests/datawizard/000077500000000000000000000000001413463044200172565ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/acquire_cb.c000066400000000000000000000070361413463044200215250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_w is properly called */ unsigned token = 0; starpu_data_handle_t token_handle; static void callback_w(void *arg) { (void)arg; token = 42; starpu_data_release(token_handle); } static void callback_r(void *arg) { (void)arg; 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, -1, 0, sizeof(unsigned)); starpu_data_acquire_cb(token_handle, STARPU_W, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_unregister(token_handle); STARPU_ASSERT(token == 42); token = 0; starpu_variable_data_register(&token_handle, -1, 0, sizeof(unsigned)); starpu_data_acquire(token_handle, STARPU_W); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_release(token_handle); starpu_data_unregister(token_handle); token = 0; starpu_variable_data_register(&token_handle, STARPU_MAIN_RAM, (uintptr_t)&token, sizeof(unsigned)); /* These are getting executed immediately */ starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_W, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_W, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_RW, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_RW, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire(token_handle, STARPU_W); /* These will wait for our relase */ starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_W, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_W, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_RW, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_RW, callback_w, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_acquire_cb(token_handle, STARPU_R, callback_r, NULL); starpu_data_release(token_handle); starpu_data_unregister(token_handle); FPRINTF(stderr, "Token: %u\n", token); starpu_shutdown(); return (token == 42) ? EXIT_SUCCESS : EXIT_FAILURE; } starpu-1.3.9+dfsg/tests/datawizard/acquire_cb_insert.c000066400000000000000000000100621413463044200231020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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) { (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]); (void)_args; 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) { (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 "../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[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void increment_opencl(void *buffers[], void *args); #endif void increment_cpu(void *descr[], void *arg) { (void)arg; 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) { (void)arg; 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 "../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[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void increment_opencl(void *buffers[], void *args); #endif void increment_cpu(void *descr[], void *arg) { (void)arg; 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) { (void)arg; 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[], void *cl_arg) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); _increment_cuda_codelet<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/datawizard/acquire_release_opencl.c000066400000000000000000000031251413463044200241140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/tests/datawizard/acquire_release_opencl_kernel.cl000066400000000000000000000013771413463044200256370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/acquire_try.c000066400000000000000000000047001413463044200217520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 to use data_acquire_try in parallel with tasks */ void func(void *descr[], void *arg) { (void)descr; (void)arg; 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) { (void)arg; 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.3.9+dfsg/tests/datawizard/allocate.c000066400000000000000000000154601413463044200212140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; if (starpu_get_env_number_default("STARPU_DIDUSE_BARRIER", 0)) /* This would hang */ return STARPU_TEST_SKIPPED; 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" static starpu_data_handle_t bcsr_handle; void cpu_show_bcsr(void *descr[], void *arg) { (void)arg; struct starpu_bcsr_interface *iface = descr[0]; uint32_t nnz = STARPU_BCSR_GET_NNZ(iface); uint32_t nrow = STARPU_BCSR_GET_NROW(iface); int *nzval = (int *)STARPU_BCSR_GET_NZVAL(iface); uint32_t *colind = STARPU_BCSR_GET_COLIND(iface); uint32_t *rowptr = STARPU_BCSR_GET_ROWPTR(iface); uint32_t firstentry = STARPU_BCSR_GET_FIRSTENTRY(iface); uint32_t r = STARPU_BCSR_GET_R(iface); uint32_t c = STARPU_BCSR_GET_C(iface); uint32_t elemsize = STARPU_BCSR_GET_ELEMSIZE(iface); uint32_t i, j, y, x; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; STARPU_PTHREAD_MUTEX_LOCK(&mutex); printf("\nnnz %u elemsize %u\n", nnz, elemsize); for (i = 0; i < nrow; i++) { uint32_t row_start = rowptr[i] - firstentry; uint32_t row_end = rowptr[i+1] - firstentry; printf("row %u\n", i); for (j = row_start; j < row_end; j++) { int *block = nzval + j * r*c; printf( " column %u\n", colind[j]); for (y = 0; y < r; y++) { for (x = 0; x < c; x++) printf(" %d", block[y*c+x]); printf("\n"); } } } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } struct starpu_codelet show_cl = { .cpu_funcs = { cpu_show_bcsr }, .nbuffers = 1, .modes = { STARPU_R }, }; /* * In this test, we use the following matrix: * * +----------------+ * | 0 1 0 0 | * | 2 3 0 0 | * | 4 5 8 9 | * | 6 7 10 11 | * | 0 0 0 0 | * | 0 0 0 0 | * +----------------+ * * nzval = [0, 1, 2, 3] ++ [4, 5, 6, 7] ++ [8, 9, 10, 11] * colind = [0, 0, 1] (column index of each non-zero block) * rowptr = [0, 1, 3] (index of first non-zero block for each row) * r = c = 2 */ /* Size of the blocks */ #define R 2 #define C 2 #define NNZ_BLOCKS 3 /* out of 6 */ #define NZVAL_SIZE (R*C*NNZ_BLOCKS) #define NROWS 3 static int nzval[NZVAL_SIZE] = { 0, 1, 2, 3, /* First block */ 4, 5, 6, 7, /* Second block */ 8, 9, 10, 11 /* Third block */ }; static uint32_t colind[NNZ_BLOCKS] = { 0, 0, 1 }; static uint32_t rowptr[NROWS+1] = { 0, 1, NNZ_BLOCKS, NNZ_BLOCKS }; int main(int argc, char **argv) { struct starpu_conf conf; starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; if (starpu_initialize(&conf, &argc, &argv) == -ENODEV) return STARPU_TEST_SKIPPED; if (starpu_cpu_worker_get_count() == 0 || starpu_memory_nodes_get_count() > 1) { starpu_shutdown(); return STARPU_TEST_SKIPPED; } 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_task_insert(&show_cl, STARPU_R, bcsr_handle, 0); struct starpu_data_filter filter = { .filter_func = starpu_bcsr_filter_vertical_block, .nchildren = 3, }; starpu_data_partition(bcsr_handle, &filter); starpu_task_insert(&show_cl, STARPU_R, starpu_data_get_sub_data(bcsr_handle, 1, 0), 0); starpu_task_insert(&show_cl, STARPU_R, starpu_data_get_sub_data(bcsr_handle, 1, 1), 0); starpu_task_insert(&show_cl, STARPU_R, starpu_data_get_sub_data(bcsr_handle, 1, 2), 0); starpu_data_unpartition(bcsr_handle, STARPU_MAIN_RAM); starpu_data_unregister(bcsr_handle); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/tests/datawizard/cache.c000066400000000000000000000044001413463044200204630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 re-using a buffer allocation on GPUs */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static void codelet(void *descr[], void *arg) { (void)descr; (void)arg; 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 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.3.9+dfsg/tests/datawizard/commute.c000066400000000000000000000107241413463044200210770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 various STARPU_R / STARPU_RW / STARPU_RW|COMMUTE patterns */ void begin(void *descr[], void *arg) { (void)arg; 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 *arg) { (void)arg; 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 *arg) { (void)arg; 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[], void *arg) { (void)descr; (void)arg; } 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) { 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.3.9+dfsg/tests/datawizard/commute2.c000066400000000000000000000055321413463044200211620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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; (void)descr; 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(void) { 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.3.9+dfsg/tests/datawizard/copy.c000066400000000000000000000063471413463044200204060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *arg) { (void)descr; (void)arg; } 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}, .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 && starpu_worker_get_count_by_type(STARPU_MPI_MS_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.3.9+dfsg/tests/datawizard/critical_section_with_void_interface.c000066400000000000000000000045511413463044200270410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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[], void *_args) { (void)descr; (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(void) { #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.3.9+dfsg/tests/datawizard/cuda_codelet_unsigned_inc.cu000066400000000000000000000021401413463044200247440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *cl_arg) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); _cuda_unsigned_inc<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/datawizard/data_implicit_deps.c000066400000000000000000000154431413463044200232470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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[], void *arg) { (void)descr; (void)arg; 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[], void *arg) { (void)descr; (void)arg; 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[], void *arg) { (void)arg; STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *) STARPU_VARIABLE_GET_PTR(descr[0]); unsigned value = 42; usleep(100000); cudaMemcpyAsync(val, &value, sizeof(value), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL void g_opencl(void *descr[], void *arg) { (void)arg; STARPU_SKIP_IF_VALGRIND; cl_mem val = (cl_mem) STARPU_VARIABLE_GET_PTR(descr[0]); unsigned value = 42; usleep(100000); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, val, CL_TRUE, 0, sizeof(unsigned), (void *)&value, 0, NULL, NULL); clFinish(queue); } #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 #ifdef STARPU_USE_OPENCL .opencl_funcs = {g_opencl}, #endif .cpu_funcs_name = {"g"}, .nbuffers = 3, }; void h(void *descr[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *) STARPU_VARIABLE_GET_PTR(descr[0]); unsigned value; cudaMemcpyAsync(&value, val, sizeof(value), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); FPRINTF(stderr, "VAR %u (should be 42)\n", value); STARPU_ASSERT(value == 42); } #endif #ifdef STARPU_USE_OPENCL void h_opencl(void *descr[], void *arg) { (void)arg; STARPU_SKIP_IF_VALGRIND; cl_mem val = (cl_mem) STARPU_VARIABLE_GET_PTR(descr[0]); unsigned value = 0; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, val, CL_TRUE, 0, sizeof(unsigned), (void *)&value, 0, NULL, NULL); clFinish(queue); 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 #ifdef STARPU_USE_OPENCL .opencl_funcs = {h_opencl}, #endif .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.3.9+dfsg/tests/datawizard/data_invalidation.c000066400000000000000000000133631413463044200231020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/data_lookup.c000066400000000000000000000143241413463044200217300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/deps.c000066400000000000000000000060761413463044200203660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 N 10 #define LOOPS 4 void null_cpu_func(void *buffers[], void *arg) { (void)arg; (void)buffers; } void prod_cpu_func(void *buffers[], void *arg) { int *data = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); int n = STARPU_VECTOR_GET_NX(buffers[0]); int i; int factor; starpu_codelet_unpack_args(arg, &factor); FPRINTF(stderr, "Multiplying by %d\n", factor); for(i=0 ; i #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) { (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.3.9+dfsg/tests/datawizard/double_parameter.c000066400000000000000000000113421413463044200227350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *arg) { (void)descr; (void)arg; } 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.3.9+dfsg/tests/datawizard/dsm_stress.c000066400000000000000000000152001413463044200216060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (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[], void *_args) { (void)descr; (void)_args; } static void opencl_codelet_null(void *descr[], void *_args) { (void)descr; (void)_args; } void cpu_codelet_null(void *descr[], void *_args) { (void)descr; (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.3.9+dfsg/tests/datawizard/gpu_ptr_register.c000066400000000000000000000157761413463044200230260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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(void) { 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 STARPU_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 (!cures) cures = cudaDeviceSynchronize(); 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 STARPU_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.3.9+dfsg/tests/datawizard/gpu_register.c000066400000000000000000000170661413463044200221330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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(void) { 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 STARPU_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 (!cures) cures = cudaDeviceSynchronize(); 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 (!cures) cures = cudaDeviceSynchronize(); 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); return 1; } 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 STARPU_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.3.9+dfsg/tests/datawizard/handle_to_pointer.c000066400000000000000000000114261413463044200231230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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) { (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_ASSERT(starpu_data_pointer_is_inside(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_ASSERT(starpu_data_pointer_is_inside(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_ASSERT(starpu_data_pointer_is_inside(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; STARPU_ASSERT(starpu_data_pointer_is_inside(handle, STARPU_MAIN_RAM, numbers)); 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.3.9+dfsg/tests/datawizard/in_place_partition.c000066400000000000000000000056601413463044200232740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/increment_init.c000066400000000000000000000126051413463044200224350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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) { (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) { (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) { (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) { (void)cl_arg; 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) { (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) { (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(void) { 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.3.9+dfsg/tests/datawizard/increment_redux.c000066400000000000000000000171761413463044200226310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 */ 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) { (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) { (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) { (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) { (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) { (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) { (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) { (void)cl_arg; 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) { (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) { (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.3.9+dfsg/tests/datawizard/increment_redux_lazy.c000066400000000000000000000171451413463044200236640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (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) { (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) { (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) { (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) { (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) { (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) { (void)cl_arg; 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 *cl_arg) { (void)cl_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 *cl_arg) { (void)cl_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.3.9+dfsg/tests/datawizard/increment_redux_v2.c000066400000000000000000000202071413463044200232250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 * 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) { (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) { (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) { (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) { (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) { (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) { (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) { (void)cl_arg; 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) { (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) { (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.3.9+dfsg/tests/datawizard/interfaces/000077500000000000000000000000001413463044200214015ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/bcsr/000077500000000000000000000000001413463044200223325ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/bcsr/bcsr_cuda.cu000066400000000000000000000043761413463044200246220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &bcsr_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); bcsr_cuda<<>> (val, nnz, ret, factor); error = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&bcsr_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/bcsr/bcsr_interface.c000066400000000000000000000111201413463044200254420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* * 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) { struct 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(); run_tests(&bcsr_config, &summary); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, &summary); return data_interface_test_summary_success(&summary); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/bcsr/bcsr_opencl.c000066400000000000000000000070131413463044200247700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl000066400000000000000000000016761413463044200265150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/block/000077500000000000000000000000001413463044200224735ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/block/block_cuda.cu000066400000000000000000000046501413463044200251170ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &block_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); 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 = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&block_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/block/block_interface.c000066400000000000000000000075401413463044200257570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" #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) { struct 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(); run_tests(&block_config, &summary); 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.3.9+dfsg/tests/datawizard/interfaces/block/block_opencl.c000066400000000000000000000063541413463044200253010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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[3] = {nx, ny, nz}; err = clEnqueueNDRangeKernel(queue, kernel, 3, 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.3.9+dfsg/tests/datawizard/interfaces/block/block_opencl_kernel.cl000066400000000000000000000021751413463044200270120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 idx = get_global_id(0); const int idy = get_global_id(1); const int idz = get_global_id(2); if (idx >= nx) return; if (idy >= ny) return; if (idz >= nz) return; int val = idz*ny*nx+idy*nx+idx; int i = (idz*ldz)+(idy*ldy)+idx; if (block[i] != factor * val) *err = 1; else block[i] *= -1; } starpu-1.3.9+dfsg/tests/datawizard/interfaces/coo/000077500000000000000000000000001413463044200221615ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/coo/coo_cuda.cu000066400000000000000000000041461413463044200242730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &coo_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); coo_cuda<<>> (val, nvalues, ret, factor); error = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&coo_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/coo/coo_interface.c000066400000000000000000000073271413463044200251360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; struct 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(); run_tests(&coo_config, &summary); 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.3.9+dfsg/tests/datawizard/interfaces/coo/coo_opencl.c000066400000000000000000000066621413463044200244570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/coo/coo_opencl_kernel.cl000066400000000000000000000016771413463044200261740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/copy_interfaces.c000066400000000000000000000054371413463044200247330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/interfaces/csr/000077500000000000000000000000001413463044200221705ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/csr/csr_cuda.cu000066400000000000000000000041451413463044200243100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &csr_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); csr_cuda<<>> (val, nnz, ret, factor); error = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&csr_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/csr/csr_interface.c000066400000000000000000000070311413463044200251440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" #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) { struct 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(); run_tests(&csr_config, &summary); 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.3.9+dfsg/tests/datawizard/interfaces/csr/csr_opencl.c000066400000000000000000000065611413463044200244730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/csr/csr_opencl_kernel.cl000066400000000000000000000016761413463044200262110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/matrix/000077500000000000000000000000001413463044200227055ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/matrix/matrix_cuda.cu000066400000000000000000000042521413463044200255410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &matrix_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); matrix_cuda<<>>(val, n, ret, factor); error = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&matrix_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/matrix/matrix_interface.c000066400000000000000000000064001413463044200263750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" #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) { struct 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(); run_tests(&matrix_config, &summary); 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.3.9+dfsg/tests/datawizard/interfaces/matrix/matrix_opencl.c000066400000000000000000000066111413463044200257210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/matrix/matrix_opencl_kernel.cl000066400000000000000000000016411413463044200274330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/000077500000000000000000000000001413463044200237445ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/000077500000000000000000000000001413463044200255115ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/generic.c000066400000000000000000000126521413463044200272770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" struct stats global_stats; #ifdef STARPU_USE_CPU void cpu_func(void *buffers[], void *args) { (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) { (void)buffers; (void)args; STARPU_SKIP_IF_VALGRIND; global_stats.cuda++; } void cpu_to_cuda_func(void *buffers[], void *args) { (void)buffers; (void)args; STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_cuda++; } void cuda_to_cpu_func(void *buffers[], void *args) { (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) { (void)buffers; (void)args; STARPU_SKIP_IF_VALGRIND; global_stats.opencl++; } static void cpu_to_opencl_func(void *buffers[], void *args) { (void)buffers; (void)args; STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_opencl++; } static void opencl_to_cpu_func(void *buffers[], void *args) { (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 *args) { (void)buffers; (void)args; } 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) { (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.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/generic.h000066400000000000000000000033741413463044200273050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c000066400000000000000000000072341413463044200325620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c000066400000000000000000000101451413463044200327120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c000066400000000000000000000172631413463044200340110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[]) { int ret; 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]; ret = starpu_task_submit(task); assert(ret == 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]; ret = starpu_task_submit(task2); assert(ret == 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]; ret = starpu_task_submit(task3); assert(ret == 0); ret = starpu_task_wait_for_all(); assert(ret == 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/multiformat_worker.c000066400000000000000000000074731413463044200316240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/advanced/same_handle.c000066400000000000000000000062031413463044200301160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c000066400000000000000000000062641413463044200326120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" #ifdef STARPU_USE_CUDA void cuda_to_cpu(void *buffers[], void *arg) { (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) { (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) { (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 *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu000066400000000000000000000032431413463044200337650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl000066400000000000000000000017021413463044200343160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c000066400000000000000000000060141413463044200341430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_cuda.cu000066400000000000000000000046301413463044200276370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &multiformat_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); multiformat_cuda<<>>(soa, n, ret, factor); error = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&multiformat_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_interface.c000066400000000000000000000120661413463044200305000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" 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; struct 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(); run_tests(&multiformat_config, &summary); 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_opencl.c000066400000000000000000000071361413463044200300220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl000066400000000000000000000020461413463044200315310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/tests/datawizard/interfaces/multiformat/multiformat_types.h000066400000000000000000000015641413463044200277120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/test_interfaces.c000066400000000000000000000424011413463044200247300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "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 NO_DEVICE: return "No device available"; case TASK_SUBMISSION_FAILURE: return "Task submission failed"; default: assert(0); } } 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"); 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)); FPRINTF(f, "\n"); 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)); FPRINTF(f, "\n"); 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)); FPRINTF(f, "\n"); FPRINTF(f, "Synchronous :\n"); 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)); FPRINTF(f, "\n"); 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)); FPRINTF(f, "\n"); 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)); FPRINTF(f, "\n"); FPRINTF(f, "CPU -> CPU : %s\n", enum_to_string(s->cpu_to_cpu)); FPRINTF(f, "to_pointer() : %s\n", enum_to_string(s->to_pointer)); FPRINTF(f, "pointer_is_inside() : %s\n", enum_to_string(s->pointer_is_inside)); FPRINTF(f, "compare() : %s\n", enum_to_string(s->compare)); FPRINTF(f, "pack_unpack() : %s\n", enum_to_string(s->pack)); } int data_interface_test_summary_success(struct data_interface_test_summary *s) { return s->success; } static void set_field(struct data_interface_test_summary *s, int *field, int ret) { *field = ret; if (ret == FAILURE) s->success = ret; } static void summary_init(struct data_interface_test_summary *s) { s->cpu_to_cpu = UNTESTED; s->compare = UNTESTED; s->cpu_to_cuda = UNTESTED; s->cuda_to_cuda = UNTESTED; s->cuda_to_cpu = UNTESTED; s->cpu_to_cuda_async = UNTESTED; s->cuda_to_cpu_async = UNTESTED; s->cuda_to_cuda_async = UNTESTED; s->cpu_to_opencl = UNTESTED; s->opencl_to_cpu = UNTESTED; s->cpu_to_opencl_async = UNTESTED; s->opencl_to_cpu_async = UNTESTED; s->cpu_to_mic = UNTESTED; s->mic_to_cpu = UNTESTED; s->cpu_to_mic_async = UNTESTED; s->mic_to_cpu_async = UNTESTED; s->to_pointer = UNTESTED; s->pointer_is_inside = UNTESTED; s->pack = UNTESTED; s->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: when positive, should be the worker id * 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]; static int cuda_workers[STARPU_MAXCUDADEVS]; static int opencl_workers[STARPU_MAXOPENCLDEVS]; static int mic_workers[STARPU_MAXMICDEVS]; static int n_cpus = -1; static int n_cudas = -1; static int n_opencls = -1; static int n_mics = -1; 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); n_cudas = starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, cuda_workers, STARPU_MAXCUDADEVS); n_opencls = starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, opencl_workers, STARPU_MAXOPENCLDEVS); n_mics = starpu_worker_get_ids_by_type(STARPU_MIC_WORKER, mic_workers, STARPU_MAXMICDEVS); } int *workers; static struct starpu_codelet cl; starpu_codelet_init(&cl); cl.nbuffers = 1; cl.modes[0] = STARPU_RW; if (type == STARPU_CPU_WORKER) { if (n_cpus == 0) return -ENODEV; if (id != -1 && id >= n_cpus) { FPRINTF(stderr, "Not enough CPU workers\n"); return -ENODEV; } workers = cpu_workers; cl.cpu_funcs[0] = current_config->cpu_func; } else if (type == STARPU_CUDA_WORKER) { if (n_cudas == 0) return -ENODEV; if (id != -1 && id >= n_cudas) { FPRINTF(stderr, "Not enough CUDA workers\n"); return -ENODEV; } workers = cuda_workers; cl.cuda_funcs[0] = current_config->cuda_func; } else if (type == STARPU_OPENCL_WORKER) { if (n_opencls == 0) return -ENODEV; if (id != -1 && id >= n_opencls) { FPRINTF(stderr, "Not enough OpenCL workers\n"); return -ENODEV; } workers = opencl_workers; cl.opencl_funcs[0] = current_config->opencl_func; } else if (type == STARPU_MIC_WORKER) { if (n_mics == 0) return -ENODEV; if (id != -1 && id >= n_mics) { FPRINTF(stderr, "Not enough MIC workers\n"); return -ENODEV; } workers = mic_workers; cl.cpu_funcs_name[0] = current_config->cpu_func_name; } else { return -ENODEV; } factor = -factor; struct starpu_task *task; task = starpu_task_build(&cl, STARPU_RW, *current_config->handle, STARPU_TASK_SYNCHRONOUS, 1, 0); task->cl_arg = &factor; task->cl_arg_size = sizeof(factor); if (id != -1) { task->execute_on_a_specific_worker = 1; task->workerid = workers[id]; } *taskp = task; return 0; } /* * _to_ functions. * They all create and submit a task that has to be executed on , * forcing a copy between and . */ 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 NO_DEVICE; 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 cuda_to_cuda(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CUDA_WORKER, 1); if (err != 0) return NO_DEVICE; 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 cuda_to_ram(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) return NO_DEVICE; 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 ram_to_opencl(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_OPENCL_WORKER, -1); if (err != 0) return NO_DEVICE; 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 NO_DEVICE; 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 ram_to_mic() { int err; struct starpu_task *task; err = create_task(&task, STARPU_MIC_WORKER, -1); if (err != 0) return NO_DEVICE; 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 NO_DEVICE; 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; } /* End of the _to_ functions. */ static void run_cuda(int async, struct data_interface_test_summary *s) { /* RAM -> CUDA (-> CUDA) -> RAM */ int err; err = ram_to_cuda(); set_field(s, async==1?&s->cpu_to_cuda_async:&s->cpu_to_cuda, err); /* If this failed, there is no point in continuing. */ if (err != SUCCESS) return; if (starpu_cuda_worker_get_count() >= 2) { err = cuda_to_cuda(); } else { err = UNTESTED; } set_field(s, async==1?&s->cuda_to_cuda_async:&s->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() */ err = cuda_to_ram(); set_field(s, async==1?&s->cuda_to_cpu_async:&s->cuda_to_cpu, err); } static void run_opencl(int async, struct data_interface_test_summary *s) { /* RAM -> OpenCL -> RAM */ int err; err = ram_to_opencl(); set_field(s, async==1?&s->cpu_to_opencl_async:&s->cpu_to_opencl, err); if (err != SUCCESS) return; err = opencl_to_ram(); set_field(s, async==1?&s->opencl_to_cpu_async:&s->opencl_to_cpu, err); } static void run_mic(int async, struct data_interface_test_summary *s) { int err; err = ram_to_mic(); set_field(s, &s->cpu_to_mic_async, err); if (err != SUCCESS) return; err = mic_to_ram(); set_field(s, &s->mic_to_cpu_async, err); } static void ram_to_ram(struct data_interface_test_summary *s) { 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); 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(s, &s->cpu_to_cpu, err); } static void run_async(struct data_interface_test_summary *s) { int async = starpu_asynchronous_copy_disabled(); if (async == 1) { FPRINTF(stderr, "Asynchronous copies have been disabled\n"); return; } run_cuda(1, s); run_opencl(1, s); run_mic(1, s); } static void run_sync(struct data_interface_test_summary *s) { 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)); new_copy_methods.ram_to_cuda_async = NULL; new_copy_methods.cuda_to_cuda_async = NULL; new_copy_methods.cuda_to_ram_async = NULL; new_copy_methods.ram_to_opencl_async = NULL; new_copy_methods.opencl_to_ram_async = NULL; new_copy_methods.ram_to_mic_async = NULL; new_copy_methods.mic_to_ram_async = NULL; handle->ops->copy_methods = &new_copy_methods; run_cuda(0, s); run_opencl(0, s); run_mic(0, s); handle->ops->copy_methods = old_copy_methods; } static void compare(struct data_interface_test_summary *s) { 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); s->compare = (err == 0) ? FAILURE : SUCCESS; set_field(s, &s->compare, s->compare); } static void to_pointer(struct data_interface_test_summary *s) { starpu_data_handle_t handle; s->to_pointer = UNTESTED; handle = *current_config->handle; if (handle->ops->to_pointer) { unsigned int node; unsigned int tests = 0; for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; if (!starpu_data_test_if_allocated_on_node(handle, node)) continue; void *data_interface = starpu_data_get_interface_on_node(handle, node); void *ptr = handle->ops->to_pointer(data_interface, node); if (starpu_data_lookup(ptr) != handle) { s->to_pointer = FAILURE; break; } tests++; } if (tests > 0) s->to_pointer = SUCCESS; } set_field(s, &s->to_pointer, s->to_pointer); } static void pointer_is_inside(struct data_interface_test_summary *s) { starpu_data_handle_t handle; s->pointer_is_inside = UNTESTED; handle = *current_config->handle; if (handle->ops->pointer_is_inside && handle->ops->to_pointer) { unsigned int node; unsigned int tests = 0; for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; if (!starpu_data_test_if_allocated_on_node(handle, node)) continue; void *data_interface = starpu_data_get_interface_on_node(handle, node); void *ptr = handle->ops->to_pointer(data_interface, node); if (starpu_data_lookup(ptr) != handle) { s->pointer_is_inside = FAILURE; break; } if (!starpu_data_pointer_is_inside(handle, node, ptr)) { s->pointer_is_inside = FAILURE; break; } tests++; } if (tests > 0) s->pointer_is_inside = SUCCESS; } set_field(s, &s->pointer_is_inside, s->pointer_is_inside); } static void pack_unpack(struct data_interface_test_summary *s) { starpu_data_handle_t handle; starpu_data_handle_t dummy_handle; int err = UNTESTED; handle = *current_config->handle; dummy_handle = *current_config->dummy_handle; if (handle->ops->pack_data && handle->ops->unpack_data) { void *ptr = NULL; starpu_ssize_t size = 0; starpu_data_pack(handle, &ptr, &size); if (size != 0) { struct starpu_task *task; void *mem = (void *)starpu_malloc_on_node_flags(STARPU_MAIN_RAM, size, 0); starpu_data_acquire(dummy_handle, STARPU_W); starpu_data_unpack(dummy_handle, mem, size); starpu_data_unpack(dummy_handle, ptr, size); starpu_data_release(dummy_handle); factor = -factor; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != SUCCESS) goto out; task->handles[0] = dummy_handle; err = starpu_task_submit(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(s, &s->pack, err); } 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; } void run_tests(struct test_config *conf, struct data_interface_test_summary *s) { summary_init(s); if (load_conf(conf) == 1) { FPRINTF(stderr, "Failed to load conf.\n"); } run_async(s); run_sync(s); ram_to_ram(s); compare(s); to_pointer(s); pointer_is_inside(s); pack_unpack(s); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/test_interfaces.h000066400000000000000000000053231413463044200247370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, NO_DEVICE = 3, TASK_SUBMISSION_FAILURE = 4 }; struct test_config { /** we use pointers as we want to allow static initializations in the main application */ /* 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; starpu_cuda_func_t cuda_func; starpu_opencl_func_t opencl_func; 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; }; struct data_interface_test_summary { int success; /* Copy methods */ int cpu_to_cpu; 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; int cpu_to_opencl; int opencl_to_cpu; int cpu_to_opencl_async; int opencl_to_cpu_async; int cpu_to_mic; int mic_to_cpu; int cpu_to_mic_async; int mic_to_cpu_async; /* Other stuff */ int compare; int to_pointer; int pointer_is_inside; int pack; }; void data_interface_test_summary_print(FILE *f, struct data_interface_test_summary *summary); int data_interface_test_summary_success(struct data_interface_test_summary *summary); void run_tests(struct test_config*, struct data_interface_test_summary *summary); #endif /* !TEST_INTERFACES_H */ starpu-1.3.9+dfsg/tests/datawizard/interfaces/variable/000077500000000000000000000000001413463044200231665ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/variable/variable_cuda.cu000066400000000000000000000037761413463044200263150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &variable_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); 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 = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&variable_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/variable/variable_interface.c000066400000000000000000000055721413463044200271500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" 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; struct 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(); run_tests(&variable_config, &summary); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, &summary); return data_interface_test_summary_success(&summary); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/variable/variable_opencl.c000066400000000000000000000057731413463044200264730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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 = 1; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); 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.3.9+dfsg/tests/datawizard/interfaces/variable/variable_opencl_kernel.cl000066400000000000000000000016261413463044200302000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/vector/000077500000000000000000000000001413463044200227035ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/vector/vector_cuda.cu000066400000000000000000000040601413463044200255320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 = cudaMemcpyAsync(ret, &vector_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); 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 = cudaGetLastError(); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpyAsync(&vector_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (error != cudaSuccess) { return; } cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.3.9+dfsg/tests/datawizard/interfaces/vector/vector_interface.c000066400000000000000000000063211413463044200263730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* 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 starpu_data_handle_t vector_handle; 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) { struct 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(); run_tests(&vector_config, &summary); 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.3.9+dfsg/tests/datawizard/interfaces/vector/vector_opencl.c000066400000000000000000000065711413463044200257220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 KERNEL_LOCATION "tests/datawizard/interfaces/vector/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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/interfaces/vector/vector_opencl_kernel.cl000066400000000000000000000016611413463044200274310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/interfaces/void/000077500000000000000000000000001413463044200223425ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/datawizard/interfaces/void/void_interface.c000066400000000000000000000040471413463044200254740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { struct 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(); run_tests(&void_config, &summary); 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.3.9+dfsg/tests/datawizard/invalidate_pending_requests.c000066400000000000000000000032651413463044200252070ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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(void) { 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.3.9+dfsg/tests/datawizard/lazy_allocation.c000066400000000000000000000130451413463044200226110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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) { (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.3.9+dfsg/tests/datawizard/lazy_unregister.c000066400000000000000000000043641413463044200226570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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); /* Note: we have no way to know when this will happen. We have to wait * for starpu_shutdown before being able to free the registered buffer */ 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.3.9+dfsg/tests/datawizard/locality.c000066400000000000000000000077551413463044200212600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 adjacent pieces * * Locality is thus set on the central piece. */ #include #include "../helper.h" #ifdef STARPU_USE_FXT #define N 5 #define ITER 5 #else #define N 50 #define ITER 50 #endif int task_worker[N][ITER]; int worker_task[STARPU_NMAXWORKERS][N*ITER]; unsigned worker_ntask[STARPU_NMAXWORKERS]; void cpu_f(void *descr[], void *_args) { (void)descr; 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.3.9+dfsg/tests/datawizard/locality.sh000077500000000000000000000034301413463044200214350ustar00rootroot00000000000000#!/bin/sh -x # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 # Testing another specific scheduler, no need to run this [ -z "$STARPU_SCHED" -o "$STARPU_SCHED" = modular-eager ] || exit 77 set -e PREFIX=$(dirname $0) rm -rf $PREFIX/locality.traces mkdir -p $PREFIX/locality.traces if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/locality # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/locality" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/locality fi test -x $PREFIX/../../tools/starpu_fxt_tool || exit 77 export STARPU_FXT_PREFIX=$PREFIX/locality.traces STARPU_SCHED=modular-eager $STARPU_LAUNCH $PREFIX/locality $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_tool -d $STARPU_FXT_PREFIX -memory-states -label-deps -i $STARPU_FXT_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 $STARPU_FXT_PREFIX/paje.trace pj_dump -e 0 $STARPU_FXT_PREFIX/paje.trace fi starpu-1.3.9+dfsg/tests/datawizard/manual_reduction.c000066400000000000000000000207471413463044200227650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* * 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]; static unsigned ndone; /* Create per-worker handles */ static void initialize_per_worker_handle(void *arg) { (void)arg; 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); } status = cudaMemsetAsync((void *)per_worker[workerid], 0, sizeof(variable), starpu_cuda_get_local_stream()); if (!status) status = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); break; } #endif default: STARPU_ABORT(); break; } FPRINTF(stderr, "worker %d got data %lx\n", workerid, (unsigned long) per_worker[workerid]); STARPU_ASSERT(per_worker[workerid]); } /* * Implement reduction method */ void cpu_redux_func(void *descr[], void *cl_arg) { (void)cl_arg; 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) { (void)cl_arg; unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val = *val + 1; STARPU_ATOMIC_ADD(&ndone, 1); } #ifdef STARPU_USE_CUDA /* dummy CUDA implementation */ static void cuda_func_incr(void *descr[], void *cl_arg) { (void)cl_arg; STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_val, h_val2; cudaError_t status; status = cudaMemcpyAsync(&h_val, val, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); status = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); h_val++; status = cudaMemcpyAsync(val, &h_val, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); status = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); status = cudaMemcpyAsync(&h_val2, val, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); status = cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (status) STARPU_CUDA_REPORT_ERROR(status); STARPU_ASSERT_MSG(h_val2 == h_val, "%lx should be %u, not %u, I have just written it ?!\n", (unsigned long)(uintptr_t) val, h_val, h_val2); STARPU_ATOMIC_ADD(&ndone, 1); } #endif #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void opencl_func_incr(void *descr[], void *cl_arg) { (void)cl_arg; 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); STARPU_ATOMIC_ADD(&ndone, 1); } #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.nmpi_ms = 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 != %d + %d\n", variable, INIT_VALUE, NTASKS); FPRINTF(stderr, "ndone: %u\n", ndone); 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.3.9+dfsg/tests/datawizard/mpi_like.c000066400000000000000000000151751413463044200212240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "./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) { (void)cl_arg; 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++) { STARPU_PTHREAD_CREATE(&problem_data[t].thread, NULL, thread_func, &problem_data[t]); } for (t = 0; t < NTHREADS; t++) { void *retval; STARPU_PTHREAD_JOIN(problem_data[t].thread, &retval); 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.3.9+dfsg/tests/datawizard/mpi_like.h000066400000000000000000000020131413463044200212140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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_TESTS_MPI_LIKE_H #define _STARPU_TESTS_MPI_LIKE_H #include #ifdef STARPU_USE_CUDA #ifdef __CUDACC__ extern "C" #endif void cuda_codelet_unsigned_inc(void *descr[], void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif #endif // _STARPU_TESTS_MPI_LIKE_H starpu-1.3.9+dfsg/tests/datawizard/mpi_like_async.c000066400000000000000000000240721413463044200224150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 /* * 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[], void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *cl_arg); #endif void increment_handle_cpu_kernel(void *descr[], void *cl_arg) { (void)cl_arg; 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; 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; 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) { (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++) { STARPU_PTHREAD_CREATE(&problem_data[t].thread, NULL, thread_func, &problem_data[t]); } for (t = 0; t < nthreads; t++) { STARPU_PTHREAD_JOIN(problem_data[t].thread, &retval); 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); STARPU_PTHREAD_JOIN(progress_thread, &retval); 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.3.9+dfsg/tests/datawizard/no_unregister.c000066400000000000000000000042031413463044200223040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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.3.9+dfsg/tests/datawizard/noreclaim.c000066400000000000000000000071051413463044200213760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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(void) { return STARPU_TEST_SKIPPED; } #else void dummy_func(void *descr[], void *_args) { (void)descr; (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_NUMA_MEM", TOTAL, 1); starpu_conf_init(&conf); conf.ncpus = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nmpi_ms = 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.3.9+dfsg/tests/datawizard/nowhere.c000066400000000000000000000073271413463044200211020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 *arg) { (void)arg; 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) { (void)callback_arg; STARPU_ASSERT(x==0); STARPU_ASSERT(y==0); } static void callback(void *callback_arg) { (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) { (void)_args; 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"); if (starpu_memory_nodes_get_numa_count() > 1) { /* FIXME: assumes only one RAM node */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } 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.3.9+dfsg/tests/datawizard/numa_overflow.c000066400000000000000000000063461413463044200223160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else #define ITER 10 #define N 10 #define SIZE (10*1024*1024) /* * Check that when overflowing a NUMA node we manage to revert to other nodes. */ static void nop(void *descr[], void *arg) { (void)descr; (void)arg; } static struct starpu_codelet cl_r = { .cpu_funcs = { nop }, .nbuffers = 1, .modes = { STARPU_R }, }; static struct starpu_codelet cl_rw = { .cpu_funcs = { nop }, .nbuffers = 1, .modes = { STARPU_RW }, }; int main(int argc, char **argv) { starpu_data_handle_t handles[N]; uintptr_t data[N]; int ret; unsigned i, j; char s[16]; int worker; snprintf(s, sizeof(s), "%u", (N*3/4)*SIZE/(1024*1024)); /* We make NUMA nodes not big enough for all data */ setenv("STARPU_LIMIT_CPU_NUMA_MEM", s, 1); ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, &worker, 1) == 0 || starpu_memory_nodes_get_numa_count() <= 1) { /* We need several NUMA nodes */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } /* We distribute some data on both NUMA nodes */ for (i = 0; i < N; i++) { data[i] = starpu_malloc_on_node(i%2, SIZE); memset((void*) data[i], 0, SIZE); starpu_variable_data_register(&handles[i], i%2, data[i], SIZE); } /* And now we try to execute all tasks on worker 0, that will fail if * StarPU doesn't manage to evict some memory */ for (j = 0; j < ITER; j++) for (i = 0; i < N; i++) { if (rand() % 2 == 0) ret = starpu_task_insert(&cl_r, STARPU_R, handles[i], STARPU_EXECUTE_ON_WORKER, worker, 0); else ret = starpu_task_insert(&cl_rw, STARPU_RW, handles[i], STARPU_EXECUTE_ON_WORKER, worker, 0); if (ret == ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } for (i = 0; i < N; i++) { starpu_data_unregister(handles[i]); starpu_free_on_node(i%2, data[i], SIZE); } starpu_shutdown(); return EXIT_SUCCESS; enodev: for (i = 0; i < N; i++) { starpu_data_unregister(handles[i]); starpu_free_on_node(i%2, data[i], SIZE); } 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.3.9+dfsg/tests/datawizard/opencl_codelet_unsigned_inc.c000066400000000000000000000031211413463044200251230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl000066400000000000000000000013721413463044200266450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/partition_dep.c000066400000000000000000000054341413463044200222710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/datawizard/partition_init.c000066400000000000000000000051711413463044200224620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 my_func(void *buffers[], void *cl_arg) { unsigned nb = STARPU_VECTOR_GET_NX(buffers[0]); int *v = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); unsigned i; for(i=0 ; i #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.3.9+dfsg/tests/datawizard/partitioned_acquire.c000066400000000000000000000045041413463044200234600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args) { (void)descr; (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(void) { int ret; starpu_data_handle_t handle, handles[NPARTS]; int i; char d[SIZE]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t) &d, SIZE, sizeof(char)); /* Fork */ struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = NPARTS }; starpu_data_partition_plan(handle, &f, handles); /* Read in parallel */ for (i = 0; i < NPARTS; i++) { starpu_data_acquire(handles[i], STARPU_R); } /* Release in parallel */ for (i = 0; i < NPARTS; i++) { starpu_data_release(handles[i]); } starpu_data_invalidate(handle); /* Acquire in parallel */ for (i = 0; i < NPARTS; i++) { starpu_data_acquire(handles[i], STARPU_W); } /* Release in parallel */ for (i = 0; i < NPARTS; i++) { starpu_data_release(handles[i]); } starpu_data_acquire(handle, STARPU_R); starpu_data_release(handle); /* Read result */ starpu_task_insert(&clr, STARPU_R, handle, 0); /* Clean */ starpu_data_partition_clean(handle, NPARTS, handles); starpu_data_unregister(handle); starpu_shutdown(); return 0; } starpu-1.3.9+dfsg/tests/datawizard/partitioned_initialization.c000066400000000000000000000047451413463044200250650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args) { (void)descr; (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(void) { int ret; starpu_data_handle_t handle, handles[NPARTS]; int i; char d[SIZE]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&handle, STARPU_MAIN_RAM, (uintptr_t) &d, SIZE, sizeof(char)); starpu_data_invalidate(handle); /* Fork */ struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = NPARTS }; starpu_data_partition_plan(handle, &f, 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"); } starpu_data_acquire(handle, STARPU_R); starpu_data_release(handle); /* Read result */ starpu_task_insert(&clr, STARPU_R, handle, 0); /* Clean */ starpu_data_partition_clean(handle, NPARTS, handles); starpu_data_unregister(handle); starpu_shutdown(); return 0; enodev: 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.3.9+dfsg/tests/datawizard/readers_and_writers.c000066400000000000000000000053161413463044200234550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (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.3.9+dfsg/tests/datawizard/readonly.c000066400000000000000000000036041413463044200212420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args) { (void)descr; (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(void) { 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 */ return STARPU_TEST_SKIPPED; } starpu-1.3.9+dfsg/tests/datawizard/reclaim.c000066400000000000000000000111131413463044200210330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_HAVE_HWLOC #include #endif #include "../helper.h" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { 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); #if HWLOC_API_VERSION >= 0x00020000 size = root->total_memory; #else size = root->memory.total_memory; #endif hwloc_topology_destroy(hwtopology); return size; } #endif void dummy_func(void *descr[], 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.3.9+dfsg/tests/datawizard/redux_acquire.c000066400000000000000000000050311413463044200222610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (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) { (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(void) { 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.3.9+dfsg/tests/datawizard/scal.c000066400000000000000000000057521413463044200203550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #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) { (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 *cl_arg) { (void)cl_arg; 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/scal.h000066400000000000000000000020021413463044200203430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/tests/datawizard/scal_cuda.cu000066400000000000000000000025401413463044200215260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/datawizard/scal_opencl.cl000066400000000000000000000016271413463044200220660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/scratch.c000066400000000000000000000101631413463044200210520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_f(void *buffers[], void *args); #endif void cpu_f(void *descr[], void *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/scratch_cuda.cu000066400000000000000000000032751413463044200222410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/datawizard/scratch_opencl.c000066400000000000000000000051071413463044200224140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/datawizard/scratch_opencl_kernel.cl000066400000000000000000000015741413463044200241340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/scratch_reuse.c000066400000000000000000000040311413463044200222520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_SETENV) || !defined(STARPU_USE_CPU) || !defined(STARPU_HAVE_HWLOC) #warning setenv is not defined or no cpu are available. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else #ifdef STARPU_QUICK_CHECK #define ITER 32 #else #define ITER 128 #endif static void kernel(void *buffers[], void *cl_args) { STARPU_ASSERT(STARPU_MATRIX_GET_PTR(buffers[0]) != 0); } static struct starpu_codelet codelet = { .name = "codelet", .cuda_funcs = { kernel }, .nbuffers = 1, .modes = { STARPU_SCRATCH }, }; int main(int argc, char *argv[]) { setenv("STARPU_LIMIT_CUDA_MEM", "50", 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; } starpu_data_handle_t handle[ITER]; int i; for (i = 0; i < ITER; i++) { starpu_matrix_data_register(&handle[i], -1, 0, 1024, 1024, 1024, sizeof(float)); ret = starpu_task_insert(&codelet, STARPU_SCRATCH, handle[i], 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); } starpu_task_wait_for_all(); for (i = 0; i < ITER; i++) starpu_data_unregister(handle[i]); starpu_shutdown(); return 0; } #endif starpu-1.3.9+dfsg/tests/datawizard/simgrid-locality.c000066400000000000000000000020341413463044200226750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(SIMGRID_VERSION) && ((defined(HAVE_MSG_PROCESS_ATTACH) || defined(MSG_process_attach)) && SIMGRID_VERSION >= 31500 & SIMGRID_VERSION != 31559) #undef main int main(int argc, char *argv[]) { return starpu_main(argc, argv); } #endif starpu-1.3.9+dfsg/tests/datawizard/specific_node.c000066400000000000000000000102701413463044200222140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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 */ unsigned data, data2; void specific_kernel(void *descr[], void *arg) { (void)arg; int node = starpu_task_get_current_data_node(0); STARPU_ASSERT(node >= 0); STARPU_ASSERT(starpu_node_get_kind(node) == STARPU_CPU_RAM); unsigned *dataptr = (unsigned*) STARPU_VARIABLE_GET_PTR(descr[0]); if (node == STARPU_MAIN_RAM) STARPU_ASSERT(dataptr == &data); (*dataptr)++; } static struct starpu_codelet specific_cl = { .cpu_funcs = {specific_kernel}, .cuda_funcs = {specific_kernel}, .opencl_funcs = {specific_kernel}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW}, .specific_nodes = 1, .nodes = {STARPU_SPECIFIC_NODE_CPU, STARPU_SPECIFIC_NODE_LOCAL}, }; void cpu_codelet_unsigned_inc(void *descr[], void *arg) { (void)arg; unsigned *dataptr = (unsigned*) STARPU_VARIABLE_GET_PTR(descr[0]); (*dataptr)++; } #ifdef STARPU_USE_CUDA void cuda_codelet_unsigned_inc(void *descr[], 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 = {cpu_codelet_unsigned_inc}, #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(void) { starpu_data_handle_t data_handle, data_handle2; #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; data2 = 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)); starpu_variable_data_register(&data_handle2, STARPU_MAIN_RAM, (uintptr_t) &data2, sizeof(data2)); 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; task->handles[1] = data_handle2; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(data_handle); starpu_data_unregister(data_handle2); 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.3.9+dfsg/tests/datawizard/sync_and_notify_data.c000066400000000000000000000116761413463044200236140ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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[], void *_args); void cuda_codelet_incC(void *descr[], void *_args); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_incA(void *descr[], void *_args); void opencl_codelet_incC(void *descr[], 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[], void *arg) { (void)arg; unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[0]++; } void cpu_codelet_incC(void *descr[], void *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/sync_and_notify_data_implicit.c000066400000000000000000000115241413463044200254760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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[], void *_args); void cuda_codelet_incC(void *descr[], void *_args); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_incA(void *descr[], void *_args); void opencl_codelet_incC(void *descr[], 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[], void *arg) { (void)arg; unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[0]++; } void cpu_codelet_incC(void *descr[], void *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/sync_and_notify_data_kernels.cu000066400000000000000000000027061413463044200255160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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]) */ static __global__ void _cuda_incA(unsigned *v) { v[0]++; } extern "C" void cuda_codelet_incA(void *descr[], void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); _cuda_incA<<<1,1, 0, starpu_cuda_get_local_stream()>>>(v); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } /* * increment c (val[2]) */ static __global__ void _cuda_incC(unsigned *v) { v[2]++; } extern "C" void cuda_codelet_incC(void *descr[], void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); _cuda_incC<<<1,1, 0, starpu_cuda_get_local_stream()>>>(v); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/datawizard/sync_and_notify_data_opencl.c000066400000000000000000000045001413463044200251400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* * Queue kernels which just increment the vector */ extern struct starpu_opencl_program opencl_code; void opencl_codelet_incA(void *descr[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/sync_and_notify_data_opencl_codelet.cl000066400000000000000000000016201413463044200270130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/sync_with_data_with_mem.c000066400000000000000000000066411413463044200243220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *_args) { (void)descr; (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.3.9+dfsg/tests/datawizard/sync_with_data_with_mem_non_blocking.c000066400000000000000000000104021413463044200270320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *_args) { (void)descr; (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) { (void)arg; 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.3.9+dfsg/tests/datawizard/sync_with_data_with_mem_non_blocking_implicit.c000066400000000000000000000103771413463044200307370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *_args) { (void)descr; (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) { (void)arg; 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.3.9+dfsg/tests/datawizard/task_with_multiple_time_the_same_handle.c000066400000000000000000000047721413463044200275420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (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) { (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(void) { 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.3.9+dfsg/tests/datawizard/temporary_partition.c000066400000000000000000000051751413463044200235450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *_args) { (void)descr; (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(void) { 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]); /* Clean */ 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.3.9+dfsg/tests/datawizard/temporary_partition_implicit.c000066400000000000000000000051761413463044200254400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 without submitting explit * partitioning/unpartitioning. */ static void codelet(void *descr[], void *_args) { (void)descr; (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(void) { 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); /* 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]); /* Clean */ 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.3.9+dfsg/tests/datawizard/test_arbiter.cpp000066400000000000000000000140671413463044200224610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/datawizard/unpartition.c000066400000000000000000000072521413463044200220040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *_args) { (void)descr; (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.3.9+dfsg/tests/datawizard/user_interaction_implicit.c000066400000000000000000000044441413463044200246770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/datawizard/variable_parameters.c000066400000000000000000000144271413463044200234420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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) { (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 *cl_arg) { (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]); 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) { (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(void) { 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.3.9+dfsg/tests/datawizard/variable_size.c000066400000000000000000000251321413463044200222440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* * This is a dumb test for variable size * We defined a dumb interface for data whose size increase over kernel execution */ #ifdef STARPU_HAVE_MEMCHECK_H #include #else #define VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(addr, size) (void)0 #endif #include #define FULLSIZE (5*1024*1024ULL) #define INCREASE 0.80 #ifdef STARPU_QUICK_CHECK #define N 5 #define LIMIT "60" #else #define N 20 #define LIMIT "1000" #endif /* Define the interface */ #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #elif STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else /* Sample Data interface with variable size */ struct variable_size_interface { enum starpu_data_interface_id id; /* Just a buffer of a given size */ uintptr_t ptr; size_t size; /* Coordinates of the represented object, just for modeling growth */ unsigned x, y; }; static struct starpu_data_interface_ops starpu_interface_variable_size_ops; static void register_variable_size(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct variable_size_interface *variable_size_interface = data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct variable_size_interface *local_interface = starpu_data_get_interface_on_node(handle, node); if (node == home_node) local_interface->ptr = variable_size_interface->ptr; local_interface->size = variable_size_interface->size; local_interface->id = variable_size_interface->id; local_interface->x = variable_size_interface->x; local_interface->y = variable_size_interface->y; } } void variable_size_data_register(starpu_data_handle_t *handleptr, unsigned x, unsigned y) { if (starpu_interface_variable_size_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID) { starpu_interface_variable_size_ops.interfaceid = starpu_data_interface_get_next_id(); } struct variable_size_interface vsinterface = { .id = starpu_interface_variable_size_ops.interfaceid, .x = x, .y = y, }; /* Simulate that tiles close to the diagonal are more dense */ vsinterface.size = FULLSIZE * (starpu_lrand48() % 1024 + 1024) / 2048. * (N-sqrt(abs((int)x-(int)y)*N)) / N; /* Round to page size */ vsinterface.size -= vsinterface.size & (65536-1); _starpu_simgrid_data_new(vsinterface.size); starpu_data_register(handleptr, -1, &vsinterface, &starpu_interface_variable_size_ops); } static size_t variable_size_get_size(starpu_data_handle_t handle) { struct variable_size_interface *vsinterface = starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); return vsinterface->size; } static uint32_t variable_size_footprint(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(variable_size_get_size(handle), 0); } static int variable_size_compare(void *data_interface_a, void *data_interface_b) { struct variable_size_interface *variable_a = data_interface_a; struct variable_size_interface *variable_b = data_interface_b; /* Two variables are considered compatible if they have the same size */ return variable_a->size == variable_b->size; } static void display_variable_size(starpu_data_handle_t handle, FILE *f) { struct variable_size_interface *variable_interface = starpu_data_get_interface_on_node(handle, STARPU_MAIN_RAM); fprintf(f, "%lu\t", (unsigned long) variable_interface->size); } static starpu_ssize_t describe_variable_size(void *data_interface, char *buf, size_t size) { struct variable_size_interface *variable_interface = data_interface; return snprintf(buf, size, "vv%lu\t", (unsigned long) variable_interface->size); } /* returns the size of the allocated area */ static starpu_ssize_t allocate_variable_size_on_node(void *data_interface, unsigned dst_node) { struct variable_size_interface *variable_interface = data_interface; variable_interface->ptr = starpu_malloc_on_node_flags(dst_node, variable_interface->size, STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT | STARPU_MEMORY_OVERFLOW); if (dst_node == STARPU_MAIN_RAM) _starpu_simgrid_data_alloc(variable_interface->size); STARPU_ASSERT(variable_interface->ptr); return 0; } static void free_variable_size_on_node(void *data_interface, unsigned node) { struct variable_size_interface *variable_interface = data_interface; starpu_free_on_node(node, variable_interface->ptr, variable_interface->size); if (node == STARPU_MAIN_RAM) _starpu_simgrid_data_free(variable_interface->size); } static int variable_size_copy(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct variable_size_interface *src = src_interface; struct variable_size_interface *dst = dst_interface; if (src->size != dst->size) { /* size has been changed by the application in the meantime */ starpu_free_on_node(dst_node, dst->ptr, dst->size); dst->ptr = starpu_malloc_on_node_flags(dst_node, src->size, STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT | STARPU_MEMORY_OVERFLOW); dst->size = src->size; } return starpu_interface_copy(src->ptr, 0, src_node, dst->ptr, 0, dst_node, src->size, async_data); } static const struct starpu_data_copy_methods variable_size_copy_data_methods = { .any_to_any = variable_size_copy, }; static struct starpu_data_interface_ops starpu_interface_variable_size_ops = { .register_data_handle = register_variable_size, .allocate_data_on_node = allocate_variable_size_on_node, .free_data_on_node = free_variable_size_on_node, .copy_methods = &variable_size_copy_data_methods, .get_size = variable_size_get_size, .footprint = variable_size_footprint, .compare = variable_size_compare, .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(struct variable_size_interface), .display = display_variable_size, .pack_data = NULL, .unpack_data = NULL, .describe = describe_variable_size, /* We want to observe actual allocations/deallocations */ .dontcache = 1, }; static void kernel(void *descr[], void *cl_arg) { struct variable_size_interface *variable_interface = descr[0]; unsigned workerid = starpu_worker_get_id_check(); uintptr_t old = variable_interface->ptr; unsigned dst_node = starpu_worker_get_memory_node(workerid); (void) cl_arg; /* Simulate that tiles close to the diagonal fill up faster */ size_t increase = (FULLSIZE - variable_interface->size) * (starpu_lrand48() % 1024 + 1024) / 2048. * INCREASE; /* Round to page size */ increase -= increase & (65536-1); /* Allocation increase */ variable_interface->ptr = starpu_malloc_on_node_flags(dst_node, variable_interface->size + increase, STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT | STARPU_MEMORY_OVERFLOW); VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE((void*) variable_interface->ptr, variable_interface->size + increase); STARPU_ASSERT(variable_interface->ptr); /* fprintf(stderr,"increase from %lu by %lu\n", variable_interface->size, increase); */ starpu_free_on_node_flags(dst_node, old, variable_interface->size, STARPU_MALLOC_PINNED | STARPU_MALLOC_COUNT | STARPU_MEMORY_OVERFLOW); variable_interface->size += increase; /* These are only simulation bits */ if (increase) _starpu_simgrid_data_increase(increase); starpu_sleep(0.010); } static double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void)t; (void)a; (void)i; return 10000; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = {kernel}, /* dynamic size doesn't work on MIC */ /*.cpu_funcs_name = {"kernel"},*/ .nbuffers = 1, .modes = {STARPU_RW}, .model = &perf_model, .flags = STARPU_CODELET_SIMGRID_EXECUTE, }; static void init(void *descr[], void *cl_arg) { (void)cl_arg; struct variable_size_interface *variable_interface = descr[0]; VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE((void*) variable_interface->ptr, variable_interface->size); } static struct starpu_codelet cl_init = { .cpu_funcs = {init}, /* dynamic size doesn't work on MIC */ /*.cpu_funcs_name = {"kernel"},*/ .nbuffers = 1, .modes = {STARPU_W}, .model = &starpu_perfmodel_nop, }; int main(void) { int ret; int i; int x, y; starpu_data_handle_t handles[N][N]; char s[128]; snprintf(s, sizeof(s), "/tmp/%s-variable_size", getenv("USER")); setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); setenv("STARPU_LIMIT_CPU_MEM", LIMIT, 1); setenv("STARPU_DISK_SWAP", s, 0); setenv("STARPU_DISK_SWAP_SIZE", "100000", 1); #if 0 //def STARPU_LINUX_SYS setenv("STARPU_DISK_SWAP_BACKEND", "unistd_o_direct", 0); #else setenv("STARPU_DISK_SWAP_BACKEND", "unistd", 0); #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for (x = 0; x < N; x++) for (y = 0; y < N; y++) { variable_size_data_register(&handles[x][y], x, y); ret = starpu_task_insert(&cl_init, STARPU_W, handles[x][y], 0); if (ret == ENODEV) goto enodev; #ifdef STARPU_SIMGRID starpu_sleep(0.0005); #endif } starpu_task_wait_for_all(); /* Cholesky-like accesses */ for (i = 0; i < N; i++) for (x = i; x < N; x++) for (y = x; y < N; y++) starpu_task_insert(&cl, STARPU_RW, handles[x][y], STARPU_PRIORITY, (2*N-x-y), 0); starpu_task_wait_for_all(); #if 0 /* Look at the values */ for (x = 0; x < N; x++) for (y = 0; y < N; y++) { starpu_data_acquire(handles[x][y], STARPU_R); starpu_data_release(handles[x][y]); } #endif for (x = 0; x < N; x++) for (y = 0; y < N; y++) starpu_data_unregister(handles[x][y]); starpu_shutdown(); return EXIT_SUCCESS; enodev: for (x = 0; x < N; x++) for (y = 0; y < N; y++) starpu_data_unregister(handles[x][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; } #endif starpu-1.3.9+dfsg/tests/datawizard/write_only_tmp_buffer.c000066400000000000000000000076331413463044200240370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; 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[], void *arg) { (void)arg; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); *buf = 42; } void display_var(void *descr[], void *arg) { (void)arg; 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.3.9+dfsg/tests/datawizard/wt_broadcast.c000066400000000000000000000076301413463044200221040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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) { (void)cl_arg; 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 *cl_arg) { (void)cl_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 *cl_arg) { (void)cl_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(void) { 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.3.9+dfsg/tests/datawizard/wt_host.c000066400000000000000000000076451413463044200211250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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) { (void)cl_arg; 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 *cl_arg) { (void)cl_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 *cl_arg) { (void)cl_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(void) { 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.3.9+dfsg/tests/disk/000077500000000000000000000000001413463044200160565ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/disk/disk_compute.c000066400000000000000000000266641413463044200207260ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 "../helper.h" #ifdef STARPU_HAVE_HDF5 #include #endif #if STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else /* * 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; } #ifdef STARPU_HAVE_HDF5 int dotest_hdf5(struct starpu_disk_ops *ops, char *base) { int *A, *C; herr_t status; /* Open and close file, just to create an empty file */ FILE * f = fopen(base, "wb+"); if (!f) goto h5fail2; fclose(f); /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); if (ret == -ENODEV) goto h5enodev; /* Initialize path */ const char *path_obj_start = "STARPU_DISK_COMPUTE_DATA_"; const char *path_obj_end = "STARPU_DISK_COMPUTE_DATA_RESULT_"; /* 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 h5enoent; 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; } /* Open HDF5 file to store data */ hid_t file = H5Fopen(base, H5F_ACC_RDWR, H5P_DEFAULT); if (file < 0) goto h5enoent2; /* store initial data in the file */ hsize_t dims[1] = {NX}; hid_t dataspace = H5Screate_simple(1, dims, NULL); if (dataspace < 0) { H5Fclose(file); goto h5fail; } hid_t dataset = H5Dcreate2(file, path_obj_start, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (dataset < 0) { H5Sclose(dataspace); H5Fclose(file); goto h5fail; } status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, A); /* close the resources before checking the writing */ H5Dclose(dataset); if (status < 0) { H5Fclose(file); goto h5fail; } /* intialize results in file */ dataset = H5Dcreate2(file, path_obj_end, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (dataset < 0) { H5Sclose(dataspace); H5Fclose(file); goto h5fail; } status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, A); /* close the resources before checking the writing */ H5Dclose(dataset); H5Sclose(dataspace); H5Fclose(file); if (status < 0) goto h5fail; /* And now, you want to use your datas in StarPU */ /* Open the file ON the disk */ void * data = starpu_disk_open(dd, (void *) path_obj_start, NX*sizeof(int)); void * data_result = starpu_disk_open(dd, (void *) path_obj_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 */ file = H5Fopen(base, H5F_ACC_RDWR, H5P_DEFAULT); if (file < 0) goto h5enoent2; dataset = H5Dopen2(file, path_obj_end, H5P_DEFAULT); if (dataset < 0) { H5Fclose(file); goto h5fail; } status = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, C); /* close the resources before checking the writing */ H5Dclose(dataset); H5Fclose(file); if (status < 0) goto h5fail; 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); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); unlink(base); if(try) FPRINTF(stderr, "TEST SUCCESS\n"); else FPRINTF(stderr, "TEST FAIL\n"); return (try ? EXIT_SUCCESS : EXIT_FAILURE); h5enodev: unlink(base); return STARPU_TEST_SKIPPED; h5enoent2: starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); h5enoent: FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); unlink(base); return STARPU_TEST_SKIPPED; h5fail: starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_shutdown(); unlink(base); h5fail2: FPRINTF(stderr, "Something goes wrong with HDF5 dataset/dataspace/write \n"); return EXIT_FAILURE; } #endif 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; #ifdef STARPU_HAVE_SETENV setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); #endif 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 #ifdef STARPU_HAVE_HDF5 char hdf5_base[128]; strcpy(hdf5_base, s); strcat(hdf5_base, "/STARPU_HDF5_file.h5"); ret = merge_result(ret, dotest_hdf5(&starpu_disk_hdf5_ops, hdf5_base)); #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } #endif starpu-1.3.9+dfsg/tests/disk/disk_copy.c000066400000000000000000000132271413463044200202130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 "../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(void) { return STARPU_TEST_SKIPPED; } #elif STARPU_MAXNODES == 1 /* Cannot register a disk */ 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_NUMA_MEM", RAM, 1); /* Initialize StarPU without GPU devices to make sure the memory of the GPU devices will not be used */ // Ignore environment variables as we want to force the exact number of workers struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; conf.precedence_over_environment_variables = 1; conf.ncpus = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 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; #ifdef STARPU_HAVE_SETENV setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); #endif 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 #ifdef STARPU_HAVE_HDF5 ret = merge_result(ret, dotest(&starpu_disk_hdf5_ops, s)); #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } #endif starpu-1.3.9+dfsg/tests/disk/disk_copy_to_disk.c000066400000000000000000000257311413463044200217320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 "../helper.h" #ifdef STARPU_HAVE_HDF5 #include #endif #if STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else /* * Try to write into disk memory * Use mechanism to push data from disk to disk. */ #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_dir_src = "src"; const char *name_dir_dst = "dst"; char * path_file_start = malloc(strlen(base) + 1 + strlen(name_dir_src) + 1 + strlen(name_file_start) + 1); strcpy(path_file_start, base); strcat(path_file_start, "/"); strcat(path_file_start, name_dir_src); strcat(path_file_start, "/"); strcat(path_file_start, name_file_start); char * base_src = malloc(strlen(base) + 1 + strlen(name_dir_src) + 1); strcpy(base_src, base); strcat(base_src, "/"); strcat(base_src, name_dir_src); char * base_dst = malloc(strlen(base) + 1 + strlen(name_dir_dst) + 1); strcpy(base_dst, base); strcat(base_dst, "/"); strcat(base_dst, name_dir_dst); /* register a disks */ int disk_src = starpu_disk_register(ops, (void *) base_src, STARPU_DISK_SIZE_MIN); if (disk_src == -ENOENT) goto enoent; int disk_dst = starpu_disk_register(ops, (void *) base_dst, STARPU_DISK_SIZE_MIN); if (disk_dst == -ENOENT) goto enoent; /* 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); /* And now, you want to use your datas in StarPU */ /* Open the file ON the disk */ void * data = starpu_disk_open(disk_src, (void *) name_file_start, NX*sizeof(int)); starpu_data_handle_t vector_handleA; starpu_vector_data_register(&vector_handleA, disk_src, (uintptr_t) data, NX, sizeof(int)); /* Move and invalidate copy to an other disk */ starpu_data_acquire_on_node(vector_handleA, disk_dst, STARPU_RW); starpu_data_release_on_node(vector_handleA, disk_dst); starpu_data_acquire_on_node(vector_handleA, disk_src, STARPU_RW); starpu_data_release_on_node(vector_handleA, disk_src); /* free them */ starpu_data_unregister(vector_handleA); /* close them in StarPU */ starpu_disk_close(disk_src, data, NX*sizeof(int)); /* check results */ f = fopen(path_file_start, "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); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); unlink(path_file_start); rmdir(base_src); free(base_src); free(base_dst); free(path_file_start); 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: free(base_src); free(base_dst); free(path_file_start); FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } #ifdef STARPU_HAVE_HDF5 int dotest_hdf5(struct starpu_disk_ops *ops, char *base) { int *A, *C; herr_t status; /* Initialize path */ const char *path_obj_start = "STARPU_DISK_COMPUTE_DATA"; const char *name_hdf5_start = "STARPU_HDF5_src_file.h5"; const char *name_hdf5_end = "STARPU_HDF5_dst_file.h5"; char * hdf5_base_src = malloc(strlen(base) + 1 + strlen(name_hdf5_start) + 1); strcpy(hdf5_base_src, base); strcat(hdf5_base_src, "/"); strcat(hdf5_base_src, name_hdf5_start); char * hdf5_base_dst = malloc(strlen(base) + 1 + strlen(name_hdf5_end) + 1); strcpy(hdf5_base_dst, base); strcat(hdf5_base_dst, "/"); strcat(hdf5_base_dst, name_hdf5_end); /* Open and close files, just to create empty files */ FILE * file_src = fopen(hdf5_base_src, "wb+"); if (!file_src) goto h5fail2; fclose(file_src); FILE * file_dst = fopen(hdf5_base_dst, "wb+"); if (!file_dst) { goto h5fail2; } fclose(file_dst); /* Initialize StarPU with default configuration */ int ret = starpu_init(NULL); if (ret == -ENODEV) goto h5enodev; /* register disks */ int disk_src = starpu_disk_register(ops, (void *) hdf5_base_src, STARPU_DISK_SIZE_MIN); if (disk_src == -ENOENT) goto h5enoent; int disk_dst = starpu_disk_register(ops, (void *) hdf5_base_dst, STARPU_DISK_SIZE_MIN); if (disk_dst == -ENOENT) goto h5enoent; /* 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; } /* Open HDF5 file to store data */ hid_t file = H5Fopen(hdf5_base_src, H5F_ACC_RDWR, H5P_DEFAULT); if (file < 0) goto h5fail; /* store initial data in the file */ hsize_t dims[1] = {NX}; hid_t dataspace = H5Screate_simple(1, dims, NULL); if (dataspace < 0) { H5Fclose(file); goto h5fail; } hid_t dataset = H5Dcreate2(file, path_obj_start, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (dataset < 0) { H5Sclose(dataspace); H5Fclose(file); goto h5fail; } status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, A); /* close the resources before checking the writing */ H5Dclose(dataset); if (status < 0) { H5Fclose(file); goto h5fail; } H5Sclose(dataspace); H5Fclose(file); /* Open the file ON the disk */ void * data = starpu_disk_open(disk_src, (void *) path_obj_start, NX*sizeof(int)); starpu_data_handle_t vector_handleA; starpu_vector_data_register(&vector_handleA, disk_src, (uintptr_t) data, NX, sizeof(int)); /* Move and invalidate copy to an other disk */ starpu_data_acquire_on_node(vector_handleA, disk_dst, STARPU_RW); starpu_data_release_on_node(vector_handleA, disk_dst); starpu_data_acquire_on_node(vector_handleA, disk_src, STARPU_RW); starpu_data_release_on_node(vector_handleA, disk_src); starpu_data_unregister(vector_handleA); /* close them in StarPU */ starpu_disk_close(disk_src, data, NX*sizeof(int)); /* check results */ file = H5Fopen(hdf5_base_src, H5F_ACC_RDWR, H5P_DEFAULT); if (file < 0) goto h5fail; dataset = H5Dopen2(file, path_obj_start, H5P_DEFAULT); if (dataset < 0) { H5Fclose(file); goto h5fail; } status = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, C); /* close the resources before checking the writing */ H5Dclose(dataset); H5Fclose(file); if (status < 0) goto h5fail; 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); /* terminate StarPU, no task can be submitted after */ starpu_shutdown(); unlink(hdf5_base_src); unlink(hdf5_base_dst); free(hdf5_base_src); free(hdf5_base_dst); if(try) FPRINTF(stderr, "TEST SUCCESS\n"); else FPRINTF(stderr, "TEST FAIL\n"); return (try ? EXIT_SUCCESS : EXIT_FAILURE); h5fail: starpu_free_flags(A, NX*sizeof(int), STARPU_MALLOC_COUNT); starpu_free_flags(C, NX*sizeof(int), STARPU_MALLOC_COUNT); h5enoent: FPRINTF(stderr, "Couldn't write data: ENOENT\n"); starpu_shutdown(); h5enodev: unlink(hdf5_base_src); unlink(hdf5_base_dst); free(hdf5_base_src); free(hdf5_base_dst); return STARPU_TEST_SKIPPED; h5fail2: free(hdf5_base_src); free(hdf5_base_dst); FPRINTF(stderr, "Something goes wrong with HDF5 dataset/dataspace/write \n"); return EXIT_FAILURE; } #endif 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; #ifdef STARPU_HAVE_SETENV setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); #endif 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 #ifdef STARPU_HAVE_HDF5 ret = merge_result(ret, dotest_hdf5(&starpu_disk_hdf5_ops, s)); #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } #endif starpu-1.3.9+dfsg/tests/disk/disk_copy_unpack.c000066400000000000000000000105701413463044200215520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 pack / unpack methods before pushing data on disk with async read/write. */ /* size of one vector */ #ifdef STARPU_QUICK_CHECK # define DISK 64 # define NX (256*1024/sizeof(double)) #else # define NX (32*1048576/sizeof(double)) # define DISK 200 #endif #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #elif STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else int dotest(struct starpu_disk_ops *ops, void *param) { unsigned *A; int ret; /* Initialize StarPU without GPU devices to make sure the memory of the GPU devices will not be used */ // Ignore environment variables as we want to force the exact number of workers struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; conf.precedence_over_environment_variables = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 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(unsigned), 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; } starpu_data_handle_t vector_handleA; static const struct starpu_data_copy_methods my_vector_copy_data_methods_s = { .any_to_any = NULL, }; starpu_interface_vector_ops.copy_methods = &my_vector_copy_data_methods_s; /* register vector in starpu */ starpu_vector_data_register(&vector_handleA, STARPU_MAIN_RAM, (uintptr_t)A, NX, sizeof(unsigned)); /* Move and invalidate copy to an other disk */ starpu_data_acquire_on_node(vector_handleA, new_dd, STARPU_RW); starpu_data_release_on_node(vector_handleA, new_dd); starpu_data_acquire_on_node(vector_handleA, new_dd, STARPU_RW); starpu_data_release_on_node(vector_handleA, new_dd); /* free them */ starpu_data_unregister(vector_handleA); /* check if computation is correct */ int try = 1; for (j = 0; j < NX; ++j) if (A[j] != j) { FPRINTF(stderr, "Fail A %u != %u \n", A[j], j); try = 0; } starpu_free_flags(A, NX*sizeof(unsigned), 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; #ifdef STARPU_HAVE_SETENV setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); #endif 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 #ifdef STARPU_HAVE_HDF5 ret = merge_result(ret, dotest(&starpu_disk_hdf5_ops, s)); #endif ret2 = rmdir(s); if (ret2 < 0) STARPU_CHECK_RETURN_VALUE(-errno, "rmdir '%s'\n", s); return ret; } #endif starpu-1.3.9+dfsg/tests/disk/disk_pack.c000066400000000000000000000166561413463044200201700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 "../helper.h" #if STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else /* * 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, .allocsize = nx * elemsize, }; 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 */ // Ignore environment variables as we want to force the exact number of workers struct starpu_conf conf; int ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; conf.precedence_over_environment_variables = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 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; #ifdef STARPU_HAVE_SETENV setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); #endif 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.3.9+dfsg/tests/disk/mem_reclaim.c000066400000000000000000000173261413463044200205050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 "../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_IF_ADDRESSABLE(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(void) { return STARPU_TEST_SKIPPED; } #elif STARPU_MAXNODES == 1 /* Cannot register a disk */ int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int (*any_to_any)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); /* We need a ram-to-ram copy for NUMA machine, use any_to_any for that */ static int ram_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { return any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } const struct starpu_data_copy_methods my_vector_copy_data_methods_s = { .ram_to_ram = ram_to_ram }; 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, .allocsize = nx * elemsize, }; starpu_data_register(handleptr, home_node, &vector, &starpu_interface_my_vector_ops); } static unsigned values[NDATA]; static void zero(void *buffers[], void *args) { (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_IF_ADDRESSABLE(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), const char *text) { int *A, *C; starpu_data_handle_t handles[NDATA]; if (starpu_get_env_number_default("STARPU_DIDUSE_BARRIER", 0)) /* This would hang */ return STARPU_TEST_SKIPPED; FPRINTF(stderr, "Testing <%s>\n", text); /* Initialize StarPU without GPU devices to make sure the memory of the GPU devices will not be used */ // Ignore environment variables as we want to force the exact number of workers struct starpu_conf conf; int ret = starpu_conf_init(&conf); if (ret == -EINVAL) return EXIT_FAILURE; conf.precedence_over_environment_variables = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 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; #ifdef STARPU_HAVE_SETENV setenv("STARPU_CALIBRATE_MINIMUM", "1", 1); #endif 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 */ any_to_any = starpu_interface_vector_ops.copy_methods->any_to_any; 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, "Stdio with read/write vector ops")); ret = merge_result(ret, dotest(&starpu_disk_stdio_ops, s, starpu_my_vector_data_register, "Stdio with pack/unpack vector ops")); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s, starpu_vector_data_register, "unistd with read/write vector ops")); ret = merge_result(ret, dotest(&starpu_disk_unistd_ops, s, starpu_my_vector_data_register, "unistd with pack/unpack vector ops")); #ifdef STARPU_LINUX_SYS ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s, starpu_vector_data_register, "unistd_direct with read/write vector ops")); ret = merge_result(ret, dotest(&starpu_disk_unistd_o_direct_ops, s, starpu_my_vector_data_register, "unistd_direct with pack/unpack vector ops")); #endif ret2 = rmdir(s); STARPU_CHECK_RETURN_VALUE(ret2, "rmdir '%s'\n", s); return ret; } #endif starpu-1.3.9+dfsg/tests/errorcheck/000077500000000000000000000000001413463044200172535ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/errorcheck/invalid_blocking_calls.c000066400000000000000000000066141413463044200241020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 we catch calling tag_wait, i.e. a blocking call, from the * codelet function, which is invalid. This test is thus expected to fail. */ /* mpirun may not exit if it fails, skip the test for master-slave */ #if defined(STARPU_NO_ASSERT) || defined(STARPU_USE_MPI_MASTER_SLAVE) int main(void) { return STARPU_TEST_SKIPPED; } #else #define TAG 0x42 static starpu_data_handle_t handle; static unsigned *data; void wrong_func(void *descr[], void *arg) { (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) { (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; disable_coredump(); 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.3.9+dfsg/tests/errorcheck/invalid_tasks.c000066400000000000000000000041741413463044200222600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 we detect that with only a CPU we can't submit a GPU-only task */ #if !defined(STARPU_USE_CPU) #warning no cpu are available. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else void dummy_func(void *descr[], void *arg) { (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(void) { int ret; /* We force StarPU to use 1 CPU only */ struct starpu_conf conf; starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; 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.3.9+dfsg/tests/errorcheck/starpu_init_noworker.c000066400000000000000000000041301413463044200237040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 */ int main(int argc, char **argv) { int ret; /* We try to initialize StarPU without any worker */ struct starpu_conf conf; starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; conf.ncpus = 0; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nmpi_ms = 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(); unsigned nmic = starpu_mic_worker_get_count(); unsigned nmpi_ms = starpu_mpi_ms_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); FPRINTF(stderr, "\t%u MIC devices\n", nmic); FPRINTF(stderr, "\t%u MPI Master-Slaves devices\n", nmpi_ms); return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/errorcheck/workers_cpuid.c000066400000000000000000000104711413463044200223020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 various values for STARPU_WORKERS_CPUID, checking that the * expected binding does happen */ #if !defined(STARPU_USE_CPU) || !defined(STARPU_HAVE_HWLOC) || !defined(STARPU_HAVE_SETENV) #warning no cpu are available. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else #include #ifdef STARPU_QUICK_CHECK #define CPUSTEP 8 #define NB_TESTS 1 #else #define CPUSTEP 1 #define NB_TESTS 5 #endif int nhwpus; long workers_cpuid[STARPU_NMAXWORKERS]; int workers_id[STARPU_NMAXWORKERS]; static int check_workers_mapping(long *cpuid, int *workerids, int nb_workers) { int i; for (i=0; i STARPU_NMAXWORKERS) nhwpus = STARPU_NMAXWORKERS; for (i=0; i #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.3.9+dfsg/tests/helper/000077500000000000000000000000001413463044200164035ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/helper/cublas_init.c000066400000000000000000000035351413463044200210510ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/helper/cusparse_init.c000066400000000000000000000035431413463044200214240ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 ms\n", init_timing/(1000)); FPRINTF(stderr, "\tshutdown: %2.2f ms\n", shutdown_timing/(1000)); if (ngpus != 0) { FPRINTF(stderr, "per-GPU (#gpu = %u):\n", ngpus); FPRINTF(stderr, "\tinit: %2.2f ms\n", init_timing/(1000*ngpus)); FPRINTF(stderr, "\tshutdown: %2.2f ms\n", shutdown_timing/(1000*ngpus)); } starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.3.9+dfsg/tests/helper/execute_on_all.c000066400000000000000000000026641413463044200215450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/helper/pinned_memory.c000066400000000000000000000024471413463044200214230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/helper/starpu_create_sync_task.c000066400000000000000000000046231413463044200234730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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"}, .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.3.9+dfsg/tests/helper/starpu_data_cpy.c000066400000000000000000000032401413463044200217300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/loader-cross.sh.in000066400000000000000000000025441413463044200204670ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Thibaut Lambert # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 case "$exec" in /*) ;; *) exec="$PWD/$exec" esac NATIVE=${exec/\/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" export STARPU_MIC_SINK_PROGRAM_PATH="$DIR" # 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" "$@" starpu-1.3.9+dfsg/tests/loader.c000066400000000000000000000255641413463044200165520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #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 1000 #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; (void) sig; // 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); raise(SIGALRM); exit(EXIT_FAILURE); } static void forwardsig(int sig) { pid_t child_gid; child_gid = getpgid(child_pid); kill(-child_gid, sig); } 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; char *libtool; const char *top_builddir = getenv ("top_builddir"); struct sigaction sa; int ret; struct timeval start; struct timeval end; double timing; int x=1; (void) argc; test_args = NULL; timeout = 0; launcher=getenv("STARPU_CHECK_LAUNCHER"); launcher_args=getenv("STARPU_CHECK_LAUNCHER_ARGS"); if (argv[x] && strcmp(argv[x], "-t") == 0) { timeout = strtol(argv[x+1], NULL, 10); x += 2; } else if (getenv("STARPU_TIMEOUT_ENV")) { /* get user-defined iter_max value */ timeout = strtol(getenv("STARPU_TIMEOUT_ENV"), NULL, 10); } if (timeout <= 0) { timeout = DEFAULT_TIMEOUT; if ((launcher && strstr(launcher, "valgrind")) || (launcher && strstr(launcher, "helgrind")) || getenv("TSAN_OPTIONS") != NULL) timeout *= 20; if (getenv("ASAN_OPTIONS") != NULL || getenv("USAN_OPTIONS") != NULL || getenv("LSAN_OPTIONS") != NULL) timeout *= 5; } #ifdef STARPU_SIMGRID #ifdef STARPU_DEBUG timeout *= 20; #endif #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE /* compare values between the 2 values of timeout */ if (getenv("MPIEXEC_TIMEOUT")) { int mpiexec_timeout = strtol(getenv("MPIEXEC_TIMEOUT"), NULL, 10); if (mpiexec_timeout != timeout) fprintf(stderr, "[warning] MPIEXEC_TIMEOUT and STARPU_TIMEOUT_ENV values are different (%d and %d). The behavior may be different than expected !\n", mpiexec_timeout, timeout); } #endif if (argv[x] && strcmp(argv[x], "-p") == 0) { test_name = malloc(strlen(argv[x+1]) + 1 + strlen(argv[x+2]) + 1); sprintf(test_name, "%s/%s", argv[x+1], argv[x+2]); x += 3; } else { test_name = argv[x]; x += 1; } if (!test_name) { fprintf(stderr, "[error] Need name of program to start\n"); exit(EXIT_FAILURE); } size_t len = strlen(test_name); if (len >= 3 && test_name[len-3] == '.' && test_name[len-2] == 's' && test_name[len-1] == 'h') { /* This is a shell script, don't run ourself on bash, but make * the script call us for each program invocation */ setenv("STARPU_LAUNCH", argv[0], 1); execvp(test_name, argv+x-1); fprintf(stderr, "[error] '%s' failed to exec. test marked as failed\n", test_name); exit(EXIT_FAILURE); } if (strstr(test_name, "spmv/dw_block_spmv")) { test_args = (char *) calloc(512, sizeof(char)); snprintf(test_args, 512, "%s/examples/spmv/matrix_market/examples/fidapm05.mtx", STARPU_SRC_DIR); } else if (strstr(test_name, "starpu_perfmodel_display")) { if (x >= argc) test_args = strdup("-l"); } else if (strstr(test_name, "starpu_perfmodel_plot")) { if (x >= argc) test_args = strdup("-l"); } /* get launcher program */ if (launcher_args) launcher_args=strdup(launcher_args); if (top_builddir == NULL) { fprintf(stderr, "warning: $top_builddir undefined, " "so $STARPU_CHECK_LAUNCHER ignored\n"); launcher = NULL; launcher_args = NULL; libtool = NULL; } else { libtool = malloc(strlen(top_builddir) + 1 + strlen("libtool") + 1); strcpy(libtool, top_builddir); strcat(libtool, "/libtool"); } if (launcher) { const char *top_srcdir = getenv("top_srcdir"); decode(&launcher, "@top_srcdir@", top_srcdir); decode(&launcher_args, "@top_srcdir@", top_srcdir); } setenv("STARPU_OPENCL_PROGRAM_DIR", STARPU_SRC_DIR, 1); /* set SIGALARM handler */ sa.sa_flags = SA_RESETHAND | SA_NODEFER; sigemptyset(&sa.sa_mask); sa.sa_handler = test_cleaner; if (-1 == sigaction(SIGALRM, &sa, NULL)) perror("sigaction"); signal(SIGINT, forwardsig); signal(SIGHUP, forwardsig); signal(SIGPIPE, forwardsig); signal(SIGTERM, forwardsig); child_pid = fork(); if (child_pid == 0) { char *launcher_argv[100]; int i=0; setpgid(0, 0); /* "Launchers" such as Valgrind need to be inserted * after the Libtool-generated wrapper scripts, hence * this special-case. */ if (launcher && top_builddir != NULL) { launcher_argv[i++] = libtool; launcher_argv[i++] = "--mode=execute"; launcher_argv[i++] = launcher; if (launcher_args) { launcher_argv[i++] = strtok(launcher_args, " "); while (launcher_argv[i-1]) { launcher_argv[i++] = strtok(NULL, " "); } } } launcher_argv[i++] = test_name; if (test_args) launcher_argv[i++] = test_args; else while (argv[x]) { launcher_argv[i++] = argv[x++]; } #ifdef STARPU_SIMGRID #ifdef STARPU_DEBUG launcher_argv[i++] = "--cfg=contexts/factory:thread"; #endif #endif launcher_argv[i++] = NULL; execvp(*launcher_argv, launcher_argv); 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); free(libtool); 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.3.9+dfsg/tests/main/000077500000000000000000000000001413463044200160505ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/main/bind.c000066400000000000000000000047221413463044200171350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 binding the main thread to its dedicated core, making one less CPU core * available to StarPU. */ int main(void) { int ret; struct starpu_conf conf; int ncpus; unsigned active_bindid; unsigned passive_bindid1; unsigned passive_bindid2; /* First get the number of cores */ starpu_conf_init(&conf); ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ncpus = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); starpu_shutdown(); /* Check we have enough of them */ if (ncpus <= 2) return STARPU_TEST_SKIPPED; /* Now re-initialize with two cores less */ starpu_conf_init(&conf); conf.reserve_ncpus = 2; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Make sure StarPU uses two core less */ STARPU_ASSERT_MSG(starpu_worker_get_count_by_type(STARPU_CPU_WORKER) == ncpus-2, "Expected %d CPUs, got %d\n", ncpus-2, starpu_worker_get_count_by_type(STARPU_CPU_WORKER)); FPRINTF(stderr, "CPUS: %d as expected\n", starpu_worker_get_count_by_type(STARPU_CPU_WORKER)); /* Check we can grab a whole core */ active_bindid = starpu_get_next_bindid(STARPU_THREAD_ACTIVE, NULL, 0); starpu_bind_thread_on(active_bindid, STARPU_THREAD_ACTIVE, "main"); /* Check we can request for an additional shared core */ passive_bindid1 = starpu_get_next_bindid(0, NULL, 0); passive_bindid2 = starpu_get_next_bindid(0, NULL, 0); STARPU_ASSERT(passive_bindid1 != active_bindid); STARPU_ASSERT(passive_bindid1 == passive_bindid2); starpu_bind_thread_on(passive_bindid1, 0, "main"); starpu_bind_thread_on(passive_bindid2, 0, "main"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.3.9+dfsg/tests/main/callback.c000066400000000000000000000051601413463044200177520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 codelet_callback_func(void *arg) { if (arg) { int *x = (int *)arg; FPRINTF(stderr, "calling callback codelet arg %d\n", *x); } else FPRINTF(stderr, "calling callback codelet arg %p\n", arg); } void task_callback_func(void *arg) { FPRINTF(stderr, "\ncalling callback task arg %p\n", arg); if (starpu_task_get_current()->cl->callback_func) starpu_task_get_current()->cl->callback_func(arg); } struct starpu_codelet mycodelet = { .where = STARPU_NOWHERE, .callback_func = codelet_callback_func }; struct starpu_codelet mycodelet2 = { .where = STARPU_NOWHERE, }; int main(void) { int ret; int value=12; int value2=24; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_task_insert(&mycodelet, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&mycodelet, STARPU_CALLBACK_ARG_NFREE, &value, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&mycodelet, STARPU_CALLBACK, &task_callback_func, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&mycodelet, STARPU_CALLBACK, &task_callback_func, STARPU_CALLBACK_ARG_NFREE, &value2, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&mycodelet2, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&mycodelet2, STARPU_CALLBACK, &task_callback_func, STARPU_CALLBACK_ARG_NFREE, &value, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); 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.3.9+dfsg/tests/main/codelet_null_callback.c000066400000000000000000000054001413463044200225000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_NFREE, callback, &x, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(NULL, STARPU_CALLBACK, callback2, STARPU_CALLBACK_ARG_NFREE, &x2, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(NULL, STARPU_PROLOGUE_CALLBACK, prologue_callback, STARPU_PROLOGUE_CALLBACK_ARG_NFREE, &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_NFREE, &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.3.9+dfsg/tests/main/declare_deps_after_submission.c000066400000000000000000000052441413463044200242670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/declare_deps_after_submission_synchronous.c000066400000000000000000000052751413463044200267450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/declare_deps_in_callback.c000066400000000000000000000050741413463044200231360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/deploop.c000066400000000000000000000045171413463044200176650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (void)descr; (void)arg; 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(void) { 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.3.9+dfsg/tests/main/deprecated_func.c000066400000000000000000000067761413463044200213470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 we support the cpu_func and where deprecated field */ void cpu_codelet(void *descr[], void *_args) { (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[], void *_args) { (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(void) { 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.3.9+dfsg/tests/main/display_binding.c000066400000000000000000000021731413463044200213560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" #if !defined(STARPU_HAVE_SETENV) #warning setenv is not defined. Skipping test int main(void) { return STARPU_TEST_SKIPPED; } #else int main(void) { setenv("STARPU_DISPLAY_BINDINGS", "1", 1); int ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_shutdown(); return EXIT_SUCCESS; } #endif starpu-1.3.9+dfsg/tests/main/driver_api/000077500000000000000000000000001413463044200201745ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/main/driver_api/init_run_deinit.c000066400000000000000000000143701413463044200235300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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.precedence_over_environment_variables = 1; conf.ncpus = 1; conf.ncuda = 0; 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 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.precedence_over_environment_variables = 1; conf.ncpus = 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.precedence_over_environment_variables = 1; conf.ncpus = 0; 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; } 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; #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; } starpu-1.3.9+dfsg/tests/main/driver_api/run_driver.c000066400000000000000000000153701413463044200225250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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.precedence_over_environment_variables = 1; conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncpus = 1; conf.ncuda = 0; conf.nopencl = 0; 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.precedence_over_environment_variables = 1; conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncpus = 0; conf.ncuda = 1; conf.nopencl = 0; 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; } if (starpu_cuda_worker_get_count() > 1) { FPRINTF(stderr, "WARNING: More than one worker, this is not supported by this test\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (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"); 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.precedence_over_environment_variables = 1; conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncpus = 1; 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) 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"); 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; #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; } starpu-1.3.9+dfsg/tests/main/empty_task.c000066400000000000000000000045671413463044200204100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/main/empty_task_chain.c000066400000000000000000000037551413463044200215500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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]); } if (i == (N-1)) tasks[i]->detach = 0; } for (i = 1; i < N; i++) { ret = starpu_task_submit(tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } 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.3.9+dfsg/tests/main/empty_task_sync_point.c000066400000000000000000000061601413463044200226440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 }; 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.3.9+dfsg/tests/main/empty_task_sync_point_tasks.c000066400000000000000000000051271413463044200240530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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[], void *arg) { (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 }; 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; starpu_task_declare_deps(taskD, 3, taskA, taskB, taskC); 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.3.9+dfsg/tests/main/execute_on_a_specific_worker.c000066400000000000000000000101411413463044200241050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (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[], void *_args) { (void)descr; (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.3.9+dfsg/tests/main/execute_schedule.c000066400000000000000000000065131413463044200215370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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(void *descr[], void *_args) { (void)descr; 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.3.9+dfsg/tests/main/get_children_tasks.c000066400000000000000000000050211413463044200220460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_task_get_task_succs returns the set of children tasks */ void func_cpu(void *descr[], void *_args) { (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(void) { 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.3.9+dfsg/tests/main/get_current_task.c000066400000000000000000000064541413463044200215700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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) { (void)descr; /* 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.3.9+dfsg/tests/main/hwloc_cpuset.c000066400000000000000000000045311413463044200207160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 workers hwloc cpusets */ int main(void) { int status = 0; #ifdef STARPU_HAVE_HWLOC struct starpu_conf conf; starpu_conf_init(&conf); conf.nmpi_ms = 0; int ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int nworkers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); if (nworkers != 0) { hwloc_cpuset_t accumulator_cpuset = hwloc_bitmap_alloc(); hwloc_cpuset_t temp_cpuset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(accumulator_cpuset); status = 0; int workerids[nworkers]; starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, workerids, nworkers); int i; for (i=0; i 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/main/increment_codelet.c000066400000000000000000000022301413463044200216740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_codelet.h" void cpu_increment(void *descr[], void *arg) { (void)arg; unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*var)++; } struct starpu_codelet increment_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 }; starpu-1.3.9+dfsg/tests/main/increment_codelet.h000066400000000000000000000015471413463044200217130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 void cuda_host_increment(void *descr[], void *_args); extern void cpu_increment(void *descr[], void *arg); extern struct starpu_codelet increment_codelet; starpu-1.3.9+dfsg/tests/main/insert_task.c000066400000000000000000000111411413463044200205400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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]); (void)_args; *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(void) { 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.3.9+dfsg/tests/main/insert_task_array.c000066400000000000000000000047011413463044200217420ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_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(void) { 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.3.9+dfsg/tests/main/insert_task_dyn_handles.c000066400000000000000000000215501413463044200231150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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, 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; (void)_args; 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(void) { 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 "../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) { (void)_args; 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; } } /* We will fill this one with dyn_modes */ struct starpu_codelet codelet_dyn = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = NPARAMS, }; /* When maxbuffers is less than NPARAMS we will miss some access modes. * That is on purpose: we here check that we still behave correctly in that case. * We are just not able to check the parameter access modes. */ struct starpu_codelet codelet_toomany = { .cpu_funcs = {func_cpu}, /* starpu_task_get_current() doesn't work on MIC */ /* .cpu_funcs_name = {"func_cpu"}, */ .nbuffers = NPARAMS, .modes = { STARPU_R, STARPU_R, STARPU_RW|STARPU_COMMUTE, STARPU_RW|STARPU_COMMUTE, STARPU_R, STARPU_RW, STARPU_R, STARPU_RW|STARPU_COMMUTE, #if STARPU_NMAXBUFS >= 9 STARPU_R, #endif #if STARPU_NMAXBUFS >= 10 STARPU_RW|STARPU_COMMUTE, #endif #if STARPU_NMAXBUFS >= 11 STARPU_R, #endif #if STARPU_NMAXBUFS >= 12 STARPU_R, #endif #if STARPU_NMAXBUFS >= 13 STARPU_SCRATCH, #endif #if STARPU_NMAXBUFS >= 14 STARPU_SCRATCH, #endif #if STARPU_NMAXBUFS >= 15 STARPU_SCRATCH, #endif } }; 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(void) { int *x; int i, ret, loop; #ifdef STARPU_QUICK_CHECK int nloops = 4; #else int nloops = 16; #endif int val_int = 42; double val_double = 42.; 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.dyn_modes = malloc(NPARAMS * sizeof(*(codelet_dyn.modes))); codelet_dyn.dyn_modes[0] = STARPU_R, codelet_dyn.dyn_modes[1] = STARPU_R, codelet_dyn.dyn_modes[2] = STARPU_RW|STARPU_COMMUTE, codelet_dyn.dyn_modes[3] = STARPU_RW|STARPU_COMMUTE, codelet_dyn.dyn_modes[4] = STARPU_R, codelet_dyn.dyn_modes[5] = STARPU_RW, codelet_dyn.dyn_modes[6] = STARPU_R, codelet_dyn.dyn_modes[7] = STARPU_RW|STARPU_COMMUTE, codelet_dyn.dyn_modes[8] = STARPU_R, codelet_dyn.dyn_modes[9] = STARPU_RW|STARPU_COMMUTE, codelet_dyn.dyn_modes[10] = STARPU_R, codelet_dyn.dyn_modes[11] = STARPU_R, codelet_dyn.dyn_modes[12] = STARPU_SCRATCH, codelet_dyn.dyn_modes[13] = STARPU_SCRATCH, codelet_dyn.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 "../helper.h" /* * Try starpu_task_insert with a NULL codelet */ int main(void) { 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.3.9+dfsg/tests/main/insert_task_pack.c000066400000000000000000000027151413463044200215450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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; } 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; (void)argv; 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.3.9+dfsg/tests/main/insert_task_value.c000066400000000000000000000233431413463044200217430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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(void) { 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_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.3.9+dfsg/tests/main/insert_task_where.c000066400000000000000000000045031413463044200217360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" extern void cuda_host_increment(void *descr[], void *_args); void cpu_increment(void *descr[], void *arg) { (void)arg; unsigned *var = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*var) += 2; } static struct starpu_codelet my_codelet = { .cpu_funcs = {cpu_increment}, .cpu_funcs_name = {"cpu_increment"}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_host_increment}, .cuda_flags = {STARPU_CUDA_ASYNC}, #endif .modes = { STARPU_RW }, .nbuffers = 1 }; int main(void) { starpu_data_handle_t data_handles[2]; int x = 12; int y = 12; int ret, ret1, ret2; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&data_handles[0], STARPU_MAIN_RAM, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&data_handles[1], STARPU_MAIN_RAM, (uintptr_t)&y, sizeof(y)); ret1 = starpu_task_insert(&my_codelet, STARPU_EXECUTE_WHERE, STARPU_CPU, STARPU_RW, data_handles[0], 0); if (ret1 != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret1, "starpu_task_insert"); ret2 = starpu_task_insert(&my_codelet, STARPU_EXECUTE_WHERE, STARPU_CUDA, STARPU_RW, data_handles[1], 0); if (ret2 != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret2, "starpu_task_insert"); starpu_data_unregister(data_handles[0]); starpu_data_unregister(data_handles[1]); starpu_shutdown(); if (ret1 != -ENODEV) { if (x != 14) ret = 1; FPRINTF(stderr, "Value x = %d (expected 14)\n", x); } if (ret2 != -ENODEV) { if (y != 13) ret = 1; FPRINTF(stderr, "Value y = %d (expected 13)\n", y); } STARPU_RETURN(ret); } starpu-1.3.9+dfsg/tests/main/job.c000066400000000000000000000046701413463044200167750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 job creation is threadsafe */ #define N 1000 static struct starpu_task *tasks[N]; void dummy_func(void *arg) { unsigned worker, i; int worker0; (void) arg; starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, &worker0, 1); if ((int) starpu_worker_get_id_check() == worker0) /* One worker creates the tasks */ for (i = 0; i < N; i++) { struct starpu_task *task = starpu_task_create(); task->destroy = 0; STARPU_WMB(); tasks[i] = task; } else /* While others eagerly wait for it before trying to get their id */ for (i = 0; i < N; i++) { struct starpu_task *task; while (!(task = tasks[i])) { STARPU_UYIELD(); STARPU_SYNCHRONIZE(); } STARPU_RMB(); starpu_task_get_job_id(task); } } int main(void) { int ret; unsigned i; struct starpu_conf conf; starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; conf.ncpus = -1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_execute_on_each_worker(dummy_func, NULL, STARPU_CPU); for (i = 0; i < N; i++) { starpu_task_destroy(tasks[i]); } struct starpu_task *task = starpu_task_create(); unsigned long id; task->destroy = 0; id = starpu_task_get_job_id(task); starpu_task_destroy(task); FPRINTF(stderr, "jobid %lu for %u tasks and %u workers\n", id, N, starpu_worker_get_count()); /* We are not supposed to have created more than one jobid for each * worker (for execute_on_each) and for each of the N user tasks. */ ret = id > starpu_worker_get_count() + N + 1; starpu_shutdown(); return ret; } starpu-1.3.9+dfsg/tests/main/mkdtemp.c000066400000000000000000000030641413463044200176600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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, sizeof(dirname), "%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.3.9+dfsg/tests/main/multithreaded.c000066400000000000000000000055331413463044200210550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 void *thread_func(void *arg) { int ret; unsigned i; (void)arg; 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++) { STARPU_PTHREAD_CREATE(&threads[t], NULL, thread_func, NULL); } for (t = 0; t < nthreads; t++) { STARPU_PTHREAD_JOIN(threads[t], NULL); } 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.3.9+dfsg/tests/main/multithreaded_init.c000066400000000000000000000040611413463044200220730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { STARPU_PTHREAD_CREATE(&threads[i], NULL, launch_starpu, NULL); } for (i = 0; i < NUM_THREADS; ++i) { STARPU_PTHREAD_JOIN(threads[i], NULL); } 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++) { STARPU_PTHREAD_CREATE(&threads[i], NULL, shutdown_starpu, NULL); } for (i = 0; i < NUM_THREADS; i++) { STARPU_PTHREAD_JOIN(threads[i], NULL); } return EXIT_SUCCESS; } starpu-1.3.9+dfsg/tests/main/pack.c000066400000000000000000000052711413463044200171370ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_codelet_pack_args and starpu_codelet_unpack_args */ void func_cpu(void *descr[], void *_args) { int factor; char c; int x; (void)descr; starpu_codelet_unpack_args(_args, &factor, &c, &x); FPRINTF(stderr, "[codelet] 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(void) { int ret; int x=42; int factor=12; char c='n'; struct starpu_task *task, *task2; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "[init] 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"); task2 = starpu_task_create(); task2->synchronous = 1; task2->cl = &mycodelet; task2->cl_arg_free = 1; { struct starpu_codelet_pack_arg_data state; starpu_codelet_pack_arg_init(&state); starpu_codelet_pack_arg(&state, &factor, sizeof(factor)); starpu_codelet_pack_arg(&state, &c, sizeof(c)); starpu_codelet_pack_arg(&state, &x, sizeof(x)); starpu_codelet_pack_arg_fini(&state, &task2->cl_arg, &task2->cl_arg_size); } ret = starpu_task_submit(task2); 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.3.9+dfsg/tests/main/pause_resume.c000066400000000000000000000054711413463044200207200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; #elif !defined(STARPU_LONG_CHECK) static unsigned ntasks = 1000; #else static unsigned ntasks = 50000; #endif void dummy_func(void *descr[], void *arg) { (void)descr; (void)arg; } 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(void) { 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.3.9+dfsg/tests/main/regenerate.c000066400000000000000000000066011413463044200203400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (void)arg; 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[], void *arg) { (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 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.3.9+dfsg/tests/main/regenerate_pipeline.c000066400000000000000000000104651413463044200222300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/restart.c000066400000000000000000000033341413463044200177030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/main/starpu_init.c000066400000000000000000000074061413463044200205640ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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(void) { return STARPU_TEST_SKIPPED; } #else static int check_cpu(int env_cpu, int conf_cpu, int precedence_over_env, int expected_cpu, int *cpu) { int ret; FPRINTF(stderr, "\nTesting with env=%d - conf=%d - expected %d (ignore env %d)\n", env_cpu, conf_cpu, expected_cpu, precedence_over_env); if (env_cpu != -1) { char string[11]; snprintf(string, sizeof(string), "%d", env_cpu); setenv("STARPU_NCPUS", string, 1); } struct starpu_conf user_conf; starpu_conf_init(&user_conf); user_conf.precedence_over_environment_variables = precedence_over_env; 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 --> %s\n", *cpu, expected_cpu, *cpu==expected_cpu?"SUCCESS":"FAILURE"); return *cpu != expected_cpu; } } int main(void) { int ret; int cpu, cpu_init; int cpu_test1, cpu_test2, cpu_test3; unsetenv("STARPU_NCPUS"); unsetenv("STARPU_NCPU"); ret = check_cpu(-1, -1, 0, -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, 0, cpu_test1, &cpu); if (ret) return ret; // Do not set anything --> default value ret = check_cpu(-1, -1, 0, -1, &cpu); if (ret) return ret; if (cpu != cpu_init) { FPRINTF(stderr, "The number of CPUs is incorrect\n"); return 1; } // Do not set environment variable, set starpu_conf::ncpus --> starpu_conf::ncpus ret = check_cpu(-1, cpu_test2, 0, cpu_test2, &cpu); if (ret) return ret; // Set environment variable, and do not set starpu_conf::ncpus --> starpu_conf::ncpus ret = check_cpu(cpu_test2, -1, 0, cpu_test2, &cpu); if (ret) return ret; // Set both environment variable and starpu_conf::ncpus --> environment variable ret = check_cpu(cpu_test3, cpu_test1, 0, cpu_test3, &cpu); if (ret) return ret; // Set both environment variable and starpu_conf::ncpus AND prefer starpu_conf over env --> starpu_conf::ncpus ret = check_cpu(cpu_test3, cpu_test1, 1, cpu_test1, &cpu); if (ret) return ret; // Set environment variable, and do no set starpu_conf, AND prefer starpu_conf over env --> environment variable ret = check_cpu(cpu_test2, -1, 1, cpu_test2, &cpu); if (ret) return ret; return 0; } #endif starpu-1.3.9+dfsg/tests/main/starpu_task_bundle.c000066400000000000000000000071741413463044200221160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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.3.9+dfsg/tests/main/starpu_task_wait.c000066400000000000000000000054731413463044200216110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/starpu_task_wait_for_all.c000066400000000000000000000056431413463044200233060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (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.3.9+dfsg/tests/main/starpu_worker_exists.c000066400000000000000000000042671413463044200225330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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.3.9+dfsg/tests/main/static_restartable.c000066400000000000000000000051551413463044200221010ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/static_restartable_tag.c000066400000000000000000000055111413463044200227300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/main/static_restartable_using_initializer.c000066400000000000000000000053401413463044200257050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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_task_clean(&task); starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.3.9+dfsg/tests/main/subgraph_repeat.c000066400000000000000000000110361413463044200213700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "increment_codelet.h" #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; static void callback_task_D(void *arg) { (void)arg; 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 = &increment_codelet; taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &increment_codelet; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &increment_codelet; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &increment_codelet; taskD.callback_func = callback_task_D; taskD.handles[0] = check_data; starpu_task_declare_deps(&taskB, 1, &taskA); starpu_task_declare_deps(&taskC, 1, &taskA); starpu_task_declare_deps(&taskD, 2, &taskB, &taskC); 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.3.9+dfsg/tests/main/subgraph_repeat_regenerate.c000066400000000000000000000117011413463044200235700ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "increment_codelet.h" #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); static void callback_task_B(void *arg) { (void)arg; if (++loop_cntB == niter) taskB.regenerate = 0; } static void callback_task_C(void *arg) { (void)arg; if (++loop_cntC == niter) taskC.regenerate = 0; } static void callback_task_D(void *arg) { (void)arg; 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 = &increment_codelet; taskA.regenerate = 0; /* this task will be explicitely resubmitted if needed */ taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &increment_codelet; taskB.callback_func = callback_task_B; taskB.regenerate = 1; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &increment_codelet; taskC.callback_func = callback_task_C; taskC.regenerate = 1; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &increment_codelet; taskD.callback_func = callback_task_D; taskD.regenerate = 1; taskD.handles[0] = check_data; starpu_task_declare_deps(&taskB, 1, &taskA); starpu_task_declare_deps(&taskC, 1, &taskA); starpu_task_declare_deps(&taskD, 2, &taskB, &taskC); 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.3.9+dfsg/tests/main/subgraph_repeat_regenerate_tag.c000066400000000000000000000132671413463044200244340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "increment_codelet.h" #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; static void callback_task_A(void *arg) { (void)arg; loop_cnt_A++; if (loop_cnt_A == niter) { /* We are done */ taskA.regenerate = 0; } } static void callback_task_B(void *arg) { (void)arg; loop_cnt_B++; if (loop_cnt_B == niter) { /* We are done */ taskB.regenerate = 0; } } static void callback_task_C(void *arg) { (void)arg; loop_cnt_C++; if (loop_cnt_C == niter) { /* We are done */ taskC.regenerate = 0; } } static void callback_task_D(void *arg) { (void)arg; 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 = &increment_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 = &increment_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 = &increment_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 = &increment_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.3.9+dfsg/tests/main/subgraph_repeat_regenerate_tag_cycle.c000066400000000000000000000131511413463044200256030ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "increment_codelet.h" #include "../helper.h" /* * Test that one can let a whole task graph repeatedly regenerate itself, using * tag dependencies, with a complete cycle. */ #ifdef STARPU_QUICK_CHECK static unsigned niter = 64; #else static unsigned niter = 16384; #endif #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; static void callback_task_A(void *arg) { (void)arg; loop_cnt_A++; if (loop_cnt_A == niter) { /* We are done */ taskA.regenerate = 0; } } static void callback_task_B(void *arg) { (void)arg; loop_cnt_B++; if (loop_cnt_B == niter) { /* We are done */ taskB.regenerate = 0; } } static void callback_task_C(void *arg) { (void)arg; loop_cnt_C++; if (loop_cnt_C == niter) { /* We are done */ taskC.regenerate = 0; } } static void callback_task_D(void *arg) { (void)arg; 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 */ } } 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 = &increment_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 = &increment_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 = &increment_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 = &increment_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_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); starpu_tag_declare_deps((starpu_tag_t) TAG_A, 1, (starpu_tag_t) TAG_D); 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"); /* Break the loop */ starpu_tag_notify_restart_from_apps((starpu_tag_t) TAG_D); 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.3.9+dfsg/tests/main/subgraph_repeat_tag.c000066400000000000000000000117041413463044200222250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "increment_codelet.h" #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; static void callback_task_B(void *arg) { (void)arg; loop_cnt_B++; if (loop_cnt_B == niter) { /* We are done */ taskB.regenerate = 0; } } static void callback_task_C(void *arg) { (void)arg; loop_cnt_C++; if (loop_cnt_C == niter) { /* We are done */ taskC.regenerate = 0; } } static void callback_task_D(void *arg) { (void)arg; 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 = &increment_codelet; taskA.regenerate = 0; /* this task will be explicitely resubmitted if needed */ taskA.handles[0] = check_data; starpu_task_init(&taskB); taskB.cl = &increment_codelet; taskB.regenerate = 1; taskB.callback_func = callback_task_B; taskB.handles[0] = check_data; starpu_task_init(&taskC); taskC.cl = &increment_codelet; taskC.regenerate = 1; taskC.callback_func = callback_task_C; taskC.handles[0] = check_data; starpu_task_init(&taskD); taskD.cl = &increment_codelet; taskD.callback_func = callback_task_D; taskD.regenerate = 1; taskD.handles[0] = check_data; starpu_task_declare_deps(&taskB, 1, &taskA); starpu_task_declare_deps(&taskC, 1, &taskA); starpu_task_declare_deps(&taskD, 2, &taskB, &taskC); 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.3.9+dfsg/tests/main/submit.c000066400000000000000000000056161413463044200175270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (void)descr; (void)arg; 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) { (void)arg; 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[], void *arg) { (void)descr; (void)arg; 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(void) { 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.3.9+dfsg/tests/main/tag_get_task.c000066400000000000000000000042641413463044200206560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_tag_get_task returns the proper task */ void dummy_func(void *descr[], void *arg) { (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 void callback(void *tag) { fflush(stderr); FPRINTF(stderr, "Callback for tag %p\n", tag); fflush(stderr); } int main(int argc, char **argv) { struct starpu_task *task; starpu_tag_t tag = 0x42; int ret; ret = starpu_initialize(NULL, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* create a new dummy task with a tag */ task = starpu_task_create(); task->callback_func = callback; task->callback_arg = (void *)tag; task->cl = &dummy_codelet; task->cl_arg = NULL; task->destroy = 0; /* tell StarPU to not destroy the task */ task->use_tag = 1; task->tag_id = tag; /* execute the task */ ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); /* check that starpu_tag_get_task() returns the correct task */ ret = (starpu_tag_get_task(task->tag_id) != task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_get_task"); starpu_task_destroy(task); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.3.9+dfsg/tests/main/tag_task_data_deps.c000066400000000000000000000134241413463044200220210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], 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(void) { int ret; /* We have 17 toggles to try below, thus 2^17 possibilities */ unsigned loop, nloops = 128*1024; unsigned duration = 100; 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.3.9+dfsg/tests/main/tag_wait_api.c000066400000000000000000000107411413463044200206470ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 tag dependencies and waiting for a tag */ void dummy_func(void *descr[], void *arg) { (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 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 *)(uintptr_t)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.3.9+dfsg/tests/main/task_end_dep.c000066400000000000000000000060501413463044200206350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 checks that adding an end dependency for an already-terminated task * works */ #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define INIT 12 void cpu_codelet2(void *descr[], void *args) { int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); (void)args; STARPU_ASSERT(*val == INIT); starpu_sleep(0.1); STARPU_ASSERT(*val == INIT); *val *= 2; } struct starpu_codelet cl2 = { .cpu_funcs = {cpu_codelet2}, .cpu_funcs_name = {"cpu_codelet2"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codelet2" }; void cpu_codelet(void *descr[], void *args) { (void)args; int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); STARPU_ASSERT(*val == 2*INIT); starpu_sleep(0.1); STARPU_ASSERT(*val == 2*INIT); *val *= 2; } struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet}, .cpu_funcs_name = {"cpu_codelet"}, .nbuffers = 1, .modes = {STARPU_RW}, .name = "codelet" }; int main(void) { int value=INIT; int ret; starpu_data_handle_t value_handle; struct starpu_conf conf; struct starpu_task *task, *task2; starpu_conf_init(&conf); conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_init(&conf); if (STARPU_UNLIKELY(ret == -ENODEV)) { return 77; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (starpu_cpu_worker_get_count() < 1) { FPRINTF(stderr, "This application requires at least 1 cpu worker\n"); starpu_shutdown(); return 77; } starpu_variable_data_register(&value_handle, STARPU_MAIN_RAM, (uintptr_t)&value, sizeof(value)); task = starpu_task_build(&cl, STARPU_RW, value_handle, 0); STARPU_ASSERT(task); task->detach = 0; task2 = starpu_task_build(&cl2, STARPU_RW, value_handle, 0); STARPU_ASSERT(task2); task2->detach = 0; task2->destroy = 0; ret = starpu_task_submit(task2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task2); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_task_declare_end_deps(task, 1, task2); starpu_task_destroy(task2); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_data_unregister(value_handle); STARPU_ASSERT(value == 2*2*INIT); starpu_shutdown(); FPRINTF(stderr, "Value = %d\n", value); return ret; } starpu-1.3.9+dfsg/tests/main/task_wait_api.c000066400000000000000000000106671413463044200210450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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(); starpu_task_declare_deps(taskG, 4, taskC, taskD, taskE, taskF); 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"); struct starpu_task *tasksJKL[3] = {taskJ, taskK, taskL}; ret = starpu_task_wait_array(tasksJKL, 3); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_array"); 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.3.9+dfsg/tests/main/wait_all_regenerable_tasks.c000066400000000000000000000061761413463044200235620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *arg) { (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 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.3.9+dfsg/tests/microbenchs/000077500000000000000000000000001413463044200174205ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/microbenchs/async_tasks_data_overhead.sh000077500000000000000000000014151413463044200251500ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # ROOT=${0%.sh} ROOT=${ROOT/tasks_data_overhead/tasks_overhead} exec $STARPU_LAUNCH $ROOT -b 1 "$@" starpu-1.3.9+dfsg/tests/microbenchs/async_tasks_overhead.c000066400000000000000000000142671413463044200237750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 */ 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; #define BUFFERSIZE 16 //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[], void *arg) { (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, .modes = {STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW} }; static void usage(char **argv) { fprintf(stderr, "Usage: %s [-i ntasks] [-p sched_policy] [-b nbuffers] [-h]\n", argv[0]); exit(EXIT_FAILURE); } static void parse_args(int argc, char **argv, struct starpu_conf *conf) { int c; while ((c = getopt(argc, argv, "i:b:p:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); dummy_codelet.nbuffers = nbuffers; 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; 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"); unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_malloc((void**)&buffers[buffer], BUFFERSIZE*sizeof(float)); starpu_vector_data_register(&data_handles[buffer], STARPU_MAIN_RAM, (uintptr_t)buffers[buffer], BUFFERSIZE, sizeof(float)); } starpu_profiling_status_set(STARPU_PROFILING_ENABLE); fprintf(stderr, "#tasks : %u\n#buffers : %u\n", ntasks, nbuffers); /* 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->detach = 0; /* we have 8 buffers at most */ for (buffer = 0; buffer < nbuffers; buffer++) { task->handles[buffer] = data_handles[buffer]; } 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 number[1+sizeof(nbuffers)*3+1]; const char *numberp; char file[1024]; FILE *f; if (nbuffers) { snprintf(number, sizeof(number), "_%u", nbuffers); numberp = number; } else numberp = ""; snprintf(file, sizeof(file), "%s/async_tasks_overhead_total%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); snprintf(file, sizeof(file), "%s/async_tasks_overhead_per_task%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ntasks); fclose(f); } } for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_unregister(data_handles[buffer]); starpu_free((void*)buffers[buffer]); } 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.3.9+dfsg/tests/microbenchs/bandwidth.c000066400000000000000000000203371413463044200215350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 memory bandwidth available to kernels depending on the number of * kernels and number of idle workers. */ #if defined(STARPU_QUICK_CHECK) || defined(STARPU_SANITIZE_LEAK) || defined(STARPU_SANITIZE_ADDRESS) static size_t size = 1024; #else /* Must be bigger than available cache size per core, 64MiB should be enough */ static size_t size = 64UL << 20; #endif static unsigned cpustep = 0; static unsigned noalone = 0; static unsigned iter = 30; static unsigned total_ncpus; static starpu_pthread_barrier_t barrier_begin, barrier_end; static float *result; static void **buffers; /* Indexed by logical core number */ static char padding1[STARPU_CACHELINE_SIZE]; static volatile char finished; static char padding2[STARPU_CACHELINE_SIZE]; static unsigned interleave(unsigned i); /* Initialize the buffer locally */ void initialize_buffer(void *foo) { unsigned id = starpu_worker_get_id(); #ifdef STARPU_HAVE_POSIX_MEMALIGN int ret = posix_memalign(&buffers[id], getpagesize(), 2*size); STARPU_ASSERT(ret == 0); #else buffers[id] = malloc(2*size); #endif memset(buffers[id], 0, 2*size); } /* Actual transfer codelet */ void bw_func(void *descr[], void *arg) { int id = (uintptr_t) arg; void *src = buffers[id]; void *dst = (void*) ((uintptr_t)src + size); unsigned i; double start, stop; STARPU_PTHREAD_BARRIER_WAIT(&barrier_begin); start = starpu_timing_now(); for (i = 0; i < iter; i++) { memcpy(dst, src, size); STARPU_SYNCHRONIZE(); } stop = starpu_timing_now(); STARPU_PTHREAD_BARRIER_WAIT(&barrier_end); finished = 1; result[id] = (size*iter) / (stop - start); } static struct starpu_codelet bw_codelet = { .cpu_funcs = {bw_func}, .model = NULL, .nbuffers = 0, }; /* Codelet that waits for completion while doing lots of cpu yields (nop). */ void nop_func(void *descr[], void *arg) { STARPU_PTHREAD_BARRIER_WAIT(&barrier_begin); while (!finished) { unsigned i; for (i = 0; i < 1000000; i++) STARPU_UYIELD(); STARPU_SYNCHRONIZE(); } } static struct starpu_codelet nop_codelet = { .cpu_funcs = {nop_func}, .model = NULL, .nbuffers = 0, }; /* Codelet that waits for completion while aggressively reading the finished variable. */ void sync_func(void *descr[], void *arg) { STARPU_PTHREAD_BARRIER_WAIT(&barrier_begin); while (!finished) { STARPU_VALGRIND_YIELD(); STARPU_SYNCHRONIZE(); } } static struct starpu_codelet sync_codelet = { .cpu_funcs = {sync_func}, .model = NULL, .nbuffers = 0, }; static void usage(char **argv) { fprintf(stderr, "Usage: %s [-n niter] [-s size (MB)] [-c cpustep] [-a]\n", argv[0]); fprintf(stderr, "\t-n niter\tNumber of iterations\n"); fprintf(stderr, "\t-s size\tBuffer size in MB\n"); fprintf(stderr, "\t-c cpustep\tCpu number increment\n"); fprintf(stderr, "\t-a Do not run the alone test\n"); exit(EXIT_FAILURE); } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "n:s:c:ah")) != -1) switch(c) { case 'n': iter = atoi(optarg); break; case 's': size = (long)atoi(optarg) << 20; break; case 'c': cpustep = atoi(optarg); break; case 'a': noalone = 1; break; case 'h': usage(argv); break; } } static unsigned interleave(unsigned i) { /* TODO: rather distribute over hierarchy */ if (total_ncpus > 1) return (i % (total_ncpus/2))*2 + i / (total_ncpus/2); else return 0; } enum sleep_type { PAUSE, NOP, SYNC, SCHED, }; static float bench(int *argc, char ***argv, unsigned nbusy, unsigned ncpus, int intl, enum sleep_type sleep) { int ret; unsigned i; struct starpu_conf conf; float bw; starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nmpi_ms = 0; conf.ncpus = ncpus; if (intl && sleep == PAUSE) { conf.use_explicit_workers_bindid = 1; for (i = 0; i < ncpus; i++) conf.workers_bindid[i] = interleave(i); } ret = starpu_initialize(&conf, argc, argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); if (sleep == PAUSE || sleep == SCHED) /* In these cases we don't have a task on each cpu */ STARPU_PTHREAD_BARRIER_INIT(&barrier_begin, NULL, nbusy); else STARPU_PTHREAD_BARRIER_INIT(&barrier_begin, NULL, ncpus); STARPU_PTHREAD_BARRIER_INIT(&barrier_end, NULL, nbusy); finished = 0; for (i = 0; i < ncpus; i++) result[i] = NAN; for (i = 0; i < nbusy; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &bw_codelet; if (intl) task->cl_arg = (void*) (uintptr_t) interleave(i); else task->cl_arg = (void*) (uintptr_t) i; task->execute_on_a_specific_worker = 1; if (intl && sleep != PAUSE) /* In the pause case we interleaved above */ task->workerid = interleave(i); else task->workerid = i; ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } if (sleep != PAUSE && sleep != SCHED) { /* Add waiting tasks */ for ( ; i < ncpus; i++) { struct starpu_task *task = starpu_task_create(); switch (sleep) { case NOP: task->cl = &nop_codelet; break; case SYNC: task->cl = &sync_codelet; break; default: STARPU_ASSERT(0); } task->execute_on_a_specific_worker = 1; task->workerid = interleave(i); ret = starpu_task_submit(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } starpu_task_wait_for_all(); starpu_shutdown(); for (bw = 0., i = 0; i < nbusy; i++) { if (intl) bw += result[interleave(i)]; else bw += result[i]; } return bw; } int main(int argc, char **argv) { int ret; unsigned n; struct starpu_conf conf; float alone, alone_int, alone_int_nop, alone_int_sync, sched, sched_int; parse_args(argc, argv); starpu_conf_init(&conf); conf.precedence_over_environment_variables = 1; conf.ncuda = 0; conf.nopencl = 0; conf.nmic = 0; conf.nmpi_ms = 0; ret = starpu_initialize(&conf, &argc, &argv); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); total_ncpus = starpu_cpu_worker_get_count(); buffers = malloc(total_ncpus * sizeof(*buffers)); starpu_execute_on_each_worker_ex(initialize_buffer, NULL, STARPU_CPU, "init_buffer"); starpu_shutdown(); if (total_ncpus == 0) return STARPU_TEST_SKIPPED; result = malloc(total_ncpus * sizeof(result[0])); if (cpustep == 0) { #if defined(STARPU_QUICK_CHECK) || defined(STARPU_SANITIZE_LEAK) || defined(STARPU_SANITIZE_ADDRESS) cpustep = total_ncpus / 2; #elif defined(STARPU_LONG_CHECK) cpustep = 1; #else cpustep = total_ncpus / 8; #endif if (cpustep == 0) cpustep = 1; } printf("# nw\ta comp.\t+sched\teff%%\ta scat.\t+nop\t+sync\t+sched\teff%% vs nop\n"); for (n = cpustep; n <= total_ncpus; n += cpustep) { if (noalone) { alone = 0.; alone_int = 0.; alone_int_nop = 0.; alone_int_sync = 0.; } else { alone = bench(&argc, &argv, n, n, 0, PAUSE); alone_int = bench(&argc, &argv, n, n, 1, PAUSE); alone_int_nop = bench(&argc, &argv, n, total_ncpus, 1, NOP); alone_int_sync = bench(&argc, &argv, n, total_ncpus, 1, SYNC); } sched = bench(&argc, &argv, n, total_ncpus, 0, SCHED); sched_int = bench(&argc, &argv, n, total_ncpus, 1, SCHED); printf("%u\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", n, alone/1000, sched/1000, sched*100/alone, alone_int/1000, alone_int_nop/1000, alone_int_sync/1000, sched_int/1000, sched_int*100/alone_int_nop); fflush(stdout); } free(result); for (n = 0; n < total_ncpus; n++) free(buffers[n]); free(buffers); return EXIT_SUCCESS; } starpu-1.3.9+dfsg/tests/microbenchs/bandwidth_scheds.sh000077500000000000000000000047251413463044200232640ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # set -e DIR=$(dirname $0) if [ -n "$STARPU_SCHED" ] then SCHEDS=$STARPU_SCHED DEFAULT=$STARPU_SCHED else SCHEDS=`$DIR/../../tools/starpu_sched_display` DEFAULT=eager fi if [ -n "$STARPU_BENCH_DIR" ]; then cat > bandwidth.gp << EOF set term svg font ",12" size 1500,500 linewidth 0.5 set output "bandwidth.svg" set pointsize 0.3 EOF else fast="-n 3 -c 4" cat > bandwidth.gp << EOF set term postscript eps enhanced color font ",18" set output "bandwidth.eps" set size 2,1 EOF fi cat >> bandwidth.gp << EOF set key outside set ylabel "GB/s" set xlabel "ncores" plot \\ "bandwidth-$DEFAULT.dat" using 1:5 with lines title "alone interleave", \\ "bandwidth-$DEFAULT.dat" using 1:6 with lines title "nop", \\ "bandwidth-$DEFAULT.dat" using 1:7 with lines title "sync", \\ "bandwidth-$DEFAULT.dat" using 1:2 with lines title "alone contiguous", \\ EOF run() { sched=$1 type=$2 if [ "$sched" != eager -a "$sched" != "$SCHEDS" ]; then extra=-a else extra= fi STARPU_BACKOFF_MIN=0 STARPU_BACKOFF_MAX=0 STARPU_SCHED=$sched $STARPU_LAUNCH $DIR/bandwidth $fast $extra "$@" | tee bandwidth-$sched.dat echo "\"bandwidth-$sched.dat\" using 1:3 with linespoints lt $type pt $type title \"$sched\", \\" >> bandwidth.gp echo "\"bandwidth-$sched.dat\" using 1:8 with linespoints lt $type pt $type notitle, \\" >> bandwidth.gp } case "$MAKEFLAGS" in *\ -j1[0-9]*\ *|*\ -j[2-9]*\ *) type=1 for sched in $SCHEDS do run $sched $type & type=$((type+1)) done while true do set +e wait -n RET=$? set -e if [ $RET = 127 ] ; then break ; fi if [ $RET != 0 ] ; then exit $RET ; fi done ;; *) type=1 for sched in $SCHEDS do run $sched $type type=$((type+1)) done ;; esac if gnuplot bandwidth.gp ; then if [ -n "$STARPU_BENCH_DIR" ]; then cp bandwidth.svg $STARPU_BENCH_DIR/ fi fi starpu-1.3.9+dfsg/tests/microbenchs/display_structures_size.c000066400000000000000000000016621413463044200245730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) { (void)argc; (void)argv; _starpu_debug_display_structures_size(stderr); return EXIT_SUCCESS; } starpu-1.3.9+dfsg/tests/microbenchs/local_pingpong.c000066400000000000000000000055731413463044200225710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tests/microbenchs/matrix_as_vector.c000066400000000000000000000165561413463044200231520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 5 #elif !defined(STARPU_LONG_CHECK) #define LOOPS 30 #else #define LOOPS 100 #endif void vector_cpu_func(void *descr[], void *cl_arg) { (void)cl_arg; 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; #ifdef STARPU_USE_CUDA if (where == STARPU_CUDA) { vector_codelet.cuda_funcs[0] = vector_cuda_func; vector_codelet.cuda_flags[0] = STARPU_CUDA_ASYNC; } #endif // 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; #ifdef STARPU_USE_CUDA if (where == STARPU_CUDA) { matrix_codelet.cuda_funcs[0] = matrix_cuda_func; matrix_codelet.cuda_flags[0] = STARPU_CUDA_ASYNC; } #endif // 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(void) { 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.3.9+dfsg/tests/microbenchs/microbench.sh000077500000000000000000000057571413463044200221060ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 # disable core generation ulimit -c 0 # Testing a specific scheduler if [ -n "$STARPU_SCHED" ] then SCHEDS=$STARPU_SCHED else SCHEDS=`$(dirname $0)/../../tools/starpu_sched_display` fi test_scheds() { TEST=$1 shift xfailed="" failed="" pass="" skip="" if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/$TEST # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/$TEST" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/$TEST fi RESULT=0 for sched in $SCHEDS; do set +e STARPU_SCHED=$sched $STARPU_LAUNCH $(dirname $0)/$TEST "$@" ret=$? set -e if test $ret = 0 then echo "SUCCESS: STARPU_SCHED=$sched ./microbenchs/$TEST" pass="$pass $sched" continue fi if test $ret = 77 then echo "SKIP: STARPU_SCHED=$sched ./microbenchs/$TEST" skip="$skip $sched" 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 ) failed="$failed $sched" RESULT=1 ;; *) echo "XFAIL: STARPU_SCHED=$sched ./microbenchs/$TEST" xfailed="$xfailed $sched" ;; 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" xfailed="$xfailed $sched" ;; *) echo "FAIL: STARPU_SCHED=$sched ./microbenchs/$TEST" | ( tee /dev/tty || true ) failed="$failed $sched" RESULT=1 ;; esac fi done echo "passed schedulers:$pass"| ( tee /dev/tty || true ) echo "skipped schedulers:$skip"| ( tee /dev/tty || true ) echo "failed schedulers:$failed"| ( tee /dev/tty || true ) echo "xfailed schedulers:$xfailed"| ( tee /dev/tty || true ) return $RESULT } starpu-1.3.9+dfsg/tests/microbenchs/parallel_dependent_homogeneous_tasks_data.c000066400000000000000000000120401413463044200302110ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of tasks with homogeneous execution time and share data to some extent */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 5 #define DATA_COEFFICIENT 5.5 #define MARGIN 0.15 #else #define TASK_COEFFICIENT 10 #define DATA_COEFFICIENT 10.5 #define MARGIN 0.05 #endif #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 #define NB_FLOAT 4000000 void wait_homogeneous(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void)t; (void)a; (void)i; return TIME * 1000000; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_homogeneous }, .cuda_funcs = { wait_homogeneous }, .opencl_funcs = { wait_homogeneous }, .cpu_funcs_name = { "wait_homogeneous" }, .nbuffers = 1, .modes = {STARPU_RW}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, }; 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 nb_tasks, nb_data, nb_workers; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER) + starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) + starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = nb_workers*TASK_COEFFICIENT*DATA_COEFFICIENT; nb_data = nb_workers*DATA_COEFFICIENT; /* We consider a vector of float that is initialized just as any of C * data */ float *vector[nb_data]; starpu_data_handle_t vector_handle[nb_data]; unsigned i,j; for (j = 0; j < nb_data; j++) { vector[j] = malloc(NB_FLOAT * sizeof(float)); #ifndef STARPU_SIMGRID for (i = 0; i < NB_FLOAT; i++) vector[j][i] = (i+1.0f); #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_vector_data_register(&vector_handle[j], STARPU_MAIN_RAM, (uintptr_t)vector[j], NB_FLOAT, sizeof(vector[0][0])); } begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= ((1 - MARGIN) * expected_speed_up); check_sup = speed_up <= ((1 + MARGIN) * expected_speed_up); FPRINTF(stderr, "measured time = %f seconds\n", time_m); FPRINTF(stderr, "sequential time = %f seconds\n", time_s); FPRINTF(stderr, "speed up = %f\n", speed_up); FPRINTF(stderr, "number of workers = %u\n", nb_workers); FPRINTF(stderr, "number of tasks = %u\n", nb_tasks); FPRINTF(stderr, "expected speed up = %f\n", expected_speed_up); FPRINTF(stderr, "percentage of expected speed up %.2f%%\n", percentage_expected_speed_up); starpu_shutdown(); for (j = 0; j < nb_data; j++) free(vector[j]); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_dependent_homogeneous_tasks_data.sh000077500000000000000000000014571413463044200304160ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XSUCCESS="dmda dmdap dmdar dmdas dmdasd" test_scheds parallel_dependent_homogeneous_tasks_data starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_heterogeneous_tasks.c000066400000000000000000000103371413463044200301020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of independent tasks with heterogeneous execution time */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 20 #define MARGIN 0.20 #else #define TASK_COEFFICIENT 100 #define MARGIN 0.10 #endif #define TIME_CUDA_COEFFICIENT 10 #define TIME_OPENCL_COEFFICIENT 5 #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 void wait_CPU(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } void wait_CUDA(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME/TIME_CUDA_COEFFICIENT); } void wait_OPENCL(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME/TIME_OPENCL_COEFFICIENT); } 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 TIME * 1000000; } else if (a->devices[0].type == STARPU_CUDA_WORKER) { return TIME/TIME_CUDA_COEFFICIENT * 1000000; } else if (a->devices[0].type == STARPU_OPENCL_WORKER) { return TIME/TIME_OPENCL_COEFFICIENT * 1000000; } STARPU_ASSERT(0); return 0.0; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_CPU }, .cuda_funcs = { wait_CUDA }, .opencl_funcs = { wait_OPENCL }, .cpu_funcs_name = { "wait_CPU" }, .nbuffers = 0, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, }; 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 nb_tasks, nb_workers_CPU, nb_workers_CUDA, nb_workers_OPENCL, i; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers_CPU = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); nb_workers_CUDA = starpu_worker_get_count_by_type(STARPU_CUDA_WORKER); nb_workers_OPENCL = starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = (nb_workers_CPU + nb_workers_CUDA + nb_workers_OPENCL)*TASK_COEFFICIENT; begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= (1 - MARGIN) * expected_speed_up; check_sup = speed_up <= (1 + MARGIN) * expected_speed_up; printf("measured time = %f seconds\nsequential time = %f seconds\nspeed up = %f\nnumber of workers CPU = %u\nnumber of workers CUDA = %u\nnumber of workers OPENCL = %u\nnumber of tasks = %u\nexpected speed up = %f\npercentage of expected speed up = %.2f%%\n", time_m, time_s, speed_up, nb_workers_CPU, nb_workers_CUDA, nb_workers_OPENCL, nb_tasks, expected_speed_up, percentage_expected_speed_up); starpu_shutdown(); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_heterogeneous_tasks.sh000077500000000000000000000021771413463044200303000ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XFAIL="lws ws eager prio modular-prio modular-eager modular-eager-prio modular-eager-prefetching modular-prio-prefetching modular-random modular-random-prio modular-random-prefetching modular-random-prio-prefetching modular-prandom modular-prandom-prio modular-ws modular-heft modular-heft-prio modular-heft2 modular-heteroprio modular-gemm random peager heteroprio graph_test" test_scheds parallel_independent_heterogeneous_tasks starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_heterogeneous_tasks_data.c000066400000000000000000000133071413463044200310730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of independent tasks with heterogeneous execution time and independent data */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 20 #define MARGIN 0.20 #else #define TASK_COEFFICIENT 100 #define MARGIN 0.10 #endif #define TIME_CUDA_COEFFICIENT 10 #define TIME_OPENCL_COEFFICIENT 5 #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 #define NB_FLOAT 400000 void wait_CPU(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } void wait_CUDA(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME/TIME_CUDA_COEFFICIENT); } void wait_OPENCL(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME/TIME_OPENCL_COEFFICIENT); } 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 TIME * 1000000; } else if (a->devices[0].type == STARPU_CUDA_WORKER) { return TIME/TIME_CUDA_COEFFICIENT * 1000000; } else if (a->devices[0].type == STARPU_OPENCL_WORKER) { return TIME/TIME_OPENCL_COEFFICIENT * 1000000; } STARPU_ASSERT(0); return 0.0; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_CPU }, .cuda_funcs = { wait_CUDA }, .opencl_funcs = { wait_OPENCL }, .cpu_funcs_name = { "wait_CPU" }, .nbuffers = 1, .modes = {STARPU_RW}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, }; 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 nb_tasks, nb_workers_CPU, nb_workers_CUDA, nb_workers_OPENCL; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers_CPU = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); nb_workers_CUDA = starpu_worker_get_count_by_type(STARPU_CUDA_WORKER); nb_workers_OPENCL = starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = (nb_workers_CPU + nb_workers_CUDA + nb_workers_OPENCL)*TASK_COEFFICIENT; /* We consider a vector of float that is initialized just as any of C * data */ float *vector[nb_tasks]; starpu_data_handle_t vector_handle[nb_tasks]; unsigned i,j; for (j = 0; j < nb_tasks; j++) { vector[j] = malloc(NB_FLOAT * sizeof(float)); #ifndef STARPU_SIMGRID for (i = 0; i < NB_FLOAT; i++) vector[j][i] = (i+1.0f); #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_vector_data_register(&vector_handle[j], STARPU_MAIN_RAM, (uintptr_t)vector[j], NB_FLOAT, sizeof(vector[0][0])); } begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= ((1 - MARGIN) * expected_speed_up); check_sup = speed_up <= ((1 + MARGIN) * expected_speed_up); printf("measured time = %f seconds\nsequential time = %f seconds\nspeed up = %f\nnumber of workers CPU = %u\nnumber of workers CUDA = %u\nnumber of workers OPENCL = %u\nnumber of tasks = %u\nexpected speed up = %f\npercentage of expected speed up %.2f%%\n", time_m, time_s, speed_up, nb_workers_CPU, nb_workers_CUDA, nb_workers_OPENCL, nb_tasks, expected_speed_up, percentage_expected_speed_up); starpu_shutdown(); for (j = 0; j < nb_tasks; j++) free(vector[j]); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_heterogeneous_tasks_data.sh000077500000000000000000000014711413463044200312650ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XSUCCESS="dmda dmdap dmdar dmdas dmdasd pheft" test_scheds parallel_independent_heterogeneous_tasks_data starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_homogeneous_tasks.c000066400000000000000000000064431413463044200275610ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of independent tasks with homogeneous execution time */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 20 #define MARGIN 0.15 #else #define TASK_COEFFICIENT 100 #define MARGIN 0.05 #endif #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 void wait_homogeneous(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void)t; (void)a; (void)i; return TIME * 1000000; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_homogeneous }, .cuda_funcs = { wait_homogeneous }, .opencl_funcs = { wait_homogeneous }, .cpu_funcs_name = { "wait_homogeneous" }, .nbuffers = 0, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, }; 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 nb_tasks, nb_workers, i; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER) + starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) + starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = nb_workers*TASK_COEFFICIENT; begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= ((1 - MARGIN) * expected_speed_up); check_sup = speed_up <= ((1 + MARGIN) * expected_speed_up); printf("measured time = %f seconds\nsequential time = %f seconds\nspeed up = %f\nnumber of workers = %u\nnumber of tasks = %u\nexpected speed up = %f\npercentage of expected speed up = %.2f%%\n", time_m, time_s, speed_up, nb_workers, nb_tasks, expected_speed_up, percentage_expected_speed_up); starpu_shutdown(); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_homogeneous_tasks.sh000077500000000000000000000020751413463044200277510ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XFAIL="modular-eager-prefetching modular-prio-prefetching modular-random modular-random-prio modular-random-prefetching modular-random-prio-prefetching modular-prandom modular-prandom-prio modular-ws modular-heft modular-heft-prio modular-heft2 modular-heteroprio modular-gemm random peager heteroprio graph_test" test_scheds parallel_independent_homogeneous_tasks starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_homogeneous_tasks_data.c000066400000000000000000000114051413463044200305440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of independent tasks with homogeneous execution time and independent data */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 20 #define MARGIN 0.20 #else #define TASK_COEFFICIENT 100 #define MARGIN 0.10 #endif #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 #define NB_FLOAT 4000000 void wait_homogeneous(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void)t; (void)a; (void)i; return TIME * 1000000; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_homogeneous }, .cuda_funcs = { wait_homogeneous }, .opencl_funcs = { wait_homogeneous }, .cpu_funcs_name = { "wait_homogeneous" }, .nbuffers = 1, .modes = {STARPU_RW}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, }; 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 nb_tasks, nb_workers; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER) + starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) + starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = nb_workers*TASK_COEFFICIENT; /* We consider a vector of float that is initialized just as any of C * data */ float *vector[nb_tasks]; starpu_data_handle_t vector_handle[nb_tasks]; unsigned i,j; for (j = 0; j < nb_tasks; j++) { vector[j] = malloc(NB_FLOAT * sizeof(float)); #ifndef STARPU_SIMGRID for (i = 0; i < NB_FLOAT; i++) vector[j][i] = (i+1.0f); #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_vector_data_register(&vector_handle[j], STARPU_MAIN_RAM, (uintptr_t)vector[j], NB_FLOAT, sizeof(vector[0][0])); } begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= ((1 - MARGIN) * expected_speed_up); check_sup = speed_up <= ((1 + MARGIN) * expected_speed_up); printf("measured time = %f seconds\nsequential time = %f seconds\nspeed up = %f\nnumber of workers = %u\nnumber of tasks = %u\nexpected speed up = %f\npercentage of expected speed up %.2f%%\n", time_m, time_s, speed_up, nb_workers, nb_tasks, expected_speed_up, percentage_expected_speed_up); starpu_shutdown(); for (j = 0; j < nb_tasks; j++) free(vector[j]); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_independent_homogeneous_tasks_data.sh000077500000000000000000000014671413463044200307460ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XSUCCESS="dmda dmdap dmdar dmdas dmdasd pheft" test_scheds parallel_independent_homogeneous_tasks_data starpu-1.3.9+dfsg/tests/microbenchs/parallel_redux_heterogeneous_tasks_data.c000066400000000000000000000146551413463044200277340ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of tasks with heterogeneous execution time and redux data */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 20 #define MARGIN 0.20 #else #define TASK_COEFFICIENT 100 #define MARGIN 0.10 #endif #define TIME_CUDA_COEFFICIENT 10 #define TIME_OPENCL_COEFFICIENT 5 #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 #define NB_FLOAT 400000 void wait_CPU(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } void wait_CUDA(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME/TIME_CUDA_COEFFICIENT); } void wait_OPENCL(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME/TIME_OPENCL_COEFFICIENT); } 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 TIME * 1000000; } else if (a->devices[0].type == STARPU_CUDA_WORKER) { return TIME/TIME_CUDA_COEFFICIENT * 1000000; } else if (a->devices[0].type == STARPU_OPENCL_WORKER) { return TIME/TIME_OPENCL_COEFFICIENT * 1000000; } STARPU_ASSERT(0); return 0.0; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_CPU }, .cuda_funcs = { wait_CUDA }, .opencl_funcs = { wait_OPENCL }, .cpu_funcs_name = { "wait_CPU" }, .nbuffers = 1, .modes = {STARPU_REDUX}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, .name = "cl", }; static struct starpu_perfmodel perf_model_init = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl_init = { .cpu_funcs = { wait_CPU }, .cuda_funcs = { wait_CUDA }, .opencl_funcs = { wait_OPENCL }, .cpu_funcs_name = { "wait_CPU" }, .nbuffers = 1, .modes = {STARPU_RW}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model_init, .name = "init", }; static struct starpu_perfmodel perf_model_redux = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl_redux = { .cpu_funcs = { wait_CPU }, .cuda_funcs = { wait_CUDA }, .opencl_funcs = { wait_OPENCL }, .cpu_funcs_name = { "wait_CPU" }, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model_redux, .name = "redux", }; 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 nb_tasks, nb_workers_CPU, nb_workers_CUDA, nb_workers_OPENCL; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers_CPU = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); nb_workers_CUDA = starpu_worker_get_count_by_type(STARPU_CUDA_WORKER); nb_workers_OPENCL = starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = (nb_workers_CPU + nb_workers_CUDA + nb_workers_OPENCL)*TASK_COEFFICIENT; /* We consider a vector of float that is initialized just as any of C * data */ float *vector; starpu_data_handle_t vector_handle; unsigned i; vector = calloc(NB_FLOAT, sizeof(float)); #ifndef STARPU_SIMGRID for (i = 0; i < NB_FLOAT; i++) vector[i] = (i+1.0f); #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_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NB_FLOAT, sizeof(vector[0])); starpu_data_set_reduction_methods(vector_handle, &cl_redux, &cl_init); begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= ((1 - MARGIN) * expected_speed_up); check_sup = speed_up <= ((1 + MARGIN) * expected_speed_up); printf("measured time = %f seconds\nsequential time = %f seconds\nspeed up = %f\nnumber of workers CPU = %u\nnumber of workers CUDA = %u\nnumber of workers OPENCL = %u\nnumber of tasks = %u\nexpected speed up = %f\npercentage of expected speed up %.2f%%\n", time_m, time_s, speed_up, nb_workers_CPU, nb_workers_CUDA, nb_workers_OPENCL, nb_tasks, expected_speed_up, percentage_expected_speed_up); starpu_shutdown(); free(vector); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_redux_heterogeneous_tasks_data.sh000077500000000000000000000014711413463044200301170ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XSUCCESS="dmda dmdap dmdar dmdas dmdasd pheft" test_scheds parallel_independent_heterogeneous_tasks_data starpu-1.3.9+dfsg/tests/microbenchs/parallel_redux_homogeneous_tasks_data.c000066400000000000000000000130431413463044200273760ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2016 Bérangère Subervie * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* Run a series of tasks with homogeneous execution time and redux data */ #define TIME 0.010 #ifdef STARPU_QUICK_CHECK #define TASK_COEFFICIENT 20 #define MARGIN 0.20 #else #define TASK_COEFFICIENT 100 #define MARGIN 0.10 #endif #define SECONDS_SCALE_COEFFICIENT_TIMING_NOW 1000000 #define NB_FLOAT 4000000 void wait_homogeneous(void *descr[], void *_args) { (void)descr; (void)_args; starpu_sleep(TIME); } double cost_function(struct starpu_task *t, struct starpu_perfmodel_arch *a, unsigned i) { (void)t; (void)a; (void)i; return TIME * 1000000; } static struct starpu_perfmodel perf_model = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl = { .cpu_funcs = { wait_homogeneous }, .cuda_funcs = { wait_homogeneous }, .opencl_funcs = { wait_homogeneous }, .cpu_funcs_name = { "wait_homogeneous" }, .nbuffers = 1, .modes = {STARPU_REDUX}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model, .name = "cl", }; static struct starpu_perfmodel perf_model_init = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl_init = { .cpu_funcs = { wait_homogeneous }, .cuda_funcs = { wait_homogeneous }, .opencl_funcs = { wait_homogeneous }, .cpu_funcs_name = { "wait_homogeneous" }, .nbuffers = 1, .modes = {STARPU_RW}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model_init, .name = "init", }; static struct starpu_perfmodel perf_model_redux = { .type = STARPU_PER_ARCH, .arch_cost_function = cost_function, }; static struct starpu_codelet cl_redux = { .cpu_funcs = { wait_homogeneous }, .cuda_funcs = { wait_homogeneous }, .opencl_funcs = { wait_homogeneous }, .cpu_funcs_name = { "wait_homogeneous" }, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .flags = STARPU_CODELET_SIMGRID_EXECUTE, .model = &perf_model_redux, .name = "redux", }; 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 nb_tasks, nb_workers; double begin_time, end_time, time_m, time_s, speed_up, expected_speed_up, percentage_expected_speed_up; bool check, check_sup; nb_workers = starpu_worker_get_count_by_type(STARPU_CPU_WORKER) + starpu_worker_get_count_by_type(STARPU_CUDA_WORKER) + starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER); nb_tasks = nb_workers*TASK_COEFFICIENT; /* We consider a vector of float that is initialized just as any of C * data */ float *vector; starpu_data_handle_t vector_handle; unsigned i; vector = calloc(NB_FLOAT, sizeof(float)); #ifndef STARPU_SIMGRID for (i = 0; i < NB_FLOAT; i++) vector[i] = (i+1.0f); #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_vector_data_register(&vector_handle, STARPU_MAIN_RAM, (uintptr_t)vector, NB_FLOAT, sizeof(vector[0])); starpu_data_set_reduction_methods(vector_handle, &cl_redux, &cl_init); begin_time = starpu_timing_now(); /*execution des tasks*/ for (i=0; i= ((1 - MARGIN) * expected_speed_up); check_sup = speed_up <= ((1 + MARGIN) * expected_speed_up); printf("measured time = %f seconds\nsequential time = %f seconds\nspeed up = %f\nnumber of workers = %u\nnumber of tasks = %u\nexpected speed up = %f\npercentage of expected speed up %.2f%%\n", time_m, time_s, speed_up, nb_workers, nb_tasks, expected_speed_up, percentage_expected_speed_up); starpu_shutdown(); free(vector); //test reussi ou test echoue if (check && check_sup) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } starpu-1.3.9+dfsg/tests/microbenchs/parallel_redux_homogeneous_tasks_data.sh000077500000000000000000000014671413463044200276000ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/microbench.sh XSUCCESS="dmda dmdap dmdar dmdas dmdasd pheft" test_scheds parallel_independent_homogeneous_tasks_data starpu-1.3.9+dfsg/tests/microbenchs/prefetch_data_on_node.c000066400000000000000000000107161413463044200240630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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[], void *_args) { (void)descr; (void)_args; } 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.3.9+dfsg/tests/microbenchs/redundant_buffer.c000066400000000000000000000046461413463044200231130ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; void func_codelet_null(void *descr[], void *_args) { (void)descr; (void)_args; } static struct starpu_codelet cl = { .cpu_funcs = {func_codelet_null}, .cuda_funcs = {func_codelet_null}, .opencl_funcs = {func_codelet_null}, .cpu_funcs_name = {"func_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.3.9+dfsg/tests/microbenchs/sync_tasks_data_overhead.sh000077500000000000000000000014151413463044200250070ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # ROOT=${0%.sh} ROOT=${ROOT/tasks_data_overhead/tasks_overhead} exec $STARPU_LAUNCH $ROOT -b 1 "$@" starpu-1.3.9+dfsg/tests/microbenchs/sync_tasks_overhead.c000066400000000000000000000120731413463044200236250ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 */ 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; #define BUFFERSIZE 16 void dummy_func(void *descr[], void *arg) { (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, .modes = {STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW} }; 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 usage(char **argv) { fprintf(stderr, "Usage: %s [-i ntasks] [-p sched_policy] [-b nbuffers] [-h]\n", argv[0]); exit(EXIT_FAILURE); } static void parse_args(int argc, char **argv, struct starpu_conf *conf) { int c; while ((c = getopt(argc, argv, "i:b:p:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); dummy_codelet.nbuffers = nbuffers; 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; 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"); unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_malloc((void**)&buffers[buffer], BUFFERSIZE*sizeof(float)); starpu_vector_data_register(&data_handles[buffer], STARPU_MAIN_RAM, (uintptr_t)buffers[buffer], BUFFERSIZE, sizeof(float)); } fprintf(stderr, "#tasks : %u\n#buffers : %u\n", ntasks, nbuffers); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->synchronous = 1; /* we have 8 buffers at most */ for (buffer = 0; buffer < nbuffers; buffer++) { task->handles[buffer] = data_handles[buffer]; } ret = starpu_task_submit(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 number[1+sizeof(nbuffers)*3+1]; const char *numberp; char file[1024]; FILE *f; if (nbuffers) { snprintf(number, sizeof(number), "_%u", nbuffers); numberp = number; } else numberp = ""; snprintf(file, sizeof(file), "%s/sync_tasks_overhead_total%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); snprintf(file, sizeof(file), "%s/sync_tasks_overhead_per_task%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ntasks); fclose(f); } } for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_unregister(data_handles[buffer]); starpu_free((void*)buffers[buffer]); } 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.3.9+dfsg/tests/microbenchs/tasks_data_overhead.sh000077500000000000000000000014151413463044200237530ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # ROOT=${0%.sh} ROOT=${ROOT/tasks_data_overhead/tasks_overhead} exec $STARPU_LAUNCH $ROOT -b 1 "$@" starpu-1.3.9+dfsg/tests/microbenchs/tasks_overhead.c000066400000000000000000000177541413463044200226040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; #define BUFFERSIZE 16 struct starpu_task *tasks; void dummy_func(void *descr[], void *arg) { (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, .modes = {STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW} }; static void usage(char **argv) { fprintf(stderr, "Usage: %s [-i ntasks] [-p sched_policy] [-b nbuffers] [-h]\n", argv[0]); exit(EXIT_FAILURE); } static void parse_args(int argc, char **argv, struct starpu_conf *conf) { int c; while ((c = getopt(argc, argv, "i:b:p:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); dummy_codelet.nbuffers = nbuffers; 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_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, &conf); 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], BUFFERSIZE*sizeof(float)); starpu_vector_data_register(&data_handles[buffer], STARPU_MAIN_RAM, (uintptr_t)buffers[buffer], BUFFERSIZE, 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].cl = &dummy_codelet; 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(); if (nbuffers) { /* Data dependency, just submit them all */ 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"); } } else { /* No data dependency, we have to introduce dependencies by hand */ 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]); 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 number[1+sizeof(nbuffers)*3+1]; const char *numberp; char file[1024]; FILE *f; if (nbuffers) { snprintf(number, sizeof(number), "_%u", nbuffers); numberp = number; } else numberp = ""; snprintf(file, sizeof(file), "%s/tasks_overhead_total_submit%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_submit/1000000); fclose(f); snprintf(file, sizeof(file), "%s/tasks_overhead_per_task_submit%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_submit/ntasks); fclose(f); snprintf(file, sizeof(file), "%s/tasks_overhead_total_execution%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_exec/1000000); fclose(f); snprintf(file, sizeof(file), "%s/tasks_overhead_per_task_execution%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_exec/ntasks); fclose(f); snprintf(file, sizeof(file), "%s/tasks_overhead_total_submit_execution%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, (timing_submit+timing_exec)/1000000); fclose(f); snprintf(file, sizeof(file), "%s/tasks_overhead_per_task_submit_execution%s.dat", output_dir, numberp); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, (timing_submit+timing_exec)/ntasks); fclose(f); } } for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_unregister(data_handles[buffer]); starpu_free((void*)buffers[buffer]); } 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.3.9+dfsg/tests/microbenchs/tasks_size_overhead.c000066400000000000000000000210631413463044200236220ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 64 #else #define FACTOR 2 #endif #ifdef STARPU_QUICK_CHECK #define CPUSTEP 8 #else #define CPUSTEP 1 #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 = CPUSTEP; static unsigned mintime = START, maxtime = STOP, factortime = FACTOR; struct starpu_task *tasks; void func(void *descr[], void *arg) { (void)descr; 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; (void) a; 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"); /* 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 if (STARPU_RUNNING_ON_VALGRIND) { factortime *= 4; cpustep *= 4; } parse_args(argc, argv); float *buffers[total_nbuffers?total_nbuffers:1]; /* Allocate data */ for (buffer = 0; buffer < total_nbuffers; buffer++) buffers[buffer] = (float *) calloc(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]; if (nbuffers && !total_nbuffers) { fprintf(stderr,"can not have %u buffers with %u total buffers\n", nbuffers, total_nbuffers); goto error; } /* 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[0])); 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, sizeof(file), "%s/tasks_size_overhead_total%s%s.dat", output_dir, sched?"_":"", sched?sched:""); f = fopen(file, "a"); fprintf(f, "%s\t%u\t%u\t%f\n", bench_id, ncpus, size, timing/1000000 /(ntasks*ncpus) *1000); 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 */ error: starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.3.9+dfsg/tests/microbenchs/tasks_size_overhead.gp000077500000000000000000000023731413463044200240140ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # OUTPUT=tasks_size_overhead.output VALS=$(sed -n -e '3p' < $OUTPUT) PLOTS="" for x in $(seq 1 11) do pos=$((2 * $x + 1)) double=$((2 * $x)) value=$(echo "$VALS" | cut -d ' ' -f $pos) if test -n "$value" then PLOTS=",\"$OUTPUT\" using 1:($value)/(\$$pos) with linespoints title columnheader($double) $PLOTS" fi done [ -n "$TERMINAL" ] || TERMINAL=eps [ -n "$OUTFILE" ] || OUTFILE=tasks_size_overhead.eps gnuplot << EOF set terminal $TERMINAL set output "$OUTFILE" set key top left set xlabel "number of cores" set ylabel "speedup" plot \ x title "linear" $PLOTS EOF starpu-1.3.9+dfsg/tests/microbenchs/tasks_size_overhead.sh000077500000000000000000000014221413463044200240120ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # ROOT=${0%.sh} $STARPU_LAUNCH $ROOT "$@" > tasks_size_overhead.output $ROOT.gp gv tasks_size_overhead.eps starpu-1.3.9+dfsg/tests/microbenchs/tasks_size_overhead_sched.sh000077500000000000000000000022661413463044200251670ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # ROOT=${0%.sh} ROOT=${ROOT%_sched} unset STARPU_SSILENT $STARPU_LAUNCH $_STARPU_LAUNCH $ROOT "$@" > tasks_size_overhead.output ret=$? if test "$ret" = "0" then # if the program was successfull try to run gnuplot DIR= [ -z "$STARPU_BENCH_DIR" ] || DIR="$STARPU_BENCH_DIR/" export TERMINAL=png export OUTFILE=${DIR}tasks_size_overhead_${STARPU_SCHED}.png gnuplot_av=$(which gnuplot) if test -n "$gnuplot_av" then # If gnuplot is available, plot the result $ROOT.gp ret=$? fi fi exit $ret starpu-1.3.9+dfsg/tests/microbenchs/tasks_size_overhead_scheds.sh000077500000000000000000000015631413463044200253510ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # . $(dirname $0)/microbench.sh XFAIL="heteroprio" if [ -z "$STARPU_BENCH_DIR" ] then FAST="-i 8" fi _STARPU_LAUNCH="$STARPU_LAUNCH" unset STARPU_LAUNCH test_scheds tasks_size_overhead_sched.sh $FAST starpu-1.3.9+dfsg/tests/model-checking/000077500000000000000000000000001413463044200177755ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/model-checking/barrier.sh000077500000000000000000000013441413463044200217640ustar00rootroot00000000000000#!/bin/bash -x # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/starpu-mc.sh test starpu_barrier starpu-1.3.9+dfsg/tests/model-checking/platform.xml000066400000000000000000000012631413463044200223450ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tests/model-checking/prio_list.c000066400000000000000000000117421413463044200221520ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 _STARPU_MALLOC(p, s) do {p = malloc(s);} while (0) #define _STARPU_CALLOC(p, n, s) do {p = calloc(n, s);} while (0) #define _STARPU_MALLOC_CAST(p, s, t) do {p = (t) malloc(s);} while (0) #ifndef NOCONFIG #include #else #define _GNU_SOURCE 1 // Assuming recent simgrid #define STARPU_HAVE_SIMGRID_MSG_H #define STARPU_HAVE_SIMGRID_SEMAPHORE_H #define STARPU_HAVE_SIMGRID_MUTEX_H #define STARPU_HAVE_SIMGRID_COND_H #define STARPU_HAVE_SIMGRID_BARRIER_H #define STARPU_HAVE_XBT_SYNCHRO_H #define HAVE_SIMGRID_GET_CLOCK #define HAVE_SG_ACTOR_SLEEP_FOR #define HAVE_SG_CFG_SET_INT #endif #include #include #include #include #include #include #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif #include #ifdef STARPU_HAVE_XBT_SYNCHRO_H #include #else #include #endif #include #ifndef NLISTS #define NLISTS 1 #endif #ifndef NITERS #define NITERS 1 #endif #ifndef NTHREADS #define NTHREADS 2 #endif #ifndef NELEMENTS #define NELEMENTS 4 #endif // MC_ignore #ifdef STARPU_HAVE_SIMGRID_MUTEX_H sg_mutex_t mutex[NLISTS]; #define mutex_lock(l) sg_mutex_lock(l) #define mutex_unlock(l) sg_mutex_unlock(l) #else xbt_mutex_t mutex[NLISTS]; #define mutex_lock(l) xbt_mutex_acquire(l) #define mutex_unlock(l) xbt_mutex_release(l) #endif LIST_TYPE(foo, unsigned prio; unsigned back; /* Push at back instead of front? */ ); PRIO_LIST_TYPE(foo, prio); struct foo_prio_list mylist[NLISTS]; void check_list_prio(struct foo_prio_list *list) { struct foo *cur; unsigned lastprio = UINT_MAX; unsigned back = 0; for (cur = foo_prio_list_begin(list); cur != foo_prio_list_end(list); cur = foo_prio_list_next(list, cur)) { if (cur->prio == lastprio) /* For same prio, back elements should never get before * front elements */ MC_assert(!(back && !cur->back)); else MC_assert(lastprio > cur->prio); lastprio = cur->prio; back = cur->back; } } int worker(int argc, char *argv[]) { unsigned myrank = atoi(argv[0]); unsigned i, n, l, iter; struct foo *elem; struct drand48_data buffer; long res; srand48_r(myrank, &buffer); l = myrank%NLISTS; for (iter = 0; iter < NITERS; iter++) { for (i = 0; i < NELEMENTS; i++) { elem = malloc(sizeof(*elem)); lrand48_r(&buffer, &res); elem->prio = res%10; lrand48_r(&buffer, &res); elem->back = res%2; mutex_lock(mutex[l]); if (elem->back) foo_prio_list_push_back(&mylist[l], elem); else foo_prio_list_push_front(&mylist[l], elem); check_list_prio(&mylist[l]); mutex_unlock(mutex[l]); } for (i = 0; i < NELEMENTS; i++) { lrand48_r(&buffer, &res); n = res%(NELEMENTS-i); mutex_lock(mutex[l]); for (elem = foo_prio_list_begin(&mylist[l]); n--; elem = foo_prio_list_next(&mylist[l], elem)) ; foo_prio_list_erase(&mylist[l], elem); check_list_prio(&mylist[l]); mutex_unlock(mutex[l]); } /* horrible way to wait for list getting empty */ #ifdef HAVE_SG_ACTOR_SLEEP_FOR sg_actor_sleep_for(1000); #else MSG_process_sleep(1000); #endif } return 0; } int master(int argc, char *argv[]) { unsigned i, l; for (l = 0; l < NLISTS; l++) { #ifdef STARPU_HAVE_SIMGRID_MUTEX_H mutex[l] = sg_mutex_init(); #else mutex[l] = xbt_mutex_init(); #endif foo_prio_list_init(&mylist[l]); } for (i = 0; i < NTHREADS; i++) { char *s; asprintf(&s, "%d\n", i); char **args = malloc(sizeof(char*)*2); args[0] = s; args[1] = NULL; MSG_process_create_with_arguments("test", worker, NULL, MSG_host_self(), 1, args); } return 0; } int main(int argc, char *argv[]) { if (argc < 3) { fprintf(stderr,"usage: %s platform.xml host\n", argv[0]); exit(EXIT_FAILURE); } srand48(0); MSG_init(&argc, argv); #ifdef HAVE_SG_CFG_SET_INT sg_cfg_set_int("contexts/stack-size", 128); #elif 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", 128); #else xbt_cfg_set_int("contexts/stack-size", 128); #endif MSG_create_environment(argv[1]); MSG_process_create("master", master, NULL, MSG_get_host_by_name(argv[2])); MSG_main(); return 0; } starpu-1.3.9+dfsg/tests/model-checking/prio_list.sh000077500000000000000000000013371413463044200223440ustar00rootroot00000000000000#!/bin/bash -x # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # source $(dirname $0)/starpu-mc.sh test prio_list starpu-1.3.9+dfsg/tests/model-checking/starpu-mc.sh.in000077500000000000000000000022461413463044200226600ustar00rootroot00000000000000#!/bin/bash -x # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 a model-checking program with simgrid model checker SIMGRID_MC=@SIMGRID_MC@ abs_top_srcdir=@abs_top_srcdir@ abs_builddir=@abs_builddir@ set -e [ -x "$SIMGRID_MC" ] || exit 77 MC_FLAGS=--cfg=model-check/reduction:none # makes it much longer actually #MC_FLAGS+=--cfg=contexts/factory:ucontext #MC_FLAGS+=--cfg=model-check/sparse-checkpoint:yes #MC_FLAGS+=--cfg=model-check/visited:1000 test() { $SIMGRID_MC $abs_builddir/$1 $abs_top_srcdir/tests/model-checking/platform.xml MAIN $MC_FLAGS } starpu-1.3.9+dfsg/tests/model-checking/starpu_barrier.c000066400000000000000000000104141413463044200231650ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 __COMMON_UTILS_H__ #define _STARPU_MALLOC(p, s) do {p = malloc(s);} while (0) #define _STARPU_CALLOC(p, n, s) do {p = calloc(n, s);} while (0) #define _STARPU_REALLOC(p, s) do {p = realloc(p, s);} while (0) #define STARPU_HG_DISABLE_CHECKING(v) ((void) 0) #define STARPU_HG_ENABLE_CHECKING(v) ((void) 0) #define ANNOTATE_HAPPENS_AFTER(v) ((void) 0) #define ANNOTATE_HAPPENS_BEFORE(v) ((void) 0) #define STARPU_DEBUG_PREFIX "[starpu]" #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 #define STARPU_UYIELD() ((void)0) #ifndef NOCONFIG #include #else #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif // Assuming recent simgrid #define STARPU_HAVE_SIMGRID_MSG_H #define STARPU_HAVE_SIMGRID_SEMAPHORE_H #define STARPU_HAVE_SIMGRID_MUTEX_H #define STARPU_HAVE_SIMGRID_COND_H #define STARPU_HAVE_SIMGRID_BARRIER_H #define STARPU_HAVE_XBT_SYNCHRO_H #define HAVE_SIMGRID_GET_CLOCK #define HAVE_SG_ACTOR_SLEEP_FOR #define HAVE_SG_CFG_SET_INT #endif #include #include #include #include #include #include #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif #include #ifdef STARPU_HAVE_XBT_SYNCHRO_H #include #else #include #endif /* common/thread.c references these, but doesn't need to have them working anyway */ int _starpu_simgrid_thread_start(int argc, char *argv[]) { return 0; } starpu_sg_host_t _starpu_simgrid_get_host_by_name(const char *name) { } static void _starpu_clock_gettime(struct timespec *ts) { #ifdef HAVE_SIMGRID_GET_CLOCK double now = simgrid_get_clock(); #else double now = MSG_get_clock(); #endif ts->tv_sec = floor(now); ts->tv_nsec = floor((now - ts->tv_sec) * 1000000000); } void starpu_sleep(float nb_sec) { #ifdef HAVE_SG_ACTOR_SLEEP_FOR sg_actor_sleep_for(nb_sec); #else MSG_process_sleep(nb_sec); #endif } #include #undef STARPU_DEBUG int starpu_worker_get_id(void) { return 0; } static inline unsigned _starpu_worker_mutex_is_sched_mutex(int workerid, starpu_pthread_mutex_t *mutex) { return 0; } #include #ifndef NTHREADS #define NTHREADS 2 #endif #ifndef NITERS #define NITERS 1 #endif struct _starpu_barrier barrier; int worker(int argc, char *argv[]) { unsigned iter; for (iter = 0; iter < NITERS; iter++) { MC_assert(barrier.count <= NTHREADS); _starpu_barrier_wait(&barrier); } return 0; } int master(int argc, char *argv[]) { unsigned i; _starpu_barrier_init(&barrier, NTHREADS); for (i = 0; i < NTHREADS; i++) { char *s; asprintf(&s, "%d\n", i); char **args = malloc(sizeof(char*)*2); args[0] = s; args[1] = NULL; MSG_process_create_with_arguments("test", worker, NULL, MSG_host_self(), 1, args); } return 0; } #undef main int main(int argc, char *argv[]) { if (argc < 3) { fprintf(stderr,"usage: %s platform.xml host\n", argv[0]); exit(EXIT_FAILURE); } srand48(0); MSG_init(&argc, argv); #ifdef HAVE_SG_CFG_SET_INT sg_cfg_set_int("contexts/stack-size", 128); #elif 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", 128); #else xbt_cfg_set_int("contexts/stack-size", 128); #endif MSG_create_environment(argv[1]); MSG_process_create("master", master, NULL, MSG_get_host_by_name(argv[2])); MSG_main(); return 0; } starpu-1.3.9+dfsg/tests/openmp/000077500000000000000000000000001413463044200164225ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/openmp/api_01.c000066400000000000000000000111021413463044200176320ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 /* * Check the OpenMP API getters return proper default results. */ #if !defined(STARPU_OPENMP) int main(void) { 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_MAX_TASK_PRIORITY"); unsetenv("OMP_PROC_BIND"); unsetenv("OMP_NUM_THREADS"); unsetenv("OMP_PLACES"); unsetenv("OMP_DISPLAY_ENV"); ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { 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_false); 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); check_omp_func(starpu_omp_get_initial_device, 0); check_omp_func(starpu_omp_get_max_task_priority, 0); return 0; } #endif starpu-1.3.9+dfsg/tests/openmp/array_slice_01.c000066400000000000000000000156171413463044200213750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Test recursive OpenMP tasks, data dependences, data slice dependences. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else #define NX 64 int global_vector[NX]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/cuda_task_01.c000066400000000000000000000133071413463044200210300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check executing a CUDA target task. */ #if !defined(STARPU_OPENMP) || !defined(STARPU_USE_CUDA) int main(void) { 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(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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"); cudaMemcpyAsync(v2,v1,nx1*sizeof(*_vector_1), cudaMemcpyDeviceToDevice, starpu_cuda_get_local_stream()); fprintf(stderr, "cudaMemcpy: <--\n"); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; #endif 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 (void) { struct starpu_omp_parallel_region_attr attr; if (starpu_cuda_worker_get_count() < 1) { return STARPU_TEST_SKIPPED; } memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/environment.c000066400000000000000000000032121413463044200211300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 /* * Check OpenMP environment variables are properly parsed. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else int main (void) { 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_MAX_TASK_PRIORITY", "20", 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(); if (ret == -EINVAL) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); starpu_omp_shutdown(); return 0; } #endif starpu-1.3.9+dfsg/tests/openmp/init_exit_01.c000066400000000000000000000020671413463044200210670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 the starpu_omp_init/shutdown calls. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else int main (void) { int ret = starpu_omp_init(); if (ret == -EINVAL) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); starpu_omp_shutdown(); return 0; } #endif starpu-1.3.9+dfsg/tests/openmp/init_exit_02.c000066400000000000000000000023441413463044200210660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 the starpu_omp_init/shutdown calls when called from constructor/destructor. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } int main (void) { return 0; } #endif starpu-1.3.9+dfsg/tests/openmp/parallel_01.c000066400000000000000000000034461413463044200206710ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP parallel region support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_02.c000066400000000000000000000046611413463044200206720ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the nested OpenMP parallel regions support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_03.c000066400000000000000000000035361413463044200206730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check running multiple OpenMP parallel regions one at a time. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_barrier_01.c000066400000000000000000000042361413463044200223750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP parallel barrier support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { pthread_t tid; struct starpu_omp_parallel_region_attr attr; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_critical_01.c000066400000000000000000000046261413463044200225440ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP critical support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_critical_inline_01.c000066400000000000000000000052051413463044200240740ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the inline OpenMP critical support */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_critical_named_01.c000066400000000000000000000051711413463044200237040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP named critical support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_critical_named_inline_01.c000066400000000000000000000052331413463044200252410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the inline OpenMP named critical support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_for_01.c000066400000000000000000000116121413463044200215310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP parallel for support, with multiple schedule and chunk settings. */ #if !defined(STARPU_OPENMP) int main(void) { 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(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_for_02.c000066400000000000000000000062101413463044200215300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check multiple OpenMP parallel for support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else #define NB_ITERS 4321 #define CHUNK 42 __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_for_ordered_01.c000066400000000000000000000124371413463044200232430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP ordered parallel for support. */ #if !defined(STARPU_OPENMP) int main(void) { 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(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_master_01.c000066400000000000000000000045501413463044200222410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP master support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_master_inline_01.c000066400000000000000000000046761413463044200236100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP inline master support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_nested_lock_01.c000066400000000000000000000065151413463044200232430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP nested lock support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_sections_01.c000066400000000000000000000055341413463044200226000ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP parallel sections support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_sections_combined_01.c000066400000000000000000000054601413463044200244360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP combined parallel sections support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_simple_lock_01.c000066400000000000000000000054721413463044200232530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP simple lock support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); printf("
    \n"); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_single_copyprivate_01.c000066400000000000000000000063231413463044200246540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP single with copyprivate support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_single_copyprivate_inline_01.c000066400000000000000000000050611413463044200262100ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP inline single with copyprivate support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_single_inline_01.c000066400000000000000000000060511413463044200235630ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP inline single support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_single_nowait_01.c000066400000000000000000000046021413463044200236060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP single nowait support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/parallel_single_wait_01.c000066400000000000000000000045711413463044200232560ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP single wait support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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 (void) { struct starpu_omp_parallel_region_attr attr; pthread_t tid; tid = pthread_self(); memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/task_01.c000066400000000000000000000051051413463044200200310ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP task support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/task_02.c000066400000000000000000000127711413463044200200410ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP nested task support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else #define NX 64 int global_vector[NX]; __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/task_03.c000066400000000000000000000037421413463044200200400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP orphaned task support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void task_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: explicit task \"f\"\n", (void *)tid, worker_id); } int main (void) { struct starpu_omp_task_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; attr.cl.cpu_funcs[0] = task_region_f; 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); return 0; } #endif starpu-1.3.9+dfsg/tests/openmp/taskgroup_01.c000066400000000000000000000072101413463044200211050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP taskgroup support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/taskgroup_02.c000066400000000000000000000073711413463044200211160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP multiple taskgroup support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/openmp/taskloop.c000066400000000000000000000045161413463044200204300ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 the OpenMP orphaned task support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); } __attribute__((destructor)) static void omp_destructor(void) { starpu_omp_shutdown(); } void taskloop_callback(unsigned long long begin_i, unsigned long long end_i) { int worker_id; pthread_t tid; tid = pthread_self(); worker_id = starpu_worker_get_id(); printf ("begin = %llu , end = %llu, %p\n", begin_i, end_i, (void *)starpu_task_get_current()); } void taskloop_callback_wrapper(void *buffers[], void *_args) { (void) buffers; struct starpu_omp_task_region_attr * args = _args; taskloop_callback(args->begin_i, args->end_i); } int main (void) { struct starpu_omp_task_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; attr.cl.cpu_funcs[0] = taskloop_callback_wrapper; attr.cl_arg = &attr; attr.cl.where = STARPU_CPU; attr.if_clause = 1; attr.final_clause = 0; attr.untied_clause = 1; attr.mergeable_clause = 0; attr.nogroup_clause = 0; attr.is_loop = 0; attr.collapse = 0; attr.num_tasks = 5; attr.nb_iterations = 400; attr.grainsize = 130; starpu_omp_taskloop_inline_begin(&attr); starpu_omp_taskloop_inline_end(&attr); return 0; } #endif starpu-1.3.9+dfsg/tests/openmp/taskwait_01.c000066400000000000000000000063071413463044200207230ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * Check the OpenMP taskwait support. */ #if !defined(STARPU_OPENMP) int main(void) { return STARPU_TEST_SKIPPED; } #else __attribute__((constructor)) static void omp_constructor(void) { int ret = starpu_omp_init(); if (ret == -EINVAL) exit(STARPU_TEST_SKIPPED); 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)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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 (void) { struct starpu_omp_parallel_region_attr attr; memset(&attr, 0, sizeof(attr)); #ifdef STARPU_SIMGRID attr.cl.model = &starpu_perfmodel_nop; #endif attr.cl.flags = STARPU_CODELET_SIMGRID_EXECUTE; 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.3.9+dfsg/tests/overlap/000077500000000000000000000000001413463044200165745ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/overlap/gpu_concurrency.c000066400000000000000000000056601413463044200221540ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 /* * 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(void *descr[], void *arg) { (void)descr; (void)arg; long_kernel_cuda(NITERS); } void codelet_long_kernel_sync(void *descr[], void *arg) { (void)descr; (void)arg; 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.3.9+dfsg/tests/overlap/long_kernel.cu000066400000000000000000000021461413463044200214270ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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); cudaError_t status = cudaGetLastError(); if (status != cudaSuccess) STARPU_CUDA_REPORT_ERROR(status); } starpu-1.3.9+dfsg/tests/overlap/overlap.c000066400000000000000000000075301413463044200204150ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2010 Mehdi Juhoor * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (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[], void *_args) { (void)descr; (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, sizeof(symbolname), "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_do_schedule(); 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.3.9+dfsg/tests/overlap/overlap.sh000077500000000000000000000072361413463044200206130ustar00rootroot00000000000000#!/bin/sh -x # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2018 Federal University of Rio Grande do Sul (UFRGS) # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 # Testing another specific scheduler, no need to run this [ -z "$STARPU_SCHED" -o "$STARPU_SCHED" = dmdas ] || exit 77 # XXX: Also see examples/mult/sgemm.sh set -e PREFIX=$(dirname $0) rm -rf $PREFIX/overlap.traces mkdir -p $PREFIX/overlap.traces if [ -n "$STARPU_MIC_SINK_PROGRAM_PATH" ] ; then STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/overlap # in case libtool got into play [ -x "$STARPU_MIC_SINK_PROGRAM_PATH/.libs/overlap" ] && STARPU_MIC_SINK_PROGRAM_NAME=$STARPU_MIC_SINK_PROGRAM_PATH/.libs/overlap fi export STARPU_FXT_PREFIX=$PREFIX/overlap.traces STARPU_SCHED=dmdas $PREFIX/overlap if [ -x $PREFIX/../../tools/starpu_fxt_tool ]; then $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_plot -o $STARPU_FXT_PREFIX -s overlap_sleep_1024_24 -i $STARPU_FXT_PREFIX/prof_file_${USER}_0 [ -f starpu_overlap_sleep_1024_24.gp -a -f starpu_overlap_sleep_1024_24.data -a -f starpu_overlap_sleep_1024_24_avg.data ] # Generate paje, dag, data, etc. $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_tool -memory-states -label-deps -i $STARPU_FXT_PREFIX/prof_file_${USER}_0 $PREFIX/../../tools/starpu_paje_sort paje.trace ! type pj_dump || pj_dump -e 0 < 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 \) ] $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_data_trace $STARPU_FXT_PREFIX/prof_file_${USER}_0 overlap_sleep_1024_24 [ -f data_trace.gp ] $STARPU_LAUNCH $PREFIX/../../tools/starpu_fxt_stats -i $STARPU_FXT_PREFIX/prof_file_${USER}_0 $STARPU_LAUNCH $PREFIX/../../tools/starpu_tasks_rec_complete tasks.rec tasks2.rec python3 $PREFIX/../../tools/starpu_trace_state_stats.py trace.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 if [ -x $PREFIX/../../tools/starpu_replay ]; then $STARPU_LAUNCH $PREFIX/../../tools/starpu_replay tasks.rec fi [ ! -x $PREFIX/../../tools/starpu_perfmodel_recdump ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_recdump tasks.rec -o perfs2.rec [ -f perfs2.rec ] fi [ ! -x $PREFIX/../../tools/starpu_perfmodel_display ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_display -s overlap_sleep_1024_24 [ ! -x $PREFIX/../../tools/starpu_perfmodel_display ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_display -x -s overlap_sleep_1024_24 [ ! -x $PREFIX/../../tools/starpu_perfmodel_recdump ] || $STARPU_LAUNCH $PREFIX/../../tools/starpu_perfmodel_recdump -o perfs.rec [ -f perfs.rec ] starpu-1.3.9+dfsg/tests/parallel_tasks/000077500000000000000000000000001413463044200201255ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/parallel_tasks/cuda_only.c000066400000000000000000000051741413463044200222550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 pheft works with only GPUs */ void codelet_null(void *descr[], void *_args) { (void)descr; (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(void) { 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); /* 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.3.9+dfsg/tests/parallel_tasks/explicit_combined_worker.c000066400000000000000000000064021413463044200253450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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[], void *_args) { (void)descr; (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(void) { 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) { task->destroy = 0; starpu_task_destroy(task); 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 the task on workerid %u\n", worker); /* 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.3.9+dfsg/tests/parallel_tasks/parallel_kernels.c000066400000000000000000000063521413463044200236160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * Submit dumb parallel forkjoin tasks */ #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 10 #endif #define VECTORSIZE 1024 void codelet_null(void *descr[], void *_args) { (void)descr; (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(void) { 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, n; n = N; if (STARPU_RUNNING_ON_VALGRIND) { n /= 300; } 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.3.9+dfsg/tests/parallel_tasks/parallel_kernels_spmd.c000066400000000000000000000064551413463044200246450ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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[], void *_args) { (void)descr; (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(void) { 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, n; n = N; if (STARPU_RUNNING_ON_VALGRIND) { n /= 300; } 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.3.9+dfsg/tests/parallel_tasks/parallel_kernels_trivial.c000066400000000000000000000071441413463044200253500ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * Submit a simple testcase for parallel tasks. */ #define VECTORSIZE 1024 void codelet_null(void *descr[], void *_args) { (void)descr; (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} }; static struct starpu_codelet cl_seq = { .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(void) { int ret; starpu_data_handle_t v_handle; unsigned *v; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 2; 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)); /* First submit a sequential task */ ret = starpu_task_insert(&cl_seq, STARPU_R, v_handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* Then a parallel task, which is not interesting to run in parallel when we have only two cpus */ ret = starpu_task_insert(&cl, STARPU_R, v_handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* Then another parallel task, which is interesting to run in parallel since the two cpus are now finishing at the same time. */ ret = starpu_task_insert(&cl, STARPU_R, v_handle, 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(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.3.9+dfsg/tests/parallel_tasks/spmd_peager.c000066400000000000000000000061241413463044200225620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" /* * 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[], void *_args) { (void)descr; (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(void) { 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.3.9+dfsg/tests/perfmodels/000077500000000000000000000000001413463044200172645ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/perfmodels/feed.c000066400000000000000000000051601413463044200203350ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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(void) { 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.3.9+dfsg/tests/perfmodels/memory.c000066400000000000000000000033431413463044200207430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 providing the memory perfmodel function */ void func(void *descr[], void *arg) { (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(void) { 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.3.9+dfsg/tests/perfmodels/non_linear_regression_based.c000066400000000000000000000065501413463044200251600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* * Benchmark memset with a non-linear regression */ #define START_LOG 0 #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) { (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) { (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.3.9+dfsg/tests/perfmodels/opencl_memset.c000066400000000000000000000041451413463044200222660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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; else global = (global + local-1) / local * local; 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.3.9+dfsg/tests/perfmodels/opencl_memset_kernel.cl000066400000000000000000000015051413463044200237770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/perfmodels/regression_based.c000066400000000000000000000126561413463044200227600ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 "../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) { (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 memset0_cpu(void *descr[], void *arg) { (void)arg; STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < n; i++) ptr[i] = 42; } void memset_cpu(void *descr[], void *arg) { (void)arg; STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); starpu_usleep(10); 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 = {memset0_cpu, memset_cpu}, .cpu_funcs_name = {"memset0_cpu", "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 = {memset0_cpu, memset_cpu}, .cpu_funcs_name = {"memset0_cpu", "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[32]; 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 = "dmda"; 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.3.9+dfsg/tests/perfmodels/user_base.c000066400000000000000000000063211413463044200214020ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (void)descr; (void)arg; usleep(1000); } size_t get_size_base(struct starpu_task *task, unsigned nimpl) { (void)task; (void)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(void) { 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.3.9+dfsg/tests/perfmodels/valid_model.c000066400000000000000000000112501413463044200217060ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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) { (void)descr; (void)arg; usleep(1000); } 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); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; 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(void) { 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.3.9+dfsg/tests/perfmodels/value_nan.c000066400000000000000000000050721413463044200214040ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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(void) { 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.3.9+dfsg/tests/regression/000077500000000000000000000000001413463044200173045ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/regression/profiles.build.only.in000066400000000000000000000017531413463044200235430ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/regression/profiles.in000066400000000000000000000031331413463044200214570ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/regression/regression.sh.in000077500000000000000000000073571413463044200224440ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tests/sched_ctx/000077500000000000000000000000001413463044200170705ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/sched_ctx/sched_ctx_hierarchy.c000066400000000000000000000127671413463044200232530ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 free_codelet(void *arg) { // The argument of the function is automatically freed by StarPU // free(arg); } void func_cpu_bis(void *descr[], void *_args) { (void)descr; char msg; char worker_name[256]; int worker_id = starpu_worker_get_id_check(); int worker_id_expected; int ntasks; starpu_worker_get_name(worker_id, worker_name, 256); starpu_codelet_unpack_args(_args, &msg, &ntasks, &worker_id_expected); STARPU_ASSERT(worker_id == worker_id_expected); FPRINTF(stderr, "[msg '%c'] [worker id %d] [worker name %s] [tasks %d]\n", msg, worker_id, worker_name, ntasks); if (ntasks > 0) { struct starpu_codelet *codelet = calloc(1,sizeof(*codelet)); codelet->cpu_funcs[0] = func_cpu_bis; codelet->cpu_funcs_name[0] = "func_cpu_bis"; int nntasks = ntasks - 1; starpu_task_insert(codelet, STARPU_VALUE, &msg, sizeof(msg), STARPU_VALUE, &nntasks, sizeof(ntasks), STARPU_VALUE, &worker_id, sizeof(worker_id), STARPU_CALLBACK_WITH_ARG, free_codelet, codelet, 0); } } void func_cpu(void *descr[], void *_args) { (void)descr; char msg; char worker_name[256]; int worker_id = starpu_worker_get_id_check(); int worker_id_expected; int ntasks; unsigned sched_ctx_id; unsigned *sched_ctx_id_p; starpu_worker_get_name(worker_id, worker_name, 256); starpu_codelet_unpack_args(_args, &msg, &ntasks, &sched_ctx_id, &worker_id_expected, &sched_ctx_id_p); STARPU_ASSERT(worker_id == worker_id_expected); *sched_ctx_id_p = sched_ctx_id; starpu_sched_ctx_set_context(sched_ctx_id_p); FPRINTF(stderr, "[msg '%c'] [worker id %d] [worker name %s] [sched_ctx_id %u] [tasks %d] [buffer %p]\n", msg, worker_id, worker_name, sched_ctx_id, ntasks, sched_ctx_id_p); if (ntasks > 0) { struct starpu_codelet *codelet = calloc(1,sizeof(*codelet)); codelet->cpu_funcs[0] = func_cpu_bis; codelet->cpu_funcs_name[0] = "func_cpu_bis"; int nntasks = ntasks - 1; starpu_task_insert(codelet, STARPU_VALUE, &msg, sizeof(msg), STARPU_VALUE, &nntasks, sizeof(nntasks), STARPU_VALUE, &worker_id, sizeof(worker_id), STARPU_CALLBACK_WITH_ARG, free_codelet, codelet, 0); } } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .cpu_funcs_name = {"func_cpu"}, }; int main(void) { int i, ret; int nprocs, nprocs_per_context=1; int procs[STARPU_NMAXWORKERS]; int ntasks=10; char msg[2] = "ab"; unsigned *buffer[2]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); nprocs = starpu_cpu_worker_get_count(); if (nprocs < 2) goto enodev; nprocs_per_context = 1; FPRINTF(stderr, "# Workers = %d -> %d worker for each sched context\n", nprocs, nprocs_per_context); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, nprocs); unsigned sched_ctx_0 = starpu_sched_ctx_create(procs, nprocs_per_context, "ctx_0", 0); unsigned sched_ctx_1 = starpu_sched_ctx_create(&procs[nprocs_per_context], nprocs_per_context, "ctx_1", 0); if (!getenv("STARPU_SSILENT")) { char name0[256]; char name1[256]; starpu_worker_get_name(procs[0], name0, 256); starpu_worker_get_name(procs[1], name1, 256); FPRINTF(stderr, "Creating first sched_ctx with %d worker [id %d name %s]\n", nprocs_per_context, procs[0], name0); FPRINTF(stderr, "Creating second sched_ctx with %d worker [id %d name %s]\n", nprocs_per_context, procs[1], name1); starpu_sched_ctx_display_workers(sched_ctx_0, stderr); starpu_sched_ctx_display_workers(sched_ctx_1, stderr); } buffer[0] = malloc(sizeof(unsigned)); buffer[1] = malloc(sizeof(unsigned)); FPRINTF(stderr, "allocating %p and %p\n", buffer[0], buffer[1]); ret = starpu_task_insert(&mycodelet, STARPU_SCHED_CTX, sched_ctx_0, STARPU_VALUE, &msg[0], sizeof(msg[0]), STARPU_VALUE, &ntasks, sizeof(ntasks), STARPU_VALUE, &sched_ctx_0, sizeof(sched_ctx_0), STARPU_VALUE, &procs[0], sizeof(procs[0]), STARPU_VALUE, &buffer[0], sizeof(buffer[0]), 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); ret = starpu_task_insert(&mycodelet, STARPU_SCHED_CTX, sched_ctx_1, STARPU_VALUE, &msg[1], sizeof(msg[1]), STARPU_VALUE, &ntasks, sizeof(ntasks), STARPU_VALUE, &sched_ctx_1, sizeof(sched_ctx_1), STARPU_VALUE, &procs[1], sizeof(procs[1]), STARPU_VALUE, &buffer[1], sizeof(buffer[1]), 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert"); starpu_task_wait_for_all(); starpu_sched_ctx_delete(sched_ctx_0); starpu_sched_ctx_delete(sched_ctx_1); starpu_shutdown(); free(buffer[0]); free(buffer[1]); 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.3.9+dfsg/tests/sched_ctx/sched_ctx_list.c000066400000000000000000000167071413463044200222460ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 "../../src/core/sched_ctx_list.h" int main(void) { struct _starpu_sched_ctx_list *ctx_list = NULL, *found_list; struct _starpu_sched_ctx_elt *elt; struct _starpu_sched_ctx_list_iterator it; int ret=1, global=1; /* Check prio list addition */ ret &= (_starpu_sched_ctx_list_add_prio(&ctx_list, 50, 0) != NULL); ret &= (ctx_list->priority == 50); ret &= (_starpu_sched_ctx_list_add_prio(&ctx_list, 999, 2) != NULL); ret &= (ctx_list->priority == 999); ret &= (ctx_list->next->priority == 50); ret &= !_starpu_sched_ctx_list_add(&ctx_list, 1); ret &= (ctx_list->next->next->priority == 0); /* Check elements added */ ret &= (ctx_list->head->sched_ctx == 2); ret &= (ctx_list->next->head->sched_ctx == 0); ret &= (ctx_list->next->next->head->sched_ctx == 1); /* Check singleton status */ ret &= (ctx_list->next->head->prev->sched_ctx == 0); ret &= (ctx_list->next->head->next->sched_ctx == 0); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_add"); /* Check addition to existing list */ ret = 1; _starpu_sched_ctx_elt_add(ctx_list->next, 3); ret &= (ctx_list->next->head->next->sched_ctx == 3); ret &= (ctx_list->next->head->prev->sched_ctx == 3); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_elt_add"); /* Find element */ ret = 1; elt = _starpu_sched_ctx_elt_find(ctx_list, 3); ret &= (elt != NULL && elt->sched_ctx == 3); elt = _starpu_sched_ctx_elt_find(ctx_list, 5); ret &= (elt == NULL); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_elt_find"); /* Find list */ ret = 1; found_list = _starpu_sched_ctx_list_find(ctx_list, 0); ret &= (found_list->priority == 0); ret &= (found_list->prev->priority == 50); found_list = _starpu_sched_ctx_list_find(ctx_list, 999); ret &= (found_list->priority==999); found_list = _starpu_sched_ctx_list_find(ctx_list, 42); ret &= (found_list == NULL); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_find"); /* List exists */ ret = 1; ret &= _starpu_sched_ctx_list_exists(ctx_list, 999); ret &= _starpu_sched_ctx_list_exists(ctx_list, 50); ret &= _starpu_sched_ctx_list_exists(ctx_list, 0); ret &= !_starpu_sched_ctx_list_exists(ctx_list, 42); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_exists"); /* Iterator */ ret = 1; ret &= !_starpu_sched_ctx_list_iterator_init(ctx_list, &it); ret &= _starpu_sched_ctx_list_iterator_has_next(&it); elt = _starpu_sched_ctx_list_iterator_get_next(&it); ret &= (elt->sched_ctx == 2); ret &= _starpu_sched_ctx_list_iterator_has_next(&it); elt = _starpu_sched_ctx_list_iterator_get_next(&it); ret &= (elt->sched_ctx == 0); ret &= _starpu_sched_ctx_list_iterator_has_next(&it); elt = _starpu_sched_ctx_list_iterator_get_next(&it); ret &= (elt->sched_ctx == 3); ret &= _starpu_sched_ctx_list_iterator_has_next(&it); elt = _starpu_sched_ctx_list_iterator_get_next(&it); ret &= (elt->sched_ctx == 1); ret &= !_starpu_sched_ctx_list_iterator_has_next(&it); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_iterator"); /* Add element before head */ ret = 1; _starpu_sched_ctx_elt_add_before(ctx_list->next, 4); ret &= (ctx_list->next->head->prev->sched_ctx == 4); ret &= (ctx_list->next->head->next->next->sched_ctx == 4); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_elt_add_before"); /* Let's move it */ ret = 1; ret &= !_starpu_sched_ctx_list_move(&ctx_list, 4, 1002); ret &= (ctx_list->priority == 1002); ret &= (ctx_list->head->sched_ctx == 4); ret &= (ctx_list->head->next->sched_ctx == 4); ret &= (ctx_list->next->next->head->prev->sched_ctx != 4); STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_move"); /* Let's remove it */ ret = 1; elt = _starpu_sched_ctx_elt_find(ctx_list, 4); _starpu_sched_ctx_list_remove_elt(&ctx_list, elt); //ret &= (elt == NULL); ret &= (_starpu_sched_ctx_elt_find(ctx_list, 4) == NULL); ret &= (ctx_list->next->head->next->sched_ctx == 3); ret &= (ctx_list->next->head->prev->sched_ctx == 3); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_elt_remove"); /* Let's remove head of that same ctx */ ret = 1; ret &= !_starpu_sched_ctx_list_remove(&ctx_list, 0); ret &= (_starpu_sched_ctx_elt_find(ctx_list, 0) == NULL); ret &= (ctx_list->next->head->sched_ctx == 3); ret &= (ctx_list->next->head->next->sched_ctx == 3); ret &= (ctx_list->next->head->prev->sched_ctx == 3); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_remove"); /* Remove the last one of this list, we get an empty ctx */ ret = 1; ret &= !_starpu_sched_ctx_list_remove(&ctx_list, 3); ret &= (_starpu_sched_ctx_elt_find(ctx_list, 3) == NULL); found_list = _starpu_sched_ctx_list_find(ctx_list, 50); ret &= (found_list == NULL && ctx_list->priority != 50); ret &= (ctx_list->next->priority == 0); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_remove"); /* Add an element to a new prio then remove it to ensure prio list is cleaned correctly */ ret = 1; ret &= (_starpu_sched_ctx_list_add_prio(&ctx_list, 100000, 75) != NULL); ret &= (ctx_list->priority == 100000); ret &= (_starpu_sched_ctx_elt_find(ctx_list, 75) != NULL); ret &= (ctx_list->head->sched_ctx == 75); ret &= !_starpu_sched_ctx_list_remove(&ctx_list, 75); ret &= (_starpu_sched_ctx_elt_find(ctx_list, 75) == NULL); found_list = _starpu_sched_ctx_list_find(ctx_list, 100000); ret &= (found_list == NULL && ctx_list->priority != 100000); ret &= (ctx_list->priority == 999); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_remove"); /* Delete this list, the function is internal only so we need to modify the list pointers too */ ret = 1; found_list = ctx_list->next; found_list->prev = ctx_list->prev; _starpu_sched_ctx_list_remove_all(ctx_list); ctx_list = found_list; found_list = _starpu_sched_ctx_list_find(ctx_list, 999); ret &= (found_list == NULL && ctx_list->priority != 999); ret &= (_starpu_sched_ctx_elt_find(ctx_list, 2) == NULL); ret &= (ctx_list->priority == 0); ret &= (ctx_list->head->sched_ctx == 1); //as before ret &= (ctx_list->head->next->sched_ctx == 1); ret &= (ctx_list->head->prev->sched_ctx == 1); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_remove_all"); /* Let's add some things again then clean everything */ ret = 1; ret &= (_starpu_sched_ctx_list_add_prio(&ctx_list, 1000, 42) != NULL); ret &= (_starpu_sched_ctx_list_add_prio(&ctx_list, 1000, 43) != NULL); _starpu_sched_ctx_list_delete(&ctx_list); ret &= (ctx_list == NULL); global &= ret; STARPU_CHECK_RETURN_VALUE_IS(ret, 1, "_starpu_sched_ctx_list_delete"); STARPU_CHECK_RETURN_VALUE_IS(global, 1, "_starpu_sched_ctx_(list|elt) global status"); return 0; } starpu-1.3.9+dfsg/tests/sched_ctx/sched_ctx_policy_data.c000066400000000000000000000043761413463044200235620ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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(void) { int ret; int nprocs; int *procs; unsigned sched_ctx; unsigned main_sched_ctx; int *ptr; int *main_ptr; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); nprocs = starpu_cpu_worker_get_count(); if (nprocs == 0) { starpu_shutdown(); return STARPU_TEST_SKIPPED; } procs = (int*)malloc(nprocs*sizeof(int)); starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs, nprocs); sched_ctx = starpu_sched_ctx_create(procs, nprocs, "my_context", 0); ptr = starpu_sched_ctx_get_policy_data(sched_ctx); STARPU_ASSERT_MSG(ptr == NULL, "The policy data for the sched ctx should be NULL\n"); starpu_sched_ctx_set_policy_data(sched_ctx, procs); ptr = starpu_sched_ctx_get_policy_data(sched_ctx); FPRINTF(stderr, "sched_ctx %u : data %p (procs %p)\n", sched_ctx, ptr, procs); STARPU_ASSERT_MSG(ptr == procs, "The policy data for the sched ctx is incorrect\n"); main_sched_ctx = starpu_sched_ctx_get_context(); main_ptr = starpu_sched_ctx_get_policy_data(main_sched_ctx); STARPU_ASSERT_MSG(main_ptr == NULL, "The policy data for the sched ctx should be NULL\n"); starpu_sched_ctx_set_policy_data(main_sched_ctx, procs); main_ptr = starpu_sched_ctx_get_policy_data(sched_ctx); FPRINTF(stderr, "sched_ctx %u : data %p (procs %p)\n", main_sched_ctx, main_ptr, procs); STARPU_ASSERT_MSG(main_ptr == procs, "The policy data for the sched ctx is incorrect\n"); starpu_sched_ctx_delete(sched_ctx); free(procs); starpu_shutdown(); return (ptr == procs) ? 0 : 1; } starpu-1.3.9+dfsg/tests/sched_policies/000077500000000000000000000000001413463044200201015ustar00rootroot00000000000000starpu-1.3.9+dfsg/tests/sched_policies/data_locality.c000066400000000000000000000127721413463044200230670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; char *sched = getenv("STARPU_SCHED"); for (i = 0; i < n_policies; ++i) { struct starpu_sched_policy *policy = policies[i]; if (sched && strcmp(sched, policy->policy_name)) /* Testing another specific scheduler, no need to run this */ continue; 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.3.9+dfsg/tests/sched_policies/execute_all_tasks.c000066400000000000000000000051761413463044200237550ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; char *sched = getenv("STARPU_SCHED"); policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { if (sched && strcmp(sched, (*policy)->policy_name)) /* Testing another specific scheduler, no need to run this */ continue; 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.3.9+dfsg/tests/sched_policies/prio.c000066400000000000000000000056661413463044200212330ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), 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 "../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"}, .opencl_funcs = {A}, .cuda_funcs = {A}, .nbuffers = 0 }; struct starpu_codelet clB = { .cpu_funcs = {B}, .cpu_funcs_name = {"B"}, .opencl_funcs = {B}, .cuda_funcs = {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; char *sched = getenv("STARPU_SCHED"); policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { int ret; if (sched && strcmp(sched, (*policy)->policy_name)) /* Testing another specific scheduler, no need to run this */ continue; 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.3.9+dfsg/tests/sched_policies/simple_cpu_gpu_sched.c000066400000000000000000000166461413463044200244430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 10000000.0; } static double gpu_task_cpu(struct starpu_task *task, struct starpu_perfmodel_arch* arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 10000000.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); char *sched = getenv("STARPU_SCHED"); 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]; if (sched && strcmp(sched, policy->policy_name)) /* Testing another specific scheduler, no need to run this */ continue; 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.3.9+dfsg/tests/sched_policies/simple_deps.c000066400000000000000000000054611413463044200225570ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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"}, .opencl_funcs = {dummy}, .cuda_funcs = {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; char *sched = getenv("STARPU_SCHED"); policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { int ret; if (sched && strcmp(sched, (*policy)->policy_name)) /* Testing another specific scheduler, no need to run this */ continue; 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.3.9+dfsg/tools/000077500000000000000000000000001413463044200151225ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/Makefile.am000066400000000000000000000571501413463044200171660ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Joris Pablo # Copyright (C) 2013 Thibaut Lambert # Copyright (C) 2017 Erwan Leria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the 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 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/45 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/hannibal.affinity \ perfmodels/sampling/bus/hannibal.bandwidth \ perfmodels/sampling/bus/hannibal.config \ perfmodels/sampling/bus/hannibal.latency \ perfmodels/sampling/bus/hannibal.platform.xml \ perfmodels/sampling/bus/hannibal.platform.v4.xml \ perfmodels/sampling/bus/hannibal-pitch.affinity \ perfmodels/sampling/bus/hannibal-pitch.bandwidth \ perfmodels/sampling/bus/hannibal-pitch.config \ perfmodels/sampling/bus/hannibal-pitch.latency \ perfmodels/sampling/bus/hannibal-pitch.platform.xml \ perfmodels/sampling/bus/hannibal-pitch.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/45/chol_model_11.attila \ perfmodels/sampling/codelets/45/chol_model_21.attila \ perfmodels/sampling/codelets/45/chol_model_22.attila \ perfmodels/sampling/codelets/45/cl_update.attila \ perfmodels/sampling/codelets/45/save_cl_bottom.attila \ perfmodels/sampling/codelets/45/save_cl_top.attila \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.attila \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.attila \ perfmodels/sampling/codelets/45/overlap_sleep_1024_24.attila \ \ perfmodels/sampling/codelets/45/chol_model_11.hannibal \ perfmodels/sampling/codelets/45/chol_model_21.hannibal \ perfmodels/sampling/codelets/45/chol_model_22.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.hannibal \ \ perfmodels/sampling/codelets/45/chol_model_11.hannibal-pitch \ perfmodels/sampling/codelets/45/chol_model_21.hannibal-pitch \ perfmodels/sampling/codelets/45/chol_model_22.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.hannibal-pitch \ \ perfmodels/sampling/codelets/45/chol_model_11.idgraf \ perfmodels/sampling/codelets/45/chol_model_21.idgraf \ perfmodels/sampling/codelets/45/chol_model_22.idgraf \ perfmodels/sampling/codelets/45/cl_update.idgraf \ perfmodels/sampling/codelets/45/save_cl_bottom.idgraf \ perfmodels/sampling/codelets/45/save_cl_top.idgraf \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.idgraf \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.idgraf \ \ perfmodels/sampling/codelets/45/chol_model_11.mirage \ perfmodels/sampling/codelets/45/chol_model_21.mirage \ perfmodels/sampling/codelets/45/chol_model_22.mirage \ perfmodels/sampling/codelets/45/cl_update.mirage \ perfmodels/sampling/codelets/45/save_cl_bottom.mirage \ perfmodels/sampling/codelets/45/save_cl_top.mirage \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.mirage \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.mirage \ perfmodels/sampling/codelets/45/overlap_sleep_1024_24.mirage \ \ perfmodels/sampling/codelets/45/chol_model_11.sirocco \ perfmodels/sampling/codelets/45/chol_model_21.sirocco \ perfmodels/sampling/codelets/45/chol_model_22.sirocco \ perfmodels/sampling/codelets/45/cl_update.sirocco \ perfmodels/sampling/codelets/45/save_cl_bottom.sirocco \ perfmodels/sampling/codelets/45/save_cl_top.sirocco \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.sirocco \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.sirocco \ perfmodels/sampling/codelets/45/overlap_sleep_1024_24.sirocco EXTRA_DIST = \ dev/checker/rename.sed \ dev/checker/rename.sh \ dev/cppcheck/suppressions.txt \ dev/valgrind/bash.suppr \ dev/valgrind/fxt.suppr \ dev/valgrind/glpk.suppr \ dev/valgrind/hdf5.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/suppressions \ perfmodels/README \ perfmodels/cluster.xml \ perfmodels/hostfile \ perfmodels/sampling/codelets/tmp/mlr_init.out \ 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 figure/* mlr_* ##################################### # What to install and what to check # ##################################### STARPU_TOOLS = TESTS = $(STARPU_TOOLS) noinst_PROGRAMS = check_PROGRAMS = $(STARPU_TOOLS) 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 noinst_PROGRAMS += loader else LOADER = LOADER_BIN = $(top_builddir)/tests/loader-cross.sh endif if STARPU_USE_MPI_MASTER_SLAVE LOADER_BIN2 = $(MPI_LAUNCHER) $(LOADER_BIN) else LOADER_BIN2 = $(LOADER_BIN) endif if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN2) else TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN2) 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_recdump if STARPU_SIMGRID bin_PROGRAMS += \ starpu_replay starpu_replay_SOURCES = \ starpu_replay.c \ starpu_replay_sched.c endif 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_mpi_comm_matrix.py \ starpu_paje_draw_histogram \ starpu_paje_draw_histogram.R \ starpu_paje_summary \ starpu_paje_summary.Rmd \ starpu_mlr_analysis \ starpu_mlr_analysis.Rmd \ starpu_paje_state_stats \ starpu_paje_state_stats.R \ starpu_env \ starpu_trace_state_stats.py 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 -n "Force StarPU bus calibration" --output=$@ ./$< starpu_machine_display.1: starpu_machine_display$(EXEEXT) help2man --no-discard-stderr -N -n "Display machine StarPU information" --output=$@ ./$< starpu_perfmodel_display.1: starpu_perfmodel_display$(EXEEXT) help2man --no-discard-stderr -N -n "Display StarPU performance model" --output=$@ ./$< starpu_perfmodel_plot.1: starpu_perfmodel_plot$(EXEEXT) help2man --no-discard-stderr -N -n "Plot StarPU performance model" --output=$@ ./$< starpu_tasks_rec_complete.1: starpu_tasks_rec_complete$(EXEEXT) help2man --no-discard-stderr -N -n "Complete StarPU tasks.rec file" --output=$@ ./$< starpu_lp2paje.1: starpu_lp2paje$(EXEEXT) help2man --no-discard-stderr -N -n "Convert lp StarPU schedule into Paje format" --output=$@ ./$< starpu_workers_activity.1: starpu_workers_activity chmod +x $< help2man --no-discard-stderr -N -n "Display StarPU workers activity" --output=$@ ./$< starpu_codelet_profile.1: starpu_codelet_profile chmod +x $< help2man --no-discard-stderr -N -n "Draw StarPU codelet profile" --output=$@ ./$< starpu_env.1: starpu_env chmod +x $< help2man --no-discard-stderr -N -n "Set StarPU environment variables" --output=$@ ./$< starpu_codelet_histo_profile.1: starpu_codelet_histo_profile chmod +x $< help2man --no-discard-stderr -N -n "Draw StarPU codelet histogram" --output=$@ ./$< starpu_mpi_comm_matrix.1: starpu_mpi_comm_matrix.py chmod +x $< help2man --no-discard-stderr -N -n "Draw StarPU MPI communications matrix" --output=$@ ./$< starpu_paje_draw_histogram.1: starpu_paje_draw_histogram chmod +x $< help2man --no-discard-stderr -N -n "Draw StarPU trace histogram" --output=$@ ./$< starpu_paje_state_stats.1: starpu_paje_state_stats chmod +x $< help2man --no-discard-stderr -N -n "Print statistics from StarPU trace" --output=$@ ./$< if STARPU_USE_FXT starpu_fxt_tool.1: starpu_fxt_tool$(EXEEXT) help2man --no-discard-stderr -N -n "Convert raw StarPU FxT trace to various traces" --output=$@ ./$< starpu_fxt_stats.1: starpu_fxt_stats$(EXEEXT) help2man --no-discard-stderr -N -n "Print statistics from raw StarPU FxT trace" --output=$@ ./$< starpu_fxt_data_trace.1: starpu_fxt_data_trace$(EXEEXT) help2man --no-discard-stderr -N -n "Print data trace from raw StarPU FxT trace" --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_env.1 \ starpu_mpi_comm_matrix.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.3.9+dfsg/tools/Makefile.in000066400000000000000000003314161413463044200171770ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) \ starpu_perfmodel_recdump$(EXEEXT) $(am__EXEEXT_2) TESTS = $(am__EXEEXT_5) noinst_PROGRAMS = $(am__EXEEXT_6) check_PROGRAMS = $(am__EXEEXT_5) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__append_1 = loader @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_USE_FXT_TRUE@am__append_3 = \ @STARPU_USE_FXT_TRUE@ starpu_fxt_tool \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats \ @STARPU_USE_FXT_TRUE@ starpu_fxt_data_trace @STARPU_SIMGRID_TRUE@am__append_4 = \ @STARPU_SIMGRID_TRUE@ starpu_replay @STARPU_LONG_CHECK_TRUE@am__append_5 = \ @STARPU_LONG_CHECK_TRUE@ starpu_calibrate_bus @STARPU_HAVE_WINDOWS_FALSE@am__append_6 = \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_display \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_plot @STARPU_USE_AYUDAME2_TRUE@am__append_7 = \ @STARPU_USE_AYUDAME2_TRUE@ starpu_temanejo2.sh @STARPU_USE_AYUDAME2_TRUE@am__append_8 = \ @STARPU_USE_AYUDAME2_TRUE@ ayudame.cfg @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@am__append_9 = \ @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_10 = starpu_smpi.xslt @STARPU_SIMGRID_TRUE@am__append_11 = starpu_smpirun subdir = tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_dlb_callback_arg.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)/src/common/config-src-build.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/starpurm/include/starpurm_config.h CONFIG_CLEAN_FILES = starpu_env starpu_codelet_profile \ starpu_codelet_histo_profile starpu_mpi_comm_matrix.py \ starpu_workers_activity starpu_paje_draw_histogram \ starpu_paje_state_stats starpu_paje_summary \ starpu_mlr_analysis 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) @STARPU_SIMGRID_TRUE@am__EXEEXT_2 = starpu_replay$(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_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) @STARPU_CROSS_COMPILING_FALSE@@STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_6 = loader$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_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_perfmodel_recdump_SOURCES = starpu_perfmodel_recdump.c starpu_perfmodel_recdump_OBJECTS = starpu_perfmodel_recdump.$(OBJEXT) starpu_perfmodel_recdump_LDADD = $(LDADD) am__starpu_replay_SOURCES_DIST = starpu_replay.c starpu_replay_sched.c @STARPU_SIMGRID_TRUE@am_starpu_replay_OBJECTS = \ @STARPU_SIMGRID_TRUE@ starpu_replay.$(OBJEXT) \ @STARPU_SIMGRID_TRUE@ starpu_replay_sched.$(OBJEXT) starpu_replay_OBJECTS = $(am_starpu_replay_OBJECTS) starpu_replay_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_mpi_comm_matrix.py starpu_paje_draw_histogram \ starpu_paje_draw_histogram.R starpu_paje_summary \ starpu_paje_summary.Rmd starpu_mlr_analysis \ starpu_mlr_analysis.Rmd starpu_paje_state_stats \ starpu_paje_state_stats.R starpu_env \ starpu_trace_state_stats.py 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)/starpurm/include depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/loader-loader.Po \ ./$(DEPDIR)/starpu_calibrate_bus.Po \ ./$(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po \ ./$(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po \ ./$(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po \ ./$(DEPDIR)/starpu_lp2paje.Po \ ./$(DEPDIR)/starpu_machine_display.Po \ ./$(DEPDIR)/starpu_perfmodel_display.Po \ ./$(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po \ ./$(DEPDIR)/starpu_perfmodel_recdump.Po \ ./$(DEPDIR)/starpu_replay.Po \ ./$(DEPDIR)/starpu_replay_sched.Po \ ./$(DEPDIR)/starpu_sched_display.Po \ ./$(DEPDIR)/starpu_tasks_rec_complete.Po 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_perfmodel_recdump.c $(starpu_replay_SOURCES) \ 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_perfmodel_recdump.c $(am__starpu_replay_SOURCES_DIST) \ 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 distdir-am 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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_env.in \ $(srcdir)/starpu_mlr_analysis.in \ $(srcdir)/starpu_mpi_comm_matrix.py.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@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ BLAS_OPENBLAS_CFLAGS = @BLAS_OPENBLAS_CFLAGS@ BLAS_OPENBLAS_LIBS = @BLAS_OPENBLAS_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@ DGELS_LIBS = @DGELS_LIBS@ DLB_CFLAGS = @DLB_CFLAGS@ DLB_LIBS = @DLB_LIBS@ 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@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ 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@ LIBSTARPURM_INTERFACE_AGE = @LIBSTARPURM_INTERFACE_AGE@ LIBSTARPURM_INTERFACE_CURRENT = @LIBSTARPURM_INTERFACE_CURRENT@ LIBSTARPURM_INTERFACE_REVISION = @LIBSTARPURM_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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIEXEC_ARGS = @MPIEXEC_ARGS@ MPIFORT = @MPIFORT@ NM = @NM@ NMAD_CFLAGS = @NMAD_CFLAGS@ NMAD_LIBS = @NMAD_LIBS@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ NVCC_CC = @NVCC_CC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBLAS_CFLAGS = @OPENBLAS_CFLAGS@ OPENBLAS_LIBS = @OPENBLAS_LIBS@ 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_FIND = @PROG_FIND@ PROG_STAT = @PROG_STAT@ RANLIB = @RANLIB@ REALBASH = @REALBASH@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SIMGRID_MC = @SIMGRID_MC@ 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_EXPORTED_LIBS = @STARPU_EXPORTED_LIBS@ STARPU_EXPORT_DYNAMIC = @STARPU_EXPORT_DYNAMIC@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_CXX11 = @STARPU_HAVE_CXX11@ 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_HDF5_LDFLAGS = @STARPU_HDF5_LDFLAGS@ STARPU_LAPACK_LDFLAGS = @STARPU_LAPACK_LDFLAGS@ 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_OPENBLAS = @STARPU_OPENBLAS@ STARPU_OPENBLAS_LDFLAGS = @STARPU_OPENBLAS_LDFLAGS@ 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_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@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ 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@ gitcommand = @gitcommand@ 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@ mpicxx_path = @mpicxx_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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ 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_USE_MPI_MASTER_SLAVE_TRUE@MPI_LAUNCHER = $(MPIEXEC) $(MPIEXEC_ARGS) -np 4 @STARPU_USE_MPI_MASTER_SLAVE_TRUE@MPI_RUN_ARGS = STARPU_WORKERS_NOBIND=1 STARPU_NCPU=4 STARPU_NMPIMSTHREADS=4 V_nvcc_ = $(V_nvcc_$(AM_DEFAULT_VERBOSITY)) V_nvcc_0 = @echo " NVCC " $@; V_nvcc_1 = V_nvcc = $(V_nvcc_$(V)) V_icc_ = $(V_icc_$(AM_DEFAULT_VERBOSITY)) V_icc_0 = @echo " ICC " $@; V_icc_1 = V_icc = $(V_icc_$(V)) @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 @STARPU_SIMGRID_TRUE@STARPU_SIMGRID = 1 @STARPU_QUICK_CHECK_TRUE@STARPU_QUICK_CHECK = 1 @STARPU_LONG_CHECK_TRUE@STARPU_LONG_CHECK = 1 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # Copyright (C) 2013 Joris Pablo # Copyright (C) 2013 Thibaut Lambert # Copyright (C) 2017 Erwan Leria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = 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_mpi_comm_matrix.py starpu_paje_draw_histogram \ starpu_paje_draw_histogram.R starpu_paje_summary \ starpu_paje_summary.Rmd starpu_mlr_analysis \ starpu_mlr_analysis.Rmd starpu_paje_state_stats \ starpu_paje_state_stats.R starpu_env \ starpu_trace_state_stats.py $(am__append_7) $(am__append_11) dist_pkgdata_DATA = gdbinit $(am__append_8) $(am__append_10) pkgdata_perfmodels_sampling_busdir = $(datarootdir)/starpu/perfmodels/sampling/bus pkgdata_perfmodels_sampling_codeletsdir = $(datarootdir)/starpu/perfmodels/sampling/codelets/45 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/hannibal.affinity \ perfmodels/sampling/bus/hannibal.bandwidth \ perfmodels/sampling/bus/hannibal.config \ perfmodels/sampling/bus/hannibal.latency \ perfmodels/sampling/bus/hannibal.platform.xml \ perfmodels/sampling/bus/hannibal.platform.v4.xml \ perfmodels/sampling/bus/hannibal-pitch.affinity \ perfmodels/sampling/bus/hannibal-pitch.bandwidth \ perfmodels/sampling/bus/hannibal-pitch.config \ perfmodels/sampling/bus/hannibal-pitch.latency \ perfmodels/sampling/bus/hannibal-pitch.platform.xml \ perfmodels/sampling/bus/hannibal-pitch.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/45/chol_model_11.attila \ perfmodels/sampling/codelets/45/chol_model_21.attila \ perfmodels/sampling/codelets/45/chol_model_22.attila \ perfmodels/sampling/codelets/45/cl_update.attila \ perfmodels/sampling/codelets/45/save_cl_bottom.attila \ perfmodels/sampling/codelets/45/save_cl_top.attila \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.attila \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.attila \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.attila \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.attila \ perfmodels/sampling/codelets/45/overlap_sleep_1024_24.attila \ \ perfmodels/sampling/codelets/45/chol_model_11.hannibal \ perfmodels/sampling/codelets/45/chol_model_21.hannibal \ perfmodels/sampling/codelets/45/chol_model_22.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.hannibal \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.hannibal \ \ perfmodels/sampling/codelets/45/chol_model_11.hannibal-pitch \ perfmodels/sampling/codelets/45/chol_model_21.hannibal-pitch \ perfmodels/sampling/codelets/45/chol_model_22.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.hannibal-pitch \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.hannibal-pitch \ \ perfmodels/sampling/codelets/45/chol_model_11.idgraf \ perfmodels/sampling/codelets/45/chol_model_21.idgraf \ perfmodels/sampling/codelets/45/chol_model_22.idgraf \ perfmodels/sampling/codelets/45/cl_update.idgraf \ perfmodels/sampling/codelets/45/save_cl_bottom.idgraf \ perfmodels/sampling/codelets/45/save_cl_top.idgraf \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.idgraf \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.idgraf \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.idgraf \ \ perfmodels/sampling/codelets/45/chol_model_11.mirage \ perfmodels/sampling/codelets/45/chol_model_21.mirage \ perfmodels/sampling/codelets/45/chol_model_22.mirage \ perfmodels/sampling/codelets/45/cl_update.mirage \ perfmodels/sampling/codelets/45/save_cl_bottom.mirage \ perfmodels/sampling/codelets/45/save_cl_top.mirage \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.mirage \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.mirage \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.mirage \ perfmodels/sampling/codelets/45/overlap_sleep_1024_24.mirage \ \ perfmodels/sampling/codelets/45/chol_model_11.sirocco \ perfmodels/sampling/codelets/45/chol_model_21.sirocco \ perfmodels/sampling/codelets/45/chol_model_22.sirocco \ perfmodels/sampling/codelets/45/cl_update.sirocco \ perfmodels/sampling/codelets/45/save_cl_bottom.sirocco \ perfmodels/sampling/codelets/45/save_cl_top.sirocco \ perfmodels/sampling/codelets/45/starpu_sgemm_gemm.sirocco \ perfmodels/sampling/codelets/45/starpu_dgemm_gemm.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.sirocco \ perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.sirocco \ perfmodels/sampling/codelets/45/overlap_sleep_1024_24.sirocco EXTRA_DIST = \ dev/checker/rename.sed \ dev/checker/rename.sh \ dev/cppcheck/suppressions.txt \ dev/valgrind/bash.suppr \ dev/valgrind/fxt.suppr \ dev/valgrind/glpk.suppr \ dev/valgrind/hdf5.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/suppressions \ perfmodels/README \ perfmodels/cluster.xml \ perfmodels/hostfile \ perfmodels/sampling/codelets/tmp/mlr_init.out \ 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 figure/* mlr_* ##################################### # What to install and what to check # ##################################### STARPU_TOOLS = $(am__append_3) $(am__append_5) starpu_machine_display \ starpu_sched_display $(am__append_6) @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_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_FALSE@LOADER_BIN2 = $(LOADER_BIN) @STARPU_HAVE_WINDOWS_FALSE@@STARPU_USE_MPI_MASTER_SLAVE_TRUE@LOADER_BIN2 = $(MPI_LAUNCHER) $(LOADER_BIN) @STARPU_HAVE_AM111_FALSE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN2) @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@TESTS_ENVIRONMENT = $(MPI_RUN_ARGS) top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" @STARPU_HAVE_AM111_TRUE@@STARPU_HAVE_WINDOWS_FALSE@LOG_COMPILER = $(LOADER_BIN2) @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_SIMGRID_TRUE@starpu_replay_SOURCES = \ @STARPU_SIMGRID_TRUE@ starpu_replay.c \ @STARPU_SIMGRID_TRUE@ starpu_replay_sched.c 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_env.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_mpi_comm_matrix.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_9) 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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_env: $(top_builddir)/config.status $(srcdir)/starpu_env.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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_mpi_comm_matrix.py: $(top_builddir)/config.status $(srcdir)/starpu_mpi_comm_matrix.py.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_mlr_analysis: $(top_builddir)/config.status $(srcdir)/starpu_mlr_analysis.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 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 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_perfmodel_recdump$(EXEEXT): $(starpu_perfmodel_recdump_OBJECTS) $(starpu_perfmodel_recdump_DEPENDENCIES) $(EXTRA_starpu_perfmodel_recdump_DEPENDENCIES) @rm -f starpu_perfmodel_recdump$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_perfmodel_recdump_OBJECTS) $(starpu_perfmodel_recdump_LDADD) $(LIBS) starpu_replay$(EXEEXT): $(starpu_replay_OBJECTS) $(starpu_replay_DEPENDENCIES) $(EXTRA_starpu_replay_DEPENDENCIES) @rm -f starpu_replay$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_replay_OBJECTS) $(starpu_replay_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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_calibrate_bus.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_lp2paje.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_machine_display.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_display.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_recdump.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_replay.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_replay_sched.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_sched_display.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_tasks_rec_complete.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/starpu_calibrate_bus.Po -rm -f ./$(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po -rm -f ./$(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po -rm -f ./$(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po -rm -f ./$(DEPDIR)/starpu_lp2paje.Po -rm -f ./$(DEPDIR)/starpu_machine_display.Po -rm -f ./$(DEPDIR)/starpu_perfmodel_display.Po -rm -f ./$(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po -rm -f ./$(DEPDIR)/starpu_perfmodel_recdump.Po -rm -f ./$(DEPDIR)/starpu_replay.Po -rm -f ./$(DEPDIR)/starpu_replay_sched.Po -rm -f ./$(DEPDIR)/starpu_sched_display.Po -rm -f ./$(DEPDIR)/starpu_tasks_rec_complete.Po -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 -f ./$(DEPDIR)/loader-loader.Po -rm -f ./$(DEPDIR)/starpu_calibrate_bus.Po -rm -f ./$(DEPDIR)/starpu_fxt_data_trace-starpu_fxt_data_trace.Po -rm -f ./$(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po -rm -f ./$(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po -rm -f ./$(DEPDIR)/starpu_lp2paje.Po -rm -f ./$(DEPDIR)/starpu_machine_display.Po -rm -f ./$(DEPDIR)/starpu_perfmodel_display.Po -rm -f ./$(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po -rm -f ./$(DEPDIR)/starpu_perfmodel_recdump.Po -rm -f ./$(DEPDIR)/starpu_replay.Po -rm -f ./$(DEPDIR)/starpu_replay_sched.Po -rm -f ./$(DEPDIR)/starpu_sched_display.Po -rm -f ./$(DEPDIR)/starpu_tasks_rec_complete.Po -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 \ am--depfiles check check-TESTS check-am clean \ clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libtool clean-local 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-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 showfailed: @! grep "^FAIL " $(TEST_LOGS) /dev/null @! grep -l "ERROR: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: AddressSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: ThreadSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "ERROR: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l "WARNING: LeakSanitizer: " $(TEST_LOGS) /dev/null @! grep -l " runtime error: " $(TEST_LOGS) /dev/null @RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showfailed || RET=1 ; \ done ; \ exit $$RET 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 showsuite: -cat $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: AddressSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: ThreadSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "ERROR: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q "WARNING: LeakSanitizer: " $(TEST_SUITE_LOG) /dev/null @! grep -q " runtime error: " $(TEST_SUITE_LOG) /dev/null RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showsuite || 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_SIMGRID_TRUE@env: @STARPU_SIMGRID_TRUE@ @echo export STARPU_PERF_MODEL_DIR=$(STARPU_PERF_MODEL_DIR) @STARPU_SIMGRID_TRUE@ @echo export STARPU_HOSTNAME=$(STARPU_HOSTNAME) @STARPU_SIMGRID_TRUE@ @echo export MALLOC_PERTURB_=$(MALLOC_PERTURB_) @STARPU_SIMGRID_TRUE@export STARPU_SIMGRID @STARPU_QUICK_CHECK_TRUE@export STARPU_QUICK_CHECK @STARPU_LONG_CHECK_TRUE@export STARPU_LONG_CHECK @STARPU_HAVE_HELP2MAN_TRUE@starpu_calibrate_bus.1: starpu_calibrate_bus$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Force StarPU bus calibration" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_machine_display.1: starpu_machine_display$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Display machine StarPU information" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_perfmodel_display.1: starpu_perfmodel_display$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Display StarPU performance model" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_perfmodel_plot.1: starpu_perfmodel_plot$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Plot StarPU performance model" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_tasks_rec_complete.1: starpu_tasks_rec_complete$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Complete StarPU tasks.rec file" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_lp2paje.1: starpu_lp2paje$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Convert lp StarPU schedule into Paje format" --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 -n "Display StarPU workers activity" --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 -n "Draw StarPU codelet profile" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_env.1: starpu_env @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Set StarPU environment variables" --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 -n "Draw StarPU codelet histogram" --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_mpi_comm_matrix.1: starpu_mpi_comm_matrix.py @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N -n "Draw StarPU MPI communications matrix" --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 -n "Draw StarPU trace histogram" --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 -n "Print statistics from StarPU trace" --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 -n "Convert raw StarPU FxT trace to various traces" --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 -n "Print statistics from raw StarPU FxT trace" --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 -n "Print data trace from raw StarPU FxT trace" --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.3.9+dfsg/tools/ayudame.cfg000066400000000000000000000022321413463044200172270ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # 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.3.9+dfsg/tools/dev/000077500000000000000000000000001413463044200157005ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/dev/checker/000077500000000000000000000000001413463044200173045ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/dev/checker/rename.sed000066400000000000000000000241541413463044200212560ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tools/dev/checker/rename.sh000077500000000000000000000013561413463044200211170ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 |xargs sed -i -f $(dirname $0)/rename.sed starpu-1.3.9+dfsg/tools/dev/cppcheck/000077500000000000000000000000001413463044200174605ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/dev/cppcheck/suppressions.txt000066400000000000000000000062631413463044200230050ustar00rootroot00000000000000// StarPU --- Runtime system for heterogeneous multicore architectures. // // Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria // // StarPU is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. // // StarPU is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU Lesser General Public License in COPYING.LGPL for more details. // knownConditionTrueFalse variableScope ConfigurationNotChecked shadowVar unusedFunction unmatchedSuppression unusedStructMember missingInclude *:starpufft/* *:min-dgels/* *:socl/src/CL/* *:tools/* // TODO. We should cppcheck the code *:sc_hypervisor/* varFuncNullUB:examples/sched_ctx/two_cpu_contexts.c:76 negativeIndex:examples/stencil/stencil-tasks.c constStatement:examples/stencil/* shiftTooManyBitsSigned:examples/pi/SobolQRNG/sobol_gold.c:88 unreadVariable:tests/openmp/* unusedLabel:tests/datawizard/gpu_register.c unusedLabel:tests/datawizard/gpu_ptr_register.c redundantAssignment:tests/datawizard/interfaces/test_interfaces.c:757 redundantAssignment:tests/datawizard/mpi_like_async.c:165 redundantAssignment:tests/datawizard/mpi_like_async.c:211 unusedPrivateFunction:tests/main/combined_workers/bfs/timer.h cstyleCast:tests/main/combined_workers/bfs/bfs.cpp redundantAssignment:tests/main/driver_api/init_run_deinit.c redundantAssignment:tests/main/driver_api/run_driver.c unreadVariable:tests/datawizard/variable_size.c uselessAssignmentPtrArg:mpi/src/starpu_mpi.c:171 unreadVariable:mpi/src/mpi/starpu_mpi_mpi.c:716 unusedVariable:mpi/src/mpi/starpu_mpi_mpi.c:715 unreadVariable:mpi/src/load_balancer/policy/load_heat_propagation.c:578 redundantAssignment:src/core/workers.c invalidPointerCast:src/core/perfmodel/perfmodel_nan.c:74 unreadVariable:src/core/dependencies/tags.c:111 uselessAssignmentPtrArg:src/core/sched_ctx_list.c:144 wrongPrintfScanfArgNum:src/core/simgrid.c:1024 duplicateExpression:src/util/starpu_task_insert.c:52 nullPointerRedundantCheck:src/common/rbtree.c unreadVariable:src/datawizard/interfaces/* unreadVariable:src/drivers/driver_common/driver_common.c:493 clarifyCondition:src/drivers/opencl/driver_opencl.c:945 unreadVariable:src/drivers/opencl/driver_opencl.c:767 redundantAssignment:src/drivers/opencl/driver_opencl.c:831 clarifyCondition:src/drivers/cuda/driver_cuda.c:498 nullPointerRedundantCheck:src/sched_policies/deque_modeling_policy_data_aware.c:207 sizeofDereferencedVoidPointer:src/util/fstarpu.c pointerSize:socl/src/cl_getcontextinfo.c:33 unreadVariable:socl/src/gc.c:193 // the following warnings are weird and not understandable, let's ignore them ignoredReturnValue:socl/src/cl_createkernel.c:170 leakReturnValNotUsed:socl/src/cl_createkernel.c:170 ignoredReturnValue:socl/src/cl_createprogramwithsource.c:136 leakReturnValNotUsed:socl/src/cl_createprogramwithsource.c:136 redundantAssignment:src/sched_policies/component_eager.c:109 nullPointerRedundantCheck:src/datawizard/copy_driver.c:682 starpu-1.3.9+dfsg/tools/dev/lsan/000077500000000000000000000000001413463044200166355ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/dev/lsan/suppressions000066400000000000000000000017261413463044200213430ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # # libc leak:lt__malloc # openmpi leak:ompi_free_list_grow leak:opal_dss_unpack_value leak:opal_dss_copy_value leak:mca_bml_base_btl_array_reserve leak:opal_hash_table_init # hwloc leak:hwloc_topology_load leak:hwloc_topology_set_xml leak:hwloc_components_init leak:hwloc_plugins_init leak:hwloc_plugins_exit starpu-1.3.9+dfsg/tools/dev/tsan/000077500000000000000000000000001413463044200166455ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/dev/tsan/starpu.suppr000066400000000000000000000065561413463044200212720ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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:^prefetch_out_of_memory$ 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$ race:^_starpu_worker_drives_memory$ race:^starpu_memory_get_total$ race:^starpu_unistd_opened_files$ # 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$ race:^lws_select_victim$ race:^select_worker_round_robin$ # 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 # the assert on lock_write_owner to check for recursive write lock is inherently racy, but fine # for the intended purpose race:^_starpu_sched_ctx_lock_write$ race:^_starpu_sched_ctx_lock_read$ # only protected by memory barrier race:^_starpu_keys_initialized$ # disable race detection on cg->ntags, see comment in code race:^_starpu_notify_cg$ # this does not need to be safe race:^evictable$ # don't care about data status query race, this is just a hint race:^starpu_data_query_status$ race:^starpu_data_query_status2$ starpu-1.3.9+dfsg/tools/dev/valgrind/000077500000000000000000000000001413463044200175065ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/dev/valgrind/bash.suppr000066400000000000000000000015071413463044200215210ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2018-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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:Free ... obj:/bin/bash fun:execute_command_internal fun:execute_command fun:reader_loop fun:main } starpu-1.3.9+dfsg/tools/dev/valgrind/fxt.suppr000066400000000000000000000023471413463044200214100ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tools/dev/valgrind/glpk.suppr000066400000000000000000000014161413463044200215400ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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:glp_init_env } starpu-1.3.9+dfsg/tools/dev/valgrind/hdf5.suppr000066400000000000000000000017671413463044200214420ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { thread-specific value Memcheck:Leak match-leak-kinds: reachable ... fun:H5E_get_stack ... } { thread-specific value Memcheck:Leak match-leak-kinds: reachable ... fun:H5TS_cancel_count_inc ... } { thread-specific value Memcheck:Leak match-leak-kinds: reachable ... fun:H5CX_push ... } starpu-1.3.9+dfsg/tools/dev/valgrind/helgrind.sh000077500000000000000000000032461413463044200216460ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) CLIMIT=$(ulimit -c) if [ "$CLIMIT" = unlimited ] then # valgrind cores are often *huge*, 100MB will already be quite big... ulimit -c 100000 fi 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) exec $RUN --keep-debuginfo=yes --num-callers=42 --error-limit=no --gen-suppressions=all $SUPPRESSIONS $* starpu-1.3.9+dfsg/tools/dev/valgrind/hwloc.suppr000066400000000000000000000057071413463044200217260ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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: indirect ... 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 } { Memcheck:Leak fun:malloc ... fun:tls_get_addr_tail ... fun:hwloc_backends_notify_new_object ... } { Memcheck:Leak fun:memalign fun:tls_get_addr_tail ... fun:hwloc_backends_notify_new_object ... } { Memcheck:Leak fun:malloc ... fun:hwloc_topology_set_xml ... } { Memcheck:Leak fun:calloc ... fun:hwloc_topology_set_xml ... } { Memcheck:Leak fun:realloc ... fun:hwloc_topology_set_xml ... } { Memcheck:Leak fun:malloc ... fun:hwloc_topology_load ... } { Memcheck:Leak fun:calloc ... fun:hwloc_topology_load ... } { Memcheck:Leak fun:realloc ... fun:hwloc_topology_load ... } { Memcheck:Leak match-leak-kinds: reachable fun:memalign fun:tls_get_addr_tail obj:/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 fun:clGetPlatformIDs obj:/usr/lib/x86_64-linux-gnu/hwloc/hwloc_opencl.so fun:hwloc_backends_notify_new_object obj:/usr/lib/x86_64-linux-gnu/libhwloc.so.5.7.3 fun:hwloc_insert_pci_device_list obj:/usr/lib/x86_64-linux-gnu/hwloc/hwloc_pci.so 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.3.9+dfsg/tools/dev/valgrind/libc.suppr000066400000000000000000000130341413463044200215130ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 cond oddity Helgrind:Misc ... fun:aio_read ... } { Ignore libc aio-internal races Helgrind:Race ... fun:aio_write ... } { Ignore libc aio-internal cond oddity Helgrind:Misc ... 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 ... } { Ignore libc printf races Helgrind:Race ... fun:__vfprintf_internal ... } { Ignore libc printf races Helgrind:Race ... fun:_IO_file_xsputn ... } { 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 } { 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.26.so } { Memcheck:Value8 obj:/lib/x86_64-linux-gnu/libc-2.28.so ... } { Memcheck:Cond obj:/lib/x86_64-linux-gnu/libc-2.28.so ... } { Memcheck:Cond obj:/lib/x86_64-linux-gnu/libc-2.28.so ... } { Memcheck:Value8 obj:/lib/x86_64-linux-gnu/ld-2.28.so obj:* obj:* obj:* } { Memcheck:Cond obj:/lib/x86_64-linux-gnu/ld-2.28.so obj:* } { Memcheck:Value8 obj:/lib/x86_64-linux-gnu/ld-2.28.so obj:* } { Memcheck:Param openat(filename) obj:/lib/x86_64-linux-gnu/libc-2.28.so obj:* } { Memcheck:Value8 obj:/lib/x86_64-linux-gnu/ld-2.28.so } { Memcheck:Cond obj:/lib/x86_64-linux-gnu/ld-2.28.so } { Memcheck:Param openat(filename) obj:/lib/x86_64-linux-gnu/ld-2.28.so ... } { Memcheck:Cond obj:/lib/x86_64-linux-gnu/libdl-2.28.so } { Memcheck:Param read(count) obj:/lib/x86_64-linux-gnu/libc-2.28.so } { Memcheck:Param read(buf) obj:/lib/x86_64-linux-gnu/libc-2.28.so } { Memcheck:Param lseek(offset) obj:/lib/x86_64-linux-gnu/libc-2.28.so obj:/lib/x86_64-linux-gnu/libc-2.28.so } { Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 obj:* } { Memcheck:Value8 obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 obj:* } { Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 } { Memcheck:Leak match-leak-kinds: reachable fun:malloc ... fun:_dl_close fun:_dl_catch_exception 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) } starpu-1.3.9+dfsg/tools/dev/valgrind/libgomp.suppr000066400000000000000000000020411413463044200222270ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2015-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # { gomp2 Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:gomp_malloc fun:gomp_init_num_threads fun:initialize_env fun:call_init.part.0 fun:call_init fun:_dl_init ... } { 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 ... } starpu-1.3.9+dfsg/tools/dev/valgrind/libnuma.suppr000066400000000000000000000020401413463044200222240ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 ... } { Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0 obj:/usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0 obj:* obj:/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0 obj:* } starpu-1.3.9+dfsg/tools/dev/valgrind/madmpi.suppr000066400000000000000000000027721413463044200220600ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tools/dev/valgrind/opencl.suppr000066400000000000000000000533001413463044200220620ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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 ... } { 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.3.9+dfsg/tools/dev/valgrind/openmp.suppr000066400000000000000000000126041413463044200221020ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2017-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) } { ignore GOMP barrier race Helgrind:Race ... fun:gomp_barrier_wait ... } { ignore GOMP barrier race Helgrind:Race ... fun:gomp_barrier_wait_start ... } { ignore GOMP barrier race Helgrind:Race ... fun:gomp_barrier_wait_end ... } { ignore GOMP barrier race Helgrind:Race ... fun:gomp_barrier_wait_final ... } starpu-1.3.9+dfsg/tools/dev/valgrind/openmpi.suppr000066400000000000000000000276641413463044200222670ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 } { suppr7 Helgrind:Race ... fun:event_base_loop fun:progress_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 } { suppr15 Memcheck:Leak fun:malloc fun:opal_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 } { suppr20 Memcheck:Leak fun:malloc fun:opal_free_list_grow ... fun:PMPI_Isend } { suppr20 Memcheck:Leak fun:malloc fun:ompi_free_list_grow ... fun:PMPI_Barrier } { suppr20 Memcheck:Leak fun:malloc fun:opal_free_list_grow ... fun:PMPI_Barrier } { 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 } # that happens at initialization { Memcheck:Param writev(vector[...]) fun:__writev fun:writev fun:send_msg fun:pmix_ptl_base_send_handler fun:event_persist_closure fun:event_process_active_single_queue fun:event_process_active fun:event_base_loop fun:progress_engine fun:start_thread fun:clone } { Memcheck:Leak match-leak-kinds: definite fun:malloc fun:fetch_nodeinfo fun:hash_fetch fun:_getnb_cbfunc fun:pmix_ptl_base_process_msg fun:event_process_active_single_queue fun:event_process_active fun:event_base_loop fun:progress_engine fun:start_thread fun:clone } { Helgrind:LockOrder ... fun:mca_bml_r2_add_procs ... } starpu-1.3.9+dfsg/tools/dev/valgrind/padico.suppr000066400000000000000000000344351413463044200220510ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 ... } { 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 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.3.9+dfsg/tools/dev/valgrind/pthread.suppr000066400000000000000000000020741413463044200222330ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 ... } { Memcheck:Value8 obj:/lib/x86_64-linux-gnu/libpthread-2.28.so } starpu-1.3.9+dfsg/tools/dev/valgrind/starpu.suppr000066400000000000000000000104201413463044200221140ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2012-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 ... } { don't care about data status query race, this is just a hint Helgrind:Race fun:starpu_data_query_status ... } { don't care about data status query race, this is just a hint Helgrind:Race fun:starpu_data_query_status2 ... } { 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 ... } { locking order. It's not a problem when it's a trylock... but helgrind doesn't handle that :/ https://bugs.kde.org/show_bug.cgi?id=243232 Helgrind:LockOrder fun:mutex_trylock_WRK ... } { locking order. It's not a problem when it's a trylock... but helgrind doesn't handle that :/ https://bugs.kde.org/show_bug.cgi?id=243232 Helgrind:LockOrder fun:pthread_rwlock_trywrlock_WRK ... } { locking order. It's not a problem when it's a trylock... but helgrind doesn't handle that :/ https://bugs.kde.org/show_bug.cgi?id=243232 Helgrind:LockOrder fun:pthread_rwlock_tryrdlock_WRK ... } { mc / handle locking order1 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:try_to_free_mem_chunk ... } { mc / handle locking order1 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:try_to_throw_mem_chunk ... } { mc / handle locking order2 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:try_to_find_reusable_mem_chunk ... } { mc / handle locking order2 Helgrind:LockOrder ... fun:__starpu_spin_lock fun:try_to_find_reusable_mc ... } { 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 ... } starpu-1.3.9+dfsg/tools/dev/valgrind/valgrind.sh000077500000000000000000000032461413463044200216600ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) CLIMIT=$(ulimit -c) if [ "$CLIMIT" = unlimited ] then # valgrind cores are often *huge*, 100MB will already be quite big... ulimit -c 100000 fi 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) exec $RUN --keep-debuginfo=yes --num-callers=42 --error-limit=no --gen-suppressions=all $SUPPRESSIONS $* starpu-1.3.9+dfsg/tools/dev/valgrind/valgrind.suppr000066400000000000000000000016511413463044200224120ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tools/dev/valgrind/valgrind_xml.sh000077500000000000000000000032461413463044200225400ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) CLIMIT=$(ulimit -c) if [ "$CLIMIT" = unlimited ] then # valgrind cores are often *huge*, 100MB will already be quite big... ulimit -c 100000 fi 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) exec $RUN --keep-debuginfo=yes --num-callers=42 --error-limit=no --gen-suppressions=all $SUPPRESSIONS $* starpu-1.3.9+dfsg/tools/gdbinit000066400000000000000000001047641413463044200165010ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 define starpu-print-task set language c set $task = (struct starpu_task *)$arg0 set $job = (struct _starpu_job *)$task->starpu_private set $status=0 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 if $task->cl && $task->cl->name printf "\tcodelet name:\t\t\t<%s>\n", $task->cl->name end printf "\tcallback:\t\t\t<%p>\n", $task->callback_func printf "\tcl_arg:\t\t\t<%p>\n", $task->cl_arg 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" if $task->status == 0 printf "STARPU_TASK_INIT" end if $task->status == 1 printf "STARPU_TASK_BLOCKED" end if $task->status == 2 printf "STARPU_TASK_READY" end if $task->status == 3 printf "STARPU_TASK_RUNNING" end if $task->status == 4 printf "STARPU_TASK_FINISHED" end if $task->status == 5 printf "STARPU_TASK_BLOCKED_ON_TAG" end if $task->status == 6 printf "STARPU_TASK_BLOCKED_ON_TASK" end if $task->status == 7 printf "STARPU_TASK_BLOCKED_ON_DATA" end if $task->status == 8 printf "STARPU_TASK_STOPPED" end printf "\n" printf "\tjob:\t\t\t\t<%p>\n", $job printf "\ttag_id:\t\t\t\t<%d>\n", $task->tag_id printf "\tndeps:\t\t\t\t<%u>\n", $job->job_successors->ndeps printf "\tndeps_remaining:\t\t<%u>\n", $job->job_successors->ndeps - $job->job_successors->ndeps_completed if _starpu_debug set $n = 0 while $n < $job->job_successors->ndeps if ! $job->job_successors->done[$n] set $cg = $job->job_successors->deps[$n] set $m = 0 printf "\t\tcg:\t\t\t<%u>\n", $cg->ndeps while $m < $cg->ndeps if ! $cg->done[$m] set $depj = (struct _starpu_job *) $cg->deps[$m] printf "\t\t\ttask %p\n", $depj->task end set $m = $m + 1 end end set $n = $n + 1 end end 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 job %p task %p\n", $cg->succ.job, $cg->succ.job->task starpu-print-task $cg->succ.job->task end set $i = $i + 1 end 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] printf "[%2d] %-40s %-4d %-4d %-5d %-6d %-8d %-9d %-13d ", $num, $worker->name, $worker->arch, $worker->worker_mask, \ $worker->devid, $worker->bindid, $worker->workerid, $worker->worker_is_running, $worker->worker_is_initialized if $worker->status == STATUS_INVALID printf "INVALID" end if $worker->status == STATUS_UNKNOWN printf "UNKNOWN" end if $worker->status == STATUS_INITIALIZING printf "INITIALIZING" end if $worker->status == STATUS_EXECUTING printf "EXECUTING" end if $worker->status == STATUS_CALLBACK printf "CALLBACK" end if $worker->status == STATUS_SCHEDULING printf "SCHEDULING" end if $worker->status == STATUS_WAITING printf "WAITING" end if $worker->status == STATUS_SLEEPING_SCHEDULING printf "SLEEPING_SCHEDULING" end if $worker->status == STATUS_SLEEPING printf "SLEEPING" end printf "\n" set $num = $num + 1 end end define starpu-print-tag set language c set $tag_struct = (struct _starpu_tag *)_gettag_struct($arg0) printf "tag %d ((struct _starpu_tag *) %p)\n", $arg0, $tag_struct printf "\tstate " if $tag_struct->state == STARPU_INVALID_STATE printf "STARPU_INVALID_STATE" end if $tag_struct->state == STARPU_ASSOCIATED printf "STARPU_ASSOCIATED" end if $tag_struct->state == STARPU_BLOCKED printf "STARPU_BLOCKED" end if $tag_struct->state == STARPU_READY printf "STARPU_READY" end if $tag_struct->state == STARPU_DONE printf "STARPU_DONE" end printf "\n" printf "\tdeps %d\n", $tag_struct->tag_successors.ndeps printf "\tcompleted %d\n", $tag_struct->tag_successors.ndeps_completed printf "\tndeps_remaining:\t\t<%u>\n", $tag_struct->tag_successors->ndeps - $tag_struct->tag_successors->ndeps_completed if _starpu_debug set $n = 0 while $n < $tag_struct->tag_successors->ndeps if ! $tag_struct->tag_successors->done[$n] set $cg = $tag_struct->tag_successors->deps[$n] set $m = 0 printf "\t\tcg:\t\t\t<%u>\n", $cg->ndeps while $m < $cg->ndeps if ! $cg->done[$m] set $dept = (starpu_tag_t) $cg->deps[$m] printf "\t\t\ttag %u\n", $dept end set $m = $m + 1 end end set $n = $n + 1 end end printf "\tndeps_completed:\t\t<%u>\n", $tag_struct->tag_successors->ndeps_completed printf "\tnsuccs:\t\t\t\t<%u>\n", $tag_struct->tag_successors->nsuccs end define starpu-tags set language c printf "tags htbl %p\n", tag_htbl set $tags = tag_htbl while $tags starpu-print-tag $tags->id set $tags = (struct _starpu_tag_table *) $tags.hh.next end 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 set $w = &_starpu_config.workers[$n] printf "worker %d %s:\n", $n, $w->short_name if $w->pipeline_length > 0 set $m = 0 while $m < $w->ntasks set $t = $w->current_tasks[($w->first_task + $m) % (sizeof($w->current_tasks)/sizeof($w->current_tasks[0]))] printf " task %p\n", $t set $m = $m + 1 end end set $task = $w->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 if ! _starpu_debug printf "you need to configure with --enable-debug to get starpu-print-all-tasks working\n" else 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 end define starpu-all-tasks set language c if ! _starpu_debug printf "you need to configure with --enable-debug to get starpu-all-tasks working\n" else 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)) set $task = $j->task if $task->name printf "task %p %s\n", $task, $task->name else printf "task %p\n", $task end set $l = $l->next end 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 "Initialization submitted %d\n", $data->initialized printf "Current mode " starpu-print-mode $data->current_mode printf "\n" if $data->mpi_data printf "TAG %ld\n",((struct _starpu_mpi_data *) ($data->mpi_data))->node_tag.data_tag end 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 if _starpu_debug printf "Requester tasks\n" set $requesterlist = $data->req_list.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.list._head while $requesterlist != 0x0 printf "mode: " starpu-print-mode $requesterlist->mode printf "\n" starpu-print-job $requesterlist->j set $requesterlist = $requesterlist->_next end else printf "Printing requester tasks not supported yet without --enable-debug, sorry!\n" 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-replicate set $repl = (struct _starpu_data_replicate*) $arg0 printf "Handle %p\n", $repl->handle printf "Interface %p\n", $repl->data_interface printf "Refcnt %u\n", $repl->refcnt printf "Node %u\n", $repl->memory_node if $repl->state == 0 printf "Owner\n" end if $repl->state == 1 printf "Shared\n" end if $repl->state == 2 printf "Invalid\n" end if $repl->relaxed_coherency printf " relaxed_coherency" end if $repl->initialized printf " initialized" end if $repl->allocated printf " allocated" end if $repl->automatically_allocated printf " automatically allocated" end printf "\n" printf "MC %p\n", $repl->mc end define starpu-print-request set $r = (struct _starpu_data_request *)$arg0 printf "Request %p\n", $r printf "Origin %s\n", $r->origin printf "Refcnt %d\n", $r->refcnt printf "Handle %p\n", $r->handle printf "src_replicate %p", $r->src_replicate if $r->src_replicate printf " (%d)", $r->src_replicate->memory_node end printf "\n" printf "dst_replicate %p", $r->dst_replicate if $r->dst_replicate printf " (%d)", $r->dst_replicate->memory_node end printf "\n" 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 set $c = 0 while $c < $r->next_req_count printf " %p\n", $r->next_req[$c] set $c = $c + 1 end 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-treelist set $list = $arg0 set $request = $list->_head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end end define starpu-print-requests-tree if $arg0 starpu-print-requests-tree $arg0->children[0] set $stage = (struct _starpu_data_request_prio_list_stage *) $arg0 starpu-print-requests-treelist (&($stage->list)) starpu-print-requests-tree $arg0->children[1] end end define starpu-print-requests-list if _starpu_debug starpu-print-requests-treelist &$arg0.list else starpu-print-requests-tree $arg0.tree.root end end define starpu-print-requests set $node = 0 while $node < _starpu_descr.nnodes printf "Node %u:\n", $node starpu-print-requests-list data_requests[$node] 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] starpu-print-requests-list data_requests_pending[$node] 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 starpu-print-requests-list prefetch_requests[$node] set $node = $node + 1 end end define starpu-print-irequests set $node = 0 while $node < _starpu_descr.nnodes printf "Node %u:\n", $node starpu-print-requests-list idle_requests[$node] 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 (%d/MiB/%dMiB):\n", $node, used_size[$node] >> 20, global_size[$node] >> 20 set $total = 0 set $total_b = 0 set $wt = 0 set $wt_b = 0 set $home = 0 set $home_b = 0 set $ooc = 0 set $ooc_b = 0 set $diduse = 0 set $diduse_b = 0 set $redux = 0 set $redux_b = 0 set $relax = 0 set $relax_b = 0 set $noref = 0 set $noref_b = 0 set $normal = 0 set $normal_b = 0 set $owner = 0 set $owner_b = 0 set $shared = 0 set $shared_b = 0 set $invalid = 0 set $invalid_b = 0 set $nodataref = 0 set $nodataref_b = 0 set $nosubdataref = 0 set $nosubdataref_b = 0 set $reading = 0 set $reading_b = 0 set $writing = 0 set $writing_b = 0 set $overwriting = 0 set $overwriting_b = 0 set $mc = mc_list[$node]->_head set pagination off while $mc != 0 set $handle = $mc->data set $size = _starpu_data_get_size($handle) set $total = $total + 1 if $total % 100 == 0 printf "\rinspected %d data...", $total end set $total_b = $total_b + $size if $node < sizeof($handle->wt_mask) * 8 && $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 $handle->ooc set $ooc = $ooc + 1 set $ooc_b = $ooc_b + $size end if $mc->diduse set $diduse = $diduse + 1 set $diduse_b = $diduse_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 set $normal = $normal + 1 set $normal_b = $normal_b + $size if $handle->per_node[$node].state == STARPU_OWNER set $owner = $owner + 1 set $owner_b = $owner_b + $size end if $handle->per_node[$node].state == STARPU_SHARED set $shared = $shared + 1 set $shared_b = $shared_b + $size end if $handle->per_node[$node].state == STARPU_INVALID set $invalid = $invalid + 1 set $invalid_b = $invalid_b + $size end 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 else set $r = 0 set $w = 0 set $_node = 0 while $_node < _starpu_descr.nnodes set $_node = $_node + 1 if $_node != $node if $handle->per_node[$_node].request[$node] != 0 set $r = $r + 1 end if $handle->per_node[$node].request[$_node] != 0 set $w = $w + 1 end end end if $r != 0 set $reading = $reading + 1 set $reading_b = $reading_b + $size end if $w != 0 set $writing = $writing + 1 set $writing_b = $writing_b + $size end if $handle->per_node[$node].request[$node] != 0 set $overwriting = $overwriting + 1 set $overwriting_b = $overwriting_b + $size end end end set $mc = $mc->_next end set pagination on printf "\r \r" 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 " OOC: %u, %uMiB\n", $ooc, $ooc_b / 1048576 printf " diduse: %u, %uMiB\n", $diduse, $diduse_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 " normal: %u, %uMiB\n", $normal, $normal_b / 1048576 printf " owner: %u, %uMiB\n", $owner, $owner_b / 1048576 printf " shared: %u, %uMiB\n", $shared, $shared_b / 1048576 printf " invalid: %u, %uMiB\n", $invalid, $invalid_b / 1048576 printf " nosubdataref: %u, %uMiB\n", $nosubdataref, $nosubdataref_b / 1048576 printf " nodataref: %u, %uMiB\n", $nodataref, $nodataref_b / 1048576 printf " reading: %u, %uMiB\n", $reading, $reading_b / 1048576 printf " writing: %u, %uMiB\n", $writing, $writing_b / 1048576 printf " overwriting: %u, %uMiB\n", $overwriting, $overwriting_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-sched-data print _starpu_config.sched_ctxs[$arg0]->policy_data end define starpu-print-spaces set $j = 0 while $j < $arg0 printf " " set $j = $j + 1 end end define starpu-sched-print-component set $c = (struct starpu_sched_component *) $arg1 starpu-print-spaces $arg0 printf "%s %c %c (struct starpu_sched_component *) %p\n", $c->name, $c->properties & STARPU_SCHED_COMPONENT_HOMOGENEOUS ? 'o':'e', $c->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE ? 's' : 'm', $c if $c->push_task == fifo_push_task set $f = &((struct _starpu_fifo_data *) $c->data)->fifo starpu-print-spaces $arg0 printf "%d tasks start %f len %f end %f processed %d\n", $f->ntasks, $f->exp_start, $f->exp_len, $f->exp_end, $f->nprocessed end if $c->push_task == prio_push_task set $q = &((struct _starpu_prio_data *) $c->data)->prio starpu-print-spaces $arg0 printf "%d tasks start %f len %f end %f processed %d\n", $q->ntasks, $q->exp_start, $q->exp_len, $q->exp_end, $q->nprocessed end if $c->push_task == simple_worker_push_task set $d = (struct _starpu_worker_component_data *) $c->data set $l = $d->list starpu-print-spaces $arg0 printf "%d tasks pipeline %f start %f len %f end %f\n", $l->ntasks, $l->pipeline_len, $l->exp_start, $l->exp_len, $l->exp_end end end define starpu-sched-print-recur-component starpu-sched-print-component $arg0 $arg1 set $i[$arg0] = 0 while $i[$arg0] < $arg1->nchildren starpu-sched-print-recur-component ($arg0+1) $arg1->children[$i[$arg0]] set $i[$arg0] = $i[$arg0] + 1 end end define starpu-sched-print-modular set $t = (struct starpu_sched_tree *) _starpu_config.sched_ctxs[$arg0]->policy_data set $i = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 } starpu-sched-print-recur-component 0 $t->root end define starpu-mpi-print-request set $request = (struct _starpu_mpi_req *)$arg0 printf "Request (struct _starpu_mpi_req *) %p data %p tag %ld to MPI node %d type ", $request, $request->data_handle, $request->data_handle && $request->data_handle->mpi_data ? ((struct _starpu_mpi_data *) ($request->data_handle->mpi_data))->node_tag.data_tag : -1, $request->node_tag.node.rank, if $request->request_type == SEND_REQ printf "SEND_REQ" end if $request->request_type == RECV_REQ printf "RECV_REQ" end if $request->request_type == WAIT_REQ printf "WAIT_REQ" end if $request->request_type == TEST_REQ printf "TEST_REQ" end if $request->request_type == BARRIER_REQ printf "BARRIER_REQ" end if $request->request_type == PROBE_REQ printf "PROBE_REQ" end if $request->request_type == UNKNOWN_REQ printf "UNKNOWN_REQ" end printf " submitted %d completed %d posted %d detached %d\n", $request->submitted, $request->completed, $request->posted, $request->detached end define starpu-mpi-print-ready-recv-requests set $list = (struct _starpu_mpi_req_list) ready_recv_requests if $list set $request = $list.list._head while $request starpu-mpi-print-request $request set $request = $request->_next end else printf "No ready recv requests\n" end end define starpu-mpi-print-requests-list set $list = $arg0 set $request = $list._head while $request starpu-mpi-print-request $request set $request = $request->_next end end define starpu-mpi-print-requests-tree if $arg0 starpu-mpi-print-requests-tree $arg0->children[0] set $stage = (struct _starpu_mpi_req_prio_list_stage *) $arg0 starpu-mpi-print-requests-list (&($stage->list)) starpu-mpi-print-requests-tree $arg0->children[1] end end define starpu-mpi-print-ready-send-requests set $prio_list = (struct _starpu_mpi_req_prio_list) ready_send_requests if _starpu_debug if $prio_list starpu-mpi-print-requests-list $prio_list.list else printf "No ready send requests\n" end else if $prio_list.empty == 0 starpu-mpi-print-requests-tree $prio_list.tree.root else printf "No ready send requests\n" end 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-replicate prints a StarPU data replicate 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-print-tag prints a given tag 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-sched-data prints the data of the given scheduler starpu-sched-print-modular prints the hierarchy of modular scheduling components starpu-mpi-print-ready-recv-requests prints all MPI ready recv requests starpu-mpi-print-ready-send-requests prints all MPI ready send 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.3.9+dfsg/tools/msvc/000077500000000000000000000000001413463044200160725ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/msvc/starpu.sln000077500000000000000000000015721413463044200201360ustar00rootroot00000000000000 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.3.9+dfsg/tools/msvc/starpu/000077500000000000000000000000001413463044200174105ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/msvc/starpu/starpu.vcxproj000077500000000000000000000102551413463044200223510ustar00rootroot00000000000000 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.3;%(AdditionalIncludeDirectories) Console true $(STARPU_PATH)\lib;%(AdditionalLibraryDirectories) libstarpu-1.3.lib;%(AdditionalDependencies) Level3 Use MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) Console true true true starpu-1.3.9+dfsg/tools/msvc/starpu_clean.bat000066400000000000000000000016121413463044200212420ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria 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. REM 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.3.9+dfsg/tools/msvc/starpu_exec.bat000066400000000000000000000025251413463044200211100ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria 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. REM 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\2019\Community\VC\Auxiliary\Build\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.3.9+dfsg/tools/msvc/starpu_open.bat000066400000000000000000000027661413463044200211340ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria 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. REM 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.3.9+dfsg/tools/msvc/starpu_var.bat000066400000000000000000000023401413463044200207470ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria 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. REM 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.3 /I%HWLOC%\include set STARPU_LDFLAGS=/link %STARPU_PATH%\lib\libstarpu-1.3.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.3.9+dfsg/tools/msvc/starpu_var.bat.in000066400000000000000000000024441413463044200213610ustar00rootroot00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria 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. REM 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@ /I%HWLOC%\include 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.3.9+dfsg/tools/perfmodels/000077500000000000000000000000001413463044200172625ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/README000066400000000000000000000032711413463044200201450ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tools/perfmodels/cluster.xml000066400000000000000000000005671413463044200214750ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/hostfile000066400000000000000000000001441413463044200210210ustar00rootroot00000000000000mirage01.plafrim.cluster mirage02.plafrim.cluster mirage03.plafrim.cluster mirage04.plafrim.cluster starpu-1.3.9+dfsg/tools/perfmodels/sampling/000077500000000000000000000000001413463044200210745ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/000077500000000000000000000000001413463044200216655ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/attila.affinity000066400000000000000000000003631413463044200247000ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/attila.bandwidth000066400000000000000000000111141413463044200250270ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/attila.config000066400000000000000000000001761413463044200243360ustar00rootroot00000000000000# Current configuration 12 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/attila.latency000066400000000000000000000107641413463044200245340ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/attila.platform.v4.xml000066400000000000000000000262371413463044200260520ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/attila.platform.xml000066400000000000000000000257401413463044200255200ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal-pitch.affinity000066400000000000000000000002411413463044200262760ustar00rootroot00000000000000# GPU CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 0 0 1 2 3 4 5 6 7 1 4 5 6 7 0 1 2 3 2 4 5 6 7 0 1 2 3 0 0 1 2 3 4 5 6 7 1 4 5 6 7 0 1 2 3 2 4 5 6 7 0 1 2 3 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal-pitch.bandwidth000066400000000000000000000027341413463044200264420ustar00rootroot00000000000000# 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 5988.779905 3149.675860 5988.971975 3975.378655 2636.838726 3992.447567 nan nan nan nan nan nan nan nan nan 3599.738919 0.000000 1679.850942 2248.345554 1889.122528 1521.977521 1892.968372 nan nan nan nan nan nan nan nan nan 3352.127736 2149.165370 0.000000 2149.190105 1818.623736 1475.884075 1822.187624 nan nan nan nan nan nan nan nan nan 3554.530216 2230.599117 1669.939421 0.000000 1876.596887 1513.836926 1880.391850 nan nan nan nan nan nan nan nan nan 2937.163572 1970.662958 1519.854976 1970.683755 0.000000 1389.455231 1692.226493 nan nan nan nan nan nan nan nan nan 2610.203571 1817.881699 1427.338068 1817.899396 1575.646193 0.000000 1578.320689 nan nan nan nan nan nan nan nan nan 2812.550617 1913.772761 1485.791058 1913.792375 1647.181820 1360.930908 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 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal-pitch.config000066400000000000000000000001431413463044200257330ustar00rootroot00000000000000# Current configuration 8 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal-pitch.latency000066400000000000000000000026101413463044200261260ustar00rootroot00000000000000# 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 12.460938 12.570312 12.468750 20.000000 20.328125 19.593750 nan nan nan nan nan nan nan nan nan 12.476562 0.000000 25.046875 24.945312 32.476562 32.804688 32.070312 nan nan nan nan nan nan nan nan nan 12.593750 25.054688 0.000000 25.062500 32.593750 32.921875 32.187500 nan nan nan nan nan nan nan nan nan 12.539062 25.000000 25.109375 0.000000 32.539062 32.867188 32.132812 nan nan nan nan nan nan nan nan nan 63.601562 76.062500 76.171875 76.070312 0.000000 83.929688 83.195312 nan nan nan nan nan nan nan nan nan 35.992188 48.453125 48.562500 48.460938 55.992188 0.000000 55.585938 nan nan nan nan nan nan nan nan nan 36.765625 49.226562 49.335938 49.234375 56.765625 57.093750 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 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal-pitch.platform.v4.xml000066400000000000000000000075051413463044200274520ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal-pitch.platform.xml000066400000000000000000000073741413463044200271260ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal.affinity000066400000000000000000000002411413463044200251710ustar00rootroot00000000000000# GPU CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 0 0 1 2 3 4 5 6 7 1 4 5 6 7 0 1 2 3 2 4 5 6 7 0 1 2 3 0 0 1 2 3 4 5 6 7 1 4 5 6 7 0 1 2 3 2 4 5 6 7 0 1 2 3 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal.bandwidth000066400000000000000000000027341413463044200253350ustar00rootroot00000000000000# 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 5988.779905 3149.675860 5988.971975 3975.378655 2636.838726 3992.447567 nan nan nan nan nan nan nan nan nan 3599.738919 0.000000 1679.850942 2248.345554 1889.122528 1521.977521 1892.968372 nan nan nan nan nan nan nan nan nan 3352.127736 2149.165370 0.000000 2149.190105 1818.623736 1475.884075 1822.187624 nan nan nan nan nan nan nan nan nan 3554.530216 2230.599117 1669.939421 0.000000 1876.596887 1513.836926 1880.391850 nan nan nan nan nan nan nan nan nan 2937.163572 1970.662958 1519.854976 1970.683755 0.000000 1389.455231 1692.226493 nan nan nan nan nan nan nan nan nan 2610.203571 1817.881699 1427.338068 1817.899396 1575.646193 0.000000 1578.320689 nan nan nan nan nan nan nan nan nan 2812.550617 1913.772761 1485.791058 1913.792375 1647.181820 1360.930908 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 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal.config000066400000000000000000000001431413463044200246260ustar00rootroot00000000000000# Current configuration 8 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal.latency000066400000000000000000000026101413463044200250210ustar00rootroot00000000000000# 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 12.460938 12.570312 12.468750 20.000000 20.328125 19.593750 nan nan nan nan nan nan nan nan nan 12.476562 0.000000 25.046875 24.945312 32.476562 32.804688 32.070312 nan nan nan nan nan nan nan nan nan 12.593750 25.054688 0.000000 25.062500 32.593750 32.921875 32.187500 nan nan nan nan nan nan nan nan nan 12.539062 25.000000 25.109375 0.000000 32.539062 32.867188 32.132812 nan nan nan nan nan nan nan nan nan 63.601562 76.062500 76.171875 76.070312 0.000000 83.929688 83.195312 nan nan nan nan nan nan nan nan nan 35.992188 48.453125 48.562500 48.460938 55.992188 0.000000 55.585938 nan nan nan nan nan nan nan nan nan 36.765625 49.226562 49.335938 49.234375 56.765625 57.093750 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 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal.platform.v4.xml000066400000000000000000000075111413463044200263420ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/hannibal.platform.xml000066400000000000000000000073751413463044200260220ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/idgraf.affinity000066400000000000000000000004551413463044200246600ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/idgraf.bandwidth000066400000000000000000000033261413463044200250130ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/idgraf.config000066400000000000000000000001761413463044200243140ustar00rootroot00000000000000# Current configuration 12 # Number of CPUs 8 # Number of CUDA devices 0 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/idgraf.latency000066400000000000000000000031061413463044200245020ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/idgraf.platform.v4.xml000066400000000000000000002035351413463044200260260ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/idgraf.platform.xml000066400000000000000000002024601413463044200254720ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/mirage.affinity000066400000000000000000000003631413463044200246660ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/mirage.bandwidth000066400000000000000000000111141413463044200250150ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/mirage.config000066400000000000000000000001761413463044200243240ustar00rootroot00000000000000# Current configuration 12 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/mirage.latency000066400000000000000000000107651413463044200245230ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/mirage.platform.v4.xml000066400000000000000000000262371413463044200260400ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/mirage.platform.xml000066400000000000000000000257401413463044200255060ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/sirocco.affinity000066400000000000000000000012251413463044200250610ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/sirocco.bandwidth000066400000000000000000000035021413463044200252140ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/sirocco.config000066400000000000000000000001761413463044200245210ustar00rootroot00000000000000# Current configuration 24 # Number of CPUs 4 # Number of CUDA devices 4 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/sirocco.latency000066400000000000000000000035021413463044200247070ustar00rootroot00000000000000# 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.3.9+dfsg/tools/perfmodels/sampling/bus/sirocco.platform.v4.xml000066400000000000000000000201211413463044200262170ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/bus/sirocco.platform.xml000066400000000000000000000176601413463044200257050ustar00rootroot00000000000000 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/000077500000000000000000000000001413463044200226765ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/000077500000000000000000000000001413463044200231265ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_11.attila000066400000000000000000000100121413463044200267260ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_11.hannibal000066400000000000000000000040231413463044200272310ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 1.701016e+05 7.229737e+03 4.082438e+06 6.956835e+11 24 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 1.188776e+05 9.331204e+02 2.113643e+08 2.512803e+13 1778 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 1.205438e+05 2.044578e+03 2.189075e+08 2.639552e+13 1816 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_11.hannibal-pitch000066400000000000000000000040231413463044200303360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 1.701016e+05 7.229737e+03 4.082438e+06 6.956835e+11 24 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 1.188776e+05 9.331204e+02 2.113643e+08 2.512803e+13 1778 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 1.205438e+05 2.044578e+03 2.189075e+08 2.639552e+13 1816 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_11.idgraf000066400000000000000000000216221413463044200267150ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_11.mirage000066400000000000000000000100131413463044200267150ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_11.sirocco000066400000000000000000000130171413463044200271210ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_21.attila000066400000000000000000000100261413463044200267340ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_21.hannibal000066400000000000000000000040171413463044200272350ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 1.551780e+04 9.258624e+03 5.415867e+08 1.139602e+13 34901 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 1.787309e+04 1.121893e+04 5.782658e+08 1.440761e+13 32354 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 1.675795e+04 1.012077e+04 5.931309e+08 1.356507e+13 35394 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_21.hannibal-pitch000066400000000000000000000040171413463044200303420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 1.551780e+04 9.258624e+03 5.415867e+08 1.139602e+13 34901 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 1.787309e+04 1.121893e+04 5.782658e+08 1.440761e+13 32354 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 1.675795e+04 1.012077e+04 5.931309e+08 1.356507e+13 35394 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_21.idgraf000066400000000000000000000216531413463044200267220ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_21.mirage000066400000000000000000000100301413463044200267150ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_21.sirocco000066400000000000000000000130441413463044200271220ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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 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_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_22.attila000066400000000000000000000100421413463044200267330ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_22.hannibal000066400000000000000000000040251413463044200272350ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 5.763709e+03 3.768350e+03 4.501024e+09 3.703209e+13 780925 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 5.889910e+03 4.485232e+03 4.352661e+09 4.050353e+13 739003 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 5.782569e+03 3.939612e+03 4.412291e+09 3.735706e+13 763033 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_22.hannibal-pitch000066400000000000000000000040251413463044200303420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 5.763709e+03 3.768350e+03 4.501024e+09 3.703209e+13 780925 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 5.889910e+03 4.485232e+03 4.352661e+09 4.050353e+13 739003 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 5.782569e+03 3.939612e+03 4.412291e+09 3.735706e+13 763033 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_22.idgraf000066400000000000000000000217051413463044200267210ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_22.mirage000066400000000000000000000100451413463044200267240ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/chol_model_22.sirocco000066400000000000000000000130761413463044200271300ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/cl_update.attila000066400000000000000000000100241413463044200262630ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/cl_update.idgraf000066400000000000000000000216551413463044200262550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/cl_update.mirage000066400000000000000000000100311413463044200262470ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/cl_update.sirocco000066400000000000000000000120161413463044200264510ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/overlap_sleep_1024_24.attila000066400000000000000000000063371413463044200301520ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/overlap_sleep_1024_24.mirage000066400000000000000000000063371413463044200301400ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/overlap_sleep_1024_24.sirocco000066400000000000000000000077731413463044200303420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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, 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_bottom.attila000066400000000000000000000100161413463044200273240ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_bottom.idgraf000066400000000000000000000216551413463044200273150ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_bottom.mirage000066400000000000000000000100171413463044200273130ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_bottom.sirocco000066400000000000000000000120031413463044200275050ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_top.attila000066400000000000000000000100231413463044200266200ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_top.idgraf000066400000000000000000000216551413463044200266130ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_top.mirage000066400000000000000000000100261413463044200266110ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/save_cl_top.sirocco000066400000000000000000000120031413463044200270030ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dgemm_gemm.attila000066400000000000000000000100221413463044200300150ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dgemm_gemm.idgraf000066400000000000000000000216221413463044200300030ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dgemm_gemm.mirage000066400000000000000000000100231413463044200300040ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dgemm_gemm.sirocco000066400000000000000000000130371413463044200302110ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.attila000066400000000000000000000100121413463044200306630ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.idgraf000066400000000000000000000216221413463044200306520ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.mirage000066400000000000000000000100121413463044200306510ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11.sirocco000066400000000000000000000130161413463044200310550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.attila000066400000000000000000000100121413463044200320470ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.idgraf000066400000000000000000000216221413463044200320360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.mirage000066400000000000000000000100121413463044200320350ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_atlas.sirocco000066400000000000000000000130161413463044200322410ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.attila000066400000000000000000000100121413463044200317130ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.idgraf000066400000000000000000000216221413463044200317020ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.mirage000066400000000000000000000100121413463044200317010ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_goto.sirocco000066400000000000000000000130161413463044200321050ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.attila000066400000000000000000000100121413463044200325460ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.idgraf000066400000000000000000000216221413463044200325350ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.mirage000066400000000000000000000100121413463044200325340ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_11_openblas.sirocco000066400000000000000000000130161413463044200327400ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.attila000066400000000000000000000100271413463044200306720ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.idgraf000066400000000000000000000216371413463044200306610ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.mirage000066400000000000000000000100261413463044200306570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12.sirocco000066400000000000000000000130401413463044200310530ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.attila000066400000000000000000000100271413463044200320560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.idgraf000066400000000000000000000216371413463044200320450ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.mirage000066400000000000000000000100261413463044200320430ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_atlas.sirocco000066400000000000000000000130401413463044200322370ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.attila000066400000000000000000000100271413463044200317220ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.idgraf000066400000000000000000000216371413463044200317110ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.mirage000066400000000000000000000100261413463044200317070ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_goto.sirocco000066400000000000000000000130401413463044200321030ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.attila000066400000000000000000000100271413463044200325550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.idgraf000066400000000000000000000216371413463044200325440ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.mirage000066400000000000000000000100261413463044200325420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_12_openblas.sirocco000066400000000000000000000130401413463044200327360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.attila000066400000000000000000000100271413463044200306720ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.idgraf000066400000000000000000000216351413463044200306570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.mirage000066400000000000000000000100261413463044200306570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21.sirocco000066400000000000000000000130351413463044200310570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.attila000066400000000000000000000100271413463044200320560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.idgraf000066400000000000000000000216351413463044200320430ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.mirage000066400000000000000000000100261413463044200320430ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_atlas.sirocco000066400000000000000000000130351413463044200322430ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.attila000066400000000000000000000100271413463044200317220ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.idgraf000066400000000000000000000216351413463044200317070ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.mirage000066400000000000000000000100261413463044200317070ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_goto.sirocco000066400000000000000000000130351413463044200321070ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.attila000066400000000000000000000100271413463044200325550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.idgraf000066400000000000000000000216351413463044200325420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.mirage000066400000000000000000000100261413463044200325420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_21_openblas.sirocco000066400000000000000000000130351413463044200327420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.attila000066400000000000000000000100431413463044200306710ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.idgraf000066400000000000000000000217051413463044200306560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.mirage000066400000000000000000000100421413463044200306560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22.sirocco000066400000000000000000000130661413463044200310640ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.attila000066400000000000000000000100431413463044200320550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.idgraf000066400000000000000000000217051413463044200320420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.mirage000066400000000000000000000100421413463044200320420ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_atlas.sirocco000066400000000000000000000130661413463044200322500ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.attila000066400000000000000000000100431413463044200317210ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.idgraf000066400000000000000000000217051413463044200317060ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.mirage000066400000000000000000000100421413463044200317060ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_goto.sirocco000066400000000000000000000130661413463044200321140ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.attila000066400000000000000000000100431413463044200325540ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.idgraf000066400000000000000000000217051413463044200325410ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.mirage000066400000000000000000000100421413463044200325410ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_dlu_lu_model_22_openblas.sirocco000066400000000000000000000130661413463044200327470ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_0 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_sgemm_gemm.attila000066400000000000000000000100241413463044200300360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_sgemm_gemm.idgraf000066400000000000000000000216221413463044200300220ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_sgemm_gemm.mirage000066400000000000000000000100241413463044200300240ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_sgemm_gemm.sirocco000066400000000000000000000130411413463044200302230ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.attila000066400000000000000000000100121413463044200307020ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.hannibal000066400000000000000000000040101413463044200312010ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.hannibal-pitch000066400000000000000000000040101413463044200323060ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.idgraf000066400000000000000000000216221413463044200306710ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.mirage000066400000000000000000000100121413463044200306700ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11.sirocco000066400000000000000000000130161413463044200310740ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.attila000066400000000000000000000100121413463044200320660ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.hannibal000066400000000000000000000040101413463044200323650ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.hannibal-pitch000066400000000000000000000040101413463044200334720ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.idgraf000066400000000000000000000216221413463044200320550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.mirage000066400000000000000000000100121413463044200320540ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_atlas.sirocco000066400000000000000000000130161413463044200322600ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.attila000066400000000000000000000100121413463044200317320ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.hannibal000066400000000000000000000040101413463044200322310ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.hannibal-pitch000066400000000000000000000040101413463044200333360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.idgraf000066400000000000000000000216221413463044200317210ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.mirage000066400000000000000000000100121413463044200317200ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_goto.sirocco000066400000000000000000000130161413463044200321240ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.attila000066400000000000000000000100121413463044200325650ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.hannibal000066400000000000000000000040101413463044200330640ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu_slu_lu_model_11_openblas.hannibal-pitch000066400000000000000000000040101413463044200341120ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 1.250229e+05 4.416720e+03 1.500275e+06 1.878028e+11 12 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.424585e+04 1.140908e+03 4.802014e+07 4.046239e+12 570 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 0.000000e+00 8.331807e+04 6.460292e+02 5.782274e+07 4.817969e+12 694 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.idgraf000066400000000000000000000216221413463044200325540ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.mirage000066400000000000000000000100121413463044200325530ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_11_openblas.sirocco000066400000000000000000000130161413463044200327570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.attila000066400000000000000000000100221413463044200307040ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.hannibal000066400000000000000000000040141413463044200312060ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.hannibal-pitch000066400000000000000000000040141413463044200323130ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.idgraf000066400000000000000000000216361413463044200306770ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.mirage000066400000000000000000000100261413463044200306760ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12.sirocco000066400000000000000000000130411413463044200310730ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.attila000066400000000000000000000100221413463044200320700ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.hannibal000066400000000000000000000040141413463044200323720ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.hannibal-pitch000066400000000000000000000040141413463044200334770ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.idgraf000066400000000000000000000216361413463044200320630ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.mirage000066400000000000000000000100261413463044200320620ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_atlas.sirocco000066400000000000000000000130411413463044200322570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.attila000066400000000000000000000100221413463044200317340ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.hannibal000066400000000000000000000040141413463044200322360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.hannibal-pitch000066400000000000000000000040141413463044200333430ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.idgraf000066400000000000000000000216361413463044200317270ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.mirage000066400000000000000000000100261413463044200317260ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_goto.sirocco000066400000000000000000000130411413463044200321230ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.attila000066400000000000000000000100221413463044200325670ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.hannibal000066400000000000000000000040141413463044200330710ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu_slu_lu_model_12_openblas.hannibal-pitch000066400000000000000000000040141413463044200341170ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.072902e+04 3.731292e+03 7.780684e+07 9.357572e+11 7252 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.250147e+04 5.489974e+03 7.944684e+07 1.184741e+12 6355 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.131230e+04 4.120480e+03 8.165221e+07 1.046224e+12 7218 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.idgraf000066400000000000000000000216361413463044200325620ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.mirage000066400000000000000000000100261413463044200325610ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_12_openblas.sirocco000066400000000000000000000130411413463044200327560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.attila000066400000000000000000000100221413463044200307040ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.hannibal000066400000000000000000000040141413463044200312060ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.hannibal-pitch000066400000000000000000000040141413463044200323130ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.idgraf000066400000000000000000000216401413463044200306720ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.mirage000066400000000000000000000100231413463044200306730ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21.sirocco000066400000000000000000000130371413463044200311000ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.attila000066400000000000000000000100221413463044200320700ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.hannibal000066400000000000000000000040141413463044200323720ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.hannibal-pitch000066400000000000000000000040141413463044200334770ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.idgraf000066400000000000000000000216401413463044200320560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.mirage000066400000000000000000000100231413463044200320570ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_atlas.sirocco000066400000000000000000000130371413463044200322640ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.attila000066400000000000000000000100221413463044200317340ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.hannibal000066400000000000000000000040141413463044200322360ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.hannibal-pitch000066400000000000000000000040141413463044200333430ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.idgraf000066400000000000000000000216401413463044200317220ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.mirage000066400000000000000000000100231413463044200317230ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_goto.sirocco000066400000000000000000000130371413463044200321300ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.attila000066400000000000000000000100221413463044200325670ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.hannibal000066400000000000000000000040141413463044200330710ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu_slu_lu_model_21_openblas.hannibal-pitch000066400000000000000000000040141413463044200341170ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.103789e+04 3.664518e+03 7.889881e+07 9.668643e+11 7148 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.284524e+04 5.462619e+03 8.441889e+07 1.280490e+12 6572 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 0.000000e+00 1.171798e+04 4.121992e+03 8.325626e+07 1.096315e+12 7105 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.idgraf000066400000000000000000000216401413463044200325550ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.mirage000066400000000000000000000100231413463044200325560ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_21_openblas.sirocco000066400000000000000000000130371413463044200327630ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.attila000066400000000000000000000100431413463044200307100ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.hannibal000066400000000000000000000040251413463044200312110ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.hannibal-pitch000066400000000000000000000040251413463044200323160ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.idgraf000066400000000000000000000217061413463044200306760ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.mirage000066400000000000000000000100421413463044200306750ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22.sirocco000066400000000000000000000130661413463044200311030ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.attila000066400000000000000000000100431413463044200320740ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.hannibal000066400000000000000000000040251413463044200323750ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.hannibal-pitch000066400000000000000000000040251413463044200335020ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.idgraf000066400000000000000000000217061413463044200320620ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.mirage000066400000000000000000000100421413463044200320610ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_atlas.sirocco000066400000000000000000000130661413463044200322670ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.attila000066400000000000000000000100431413463044200317400ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.hannibal000066400000000000000000000040251413463044200322410ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.hannibal-pitch000066400000000000000000000040251413463044200333460ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.idgraf000066400000000000000000000217061413463044200317260ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.mirage000066400000000000000000000100421413463044200317250ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_goto.sirocco000066400000000000000000000130661413463044200321330ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.attila000066400000000000000000000100431413463044200325730ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.hannibal000066400000000000000000000040251413463044200330740ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu_slu_lu_model_22_openblas.hannibal-pitch000066400000000000000000000040251413463044200341220ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45################## # Performance Model Version 45 #################### # COMBs # number of combinations 3 #################### # COMB_1 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.116253e+03 1.361494e+03 9.170526e+08 5.024130e+12 179243 #################### # COMB_2 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 1 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda1_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.228920e+03 1.967478e+03 8.761527e+08 5.229949e+12 167559 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 1 #################### # DEV_0 # device id 2 #################### # DEV_0 # number of cores 1 ########## # number of implementations 1 ##### # Model for cuda2_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 # not multiple-regression-base 0 # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 0.000000e+00 5.131691e+03 1.494139e+03 8.920059e+08 4.965550e+12 173823 starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.idgraf000066400000000000000000000217061413463044200325610ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 9 #################### # COMB_8 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.mirage000066400000000000000000000100421413463044200325600ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 4 #################### # COMB_3 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/45/starpu_slu_lu_model_22_openblas.sirocco000066400000000000000000000130661413463044200327660ustar00rootroot00000000000000################## # Performance Model Version 45 #################### # COMBs # number of combinations 5 #################### # COMB_4 # number of types devices 1 #################### # DEV_0 # device type (CPU - 0, CUDA - 1, OPENCL - 2, MIC - 3) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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) 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 # not multiple-regression-base 0 # 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.3.9+dfsg/tools/perfmodels/sampling/codelets/tmp/000077500000000000000000000000001413463044200234765ustar00rootroot00000000000000starpu-1.3.9+dfsg/tools/perfmodels/sampling/codelets/tmp/mlr_init.out000066400000000000000000002073051413463044200260530ustar00rootroot00000000000000Duration, M, N, K 0.422000, 6.000000, 5.000000, 4.000000 0.474000, 6.000000, 5.000000, 4.000000 0.673000, 6.000000, 5.000000, 4.000000 0.482000, 6.000000, 5.000000, 4.000000 0.721000, 6.000000, 5.000000, 4.000000 0.441000, 6.000000, 5.000000, 4.000000 0.459000, 6.000000, 5.000000, 4.000000 0.694000, 6.000000, 5.000000, 4.000000 0.458000, 6.000000, 5.000000, 4.000000 0.468000, 6.000000, 5.000000, 4.000000 0.684000, 6.000000, 5.000000, 4.000000 0.470000, 6.000000, 5.000000, 4.000000 0.469000, 6.000000, 5.000000, 4.000000 0.667000, 6.000000, 5.000000, 4.000000 0.422000, 6.000000, 5.000000, 4.000000 0.432000, 6.000000, 5.000000, 4.000000 0.469000, 6.000000, 5.000000, 4.000000 0.691000, 6.000000, 5.000000, 4.000000 0.450000, 6.000000, 5.000000, 4.000000 0.629000, 6.000000, 5.000000, 4.000000 0.451000, 6.000000, 5.000000, 4.000000 0.505000, 6.000000, 5.000000, 4.000000 0.686000, 6.000000, 5.000000, 4.000000 0.435000, 6.000000, 5.000000, 4.000000 0.478000, 6.000000, 5.000000, 4.000000 0.686000, 6.000000, 5.000000, 4.000000 0.418000, 6.000000, 5.000000, 4.000000 0.462000, 6.000000, 5.000000, 4.000000 0.680000, 6.000000, 5.000000, 4.000000 0.523000, 6.000000, 5.000000, 4.000000 0.604000, 6.000000, 5.000000, 4.000000 0.485000, 6.000000, 5.000000, 4.000000 0.692000, 6.000000, 5.000000, 4.000000 0.422000, 6.000000, 5.000000, 4.000000 0.460000, 6.000000, 5.000000, 4.000000 0.685000, 6.000000, 5.000000, 4.000000 0.420000, 6.000000, 5.000000, 4.000000 0.453000, 6.000000, 5.000000, 4.000000 0.661000, 6.000000, 5.000000, 4.000000 0.495000, 6.000000, 5.000000, 4.000000 0.670000, 6.000000, 5.000000, 4.000000 0.427000, 6.000000, 5.000000, 4.000000 1.951000, 4.000000, 8.000000, 10.000000 2.683000, 4.000000, 8.000000, 10.000000 1.936000, 4.000000, 8.000000, 10.000000 1.949000, 4.000000, 8.000000, 10.000000 2.724000, 4.000000, 8.000000, 10.000000 1.906000, 4.000000, 8.000000, 10.000000 1.951000, 4.000000, 8.000000, 10.000000 2.631000, 4.000000, 8.000000, 10.000000 1.989000, 4.000000, 8.000000, 10.000000 2.679000, 4.000000, 8.000000, 10.000000 1.897000, 4.000000, 8.000000, 10.000000 1.951000, 4.000000, 8.000000, 10.000000 2.894000, 4.000000, 8.000000, 10.000000 1.903000, 4.000000, 8.000000, 10.000000 1.948000, 4.000000, 8.000000, 10.000000 2.666000, 4.000000, 8.000000, 10.000000 1.922000, 4.000000, 8.000000, 10.000000 1.951000, 4.000000, 8.000000, 10.000000 2.769000, 4.000000, 8.000000, 10.000000 1.937000, 4.000000, 8.000000, 10.000000 2.739000, 4.000000, 8.000000, 10.000000 1.912000, 4.000000, 8.000000, 10.000000 1.942000, 4.000000, 8.000000, 10.000000 2.694000, 4.000000, 8.000000, 10.000000 1.903000, 4.000000, 8.000000, 10.000000 1.956000, 4.000000, 8.000000, 10.000000 2.784000, 4.000000, 8.000000, 10.000000 1.894000, 4.000000, 8.000000, 10.000000 1.946000, 4.000000, 8.000000, 10.000000 2.704000, 4.000000, 8.000000, 10.000000 1.899000, 4.000000, 8.000000, 10.000000 1.923000, 4.000000, 8.000000, 10.000000 2.748000, 4.000000, 8.000000, 10.000000 1.903000, 4.000000, 8.000000, 10.000000 1.941000, 4.000000, 8.000000, 10.000000 2.818000, 4.000000, 8.000000, 10.000000 1.926000, 4.000000, 8.000000, 10.000000 1.927000, 4.000000, 8.000000, 10.000000 2.793000, 4.000000, 8.000000, 10.000000 1.914000, 4.000000, 8.000000, 10.000000 1.948000, 4.000000, 8.000000, 10.000000 2.701000, 4.000000, 8.000000, 10.000000 0.244000, 8.000000, 2.000000, 2.000000 0.269000, 8.000000, 2.000000, 2.000000 0.380000, 8.000000, 2.000000, 2.000000 0.229000, 8.000000, 2.000000, 2.000000 0.281000, 8.000000, 2.000000, 2.000000 0.395000, 8.000000, 2.000000, 2.000000 0.235000, 8.000000, 2.000000, 2.000000 0.275000, 8.000000, 2.000000, 2.000000 0.383000, 8.000000, 2.000000, 2.000000 0.268000, 8.000000, 2.000000, 2.000000 0.285000, 8.000000, 2.000000, 2.000000 0.345000, 8.000000, 2.000000, 2.000000 0.243000, 8.000000, 2.000000, 2.000000 0.268000, 8.000000, 2.000000, 2.000000 0.424000, 8.000000, 2.000000, 2.000000 0.242000, 8.000000, 2.000000, 2.000000 0.303000, 8.000000, 2.000000, 2.000000 0.404000, 8.000000, 2.000000, 2.000000 0.250000, 8.000000, 2.000000, 2.000000 0.277000, 8.000000, 2.000000, 2.000000 0.369000, 8.000000, 2.000000, 2.000000 0.253000, 8.000000, 2.000000, 2.000000 0.278000, 8.000000, 2.000000, 2.000000 0.441000, 8.000000, 2.000000, 2.000000 0.270000, 8.000000, 2.000000, 2.000000 0.246000, 8.000000, 2.000000, 2.000000 0.284000, 8.000000, 2.000000, 2.000000 0.400000, 8.000000, 2.000000, 2.000000 0.240000, 8.000000, 2.000000, 2.000000 0.252000, 8.000000, 2.000000, 2.000000 0.295000, 8.000000, 2.000000, 2.000000 0.395000, 8.000000, 2.000000, 2.000000 0.248000, 8.000000, 2.000000, 2.000000 0.324000, 8.000000, 2.000000, 2.000000 0.408000, 8.000000, 2.000000, 2.000000 0.312000, 8.000000, 2.000000, 2.000000 0.420000, 8.000000, 2.000000, 2.000000 0.240000, 8.000000, 2.000000, 2.000000 0.266000, 8.000000, 2.000000, 2.000000 0.404000, 8.000000, 2.000000, 2.000000 0.273000, 8.000000, 2.000000, 2.000000 0.334000, 8.000000, 2.000000, 2.000000 0.452000, 1.000000, 5.000000, 2.000000 0.423000, 1.000000, 5.000000, 2.000000 0.474000, 1.000000, 5.000000, 2.000000 0.268000, 1.000000, 5.000000, 2.000000 0.337000, 1.000000, 5.000000, 2.000000 0.420000, 1.000000, 5.000000, 2.000000 0.323000, 1.000000, 5.000000, 2.000000 0.301000, 1.000000, 5.000000, 2.000000 0.428000, 1.000000, 5.000000, 2.000000 0.318000, 1.000000, 5.000000, 2.000000 0.291000, 1.000000, 5.000000, 2.000000 0.436000, 1.000000, 5.000000, 2.000000 0.323000, 1.000000, 5.000000, 2.000000 0.351000, 1.000000, 5.000000, 2.000000 0.456000, 1.000000, 5.000000, 2.000000 0.309000, 1.000000, 5.000000, 2.000000 0.329000, 1.000000, 5.000000, 2.000000 0.514000, 1.000000, 5.000000, 2.000000 0.286000, 1.000000, 5.000000, 2.000000 0.358000, 1.000000, 5.000000, 2.000000 0.485000, 1.000000, 5.000000, 2.000000 0.261000, 1.000000, 5.000000, 2.000000 0.374000, 1.000000, 5.000000, 2.000000 0.470000, 1.000000, 5.000000, 2.000000 0.269000, 1.000000, 5.000000, 2.000000 0.347000, 1.000000, 5.000000, 2.000000 0.402000, 1.000000, 5.000000, 2.000000 0.274000, 1.000000, 5.000000, 2.000000 0.338000, 1.000000, 5.000000, 2.000000 0.510000, 1.000000, 5.000000, 2.000000 0.281000, 1.000000, 5.000000, 2.000000 0.331000, 1.000000, 5.000000, 2.000000 0.311000, 1.000000, 5.000000, 2.000000 0.509000, 1.000000, 5.000000, 2.000000 0.316000, 1.000000, 5.000000, 2.000000 0.342000, 1.000000, 5.000000, 2.000000 0.353000, 1.000000, 5.000000, 2.000000 0.448000, 1.000000, 5.000000, 2.000000 0.308000, 1.000000, 5.000000, 2.000000 0.349000, 1.000000, 5.000000, 2.000000 0.383000, 1.000000, 5.000000, 2.000000 0.320000, 1.000000, 5.000000, 2.000000 1.197000, 6.000000, 8.000000, 5.000000 1.719000, 6.000000, 8.000000, 5.000000 1.152000, 6.000000, 8.000000, 5.000000 1.214000, 6.000000, 8.000000, 5.000000 1.732000, 6.000000, 8.000000, 5.000000 1.175000, 6.000000, 8.000000, 5.000000 1.157000, 6.000000, 8.000000, 5.000000 1.739000, 6.000000, 8.000000, 5.000000 1.181000, 6.000000, 8.000000, 5.000000 1.872000, 6.000000, 8.000000, 5.000000 1.163000, 6.000000, 8.000000, 5.000000 1.217000, 6.000000, 8.000000, 5.000000 1.717000, 6.000000, 8.000000, 5.000000 1.130000, 6.000000, 8.000000, 5.000000 1.194000, 6.000000, 8.000000, 5.000000 1.723000, 6.000000, 8.000000, 5.000000 1.133000, 6.000000, 8.000000, 5.000000 1.177000, 6.000000, 8.000000, 5.000000 1.803000, 6.000000, 8.000000, 5.000000 1.140000, 6.000000, 8.000000, 5.000000 1.218000, 6.000000, 8.000000, 5.000000 1.742000, 6.000000, 8.000000, 5.000000 1.127000, 6.000000, 8.000000, 5.000000 1.185000, 6.000000, 8.000000, 5.000000 1.778000, 6.000000, 8.000000, 5.000000 1.132000, 6.000000, 8.000000, 5.000000 1.184000, 6.000000, 8.000000, 5.000000 1.781000, 6.000000, 8.000000, 5.000000 1.131000, 6.000000, 8.000000, 5.000000 1.210000, 6.000000, 8.000000, 5.000000 1.791000, 6.000000, 8.000000, 5.000000 1.179000, 6.000000, 8.000000, 5.000000 1.858000, 6.000000, 8.000000, 5.000000 1.121000, 6.000000, 8.000000, 5.000000 1.188000, 6.000000, 8.000000, 5.000000 1.742000, 6.000000, 8.000000, 5.000000 1.167000, 6.000000, 8.000000, 5.000000 1.198000, 6.000000, 8.000000, 5.000000 1.751000, 6.000000, 8.000000, 5.000000 1.127000, 6.000000, 8.000000, 5.000000 1.204000, 6.000000, 8.000000, 5.000000 1.583000, 6.000000, 8.000000, 5.000000 0.386000, 8.000000, 4.000000, 3.000000 0.428000, 8.000000, 4.000000, 3.000000 0.555000, 8.000000, 4.000000, 3.000000 0.369000, 8.000000, 4.000000, 3.000000 0.355000, 8.000000, 4.000000, 3.000000 0.378000, 8.000000, 4.000000, 3.000000 0.545000, 8.000000, 4.000000, 3.000000 0.389000, 8.000000, 4.000000, 3.000000 0.365000, 8.000000, 4.000000, 3.000000 0.402000, 8.000000, 4.000000, 3.000000 0.561000, 8.000000, 4.000000, 3.000000 0.339000, 8.000000, 4.000000, 3.000000 0.385000, 8.000000, 4.000000, 3.000000 0.582000, 8.000000, 4.000000, 3.000000 0.341000, 8.000000, 4.000000, 3.000000 0.417000, 8.000000, 4.000000, 3.000000 0.578000, 8.000000, 4.000000, 3.000000 0.341000, 8.000000, 4.000000, 3.000000 0.400000, 8.000000, 4.000000, 3.000000 0.614000, 8.000000, 4.000000, 3.000000 0.339000, 8.000000, 4.000000, 3.000000 0.416000, 8.000000, 4.000000, 3.000000 0.619000, 8.000000, 4.000000, 3.000000 0.335000, 8.000000, 4.000000, 3.000000 0.418000, 8.000000, 4.000000, 3.000000 0.576000, 8.000000, 4.000000, 3.000000 0.341000, 8.000000, 4.000000, 3.000000 0.404000, 8.000000, 4.000000, 3.000000 0.552000, 8.000000, 4.000000, 3.000000 0.343000, 8.000000, 4.000000, 3.000000 0.446000, 8.000000, 4.000000, 3.000000 0.529000, 8.000000, 4.000000, 3.000000 0.382000, 8.000000, 4.000000, 3.000000 0.389000, 8.000000, 4.000000, 3.000000 0.610000, 8.000000, 4.000000, 3.000000 0.345000, 8.000000, 4.000000, 3.000000 0.406000, 8.000000, 4.000000, 3.000000 0.560000, 8.000000, 4.000000, 3.000000 0.380000, 8.000000, 4.000000, 3.000000 0.364000, 8.000000, 4.000000, 3.000000 0.391000, 8.000000, 4.000000, 3.000000 0.387000, 8.000000, 4.000000, 3.000000 0.329000, 1.000000, 1.000000, 6.000000 0.244000, 1.000000, 1.000000, 6.000000 0.371000, 1.000000, 1.000000, 6.000000 0.193000, 1.000000, 1.000000, 6.000000 0.250000, 1.000000, 1.000000, 6.000000 0.293000, 1.000000, 1.000000, 6.000000 0.209000, 1.000000, 1.000000, 6.000000 0.243000, 1.000000, 1.000000, 6.000000 0.309000, 1.000000, 1.000000, 6.000000 0.219000, 1.000000, 1.000000, 6.000000 0.233000, 1.000000, 1.000000, 6.000000 0.355000, 1.000000, 1.000000, 6.000000 0.196000, 1.000000, 1.000000, 6.000000 0.235000, 1.000000, 1.000000, 6.000000 0.202000, 1.000000, 1.000000, 6.000000 0.241000, 1.000000, 1.000000, 6.000000 0.341000, 1.000000, 1.000000, 6.000000 0.174000, 1.000000, 1.000000, 6.000000 0.251000, 1.000000, 1.000000, 6.000000 0.322000, 1.000000, 1.000000, 6.000000 0.220000, 1.000000, 1.000000, 6.000000 0.224000, 1.000000, 1.000000, 6.000000 0.326000, 1.000000, 1.000000, 6.000000 0.171000, 1.000000, 1.000000, 6.000000 0.256000, 1.000000, 1.000000, 6.000000 0.310000, 1.000000, 1.000000, 6.000000 0.222000, 1.000000, 1.000000, 6.000000 0.241000, 1.000000, 1.000000, 6.000000 0.342000, 1.000000, 1.000000, 6.000000 0.181000, 1.000000, 1.000000, 6.000000 0.252000, 1.000000, 1.000000, 6.000000 0.364000, 1.000000, 1.000000, 6.000000 0.188000, 1.000000, 1.000000, 6.000000 0.245000, 1.000000, 1.000000, 6.000000 0.176000, 1.000000, 1.000000, 6.000000 0.245000, 1.000000, 1.000000, 6.000000 0.330000, 1.000000, 1.000000, 6.000000 0.239000, 1.000000, 1.000000, 6.000000 0.358000, 1.000000, 1.000000, 6.000000 0.198000, 1.000000, 1.000000, 6.000000 0.260000, 1.000000, 1.000000, 6.000000 0.322000, 1.000000, 1.000000, 6.000000 0.480000, 3.000000, 7.000000, 2.000000 0.512000, 3.000000, 7.000000, 2.000000 0.682000, 3.000000, 7.000000, 2.000000 0.440000, 3.000000, 7.000000, 2.000000 0.515000, 3.000000, 7.000000, 2.000000 0.711000, 3.000000, 7.000000, 2.000000 0.438000, 3.000000, 7.000000, 2.000000 0.514000, 3.000000, 7.000000, 2.000000 0.759000, 3.000000, 7.000000, 2.000000 0.439000, 3.000000, 7.000000, 2.000000 0.510000, 3.000000, 7.000000, 2.000000 0.719000, 3.000000, 7.000000, 2.000000 0.491000, 3.000000, 7.000000, 2.000000 0.530000, 3.000000, 7.000000, 2.000000 0.683000, 3.000000, 7.000000, 2.000000 0.440000, 3.000000, 7.000000, 2.000000 0.518000, 3.000000, 7.000000, 2.000000 0.711000, 3.000000, 7.000000, 2.000000 0.434000, 3.000000, 7.000000, 2.000000 0.546000, 3.000000, 7.000000, 2.000000 0.746000, 3.000000, 7.000000, 2.000000 0.439000, 3.000000, 7.000000, 2.000000 0.528000, 3.000000, 7.000000, 2.000000 0.708000, 3.000000, 7.000000, 2.000000 0.441000, 3.000000, 7.000000, 2.000000 0.506000, 3.000000, 7.000000, 2.000000 0.733000, 3.000000, 7.000000, 2.000000 0.444000, 3.000000, 7.000000, 2.000000 0.495000, 3.000000, 7.000000, 2.000000 0.727000, 3.000000, 7.000000, 2.000000 0.445000, 3.000000, 7.000000, 2.000000 0.490000, 3.000000, 7.000000, 2.000000 0.696000, 3.000000, 7.000000, 2.000000 0.444000, 3.000000, 7.000000, 2.000000 0.469000, 3.000000, 7.000000, 2.000000 0.488000, 3.000000, 7.000000, 2.000000 0.689000, 3.000000, 7.000000, 2.000000 0.482000, 3.000000, 7.000000, 2.000000 0.442000, 3.000000, 7.000000, 2.000000 0.521000, 3.000000, 7.000000, 2.000000 0.708000, 3.000000, 7.000000, 2.000000 0.437000, 3.000000, 7.000000, 2.000000 2.273000, 4.000000, 10.000000, 6.000000 3.163000, 4.000000, 10.000000, 6.000000 2.216000, 4.000000, 10.000000, 6.000000 2.265000, 4.000000, 10.000000, 6.000000 3.135000, 4.000000, 10.000000, 6.000000 2.283000, 4.000000, 10.000000, 6.000000 3.072000, 4.000000, 10.000000, 6.000000 2.236000, 4.000000, 10.000000, 6.000000 2.312000, 4.000000, 10.000000, 6.000000 3.145000, 4.000000, 10.000000, 6.000000 2.211000, 4.000000, 10.000000, 6.000000 2.221000, 4.000000, 10.000000, 6.000000 2.270000, 4.000000, 10.000000, 6.000000 3.336000, 4.000000, 10.000000, 6.000000 2.216000, 4.000000, 10.000000, 6.000000 2.281000, 4.000000, 10.000000, 6.000000 3.408000, 4.000000, 10.000000, 6.000000 2.236000, 4.000000, 10.000000, 6.000000 2.271000, 4.000000, 10.000000, 6.000000 3.160000, 4.000000, 10.000000, 6.000000 2.248000, 4.000000, 10.000000, 6.000000 2.247000, 4.000000, 10.000000, 6.000000 3.170000, 4.000000, 10.000000, 6.000000 2.195000, 4.000000, 10.000000, 6.000000 2.253000, 4.000000, 10.000000, 6.000000 3.419000, 4.000000, 10.000000, 6.000000 2.281000, 4.000000, 10.000000, 6.000000 2.265000, 4.000000, 10.000000, 6.000000 3.303000, 4.000000, 10.000000, 6.000000 2.251000, 4.000000, 10.000000, 6.000000 2.266000, 4.000000, 10.000000, 6.000000 3.209000, 4.000000, 10.000000, 6.000000 2.241000, 4.000000, 10.000000, 6.000000 2.281000, 4.000000, 10.000000, 6.000000 3.321000, 4.000000, 10.000000, 6.000000 2.263000, 4.000000, 10.000000, 6.000000 3.158000, 4.000000, 10.000000, 6.000000 2.234000, 4.000000, 10.000000, 6.000000 2.275000, 4.000000, 10.000000, 6.000000 3.164000, 4.000000, 10.000000, 6.000000 2.209000, 4.000000, 10.000000, 6.000000 2.213000, 4.000000, 10.000000, 6.000000 0.469000, 6.000000, 6.000000, 2.000000 0.673000, 6.000000, 6.000000, 2.000000 0.482000, 6.000000, 6.000000, 2.000000 0.668000, 6.000000, 6.000000, 2.000000 0.426000, 6.000000, 6.000000, 2.000000 0.411000, 6.000000, 6.000000, 2.000000 0.471000, 6.000000, 6.000000, 2.000000 0.653000, 6.000000, 6.000000, 2.000000 0.430000, 6.000000, 6.000000, 2.000000 0.487000, 6.000000, 6.000000, 2.000000 0.644000, 6.000000, 6.000000, 2.000000 0.419000, 6.000000, 6.000000, 2.000000 0.501000, 6.000000, 6.000000, 2.000000 0.664000, 6.000000, 6.000000, 2.000000 0.451000, 6.000000, 6.000000, 2.000000 0.485000, 6.000000, 6.000000, 2.000000 0.635000, 6.000000, 6.000000, 2.000000 0.414000, 6.000000, 6.000000, 2.000000 0.474000, 6.000000, 6.000000, 2.000000 0.624000, 6.000000, 6.000000, 2.000000 0.410000, 6.000000, 6.000000, 2.000000 0.514000, 6.000000, 6.000000, 2.000000 0.680000, 6.000000, 6.000000, 2.000000 0.416000, 6.000000, 6.000000, 2.000000 0.464000, 6.000000, 6.000000, 2.000000 0.644000, 6.000000, 6.000000, 2.000000 0.440000, 6.000000, 6.000000, 2.000000 0.471000, 6.000000, 6.000000, 2.000000 0.660000, 6.000000, 6.000000, 2.000000 0.411000, 6.000000, 6.000000, 2.000000 0.504000, 6.000000, 6.000000, 2.000000 0.655000, 6.000000, 6.000000, 2.000000 0.415000, 6.000000, 6.000000, 2.000000 0.462000, 6.000000, 6.000000, 2.000000 0.632000, 6.000000, 6.000000, 2.000000 0.409000, 6.000000, 6.000000, 2.000000 0.515000, 6.000000, 6.000000, 2.000000 0.664000, 6.000000, 6.000000, 2.000000 0.414000, 6.000000, 6.000000, 2.000000 0.481000, 6.000000, 6.000000, 2.000000 0.681000, 6.000000, 6.000000, 2.000000 0.418000, 6.000000, 6.000000, 2.000000 0.368000, 6.000000, 3.000000, 4.000000 0.418000, 6.000000, 3.000000, 4.000000 0.270000, 6.000000, 3.000000, 4.000000 0.352000, 6.000000, 3.000000, 4.000000 0.437000, 6.000000, 3.000000, 4.000000 0.276000, 6.000000, 3.000000, 4.000000 0.341000, 6.000000, 3.000000, 4.000000 0.441000, 6.000000, 3.000000, 4.000000 0.271000, 6.000000, 3.000000, 4.000000 0.348000, 6.000000, 3.000000, 4.000000 0.474000, 6.000000, 3.000000, 4.000000 0.309000, 6.000000, 3.000000, 4.000000 0.328000, 6.000000, 3.000000, 4.000000 0.441000, 6.000000, 3.000000, 4.000000 0.272000, 6.000000, 3.000000, 4.000000 0.362000, 6.000000, 3.000000, 4.000000 0.410000, 6.000000, 3.000000, 4.000000 0.302000, 6.000000, 3.000000, 4.000000 0.324000, 6.000000, 3.000000, 4.000000 0.267000, 6.000000, 3.000000, 4.000000 0.313000, 6.000000, 3.000000, 4.000000 0.497000, 6.000000, 3.000000, 4.000000 0.268000, 6.000000, 3.000000, 4.000000 0.376000, 6.000000, 3.000000, 4.000000 0.451000, 6.000000, 3.000000, 4.000000 0.271000, 6.000000, 3.000000, 4.000000 0.329000, 6.000000, 3.000000, 4.000000 0.447000, 6.000000, 3.000000, 4.000000 0.317000, 6.000000, 3.000000, 4.000000 0.271000, 6.000000, 3.000000, 4.000000 0.322000, 6.000000, 3.000000, 4.000000 0.475000, 6.000000, 3.000000, 4.000000 0.298000, 6.000000, 3.000000, 4.000000 0.280000, 6.000000, 3.000000, 4.000000 0.548000, 6.000000, 3.000000, 4.000000 0.262000, 6.000000, 3.000000, 4.000000 0.320000, 6.000000, 3.000000, 4.000000 0.441000, 6.000000, 3.000000, 4.000000 0.271000, 6.000000, 3.000000, 4.000000 0.331000, 6.000000, 3.000000, 4.000000 0.465000, 6.000000, 3.000000, 4.000000 0.269000, 6.000000, 3.000000, 4.000000 0.544000, 5.000000, 7.000000, 2.000000 0.757000, 5.000000, 7.000000, 2.000000 0.476000, 5.000000, 7.000000, 2.000000 0.545000, 5.000000, 7.000000, 2.000000 0.737000, 5.000000, 7.000000, 2.000000 0.477000, 5.000000, 7.000000, 2.000000 0.545000, 5.000000, 7.000000, 2.000000 0.845000, 5.000000, 7.000000, 2.000000 0.477000, 5.000000, 7.000000, 2.000000 0.547000, 5.000000, 7.000000, 2.000000 0.812000, 5.000000, 7.000000, 2.000000 0.529000, 5.000000, 7.000000, 2.000000 0.504000, 5.000000, 7.000000, 2.000000 0.506000, 5.000000, 7.000000, 2.000000 0.533000, 5.000000, 7.000000, 2.000000 0.657000, 5.000000, 7.000000, 2.000000 0.539000, 5.000000, 7.000000, 2.000000 0.765000, 5.000000, 7.000000, 2.000000 0.552000, 5.000000, 7.000000, 2.000000 0.789000, 5.000000, 7.000000, 2.000000 0.475000, 5.000000, 7.000000, 2.000000 0.556000, 5.000000, 7.000000, 2.000000 0.738000, 5.000000, 7.000000, 2.000000 0.512000, 5.000000, 7.000000, 2.000000 0.487000, 5.000000, 7.000000, 2.000000 0.546000, 5.000000, 7.000000, 2.000000 0.796000, 5.000000, 7.000000, 2.000000 0.484000, 5.000000, 7.000000, 2.000000 0.549000, 5.000000, 7.000000, 2.000000 0.766000, 5.000000, 7.000000, 2.000000 0.518000, 5.000000, 7.000000, 2.000000 0.521000, 5.000000, 7.000000, 2.000000 0.799000, 5.000000, 7.000000, 2.000000 0.486000, 5.000000, 7.000000, 2.000000 0.562000, 5.000000, 7.000000, 2.000000 0.813000, 5.000000, 7.000000, 2.000000 0.476000, 5.000000, 7.000000, 2.000000 0.532000, 5.000000, 7.000000, 2.000000 0.741000, 5.000000, 7.000000, 2.000000 0.509000, 5.000000, 7.000000, 2.000000 0.555000, 5.000000, 7.000000, 2.000000 0.780000, 5.000000, 7.000000, 2.000000 2.039000, 8.000000, 10.000000, 5.000000 2.102000, 8.000000, 10.000000, 5.000000 3.005000, 8.000000, 10.000000, 5.000000 2.058000, 8.000000, 10.000000, 5.000000 2.091000, 8.000000, 10.000000, 5.000000 2.928000, 8.000000, 10.000000, 5.000000 2.092000, 8.000000, 10.000000, 5.000000 2.067000, 8.000000, 10.000000, 5.000000 3.010000, 8.000000, 10.000000, 5.000000 2.026000, 8.000000, 10.000000, 5.000000 2.147000, 8.000000, 10.000000, 5.000000 2.996000, 8.000000, 10.000000, 5.000000 2.111000, 8.000000, 10.000000, 5.000000 2.902000, 8.000000, 10.000000, 5.000000 2.034000, 8.000000, 10.000000, 5.000000 2.079000, 8.000000, 10.000000, 5.000000 2.858000, 8.000000, 10.000000, 5.000000 2.060000, 8.000000, 10.000000, 5.000000 2.078000, 8.000000, 10.000000, 5.000000 2.292000, 8.000000, 10.000000, 5.000000 3.105000, 8.000000, 10.000000, 5.000000 2.028000, 8.000000, 10.000000, 5.000000 2.098000, 8.000000, 10.000000, 5.000000 3.042000, 8.000000, 10.000000, 5.000000 2.034000, 8.000000, 10.000000, 5.000000 2.112000, 8.000000, 10.000000, 5.000000 2.800000, 8.000000, 10.000000, 5.000000 2.037000, 8.000000, 10.000000, 5.000000 2.062000, 8.000000, 10.000000, 5.000000 2.866000, 8.000000, 10.000000, 5.000000 2.059000, 8.000000, 10.000000, 5.000000 2.061000, 8.000000, 10.000000, 5.000000 2.920000, 8.000000, 10.000000, 5.000000 2.041000, 8.000000, 10.000000, 5.000000 2.073000, 8.000000, 10.000000, 5.000000 2.959000, 8.000000, 10.000000, 5.000000 2.066000, 8.000000, 10.000000, 5.000000 2.063000, 8.000000, 10.000000, 5.000000 2.905000, 8.000000, 10.000000, 5.000000 2.028000, 8.000000, 10.000000, 5.000000 2.058000, 8.000000, 10.000000, 5.000000 2.989000, 8.000000, 10.000000, 5.000000 1.629000, 6.000000, 8.000000, 8.000000 1.675000, 6.000000, 8.000000, 8.000000 2.372000, 6.000000, 8.000000, 8.000000 1.627000, 6.000000, 8.000000, 8.000000 1.665000, 6.000000, 8.000000, 8.000000 2.568000, 6.000000, 8.000000, 8.000000 1.639000, 6.000000, 8.000000, 8.000000 1.684000, 6.000000, 8.000000, 8.000000 2.432000, 6.000000, 8.000000, 8.000000 1.659000, 6.000000, 8.000000, 8.000000 2.617000, 6.000000, 8.000000, 8.000000 2.096000, 6.000000, 8.000000, 8.000000 2.645000, 6.000000, 8.000000, 8.000000 2.291000, 6.000000, 8.000000, 8.000000 2.590000, 6.000000, 8.000000, 8.000000 8.075000, 6.000000, 8.000000, 8.000000 2.076000, 6.000000, 8.000000, 8.000000 1.842000, 6.000000, 8.000000, 8.000000 2.526000, 6.000000, 8.000000, 8.000000 2.011000, 6.000000, 8.000000, 8.000000 2.423000, 6.000000, 8.000000, 8.000000 1.651000, 6.000000, 8.000000, 8.000000 1.744000, 6.000000, 8.000000, 8.000000 2.338000, 6.000000, 8.000000, 8.000000 1.672000, 6.000000, 8.000000, 8.000000 1.669000, 6.000000, 8.000000, 8.000000 2.845000, 6.000000, 8.000000, 8.000000 1.731000, 6.000000, 8.000000, 8.000000 2.267000, 6.000000, 8.000000, 8.000000 1.654000, 6.000000, 8.000000, 8.000000 1.739000, 6.000000, 8.000000, 8.000000 2.585000, 6.000000, 8.000000, 8.000000 1.710000, 6.000000, 8.000000, 8.000000 1.763000, 6.000000, 8.000000, 8.000000 2.461000, 6.000000, 8.000000, 8.000000 1.681000, 6.000000, 8.000000, 8.000000 1.756000, 6.000000, 8.000000, 8.000000 2.449000, 6.000000, 8.000000, 8.000000 1.644000, 6.000000, 8.000000, 8.000000 2.466000, 6.000000, 8.000000, 8.000000 1.680000, 6.000000, 8.000000, 8.000000 1.866000, 5.000000, 10.000000, 3.000000 2.054000, 6.000000, 8.000000, 8.000000 2.002000, 5.000000, 10.000000, 3.000000 1.352000, 5.000000, 10.000000, 3.000000 1.569000, 5.000000, 10.000000, 3.000000 1.298000, 5.000000, 10.000000, 3.000000 2.725000, 5.000000, 10.000000, 3.000000 1.386000, 5.000000, 10.000000, 3.000000 2.134000, 5.000000, 10.000000, 3.000000 1.318000, 5.000000, 10.000000, 3.000000 1.829000, 5.000000, 10.000000, 3.000000 1.402000, 5.000000, 10.000000, 3.000000 1.981000, 5.000000, 10.000000, 3.000000 1.385000, 5.000000, 10.000000, 3.000000 1.273000, 5.000000, 10.000000, 3.000000 1.246000, 5.000000, 10.000000, 3.000000 1.942000, 5.000000, 10.000000, 3.000000 1.326000, 5.000000, 10.000000, 3.000000 1.370000, 5.000000, 10.000000, 3.000000 1.644000, 5.000000, 10.000000, 3.000000 1.717000, 5.000000, 10.000000, 3.000000 1.654000, 5.000000, 10.000000, 3.000000 1.672000, 5.000000, 10.000000, 3.000000 1.379000, 5.000000, 10.000000, 3.000000 1.848000, 5.000000, 10.000000, 3.000000 1.283000, 5.000000, 10.000000, 3.000000 1.391000, 5.000000, 10.000000, 3.000000 1.927000, 5.000000, 10.000000, 3.000000 1.671000, 5.000000, 10.000000, 3.000000 1.388000, 5.000000, 10.000000, 3.000000 1.627000, 5.000000, 10.000000, 3.000000 1.487000, 5.000000, 10.000000, 3.000000 1.626000, 5.000000, 10.000000, 3.000000 1.345000, 5.000000, 10.000000, 3.000000 2.669000, 2.000000, 8.000000, 9.000000 1.373000, 5.000000, 10.000000, 3.000000 2.108000, 2.000000, 8.000000, 9.000000 1.383000, 5.000000, 10.000000, 3.000000 2.529000, 2.000000, 8.000000, 9.000000 1.329000, 5.000000, 10.000000, 3.000000 2.625000, 2.000000, 8.000000, 9.000000 1.353000, 5.000000, 10.000000, 3.000000 2.606000, 2.000000, 8.000000, 9.000000 1.563000, 5.000000, 10.000000, 3.000000 3.374000, 2.000000, 8.000000, 9.000000 1.380000, 5.000000, 10.000000, 3.000000 1.445000, 5.000000, 10.000000, 3.000000 1.383000, 5.000000, 10.000000, 3.000000 1.317000, 5.000000, 10.000000, 3.000000 1.771000, 2.000000, 8.000000, 9.000000 1.765000, 2.000000, 8.000000, 9.000000 1.864000, 2.000000, 8.000000, 9.000000 1.880000, 2.000000, 8.000000, 9.000000 1.848000, 2.000000, 8.000000, 9.000000 1.708000, 2.000000, 8.000000, 9.000000 1.712000, 2.000000, 8.000000, 9.000000 1.773000, 2.000000, 8.000000, 9.000000 1.691000, 2.000000, 8.000000, 9.000000 1.845000, 2.000000, 8.000000, 9.000000 1.771000, 2.000000, 8.000000, 9.000000 1.782000, 2.000000, 8.000000, 9.000000 1.773000, 2.000000, 8.000000, 9.000000 1.786000, 2.000000, 8.000000, 9.000000 1.825000, 2.000000, 8.000000, 9.000000 1.801000, 2.000000, 8.000000, 9.000000 1.789000, 2.000000, 8.000000, 9.000000 1.793000, 2.000000, 8.000000, 9.000000 1.782000, 2.000000, 8.000000, 9.000000 2.515000, 2.000000, 8.000000, 9.000000 1.788000, 2.000000, 8.000000, 9.000000 2.425000, 2.000000, 8.000000, 9.000000 1.783000, 2.000000, 8.000000, 9.000000 2.576000, 2.000000, 8.000000, 9.000000 1.814000, 2.000000, 8.000000, 9.000000 2.500000, 2.000000, 8.000000, 9.000000 1.761000, 2.000000, 8.000000, 9.000000 2.568000, 2.000000, 8.000000, 9.000000 1.768000, 2.000000, 8.000000, 9.000000 2.505000, 2.000000, 8.000000, 9.000000 1.791000, 2.000000, 8.000000, 9.000000 2.602000, 2.000000, 8.000000, 9.000000 1.833000, 2.000000, 8.000000, 9.000000 2.475000, 2.000000, 8.000000, 9.000000 1.848000, 2.000000, 8.000000, 9.000000 2.618000, 2.000000, 8.000000, 9.000000 0.443000, 3.000000, 5.000000, 5.000000 0.452000, 3.000000, 5.000000, 5.000000 0.516000, 3.000000, 5.000000, 5.000000 1.051000, 3.000000, 5.000000, 5.000000 0.753000, 3.000000, 5.000000, 5.000000 0.745000, 3.000000, 5.000000, 5.000000 0.479000, 3.000000, 5.000000, 5.000000 0.742000, 3.000000, 5.000000, 5.000000 0.473000, 3.000000, 5.000000, 5.000000 0.624000, 3.000000, 5.000000, 5.000000 0.471000, 3.000000, 5.000000, 5.000000 0.498000, 3.000000, 5.000000, 5.000000 1.867000, 3.000000, 5.000000, 5.000000 0.519000, 3.000000, 5.000000, 5.000000 0.500000, 3.000000, 5.000000, 5.000000 0.431000, 3.000000, 5.000000, 5.000000 0.602000, 3.000000, 5.000000, 5.000000 0.577000, 3.000000, 5.000000, 5.000000 0.442000, 3.000000, 5.000000, 5.000000 0.519000, 3.000000, 5.000000, 5.000000 0.701000, 3.000000, 5.000000, 5.000000 0.479000, 3.000000, 5.000000, 5.000000 0.741000, 3.000000, 5.000000, 5.000000 0.538000, 3.000000, 5.000000, 5.000000 0.657000, 3.000000, 5.000000, 5.000000 0.526000, 3.000000, 5.000000, 5.000000 0.625000, 3.000000, 5.000000, 5.000000 0.505000, 3.000000, 5.000000, 5.000000 0.795000, 3.000000, 5.000000, 5.000000 0.444000, 3.000000, 5.000000, 5.000000 0.453000, 3.000000, 5.000000, 5.000000 0.488000, 3.000000, 5.000000, 5.000000 0.674000, 3.000000, 5.000000, 5.000000 0.430000, 3.000000, 5.000000, 5.000000 1.041000, 3.000000, 5.000000, 5.000000 0.637000, 3.000000, 5.000000, 5.000000 0.408000, 3.000000, 5.000000, 5.000000 0.467000, 3.000000, 5.000000, 5.000000 0.692000, 3.000000, 5.000000, 5.000000 0.555000, 3.000000, 5.000000, 5.000000 0.694000, 3.000000, 5.000000, 5.000000 0.460000, 3.000000, 5.000000, 5.000000 0.819000, 8.000000, 5.000000, 9.000000 0.854000, 8.000000, 5.000000, 9.000000 0.795000, 8.000000, 5.000000, 9.000000 1.014000, 8.000000, 5.000000, 9.000000 0.773000, 8.000000, 5.000000, 9.000000 0.963000, 8.000000, 5.000000, 9.000000 0.700000, 8.000000, 5.000000, 9.000000 0.715000, 8.000000, 5.000000, 9.000000 0.993000, 8.000000, 5.000000, 9.000000 0.679000, 8.000000, 5.000000, 9.000000 0.815000, 8.000000, 5.000000, 9.000000 1.104000, 8.000000, 5.000000, 9.000000 0.739000, 8.000000, 5.000000, 9.000000 1.126000, 8.000000, 5.000000, 9.000000 1.082000, 8.000000, 5.000000, 9.000000 0.729000, 8.000000, 5.000000, 9.000000 0.852000, 8.000000, 5.000000, 9.000000 1.015000, 8.000000, 5.000000, 9.000000 0.673000, 8.000000, 5.000000, 9.000000 0.745000, 8.000000, 5.000000, 9.000000 0.959000, 8.000000, 5.000000, 9.000000 0.722000, 8.000000, 5.000000, 9.000000 0.732000, 8.000000, 5.000000, 9.000000 1.037000, 8.000000, 5.000000, 9.000000 0.839000, 8.000000, 5.000000, 9.000000 1.040000, 8.000000, 5.000000, 9.000000 0.740000, 8.000000, 5.000000, 9.000000 0.748000, 8.000000, 5.000000, 9.000000 0.801000, 8.000000, 5.000000, 9.000000 0.980000, 8.000000, 5.000000, 9.000000 0.696000, 8.000000, 5.000000, 9.000000 0.739000, 8.000000, 5.000000, 9.000000 0.736000, 8.000000, 5.000000, 9.000000 1.078000, 8.000000, 5.000000, 9.000000 0.752000, 8.000000, 5.000000, 9.000000 1.116000, 8.000000, 5.000000, 9.000000 0.711000, 8.000000, 5.000000, 9.000000 0.789000, 8.000000, 5.000000, 9.000000 1.081000, 8.000000, 5.000000, 9.000000 0.688000, 8.000000, 5.000000, 9.000000 0.743000, 8.000000, 5.000000, 9.000000 0.913000, 8.000000, 5.000000, 9.000000 0.446000, 2.000000, 4.000000, 8.000000 0.669000, 2.000000, 4.000000, 8.000000 0.419000, 2.000000, 4.000000, 8.000000 0.697000, 2.000000, 4.000000, 8.000000 0.395000, 2.000000, 4.000000, 8.000000 0.713000, 2.000000, 4.000000, 8.000000 0.869000, 2.000000, 4.000000, 8.000000 0.476000, 2.000000, 4.000000, 8.000000 0.544000, 2.000000, 4.000000, 8.000000 0.577000, 2.000000, 4.000000, 8.000000 0.434000, 2.000000, 4.000000, 8.000000 0.498000, 2.000000, 4.000000, 8.000000 0.579000, 2.000000, 4.000000, 8.000000 0.383000, 2.000000, 4.000000, 8.000000 0.462000, 2.000000, 4.000000, 8.000000 0.388000, 2.000000, 4.000000, 8.000000 0.582000, 2.000000, 4.000000, 8.000000 0.373000, 2.000000, 4.000000, 8.000000 0.463000, 2.000000, 4.000000, 8.000000 0.564000, 2.000000, 4.000000, 8.000000 0.431000, 2.000000, 4.000000, 8.000000 0.447000, 2.000000, 4.000000, 8.000000 0.681000, 2.000000, 4.000000, 8.000000 0.390000, 2.000000, 4.000000, 8.000000 0.423000, 2.000000, 4.000000, 8.000000 0.696000, 2.000000, 4.000000, 8.000000 0.712000, 2.000000, 4.000000, 8.000000 0.421000, 2.000000, 4.000000, 8.000000 0.574000, 2.000000, 4.000000, 8.000000 0.596000, 2.000000, 4.000000, 8.000000 0.715000, 2.000000, 4.000000, 8.000000 0.565000, 2.000000, 4.000000, 8.000000 0.441000, 2.000000, 4.000000, 8.000000 0.562000, 2.000000, 4.000000, 8.000000 0.376000, 2.000000, 4.000000, 8.000000 0.400000, 2.000000, 4.000000, 8.000000 0.574000, 2.000000, 4.000000, 8.000000 0.433000, 2.000000, 4.000000, 8.000000 0.423000, 2.000000, 4.000000, 8.000000 0.697000, 2.000000, 4.000000, 8.000000 0.413000, 2.000000, 4.000000, 8.000000 0.371000, 2.000000, 4.000000, 8.000000 1.093000, 2.000000, 7.000000, 8.000000 1.085000, 2.000000, 7.000000, 8.000000 1.099000, 2.000000, 7.000000, 8.000000 1.746000, 2.000000, 7.000000, 8.000000 1.086000, 2.000000, 7.000000, 8.000000 1.123000, 2.000000, 7.000000, 8.000000 1.677000, 2.000000, 7.000000, 8.000000 1.089000, 2.000000, 7.000000, 8.000000 1.081000, 2.000000, 7.000000, 8.000000 1.078000, 2.000000, 7.000000, 8.000000 1.142000, 2.000000, 7.000000, 8.000000 1.621000, 2.000000, 7.000000, 8.000000 1.155000, 2.000000, 7.000000, 8.000000 1.696000, 2.000000, 7.000000, 8.000000 1.106000, 2.000000, 7.000000, 8.000000 1.415000, 2.000000, 7.000000, 8.000000 1.617000, 2.000000, 7.000000, 8.000000 1.512000, 2.000000, 7.000000, 8.000000 1.485000, 2.000000, 7.000000, 8.000000 1.483000, 2.000000, 7.000000, 8.000000 1.614000, 2.000000, 7.000000, 8.000000 1.354000, 2.000000, 7.000000, 8.000000 1.726000, 2.000000, 7.000000, 8.000000 1.400000, 2.000000, 7.000000, 8.000000 1.220000, 2.000000, 7.000000, 8.000000 1.757000, 2.000000, 7.000000, 8.000000 1.251000, 2.000000, 7.000000, 8.000000 1.289000, 2.000000, 7.000000, 8.000000 1.612000, 2.000000, 7.000000, 8.000000 1.190000, 2.000000, 7.000000, 8.000000 1.480000, 2.000000, 7.000000, 8.000000 1.597000, 2.000000, 7.000000, 8.000000 1.380000, 2.000000, 7.000000, 8.000000 1.567000, 2.000000, 7.000000, 8.000000 1.693000, 2.000000, 7.000000, 8.000000 1.563000, 2.000000, 7.000000, 8.000000 1.742000, 2.000000, 7.000000, 8.000000 1.662000, 2.000000, 7.000000, 8.000000 1.201000, 2.000000, 7.000000, 8.000000 1.433000, 2.000000, 7.000000, 8.000000 1.669000, 2.000000, 7.000000, 8.000000 1.411000, 2.000000, 7.000000, 8.000000 0.420000, 7.000000, 2.000000, 9.000000 0.436000, 7.000000, 2.000000, 9.000000 0.345000, 7.000000, 2.000000, 9.000000 0.546000, 7.000000, 2.000000, 9.000000 0.436000, 7.000000, 2.000000, 9.000000 0.462000, 7.000000, 2.000000, 9.000000 0.369000, 7.000000, 2.000000, 9.000000 0.442000, 7.000000, 2.000000, 9.000000 0.334000, 7.000000, 2.000000, 9.000000 0.450000, 7.000000, 2.000000, 9.000000 0.425000, 7.000000, 2.000000, 9.000000 0.463000, 7.000000, 2.000000, 9.000000 0.456000, 7.000000, 2.000000, 9.000000 0.494000, 7.000000, 2.000000, 9.000000 0.535000, 7.000000, 2.000000, 9.000000 0.406000, 7.000000, 2.000000, 9.000000 0.450000, 7.000000, 2.000000, 9.000000 0.458000, 7.000000, 2.000000, 9.000000 0.703000, 7.000000, 2.000000, 9.000000 0.453000, 7.000000, 2.000000, 9.000000 0.521000, 7.000000, 2.000000, 9.000000 0.568000, 7.000000, 2.000000, 9.000000 0.395000, 7.000000, 2.000000, 9.000000 0.511000, 7.000000, 2.000000, 9.000000 0.467000, 7.000000, 2.000000, 9.000000 0.493000, 7.000000, 2.000000, 9.000000 0.377000, 7.000000, 2.000000, 9.000000 0.427000, 7.000000, 2.000000, 9.000000 0.534000, 7.000000, 2.000000, 9.000000 0.409000, 7.000000, 2.000000, 9.000000 0.385000, 7.000000, 2.000000, 9.000000 0.511000, 7.000000, 2.000000, 9.000000 0.444000, 7.000000, 2.000000, 9.000000 0.491000, 7.000000, 2.000000, 9.000000 0.407000, 7.000000, 2.000000, 9.000000 0.360000, 7.000000, 2.000000, 9.000000 0.444000, 7.000000, 2.000000, 9.000000 0.501000, 7.000000, 2.000000, 9.000000 0.403000, 7.000000, 2.000000, 9.000000 0.428000, 7.000000, 2.000000, 9.000000 0.419000, 7.000000, 2.000000, 9.000000 0.342000, 7.000000, 2.000000, 9.000000 0.955000, 7.000000, 8.000000, 2.000000 1.092000, 7.000000, 8.000000, 2.000000 0.838000, 7.000000, 8.000000, 2.000000 0.957000, 7.000000, 8.000000, 2.000000 0.964000, 7.000000, 8.000000, 2.000000 1.008000, 7.000000, 8.000000, 2.000000 1.092000, 7.000000, 8.000000, 2.000000 0.967000, 7.000000, 8.000000, 2.000000 1.118000, 7.000000, 8.000000, 2.000000 1.030000, 7.000000, 8.000000, 2.000000 1.059000, 7.000000, 8.000000, 2.000000 1.173000, 7.000000, 8.000000, 2.000000 0.964000, 7.000000, 8.000000, 2.000000 1.232000, 7.000000, 8.000000, 2.000000 1.165000, 7.000000, 8.000000, 2.000000 1.073000, 7.000000, 8.000000, 2.000000 1.187000, 7.000000, 8.000000, 2.000000 1.045000, 7.000000, 8.000000, 2.000000 1.104000, 7.000000, 8.000000, 2.000000 1.196000, 7.000000, 8.000000, 2.000000 0.996000, 7.000000, 8.000000, 2.000000 1.128000, 7.000000, 8.000000, 2.000000 1.018000, 7.000000, 8.000000, 2.000000 1.007000, 7.000000, 8.000000, 2.000000 1.048000, 7.000000, 8.000000, 2.000000 0.911000, 7.000000, 8.000000, 2.000000 0.966000, 7.000000, 8.000000, 2.000000 1.066000, 7.000000, 8.000000, 2.000000 0.961000, 7.000000, 8.000000, 2.000000 1.014000, 7.000000, 8.000000, 2.000000 1.030000, 7.000000, 8.000000, 2.000000 1.008000, 7.000000, 8.000000, 2.000000 0.953000, 7.000000, 8.000000, 2.000000 0.885000, 7.000000, 8.000000, 2.000000 1.052000, 7.000000, 8.000000, 2.000000 1.050000, 7.000000, 8.000000, 2.000000 0.986000, 7.000000, 8.000000, 2.000000 0.988000, 7.000000, 8.000000, 2.000000 1.309000, 7.000000, 8.000000, 2.000000 1.384000, 7.000000, 8.000000, 2.000000 1.036000, 7.000000, 8.000000, 2.000000 1.032000, 7.000000, 8.000000, 2.000000 1.398000, 3.000000, 7.000000, 6.000000 1.322000, 3.000000, 7.000000, 6.000000 1.450000, 3.000000, 7.000000, 6.000000 1.361000, 3.000000, 7.000000, 6.000000 1.249000, 3.000000, 7.000000, 6.000000 1.399000, 3.000000, 7.000000, 6.000000 1.049000, 3.000000, 7.000000, 6.000000 1.308000, 3.000000, 7.000000, 6.000000 1.408000, 3.000000, 7.000000, 6.000000 1.226000, 3.000000, 7.000000, 6.000000 1.345000, 3.000000, 7.000000, 6.000000 1.387000, 3.000000, 7.000000, 6.000000 1.372000, 3.000000, 7.000000, 6.000000 1.408000, 3.000000, 7.000000, 6.000000 1.351000, 3.000000, 7.000000, 6.000000 1.330000, 3.000000, 7.000000, 6.000000 1.350000, 3.000000, 7.000000, 6.000000 1.221000, 3.000000, 7.000000, 6.000000 1.314000, 3.000000, 7.000000, 6.000000 1.285000, 3.000000, 7.000000, 6.000000 1.418000, 3.000000, 7.000000, 6.000000 1.576000, 3.000000, 7.000000, 6.000000 1.321000, 3.000000, 7.000000, 6.000000 1.422000, 3.000000, 7.000000, 6.000000 1.424000, 3.000000, 7.000000, 6.000000 1.245000, 3.000000, 7.000000, 6.000000 1.409000, 3.000000, 7.000000, 6.000000 1.401000, 3.000000, 7.000000, 6.000000 1.299000, 3.000000, 7.000000, 6.000000 1.473000, 3.000000, 7.000000, 6.000000 1.409000, 3.000000, 7.000000, 6.000000 1.212000, 3.000000, 7.000000, 6.000000 1.338000, 3.000000, 7.000000, 6.000000 1.372000, 3.000000, 7.000000, 6.000000 1.149000, 3.000000, 7.000000, 6.000000 1.430000, 3.000000, 7.000000, 6.000000 1.233000, 3.000000, 7.000000, 6.000000 1.377000, 3.000000, 7.000000, 6.000000 1.357000, 3.000000, 7.000000, 6.000000 1.348000, 3.000000, 7.000000, 6.000000 0.955000, 3.000000, 7.000000, 6.000000 1.098000, 3.000000, 7.000000, 6.000000 0.465000, 7.000000, 4.000000, 1.000000 0.386000, 7.000000, 4.000000, 1.000000 0.549000, 7.000000, 4.000000, 1.000000 0.466000, 7.000000, 4.000000, 1.000000 0.451000, 7.000000, 4.000000, 1.000000 0.455000, 7.000000, 4.000000, 1.000000 0.467000, 7.000000, 4.000000, 1.000000 0.533000, 7.000000, 4.000000, 1.000000 0.480000, 7.000000, 4.000000, 1.000000 0.449000, 7.000000, 4.000000, 1.000000 0.490000, 7.000000, 4.000000, 1.000000 0.468000, 7.000000, 4.000000, 1.000000 0.446000, 7.000000, 4.000000, 1.000000 0.514000, 7.000000, 4.000000, 1.000000 0.488000, 7.000000, 4.000000, 1.000000 0.464000, 7.000000, 4.000000, 1.000000 0.497000, 7.000000, 4.000000, 1.000000 0.480000, 7.000000, 4.000000, 1.000000 0.447000, 7.000000, 4.000000, 1.000000 0.521000, 7.000000, 4.000000, 1.000000 0.464000, 7.000000, 4.000000, 1.000000 0.496000, 7.000000, 4.000000, 1.000000 0.483000, 7.000000, 4.000000, 1.000000 0.429000, 7.000000, 4.000000, 1.000000 0.446000, 7.000000, 4.000000, 1.000000 0.449000, 7.000000, 4.000000, 1.000000 0.475000, 7.000000, 4.000000, 1.000000 0.470000, 7.000000, 4.000000, 1.000000 0.466000, 7.000000, 4.000000, 1.000000 0.436000, 7.000000, 4.000000, 1.000000 0.560000, 7.000000, 4.000000, 1.000000 0.428000, 7.000000, 4.000000, 1.000000 0.457000, 7.000000, 4.000000, 1.000000 0.443000, 7.000000, 4.000000, 1.000000 0.423000, 7.000000, 4.000000, 1.000000 0.453000, 7.000000, 4.000000, 1.000000 0.499000, 7.000000, 4.000000, 1.000000 0.491000, 7.000000, 4.000000, 1.000000 0.413000, 7.000000, 4.000000, 1.000000 0.433000, 7.000000, 4.000000, 1.000000 0.440000, 7.000000, 4.000000, 1.000000 0.447000, 7.000000, 4.000000, 1.000000 1.178000, 3.000000, 5.000000, 9.000000 1.125000, 3.000000, 5.000000, 9.000000 1.165000, 3.000000, 5.000000, 9.000000 1.082000, 3.000000, 5.000000, 9.000000 0.954000, 3.000000, 5.000000, 9.000000 0.876000, 3.000000, 5.000000, 9.000000 0.923000, 3.000000, 5.000000, 9.000000 1.087000, 3.000000, 5.000000, 9.000000 1.120000, 3.000000, 5.000000, 9.000000 1.068000, 3.000000, 5.000000, 9.000000 0.697000, 3.000000, 5.000000, 9.000000 1.114000, 3.000000, 5.000000, 9.000000 0.809000, 3.000000, 5.000000, 9.000000 1.085000, 3.000000, 5.000000, 9.000000 0.685000, 3.000000, 5.000000, 9.000000 0.814000, 3.000000, 5.000000, 9.000000 1.071000, 3.000000, 5.000000, 9.000000 0.717000, 3.000000, 5.000000, 9.000000 0.669000, 3.000000, 5.000000, 9.000000 0.720000, 3.000000, 5.000000, 9.000000 1.067000, 3.000000, 5.000000, 9.000000 1.208000, 3.000000, 5.000000, 9.000000 1.135000, 3.000000, 5.000000, 9.000000 1.076000, 3.000000, 5.000000, 9.000000 0.897000, 3.000000, 5.000000, 9.000000 1.085000, 3.000000, 5.000000, 9.000000 0.884000, 3.000000, 5.000000, 9.000000 1.121000, 3.000000, 5.000000, 9.000000 1.141000, 3.000000, 5.000000, 9.000000 1.092000, 3.000000, 5.000000, 9.000000 0.866000, 3.000000, 5.000000, 9.000000 0.746000, 3.000000, 5.000000, 9.000000 1.057000, 3.000000, 5.000000, 9.000000 1.127000, 3.000000, 5.000000, 9.000000 1.072000, 3.000000, 5.000000, 9.000000 0.816000, 3.000000, 5.000000, 9.000000 1.061000, 3.000000, 5.000000, 9.000000 1.050000, 3.000000, 5.000000, 9.000000 1.076000, 3.000000, 5.000000, 9.000000 1.100000, 3.000000, 5.000000, 9.000000 0.934000, 3.000000, 5.000000, 9.000000 0.914000, 3.000000, 5.000000, 9.000000 0.459000, 3.000000, 5.000000, 2.000000 0.520000, 3.000000, 5.000000, 2.000000 0.487000, 3.000000, 5.000000, 2.000000 0.495000, 3.000000, 5.000000, 2.000000 0.482000, 3.000000, 5.000000, 2.000000 0.503000, 3.000000, 5.000000, 2.000000 0.488000, 3.000000, 5.000000, 2.000000 0.562000, 3.000000, 5.000000, 2.000000 0.503000, 3.000000, 5.000000, 2.000000 0.496000, 3.000000, 5.000000, 2.000000 0.570000, 3.000000, 5.000000, 2.000000 0.502000, 3.000000, 5.000000, 2.000000 0.488000, 3.000000, 5.000000, 2.000000 0.608000, 3.000000, 5.000000, 2.000000 0.471000, 3.000000, 5.000000, 2.000000 0.602000, 3.000000, 5.000000, 2.000000 0.542000, 3.000000, 5.000000, 2.000000 0.484000, 3.000000, 5.000000, 2.000000 0.417000, 3.000000, 5.000000, 2.000000 0.506000, 3.000000, 5.000000, 2.000000 0.465000, 3.000000, 5.000000, 2.000000 0.591000, 3.000000, 5.000000, 2.000000 0.561000, 3.000000, 5.000000, 2.000000 0.515000, 3.000000, 5.000000, 2.000000 0.479000, 3.000000, 5.000000, 2.000000 0.505000, 3.000000, 5.000000, 2.000000 0.469000, 3.000000, 5.000000, 2.000000 0.347000, 3.000000, 5.000000, 2.000000 0.581000, 3.000000, 5.000000, 2.000000 0.457000, 3.000000, 5.000000, 2.000000 0.466000, 3.000000, 5.000000, 2.000000 0.542000, 3.000000, 5.000000, 2.000000 0.487000, 3.000000, 5.000000, 2.000000 0.366000, 3.000000, 5.000000, 2.000000 0.436000, 3.000000, 5.000000, 2.000000 0.482000, 3.000000, 5.000000, 2.000000 0.329000, 3.000000, 5.000000, 2.000000 0.441000, 3.000000, 5.000000, 2.000000 0.453000, 3.000000, 5.000000, 2.000000 0.410000, 3.000000, 5.000000, 2.000000 0.448000, 3.000000, 5.000000, 2.000000 0.442000, 3.000000, 5.000000, 2.000000 1.679000, 9.000000, 7.000000, 10.000000 2.330000, 9.000000, 7.000000, 10.000000 1.743000, 9.000000, 7.000000, 10.000000 1.731000, 9.000000, 7.000000, 10.000000 2.290000, 9.000000, 7.000000, 10.000000 1.796000, 9.000000, 7.000000, 10.000000 1.707000, 9.000000, 7.000000, 10.000000 2.153000, 9.000000, 7.000000, 10.000000 1.701000, 9.000000, 7.000000, 10.000000 2.221000, 9.000000, 7.000000, 10.000000 2.096000, 9.000000, 7.000000, 10.000000 2.336000, 9.000000, 7.000000, 10.000000 2.146000, 9.000000, 7.000000, 10.000000 1.731000, 9.000000, 7.000000, 10.000000 2.210000, 9.000000, 7.000000, 10.000000 1.650000, 9.000000, 7.000000, 10.000000 2.422000, 9.000000, 7.000000, 10.000000 1.920000, 9.000000, 7.000000, 10.000000 2.336000, 9.000000, 7.000000, 10.000000 2.095000, 9.000000, 7.000000, 10.000000 2.173000, 9.000000, 7.000000, 10.000000 2.138000, 9.000000, 7.000000, 10.000000 2.020000, 9.000000, 7.000000, 10.000000 1.945000, 9.000000, 7.000000, 10.000000 2.239000, 9.000000, 7.000000, 10.000000 1.865000, 9.000000, 7.000000, 10.000000 2.184000, 9.000000, 7.000000, 10.000000 2.116000, 9.000000, 7.000000, 10.000000 2.211000, 9.000000, 7.000000, 10.000000 1.847000, 9.000000, 7.000000, 10.000000 2.030000, 9.000000, 7.000000, 10.000000 2.346000, 9.000000, 7.000000, 10.000000 2.497000, 9.000000, 7.000000, 10.000000 2.510000, 9.000000, 7.000000, 10.000000 2.294000, 9.000000, 7.000000, 10.000000 2.353000, 9.000000, 7.000000, 10.000000 2.517000, 9.000000, 7.000000, 10.000000 2.307000, 9.000000, 7.000000, 10.000000 2.259000, 9.000000, 7.000000, 10.000000 2.089000, 9.000000, 7.000000, 10.000000 2.190000, 9.000000, 7.000000, 10.000000 1.871000, 9.000000, 7.000000, 10.000000 2.536000, 1.000000, 9.000000, 6.000000 1.880000, 1.000000, 9.000000, 6.000000 2.211000, 1.000000, 9.000000, 6.000000 1.821000, 1.000000, 9.000000, 6.000000 1.792000, 1.000000, 9.000000, 6.000000 2.414000, 1.000000, 9.000000, 6.000000 1.771000, 1.000000, 9.000000, 6.000000 1.792000, 1.000000, 9.000000, 6.000000 2.404000, 1.000000, 9.000000, 6.000000 1.795000, 1.000000, 9.000000, 6.000000 2.383000, 1.000000, 9.000000, 6.000000 1.917000, 1.000000, 9.000000, 6.000000 2.274000, 1.000000, 9.000000, 6.000000 2.344000, 1.000000, 9.000000, 6.000000 1.592000, 1.000000, 9.000000, 6.000000 1.628000, 1.000000, 9.000000, 6.000000 2.399000, 1.000000, 9.000000, 6.000000 1.657000, 1.000000, 9.000000, 6.000000 2.356000, 1.000000, 9.000000, 6.000000 1.657000, 1.000000, 9.000000, 6.000000 2.552000, 1.000000, 9.000000, 6.000000 1.636000, 1.000000, 9.000000, 6.000000 2.389000, 1.000000, 9.000000, 6.000000 1.618000, 1.000000, 9.000000, 6.000000 1.653000, 1.000000, 9.000000, 6.000000 2.476000, 1.000000, 9.000000, 6.000000 1.598000, 1.000000, 9.000000, 6.000000 1.647000, 1.000000, 9.000000, 6.000000 2.460000, 1.000000, 9.000000, 6.000000 1.593000, 1.000000, 9.000000, 6.000000 1.650000, 1.000000, 9.000000, 6.000000 2.284000, 1.000000, 9.000000, 6.000000 1.642000, 1.000000, 9.000000, 6.000000 1.621000, 1.000000, 9.000000, 6.000000 2.441000, 1.000000, 9.000000, 6.000000 1.637000, 1.000000, 9.000000, 6.000000 2.473000, 1.000000, 9.000000, 6.000000 1.602000, 1.000000, 9.000000, 6.000000 1.646000, 1.000000, 9.000000, 6.000000 2.284000, 1.000000, 9.000000, 6.000000 1.614000, 1.000000, 9.000000, 6.000000 1.620000, 1.000000, 9.000000, 6.000000 0.241000, 6.000000, 1.000000, 6.000000 0.372000, 6.000000, 1.000000, 6.000000 0.202000, 6.000000, 1.000000, 6.000000 0.222000, 6.000000, 1.000000, 6.000000 0.341000, 6.000000, 1.000000, 6.000000 0.170000, 6.000000, 1.000000, 6.000000 0.227000, 6.000000, 1.000000, 6.000000 0.338000, 6.000000, 1.000000, 6.000000 0.179000, 6.000000, 1.000000, 6.000000 0.227000, 6.000000, 1.000000, 6.000000 0.399000, 6.000000, 1.000000, 6.000000 0.189000, 6.000000, 1.000000, 6.000000 0.196000, 6.000000, 1.000000, 6.000000 0.191000, 6.000000, 1.000000, 6.000000 0.213000, 6.000000, 1.000000, 6.000000 0.282000, 6.000000, 1.000000, 6.000000 0.362000, 6.000000, 1.000000, 6.000000 0.350000, 6.000000, 1.000000, 6.000000 0.171000, 6.000000, 1.000000, 6.000000 0.234000, 6.000000, 1.000000, 6.000000 0.340000, 6.000000, 1.000000, 6.000000 0.209000, 6.000000, 1.000000, 6.000000 0.226000, 6.000000, 1.000000, 6.000000 0.340000, 6.000000, 1.000000, 6.000000 0.241000, 6.000000, 1.000000, 6.000000 0.313000, 6.000000, 1.000000, 6.000000 0.202000, 6.000000, 1.000000, 6.000000 0.235000, 6.000000, 1.000000, 6.000000 0.472000, 6.000000, 1.000000, 6.000000 0.170000, 6.000000, 1.000000, 6.000000 0.228000, 6.000000, 1.000000, 6.000000 0.357000, 6.000000, 1.000000, 6.000000 0.189000, 6.000000, 1.000000, 6.000000 0.189000, 6.000000, 1.000000, 6.000000 0.211000, 6.000000, 1.000000, 6.000000 0.189000, 6.000000, 1.000000, 6.000000 0.224000, 6.000000, 1.000000, 6.000000 0.321000, 6.000000, 1.000000, 6.000000 0.185000, 6.000000, 1.000000, 6.000000 0.226000, 6.000000, 1.000000, 6.000000 0.347000, 6.000000, 1.000000, 6.000000 0.217000, 6.000000, 1.000000, 6.000000 4.750000, 6.000000, 10.000000, 9.000000 3.281000, 6.000000, 10.000000, 9.000000 5.009000, 6.000000, 10.000000, 9.000000 3.320000, 6.000000, 10.000000, 9.000000 3.246000, 6.000000, 10.000000, 9.000000 5.181000, 6.000000, 10.000000, 9.000000 3.264000, 6.000000, 10.000000, 9.000000 4.548000, 6.000000, 10.000000, 9.000000 3.266000, 6.000000, 10.000000, 9.000000 4.732000, 6.000000, 10.000000, 9.000000 3.270000, 6.000000, 10.000000, 9.000000 5.188000, 6.000000, 10.000000, 9.000000 3.290000, 6.000000, 10.000000, 9.000000 4.882000, 6.000000, 10.000000, 9.000000 3.293000, 6.000000, 10.000000, 9.000000 5.173000, 6.000000, 10.000000, 9.000000 3.300000, 6.000000, 10.000000, 9.000000 3.258000, 6.000000, 10.000000, 9.000000 5.130000, 6.000000, 10.000000, 9.000000 3.247000, 6.000000, 10.000000, 9.000000 3.304000, 6.000000, 10.000000, 9.000000 4.678000, 6.000000, 10.000000, 9.000000 3.281000, 6.000000, 10.000000, 9.000000 4.766000, 6.000000, 10.000000, 9.000000 3.298000, 6.000000, 10.000000, 9.000000 3.287000, 6.000000, 10.000000, 9.000000 5.051000, 6.000000, 10.000000, 9.000000 3.280000, 6.000000, 10.000000, 9.000000 5.257000, 6.000000, 10.000000, 9.000000 3.289000, 6.000000, 10.000000, 9.000000 4.834000, 6.000000, 10.000000, 9.000000 3.299000, 6.000000, 10.000000, 9.000000 4.629000, 6.000000, 10.000000, 9.000000 3.265000, 6.000000, 10.000000, 9.000000 4.915000, 6.000000, 10.000000, 9.000000 3.256000, 6.000000, 10.000000, 9.000000 3.282000, 6.000000, 10.000000, 9.000000 5.059000, 6.000000, 10.000000, 9.000000 3.250000, 6.000000, 10.000000, 9.000000 3.281000, 6.000000, 10.000000, 9.000000 5.043000, 6.000000, 10.000000, 9.000000 3.236000, 6.000000, 10.000000, 9.000000 0.688000, 5.000000, 6.000000, 6.000000 1.074000, 5.000000, 6.000000, 6.000000 0.661000, 5.000000, 6.000000, 6.000000 0.691000, 5.000000, 6.000000, 6.000000 0.692000, 5.000000, 6.000000, 6.000000 1.025000, 5.000000, 6.000000, 6.000000 0.687000, 5.000000, 6.000000, 6.000000 0.646000, 5.000000, 6.000000, 6.000000 0.700000, 5.000000, 6.000000, 6.000000 1.062000, 5.000000, 6.000000, 6.000000 0.646000, 5.000000, 6.000000, 6.000000 0.714000, 5.000000, 6.000000, 6.000000 1.039000, 5.000000, 6.000000, 6.000000 0.692000, 5.000000, 6.000000, 6.000000 0.679000, 5.000000, 6.000000, 6.000000 0.688000, 5.000000, 6.000000, 6.000000 0.682000, 5.000000, 6.000000, 6.000000 0.706000, 5.000000, 6.000000, 6.000000 1.078000, 5.000000, 6.000000, 6.000000 0.647000, 5.000000, 6.000000, 6.000000 0.689000, 5.000000, 6.000000, 6.000000 1.067000, 5.000000, 6.000000, 6.000000 0.649000, 5.000000, 6.000000, 6.000000 0.711000, 5.000000, 6.000000, 6.000000 1.126000, 5.000000, 6.000000, 6.000000 0.682000, 5.000000, 6.000000, 6.000000 0.702000, 5.000000, 6.000000, 6.000000 1.054000, 5.000000, 6.000000, 6.000000 0.727000, 5.000000, 6.000000, 6.000000 0.973000, 5.000000, 6.000000, 6.000000 0.670000, 5.000000, 6.000000, 6.000000 0.661000, 5.000000, 6.000000, 6.000000 0.687000, 5.000000, 6.000000, 6.000000 1.057000, 5.000000, 6.000000, 6.000000 0.661000, 5.000000, 6.000000, 6.000000 0.694000, 5.000000, 6.000000, 6.000000 1.055000, 5.000000, 6.000000, 6.000000 0.674000, 5.000000, 6.000000, 6.000000 0.649000, 5.000000, 6.000000, 6.000000 0.646000, 5.000000, 6.000000, 6.000000 0.714000, 5.000000, 6.000000, 6.000000 1.044000, 5.000000, 6.000000, 6.000000 0.758000, 10.000000, 5.000000, 10.000000 0.811000, 10.000000, 5.000000, 10.000000 1.226000, 10.000000, 5.000000, 10.000000 0.750000, 10.000000, 5.000000, 10.000000 0.807000, 10.000000, 5.000000, 10.000000 1.208000, 10.000000, 5.000000, 10.000000 0.780000, 10.000000, 5.000000, 10.000000 0.805000, 10.000000, 5.000000, 10.000000 1.215000, 10.000000, 5.000000, 10.000000 0.748000, 10.000000, 5.000000, 10.000000 0.748000, 10.000000, 5.000000, 10.000000 0.795000, 10.000000, 5.000000, 10.000000 1.232000, 10.000000, 5.000000, 10.000000 0.750000, 10.000000, 5.000000, 10.000000 0.813000, 10.000000, 5.000000, 10.000000 1.232000, 10.000000, 5.000000, 10.000000 0.769000, 10.000000, 5.000000, 10.000000 0.797000, 10.000000, 5.000000, 10.000000 1.176000, 10.000000, 5.000000, 10.000000 0.766000, 10.000000, 5.000000, 10.000000 0.794000, 10.000000, 5.000000, 10.000000 1.220000, 10.000000, 5.000000, 10.000000 0.753000, 10.000000, 5.000000, 10.000000 0.764000, 10.000000, 5.000000, 10.000000 0.769000, 10.000000, 5.000000, 10.000000 0.804000, 10.000000, 5.000000, 10.000000 1.182000, 10.000000, 5.000000, 10.000000 0.770000, 10.000000, 5.000000, 10.000000 0.790000, 10.000000, 5.000000, 10.000000 0.770000, 10.000000, 5.000000, 10.000000 0.795000, 10.000000, 5.000000, 10.000000 1.129000, 10.000000, 5.000000, 10.000000 0.752000, 10.000000, 5.000000, 10.000000 0.748000, 10.000000, 5.000000, 10.000000 0.789000, 10.000000, 5.000000, 10.000000 1.198000, 10.000000, 5.000000, 10.000000 0.762000, 10.000000, 5.000000, 10.000000 0.795000, 10.000000, 5.000000, 10.000000 1.226000, 10.000000, 5.000000, 10.000000 0.803000, 10.000000, 5.000000, 10.000000 1.254000, 10.000000, 5.000000, 10.000000 0.766000, 10.000000, 5.000000, 10.000000 0.298000, 4.000000, 4.000000, 3.000000 0.455000, 4.000000, 4.000000, 3.000000 0.291000, 4.000000, 4.000000, 3.000000 0.311000, 4.000000, 4.000000, 3.000000 0.490000, 4.000000, 4.000000, 3.000000 0.314000, 4.000000, 4.000000, 3.000000 0.331000, 4.000000, 4.000000, 3.000000 0.480000, 4.000000, 4.000000, 3.000000 0.476000, 4.000000, 4.000000, 3.000000 0.432000, 4.000000, 4.000000, 3.000000 0.434000, 4.000000, 4.000000, 3.000000 0.439000, 4.000000, 4.000000, 3.000000 0.476000, 4.000000, 4.000000, 3.000000 0.509000, 4.000000, 4.000000, 3.000000 0.394000, 4.000000, 4.000000, 3.000000 0.441000, 4.000000, 4.000000, 3.000000 0.573000, 4.000000, 4.000000, 3.000000 0.445000, 4.000000, 4.000000, 3.000000 0.428000, 4.000000, 4.000000, 3.000000 0.450000, 4.000000, 4.000000, 3.000000 0.464000, 4.000000, 4.000000, 3.000000 0.487000, 4.000000, 4.000000, 3.000000 0.465000, 4.000000, 4.000000, 3.000000 0.384000, 4.000000, 4.000000, 3.000000 0.544000, 4.000000, 4.000000, 3.000000 0.470000, 4.000000, 4.000000, 3.000000 0.360000, 4.000000, 4.000000, 3.000000 0.521000, 4.000000, 4.000000, 3.000000 0.480000, 4.000000, 4.000000, 3.000000 0.358000, 4.000000, 4.000000, 3.000000 0.509000, 4.000000, 4.000000, 3.000000 0.377000, 4.000000, 4.000000, 3.000000 0.475000, 4.000000, 4.000000, 3.000000 0.529000, 4.000000, 4.000000, 3.000000 0.481000, 4.000000, 4.000000, 3.000000 0.340000, 4.000000, 4.000000, 3.000000 0.409000, 4.000000, 4.000000, 3.000000 0.455000, 4.000000, 4.000000, 3.000000 0.332000, 4.000000, 4.000000, 3.000000 0.477000, 4.000000, 4.000000, 3.000000 0.450000, 4.000000, 4.000000, 3.000000 0.438000, 4.000000, 4.000000, 3.000000 0.442000, 10.000000, 2.000000, 7.000000 0.461000, 10.000000, 2.000000, 7.000000 0.480000, 10.000000, 2.000000, 7.000000 0.536000, 10.000000, 2.000000, 7.000000 0.503000, 10.000000, 2.000000, 7.000000 0.537000, 10.000000, 2.000000, 7.000000 0.458000, 10.000000, 2.000000, 7.000000 0.515000, 10.000000, 2.000000, 7.000000 0.427000, 10.000000, 2.000000, 7.000000 0.504000, 10.000000, 2.000000, 7.000000 0.439000, 10.000000, 2.000000, 7.000000 0.482000, 10.000000, 2.000000, 7.000000 0.601000, 10.000000, 2.000000, 7.000000 0.457000, 10.000000, 2.000000, 7.000000 0.515000, 10.000000, 2.000000, 7.000000 0.455000, 10.000000, 2.000000, 7.000000 0.585000, 10.000000, 2.000000, 7.000000 0.451000, 10.000000, 2.000000, 7.000000 0.506000, 10.000000, 2.000000, 7.000000 0.437000, 10.000000, 2.000000, 7.000000 0.448000, 10.000000, 2.000000, 7.000000 0.439000, 10.000000, 2.000000, 7.000000 0.462000, 10.000000, 2.000000, 7.000000 0.426000, 10.000000, 2.000000, 7.000000 0.445000, 10.000000, 2.000000, 7.000000 0.543000, 10.000000, 2.000000, 7.000000 0.441000, 10.000000, 2.000000, 7.000000 0.490000, 10.000000, 2.000000, 7.000000 0.415000, 10.000000, 2.000000, 7.000000 0.519000, 10.000000, 2.000000, 7.000000 0.403000, 10.000000, 2.000000, 7.000000 0.453000, 10.000000, 2.000000, 7.000000 0.445000, 10.000000, 2.000000, 7.000000 0.531000, 10.000000, 2.000000, 7.000000 0.423000, 10.000000, 2.000000, 7.000000 0.461000, 10.000000, 2.000000, 7.000000 0.496000, 10.000000, 2.000000, 7.000000 0.444000, 10.000000, 2.000000, 7.000000 0.555000, 10.000000, 2.000000, 7.000000 0.411000, 10.000000, 2.000000, 7.000000 0.429000, 10.000000, 2.000000, 7.000000 0.572000, 10.000000, 2.000000, 7.000000 0.773000, 1.000000, 8.000000, 2.000000 0.698000, 1.000000, 8.000000, 2.000000 0.845000, 1.000000, 8.000000, 2.000000 0.787000, 1.000000, 8.000000, 2.000000 0.879000, 1.000000, 8.000000, 2.000000 0.862000, 1.000000, 8.000000, 2.000000 0.836000, 1.000000, 8.000000, 2.000000 0.763000, 1.000000, 8.000000, 2.000000 0.859000, 1.000000, 8.000000, 2.000000 0.792000, 1.000000, 8.000000, 2.000000 0.835000, 1.000000, 8.000000, 2.000000 0.860000, 1.000000, 8.000000, 2.000000 0.953000, 1.000000, 8.000000, 2.000000 0.760000, 1.000000, 8.000000, 2.000000 0.788000, 1.000000, 8.000000, 2.000000 0.863000, 1.000000, 8.000000, 2.000000 0.820000, 1.000000, 8.000000, 2.000000 0.858000, 1.000000, 8.000000, 2.000000 0.736000, 1.000000, 8.000000, 2.000000 0.894000, 1.000000, 8.000000, 2.000000 0.823000, 1.000000, 8.000000, 2.000000 0.721000, 1.000000, 8.000000, 2.000000 0.806000, 1.000000, 8.000000, 2.000000 0.852000, 1.000000, 8.000000, 2.000000 0.708000, 1.000000, 8.000000, 2.000000 0.748000, 1.000000, 8.000000, 2.000000 0.778000, 1.000000, 8.000000, 2.000000 0.866000, 1.000000, 8.000000, 2.000000 0.643000, 1.000000, 8.000000, 2.000000 0.786000, 1.000000, 8.000000, 2.000000 0.824000, 1.000000, 8.000000, 2.000000 0.640000, 1.000000, 8.000000, 2.000000 0.726000, 1.000000, 8.000000, 2.000000 0.840000, 1.000000, 8.000000, 2.000000 0.743000, 1.000000, 8.000000, 2.000000 0.845000, 1.000000, 8.000000, 2.000000 0.840000, 1.000000, 8.000000, 2.000000 0.810000, 1.000000, 8.000000, 2.000000 0.846000, 1.000000, 8.000000, 2.000000 0.710000, 1.000000, 8.000000, 2.000000 0.711000, 1.000000, 8.000000, 2.000000 0.876000, 1.000000, 8.000000, 2.000000 0.415000, 6.000000, 3.000000, 1.000000 0.392000, 6.000000, 3.000000, 1.000000 0.430000, 6.000000, 3.000000, 1.000000 0.283000, 6.000000, 3.000000, 1.000000 0.406000, 6.000000, 3.000000, 1.000000 0.238000, 6.000000, 3.000000, 1.000000 0.280000, 6.000000, 3.000000, 1.000000 0.388000, 6.000000, 3.000000, 1.000000 0.247000, 6.000000, 3.000000, 1.000000 0.283000, 6.000000, 3.000000, 1.000000 0.404000, 6.000000, 3.000000, 1.000000 0.266000, 6.000000, 3.000000, 1.000000 0.229000, 6.000000, 3.000000, 1.000000 0.264000, 6.000000, 3.000000, 1.000000 0.343000, 6.000000, 3.000000, 1.000000 0.287000, 6.000000, 3.000000, 1.000000 0.361000, 6.000000, 3.000000, 1.000000 0.237000, 6.000000, 3.000000, 1.000000 0.281000, 6.000000, 3.000000, 1.000000 0.404000, 6.000000, 3.000000, 1.000000 0.250000, 6.000000, 3.000000, 1.000000 0.277000, 6.000000, 3.000000, 1.000000 0.406000, 6.000000, 3.000000, 1.000000 0.208000, 6.000000, 3.000000, 1.000000 0.284000, 6.000000, 3.000000, 1.000000 0.407000, 6.000000, 3.000000, 1.000000 0.279000, 6.000000, 3.000000, 1.000000 0.253000, 6.000000, 3.000000, 1.000000 0.406000, 6.000000, 3.000000, 1.000000 0.279000, 6.000000, 3.000000, 1.000000 0.379000, 6.000000, 3.000000, 1.000000 0.292000, 6.000000, 3.000000, 1.000000 0.378000, 6.000000, 3.000000, 1.000000 0.279000, 6.000000, 3.000000, 1.000000 0.386000, 6.000000, 3.000000, 1.000000 0.293000, 6.000000, 3.000000, 1.000000 0.387000, 6.000000, 3.000000, 1.000000 0.250000, 6.000000, 3.000000, 1.000000 0.276000, 6.000000, 3.000000, 1.000000 0.424000, 6.000000, 3.000000, 1.000000 0.223000, 6.000000, 3.000000, 1.000000 0.262000, 6.000000, 3.000000, 1.000000 0.287000, 7.000000, 3.000000, 3.000000 0.316000, 7.000000, 3.000000, 3.000000 0.489000, 7.000000, 3.000000, 3.000000 0.281000, 7.000000, 3.000000, 3.000000 0.358000, 7.000000, 3.000000, 3.000000 0.456000, 7.000000, 3.000000, 3.000000 0.253000, 7.000000, 3.000000, 3.000000 0.295000, 7.000000, 3.000000, 3.000000 0.258000, 7.000000, 3.000000, 3.000000 0.302000, 7.000000, 3.000000, 3.000000 0.486000, 7.000000, 3.000000, 3.000000 0.330000, 7.000000, 3.000000, 3.000000 0.337000, 7.000000, 3.000000, 3.000000 0.461000, 7.000000, 3.000000, 3.000000 0.258000, 7.000000, 3.000000, 3.000000 0.307000, 7.000000, 3.000000, 3.000000 0.451000, 7.000000, 3.000000, 3.000000 0.282000, 7.000000, 3.000000, 3.000000 0.270000, 7.000000, 3.000000, 3.000000 0.315000, 7.000000, 3.000000, 3.000000 0.430000, 7.000000, 3.000000, 3.000000 0.256000, 7.000000, 3.000000, 3.000000 0.341000, 7.000000, 3.000000, 3.000000 0.473000, 7.000000, 3.000000, 3.000000 0.253000, 7.000000, 3.000000, 3.000000 0.323000, 7.000000, 3.000000, 3.000000 0.446000, 7.000000, 3.000000, 3.000000 0.257000, 7.000000, 3.000000, 3.000000 0.349000, 7.000000, 3.000000, 3.000000 0.425000, 7.000000, 3.000000, 3.000000 0.327000, 7.000000, 3.000000, 3.000000 0.322000, 7.000000, 3.000000, 3.000000 0.408000, 7.000000, 3.000000, 3.000000 0.322000, 7.000000, 3.000000, 3.000000 0.399000, 7.000000, 3.000000, 3.000000 0.271000, 7.000000, 3.000000, 3.000000 0.434000, 7.000000, 3.000000, 3.000000 0.276000, 7.000000, 3.000000, 3.000000 0.340000, 7.000000, 3.000000, 3.000000 0.411000, 7.000000, 3.000000, 3.000000 5.125000, 9.000000, 10.000000, 9.000000 0.307000, 7.000000, 3.000000, 3.000000 0.301000, 7.000000, 3.000000, 3.000000 5.368000, 9.000000, 10.000000, 9.000000 3.378000, 9.000000, 10.000000, 9.000000 3.406000, 9.000000, 10.000000, 9.000000 5.017000, 9.000000, 10.000000, 9.000000 3.472000, 9.000000, 10.000000, 9.000000 3.432000, 9.000000, 10.000000, 9.000000 5.309000, 9.000000, 10.000000, 9.000000 3.419000, 9.000000, 10.000000, 9.000000 5.282000, 9.000000, 10.000000, 9.000000 5.424000, 9.000000, 10.000000, 9.000000 3.427000, 9.000000, 10.000000, 9.000000 3.431000, 9.000000, 10.000000, 9.000000 5.356000, 9.000000, 10.000000, 9.000000 3.426000, 9.000000, 10.000000, 9.000000 4.954000, 9.000000, 10.000000, 9.000000 3.465000, 9.000000, 10.000000, 9.000000 5.028000, 9.000000, 10.000000, 9.000000 3.413000, 9.000000, 10.000000, 9.000000 3.448000, 9.000000, 10.000000, 9.000000 5.344000, 9.000000, 10.000000, 9.000000 3.424000, 9.000000, 10.000000, 9.000000 3.450000, 9.000000, 10.000000, 9.000000 5.401000, 9.000000, 10.000000, 9.000000 3.433000, 9.000000, 10.000000, 9.000000 5.119000, 9.000000, 10.000000, 9.000000 3.407000, 9.000000, 10.000000, 9.000000 3.418000, 9.000000, 10.000000, 9.000000 5.321000, 9.000000, 10.000000, 9.000000 3.431000, 9.000000, 10.000000, 9.000000 5.465000, 9.000000, 10.000000, 9.000000 3.433000, 9.000000, 10.000000, 9.000000 5.473000, 9.000000, 10.000000, 9.000000 3.419000, 9.000000, 10.000000, 9.000000 5.302000, 9.000000, 10.000000, 9.000000 3.435000, 9.000000, 10.000000, 9.000000 5.428000, 9.000000, 10.000000, 9.000000 3.422000, 9.000000, 10.000000, 9.000000 3.425000, 9.000000, 10.000000, 9.000000 5.529000, 9.000000, 10.000000, 9.000000 3.383000, 9.000000, 10.000000, 9.000000 3.436000, 9.000000, 10.000000, 9.000000 1.000000, 10.000000, 6.000000, 4.000000 0.657000, 10.000000, 6.000000, 4.000000 0.748000, 10.000000, 6.000000, 4.000000 1.059000, 10.000000, 6.000000, 4.000000 0.658000, 10.000000, 6.000000, 4.000000 0.718000, 10.000000, 6.000000, 4.000000 1.066000, 10.000000, 6.000000, 4.000000 0.660000, 10.000000, 6.000000, 4.000000 0.697000, 10.000000, 6.000000, 4.000000 1.040000, 10.000000, 6.000000, 4.000000 0.660000, 10.000000, 6.000000, 4.000000 0.755000, 10.000000, 6.000000, 4.000000 1.084000, 10.000000, 6.000000, 4.000000 0.655000, 10.000000, 6.000000, 4.000000 0.714000, 10.000000, 6.000000, 4.000000 1.024000, 10.000000, 6.000000, 4.000000 0.674000, 10.000000, 6.000000, 4.000000 0.772000, 10.000000, 6.000000, 4.000000 1.032000, 10.000000, 6.000000, 4.000000 0.677000, 10.000000, 6.000000, 4.000000 0.662000, 10.000000, 6.000000, 4.000000 0.736000, 10.000000, 6.000000, 4.000000 1.037000, 10.000000, 6.000000, 4.000000 0.693000, 10.000000, 6.000000, 4.000000 0.742000, 10.000000, 6.000000, 4.000000 1.064000, 10.000000, 6.000000, 4.000000 0.654000, 10.000000, 6.000000, 4.000000 0.662000, 10.000000, 6.000000, 4.000000 0.728000, 10.000000, 6.000000, 4.000000 1.067000, 10.000000, 6.000000, 4.000000 0.657000, 10.000000, 6.000000, 4.000000 0.724000, 10.000000, 6.000000, 4.000000 1.066000, 10.000000, 6.000000, 4.000000 0.651000, 10.000000, 6.000000, 4.000000 0.705000, 10.000000, 6.000000, 4.000000 0.985000, 10.000000, 6.000000, 4.000000 0.660000, 10.000000, 6.000000, 4.000000 0.712000, 10.000000, 6.000000, 4.000000 1.095000, 10.000000, 6.000000, 4.000000 0.663000, 10.000000, 6.000000, 4.000000 0.717000, 10.000000, 6.000000, 4.000000 1.080000, 10.000000, 6.000000, 4.000000 0.195000, 2.000000, 1.000000, 1.000000 0.230000, 2.000000, 1.000000, 1.000000 0.323000, 2.000000, 1.000000, 1.000000 0.181000, 2.000000, 1.000000, 1.000000 0.216000, 2.000000, 1.000000, 1.000000 0.328000, 2.000000, 1.000000, 1.000000 0.173000, 2.000000, 1.000000, 1.000000 0.230000, 2.000000, 1.000000, 1.000000 0.294000, 2.000000, 1.000000, 1.000000 0.200000, 2.000000, 1.000000, 1.000000 0.206000, 2.000000, 1.000000, 1.000000 0.295000, 2.000000, 1.000000, 1.000000 0.221000, 2.000000, 1.000000, 1.000000 0.272000, 2.000000, 1.000000, 1.000000 0.157000, 2.000000, 1.000000, 1.000000 0.240000, 2.000000, 1.000000, 1.000000 0.309000, 2.000000, 1.000000, 1.000000 0.226000, 2.000000, 1.000000, 1.000000 0.306000, 2.000000, 1.000000, 1.000000 0.217000, 2.000000, 1.000000, 1.000000 0.308000, 2.000000, 1.000000, 1.000000 0.200000, 2.000000, 1.000000, 1.000000 0.221000, 2.000000, 1.000000, 1.000000 0.353000, 2.000000, 1.000000, 1.000000 0.156000, 2.000000, 1.000000, 1.000000 0.220000, 2.000000, 1.000000, 1.000000 0.318000, 2.000000, 1.000000, 1.000000 0.217000, 2.000000, 1.000000, 1.000000 0.217000, 2.000000, 1.000000, 1.000000 0.302000, 2.000000, 1.000000, 1.000000 0.205000, 2.000000, 1.000000, 1.000000 0.220000, 2.000000, 1.000000, 1.000000 0.338000, 2.000000, 1.000000, 1.000000 0.241000, 2.000000, 1.000000, 1.000000 0.310000, 2.000000, 1.000000, 1.000000 0.195000, 2.000000, 1.000000, 1.000000 0.266000, 2.000000, 1.000000, 1.000000 0.357000, 2.000000, 1.000000, 1.000000 0.234000, 2.000000, 1.000000, 1.000000 0.335000, 2.000000, 1.000000, 1.000000 0.221000, 2.000000, 1.000000, 1.000000 0.239000, 2.000000, 1.000000, 1.000000 0.698000, 2.000000, 7.000000, 2.000000 0.492000, 2.000000, 7.000000, 2.000000 0.401000, 2.000000, 7.000000, 2.000000 0.458000, 2.000000, 7.000000, 2.000000 0.715000, 2.000000, 7.000000, 2.000000 0.403000, 2.000000, 7.000000, 2.000000 0.469000, 2.000000, 7.000000, 2.000000 0.703000, 2.000000, 7.000000, 2.000000 0.466000, 2.000000, 7.000000, 2.000000 0.721000, 2.000000, 7.000000, 2.000000 0.401000, 2.000000, 7.000000, 2.000000 0.482000, 2.000000, 7.000000, 2.000000 0.705000, 2.000000, 7.000000, 2.000000 0.404000, 2.000000, 7.000000, 2.000000 0.463000, 2.000000, 7.000000, 2.000000 0.706000, 2.000000, 7.000000, 2.000000 0.401000, 2.000000, 7.000000, 2.000000 0.456000, 2.000000, 7.000000, 2.000000 0.684000, 2.000000, 7.000000, 2.000000 0.400000, 2.000000, 7.000000, 2.000000 0.468000, 2.000000, 7.000000, 2.000000 0.659000, 2.000000, 7.000000, 2.000000 0.442000, 2.000000, 7.000000, 2.000000 0.419000, 2.000000, 7.000000, 2.000000 0.479000, 2.000000, 7.000000, 2.000000 0.448000, 2.000000, 7.000000, 2.000000 0.694000, 2.000000, 7.000000, 2.000000 0.472000, 2.000000, 7.000000, 2.000000 0.666000, 2.000000, 7.000000, 2.000000 0.440000, 2.000000, 7.000000, 2.000000 0.404000, 2.000000, 7.000000, 2.000000 0.471000, 2.000000, 7.000000, 2.000000 0.679000, 2.000000, 7.000000, 2.000000 0.429000, 2.000000, 7.000000, 2.000000 0.468000, 2.000000, 7.000000, 2.000000 0.707000, 2.000000, 7.000000, 2.000000 0.401000, 2.000000, 7.000000, 2.000000 0.493000, 2.000000, 7.000000, 2.000000 0.711000, 2.000000, 7.000000, 2.000000 0.423000, 2.000000, 7.000000, 2.000000 0.462000, 2.000000, 7.000000, 2.000000 0.655000, 2.000000, 7.000000, 2.000000 0.660000, 10.000000, 6.000000, 4.000000 0.734000, 10.000000, 6.000000, 4.000000 1.087000, 10.000000, 6.000000, 4.000000 0.664000, 10.000000, 6.000000, 4.000000 0.718000, 10.000000, 6.000000, 4.000000 1.057000, 10.000000, 6.000000, 4.000000 0.650000, 10.000000, 6.000000, 4.000000 0.723000, 10.000000, 6.000000, 4.000000 1.042000, 10.000000, 6.000000, 4.000000 0.679000, 10.000000, 6.000000, 4.000000 0.694000, 10.000000, 6.000000, 4.000000 1.084000, 10.000000, 6.000000, 4.000000 0.656000, 10.000000, 6.000000, 4.000000 0.652000, 10.000000, 6.000000, 4.000000 0.705000, 10.000000, 6.000000, 4.000000 1.108000, 10.000000, 6.000000, 4.000000 0.673000, 10.000000, 6.000000, 4.000000 0.710000, 10.000000, 6.000000, 4.000000 1.017000, 10.000000, 6.000000, 4.000000 0.676000, 10.000000, 6.000000, 4.000000 0.725000, 10.000000, 6.000000, 4.000000 1.117000, 10.000000, 6.000000, 4.000000 0.653000, 10.000000, 6.000000, 4.000000 0.723000, 10.000000, 6.000000, 4.000000 1.047000, 10.000000, 6.000000, 4.000000 0.680000, 10.000000, 6.000000, 4.000000 0.727000, 10.000000, 6.000000, 4.000000 1.086000, 10.000000, 6.000000, 4.000000 0.674000, 10.000000, 6.000000, 4.000000 0.770000, 10.000000, 6.000000, 4.000000 0.964000, 10.000000, 6.000000, 4.000000 0.696000, 10.000000, 6.000000, 4.000000 0.727000, 10.000000, 6.000000, 4.000000 1.025000, 10.000000, 6.000000, 4.000000 0.701000, 10.000000, 6.000000, 4.000000 0.685000, 10.000000, 6.000000, 4.000000 1.063000, 10.000000, 6.000000, 4.000000 0.716000, 10.000000, 6.000000, 4.000000 1.109000, 10.000000, 6.000000, 4.000000 0.771000, 10.000000, 6.000000, 4.000000 1.713000, 10.000000, 6.000000, 4.000000 3.440000, 10.000000, 6.000000, 4.000000starpu-1.3.9+dfsg/tools/starpu_calibrate_bus.1000066400000000000000000000007651413463044200214110ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_CALIBRATE_BUS "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_calibrate_bus \- Force StarPU bus calibration .SH SYNOPSIS .B starpu_calibrate_bus [\fI\,OPTION\/\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.3.9+dfsg/tools/starpu_calibrate_bus.c000066400000000000000000000036311413463044200214660ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tools/starpu_codelet_histo_profile000077500000000000000000000042201413463044200230110ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9" 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.3.9+dfsg/tools/starpu_codelet_histo_profile.in000077500000000000000000000042421413463044200234220ustar00rootroot00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9" 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.3.9+dfsg/tools/starpu_codelet_profile.1000066400000000000000000000010561413463044200217430ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_CODELET_PROFILE "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_codelet_profile \- Draw StarPU codelet profile .SH SYNOPSIS .B starpu_codelet_profile \fI\,distrib.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.3.9+dfsg/tools/starpu_codelet_profile.in000077500000000000000000000042141413463044200222130ustar00rootroot00000000000000#!@REALBASH@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.3.9+dfsg/tools/starpu_env000077500000000000000000000035761413463044200172510ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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=starpu_env usage() { echo "Tool to set StarPU environment variables" echo "" echo "Usage: source $PROGNAME" echo "" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to " } if [ "$1" = "-v" ] || [ "$1" = "--version" ] then echo "$PROGNAME (StarPU) 1.3.9" elif [ "$1" = "-h" ] || [ "$1" = "--help" ] then usage else prefix=$(realpath /mnt/scratch/buildbot/starpu//conan-starpu-1_3_9-release-tarball/install) exec_prefix=$(realpath ${prefix}) starpu_bindir=$(realpath ${exec_prefix}/bin) starpu_libdir=$(realpath ${exec_prefix}/lib) starpu_datarootdir=$(realpath ${prefix}/share) if test -f $starpu_bindir/starpu_machine_display -a -f $starpu_libdir/pkgconfig/libstarpu.pc then echo "Setting StarPU environment for $prefix" export PKG_CONFIG_PATH=$starpu_libdir/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=$starpu_libdir:$LD_LIBRARY_PATH export PATH=$starpu_bindir:$PATH export MANPATH=$starpu_datarootdir/man:$MANPATH else echo "[Error] $prefix is not a valid StarPU installation directory" fi fi starpu-1.3.9+dfsg/tools/starpu_env.1000066400000000000000000000007501413463044200173740ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_ENV "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_env \- Set StarPU environment variables .SH SYNOPSIS .B source \fI\,starpu_env\/\fR .SH DESCRIPTION Tool to set StarPU environment variables .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.3.9+dfsg/tools/starpu_env.in000077500000000000000000000034761413463044200176550ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2020-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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=starpu_env usage() { echo "Tool to set StarPU environment variables" echo "" echo "Usage: source $PROGNAME" echo "" 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@>" } if [ "$1" = "-v" ] || [ "$1" = "--version" ] then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" elif [ "$1" = "-h" ] || [ "$1" = "--help" ] then usage else prefix=$(realpath @prefix@) exec_prefix=$(realpath @exec_prefix@) starpu_bindir=$(realpath @bindir@) starpu_libdir=$(realpath @libdir@) starpu_datarootdir=$(realpath @datarootdir@) if test -f $starpu_bindir/starpu_machine_display -a -f $starpu_libdir/pkgconfig/libstarpu.pc then echo "Setting StarPU environment for $prefix" export PKG_CONFIG_PATH=$starpu_libdir/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=$starpu_libdir:$LD_LIBRARY_PATH export PATH=$starpu_bindir:$PATH export MANPATH=$starpu_datarootdir/man:$MANPATH else echo "[Error] $prefix is not a valid StarPU installation directory" fi fi starpu-1.3.9+dfsg/tools/starpu_fxt_data_trace.c000066400000000000000000000105351413463044200216400ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2013 Joris Pablo * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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(); exit(EXIT_FAILURE); } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_FAILURE); } } 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]; const char *file_name = "data_trace.gp"; FILE *plt = fopen(file_name, "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"); if(fclose(codelet_list)) { perror("close failed :"); exit(-1); } if(fclose(plt)) { perror("close failed :"); exit(-1); } struct stat sb; int ret = stat(file_name, &sb); if (ret) { perror("stat"); STARPU_ABORT(); } /* Make the gnuplot scrit executable for the owner */ ret = chmod(file_name, sb.st_mode|S_IXUSR #ifdef S_IXGRP |S_IXGRP #endif #ifdef S_IXOTH |S_IXOTH #endif ); if (ret) { perror("chmod"); STARPU_ABORT(); } fprintf(stdout, "Gnuplot file has been successfully created.\n"); } 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(); return 0; } starpu-1.3.9+dfsg/tools/starpu_fxt_stats.c000066400000000000000000000104251413463044200207050ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.3.9+dfsg/tools/starpu_fxt_tool.c000066400000000000000000000123301413463044200205210ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2008-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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, " -no-smooth avoid smoothing values for gflops etc.\n"); fprintf(stderr, " -no-acquire do not show application data acquisitions tasks in DAG\n"); fprintf(stderr, " -label-deps add label on dependencies.\n"); fprintf(stderr, " -memory-states show detailed memory states of handles\n"); fprintf(stderr, " -internal show StarPU-internal tasks in DAG\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) { free(options.out_paje_path); options.out_paje_path = strdup(argv[++i]); reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-d") == 0) { options.dir = 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], "-no-smooth") == 0) { options.no_smooth = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-no-acquire") == 0) { options.no_acquire = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-memory-states") == 0) { options.memory_states = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-internal") == 0) { options.internal = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-label-deps") == 0) { options.label_deps = 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; } starpu_fxt_options_set_dir(&options); return 0; } int main(int argc, char **argv) { int ret = parse_args(argc, argv); if (ret) return ret; starpu_fxt_generate_trace(&options); starpu_fxt_options_shutdown(&options); return 0; } starpu-1.3.9+dfsg/tools/starpu_lp2paje.1000066400000000000000000000006341413463044200201420ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_LP2PAJE "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_lp2paje \- Convert lp StarPU schedule into Paje format .SH SYNOPSIS .B lp_solve \fI\,file.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.3.9+dfsg/tools/starpu_lp2paje.c000066400000000000000000000103051413463044200202200ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tools/starpu_machine_display.1000066400000000000000000000013641413463044200217370ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_MACHINE_DISPLAY "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_machine_display \- Display machine StarPU information .SH SYNOPSIS .B starpu_machine_display [\fI\,OPTION\/\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.3.9+dfsg/tools/starpu_machine_display.c000066400000000000000000000102621413463044200220160ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_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; } fprintf(stdout, "StarPU has found :\n"); starpu_worker_display_names(stdout, STARPU_CPU_WORKER); starpu_worker_display_names(stdout, STARPU_CUDA_WORKER); starpu_worker_display_names(stdout, STARPU_OPENCL_WORKER); #ifdef STARPU_USE_MIC starpu_worker_display_names(stdout, STARPU_MIC_WORKER); #endif #ifdef STARPU_USE_MPI_MASTER_SLAVE starpu_worker_display_names(stdout, STARPU_MPI_MS_WORKER); #endif display_all_combined_workers(); if (ret != -ENODEV) { fprintf(stdout, "\ntopology ... (hwloc logical indexes)\n"); starpu_topology_print(stdout); fprintf(stdout, "\nbandwidth (MB/s) and latency (us)...\n"); starpu_bus_print_bandwidth(stdout); starpu_shutdown(); } return 0; } starpu-1.3.9+dfsg/tools/starpu_mlr_analysis000077500000000000000000000041521413463044200211450ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 SOURCE_DIR=$(dirname $0) outputfile="mlr_analysis.html" analysis_script="$SOURCE_DIR/starpu_mlr_analysis.Rmd" # Command line arguments inputfile="" help_script() { cat << EOF Give an example of the trace analysis for computing multiple linear regression model Options: -h Show this message Examples: $0 .starpu/sampling/codelets/tmp/test_mlr.out Report bugs to EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.3.9" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; 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)) inputfile=$1 # Error if there is more than one input file if [[ $# < 1 || $# > 1 ]]; then echo "Error!" help_script exit 2 fi if [ ! -s $inputfile ] then echo "Error: file $inputfile does not exist!" exit 5 fi ##################################### # Running analysis file to get actual results in="$(cd "$(dirname "$inputfile")"; pwd)/$(basename "$inputfile")" Rscript -e "library(knitr); input_trace = '$in' ; outputhtml='$outputfile';\ outputRmd = gsub('.html\$','.Rmd',outputhtml);\ knit('$analysis_script',output=outputRmd); knitr::knit2html(outputRmd)" starpu-1.3.9+dfsg/tools/starpu_mlr_analysis.Rmd000066400000000000000000000230111413463044200216560ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 Setup, echo=FALSE} opts_chunk$set(echo=FALSE) ``` ```{r Load_R_files_and_functions} print_codelet <- function(reg,codelet){ cat(paste("/* ############################################ */", "\n")) cat(paste("/*\t Automatically generated code */", "\n")) cat(paste("\t Check for potential errors and be sure parameter value are written in good order (alphabetical one by default)", "\n")) cat(paste("\t Adjusted R-squared: ", summary(reg)$adj.r.squared, "*/\n\n")) ncomb <- reg$rank - 1 cat(paste("\t ", codelet, ".model->ncombinations = ", ncomb, ";\n", sep="")) cat(paste("\t ", codelet, ".model->combinations = (unsigned **) malloc(", codelet, ".model->ncombinations*sizeof(unsigned *))", ";\n\n", sep="")) cat(paste("\t if (", codelet, ".model->combinations)", "\n", "\t {\n", sep="")) cat(paste("\t for (unsigned i = 0; i < ", codelet, ".model->ncombinations; i++)", "\n", "\t {\n", sep="")) cat(paste("\t ", codelet, ".model->combinations[i] = (unsigned *) malloc(", codelet, ".model->nparameters*sizeof(unsigned))", ";\n", "\t }\n", "\t }\n\n", sep="")) # Computing combinations df <- data.frame(attr(reg$terms, "factors")) df <- df/2 df$Params <- row.names(df) df <-df[c(2:nrow(df)),] i=1 options(warn=-1) for(i in (1:nrow(df))) { name <- df[i,]$Params if (grepl("I\\(*", name)) { exp <- as.numeric(gsub("(.*?)\\^(.*?)\\)", "\\2", name)) df[i,] <- as.numeric(df[i,]) * exp df[i,]$Params <- as.character(gsub("I\\((.*?)\\^(.*?)\\)", "\\1", name)) } } df <- aggregate(. ~ Params, transform(df, Params), sum) options(warn=0) i=1 j=1 for(j in (2:length(df))) { for(i in (1:nrow(df))) { cat(paste("\t ", codelet, ".model->combinations[", j-2, "][", i-1, "] = ", as.numeric(df[i,j]), ";\n", sep="")) } } cat(paste("/* ############################################ */", "\n")) } df<-read.csv(input_trace, header=TRUE) opts_chunk$set(echo=TRUE) ``` # Multiple Linear Regression Model Example ## Introduction This document demonstrates the type of the analysis needed to compute the multiple linear regression model of the task. It relies on the input data benchmarked by the StarPU (or any other tool, but following the same format). The input data used in this example is generated by the task "mlr_init", from the "examples/mlr/mlr.c". This document can be used as an template for the analysis of any other task. ### How to compile ./starpu_mlr_analysis .starpu/sampling/codelets/tmp/mlr_init.out ### Software dependencies In order to run the analysis you need to have R installed: sudo apt-get install r-base In order to compile this document, you need *knitr* (although you can perfectly only use the R code from this document without knitr). If you decided that you want to generate this document, then start R (e.g., from terminal) and install knitr package: R> install.packages("knitr") No additional R packages are needed. ## First glimpse at the data First, we show the relations between all parameters in a single plot. ```{r InitPlot} plot(df) ``` For this example, all three parameters M, N, K have some influence, but their relation is not easy to understand. In general, this type of plots can typically show if there are outliers. It can also show if there is a group of parameters which are mutually perfectly correlated, in which case only a one parameter from the group should be kept for the further analysis. Additionally, plot can show the parameters that have a constant value, and since these cannot have an influence on the model, they should also be ignored. However, making conclusions based solely on the visual analysis can be treacherous and it is better to rely on the statistical tools. The multiple linear regression methods used in the following sections will also be able to detect and ignore these irrelevant parameters. Therefore, this initial visual look should only be used to get a basic idea about the model, but all the parameters should be kept for now. ## Initial model At this point, an initial model is computed, using all the parameters, but not taking into account their exponents or the relations between them. ```{r Model1} model1 <- lm(data=df, Duration ~ M+N+K) summary(model1) ``` For each parameter and the constant in the first column, an estimation of the corresponding coefficient is provided along with the 95% confidence interval. If there are any parameters with NA value, which suggests that the parameters are correlated to another parameter or that their value is constant, these parameters should not be used in the following model computations. The stars in the last column indicate the significance of each parameter. However, having maximum three stars for each parameter does not necessarily mean that the model is perfect and we should always inspect the adjusted R^2 value (the closer it is to 1, the better the model is). To the users that are not common to the multiple linear regression analysis and R tools, we suggest to the R documentation. Some explanations are also provided in the following article https://hal.inria.fr/hal-01180272. In this example, all parameters M, N, K are very important. However, it is not clear if there are some relations between them or if some of these parameters should be used with an exponent. Moreover, adjusted R^2 value is not extremely high and we hope we can get a better one. Thus, we proceed to the more advanced analysis. ## Refining the model Now, we can seek for the relations between the parameters. Note that trying all the possible combinations for the cases with a huge number of parameters can be prohibitively long. Thus, it may be better to first get rid of the parameters which seem to have very small influence (typically the ones with no stars from the table in the previous section). ```{r Model2} model2 <- lm(data=df, Duration ~ M*N*K) summary(model2) ``` This model is more accurate, as the R^2 value increased. We can also try some of these parameters with the exponents. ```{r Model3} model3 <- lm(data=df, Duration ~ I(M^2)+I(M^3)+I(N^2)+I(N^3)+I(K^2)+I(K^3)) summary(model3) ``` It seems like some parameters are important. Now we combine these and try to find the optimal combination (here we go directly to the final solution, although this process typically takes several iterations of trying different combinations). ```{r Model4} model4 <- lm(data=df, Duration ~ I(M^2):N+I(N^3):K) summary(model4) ``` This seems to be the most accurate model, with a high R^2 value. We can proceed to its validation. ## Validation Once the model has been computed, we should validate it. Apart from the low adjusted R^2 value, the model weakness can also be observed even better when inspecting the residuals. The results on two following plots (and thus the accuracy of the model) will greatly depend on the measurements variability and the design of experiments. ```{r Validation} par(mfrow=c(1,2)) plot(model4, which=c(1:2)) ``` Generally speaking, if there are some structures on the left plot, this can indicate that there are certain phenomena not explained by the model. Many points on the same horizontal line represent repetitive occurrences of the task with the same parameter values, which is typical for a single experiment run with a homogeneous data. The fact that there is some variability is common, as executing exactly the same code on a real machine will always have slightly different duration. However, having a huge variability means that the benchmarks were very noisy, thus deriving an accurate models from them will be hard. Plot on the right may show that the residuals do not follow the normal distribution. Therefore, such model in overall would have a limited predictive power. If we are not satisfied with the accuracy of the observed models, we should go back to the previous section and try to find a better one. In some cases, the benchmarked data is just be too noisy or the choice of the parameters is not appropriate, and thus the experiments should be redesigned and rerun. When we are finally satisfied with the model accuracy, we should modify our task code, so that StarPU knows which parameters combinations are used in the model. ## Generating C code Depending on the way the task codelet is programmed, this section may be somehow useful. This is a simple helper to generate C code for the parameters combinations and it should be copied to the task description in the application. The function generating the code is not so robust, so make sure that the generated code correctly corresponds to computed model (e.g., parameters are considered in the alphabetical order). ```{r Code} print_codelet(model4, "mlr_cl") ``` ## Conclusion We have computed the model for our benchmarked data using multiple linear regression. After encoding this model into the task code, StarPU will be able to automatically compute the coefficients and use the model to predict task duration. starpu-1.3.9+dfsg/tools/starpu_mlr_analysis.in000066400000000000000000000041741413463044200215530ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 SOURCE_DIR=$(dirname $0) outputfile="mlr_analysis.html" analysis_script="$SOURCE_DIR/starpu_mlr_analysis.Rmd" # Command line arguments inputfile="" help_script() { cat << EOF Give an example of the trace analysis for computing multiple linear regression model Options: -h Show this message Examples: $0 .starpu/sampling/codelets/tmp/test_mlr.out Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; 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)) inputfile=$1 # Error if there is more than one input file if [[ $# < 1 || $# > 1 ]]; then echo "Error!" help_script exit 2 fi if [ ! -s $inputfile ] then echo "Error: file $inputfile does not exist!" exit 5 fi ##################################### # Running analysis file to get actual results in="$(cd "$(dirname "$inputfile")"; pwd)/$(basename "$inputfile")" Rscript -e "library(knitr); input_trace = '$in' ; outputhtml='$outputfile';\ outputRmd = gsub('.html\$','.Rmd',outputhtml);\ knit('$analysis_script',output=outputRmd); knitr::knit2html(outputRmd)" starpu-1.3.9+dfsg/tools/starpu_mpi_comm_matrix.1000066400000000000000000000011461413463044200217700ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_MPI_COMM_MATRIX.PY "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_mpi_comm_matrix.py \- Draw StarPU MPI communications matrix .SH SYNOPSIS .B starpu_mpi_comm_matrix.py \fI\,\/\fR .SH DESCRIPTION Offline tool to draw a communication matrix .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\-png\fR produce plots in png format (default is pdf) .SH "REPORTING BUGS" Report bugs to starpu-1.3.9+dfsg/tools/starpu_mpi_comm_matrix.py000077500000000000000000000100121413463044200222530ustar00rootroot00000000000000#!/usr/bin/env python3 # coding=utf-8 # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # import sys import re import os PROGNAME=sys.argv[0] def usage(): print("Offline tool to draw a communication matrix") print("") print("Usage: %s " % PROGNAME) print("") print("Options:") print(" -h, --help display this help and exit") print(" -v, --version output version information and exit") print(" -png produce plots in png format (default is pdf)") print("") print("Report bugs to ") sys.exit(1) if len(sys.argv) >= 2: if sys.argv[1] == '-v' or sys.argv[1] == '--version': print("%s (StarPU) 1.3.9" % PROGNAME) sys.exit(0) if sys.argv[1] == '-h' or sys.argv[1] == '--help': usage() if (len(sys.argv) == 1): usage() if len(sys.argv) >= 2 and sys.argv[1] == '-png': outputformat='png' outputext='png' outputfile=sys.argv[2] else: outputformat='pdf color' outputext='pdf' outputfile=sys.argv[1] # find the number of nodes nodes=0 file = open(outputfile, "r") for line in file.readlines(): match = re.search('\TOTAL', line) if match: (node,stuff)=line.split(sep="[")[2].split("]") if (int(node) > nodes): nodes=int(node) file.close() nodes=nodes+1 # extract volume of comm and bandwidth between all pair of nodes volumes = [[0 for x in range(nodes)] for y in range(nodes)] bandwidth = [[0 for x in range(nodes)] for y in range(nodes)] file = open(outputfile, "r") for line in file.readlines(): match = re.search('\[starpu_comm_stats]', line) if match: match = re.search('TOTAL', line) if not match: (head,volB,B,volMB,MB,bwB,B,bwMB,MB) = line.split() (src,dst)=head.split(sep="[")[2].split(sep="]")[0].split(sep=":") volumes[int(src)][int(dst)] = float(volB) bandwidth[int(src)][int(dst)] = float(bwB) file.close() def writeData(filename, nodes, data): ofile=open(filename, "w") for dst in range(nodes): for src in range(nodes): ofile.write("%f "% data[src][dst]) ofile.write("\n") ofile.close() def generateGnuplotScript(filename, datafilename, outputfile, nodes): ofile=open(filename, "w") srctics="" dsttics="" for node in range(nodes-1): srctics += "\"src%d\" %d, " % (node, node) dsttics += "\"dst%d\" %d, " % (node, node) ofile.write("set term %s\n" % outputformat) ofile.write("set output \"%s.%s\"\n" % (outputfile, outputext)) ofile.write("set view map scale 1\nset style data lines\n") ofile.write("set palette model RGB defined ( 0 'white', 100 'black' )\n") ofile.write("set xtics (%s\"src%d\" %d)\n" % (srctics, nodes-1, nodes-1)) ofile.write("set ytics (%s\"dst%d\" %d)\n" % (dsttics, nodes-1, nodes-1)) ofile.write("plot '%s' matrix with image\n" % datafilename) ofile.close() # generate gnuplot volume data and script file writeData(outputfile+"_volume.data", nodes, volumes) generateGnuplotScript(outputfile+"_volume.gp", outputfile+"_volume.data", outputfile+"_volume_heatmap", nodes) os.system("gnuplot " + outputfile+"_volume.gp") # generate gnuplot bandwidth data and script file writeData(outputfile+"_bw.data", nodes, bandwidth) generateGnuplotScript(outputfile+"_bw.gp", outputfile+"_bw.data", outputfile+"_bw_heatmap", nodes) os.system("gnuplot " + outputfile+"_bw.gp") starpu-1.3.9+dfsg/tools/starpu_mpi_comm_matrix.py.in000077500000000000000000000100341413463044200226640ustar00rootroot00000000000000#!/usr/bin/env python3 # coding=utf-8 # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2019-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # import sys import re import os PROGNAME=sys.argv[0] def usage(): print("Offline tool to draw a communication matrix") print("") print("Usage: %s " % PROGNAME) print("") print("Options:") print(" -h, --help display this help and exit") print(" -v, --version output version information and exit") print(" -png produce plots in png format (default is pdf)") print("") print("Report bugs to <@PACKAGE_BUGREPORT@>") sys.exit(1) if len(sys.argv) >= 2: if sys.argv[1] == '-v' or sys.argv[1] == '--version': print("%s (@PACKAGE_NAME@) @PACKAGE_VERSION@" % PROGNAME) sys.exit(0) if sys.argv[1] == '-h' or sys.argv[1] == '--help': usage() if (len(sys.argv) == 1): usage() if len(sys.argv) >= 2 and sys.argv[1] == '-png': outputformat='png' outputext='png' outputfile=sys.argv[2] else: outputformat='pdf color' outputext='pdf' outputfile=sys.argv[1] # find the number of nodes nodes=0 file = open(outputfile, "r") for line in file.readlines(): match = re.search('\TOTAL', line) if match: (node,stuff)=line.split(sep="[")[2].split("]") if (int(node) > nodes): nodes=int(node) file.close() nodes=nodes+1 # extract volume of comm and bandwidth between all pair of nodes volumes = [[0 for x in range(nodes)] for y in range(nodes)] bandwidth = [[0 for x in range(nodes)] for y in range(nodes)] file = open(outputfile, "r") for line in file.readlines(): match = re.search('\[starpu_comm_stats]', line) if match: match = re.search('TOTAL', line) if not match: (head,volB,B,volMB,MB,bwB,B,bwMB,MB) = line.split() (src,dst)=head.split(sep="[")[2].split(sep="]")[0].split(sep=":") volumes[int(src)][int(dst)] = float(volB) bandwidth[int(src)][int(dst)] = float(bwB) file.close() def writeData(filename, nodes, data): ofile=open(filename, "w") for dst in range(nodes): for src in range(nodes): ofile.write("%f "% data[src][dst]) ofile.write("\n") ofile.close() def generateGnuplotScript(filename, datafilename, outputfile, nodes): ofile=open(filename, "w") srctics="" dsttics="" for node in range(nodes-1): srctics += "\"src%d\" %d, " % (node, node) dsttics += "\"dst%d\" %d, " % (node, node) ofile.write("set term %s\n" % outputformat) ofile.write("set output \"%s.%s\"\n" % (outputfile, outputext)) ofile.write("set view map scale 1\nset style data lines\n") ofile.write("set palette model RGB defined ( 0 'white', 100 'black' )\n") ofile.write("set xtics (%s\"src%d\" %d)\n" % (srctics, nodes-1, nodes-1)) ofile.write("set ytics (%s\"dst%d\" %d)\n" % (dsttics, nodes-1, nodes-1)) ofile.write("plot '%s' matrix with image\n" % datafilename) ofile.close() # generate gnuplot volume data and script file writeData(outputfile+"_volume.data", nodes, volumes) generateGnuplotScript(outputfile+"_volume.gp", outputfile+"_volume.data", outputfile+"_volume_heatmap", nodes) os.system("gnuplot " + outputfile+"_volume.gp") # generate gnuplot bandwidth data and script file writeData(outputfile+"_bw.data", nodes, bandwidth) generateGnuplotScript(outputfile+"_bw.gp", outputfile+"_bw.data", outputfile+"_bw_heatmap", nodes) os.system("gnuplot " + outputfile+"_bw.gp") starpu-1.3.9+dfsg/tools/starpu_paje_draw_histogram000077500000000000000000000065701413463044200224670ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" r_script="$(dirname $(command -v $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.3.9" 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.3.9+dfsg/tools/starpu_paje_draw_histogram.1000066400000000000000000000014731413463044200226200ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_PAJE_DRAW_HISTOGRAM "1" "October 2021" "starpu_paje_draw_histogram (StarPU) 1.3.9" "User Commands" .SH NAME starpu_paje_draw_histogram \- Draw StarPU trace histogram .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 \-n chol_model_22 example.native.trace .PP \&./starpu_paje_draw_histogram \-r 100:300 \-n FetchingInput,Overhead \-v example.native.trace example.simgrid.trace .SH "REPORTING BUGS" Report bugs to starpu-1.3.9+dfsg/tools/starpu_paje_draw_histogram.R000077500000000000000000000112101413463044200226520ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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.3.9+dfsg/tools/starpu_paje_draw_histogram.in000077500000000000000000000066121413463044200230710ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" r_script="$(dirname $(command -v $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.3.9+dfsg/tools/starpu_paje_sort.in000077500000000000000000000057621413463044200210530ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # 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.3.9+dfsg/tools/starpu_paje_state_stats000077500000000000000000000066431413463044200220140ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # 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 $(command -v $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.3.9" 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.3.9+dfsg/tools/starpu_paje_state_stats.1000066400000000000000000000014251413463044200221410ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_PAJE_STATE_STATS "1" "October 2021" "starpu_paje_state_stats (StarPU) 1.3.9" "User Commands" .SH NAME starpu_paje_state_stats \- Print statistics from StarPU trace .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 \-r 100:300 \-n FetchingInput \-v example.native.trace example.simgrid.trace .SH "REPORTING BUGS" Report bugs to starpu-1.3.9+dfsg/tools/starpu_paje_state_stats.R000077500000000000000000000107551413463044200222130ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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) # 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"))] # 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)) df$Value <- ifelse(df$Value == "Su", "SubmittingTask", 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], ",") outputfile<-args[4] # Reading first file filename<-args[5] df<-read_df(filename,range1,range2) # Getting summary of the first file dfout<-ddply(df, c("Value"), summarize, Events_ = length(as.numeric(Duration)), Duration_ = sum(as.numeric(Duration))) names(dfout)<-c("Value",sprintf("Events_%s",filename),sprintf("Duration_%s",filename)) i=6 while (i <= length(args)) { # Reading next input file filename<-args[i] df<-read_df(filename,range1,range2) # Getting summary of the next file dp<-ddply(df, c("Value"), summarize, Events_ = length(as.numeric(Duration)), Duration_ = sum(as.numeric(Duration))) names(dp)<-c("Value",sprintf("Events_%s",filename),sprintf("Duration_%s",filename)) # Merging results into one single data frame if (nrow(dp)>0) { if (nrow(dfout)>0) dfout<-merge(dfout,dp, by = "Value", all=TRUE) else dfout<-dp } i <- i+1 } # Cosmetics: change NA to 0 dfout[is.na(dfout)] <- 0 # Error: if there is no results for a given range and state if (nrow(dfout)==0) stop("Result is empty!") # Write results into the new .csv file write.table(dfout, file=outputfile, row.names=FALSE, sep = ", ") starpu-1.3.9+dfsg/tools/starpu_paje_state_stats.in000077500000000000000000000066651413463044200224250ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # 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 $(command -v $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.3.9+dfsg/tools/starpu_paje_summary000077500000000000000000000054571413463044200211550ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # Script for giving statistical analysis of the paje trace set -e # fail fast # File names SOURCE_DIR=$(dirname $0) outputfile="summary.html" analysis_script="$SOURCE_DIR/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 EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.3.9" 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.3.9+dfsg/tools/starpu_paje_summary.Rmd000066400000000000000000000277641413463044200217000ustar00rootroot00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 Setup, echo=FALSE} opts_chunk$set(echo=FALSE) ``` ```{r Install_R_libraries} InstalledPackage <- function(package) { available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE))) missing <- package[!available] if (length(missing) > 0) return(FALSE) return(TRUE) } CRANChoosen <- function() { return(getOption("repos")["CRAN"] != "@CRAN@") } UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") { if(!InstalledPackage(package)) { if(!CRANChoosen()) { chooseCRANmirror() if(!CRANChoosen()) { options(repos = c(CRAN = defaultCRANmirror)) } } suppressMessages(suppressWarnings(install.packages(package))) if(!InstalledPackage(package)) return(FALSE) } return(TRUE) } # Now install desired libraries libraries <- c("ggplot2", "plyr", "data.table", "RColorBrewer") for(libr in libraries) { if(!UsePackage(libr)) { stop("Error!", libr) } } ``` ```{r Load_R_files} # Load ggplot and plyr just for the following cases library(ggplot2) library(plyr) library(data.table) library(RColorBrewer) # Defining non-computation states: def_states<-c("Initializing","Deinitializing","Overhead","Nothing","Sleeping","Freeing","Allocating","WritingBack","FetchingInput","PushingOutput","Callback","Progressing","Unpartitioning","AllocatingReuse","Reclaiming","DriverCopy","DriverCopyAsync","Scheduling","Executing") # 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<-as.factor(as.character(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 == "Sc", "Scheduling", as.character(df$Value)) df$Value <- ifelse(df$Value == "E", "Executing", 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)) # Small cleanup df$Start<-round(df$Start,digit=1) df$End<-round(df$End,digit=1) df$ResourceId<-as.factor(df$ResourceId) df$Value<-as.factor(df$Value) # Start from zero m <- min(df$Start) df$Start <- df$Start - m df$End <- df$Start+df$Duration # Return data frame df } ``` ```{r Load_traces} df<-data.frame() if( !exists("input_traces") ) input_traces<-c("example.native.trace.csv", "example.simgrid.trace.csv") for (i in 1:length(input_traces)){ dfs<-read_df(input_traces[i]) df<-rbindlist(list(df,dfs)) } # Color palettes colourCount = length(unique(df$Value)) getPalette = colorRampPalette(brewer.pal(9, "Set1")) # Order of Value so we can have good colors ker_states<-as.character(unique(df[!(df$Value %in% def_states),Value])) ordered_states<-append(sort(ker_states), def_states) df$Value <- factor(df$Value, levels=ordered_states) # Order of ResourceId so we can have y-axis df$ResourceId <- factor(df$ResourceId, levels=sort(as.character(unique(df$ResourceId)))) ``` # Introduction This document presents a basic analysis of multiple StarPU traces. First, paje *traces* will be transferred into *.csv* files and then we analyze them with **R**. This summary is a first step that should help researchers verify their hypothesis or find problematic areas that require more exhaustive investigation. Be cautious, as the following results are only a brief analysis of the traces and many important phenomena could still be hidden. Also, be very careful when comparing different states or traces. Even though some large discrepancies can be irrelevant, in other cases even the smallest differences can be essential in understanding what exactly happened during the StarPU execution. ### How to compile ./starpu_summary.sh example.native.trace example.simgrid.trace ### Software dependencies In order to run this analysis you need to have R installed: sudo apt-get install r-base Easiest way to transform *paje* traces generated by StarPU to *.csv* is to use *pjdump* program (), so we encourage users to install it. When R is installed, one will need to start R (e.g., from terminal) and install *knitr* package: R> install.packages("knitr") Additional R packages used in this analysis (*ggplot2, plyr, data.table, RColorBrewer*) will be installed automatically when the document is compiled for the first time. If there is any trouble, install them by hand directly from R (the same way as *knitr*) # Gantt Charts of the whole Trace First, we show a simple gantt chart of every trace. X-axis is a simple timeline of the execution, *Resources* on y-axis correspond to different CPUs/GPUs that were used and finally different colors represent different *States* of the application. This kind of figures can often point to the idle time or synchronization problems. Small disadvantage is that in most cases there are too many states, thus it is impossible to display them all on a single plot without aggregation. Therefore for any strange behavior at a certain part of the trace, we strongly suggest to zoom on the interval it occurred. ```{r Gantt1} ggplot(df,aes(x=Start,xend=End, y=factor(ResourceId), yend=factor(ResourceId),color=Value)) + theme_bw() + scale_color_manual(name="State",values=getPalette(colourCount)) + geom_segment(size=8) + ylab("Resource") + xlab("Time [ms]") + facet_wrap(~Origin,ncol=1,scale="free_y") ``` Second, we will concentrate only on computation kernel states, to get rid of visualization artifacts that can be introduced by other (sometimes irrelevant) states. Normally, this plot should not be too different from the previous one. ```{r Gantt2} # Select only computation kernels df1 <- df[!(df$Value %in% c("Initializing","Deinitializing","Overhead","Nothing","Sleeping","Freeing","Allocating","WritingBack","FetchingInput","PushingOutput","Callback","Progressing","Unpartitioning","AllocatingReuse","Reclaiming","DriverCopy","DriverCopyAsync","Scheduling","Executing")),] # Start from zero m <- min(df1$Start) df1$Start <- df1$Start - m df1$End <- df1$Start+df1$Duration # Plot ggplot(df1,aes(x=Start,xend=End, y=factor(ResourceId), yend=factor(ResourceId),color=Value)) + theme_bw() + scale_color_manual(name="State",values=getPalette(colourCount)) + geom_segment(size=8) + ylab("Resource") + xlab("Time [ms]") + facet_wrap(~Origin,ncol=1,scale="free_y") ``` # Table Summary Here we present how much time application spent in each state (OverallDuration), how many times it was in that state (Count), mean and median values of duration (Mean and Median), and finally what is a standard deviation (StandDev). General information provided by this table can sometimes give an idea to application experts which parts of code are not working as desired. Be aware that this kind of tables hide many important things, such as outliers, multiple modes, etc. ```{r Table} options(width=120) ddply(df,.(Value,Origin), summarize, OverallDuration=sum(Duration), Count=length(Duration), Mean=mean(Duration), Median=median(Duration), StandDev=sd(Duration)) ``` # State Duration during the Execution Time Now, we show how duration of each state was changing during the execution. This can display a general behavior of a state; show if there are outliers or multiple modes; are some events occurring in groups, etc. . It can also suggest a strange behavior of a state during a certain time interval, which should be later investigated more carefully. However, since each event is represented by a single point (and there is no "alpha" factor), those events that happen almost simultaneously are overplotted. Therefore density of events along execution time may not be easy to read. ```{r Dur} ggplot(df,aes(x=Start,y=Duration)) + geom_point(aes(color=Value)) + theme_bw() + scale_color_manual(name="State",values=getPalette(colourCount)) + ggtitle("State Duration during the Execution Time") + theme(legend.position="none") + ylab("Duration [ms]") + xlab("Time [ms]") + facet_grid(Value~Origin, scale="free_y") ``` # Distribution Histograms Finally, we show a distribution of *Duration* for each state in form of histograms. X-axis is partitioned into bins with equidistant time intervals in milliseconds, while y-axis represents the number of occurrences inside such intervals for a certain state. Note that for the first plot y-axis is not fixed, meaning that the scale changes from one row to another. This plot allows to not only to see what was the most frequent duration of a state, but also to compare duration between different states. ```{r Hist1} ggplot(df, aes(x=Duration)) + geom_histogram(aes(y=..count..,fill=factor(Value)),binwidth = diff(range(df$Duration))/30) + theme_bw() + scale_fill_manual(name="State",values=getPalette(colourCount)) + ggtitle("Histograms for State Distribution") + ylab("Count") + xlab("Duration [ms]") + theme(legend.position="none") + facet_grid(Value~Origin,scales = "free_y") ``` Similar to the previous figure, only now traces are showed vertically instead of horizontally. Note that for this plot x-axis is not fixed, meaning that the scale changes from one column to another. This plot allows to compare frequency of different states and in case of multiple traces to easily compare duration distribution for each state. ```{r Hist2} ggplot(df, aes(x=Duration)) + geom_histogram(aes(y=..count..,fill=factor(Value)),binwidth = diff(range(df$Duration))/30) + theme_bw() + scale_fill_manual(name="State",values=getPalette(colourCount)) + ggtitle("Histograms for State Distribution") + ylab("Count") + xlab("Duration [ms]") + theme(legend.position="none") + facet_grid(Origin~Value,scales = "free_x") ``` starpu-1.3.9+dfsg/tools/starpu_paje_summary.in000077500000000000000000000055011413463044200215500ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # 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. # # Script for giving statistical analysis of the paje trace set -e # fail fast # File names SOURCE_DIR=$(dirname $0) outputfile="summary.html" analysis_script="$SOURCE_DIR/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.3.9+dfsg/tools/starpu_perfmodel_display.1000066400000000000000000000020101413463044200222750ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_PERFMODEL_DISPLAY "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_perfmodel_display \- Display StarPU performance model .SH SYNOPSIS .B starpu_perfmodel_display [ \fI\,options \/\fR] .SH DESCRIPTION Display a given perfmodel .PP One must specify either \fB\-l\fR or \fB\-s\fR. \fB\-x\fR can be used with \fB\-s\fR Options: .TP \fB\-l\fR display all available models .TP \fB\-s\fR specify the symbol .TP \fB\-x\fR display output in XML format .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.3.9+dfsg/tools/starpu_perfmodel_display.c000066400000000000000000000123761413463044200223770ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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" /* XML format */ static int xml = 0; /* 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. -x can be used with -s\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -l display all available models\n"); fprintf(stderr, " -s specify the symbol\n"); fprintf(stderr, " -x display output in XML format\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:hx", 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 'x': /* symbol */ xml = 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; } if (xml) { starpu_perfmodel_dump_xml(stdout, &model); } else { 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(); return 0; } starpu-1.3.9+dfsg/tools/starpu_perfmodel_plot.1000066400000000000000000000021451413463044200216170ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_PERFMODEL_PLOT "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_perfmodel_plot \- Plot StarPU performance model .SH SYNOPSIS .B starpu_perfmodel_plot [ \fI\,options \/\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\-e\fR display perfmodel as energy instead of time .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.3.9+dfsg/tools/starpu_perfmodel_plot.c000066400000000000000000000410121413463044200216750ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2013 Thibaut Lambert * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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; int energy; /* 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, " -e display perfmodel as energy instead of time\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], "-e") == 0) { options->energy = 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]; const char *factor; if (options->energy) factor = ""; else factor = "0.001 * "; 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, "%s%g * x ** %g title \"Linear Regression %s\"", factor, 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, "%s%g * x ** %g + %s%g title \"Non-Linear Regression %s\"", factor, arch_model->regression.a, arch_model->regression.b, factor, 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) if (options->energy) fprintf(datafile, "\t%-15le\t%-15le", entry->flops / entry->mean, entry->flops * entry->deviation / (entry->mean * entry->mean) ); else fprintf(datafile, "\t%-15le\t%-15le", entry->flops / (entry->mean * 1000), entry->flops * entry->deviation / (entry->mean * entry->mean * 1000) ); else if (options->energy) fprintf(datafile, "\t%-15le\t%-15le", entry->mean, entry->deviation); 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 hostname[64]; char *symbol = replace_char(options->symbol, '_', '-'); _starpu_gethostname(hostname, sizeof(hostname)); 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 on %s\"\n", symbol, hostname); fprintf(gnuplot_file, "set xlabel \"Total data size\"\n"); if (options->gflops) if (options->energy) fprintf(gnuplot_file, "set ylabel \"GFlop/J\"\n"); else fprintf(gnuplot_file, "set ylabel \"GFlop/s\"\n"); else if (options->energy) fprintf(gnuplot_file, "set ylabel \"Energy (J)\"\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**5 : 10**6 < * < 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, sizeof(options.data_file_name), "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); free(options.fxt_options.dir); starpu_fxt_options_shutdown(&options.fxt_options); } #endif snprintf(gnuplot_file_name, sizeof(gnuplot_file_name), "starpu_%s.gp", options.symbol); snprintf(options.avg_file_name, sizeof(options.avg_file_name), "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 */ ret = chmod(gnuplot_file_name, sb.st_mode|S_IXUSR #ifdef S_IXGRP |S_IXGRP #endif #ifdef S_IXOTH |S_IXOTH #endif ); if (ret) { perror("chmod"); STARPU_ABORT(); } _STARPU_DISP("Gnuplot file <%s> generated\n", gnuplot_file_name); } starpu_perfmodel_unload_model(&model); } starpu_perfmodel_free_sampling(); return ret; } starpu-1.3.9+dfsg/tools/starpu_perfmodel_recdump.c000066400000000000000000000265351413463044200223730ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * 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 #include #include #include #include #include #include #include // we need to browse the list associated to history-based models // just like in starpu_perfmodel_plot #define STRHEADCMP(s, head) strncmp(s, head, strlen(head)) #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #define PROGNAME "starpu_perfmodel_recdump" struct _footprint_list { struct _footprint_list* next; uint32_t footprint; }; struct _footprint_list* add_footprint(struct _footprint_list* list, uint32_t footprint) { struct _footprint_list * l = list; while(l) { if(l->footprint == footprint) break; l = l->next; } if(l) return list; else { struct _footprint_list * res = malloc(sizeof(struct _footprint_list)); res->footprint = footprint; res->next = list; return res; } } static struct model { UT_hash_handle hh; char *name; struct starpu_perfmodel model; struct _footprint_list* footprints; } *models; void get_comb_name(int comb, char* name, int name_size) { struct starpu_perfmodel_arch *arch_comb = starpu_perfmodel_arch_comb_fetch(comb); STARPU_ASSERT_MSG(arch_comb->ndevices == 1, "Cannot work with multi-device workers\n"); snprintf(name, name_size, "%s%d", starpu_perfmodel_get_archtype_name(arch_comb->devices[0].type), arch_comb->devices[0].devid); } void print_archs(FILE* output) { int nb_workers = 0; unsigned workerid, node; int comb, old_comb = -1; fprintf(output, "%%rec: worker_count\n\n"); for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { struct starpu_perfmodel_arch* arch = starpu_worker_get_perf_archtype(workerid, STARPU_NMAX_SCHED_CTXS); comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if (comb < 0) continue; // Ignore architecture which is not present in any perfmodel if(comb != old_comb) { if(nb_workers > 0) { char name[32]; get_comb_name(old_comb, name, 32); fprintf(output, "Architecture: %s\n", name); fprintf(output, "NbWorkers: %d\n\n", nb_workers); } old_comb = comb; nb_workers = 1; } else { nb_workers += 1; } } if(nb_workers > 0) { char name[32]; get_comb_name(old_comb, name, 32); fprintf(output, "Architecture: %s\n", name); fprintf(output, "NbWorkers: %d\n\n", nb_workers); } fprintf(output, "%%rec: memory_workers\n\n"); for (node = 0; node < starpu_memory_nodes_get_count(); node++) { unsigned printed = 0; char name[32]; fprintf(output, "MemoryNode: %u\n", node); starpu_memory_node_get_name(node, name, sizeof(name)); fprintf(output, "Name: %s\n", name); fprintf(output, "Size: %ld\n", (long) starpu_memory_get_total(node)); for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { if (starpu_worker_get_memory_node(workerid) == node) { if (!printed) { fprintf(output, "Workers:"); printed = 1; } fprintf(output, " %u", workerid); } } if (printed) fprintf(output, "\n"); fprintf(output, "\n"); } } /* output file name */ static char* poutput = NULL; static char* pinput = NULL; static void usage() { fprintf(stderr, "Dumps perfmodels to a rec file\n\n"); fprintf(stderr, "Usage: %s [ input-file ] [ -o 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 <"PACKAGE_BUGREPORT">."); fprintf(stderr, "\n"); } static void print_entry(const char *name, const char *archname, FILE *output, struct starpu_perfmodel_history_entry *entry) { fprintf(output, "Model: %s\n", name); fprintf(output, "Architecture: %s\n", archname); fprintf(output, "Footprint: %08x\n", entry->footprint); fprintf(output, "Size: %lu\n", (unsigned long) entry->size); if (!isnan(entry->flops)) fprintf(output, "Flops: %-15e\n", entry->flops); fprintf(output, "Mean: %-15e\nStddev: %-15e\n", entry->mean, entry->deviation); fprintf(output, "Samples: %u\n", entry->nsample); fprintf(output, "\n"); } static void parse_args(int argc, char **argv) { int c; static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"output", required_argument, NULL, 'o'}, {0, 0, 0, 0} }; int option_index; while ((c = getopt_long(argc, argv, "ho:", long_options, &option_index)) != -1) { switch (c) { case 'h': /* display help */ usage(); exit(EXIT_SUCCESS); break; case 'o': poutput = optarg; break; case '?': default: fprintf(stderr, "Unrecognized option: -%c\n", optopt); } } if(optind < argc) { pinput = argv[optind++]; if(optind < argc) { fprintf(stderr, "Unrecognized argument: %s\n", argv[optind]); exit(EXIT_FAILURE); } } } int main(int argc, char **argv) { #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); _STARPU_MSG("Listing perfmodels is not implemented on pure Windows yet\n"); return 1; #else FILE* output; parse_args(argc, argv); if(poutput != NULL) { output = fopen(poutput, "w+"); if (!output) { fprintf(stderr, "couldn't open %s for write: %s\n", poutput, strerror(errno)); exit(EXIT_FAILURE); } } else { output = stdout; } if (starpu_init(NULL) != 0) { fprintf(stderr, "StarPU initialization failure\n"); exit(EXIT_FAILURE); } starpu_pause(); if(pinput) { FILE* input = fopen(pinput, "r"); char s[1024], *c; struct model *model, *tmp=NULL; uint32_t footprint = 0; char *model_name = NULL; int ret; if (!input) { fprintf(stderr, "couldn't open %s for read: %s\n", pinput, strerror(errno)); exit(EXIT_FAILURE); } 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) { /* Try to get already-loaded model */ HASH_FIND_STR(models, model_name, model); if (model == NULL) { model = malloc(sizeof(*model)); model->name = model_name; model->footprints = NULL; 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); } model->footprints = add_footprint(model->footprints, footprint); model_name = NULL; } continue; } /* Get rec field name */ c = strchr(s, ':'); if (!c) { fprintf(stderr, "odd line '%s'\n", s); exit(EXIT_FAILURE); } 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' */ } } /* All models loaded */ { print_archs(output); fprintf(output, "%%rec: timing\n\n"); int nb_combs = starpu_perfmodel_get_narch_combs(); HASH_ITER(hh, models, model, tmp) { struct _footprint_list* l = model->footprints, *ltmp; int comb; while(l) { for(comb = 0; comb < nb_combs; comb++) { char archname[32]; get_comb_name(comb, archname, 32); if(!model->model.state || model->model.state->nimpls[comb] == 0) { _STARPU_DISP("Symbol %s does not have any implementation on comb %d, not dumping\n", model->name, comb); continue; } if(model->model.state->nimpls[comb] > 1) _STARPU_DISP("Warning, more than one implementations in comb %d of symbol %s, using only the first one\n", comb, model->name); struct starpu_perfmodel_per_arch *arch_model = &model->model.state->per_arch[comb][0]; struct starpu_perfmodel_history_list *ptr; ptr = arch_model->list; if(!ptr) _STARPU_DISP("Implementation %d of symbol %s does not have history based model, not dumping\n", comb, model->name); else while(ptr) { struct starpu_perfmodel_history_entry *entry = ptr->entry; if(entry->footprint == l->footprint) { print_entry(model->name, archname, output, entry); break; } ptr=ptr->next; } } ltmp = l->next; free(l); l = ltmp; } free(model->name); HASH_DEL(models, model); } } fclose(input); } else { fprintf(output, "%%rec: timing\n\n"); 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, "..")) { int comb, nb_combs; char* symbol = strdup(ep->d_name); char *dot = strrchr(symbol, '.'); struct starpu_perfmodel model = {.type = STARPU_PERFMODEL_INVALID }; if(dot) *dot = '\0'; if (starpu_perfmodel_load_symbol(symbol, &model) != 0) { free(symbol); continue; } if(model.state == NULL) { free(symbol); continue; } _STARPU_DISP("Dumping %s\n", symbol); nb_combs = starpu_perfmodel_get_narch_combs(); for(comb = 0; comb < nb_combs; ++comb) { char name[32]; get_comb_name(comb, name, 32); if(!model.state || model.state->nimpls[comb] == 0) { _STARPU_DISP("Symbol %s does not have any implementation on comb %d, not dumping\n", symbol, comb); fprintf(output, "\n"); continue; } struct starpu_perfmodel_per_arch *arch_model = &model.state->per_arch[comb][0]; struct starpu_perfmodel_history_list *ptr; ptr = arch_model->list; if(!ptr) _STARPU_DISP("Symbol %s for comb %d does not have history based model, not dumping\n", symbol, comb); else while(ptr) { print_entry(symbol, name, output, ptr->entry); ptr=ptr->next; } } starpu_perfmodel_unload_model(&model); free(symbol); } } closedir (dp); } else { _STARPU_DISP("Could not open the perfmodel directory <%s>: %s\n", path, strerror(errno)); } print_archs(output); } starpu_resume(); starpu_shutdown(); fclose(output); return 0; #endif } starpu-1.3.9+dfsg/tools/starpu_replay.c000066400000000000000000000614601413463044200201670ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017 Erwan Leria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 reads a tasks.rec file and replays the recorded task graph. * Currently, this version is done to run with simgrid. * * For further information, contact erwan.leria@inria.fr */ #include #include #include #include #include #include #include #include #define REPLAY_NMAX_DEPENDENCIES 8 #define ARRAY_DUP(in, out, n) memcpy(out, in, n * sizeof(*out)) #define ARRAY_INIT(array, n) memset(array, 0, n * sizeof(*array)) /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Declarations of global variables, structures, pointers, ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static int static_workerid; /* TODO: move to core header while moving starpu_replay_sched to core */ extern void schedRecInit(const char * filename); extern void applySchedRec(struct starpu_task * starpu_task, long submit_order); /* Enum for normal and "wontuse" tasks */ enum task_type {NormalTask, WontUseTask}; typedef unsigned long jobid_t; enum task_type control; static char *name = NULL; static char *model = NULL; static jobid_t jobid; static jobid_t *dependson; static long submitorder = -1; static starpu_tag_t tag; static int workerid; static uint32_t footprint; static double flops, total_flops = 0.; static double startTime; //start time (The instant when the task starts) static double endTime; //end time (The instant when the task ends) static int iteration = -1; static starpu_data_handle_t handles[STARPU_NMAXBUFS]; static enum starpu_data_access_mode modes[STARPU_NMAXBUFS]; static char normal_reg_signal[STARPU_NMAXBUFS]; /* Use the following arrays when the number of data is greater than STARPU_NMAXBUFS */ starpu_data_handle_t * handles_ptr; enum starpu_data_access_mode * modes_ptr; size_t * sizes_set; static size_t dependson_size; static size_t ndependson; static unsigned nb_parameters = 0; /* Number of parameters */ static int alloc_mode; /* If alloc_mode value is 1, then the handles are stored in dyn_handles, else they are in handles */ static int priority = 0; char * reg_signal = NULL; /* The register signal (0 or 1 coded on 8 bit) is used to know which handle of the task has to be registered in StarPU (in fact to avoid handle twice)*/ /* Record all tasks, hashed by jobid. */ static struct task { struct starpu_rbtree_node node; UT_hash_handle hh; jobid_t jobid; int iteration; long submit_order; jobid_t *deps; size_t ndependson; struct starpu_task task; enum task_type type; int reg_signal; } *tasks; /* Record handles */ static struct handle { UT_hash_handle hh; starpu_data_handle_t mem_ptr; /* This value should be the registered handle */ starpu_data_handle_t handle; /* The key is the original value of the handle in the file */ } * handles_hash; /* Record models */ static struct perfmodel { UT_hash_handle hh; struct starpu_perfmodel perfmodel; char * model_name; } * model_hash; /* [SUBMITORDER] The tree of the submit order */ static struct starpu_rbtree tree = STARPU_RBTREE_INITIALIZER; /* the cmp_fn arg for rb_tree_insert() */ unsigned int diff(struct starpu_rbtree_node * left_elm, struct starpu_rbtree_node * right_elm) { long oleft = ((struct task *) left_elm)->submit_order; long oright = ((struct task *) right_elm)->submit_order; if (oleft == -1 && oright == -1) { if (left_elm < right_elm) return -1; else return 1; } return oleft - oright; } /* Settings for the perfmodel */ struct task_arg { uint32_t footprint; unsigned narch; double perf[]; }; uint32_t get_footprint(struct starpu_task * task) { return ((struct task_arg*) (task->cl_arg))->footprint; } double arch_cost_function(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl) { int device = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); STARPU_ASSERT(device != -1); (void) nimpl; /* Then, get the pointer to the value of the expected time */ struct task_arg *arg = task->cl_arg; if (device < (int) arg->narch) { double val = arg->perf[device]; if (!(val == 0 || isnan(val))) return val; } fprintf(stderr, "[starpu] Error, expected_time is 0 or lower (replay.c line : %d)", __LINE__- 6); return 0.0; } /* End of settings */ static unsigned long nexecuted_tasks; void dumb_kernel(void *buffers[], void *args) { (void) buffers; (void) args; nexecuted_tasks++; if (!(nexecuted_tasks % 1000)) { fprintf(stderr, "\rExecuted task %lu...", nexecuted_tasks); fflush(stdout); } unsigned this_worker = starpu_worker_get_id_check(); struct starpu_perfmodel_arch *perf_arch = starpu_worker_get_perf_archtype(this_worker, STARPU_NMAX_SCHED_CTXS); struct starpu_task *task = starpu_task_get_current(); unsigned impl = starpu_task_get_implementation(task); double length = starpu_task_expected_length(task, perf_arch, impl); 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_task_get_name(task)); starpu_sleep(length / 1000000); } /* [CODELET] Initialization of an unique codelet for all the tasks*/ static int can_execute(unsigned worker_id, struct starpu_task *task, unsigned nimpl) { struct starpu_perfmodel_arch * arch = starpu_worker_get_perf_archtype(worker_id, STARPU_NMAX_SCHED_CTXS); int device = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices); if (device == -1) /* Doesn't exist yet, thus unknown, assuming it can not work there. */ return 0; (void) nimpl; /* Then, get the pointer to the value of the expected time */ struct task_arg *arg = task->cl_arg; if (device < (int) arg->narch) { double val = arg->perf[device]; if (!(val == 0 || isnan(val))) return 1; } return 0; } static struct starpu_perfmodel myperfmodel = { .type = STARPU_PER_ARCH, .arch_cost_function = arch_cost_function, .footprint = get_footprint, }; static struct starpu_codelet cl = { .cpu_funcs = { dumb_kernel }, .cpu_funcs_name = { "dumb_kernel" }, .cuda_funcs = { dumb_kernel }, .opencl_funcs = { dumb_kernel }, .nbuffers = STARPU_VARIABLE_NBUFFERS, .can_execute = can_execute, .model = &myperfmodel, .flags = STARPU_CODELET_SIMGRID_EXECUTE, }; /* * * * * * * * * * * * * * * * * * * Functions * * * * * * * * * * * * * * * * * * * */ /* The following function checks if the program has to use static or dynamic arrays*/ static int set_alloc_mode(int total_parameters) { return total_parameters <= STARPU_NMAXBUFS; } /* According to the allocation mode, modify handles_ptr and modes_ptr in static or dynamic */ static void arrays_managing(int mode) { if (mode) { handles_ptr = &handles[0]; modes_ptr = &modes[0]; reg_signal = &normal_reg_signal[0]; } else { _STARPU_MALLOC(handles_ptr, sizeof(*handles_ptr) * nb_parameters); _STARPU_MALLOC(modes_ptr, sizeof(*modes_ptr) * nb_parameters); _STARPU_CALLOC(reg_signal, nb_parameters, sizeof(char *)); } } /* Check if a handle hasn't been registered yet */ static void variable_data_register_check(size_t * array_of_size, int nb_handles) { int h, i; starpu_data_handle_t orig_handles[nb_handles]; ARRAY_DUP(handles_ptr, orig_handles, nb_handles); for (h = 0 ; h < nb_handles ; h++) { if(reg_signal[h]) /* Get the register signal, if it's 1 do ... */ { struct handle * handles_cell; for (i = 0; i < h; i++) { /* Maybe we just registered it in this very h loop */ if (handles_ptr[h] == orig_handles[i]) { handles_ptr[h] = handles_ptr[i]; break; } } if (i == h) { _STARPU_MALLOC(handles_cell, sizeof(*handles_cell)); STARPU_ASSERT(handles_cell != NULL); handles_cell->handle = handles_ptr[h]; /* Get the hidden key (initial handle from the file) to store it as a key*/ starpu_variable_data_register(handles_ptr+h, STARPU_MAIN_RAM, (uintptr_t) 1, array_of_size[h]); handles_cell->mem_ptr = handles_ptr[h]; /* Store the new value of the handle into the hash table */ HASH_ADD(hh, handles_hash, handle, sizeof(handles_ptr[h]), handles_cell); } } } } void reset(void) { control = NormalTask; if (name != NULL) { free(name); name = NULL; } if (model != NULL) { free(model); model = NULL; } if (sizes_set != NULL) { free(sizes_set); sizes_set = NULL; } if (reg_signal != NULL) { if (!alloc_mode) { free(reg_signal); reg_signal = NULL; } else { ARRAY_INIT(reg_signal, nb_parameters); } } jobid = 0; ndependson = 0; tag = -1; workerid = -1; footprint = 0; startTime = 0.0; endTime = 0.0; if (submitorder != -1) submitorder = -1; iteration = -1; nb_parameters = 0; alloc_mode = 1; } void fix_wontuse_handle(struct task * wontuseTask) { STARPU_ASSERT(wontuseTask); if (!wontuseTask->reg_signal) /* Data was already registered when we created this task, so it's already a handle */ return; struct handle *handle_tmp; /* Data was not registered when we created this task, so this is the application pointer, look it up now */ HASH_FIND(hh, handles_hash, &wontuseTask->task.handles[0], sizeof(wontuseTask->task.handles[0]), handle_tmp); if (handle_tmp) wontuseTask->task.handles[0] = handle_tmp->mem_ptr; else /* This data wasn't actually used, don't care about it */ wontuseTask->task.handles[0] = NULL; } /* Function that submits all the tasks (used when the program reaches EOF) */ int submit_tasks(void) { /* Add dependencies */ const struct starpu_rbtree * tmptree = &tree; struct starpu_rbtree_node * currentNode = starpu_rbtree_first(tmptree); long last_submitorder = 0; while (currentNode != NULL) { struct task * currentTask = (struct task *) currentNode; if (currentTask->type == NormalTask) { if (currentTask->submit_order != -1) { STARPU_ASSERT(currentTask->submit_order >= last_submitorder + 1); while (currentTask->submit_order > last_submitorder + 1) { /* Oops, some tasks were not submitted by original application, fake some */ struct starpu_task *task = starpu_task_create(); int ret; task->cl = NULL; ret = starpu_task_submit(task); STARPU_ASSERT(ret == 0); last_submitorder++; } } if (currentTask->ndependson > 0) { struct starpu_task * taskdeps[currentTask->ndependson]; unsigned i, j = 0; for (i = 0; i < currentTask->ndependson; i++) { struct task * taskdep; /* Get the ith jobid of deps_jobid */ HASH_FIND(hh, tasks, ¤tTask->deps[i], sizeof(jobid), taskdep); if(taskdep) { taskdeps[j] = &taskdep->task; j ++; } } starpu_task_declare_deps_array(¤tTask->task, j, taskdeps); } if (!(currentTask->iteration == -1)) starpu_iteration_push(currentTask->iteration); applySchedRec(¤tTask->task, currentTask->submit_order); int ret_val = starpu_task_submit(¤tTask->task); if (!(currentTask->iteration == -1)) starpu_iteration_pop(); if (ret_val != 0) { fprintf(stderr, "\nWhile submitting task %ld (%s): return %d\n", currentTask->submit_order, currentTask->task.name? currentTask->task.name : "unknown", ret_val); return -1; } //fprintf(stderr, "submitting task %s (%lu, %llu)\n", currentTask->task.name?currentTask->task.name:"anonymous", currentTask->jobid, (unsigned long long) currentTask->task.tag_id); if (!(currentTask->submit_order % 1000)) { fprintf(stderr, "\rSubmitted task order %ld...", currentTask->submit_order); fflush(stdout); } if (currentTask->submit_order != -1) last_submitorder++; } else { fix_wontuse_handle(currentTask); /* Add the handle in the wontuse task */ /* FIXME: can not actually work properly since we have * disabled sequential consistency, so we don't have any * easy way to make this wait for the last task that * wrote to the handle. */ if (currentTask->task.handles[0]) starpu_data_wont_use(currentTask->task.handles[0]); } currentNode = starpu_rbtree_next(currentNode); } fprintf(stderr, " done.\n"); return 1; } /* * * * * * * * * * * * * * * */ /* * * * * * MAIN * * * * * * */ /* * * * * * * * * * * * * * */ static void usage(const char *program) { fprintf(stderr,"Usage: %s [--static-workerid] tasks.rec [sched.rec]\n", program); exit(EXIT_FAILURE); } int main(int argc, char **argv) { starpu_data_set_default_sequential_consistency_flag(0); FILE *rec; char *s; const char *tasks_rec = NULL; const char *sched_rec = NULL; unsigned i; size_t s_allocated = 128; unsigned long nread_tasks = 0; _STARPU_MALLOC(s, s_allocated); dependson_size = REPLAY_NMAX_DEPENDENCIES; /* Change the value of REPLAY_NMAX_DEPENCIES to modify the number of dependencies */ _STARPU_MALLOC(dependson, dependson_size * sizeof (* dependson)); alloc_mode = 1; for (i = 1; i < (unsigned) argc; i++) { if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { usage(argv[0]); } else if (!strcmp(argv[i], "--static-workerid")) { static_workerid = 1; } else { if (!tasks_rec) tasks_rec = argv[i]; else if (!sched_rec) sched_rec = argv[i]; else usage(argv[0]); } } if (!tasks_rec) usage(argv[0]); if (sched_rec) schedRecInit(sched_rec); rec = fopen(tasks_rec, "r"); if (!rec) { fprintf(stderr,"unable to open file %s: %s\n", tasks_rec, strerror(errno)); exit(EXIT_FAILURE); } int ret = starpu_init(NULL); if (ret == -ENODEV) goto enodev; /* Read line by line, and on empty line submit the task with the accumulated information */ reset(); double start = starpu_timing_now(); int linenum = 0; while(1) { char *ln; if (!fgets(s, s_allocated, rec)) { fprintf(stderr, " done.\n"); int submitted = submit_tasks(); if (submitted == -1) { goto enodev; } goto eof; } while (!(ln = strchr(s, '\n'))) { /* fprintf(stderr,"buffer size %d too small, doubling it\n", s_allocated); */ _STARPU_REALLOC(s, s_allocated * 2); if (!fgets(s + s_allocated-1, s_allocated+1, rec)) { fprintf(stderr, "\n"); int submitted = submit_tasks(); if (submitted == -1) { goto enodev; } goto eof; } s_allocated *= 2; } linenum++; if (ln == s) { /* Empty line, do task */ struct task * task; _STARPU_MALLOC(task, sizeof(*task)); starpu_task_init(&task->task); task->deps = NULL; task->submit_order = submitorder; starpu_rbtree_node_init(&task->node); starpu_rbtree_insert(&tree, &task->node, diff); task->jobid = jobid; task->iteration = iteration; if (name != NULL) task->task.name = strdup(name); task->type = control; if (control == NormalTask) { if (workerid >= 0) { task->task.priority = priority; task->task.cl = &cl; if (static_workerid) { task->task.workerid = workerid; task->task.execute_on_a_specific_worker = 1; } if (alloc_mode) { /* Duplicating the handles stored (and registered in the current context) into the task */ ARRAY_DUP(modes_ptr, task->task.modes, nb_parameters); ARRAY_DUP(modes_ptr, task->task.cl->modes, nb_parameters); variable_data_register_check(sizes_set, nb_parameters); ARRAY_DUP(handles_ptr, task->task.handles, nb_parameters); } else { task->task.dyn_modes = modes_ptr; _STARPU_MALLOC(task->task.cl->dyn_modes, (sizeof(*task->task.cl->dyn_modes) * nb_parameters)); ARRAY_DUP(modes_ptr, task->task.cl->dyn_modes, nb_parameters); variable_data_register_check(sizes_set, nb_parameters); task->task.dyn_handles = handles_ptr; } task->task.nbuffers = nb_parameters; struct perfmodel * realmodel; HASH_FIND_STR(model_hash, model, realmodel); if (realmodel == NULL) { int len = strlen(model); _STARPU_CALLOC(realmodel, 1, sizeof(struct perfmodel)); _STARPU_MALLOC(realmodel->model_name, sizeof(char) * (len+1)); realmodel->model_name = strcpy(realmodel->model_name, model); starpu_perfmodel_init(&realmodel->perfmodel); int error = starpu_perfmodel_load_symbol(model, &realmodel->perfmodel); if (!error) { HASH_ADD_STR(model_hash, model_name, realmodel); } else { fprintf(stderr, "[starpu][Warning] Error loading perfmodel symbol %s\n", model); fprintf(stderr, "[starpu][Warning] Taking only measurements from the given execution, and forcing execution on worker %d\n", workerid); starpu_perfmodel_unload_model(&realmodel->perfmodel); free(realmodel->model_name); free(realmodel); realmodel = NULL; } } struct starpu_perfmodel_arch *arch = starpu_worker_get_perf_archtype(workerid, 0); unsigned comb = starpu_perfmodel_arch_comb_add(arch->ndevices, arch->devices); unsigned narch = starpu_perfmodel_get_narch_combs(); struct task_arg *arg; _STARPU_MALLOC(arg, sizeof(struct task_arg) + sizeof(double) * narch); arg->footprint = footprint; arg->narch = narch; double * perfTime = arg->perf; if (realmodel == NULL) { /* Erf, do without perfmodel, for execution there */ task->task.workerid = workerid; task->task.execute_on_a_specific_worker = 1; for (i = 0; i < narch ; i++) { if (i == comb) perfTime[i] = endTime - startTime; else perfTime[i] = NAN; } } else { int one = 0; for (i = 0; i < narch ; i++) { struct starpu_perfmodel_arch *arch = starpu_perfmodel_arch_comb_fetch(i); perfTime[i] = starpu_perfmodel_history_based_expected_perf(&realmodel->perfmodel, arch, footprint); if (!(perfTime[i] == 0 || isnan(perfTime[i]))) one = 1; } if (!one) { fprintf(stderr, "We do not have any performance measurement for symbol '%s' for footprint %x, we can not execute this", model, footprint); exit(EXIT_FAILURE); } } task->task.cl_arg = arg; task->task.flops = flops; total_flops += flops; } task->task.cl_arg_size = 0; task->task.tag_id = tag; task->task.use_tag = 1; task->ndependson = ndependson; if (ndependson > 0) { _STARPU_MALLOC(task->deps, ndependson * sizeof (* task->deps)); ARRAY_DUP(dependson, task->deps, ndependson); } } else { STARPU_ASSERT(nb_parameters == 1); task->reg_signal = reg_signal[0]; ARRAY_DUP(handles_ptr, task->task.handles, nb_parameters); } /* Add this task to task hash */ HASH_ADD(hh, tasks, jobid, sizeof(jobid), task); nread_tasks++; if (!(nread_tasks % 1000)) { fprintf(stderr, "\rRead task %lu...", nread_tasks); fflush(stdout); } reset(); } /* Record various information */ #define TEST(field) (!strncmp(s, field": ", strlen(field) + 2)) else if(TEST("Control")) { char * c = s+9; if(!strncmp(c, "WontUse", 7)) { control = WontUseTask; nb_parameters = 1; alloc_mode = set_alloc_mode(nb_parameters); arrays_managing(alloc_mode); } else control = NormalTask; } else if (TEST("Name")) { *ln = 0; name = strdup(s+6); } else if (TEST("Model")) { *ln = 0; model = strdup(s+7); } else if (TEST("JobId")) jobid = atol(s+7); else if(TEST("SubmitOrder")) submitorder = atoi(s+13); else if (TEST("DependsOn")) { char *c = s + 11; for (ndependson = 0; *c != '\n'; ndependson++) { if (ndependson >= dependson_size) { dependson_size *= 2; _STARPU_REALLOC(dependson, dependson_size * sizeof(*dependson)); } dependson[ndependson] = strtol(c, &c, 10); } } else if (TEST("Tag")) { tag = strtol(s+5, NULL, 16); } else if (TEST("WorkerId")) { workerid = atoi(s+10); } else if (TEST("Footprint")) { footprint = strtoul(s+11, NULL, 16); } else if (TEST("Parameters")) { /* Parameters line format is PARAM1 PARAM2 (...)PARAMi (...)PARAMn */ char * param_str = s + 12; int count = 0; for (i = 0 ; param_str[i] != '\n'; i++) { if (param_str[i] == ' ') /* Checking the number of ' ' (space), assuming that the file is not corrupted */ { count++; } } nb_parameters = count + 1; /* There is one space per paramater except for the last one, that's why we have to add +1 (dirty programming) */ /* This part of the algorithm will determine if it needs static or dynamic arrays */ alloc_mode = set_alloc_mode(nb_parameters); arrays_managing(alloc_mode); } else if (TEST("Handles")) { char *buffer = s + 9; const char *delim = " "; char *token = strtok(buffer, delim); for (i = 0 ; i < nb_parameters ; i++) { STARPU_ASSERT(token); struct handle *handles_cell; /* A cell of the hash table for the handles */ starpu_data_handle_t handle_value = (starpu_data_handle_t) strtol(token, NULL, 16); /* Get the ith handle on the line (in the file) */ HASH_FIND(hh, handles_hash, &handle_value, sizeof(handle_value), handles_cell); /* Find if the handle_value was already registered as a key in the hash table */ /* If it wasn't, then add it to the hash table */ if (handles_cell == NULL) { /* Hide the initial handle from the file into the handles array to find it when necessary */ handles_ptr[i] = handle_value; reg_signal[i] = 1; } else { handles_ptr[i] = handles_cell->mem_ptr; reg_signal[i] = 0; } token = strtok(NULL, delim); } } else if (TEST("Modes")) { char * buffer = s + 7; int mode_i = 0; const char * delim = " "; char * token = strtok(buffer, delim); while (token != NULL && mode_i < nb_parameters) { /* Subject to the names of starpu modes enumerator are not modified */ if (!strncmp(token, "RW", 2)) { *(modes_ptr+mode_i) = STARPU_RW; mode_i++; } else if (!strncmp(token, "R", 1)) { *(modes_ptr+mode_i) = STARPU_R; mode_i++; } else if (!strncmp(token, "W", 1)) { *(modes_ptr+mode_i) = STARPU_W; mode_i++; } /* Other cases produce a warning*/ else { fprintf(stderr, "[Warning] A mode is different from R/W (jobid task : %lu)", jobid); } token = strtok(NULL, delim); } } else if (TEST("Sizes")) { char * buffer = s + 7; const char * delim = " "; char * token = strtok(buffer, delim); int k = 0; _STARPU_MALLOC(sizes_set, nb_parameters * sizeof(size_t)); while (token != NULL && k < nb_parameters) { sizes_set[k] = strtol(token, NULL, 10); token = strtok(NULL, delim); k++; } } else if (TEST("StartTime")) { startTime = strtod(s+11, NULL); } else if (TEST("EndTime")) { endTime = strtod(s+9, NULL); } else if (TEST("GFlop")) { flops = 1000000000 * strtod(s+7, NULL); } else if (TEST("Iteration")) { iteration = (unsigned) strtol(s+11, NULL, 10); } else if (TEST("Priority")) { priority = strtol(s + 10, NULL, 10); } } eof: starpu_task_wait_for_all(); fprintf(stderr, " done.\n"); printf("%g ms", (starpu_timing_now() - start) / 1000.); if (total_flops != 0.) printf("\t%g GF/s", (total_flops / (starpu_timing_now() - start)) / 1000.); printf("\n"); /* FREE allocated memory */ free(dependson); free(s); /* End of FREE */ struct handle *handle=NULL, *handletmp=NULL; HASH_ITER(hh, handles_hash, handle, handletmp) { starpu_data_unregister(handle->mem_ptr); HASH_DEL(handles_hash, handle); free(handle); } struct perfmodel *model_s=NULL, *modeltmp=NULL; HASH_ITER(hh, model_hash, model_s, modeltmp) { starpu_perfmodel_unload_model(&model_s->perfmodel); HASH_DEL(model_hash, model_s); free(model_s->model_name); free(model_s); } struct task *task=NULL, *tasktmp=NULL; HASH_ITER(hh, tasks, task, tasktmp) { free(task->task.cl_arg); free((char*)task->task.name); if (task->task.dyn_handles != NULL) { free(task->task.dyn_handles); free(task->task.dyn_modes); } HASH_DEL(tasks, task); starpu_task_clean(&task->task); free(task->deps); starpu_rbtree_remove(&tree, &task->node); free(task); } starpu_shutdown(); return 0; enodev: starpu_shutdown(); return 77; } starpu-1.3.9+dfsg/tools/starpu_replay_sched.c000066400000000000000000000245571413463044200213430ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * Copyright (C) 2017 Erwan Leria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 reads a sched.rec file and mangles submitted tasks according to the hint * from that file. */ #include #include #include #include #include #include #include #include /* sched.rec files look like this: SubmitOrder: 1234 Priority: 12 SpecificWorker: 1 Workers: 0 1 2 DependsOn: 1235 Prefetch: 1234 DependsOn: 1233 MemoryNode: 1 Parameters: 1 */ #define CPY(src, dst, n) memcpy(dst, src, n * sizeof(*dst)) #if 0 #define debug(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) #else #define debug(fmt, ...) (void)0 #endif static unsigned long submitorder; /* Also use as prefetchtag */ static int priority; static int eosw; static unsigned workerorder; static int memnode; /* FIXME: MAXs */ static uint32_t workers[STARPU_NMAXWORKERS/32]; static unsigned nworkers; static unsigned dependson[STARPU_NMAXBUFS]; static unsigned ndependson; static unsigned params[STARPU_NMAXBUFS]; static unsigned nparams; static enum sched_type { NormalTask, PrefetchTask, } sched_type; static struct starpu_codelet cl_prefetch = { .where = STARPU_NOWHERE, .nbuffers = 1, .modes = { STARPU_R }, }; static struct task { UT_hash_handle hh; unsigned long submitorder; int priority; int memnode; unsigned dependson[STARPU_NMAXBUFS]; unsigned ndependson; struct starpu_task *depends_tasks[STARPU_NMAXBUFS]; /* For real tasks */ int eosw; unsigned workerorder; uint32_t workers[STARPU_NMAXWORKERS/32]; unsigned nworkers; /* For prefetch tasks */ unsigned params[STARPU_NMAXBUFS]; unsigned nparams; struct starpu_task *pref_task; /* Actual prefetch task */ } *mangled_tasks, *prefetch_tasks; LIST_TYPE(dep, struct task *task; unsigned i; ); struct deps { UT_hash_handle hh; unsigned long submitorder; struct dep_list list; } *dependencies = NULL; static void reset(void) { submitorder = 0; priority = INT_MIN; eosw = -1; memset(&workers, 0, sizeof(workers)); nworkers = 0; ndependson = 0; sched_type = NormalTask; nparams = 0; memnode = -1; workerorder = 0; } /* TODO : respecter l'ordre de soumission des tâches SubmitOrder */ static void checkField(char * s) { /* Record various information */ #define TEST(field) (!strncmp(s, field": ", strlen(field) + 2)) if (TEST("SubmitOrder")) { s = s + strlen("SubmitOrder: "); submitorder = strtol(s, NULL, 10); } else if (TEST("Priority")) { s = s + strlen("Priority: "); priority = strtol(s, NULL, 10); } else if (TEST("SpecificWorker")) { s = s + strlen("SpecificWorker: "); eosw = strtol(s, NULL, 10); } else if (TEST("Workers")) { s = s + strlen("Workers: "); char * delim = " "; char * token = strtok(s, delim); int i = 0; while (token != NULL) { int k = strtol(token, NULL, 10); STARPU_ASSERT_MSG(k < STARPU_NMAXWORKERS, "%d is bigger than maximum %d\n", k, STARPU_NMAXWORKERS); workers[k/(sizeof(*workers)*8)] |= (1 << (k%(sizeof(*workers)*8))); i++; token = strtok(NULL, delim); } nworkers = i; } else if (TEST("DependsOn")) { /* NOTE : dependsons (in the sched.rec) should be the submit orders of the dependencies, otherwise it can occur an undefined behaviour (contrary to the tasks.rec where dependencies are jobids */ unsigned i = 0; char * delim = " "; char * token = strtok(s+strlen("DependsOn: "), delim); while (token != NULL) { dependson[i] = strtol(token, NULL, 10); i++; token = strtok(NULL, delim); } ndependson = i; } else if (TEST("Prefetch")) { s = s + strlen("Prefetch: "); submitorder = strtol(s, NULL, 10); sched_type = PrefetchTask; } else if (TEST("Parameters")) { s = s + strlen("Parameters: "); char * delim = " "; char * token = strtok(s, delim); int i = 0; while (token != NULL) { params[i] = strtol(token, NULL, 10); i++; token = strtok(NULL, delim); } nparams = i; } else if (TEST("MemoryNode")) { s = s + strlen("MemoryNode: "); memnode = strtol(s, NULL, 10); } else if (TEST("Workerorder")) { s = s + strlen("Workerorder: "); workerorder = strtol(s, NULL, 10); } } void schedRecInit(const char * filename) { FILE * f = fopen(filename, "r"); if(f == NULL) { fprintf(stderr,"unable to open file %s: %s\n", filename, strerror(errno)); return; } size_t lnsize = 128; char *s; _STARPU_MALLOC(s, sizeof(*s) * lnsize); int eof = 0; reset(); while(!eof && !feof(f)) { char *ln; /* Get the line */ if (!fgets(s, lnsize, f)) { eof = 1; } while (!(ln = strchr(s, '\n'))) { _STARPU_REALLOC(s, lnsize * 2); if (!fgets(s + lnsize-1, lnsize+1, f)) { eof = 1; break; } lnsize *= 2; } if ((ln == s || eof) && submitorder) { /* Empty line, doit */ struct task * task; unsigned i; _STARPU_MALLOC(task, sizeof(*task)); task->submitorder = submitorder; task->priority = priority; task->memnode = memnode; CPY(dependson, task->dependson, ndependson); task->ndependson = ndependson; /* Also record submitorder of tasks that this one will need to depend on */ for (i = 0; i < ndependson; i++) { struct dep *dep; struct starpu_task *starpu_task; _STARPU_MALLOC(dep, sizeof(*dep)); dep->task = task; dep->i = i; struct deps *deps; HASH_FIND(hh, dependencies, &task->dependson[i], sizeof(submitorder), deps); if (!deps) { /* No task depends on this one yet, add a cell for it */ _STARPU_MALLOC(deps, sizeof(*deps)); dep_list_init(&deps->list); deps->submitorder = task->dependson[i]; HASH_ADD(hh, dependencies, submitorder, sizeof(submitorder), deps); } dep_list_push_back(&deps->list, dep); /* Create the intermediate task */ starpu_task = dep->task->depends_tasks[i] = starpu_task_create(); starpu_task->cl = NULL; starpu_task->destroy = 0; starpu_task->no_submitorder = 1; } switch (sched_type) { case NormalTask: /* A new task to mangle, record what needs to be done */ task->eosw = eosw; task->workerorder = workerorder; CPY(workers, task->workers, STARPU_NMAXWORKERS/32); task->nworkers = nworkers; STARPU_ASSERT(nparams == 0); debug("adding mangled task %lu\n", submitorder); HASH_ADD(hh, mangled_tasks, submitorder, sizeof(submitorder), task); break; case PrefetchTask: STARPU_ASSERT(memnode >= 0); STARPU_ASSERT(eosw == -1); STARPU_ASSERT(workerorder == 0); STARPU_ASSERT(nworkers == 0); CPY(params, task->params, nparams); task->nparams = nparams; /* TODO: more params */ STARPU_ASSERT_MSG(nparams == 1, "only supports one parameter at a time"); debug("adding prefetch task for %lu\n", submitorder); HASH_ADD(hh, prefetch_tasks, submitorder, sizeof(submitorder), task); break; default: STARPU_ASSERT(0); break; } reset(); } else checkField(s); } fclose(f); } static void do_prefetch(void *arg) { unsigned node = (uintptr_t) arg; starpu_data_idle_prefetch_on_node(starpu_task_get_current()->handles[0], node, 1); } void applySchedRec(struct starpu_task *starpu_task, unsigned long submit_order) { struct task *task; struct deps *deps; int ret; HASH_FIND(hh, dependencies, &submit_order, sizeof(submit_order), deps); if (deps) { struct dep *dep; for (dep = dep_list_begin(&deps->list); dep != dep_list_end(&deps->list); dep = dep_list_next(dep)) { debug("task %lu is %d-th dep for %lu\n", submit_order, dep->i, dep->task->submitorder); /* Some task will depend on this one, make the dependency */ starpu_task_declare_deps_array(dep->task->depends_tasks[dep->i], 1, &starpu_task); ret = starpu_task_submit(dep->task->depends_tasks[dep->i]); STARPU_ASSERT(ret == 0); } } HASH_FIND(hh, prefetch_tasks, &submit_order, sizeof(submit_order), task); if (task) { /* We want to submit a prefetch for this task */ debug("task %lu has a prefetch for parameter %d to node %d\n", submit_order, task->params[0], task->memnode); struct starpu_task *pref_task; pref_task = task->pref_task = starpu_task_create(); pref_task->cl = &cl_prefetch; pref_task->destroy = 1; pref_task->no_submitorder = 1; pref_task->callback_arg = (void*)(uintptr_t) task->memnode; pref_task->callback_func = do_prefetch; /* TODO: more params */ pref_task->handles[0] = starpu_task->handles[task->params[0]]; /* Make it depend on intermediate tasks */ if (task->ndependson) { debug("%u dependencies\n", task->ndependson); starpu_task_declare_deps_array(pref_task, task->ndependson, task->depends_tasks); } ret = starpu_task_submit(pref_task); STARPU_ASSERT(ret == 0); } HASH_FIND(hh, mangled_tasks, &submit_order, sizeof(submit_order), task); if (task == NULL) /* Nothing to do for this */ return; debug("mangling task %lu\n", submit_order); if (task->eosw >= 0) { debug("execute on a specific worker %d\n", task->eosw); starpu_task->workerid = task->eosw; starpu_task->execute_on_a_specific_worker = 1; } if (task->workerorder > 0) { debug("workerorder %d\n", task->workerorder); starpu_task->workerorder = task->workerorder; } if (task->priority != INT_MIN) { debug("priority %d\n", task->priority); starpu_task->priority = task->priority; } if (task->nworkers) { debug("%u workers %x\n", task->nworkers, task->workers[0]); starpu_task->workerids_len = sizeof(task->workers) / sizeof(task->workers[0]); _STARPU_MALLOC(starpu_task->workerids, task->nworkers * sizeof(*starpu_task->workerids)); CPY(task->workers, starpu_task->workerids, STARPU_NMAXWORKERS/32); } if (task->ndependson) { debug("%u dependencies\n", task->ndependson); starpu_task_declare_deps_array(starpu_task, task->ndependson, task->depends_tasks); } /* And now, let it go! */ } starpu-1.3.9+dfsg/tools/starpu_sched_display.c000066400000000000000000000017761413463044200215120ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.3.9+dfsg/tools/starpu_smpi.xslt000066400000000000000000000044671413463044200204170ustar00rootroot00000000000000 - - - - - starpu-1.3.9+dfsg/tools/starpu_smpirun000077500000000000000000000070741413463044200201530ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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-starpu-1_3_9-release-tarball/install SMPIRUN=/usr/bin/mpiexec STARPU_DATADIR=${prefix}/share STARPU_XSLTDIR=$STARPU_DATADIR/starpu SOURCE_DATADIR=/mnt/scratch/buildbot/starpu/conan-starpu-1_3_9-release-tarball/build/tools BUILDDIR=/mnt/scratch/buildbot/starpu/conan-starpu-1_3_9-release-tarball/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 if [ "$SMPI_MAJOR" -ge 4 -o \( "$SMPI_MAJOR" = 3 -a "$SMPI_MINOR" -ge 16 \) ] then PRIV_OPT="--cfg=smpi/privatization:yes" else PRIV_OPT="--cfg=smpi/privatize${DASH}global${DASH}variables:yes" fi # When executed from source, take xslt from source [ "$0" -ef $BUILDDIR/starpu_smpirun ] && STARPU_XSLTDIR=$SOURCE_DATADIR MPI_PLATFORM="" MPI_HOSTFILE="" NP="" GDB="" 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 ;; "-gdb") GDB="-gdb" shift 1 ;; *) break ;; esac done if [ -z "$MPI_PLATFORM" ] || [ -z "$MPI_HOSTFILE" ]; then echo "$0 -platform PLATFORM -hostfile HOSTFILE [ -np N ] [ -gdb ] [ ... ] 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 $GDB -platform $PLATFORM -hostfile $MPI_HOSTFILE -np $NP "$@" $PRIV_OPT --cfg=smpi/simulate${DASH}computation:no --cfg=contexts/stack${DASH}size:$STACKSIZE RET=$? rm -f $PLATFORM exit $RET starpu-1.3.9+dfsg/tools/starpu_smpirun.in000066400000000000000000000065741413463044200205610ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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=@mpiexec_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 if [ "$SMPI_MAJOR" -ge 4 -o \( "$SMPI_MAJOR" = 3 -a "$SMPI_MINOR" -ge 16 \) ] then PRIV_OPT="--cfg=smpi/privatization:yes" else PRIV_OPT="--cfg=smpi/privatize${DASH}global${DASH}variables:yes" fi # When executed from source, take xslt from source [ "$0" -ef $BUILDDIR/starpu_smpirun ] && STARPU_XSLTDIR=$SOURCE_DATADIR MPI_PLATFORM="" MPI_HOSTFILE="" NP="" GDB="" 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 ;; "-gdb") GDB="-gdb" shift 1 ;; *) break ;; esac done if [ -z "$MPI_PLATFORM" ] || [ -z "$MPI_HOSTFILE" ]; then echo "$0 -platform PLATFORM -hostfile HOSTFILE [ -np N ] [ -gdb ] [ ... ] 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 $GDB -platform $PLATFORM -hostfile $MPI_HOSTFILE -np $NP "$@" $PRIV_OPT --cfg=smpi/simulate${DASH}computation:no --cfg=contexts/stack${DASH}size:$STACKSIZE RET=$? rm -f $PLATFORM exit $RET starpu-1.3.9+dfsg/tools/starpu_tasks_rec_complete.1000066400000000000000000000010471413463044200224520ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. .TH STARPU_TASKS_REC_COMPLETE "1" "October 2021" "StarPU 1.3.9" "User Commands" .SH NAME starpu_tasks_rec_complete \- Complete StarPU tasks.rec file .SH SYNOPSIS .B starpu_tasks_rec_complete [\fI\,input-file \/\fR[\fI\,output-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.3.9+dfsg/tools/starpu_tasks_rec_complete.c000066400000000000000000000113541413463044200225360ustar00rootroot00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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=NULL; 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); } else if (strncmp(argv[1], "--version", 9) == 0 || strncmp(argv[1], "-v", 2) == 0) { fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_FAILURE); } } #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.3.9+dfsg/tools/starpu_temanejo2.sh000077500000000000000000000022211413463044200207400ustar00rootroot00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 exec $d/bin/Temanejo2 -p 8888 -d 8889 -P $d/lib/libayudame.so -L $d/lib -A $cmd "$@" starpu-1.3.9+dfsg/tools/starpu_trace_state_stats.py000077500000000000000000000327271413463044200226240ustar00rootroot00000000000000#!/usr/bin/env python3 # coding=utf-8 # # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 script parses the generated trace.rec file and reports statistics about # the number of different events/tasks and their durations. The report is # similar to the starpu_paje_state_stats.in script, except that this one # doesn't need R and pj_dump (from the pajeng repository), and it is also much # faster. ## import getopt import os import sys class Event(): def __init__(self, type, name, category, start_time): self._type = type self._name = name self._category = category self._start_time = start_time class EventStats(): def __init__(self, name, duration_time, category, count = 1): self._name = name self._duration_time = duration_time self._category = category self._count = count def aggregate(self, duration_time): self._duration_time += duration_time self._count += 1 def show(self): if not self._name == None and not self._category == None: print("\"" + self._name + "\"," + str(self._count) + ",\"" + self._category + "\"," + str(round(self._duration_time, 6))) class Worker(): def __init__(self, id): self._id = id self._events = [] self._stats = [] self._stack = [] self._current_state = None def get_event_stats(self, name): for stat in self._stats: if stat._name == name: return stat return None def add_event(self, type, name, category, start_time): self._events.append(Event(type, name, category, start_time)) def add_event_to_stats(self, curr_event): if curr_event._type == "PushState": self._stack.append(curr_event) return # Will look later to find a PopState event. elif curr_event._type == "PopState": if len(self._stack) == 0: print("warning: PopState without a PushState, probably a trace with start/stop profiling") self._current_state = None return next_event = curr_event curr_event = self._stack.pop() elif curr_event._type == "SetState": if self._current_state == None: # First SetState event found self._current_state = curr_event return saved_state = curr_event next_event = curr_event curr_event = self._current_state self._current_state = saved_state else: sys.exit("ERROR: Invalid event type!") # Compute duration with the next event. a = curr_event._start_time b = next_event._start_time # Add the event to the list of stats. for i in range(len(self._stats)): if self._stats[i]._name == curr_event._name: self._stats[i].aggregate(b - a) return self._stats.append(EventStats(curr_event._name, b - a, curr_event._category)) def calc_stats(self, start_profiling_times, stop_profiling_times): num_events = len(self._events) use_start_stop = len(start_profiling_times) != 0 for i in range(0, num_events): event = self._events[i] if i > 0 and self._events[i-1]._name == "Deinitializing": # Drop all events after the Deinitializing event is found # because they do not make sense. break if not use_start_stop: self.add_event_to_stats(event) continue # Check if the event is inbetween start/stop profiling events for t in range(len(start_profiling_times)): if (event._start_time > start_profiling_times[t] and event._start_time < stop_profiling_times[t]): self.add_event_to_stats(event) break if not use_start_stop: return # Special case for SetState events which need a next one for computing # the duration. curr_event = self._events[-1] if curr_event._type == "SetState": for i in range(len(start_profiling_times)): if (curr_event._start_time > start_profiling_times[i] and curr_event._start_time < stop_profiling_times[i]): curr_event = Event(curr_event._type, curr_event._name, curr_event._category, stop_profiling_times[i]) self.add_event_to_stats(curr_event) def read_blocks(input_file): empty_lines = 0 first_line = 1 blocks = [] for line in open(input_file): if first_line: blocks.append([]) blocks[-1].append(line) first_line = 0 # Check for empty lines if not line or line[0] == '\n': # If 1st one: new block if empty_lines == 0: blocks.append([]) empty_lines += 1 else: # Non empty line: add line in current(last) block empty_lines = 0 blocks[-1].append(line) return blocks def read_field(field, index): return field[index+1:-1] def insert_worker_event(workers, prog_events, block): worker_id = -1 name = None start_time = 0.0 category = None for line in block: key = line[:2] value = read_field(line, 2) if key == "E:": # EventType event_type = value elif key == "C:": # Category category = value elif key == "W:": # WorkerId worker_id = int(value) elif key == "N:": # Name name = value elif key == "S:": # StartTime start_time = float(value) # Program events don't belong to workers, they are globals. if category == "Program": prog_events.append(Event(event_type, name, category, start_time)) return for worker in workers: if worker._id == worker_id: worker.add_event(event_type, name, category, start_time) return worker = Worker(worker_id) worker.add_event(event_type, name, category, start_time) workers.append(worker) def calc_times(stats): tr = 0.0 # Runtime tt = 0.0 # Task ti = 0.0 # Idle ts = 0.0 # Scheduling for stat in stats: if stat._category == None: continue if stat._category == "Runtime": if stat._name == "Scheduling": # Scheduling time is part of runtime but we want to have # it separately. ts += stat._duration_time else: tr += stat._duration_time elif stat._category == "Task": tt += stat._duration_time elif stat._category == "Other": ti += stat._duration_time else: print("WARNING: Unknown category '" + stat._category + "'!") return ti, tr, tt, ts def save_times(ti, tr, tt, ts): f = open("times.csv", "w+") f.write("\"Time\",\"Duration\"\n") f.write("\"Runtime\"," + str(tr) + "\n") f.write("\"Task\"," + str(tt) + "\n") f.write("\"Idle\"," + str(ti) + "\n") f.write("\"Scheduling\"," + str(ts) + "\n") f.close() def calc_et(tt_1, tt_p): """ Compute the task efficiency (et). This measures the exploitation of data locality. """ return tt_1 / tt_p def calc_es(tt_p, ts_p): """ Compute the scheduling efficiency (es). This measures time spent in the runtime scheduler. """ return tt_p / (tt_p + ts_p) def calc_er(tt_p, tr_p, ts_p): """ Compute the runtime efficiency (er). This measures how the runtime overhead affects performance.""" return (tt_p + ts_p) / (tt_p + tr_p + ts_p) def calc_ep(tt_p, tr_p, ti_p, ts_p): """ Compute the pipeline efficiency (et). This measures how much concurrency is available and how well it's exploited. """ return (tt_p + tr_p + ts_p) / (tt_p + tr_p + ti_p + ts_p) def calc_e(et, er, ep, es): """ Compute the parallel efficiency. """ return et * er * ep * es def save_efficiencies(e, ep, er, et, es): f = open("efficiencies.csv", "w+") f.write("\"Efficiency\",\"Value\"\n") f.write("\"Parallel\"," + str(e) + "\n") f.write("\"Task\"," + str(et) + "\n") f.write("\"Runtime\"," + str(er) + "\n") f.write("\"Scheduling\"," + str(es) + "\n") f.write("\"Pipeline\"," + str(ep) + "\n") f.close() def usage(): print("USAGE:") print("starpu_trace_state_stats.py [ -te -s=
  • ),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.3.9+dfsg/doc/doxygen/chapters/images/data_trace.png000066400000000000000000000171671413463044200240730ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/distrib_data.eps000066400000000000000000002071721413463044200244350ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/distrib_data.pdf000066400000000000000000001021011413463044200244010ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/distrib_data.png000066400000000000000000000141471413463044200244300ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/distrib_data_histo.eps000066400000000000000000000601321413463044200256340ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/distrib_data_histo.pdf000066400000000000000000000147641413463044200256300ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/distrib_data_histo.png000066400000000000000000000230171413463044200256320ustar00rootroot00000000000000PNG  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.3.9+dfsg/doc/doxygen/chapters/images/paje_draw_histogram.eps000066400000000000000000001107361413463044200260140ustar00rootroot00000000000000%!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.3.9+dfsg/doc/doxygen/chapters/images/paje_draw_histogram.pdf000066400000000000000000000155521413463044200257760ustar00rootroot00000000000000%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.3.9+dfsg/doc/doxygen/chapters/images/paje_draw_histogram.png000066400000000000000000001076471413463044200260200ustar00rootroot00000000000000PNG  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